Optgroups on select attribute are not supported
>>> [!note] Migrated issue <!-- Drupal.org comment --> <!-- Migrated from issue #3545260. --> Reported by: [valery.suslov](https://www.drupal.org/user/3788140) Related to !25 >>> <h3 id="summary-problem-motivation">Problem/Motivation</h3> <p>I would like to use optgroups on select element. However, due to the current implementation only flat list of options is supported. Attempt to provide an optgroup results in error.</p> <h4 id="summary-steps-reproduce">Steps to reproduce</h4> <p>Create a link attribute of type select and add options with optgroups:</p> <pre>attribute:<br>&nbsp; type: select<br>&nbsp; title: Select with optgroups<br>&nbsp; options:<br>&nbsp;&nbsp;&nbsp;&nbsp; Group1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key1: Value1<br>&nbsp;&nbsp;&nbsp;&nbsp; Group2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key2: Value2</pre><h3 id="summary-proposed-resolution">Proposed resolution</h3> <p>Currently it fails due to the option translation in /src/LinkAttributesManager.php that only handles a single level of options:</p> <pre>&nbsp;&nbsp;&nbsp; // Translate options.<br>&nbsp;&nbsp;&nbsp; if (!empty($definition['options'])) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach ($definition['options'] as $property =&gt; $option) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $definition['options'][$property] = new TranslatableMarkup($option);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</pre><p>Proposal is to allow handling inner arrays, also translating $property when $option is value, e.g.:</p> <pre>&nbsp;&nbsp;&nbsp; // Translate options.<br>&nbsp;&nbsp;&nbsp; if (!empty($definition['options'])) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $definition['options'] = $this-&gt;translateOptions($definition['options']);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br><br>&nbsp; /**<br>&nbsp;&nbsp; * Translate options, preserving optgroups.<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @param array&lt;string,mixed&gt; $options<br>&nbsp;&nbsp; *&nbsp;&nbsp; Array of options, possibly grouped.<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @return array&lt;string,mixed&gt;<br>&nbsp;&nbsp; *&nbsp;&nbsp; Array with optgroups and option values translated.<br>&nbsp;&nbsp; */<br>&nbsp; private function translateOptions(array $options): array {<br>&nbsp;&nbsp;&nbsp; $translated = [];<br>&nbsp;&nbsp;&nbsp; foreach ($options as $property =&gt; $option) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (is_array($option)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $translated[(string) new TranslatableMarkup($property)] = $this-&gt;translateOptions($option);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $translated[$property] = new TranslatableMarkup($option);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return $translated;<br>&nbsp; }</pre><h3 id="summary-remaining-tasks">Remaining tasks</h3> <p>-</p> <h3 id="summary-ui-changes">User interface changes</h3> <p>-</p> <h3 id="summary-api-changes">API changes</h3> <p>-</p> <h3 id="summary-data-model-changes">Data model changes</h3> <p>-</p>
issue