Issue #3382802 by srishtiiee, kunal.sachdev, marcoliver, ckrina: Disable the 'Remove' button if there is a single row in the allowed values storage setting of the list fields

merge-requests/4659/head
Lauri Eskola 2023-08-31 19:48:40 +03:00
parent cb6824ae7d
commit 2b9d2a95ac
No known key found for this signature in database
GPG Key ID: 382FC0F5B0DF53F8
2 changed files with 22 additions and 1 deletions

View File

@ -185,6 +185,10 @@ abstract class ListItemBase extends FieldItemBase implements OptionsProviderInte
'#default_value' => 0, '#default_value' => 0,
'#attributes' => ['class' => ['weight']], '#attributes' => ['class' => ['weight']],
]; ];
// Disable the remove button if there is only one row in the table.
if ($max === 0) {
$element['allowed_values']['table'][0]['delete']['#attributes']['disabled'] = 'disabled';
}
if ($delta < count($allowed_values)) { if ($delta < count($allowed_values)) {
$query = \Drupal::entityQuery($entity_type_id) $query = \Drupal::entityQuery($entity_type_id)
->accessCheck(FALSE) ->accessCheck(FALSE)
@ -261,6 +265,10 @@ abstract class ListItemBase extends FieldItemBase implements OptionsProviderInte
$delta = $element['table']['#max_delta']; $delta = $element['table']['#max_delta'];
$element['table'][$delta]['item']['#prefix'] = '<div class="ajax-new-content" data-drupal-selector="field-list-add-more-focus-target">' . ($element['table'][$delta]['item']['#prefix'] ?? ''); $element['table'][$delta]['item']['#prefix'] = '<div class="ajax-new-content" data-drupal-selector="field-list-add-more-focus-target">' . ($element['table'][$delta]['item']['#prefix'] ?? '');
$element['table'][$delta]['item']['#suffix'] = ($element['table'][$delta]['item']['#suffix'] ?? '') . '</div>'; $element['table'][$delta]['item']['#suffix'] = ($element['table'][$delta]['item']['#suffix'] ?? '') . '</div>';
// Enable the remove button for the first row if there are more rows.
if ($delta > 0 && isset($element['table'][0]['delete']['#attributes']['disabled']) && !isset($element['table'][0]['item']['key']['#attributes']['disabled'])) {
unset($element['table'][0]['delete']['#attributes']['disabled']);
}
$response = new AjaxResponse(); $response = new AjaxResponse();
$response->addCommand(new InsertCommand(NULL, $element)); $response->addCommand(new InsertCommand(NULL, $element));

View File

@ -454,8 +454,21 @@ class OptionsFieldUITest extends FieldTestBase {
$this->createOptionsField($field_type); $this->createOptionsField($field_type);
$page = $this->getSession()->getPage(); $page = $this->getSession()->getPage();
// Try to proceed without entering any value.
$this->drupalGet($this->adminPath); $this->drupalGet($this->adminPath);
// Assert that the delete button for a single row is disabled.
$this->assertCount(1, $page->findAll('css', '#allowed-values-order tr.draggable'));
$delete_button_0 = $page->findById('remove_row_button__0');
$this->assertTrue($delete_button_0->hasAttribute('disabled'), 'Button is disabled');
$page->findButton('Add another item')->click();
// Assert that the delete button for the first row is enabled if there are
// more that one rows.
$this->assertCount(2, $page->findAll('css', '#allowed-values-order tr.draggable'));
$this->assertFalse($delete_button_0->hasAttribute('disabled'), 'Button is enabled');
// Delete a row.
$delete_button_0->click();
// Assert that the button is disabled again.
$this->assertTrue($delete_button_0->hasAttribute('disabled'), 'Button is disabled');
// Try to proceed without entering any value.
$page->findButton('Save field settings')->click(); $page->findButton('Save field settings')->click();
if ($field_type == 'list_string') { if ($field_type == 'list_string') {