Avoid uid colliding in DOM ids

This commit is contained in:
Stephen Abello
2026-08-28 15:03:45 +02:00
parent 925ee7ae33
commit bcf4d5c47f
10 changed files with 41 additions and 7 deletions

View File

@@ -407,6 +407,7 @@ class ButtonUIBlockFactory extends AbstractUIBlockFactory
$oButton->SetColor($sColor);
$oButton->SetAriaAttributes($oPopupItem->GetAriaAttributes()->GetAttributes());
$oButton->SetDataAttributes($oPopupItem->GetDataAttributes()->GetAttributes());
$oButton->AddDataAttribute('uid', $oPopupItem->GetUID());
return $oButton;
} elseif ($oPopupItem instanceof URLPopupMenuItem) {
@@ -426,11 +427,13 @@ class ButtonUIBlockFactory extends AbstractUIBlockFactory
$oButton->SetColor($sColor);
$oButton->SetAriaAttributes($oPopupItem->GetAriaAttributes()->GetAttributes());
$oButton->SetDataAttributes($oPopupItem->GetDataAttributes()->GetAttributes());
$oButton->AddDataAttribute('uid', $oPopupItem->GetUID());
return $oButton;
} elseif ($oPopupItem instanceof SeparatorPopupMenuItem) {
$oSeparator = new ButtonSeparator(utils::GetSafeId($oPopupItem->GetUID(), true));
$oSeparator = new ButtonSeparator();
$oSeparator->SetCSSClasses($oPopupItem->GetCssClasses());
$oSeparator->AddDataAttribute('uid', $oPopupItem->GetUID());
return $oSeparator;
}
@@ -466,6 +469,7 @@ class ButtonUIBlockFactory extends AbstractUIBlockFactory
$oButton->AddMultipleJsFilesRelPaths($oPopupItem->GetLinkedScripts());
$oButton->SetAriaAttributes($oPopupItem->GetAriaAttributes()->GetAttributes());
$oButton->SetDataAttributes($oPopupItem->GetDataAttributes()->GetAttributes());
$oButton->AddDataAttribute('uid', $oPopupItem->GetUID());
return $oButton;
} elseif ($oPopupItem instanceof URLPopupMenuItem) {
@@ -488,11 +492,13 @@ class ButtonUIBlockFactory extends AbstractUIBlockFactory
}
$oButton->SetAriaAttributes($oPopupItem->GetAriaAttributes()->GetAttributes());
$oButton->SetDataAttributes($oPopupItem->GetDataAttributes()->GetAttributes());
$oButton->AddDataAttribute('uid', $oPopupItem->GetUID());
return $oButton;
} elseif ($oPopupItem instanceof SeparatorPopupMenuItem) {
$oSeparator = new ButtonSeparator(utils::GetSafeId($oPopupItem->GetUID(), true));
$oSeparator = new ButtonSeparator();
$oSeparator->SetCSSClasses($oPopupItem->GetCssClasses());
$oSeparator->AddDataAttribute('uid', $oPopupItem->GetUID());
return $oSeparator;
}

View File

