Problem/Motivation
Since Drupal 10.2 (#1038316), the table rendered for multi-value field widgets has a column for the per-item "Remove" button. The header cell for that column is an empty array, so it renders as an empty <th></th>.
In 11.x this is in \Drupal\Core\Field\FieldPreprocess::preprocessFieldMultipleValueForm() (previously template_preprocess_field_multiple_value_form()):
$header = [
[
'data' => [ /* h4 field label */ ],
'colspan' => 2,
'class' => ['field-label'],
],
[],
$this->t('Order', [], ['context' => 'Sort order']),
];
Accessibility checkers report an empty table header on every form with an unlimited/multi-value field: axe-core's empty-table-header rule and Editoria11y's "Empty table header" check. Screen reader users get no name for the column that holds the Remove buttons. This relates to WCAG 1.3.1 Info and Relationships.
#3587682 reported an empty table header from an automated scan, but it was closed as "cannot reproduce". That report pointed at a different page. This issue is the reproducible case in the field widget table.
Steps to reproduce
- Install Drupal with the Standard profile (Claro as the admin theme).
- Add a reference field (paragraph reference) with unlimited cardinality to the Article content type.
- Go to
/node/add/article. - Inspect the field's table header: the third
<th>is empty. - Run axe DevTools or Editoria11y on the page: it reports an empty table header.
Proposed resolution
Give the actions column header a visually hidden label so it has an accessible name without changing the visual design:
[
'data' => [
'#type' => 'html_tag',
'#tag' => 'span',
'#value' => $this->t('Operations'),
'#attributes' => ['class' => ['visually-hidden']],
],
],
"Operations" matches the label core already uses for action columns elsewhere, such as entity list builders. Claro's preprocess_field_multiple_value_form keeps working: for disabled widgets, its loop adds the is-disabled class to header cells that have a data key.
Alternative: only output the column (header and cells) when at least one item has _actions. That also fixes the empty body cells contrib widgets get (see Paragraphs #3418303). It is a larger change and could be a follow-up.
Remaining tasks
- Review the approach and the label wording.
- Add test coverage that the header cell is not empty, e.g. in an existing multi-value widget functional test.
- Convert to an MR.
User interface changes
No visual change. Screen readers announce the actions column header as "Operations".
API changes
None.
Data model changes
None.
Release notes snippet
N/A
| Comment | File | Size | Author |
|---|---|---|---|
| #9 | no-difference.png | 148.22 KB | mgifford |
| #8 | Screenshot 2026-10-16 at 9.35.04 AM.png | 36.6 KB | chamilsanjeewa |
| #4 | 17421.patch | 829 bytes | chamilsanjeewa |
| #3 | 17421.diff | 829 bytes | chamilsanjeewa |
Issue fork drupal-3630425
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #3
chamilsanjeewa commentedOpened MR !17421 with the fix, and attached a static patch of the same change for use with composer-patches.
The header cell for the actions (Remove) column in the multi-value widget table was an empty array, which renders as an empty
<th></th>. It now holds a visually hidden "Operations" label, so the column has an accessible name and nothing changes visually.Claro's
preprocess_field_multiple_value_formstill works: for disabled widgets, its loop adds theis-disabledclass to header cells that have adatakey, so this cell gets it like the others.Testing steps:
/node/add/articleand inspect the field's table header: the third<th>now contains<span class="visually-hidden">Operations</span>.Still needs tests, so leaving this at Needs work / Needs tests.
Comment #4
chamilsanjeewa commentedComment #5
chamilsanjeewa commentedComment #6
chamilsanjeewa commentedComment #7
quietone commentedDoes this happen on the main branch with the Default Admin theme?
Comment #8
chamilsanjeewa commentedYes, on the main branch.

Comment #9
mgiffordYes, this still exists. In the Default Admin Theme it is:
With an updated (D11 to D12) patch it is:
Update done with AI.
I will update the MR, but the details behind this are here https://github.com/mgifford/drupal-core-lab/blob/main/reports/issues/363...
Comment #10
smustgrave commentedMR needs to be updated for main then and test coverage.
Thanks