Skip to content
Snippets Groups Projects
Unverified Commit 28a3a877 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #2911473 by Maouna, joachim, adinac, dhirendra.mishra, ravi.shankar,...

Issue #2911473 by Maouna, joachim, adinac, dhirendra.mishra, ravi.shankar, MaskOta, ranjith_kumar_k_u, kuldeep_mehra27, mahtab_alam, fabienly, carolpettirossi, joelpittet, jenlampton, dww: Selected yet disabled individual options from checkboxes element don't persist through save
parent 438ec9e3
No related branches found
No related tags found
38 merge requests!12227Issue #3181946 by jonmcl, mglaman,!7471uncessary 5 files are moved from media-library folder to misc folder,!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!4114Issue #2707291: Disable body-level scrolling when a dialog is open as a modal,!3630Issue #2815301 by Chi, DanielVeza, kostyashupenko, smustgrave: Allow to create...,!3291Issue #3336463: Rewrite rules for gzipped CSS and JavaScript aggregates never match,!3143Issue #3313342: [PHP 8.1] Deprecated function: strpos(): Passing null to parameter #1 LayoutBuilderUiCacheContext.php on line 28,!3102Issue #3164428 by DonAtt, longwave, sahil.goyal, Anchal_gupta, alexpott: Use...,!2853#3274419 Makes BaseFieldOverride inherit the internal property from the base field.,!2719Issue #3110137: Remove Classy from core.,!2437Issue #3238257 by hooroomoo, Wim Leers: Fragment link pointing to <textarea>...,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2074Issue #2707689: NodeForm::actions() checks for delete access on new entities,!2062Issue #3246454: Add weekly granularity to views date sort,!1974Issue #3036862 demonstration,!1591Issue #3199697: Add JSON:API Translation experimental module,!1484Exposed filters get values from URL when Ajax is on,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1254Issue #3238915: Refactor (if feasible) uses of the jQuery ready function to use VanillaJS,!1162Issue #3100350: Unable to save '/' root path alias,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!957Added throwing of InvalidPluginDefinitionException from getDefinition().,!925Issue #2339235: Remove taxonomy hard dependency on node module,!877Issue #2708101: Default value for link text is not saved,!873Issue #2875228: Site install not using batch API service,!872Draft: Issue #3221319: Race condition when creating menu links and editing content deletes menu links,!844Resolve #3036010 "Updaters",!712Issue #2909128: Autocomplete intermittent on Chrome Android,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
...@@ -73,12 +73,19 @@ public static function processCheckboxes(&$element, FormStateInterface $form_sta ...@@ -73,12 +73,19 @@ public static function processCheckboxes(&$element, FormStateInterface $form_sta
// sub-elements. // sub-elements.
$weight += 0.001; $weight += 0.001;
// Only enabled checkboxes receive their values from the form
// submission, the disabled checkboxes use their default value.
$default_value = NULL;
if (isset($value[$key]) || (!empty($element[$key]['#disabled']) && in_array($key, $element['#default_value'], TRUE))) {
$default_value = $key;
}
$element += [$key => []]; $element += [$key => []];
$element[$key] += [ $element[$key] += [
'#type' => 'checkbox', '#type' => 'checkbox',
'#title' => $choice, '#title' => $choice,
'#return_value' => $key, '#return_value' => $key,
'#default_value' => isset($value[$key]) ? $key : NULL, '#default_value' => $default_value,
'#attributes' => $element['#attributes'], '#attributes' => $element['#attributes'],
'#ajax' => $element['#ajax'] ?? NULL, '#ajax' => $element['#ajax'] ?? NULL,
// Errors should only be shown on the parent checkboxes element. // Errors should only be shown on the parent checkboxes element.
...@@ -115,6 +122,17 @@ public static function valueCallback(&$element, $input, FormStateInterface $form ...@@ -115,6 +122,17 @@ public static function valueCallback(&$element, $input, FormStateInterface $form
unset($input[$key]); unset($input[$key]);
} }
} }
// Because the disabled checkboxes don't receive their input from the
// form submission, we use their default value.
if (!empty($element['#default_value'])) {
foreach ($element['#default_value'] as $key) {
if (!empty($element[$key]['#disabled'])) {
$input[$key] = $key;
}
}
}
return array_combine($input, $input); return array_combine($input, $input);
} }
else { else {
......
...@@ -36,7 +36,7 @@ public function buildForm(array $form, FormStateInterface $form_state) { ...@@ -36,7 +36,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
]; ];
} }
// Multiple values option elements. // Multiple values option elements, disabled as a whole.
foreach (['checkboxes', 'select'] as $type) { foreach (['checkboxes', 'select'] as $type) {
$form[$type . '_multiple'] = [ $form[$type . '_multiple'] = [
'#type' => $type, '#type' => $type,
...@@ -54,6 +54,34 @@ public function buildForm(array $form, FormStateInterface $form_state) { ...@@ -54,6 +54,34 @@ public function buildForm(array $form, FormStateInterface $form_state) {
]; ];
} }
// Multiple values option elements, only single options disabled.
$form['checkboxes_single_select'] = [
'#type' => 'checkboxes',
'#title' => 'checkboxes (multiple)',
'#options' => [
'test_1' => 'Test 1',
'test_2' => 'Test 2',
],
'#multiple' => TRUE,
'#default_value' => ['test_2' => 'test_2'],
'test_1' => [
'#disabled' => TRUE,
],
];
$form['checkboxes_single_unselect'] = [
'#type' => 'checkboxes',
'#title' => 'checkboxes (multiple)',
'#options' => [
'test_1' => 'Test 1',
'test_2' => 'Test 2',
],
'#multiple' => TRUE,
'#default_value' => ['test_2' => 'test_2'],
'test_2' => [
'#disabled' => TRUE,
],
];
// Single values option elements. // Single values option elements.
foreach (['radios', 'select'] as $type) { foreach (['radios', 'select'] as $type) {
$form[$type . '_single'] = [ $form[$type . '_single'] = [
......
...@@ -769,7 +769,7 @@ public function testDisabledElements() { ...@@ -769,7 +769,7 @@ public function testDisabledElements() {
// All the elements should be marked as disabled, including the ones below // All the elements should be marked as disabled, including the ones below
// the disabled container. // the disabled container.
$actual_count = count($disabled_elements); $actual_count = count($disabled_elements);
$expected_count = 42; $expected_count = 44;
$this->assertEquals($expected_count, $actual_count, new FormattableMarkup('Found @actual elements with disabled property (expected @expected).', ['@actual' => count($disabled_elements), '@expected' => $expected_count])); $this->assertEquals($expected_count, $actual_count, new FormattableMarkup('Found @actual elements with disabled property (expected @expected).', ['@actual' => count($disabled_elements), '@expected' => $expected_count]));
// Mink does not "see" hidden elements, so we need to set the value of the // Mink does not "see" hidden elements, so we need to set the value of the
...@@ -803,7 +803,7 @@ public function assertFormValuesDefault(array $values, array $form): void { ...@@ -803,7 +803,7 @@ public function assertFormValuesDefault(array $values, array $form): void {
$expected_value = $form[$key]['#default_value']; $expected_value = $form[$key]['#default_value'];
} }
if ($key == 'checkboxes_multiple') { if (in_array($key, ['checkboxes_multiple', 'checkboxes_single_select', 'checkboxes_single_unselect'], TRUE)) {
// Checkboxes values are not filtered out. // Checkboxes values are not filtered out.
$values[$key] = array_filter($values[$key]); $values[$key] = array_filter($values[$key]);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment