diff --git a/extension/Documentation/Manual.rst b/extension/Documentation/Manual.rst index fa67ab660a7593ef869aae375edfc14709e41baa..71f09e73371b9fc688aa2eb8b2a8f437e488f730 100644 --- a/extension/Documentation/Manual.rst +++ b/extension/Documentation/Manual.rst @@ -203,6 +203,14 @@ config.qfq.ini +-----------------------------+-----------------------------------------+----------------------------------------------------------------------------+ | FORM_DATA_ERROR |FORM_DATA_ERROR=generic error | Customizable error message used in validator.js. 'no specific' given | +-----------------------------+-----------------------------------------+----------------------------------------------------------------------------+ +| FORM_BS_COLUMNS | FORM_BS_COLUMNS=12 | The whole form will be wrapped in 'col-md-??'. Default is 12 for 100% | ++-----------------------------+-----------------------------------------+----------------------------------------------------------------------------+ +| FORM_BS_LABEL_COLUMNS | FORM_BS_LABEL_COLUMNS = 3 | Default number of BS columns for the 'label'-column | ++-----------------------------+-----------------------------------------+----------------------------------------------------------------------------+ +| FORM_BS_INPUT_COLUMNS | FORM_BS_INPUT_COLUMNS = 6 | Default number of BS columns for the 'input'-column | ++-----------------------------+-----------------------------------------+----------------------------------------------------------------------------+ +| FORM_BS_NOTE_COLUMNS | FORM_BS_NOTE_COLUMNS = 3 | Default number of BS columns for the 'note'-column | ++-----------------------------+-----------------------------------------+----------------------------------------------------------------------------+ | FORM_BUTTON_ON_CHANGE_CLASS | FORM_BUTTON_ON_CHANGE_CLASS=alert-info btn-info | Color for save button after modification | +-----------------------------+-----------------------------------------+----------------------------------------------------------------------------+ | BASE_URL_PRINT | BASE_URL_PRINT=http://example.com | URL where wkhtmltopdf will fetch the HTML (no parameter, those comes later)| @@ -229,10 +237,12 @@ Example: *typo3conf/config.qfq.ini* ;CSS_CLASS_QFQ_FORM = CSS_CLASS_QFQ_FORM_PILL = qfq-color-grey-1 CSS_CLASS_QFQ_FORM_BODY = qfq-color-grey-2 + ;DATE_FORMAT= yyyy-mm-dd ;FORM_DATA_PATTERN_ERROR = ;FORM_DATA_REQUIRED_ERROR = ;FORM_DATA_MATCH_ERROR = ;FORM_DATA_ERROR = + ;FORM_BS_COLUMNS = 12 ;FORM_BS_LABEL_COLUMNS = 3 ;FORM_BS_INPUT_COLUMNS = 6 ;FORM_BS_NOTE_COLUMNS = 3 @@ -739,6 +749,8 @@ Store: *SYSTEM* - Y +-------------------------+--------------------------------------------------------------------------+ | data-error | defined in config.ini or form definition | +-------------------------+--------------------------------------------------------------------------+ + | bsColumns | defined in config.ini (FORM_BS_COLUMNS) or form definition | + +-------------------------+--------------------------------------------------------------------------+ | bsLabelColumns | defined in config.ini (FORM_BS_LABEL_COLUMNS) or form definition | +-------------------------+--------------------------------------------------------------------------+ | bsInputColumns | defined in config.ini (FORM_BS_INPUT_COLUMNS) or form definition | @@ -994,6 +1006,8 @@ parameter +--------------------------+--------+----------------------------------------------------------------------------------------------------------+ | Name | Type | Description | +==========================+========+==========================================================================================================+ +| bsColumns | int | Wrap the whole form in '<div class="col-md-??"> | ++--------------------------+--------+----------------------------------------------------------------------------------------------------------+ | maxVisiblePill | int | Show pills upto <maxVisiblePill> as button, all further in a drop-down menu. Eg.: maxVisiblePill=3 | +--------------------------+--------+----------------------------------------------------------------------------------------------------------+ | class | string | HTML div with given class, surrounding the whole form. Eg.: class=container-fluid | @@ -1192,8 +1206,8 @@ beside every *templateGroup*. The first copy of a templateGroup can't be removed * *tgAddText*: Text shown on the button. Default: `Add`. * *tgRemoveClass*: Class of the 'remove' button. Default: `btn btn-default`. * *tgRemoveText*: Text shown on the button. Default: `Remove`. - * *tgClass*: Class wrapped around every copy of the *templateGroup*. E.g. the class `qfq-child-margin-top` adds a - margin between two copies of the *templateGroup*. Default: empty + * *tgClass*: Class wrapped around every copy of the *templateGroup*. + E.g. the class `qfq-child-margin-top` adds a margin between two copies of the *templateGroup*. Default: empty Multiple *templateGroups* per form are allowed. @@ -1201,6 +1215,8 @@ The name of the native FormElements, inside the templateGroup, which represents `%d`. E.g. the columns `grade1`, `grade2`, `grade3` needs a *FormElement.name* = `grade%d`. The counting will always start with 1. The placeholder `%d` can also be used in the *FormElement.label* +Example of styling the Add/ Delete Button: :ref:`example_class_template_group` + Class: Native ------------- @@ -2359,17 +2375,20 @@ Relation: `Person.id = Address.personId` * `sqlInsert={{INSERT INTO Note (note) VALUES ('{{note:F:allbut:s}}') }}` * `sqlUpdate={{UPDATE Note SET note='{{note:F:allbut:s}}' WHERE id={{slaveId:V}} }}` +.. _example_class_template_group: + Icons Template Group ^^^^^^^^^^^^^^^^^^^^ - * FormElement.parameter +This example will display grafics instead of text 'add' and 'remove'. Also there is a distance between the templateGroups. -:: + * FormElement.parameter:: - tgAddClass=btn alert-success - tgAddText=<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> - tgRemoveClass=btn btn-danger alert-danger - tgRemoveText=<span class="glyphicon glyphicon-remove" aria-hidden="true"></span> + tgClass = qfq-child-margin-top + tgAddClass = btn alert-success + tgAddText = <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> + tgRemoveClass = btn btn-danger alert-danger + tgRemoveText = <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Chart ^^^^^ diff --git a/extension/Documentation/Release.rst b/extension/Documentation/Release.rst index c8df042f67b59bef4b99389d7e18bd778dd23029..2b29fb3f519956cd81802c024081fedf72ece902 100644 --- a/extension/Documentation/Release.rst +++ b/extension/Documentation/Release.rst @@ -46,7 +46,11 @@ Features * Character Count: Display a `counter` on input or textarea fields, activated by specifying the formElement.parameter 'characterCountWrap'. * Evaluate.php: Two new escape options 'l' and 'L'. Backport of ldap_escape() for PHP <5.6. Multiple escaping for one value now possible. * Manual.rst: add some example for TypeAhead and for saving LDAP value. - + * Load foreign values in templatGroups - saving is not implemented yet. + * Manual: Added howto prevent <p>-wrap in TinyMCE + * TemplateGroup: Add button now disabled if max. number of copies reached. + * #3414/QuickFormQuery.php: wrap whole form in 'col-md-XX' - User controls the width of an QFQ form. + Bug Fixes ^^^^^^^^^ @@ -57,7 +61,9 @@ Bug Fixes * BuildFormBootstrap.php: wrapping of optional 'submitButtonText' now done with the 'per form' values. * typeahead.php: if there is an exception, the message body is sent as regular 'content' for the drop-down box. At the moment this is the only way to transmit any error messages. - + * formEditor.sql: removed all 'maxLength' string values for 'Form' and 'FormElement' forms. + * Save button becomes active if a templateGroup copy is removed. + * #3413 Form ohne Pill hat kein padding am Rand. Fix: if there are no pills, an additinal col-md-12 will be rendered. Version 0.13 diff --git a/extension/RELEASE.txt b/extension/RELEASE.txt index 4127f5d0ae7a901ae0e247b1a026fc95fec616da..7f60604eadfc9a1bf85785c56cdf446f7415c5bf 100644 --- a/extension/RELEASE.txt +++ b/extension/RELEASE.txt @@ -1,6 +1,57 @@ Release ======= +Version 0.14 +------------ + +GIT Last Commit: Sun Mar 19 20:38:18 2017 +0100 + + +Changes +^^^^^^^ + + * Play formEditor.sql. + + * All Form & FormEditor input elements now have a maxlength definition of 0, which means take the column definition value. + * Drop-down list of container assignment: + + * Display 'type' ('pill', 'fieldset', 'templategroup') instead of 'class' (always 'container'). + * Display 'name' (internal name) instead of 'label' (shown on the website and might not so usefull as 'name' which is nowhere else used than in that drop-down. + + * FormElement.placeholder colum width extended to 512: + + ALTER TABLE `FormElement` CHANGE `placeholder` `placeholder` VARCHAR(512) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; + + * New class Ldap.php. + +Features +^^^^^^^^ + + * Typeahead for SQL and LDAP Datasources implemented. + * formEditor.sql: Changed width of column FormElement.placeholder from 255 to 512. Removed hardcoded 'size' in FormElement 'placeholder'. + * Character Count: Display a `counter` on input or textarea fields, activated by specifying the formElement.parameter 'characterCountWrap'. + * Evaluate.php: Two new escape options 'l' and 'L'. Backport of ldap_escape() for PHP <5.6. Multiple escaping for one value now possible. + * Manual.rst: add some example for TypeAhead and for saving LDAP value. + * Load foreign values in templatGroups - saving is not implemented yet. + * Manual: Added howto prevent <p>-wrap in TinyMCE + * TemplateGroup: Add button now disabled if max. number of copies reached. + * #3414/QuickFormQuery.php: wrap whole form in 'col-md-XX' - User controls the width of an QFQ form. + +Bug Fixes +^^^^^^^^^ + + * Dynamic Update has been broken since implementing of 'element-update' (#3180). Now both methods, 'element-update' and 'form-update' should be fine. + * qfq-bs.css.less: Fixed problem with 'typeahead input elements' not expanded to Bootstrap column width. Changed + Layout/Design Typeahead drop-down box. Add hoover for the drop-down box with a blue background + * AbstractBuildForm.php: #3374 - textarea elements now contains 'maxlength' attribute. + * BuildFormBootstrap.php: wrapping of optional 'submitButtonText' now done with the 'per form' values. + * typeahead.php: if there is an exception, the message body is sent as regular 'content' for the drop-down box. At the + moment this is the only way to transmit any error messages. + * formEditor.sql: removed all 'maxLength' string values for 'Form' and 'FormElement' forms. + * Save button becomes active if a templateGroup copy is removed. + * #3413 Form ohne Pill hat kein padding am Rand. Fix: if there are no pills, an additinal col-md-12 will be rendered. + + Version 0.13 ------------ @@ -89,10 +140,11 @@ Changes * UPDATE EXISTING TypoScript TEMPLATES of QFQ Installation. - * Variable field parameter has changed. old '_filename', new 'filename' + * Name of variable '_filename' (used in field 'parameter') has changed. Old: '_filename', New: 'filename' * UPDATE `FormElement` SET parameter = REPLACE(parameter, '_filename', 'filename') + Features ^^^^^^^^ diff --git a/extension/qfq/qfq/AbstractBuildForm.php b/extension/qfq/qfq/AbstractBuildForm.php index a0421a7fc1a5538e7a36cc3fbfea752d3dc7e76f..2b82b9d7900c8438f2989dbfb354eb5e51f8b9a0 100644 --- a/extension/qfq/qfq/AbstractBuildForm.php +++ b/extension/qfq/qfq/AbstractBuildForm.php @@ -2875,6 +2875,7 @@ abstract class AbstractBuildForm { // save parent processed FE's $feSpecNativeSave = $this->feSpecNative; + $addButtonId = 'add_button_' . $formElement[FE_ID]; $qfqFieldsName = 'qfq_fields_' . $formElement[FE_ID]; // ='qfq-fields' $templateName = 'template_' . $formElement[FE_ID]; // ='template' $targetName = 'target_' . $formElement[FE_ID]; // ='template' @@ -2894,7 +2895,7 @@ abstract class AbstractBuildForm { EOT; $htmlAdd = <<<EOT -<button type="button" class="$addClass" onclick="QfqNS.addFields('#$templateName', '#$targetName', $max)">$addText</button> +<button type="button" id="$addButtonId" class="$addClass" onclick="QfqNS.addFields('#$templateName', '#$targetName', $max)">$addText</button> EOT; $htmlDelete = <<<EOT @@ -2920,6 +2921,7 @@ EOT; $attribute = Support::doAttribute('class', $qfqFieldsName); $attribute .= Support::doAttribute('id', $targetName); $attribute .= Support::doAttribute('data-qfq-line-template', '#' . $templateName); + $attribute .= Support::doAttribute('data-qfq-line-add-button', '#' . $addButtonId); // Element where the effective FormElements will be copied to. The BS 'col-md-* Classes are inside the template, not here. This here should be pure data without wrapping. $html = Support::wrapTag("<div $attribute>", $html, false); diff --git a/extension/qfq/qfq/BuildFormBootstrap.php b/extension/qfq/qfq/BuildFormBootstrap.php index 8dcfecbe915d8827dc3e6c6e36af7c909e04f18e..53d3ba7505abe54d6da7b02acbf8e527b450e880 100644 --- a/extension/qfq/qfq/BuildFormBootstrap.php +++ b/extension/qfq/qfq/BuildFormBootstrap.php @@ -116,9 +116,11 @@ class BuildFormBootstrap extends AbstractBuildForm { $html .= $this->getFormTag(); - //TODO: Problem fuer Forms ohne Pils - $html .= '<div class="tab-content ' . $this->formSpec[F_CLASS_BODY] . '">'; -// $html .= '<div class="col-md-12 ' . $this->formSpec[F_CLASS_BODY] . '">'; + $class = ['tab-content', $this->formSpec[F_CLASS_BODY]]; + if ($pill == '') { + $class[] = 'col-md-12'; + } + $html .= "<div " . Support::doAttribute('class', $class) . ">"; return $html; } diff --git a/extension/qfq/qfq/Constants.php b/extension/qfq/qfq/Constants.php index 6b959577c7493d46e3c7d239f679c9487f43dde9..35c58047a022b626c82a3158b792fa4b79d4dd8f 100644 --- a/extension/qfq/qfq/Constants.php +++ b/extension/qfq/qfq/Constants.php @@ -38,6 +38,8 @@ const FORM_FORWARD_MODE_NO = 'no'; const FORM_FORWARD_MODE_AUTO = 'auto'; const FORM_FORWARD_MODE_PAGE = 'page'; +const F_BS_COLUMNS = 'bsColumns'; + const F_BS_LABEL_COLUMNS = 'bsLabelColumns'; const F_BS_INPUT_COLUMNS = 'bsInputColumns'; const F_BS_NOTE_COLUMNS = 'bsNoteColumns'; @@ -201,6 +203,7 @@ const ERROR_UNKNOWN_ACTION = 1502; const ERROR_NO_TARGET_PATH_FILE_NAME = 1503; const ERROR_LDAP_CONNECT = 1600; +const ERROR_MISSING_TYPE_AHEAD_LDAP_SEARCH = 1601; // KeyValueParser const ERROR_KVP_VALUE_HAS_NO_KEY = 1900; @@ -321,6 +324,8 @@ const SYSTEM_FORM_DATA_REQUIRED_ERROR = 'FORM_DATA_REQUIRED_ERROR'; const SYSTEM_FORM_DATA_MATCH_ERROR = 'FORM_DATA_MATCH_ERROR'; const SYSTEM_FORM_DATA_ERROR = 'FORM_DATA_ERROR'; +const SYSTEM_FORM_BS_COLUMNS = 'FORM_BS_COLUMNS'; + const SYSTEM_FORM_BS_LABEL_COLUMNS = 'FORM_BS_LABEL_COLUMNS'; const SYSTEM_FORM_BS_INPUT_COLUMNS = 'FORM_BS_INPUT_COLUMNS'; const SYSTEM_FORM_BS_NOTE_COLUMNS = 'FORM_BS_NOTE_COLUMNS'; diff --git a/extension/qfq/qfq/QuickFormQuery.php b/extension/qfq/qfq/QuickFormQuery.php index 5304b24eb2774bc98f77a0de27c93ac5240d06be..00fe920bb48bebe8027bcf97e4a81aa454e21e00 100644 --- a/extension/qfq/qfq/QuickFormQuery.php +++ b/extension/qfq/qfq/QuickFormQuery.php @@ -283,6 +283,14 @@ class QuickFormQuery { $formAction = new FormAction($this->formSpec, $this->db, $this->phpUnit); switch ($formMode) { case FORM_LOAD: + $formAction->elements($recordId, $this->feSpecAction, FE_TYPE_BEFORE_LOAD); + $data = $build->process($formMode); + $data = Support::wrapTag("<div class='" . 'col-md-' . $this->formSpec[F_BS_COLUMNS] . "'>", $data); + $data = Support::wrapTag("<div class='row'>", $data); + + $formAction->elements($recordId, $this->feSpecAction, FE_TYPE_AFTER_LOAD); + break; + case FORM_UPDATE: $formAction->elements($recordId, $this->feSpecAction, FE_TYPE_BEFORE_LOAD); @@ -529,7 +537,8 @@ class QuickFormQuery { */ private function syncSystemFormConfig(array $formSpec) { - $keys = [F_BS_LABEL_COLUMNS, + $keys = [F_BS_COLUMNS, + F_BS_LABEL_COLUMNS, F_BS_INPUT_COLUMNS, F_BS_NOTE_COLUMNS, F_FE_DATA_PATTERN_ERROR, diff --git a/extension/qfq/qfq/helper/Ldap.php b/extension/qfq/qfq/helper/Ldap.php index ffbf3a716e50c52b91421fc814845e4cf8cc09a8..c966fd224ba80b8574e14c3ff23aa37a1bd7094d 100644 --- a/extension/qfq/qfq/helper/Ldap.php +++ b/extension/qfq/qfq/helper/Ldap.php @@ -21,6 +21,7 @@ class Ldap { * @throws UserFormException */ private function ldapConnect($ldapServer) { + $ds = ldap_connect($ldapServer); // must be a valid LDAP server! if (!$ds) { throw new UserFormException("Unable to connect to LDAP server: $ldapServer", ERROR_LDAP_CONNECT); @@ -85,6 +86,7 @@ class Ldap { } /** + * * @param array $config [FE_LDAP_SERVER , FE_LDAP_BASE_DN, FE_LDAP_SEARCH, FE_TYPEAHEAD_LIMIT, FE_TYPEAHEAD_LDAP_KEY_PRINTF, FE_TYPEAHEAD_LDAP_VALUE_PRINTF] * @param string $searchValue value to search via $config[FE_LDAP_SEARCH] * @param string $mode MODE_LDAP_SINGLE | MODE_LDAP_MULTI @@ -95,8 +97,15 @@ class Ldap { $arr = array(); // For TypeAhead, use an optional given F_TYPEAHEAD_LDAP_SEARCH - if ($mode == MODE_LDAP_MULTI && $config[F_TYPEAHEAD_LDAP_SEARCH] != '') { + if ($mode == MODE_LDAP_MULTI) { + if (!isset($config[F_TYPEAHEAD_LDAP_SEARCH]) || $config[F_TYPEAHEAD_LDAP_SEARCH] == '') { + throw new UserFormException("Missing definition for `" . F_TYPEAHEAD_LDAP_SEARCH . "`", ERROR_MISSING_TYPE_AHEAD_LDAP_SEARCH); + } $config[F_LDAP_SEARCH] = $config[F_TYPEAHEAD_LDAP_SEARCH]; + } else { + if (!isset($config[F_LDAP_SEARCH]) || $config[F_LDAP_SEARCH] == '') { + throw new UserFormException("Missing definition for `" . F_LDAP_SEARCH . "`", ERROR_MISSING_TYPE_AHEAD_LDAP_SEARCH); + } } $searchValue = Support::ldap_escape($searchValue, null, LDAP_ESCAPE_FILTER); @@ -115,30 +124,33 @@ class Ldap { array_merge($keyArr, $valueArr, $specificArr)))); $sr = $this->ldapSearch($ds, $config, $attr); - $info = ldap_get_entries($ds, $sr); + if ($sr !== false) { + $info = ldap_get_entries($ds, $sr); - if ($mode == MODE_LDAP_MULTI) { + if ($mode == MODE_LDAP_MULTI) { - // Iterate over all Elements, per element collect all needed attributes - for ($i = 0; $i < $info["count"]; $i++) { + // Iterate over all Elements, per element collect all needed attributes + for ($i = 0; $i < $info["count"]; $i++) { - $key = $this->printfResult($keyFormat, $keyArr, $info[$i]); - $value = $this->printfResult($valueFormat, $valueArr, $info[$i]); + // HTML Entities will be escaped on Client side. + $key = $this->printfResult($keyFormat, $keyArr, $info[$i], false); + $value = $this->printfResult($valueFormat, $valueArr, $info[$i], false); - if ($key == '' || $value == '') { - continue; // if $key or $value is empty: skip - } + if ($key == '' || $value == '') { + continue; // if $key or $value is empty: skip + } - $arr[] = [API_TYPEAHEAD_KEY => $key, API_TYPEAHEAD_VALUE => $value]; - } - } else { - // Collect all attributes - foreach ($attr as $key) { - $value = isset($info[0][$key][0]) ? $info[0][$key][0] : ''; - $arr[$key] = htmlentities($value); + $arr[] = [API_TYPEAHEAD_KEY => $key, API_TYPEAHEAD_VALUE => $value]; + } + } else { + // Collect all attributes + foreach ($attr as $key) { + $value = isset($info[0][$key][0]) ? $info[0][$key][0] : ''; + $arr[$key] = $value; + } } + ldap_close($ds); } - ldap_close($ds); return $arr; } @@ -188,12 +200,20 @@ class Ldap { * @throws CodeException * @throws UserFormException */ - private function printfResult($format, array $keyArr, $infoElement) { + private function printfResult($format, array $keyArr, $infoElement, $doHtmlEntity = true) { $args = array($format); foreach ($keyArr as $key) { - $args[] = (isset($infoElement[$key][0])) ? htmlentities($infoElement[$key][0]) : ''; + $val = ''; + + if (isset($infoElement[$key][0])) { + $val = $infoElement[$key][0]; + if ($doHtmlEntity === true) { + $val = htmlentities($val); + } + } + $args[] = $val; } return call_user_func_array('sprintf', $args); diff --git a/extension/qfq/qfq/store/Config.php b/extension/qfq/qfq/store/Config.php index 92316a589377b8913907fc80b3de88b18a18e03d..e340223a899fdec82da8bd43fd08a534e72f0dfc 100644 --- a/extension/qfq/qfq/store/Config.php +++ b/extension/qfq/qfq/store/Config.php @@ -55,6 +55,7 @@ class Config { // oldname > newname $setting = [ + [SYSTEM_FORM_BS_COLUMNS, F_BS_COLUMNS], [SYSTEM_FORM_BS_LABEL_COLUMNS, F_BS_LABEL_COLUMNS], [SYSTEM_FORM_BS_INPUT_COLUMNS, F_BS_INPUT_COLUMNS], [SYSTEM_FORM_BS_NOTE_COLUMNS, F_BS_NOTE_COLUMNS], diff --git a/extension/qfq/qfq/store/Store.php b/extension/qfq/qfq/store/Store.php index c4bee36d3ad5a4cb9c01ee36ff4f464852be76dd..22c055792ba39530990d3ea4a4aaaf3af15937ee 100644 --- a/extension/qfq/qfq/store/Store.php +++ b/extension/qfq/qfq/store/Store.php @@ -190,6 +190,7 @@ class Store { // Defaults Support::setIfNotSet($config, SYSTEM_DATE_FORMAT, 'yyyy-mm-dd'); Support::setIfNotSet($config, SYSTEM_SHOW_DEBUG_INFO, 'auto'); + Support::setIfNotSet($config, F_BS_COLUMNS, '12'); Support::setIfNotSet($config, F_BS_LABEL_COLUMNS, '3'); Support::setIfNotSet($config, F_BS_INPUT_COLUMNS, '6'); Support::setIfNotSet($config, F_BS_NOTE_COLUMNS, '3'); diff --git a/extension/qfq/tests/phpunit/StoreTest.php b/extension/qfq/tests/phpunit/StoreTest.php index db105d1151e95a65d0d178f37acf19619775f7af..1e25f42b7508a9e58f183fd6a66e26fefdbc69ad 100644 --- a/extension/qfq/tests/phpunit/StoreTest.php +++ b/extension/qfq/tests/phpunit/StoreTest.php @@ -231,6 +231,7 @@ EOT; SYSTEM_SQL_LOG_MODE => 'modify', SYSTEM_DATE_FORMAT => 'yyyy-mm-dd', SYSTEM_SHOW_DEBUG_INFO => 'auto', + F_BS_COLUMNS => '12', F_BS_LABEL_COLUMNS => '3', F_BS_INPUT_COLUMNS => '6', F_BS_NOTE_COLUMNS => '3', diff --git a/mockup/richtexteditor.html b/mockup/richtexteditor.html index 1c08c978b33a19580cfa96ee4bec97a324994bee..6e7c3a3c4bb645b3d5079cb6e018605ee782d499 100644 --- a/mockup/richtexteditor.html +++ b/mockup/richtexteditor.html @@ -91,6 +91,19 @@ </div> + <div class="form-group"> + <div class="col-md-2"> + <label for="text:4" class="control-label">Rich Text Editor (Codemirror)</label> + </div> + + <div class="col-md-6"> + <textarea id="text:4" class="qfq-tinymce" name="rte" + data-config="{ "plugins": [ "codemirror"], "codemirror": {} }">Input + </textarea> + </div> + + </div> + <button type="submit">Do</button> </form>