diff --git a/javascript/src/CharacterCount.js b/javascript/src/CharacterCount.js new file mode 100644 index 0000000000000000000000000000000000000000..d02b21377d7bf76c468f499c8f51fb38749d8d66 --- /dev/null +++ b/javascript/src/CharacterCount.js @@ -0,0 +1,46 @@ +/** + * @author Rafael Ostertag <rafael.ostertag@math.uzh.ch> + */ + + +/* global $ */ + +var QfqNS = QfqNS || {}; + +(function (n) { + 'use strict'; + + n.CharacterCount = {}; + + n.CharacterCount.initialize = function (selector) { + selector = selector || ".qfq-character-count"; + $(selector).each(function () { + var characterCountTarget, $targetElement; + + var $element = $(this); + + characterCountTarget = "#" + n.CharacterCount.getCharacterCountTargetId($element); + + $element.data('character-count-display', $(characterCountTarget)); + + n.CharacterCount.updateCountForElement($element); + + $element.on('change keyup', function (evt) { + n.CharacterCount.updateCountForElement($(evt.delegateTarget)); + }); + + }); + }; + + n.CharacterCount.updateCountForElement = function ($targetElement) { + var maxLength = $targetElement.attr('maxlength') || "∞"; + var currentLength = $targetElement.val().length; + $targetElement.data('character-count-display').text(currentLength + "/" + maxLength); + }; + + n.CharacterCount.getCharacterCountTargetId = function ($element) { + return $element.data('character-count-id'); + }; + +})(QfqNS); + diff --git a/javascript/src/QfqPage.js b/javascript/src/QfqPage.js index cef6916b4e3a4072d721f4f44f793cea6a1949b2..0fd35293436feb9f1c6176b7577ef707471918a9 100644 --- a/javascript/src/QfqPage.js +++ b/javascript/src/QfqPage.js @@ -81,6 +81,7 @@ var QfqNS = QfqNS || {}; } QfqNS.TypeAhead.install(this.settings.typeAheadUrl); + QfqNS.CharacterCount.initialize(); }; /** diff --git a/mockup/personmock.html b/mockup/personmock.html index 32c7b976b7e27b59c9b63c27936e0870b0bffcd1..570cc377e07e918b868a9c220702da7f3215ddb0 100644 --- a/mockup/personmock.html +++ b/mockup/personmock.html @@ -725,7 +725,7 @@ <label for="mytextarea" class="control-label">Text area</label> </div> <div class="col-md-6"> - <textarea id="mytextarea" name="mytextarea"></textarea> + <textarea class="form-control" id="mytextarea" name="mytextarea"></textarea> </div> <div class=" col-md-4"> diff --git a/mockup/textareacharactercount.html b/mockup/textareacharactercount.html new file mode 100644 index 0000000000000000000000000000000000000000..b26669bcc9a9ef10b04bdf767d00b6dadba4b695 --- /dev/null +++ b/mockup/textareacharactercount.html @@ -0,0 +1,127 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <link rel="stylesheet" href="../css/bootstrap.min.css"> + <link rel="stylesheet" href="../css/bootstrap-theme.min.css"> + <link rel="stylesheet" href="../css/jqx.base.css"> + <link rel="stylesheet" href="../css/qfq-bs.css"> + <title>Character Count</title> +</head> +<body> + +<div class="container-fluid"> + <div class="row hidden-xs"> + <div class="col-md-12"> + <h1>Title with a long text</h1> + </div> + </div> + + <div class="row"> + <div class="col-md-12 "> + <div class="btn-toolbar pull-right" role="toolbar"> + <div class="btn-group" role="group"> + <button id="save-button" type="button" class="btn btn-default navbar-btn" + data-class-on-change="wdc"><span + class="glyphicon glyphicon-ok"></span></button> + <button id="close-button" type="button" class="btn btn-default navbar-btn"><span + class="glyphicon glyphicon-remove"></span></button> + </div> + <div class="btn-group" role="group"> + <button id="delete-button" type="button" class="btn btn-default navbar-btn"><span + class="glyphicon glyphicon-trash"></span></button> + </div> + <div class="btn-group" role="group"> + <a id="form-new-button" href="personmock.html?s=badcaffe1" class="btn btn-default navbar-btn"><span + class="glyphicon glyphicon-plus"></span></a> + </div> + </div> + </div> + + </div> + + + <form id="myForm" class="form-horizontal" data-toggle="validator"> + + <div id="formgroup1" class="form-group"> + <div class="col-md-2"> + <label for="textarea1" class="control-label">Text area (unlimited)</label> + </div> + + <div class="col-md-6"> + <textarea id="textarea1" class="form-control qfq-character-count" name="textarea1" + data-character-count-id="charcount1" required></textarea> + + <div class="character-counter" style="color: grey; font-size: 10pt;">Character + <span id="charcount1"></span></div> + + <div class="help-block with-errors hidden"></div> + </div> + + <div> + + </div> + </div> + + <div id="formgroup2" class="form-group"> + <div class="col-md-2"> + <label for="textarea2" class="control-label">Text area (limited)</label> + </div> + + <div class="col-md-6"> + <textarea id="textarea2" class="form-control qfq-character-count" name="textarea2" maxlength="20" + data-character-count-id="charcount2"></textarea> + <div id="charcount2">1/20</div> + </div> + + </div> + + <div id="formgroup3" class="form-group"> + <div class="col-md-2"> + <label for="textinput1" class="control-label">Textinput (limited)</label> + </div> + + <div class="col-md-6"> + <input id="textinput1" class="form-control qfq-character-count" name="input1" type="text" + data-character-count-id="charcount3" maxlength="30"> + <div class="character-counter" style="color: grey; font-size: 10pt;">Character + <span id="charcount3"></span></div> + <div class="help-block with-errors hidden"></div> + </div> + + <div> + + </div> + </div> + </form> +</div> + + +<script type="text/x-handlebars-template"> + +</script> + +<script src="../js/jquery.min.js"></script> +<script src="../js/bootstrap.min.js"></script> +<script src="../js/validator.min.js"></script> +<script src="../js/jqx-all.js"></script> +<script src="../js/EventEmitter.min.js"></script> +<script src="../js/typeahead.bundle.min.js"></script> +<script src="../js/qfq.debug.js"></script> +<script type="text/javascript"> + $(function () { + var qfqPage = new QfqNS.QfqPage({ + tabsId: 'myTabs', + formId: 'myForm', + submitTo: 'api/' + $("#submitTo").val(), + deleteUrl: 'api/' + $("#deleteUrl").val(), + fileUploadTo: 'api/' + $("#uploadTo").val(), + fileDeleteUrl: 'api/' + $("#fileDeleteUrl").val(), + typeAheadUrl: 'api/typeahead.php' + }); + + QfqNS.Log.level = 0; + }); +</script> +</body> +</html> diff --git a/mockup/typeahead.html b/mockup/typeahead.html index d6379248c40cd39a873febbe8c1ae4d7e3c8efb0..1565e7cc15e60dfae0631156b23976d24395c724 100644 --- a/mockup/typeahead.html +++ b/mockup/typeahead.html @@ -89,7 +89,7 @@ <div class="col-md-6"> <input id="dropdown1" type="text" class="form-control qfq-typeahead" name="dropdown1" - data-typeahead-sip="abcde" data-template="template1"> + data-typeahead-sip="abcde" data-typeahead-minlength="1" data-typeahead-limit="3"> </div> </div> @@ -101,7 +101,7 @@ <div class="col-md-6"> <input id="dropdown2" type="text" class="form-control qfq-typeahead" name="dropdown2" - data-typeahead-sip="abcdef"> + data-typeahead-sip="abcdef" data-typeahead-limit="10" data-typeahead-minlength="1"> </div> </div>