diff --git a/typo3/sysext/backend/Classes/Form/Element/SelectMultipleSideBySideElement.php b/typo3/sysext/backend/Classes/Form/Element/SelectMultipleSideBySideElement.php index 8beb33bd69e74b08d7dee219201d7756dccf9375..0f24b84088e8fc78dc5e7a1a91d8c1eebbe4eee4 100644 --- a/typo3/sysext/backend/Classes/Form/Element/SelectMultipleSideBySideElement.php +++ b/typo3/sysext/backend/Classes/Form/Element/SelectMultipleSideBySideElement.php @@ -89,6 +89,7 @@ class SelectMultipleSideBySideElement extends AbstractFormElement $size = 2; } $size = $config['autoSizeMax'] ? MathUtility::forceIntegerInRange(count($itemsArray) + 1, MathUtility::forceIntegerInRange($size, 1), $config['autoSizeMax']) : $size; + $allowMultiple = !empty($config['multiple']); $itemsToSelect = []; $filterTextfield = []; @@ -97,7 +98,13 @@ class SelectMultipleSideBySideElement extends AbstractFormElement // Create option tags: $opt = array(); foreach ($selItems as $p) { - $opt[] = '<option value="' . htmlspecialchars($p[1]) . '" title="' . $p[0] . '">' . $p[0] . '</option>'; + $disabledAttr = ''; + $classAttr = ''; + if (!$allowMultiple && in_array((string)$p[1], $parameterArray['itemFormElValue'], true)) { + $disabledAttr = ' disabled="disabled"'; + $classAttr = ' class="hidden"'; + } + $opt[] = '<option value="' . htmlspecialchars($p[1]) . '" title="' . $p[0] . '"' . $classAttr . $disabledAttr . '>' . $p[0] . '</option>'; } // Put together the selector box: $selector_itemListStyle = isset($config['itemListStyle']) diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/FormEngine.js b/typo3/sysext/backend/Resources/Public/JavaScript/FormEngine.js index b513ccde99012e5cdd7e4b392ddcfe536019a342..d6e5117063cbb248395c684971840076f64af2b2 100644 --- a/typo3/sysext/backend/Resources/Public/JavaScript/FormEngine.js +++ b/typo3/sysext/backend/Resources/Public/JavaScript/FormEngine.js @@ -80,21 +80,22 @@ define(['jquery', * or from a multi-select (two selects side-by-side) * previously known as "setFormValueFromBrowseWin" * - * @param {String} fieldName formerly known as "fName" name of the field, like [tt_content][2387][header] - * @param {(String|Number)} value the value to fill in (could be an integer) - * @param {String} label the visible name in the selector - * @param {String} title the title when hovering over it - * @param {String} exclusiveValues if the select field has exclusive options that are not combine-able + * @param {String} fieldName Formerly known as "fName" name of the field, like [tt_content][2387][header] + * @param {(String|Number)} value The value to fill in (could be an integer) + * @param {String} label The visible name in the selector + * @param {String} title The title when hovering over it + * @param {String} exclusiveValues If the select field has exclusive options that are not combine-able + * @param {$} $optionEl The jQuery object of the selected <option> tag */ - FormEngine.setSelectOptionFromExternalSource = setFormValueFromBrowseWin = function(fieldName, value, label, title, exclusiveValues) { + FormEngine.setSelectOptionFromExternalSource = setFormValueFromBrowseWin = function(fieldName, value, label, title, exclusiveValues, $optionEl) { exclusiveValues = String(exclusiveValues); - var $fieldEl; - var $originalFieldEl = $fieldEl = FormEngine.getFieldElement(fieldName) - ,isMultiple = false - ,isList = false; + var $fieldEl, + $originalFieldEl = $fieldEl = FormEngine.getFieldElement(fieldName), + isMultiple = false, + isList = false; - if ($originalFieldEl.length == 0 || value === '--div--') { + if ($originalFieldEl.length === 0 || value === '--div--') { return; } @@ -122,7 +123,6 @@ define(['jquery', } if (isMultiple || isList) { - // If multiple values are not allowed, clear anything that is in the control already if (!isMultiple) { $fieldEl.empty(); @@ -130,16 +130,18 @@ define(['jquery', // Clear elements if exclusive values are found if (exclusiveValues) { + var $optionSelect = $optionEl.closest('select'); var m = new RegExp('(^|,)' + value + '($|,)'); // the new value is exclusive => remove all existing values if (exclusiveValues.match(m)) { $fieldEl.empty(); - - // there is an old value and it was exclusive => it has to be removed + $optionSelect.find('[disabled]').removeClass('hidden').prop('disabled', false); } else if ($fieldEl.children('option').length == 1) { + // there is an old value and it was exclusive => it has to be removed m = new RegExp("(^|,)" + $fieldEl.children('option').prop('value') + "($|,)"); if (exclusiveValues.match(m)) { $fieldEl.empty(); + $optionSelect.find('[disabled]').removeClass('hidden').prop('disabled', false); } } } @@ -156,6 +158,10 @@ define(['jquery', return false; } }); + + if (addNewValue) { + $optionEl.addClass('hidden').prop('disabled', true); + } } // element can be added @@ -452,6 +458,9 @@ define(['jquery', case '_list': $fieldEl = $(':input.tceforms-multiselect[data-formengine-input-name="' + fieldName + '"]', $formEl); break; + case '_avail': + $fieldEl = $(':input[data-relatedfieldname="' + fieldName + '"]', $formEl); + break; case '_mul': case '_hr': $fieldEl = $(':input[type=hidden][data-formengine-input-name="' + fieldName + '"]', $formEl); @@ -549,10 +558,18 @@ define(['jquery', * removes currently selected options from a select field * * @param {Object} $fieldEl a jQuery object, containing the select field + * @param {Object} $availableFieldEl a jQuery object, containing all available value */ - FormEngine.removeOption = function($fieldEl) { + FormEngine.removeOption = function($fieldEl, $availableFieldEl) { + var $selected = $fieldEl.find(':selected'); + + $availableFieldEl + .find('option[value="' + $selected.attr('value') + '"]') + .removeClass('hidden') + .prop('disabled', false); + // remove the selected options - $fieldEl.find(':selected').remove(); + $selected.remove(); }; @@ -588,7 +605,8 @@ define(['jquery', } else if ($el.hasClass('t3js-btn-moveoption-bottom')) { FormEngine.moveOptionToBottom($listFieldEl); } else if ($el.hasClass('t3js-btn-removeoption')) { - FormEngine.removeOption($listFieldEl); + var $availableFieldEl = FormEngine.getFieldElement(fieldName, '_avail'); + FormEngine.removeOption($listFieldEl, $availableFieldEl); } // make sure to update the hidden field value when modifying the select value @@ -608,7 +626,7 @@ define(['jquery', // try to add each selected field to the "left" select field $el.find(':selected').each(function() { var $optionEl = $(this); - FormEngine.setSelectOptionFromExternalSource(fieldName, $optionEl.prop('value'), $optionEl.text(), $optionEl.prop('title'), exclusiveValues); + FormEngine.setSelectOptionFromExternalSource(fieldName, $optionEl.prop('value'), $optionEl.text(), $optionEl.prop('title'), exclusiveValues, $optionEl); }); } }).on('click', '.t3js-editform-close', function(e) {