From 28068a514191c4c8319c70523a145099618061ae Mon Sep 17 00:00:00 2001 From: Jonathon Menz Date: Thu, 10 Mar 2016 14:55:35 -0800 Subject: [PATCH] Target acquired http://theportalwiki.com/wiki/Turret_voice_lines --- .editorconfig | 22 +++++++++++ LICENSE | 2 +- README.md | 55 ++++++++++++++++++++++++++- _config.php | 6 +++ _config/config.yml | 9 +++++ code/TextTargetLengthExtension.php | 43 +++++++++++++++++++++ composer.json | 17 +++++++++ css/text-target-length.css | 20 ++++++++++ javascript/text-target-length.js | 58 +++++++++++++++++++++++++++++ screenshots/character-count.gif | Bin 0 -> 29312 bytes 10 files changed, 229 insertions(+), 3 deletions(-) create mode 100644 .editorconfig create mode 100644 _config.php create mode 100644 _config/config.yml create mode 100755 code/TextTargetLengthExtension.php create mode 100644 composer.json create mode 100644 css/text-target-length.css create mode 100755 javascript/text-target-length.js create mode 100644 screenshots/character-count.gif diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f6ab25c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ +# For more information about the properties used in this file, +# please see the EditorConfig documentation: +# http://editorconfig.org + +# Default for all files +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true + +# PSR-2 for PHP +[*.php] +indent_style = space + +# The indent size used in the package.json file cannot be changed: +# https://github.com/npm/npm/pull/3180#issuecomment-16336516 +[{*.yml,package.json}] +indent_size = 2 +indent_style = space diff --git a/LICENSE b/LICENSE index 50a4b81..d523ba0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2016, Jono Menz +Copyright (c) 2016, Jonathon Menz All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index 474f5d6..d4b9a66 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,53 @@ -# silverstripe-text-target-length -Set character length recommendations on SilverStripe text form fields +# Text Target Length for SilverStripe CMS + +![Character limits in action](screenshots/character-count.gif) + +If you see a field marked 'Description' you know roughly what type of content to put in there. But how do you know how much of it to write? A single sentence might do, but maybe a paragraph or more is required? A great content plan should recommend an ideal length for every type of content, so content authors and designers alike can make informed decisions. + +This module extends the `TextField` and `TextareaField` classes in SilverStripe to allow you to set a recommended content length, and set soft upper and lower limits on character count. + +## Requirements + +SilverStripe 3.1+ (3.3 tested) + +## Installation + +### Composer (best practice) + +[Packagist listing](https://packagist.org/packages/jonom/silverstripe-text-target-length) and [installation instructions](http://doc.silverstripe.org/framework/en/trunk/installation/composer#adding-modules-to-your-project) + +### Manually + +I promise it's worth your time to learn how to use Composer. If painless updating isn't your thing though you can download and extract this project, rename the module folder 'text-target-length', place it in your project root and run a dev/build?flush=1. + +## How to use + +With the module installed you can call call `setTargetLength()` on `TextField` and `TextareaField` form fields. + +```php +// Ideal length: 100 characters +// Minimum: 75 (automatically set at 75% of ideal) +// Maximum: 125 (automatically set at 125% of ideal) +$field->setTargetLength(100); + +// Ideal length: 100 characters +// Minimum: 25 +// Maximum: 150 +$field->setTargetLength(100, 25, 150); +``` + +## Want to see more like this? + +I donate a lot of my time to open-source projects, so if you use this module in a commercial project a small donation to keep me motivated would be much appreciated. If you'd like to sponsor additional development on this module I'd love to hear from you. + +[Donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=Z5HEZREZSKA6A) + +## To Do + + - [ ] Extension for HTMLEditorField? + - [ ] Translation + - [ ] Customise hint text through config + +## Maintainer contact + +[jonathonmenz.com](http://jonathonmenz.com) diff --git a/_config.php b/_config.php new file mode 100644 index 0000000..8093b43 --- /dev/null +++ b/_config.php @@ -0,0 +1,6 @@ +owner; + $idealCharCount = (int)$idealCharCount; + if (!$idealCharCount > 0) return $field; + + // Set defaults + if ($minCharCount === null) $minCharCount = round($idealCharCount * .75); + if ($maxCharCount === null) $maxCharCount = round($idealCharCount * 1.25); + + // Validate + if (!($maxCharCount >= $idealCharCount && $idealCharCount >= $minCharCount)) return $field; + + // Activate + $field->addExtraClass('target-length'); + $field->setAttribute('data-target-ideal-length', $idealCharCount); + $field->setAttribute('data-target-min-length', $minCharCount); + $field->setAttribute('data-target-max-length', $maxCharCount); + Requirements::javascript(TEXTTARGETLENGTH_DIR.'/javascript/text-target-length.js'); + Requirements::css(TEXTTARGETLENGTH_DIR.'/css/text-target-length.css'); + + return $field; + } +} diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..5c754e9 --- /dev/null +++ b/composer.json @@ -0,0 +1,17 @@ +{ + "name": "jonom/silverstripe-text-target-length", + "description": "Set character length recommendations on SilverStripe text form fields", + "type": "silverstripe-module", + "keywords": ["silverstripe", "textfield", "textareafield", "target"], + "license": "BSD-3-Clause", + "authors": [{ + "name": "Jonathon Menz", + "homepage": "http://jonathonmenz.com" + }], + "require": { + "silverstripe/cms": "^3.1" + }, + "extra": { + "installer-name": "text-target-length" + } +} diff --git a/css/text-target-length.css b/css/text-target-length.css new file mode 100644 index 0000000..9d01d25 --- /dev/null +++ b/css/text-target-length.css @@ -0,0 +1,20 @@ +.target-length p.target-length-count { + color: #8796a3; + margin: 0 auto; + padding: .25em 0; +} +.target-length p.target-length-count i, +.target-length p.target-length-count b { + color: #00a651; +} +.target-length p.target-length-count b { + font-weight: bold; +} +.target-length p.target-length-count.over i, +.target-length p.target-length-count.over b { + color: #e3080a; +} +.target-length p.target-length-count.under i, +.target-length p.target-length-count.under b { + color: #e39d08; +} diff --git a/javascript/text-target-length.js b/javascript/text-target-length.js new file mode 100755 index 0000000..ee8b66c --- /dev/null +++ b/javascript/text-target-length.js @@ -0,0 +1,58 @@ +(function($) { + $.entwine('ss.targetlength', function($){ + + $('div.field.target-length input').entwine({ + + updateCount: function() { + var field = $(this); + var countEl = field.next('p.target-length-count'); + if (!countEl) return; + var charCount = field.val().length; + if (field.data('previousCount') === charCount) return; + var ideal = field.data('targetIdealLength'); + var min = field.data('targetMinLength'); + var max = field.data('targetMaxLength'); + var targetFulfilled = Math.round((charCount / ideal)*20)*5; //5% increments + var remark = 'Great!'; + var remarkClass = 'good'; + if ((charCount >= min && charCount < ((min + ideal) / 2)) || (charCount <= max && charCount > ((max + ideal) / 2))) { + remark = 'Okay'; + } else if (charCount < min) { + remark = 'Keep going!'; + remarkClass = 'under'; + if (charCount === 0) remark = ''; + } else if (charCount > max) { + remark = 'Too long' + remarkClass = 'over'; + } + countEl.attr('class', remarkClass + ' target-length-count'); + countEl.html('Length target: ' + targetFulfilled + '% ' + remark + ''); + field.data('previousCount', charCount); + }, + onadd: function() { + // Insert extra markup + var field = $(this); + field.parent().append('

'); + this.updateCount(); + }, + onpropertychange: function() { + this.updateCount(); + }, + onchange: function() { + this.updateCount(); + }, + onclick: function() { + this.updateCount(); + }, + onkeyup: function() { + this.updateCount(); + }, + oninput: function() { + this.updateCount(); + }, + onpaste: function() { + this.updateCount(); + } + }); + }); +}(jQuery)); diff --git a/screenshots/character-count.gif b/screenshots/character-count.gif new file mode 100644 index 0000000000000000000000000000000000000000..82aa68ac48936046b06002328db2bb8fe57547ef GIT binary patch literal 29312 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 fwNL2NA3olj