@@ -48,13 +48,22 @@ abstract class ActivityPanelAction extends UIBlock
public function __construct(string $sLabel, string $sIconClass, ?string $sTooltip, string $sUid)
{
parent::__construct(utils::GetSafeId($sUid, true));
// UID is necessary for parent ID generation, we set it first
$this->sUid = $sUid;
parent::__construct();
$this->sLabel = $sLabel;
$this->sIconClass = $sIconClass;
$this->sTooltip = $sTooltip;
}
/**
* @inheritDoc
*/
protected function GenerateId(): string
{
return parent::GenerateId().'--'.utils::GetSafeId($this->sUid);
}
public function SetPopupItems(array $aPopupItems): static
{
$this->aPopupItems = $aPopupItems;

View File

@@ -56,13 +56,22 @@ abstract class TopBarQuickAction extends UIBlock
*/
public function __construct(string $sLabel, string $sIconClass, ?string $sTooltip, string $sUid)
{
parent::__construct(utils::GetSafeId($sUid, true));
// UID is necessary for parent ID generation, we set it first
$this->sUid = $sUid;
parent::__construct();
$this->sLabel = $sLabel;
$this->sIconClass = $sIconClass;
$this->sTooltip = $sTooltip;
}
/**
* @inheritDoc
*/
protected function GenerateId(): string
{
return parent::GenerateId().'--'.utils::GetSafeId($this->sUid);
}
public function GetAriaAttributes(): array
{
$aDefaultValues = [];

View File

@@ -5,7 +5,11 @@
class="{{ oUIBlock.GetBlocksInheritanceCSSClassesAsString() }}
{% if oUIBlock.GetAdditionalCSSClassesAsString() %}{{ oUIBlock.GetAdditionalCSSClassesAsString() }}{% endif %}
{% if oUIBlock.IsHidden() %}ibo-is-hidden{% endif %}"
data-role="ibo-button-separator">
data-role="ibo-button-separator"
{% if oUIBlock.GetDataAttributes() %}
{% for sName, sValue in oUIBlock.GetDataAttributes() %}
data-{{ sName }}="{{ sValue }}"
{% endfor %}
{% endif %}>
</span>
{% endapply %}

View File

@@ -2,6 +2,7 @@
id="{{ oUIBlock.GetId() }}"
class="{{ oUIBlock.GetBlocksInheritanceCSSClassesAsString() }} {{ oUIBlock.GetAdditionalCSSClassesAsString() }} ibo-activity-panel--activity-action"
data-role="ibo-activity-panel--activity-action"
data-uid="{{ oUIBlock.GetUID() }}"
{% if oUIBlock.GetDataAttributes() %}
{% for sName, sValue in oUIBlock.GetDataAttributes() %}
data-{{ sName }}="{{ sValue }}"

View File

@@ -1,4 +1,5 @@
<span id="{{ oUIBlock.GetId() }}"
class="{{ oUIBlock.GetBlocksInheritanceCSSClassesAsString() }} {{ oUIBlock.GetAdditionalCSSClassesAsString() }} ibo-activity-panel--activity-action-separator"
data-role="ibo-activity-panel--activity-action-separator">
data-role="ibo-activity-panel--activity-action-separator"
data-uid="{{ oUIBlock.GetUID() }}">
</span>

View File

@@ -2,6 +2,7 @@
id="{{ oUIBlock.GetId() }}"
class="{{ oUIBlock.GetBlocksInheritanceCSSClassesAsString() }} {{ oUIBlock.GetAdditionalCSSClassesAsString() }} ibo-activity-panel--activity-action"
data-role="ibo-activity-panel--activity-action"
data-uid="{{ oUIBlock.GetUID() }}"
{% if oUIBlock.GetDataAttributes() %}
{% for sName, sValue in oUIBlock.GetDataAttributes() %}
data-{{ sName }}="{{ sValue }}"

View File

@@ -3,6 +3,7 @@
data-role="ibo-top-bar-quick-action">
<div class="ibo-top-bar-quick-action--head" data-role="ibo-top-bar-quick-action--head">
<a href="{{ oUIBlock.GetURL() }}" class="ibo-top-bar-quick-action--icon" data-role="ibo-top-bar-quick-action--icon"
data-uid="{{ oUIBlock.GetUID() }}"
{% if oUIBlock.GetDataAttributes() %}
{% for sName, sValue in oUIBlock.GetDataAttributes() %}
data-{{ sName }}="{{ sValue }}"

View File

@@ -1,6 +1,7 @@
<div id="{{ oUIBlock.GetId() }}"
class="{{ oUIBlock.GetBlocksInheritanceCSSClassesAsString() }} {{ oUIBlock.GetAdditionalCSSClassesAsString() }} ibo-top-bar-quick-action-separator"
data-role="ibo-top-bar-quick-action-separator"
data-uid="{{ oUIBlock.GetUID() }}"
{% if oUIBlock.GetDataAttributes() %}
{% for sName, sValue in oUIBlock.GetDataAttributes() %}
data-{{ sName }}="{{ sValue }}"

View File

@@ -4,6 +4,7 @@
<div class="ibo-top-bar-quick-action--head" data-role="ibo-top-bar-quick-action--head">
<a href="{{ oUIBlock.GetURL() }}" class="ibo-top-bar-quick-action--icon" data-role="ibo-top-bar-quick-action--icon"
target="{{ oUIBlock.GetTarget() }}"
data-uid="{{ oUIBlock.GetUID() }}"
{% if oUIBlock.GetDataAttributes() %}
{% for sName, sValue in oUIBlock.GetDataAttributes() %}
data-{{ sName }}="{{ sValue }}"