From 0e7e87ff8b97ac31ea13f56d37f4332a3a5c491a Mon Sep 17 00:00:00 2001 From: Stephen Abello Date: Fri, 21 Aug 2026 14:53:04 +0200 Subject: [PATCH] Correctly handle separators --- css/backoffice/components/_all.scss | 1 + .../components/_button-separator.scss | 20 +++++++++ css/backoffice/components/_field.scss | 7 ++- .../activity-panel/_activity-action.scss | 11 +++++ .../activity-panel/_caselog-entry-form.scss | 4 ++ .../layout/top-bar/_top-bar-action.scss | 6 +++ lib/composer/autoload_classmap.php | 3 ++ lib/composer/autoload_static.php | 3 ++ .../Base/Component/Button/ButtonSeparator.php | 37 +++++++++++++++ .../Component/Button/ButtonUIBlockFactory.php | 32 +++++++++++-- .../Component/Field/FieldUIBlockFactory.php | 2 +- .../ActivityPanelActionFactory.php | 29 ++++++++---- .../ActivityPanelActionSeparator.php | 43 ++++++++++++++++++ .../TopBarQuickActionFactory.php | 9 +++- .../TopBarQuickActionSeparator.php | 45 +++++++++++++++++++ .../button/separator/layout.html.twig | 11 +++++ .../activity-action-separator.html.twig | 4 ++ .../top-bar-quick-action-separator.html.twig | 4 ++ 18 files changed, 255 insertions(+), 16 deletions(-) create mode 100644 css/backoffice/components/_button-separator.scss create mode 100644 sources/Application/UI/Base/Component/Button/ButtonSeparator.php create mode 100644 sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionSeparator.php create mode 100644 sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionSeparator.php create mode 100644 templates/base/components/button/separator/layout.html.twig create mode 100644 templates/base/layouts/activity-panel/activity-action/activity-action-separator.html.twig create mode 100644 templates/base/layouts/top-bar/top-bar-quick-action/top-bar-quick-action-separator.html.twig diff --git a/css/backoffice/components/_all.scss b/css/backoffice/components/_all.scss index 14e62bac21..ae162d3f09 100644 --- a/css/backoffice/components/_all.scss +++ b/css/backoffice/components/_all.scss @@ -5,6 +5,7 @@ @import "alert"; @import "button"; +@import "button-separator"; @import "button-group"; @import "breadcrumbs"; @import "quick-create"; diff --git a/css/backoffice/components/_button-separator.scss b/css/backoffice/components/_button-separator.scss new file mode 100644 index 0000000000..2762b65353 --- /dev/null +++ b/css/backoffice/components/_button-separator.scss @@ -0,0 +1,20 @@ +/* + * @copyright Copyright (C) 2010-2026 Combodo SAS + * @license http://opensource.org/licenses/AGPL-3.0 + */ + +$ibo-button-separator--width: 1px !default; +$ibo-button-separator--height: 16px !default; +$ibo-button-separator--margin-x: 0.75rem !default; +$ibo-button-separator--margin-y: $ibo-spacing-0 !default; +$ibo-button-separator--border-size: 1px !default; +$ibo-button-separator--border-color: $ibo-color-grey-500 !default; + +.ibo-button-separator { + display: inline-flex; + border-right: $ibo-button-separator--border-size solid $ibo-button-separator--border-color; + width: $ibo-button-separator--width; + height: $ibo-button-separator--height; + margin: $ibo-button-separator--margin-y $ibo-button-separator--margin-x; +} + diff --git a/css/backoffice/components/_field.scss b/css/backoffice/components/_field.scss index 33bc5bb8df..a4c198617f 100644 --- a/css/backoffice/components/_field.scss +++ b/css/backoffice/components/_field.scss @@ -267,14 +267,19 @@ $ibo-field--enable-bulk--checkbox--margin-left: $ibo-spacing-300 !default; } .ibo-field--label { - .ibo-field--action { + .ibo-field--action:not(.ibo-button-separator) { width: 20px; height: 20px; padding: 0; border-radius: $ibo-field--fullscreen-toggler--border-radius; font-size: $ibo-font-size-50; + vertical-align: center; ~ .ibo-field--action { margin-left: 2px; } } + .ibo-field--action.ibo-button-separator { + margin: 0 2px; + vertical-align: center; + } } diff --git a/css/backoffice/layout/activity-panel/_activity-action.scss b/css/backoffice/layout/activity-panel/_activity-action.scss index ebecc776b6..bfc1c913be 100644 --- a/css/backoffice/layout/activity-panel/_activity-action.scss +++ b/css/backoffice/layout/activity-panel/_activity-action.scss @@ -13,6 +13,9 @@ $ibo-activity-panel--activity-action--icon--height: 100% !default; $ibo-activity-panel--activity-action--icon--width: $ibo-activity-panel--activity-action--icon--height !default; $ibo-activity-panel--activity-action--icon--font-size: $ibo-font-size-200 !default; $ibo-activity-panel--activity-action--icon--line-height: 33px !default; +$ibo-activity-panel--activity-action-separator--width: 24px !default; +$ibo-activity-panel--activity-action-separator--height: 1px !default; +$ibo-activity-panel--activity-action-separator--background-color: $ibo-color-grey-500 !default; .ibo-activity-panel--activity-actions { @@ -60,3 +63,11 @@ $ibo-activity-panel--activity-action--icon--line-height: 33px !default; display: none; } } + +.ibo-activity-panel--activity-action-separator { + display: block; + width: $ibo-activity-panel--activity-action-separator--width; + height: $ibo-activity-panel--activity-action-separator--height; + margin: auto; + background-color: $ibo-activity-panel--activity-action-separator--background-color; +} diff --git a/css/backoffice/layout/activity-panel/_caselog-entry-form.scss b/css/backoffice/layout/activity-panel/_caselog-entry-form.scss index d26b085a21..a342215796 100644 --- a/css/backoffice/layout/activity-panel/_caselog-entry-form.scss +++ b/css/backoffice/layout/activity-panel/_caselog-entry-form.scss @@ -59,4 +59,8 @@ $ibo-caselog-entry-form--lock-message--margin-left: 1rem !default; } .ibo-caselog-entry-form--action-buttons--main-actions > .ibo-popover-menu { z-index: 1; +} + +.ibo-caselog-entry-form--action-buttons--extra-actions .ibo-button-separator{ + vertical-align: center ; } \ No newline at end of file diff --git a/css/backoffice/layout/top-bar/_top-bar-action.scss b/css/backoffice/layout/top-bar/_top-bar-action.scss index d98e464aed..a93a0aa175 100644 --- a/css/backoffice/layout/top-bar/_top-bar-action.scss +++ b/css/backoffice/layout/top-bar/_top-bar-action.scss @@ -27,4 +27,10 @@ $ibo-top-bar-quick-action--icon--color--on-active: $ibo-color-primary-800 !defau &:active{ color: $ibo-top-bar-quick-action--icon--color--on-active; } +} + +.ibo-top-bar-quick-action-separator { + width: 2px; + background-color: $ibo-color-grey-300; + margin: 0 8px; } \ No newline at end of file diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index eb352d2ca7..1192d17652 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -169,6 +169,7 @@ return array( 'Combodo\\iTop\\Application\\UI\\Base\\Component\\ButtonGroup\\ButtonGroupUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/ButtonGroup/ButtonGroupUIBlockFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\Button' => $baseDir . '/sources/Application/UI/Base/Component/Button/Button.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonJS' => $baseDir . '/sources/Application/UI/Base/Component/Button/ButtonJS.php', + 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonSeparator' => $baseDir . '/sources/Application/UI/Base/Component/Button/ButtonSeparator.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonUIBlockFactory' => $baseDir . '/sources/Application/UI/Base/Component/Button/ButtonUIBlockFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonURL' => $baseDir . '/sources/Application/UI/Base/Component/Button/ButtonURL.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\CollapsibleSection\\CollapsibleSection' => $baseDir . '/sources/Application/UI/Base/Component/CollapsibleSection/CollapsibleSection.php', @@ -275,6 +276,7 @@ return array( 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelAction\\ActivityPanelAction' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelAction.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelAction\\ActivityPanelActionFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelAction\\ActivityPanelActionJS' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionJS.php', + 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelAction\\ActivityPanelActionSeparator' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionSeparator.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelAction\\ActivityPanelActionURL' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionURL.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelFactory' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelHelper' => $baseDir . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelHelper.php', @@ -305,6 +307,7 @@ return array( 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarAction\\TopBarQuickAction' => $baseDir . '/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickAction.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarAction\\TopBarQuickActionFactory' => $baseDir . '/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarAction\\TopBarQuickActionJS' => $baseDir . '/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionJS.php', + 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarAction\\TopBarQuickActionSeparator' => $baseDir . '/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionSeparator.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarAction\\TopBarQuickActionURL' => $baseDir . '/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionURL.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarFactory' => $baseDir . '/sources/Application/UI/Base/Layout/TopBar/TopBarFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlock' => $baseDir . '/sources/Application/UI/Base/Layout/UIContentBlock.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index 10f275b36e..089ae1d2b8 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -570,6 +570,7 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685 'Combodo\\iTop\\Application\\UI\\Base\\Component\\ButtonGroup\\ButtonGroupUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/ButtonGroup/ButtonGroupUIBlockFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\Button' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Button/Button.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonJS' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Button/ButtonJS.php', + 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonSeparator' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Button/ButtonSeparator.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonUIBlockFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Button/ButtonUIBlockFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Button\\ButtonURL' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/Button/ButtonURL.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\CollapsibleSection\\CollapsibleSection' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Component/CollapsibleSection/CollapsibleSection.php', @@ -676,6 +677,7 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelAction\\ActivityPanelAction' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelAction.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelAction\\ActivityPanelActionFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelAction\\ActivityPanelActionJS' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionJS.php', + 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelAction\\ActivityPanelActionSeparator' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionSeparator.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelAction\\ActivityPanelActionURL' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionURL.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\ActivityPanel\\ActivityPanelHelper' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelHelper.php', @@ -706,6 +708,7 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarAction\\TopBarQuickAction' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickAction.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarAction\\TopBarQuickActionFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarAction\\TopBarQuickActionJS' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionJS.php', + 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarAction\\TopBarQuickActionSeparator' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionSeparator.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarAction\\TopBarQuickActionURL' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionURL.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\TopBar\\TopBarFactory' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/TopBar/TopBarFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Layout\\UIContentBlock' => __DIR__ . '/../..' . '/sources/Application/UI/Base/Layout/UIContentBlock.php', diff --git a/sources/Application/UI/Base/Component/Button/ButtonSeparator.php b/sources/Application/UI/Base/Component/Button/ButtonSeparator.php new file mode 100644 index 0000000000..721a66f197 --- /dev/null +++ b/sources/Application/UI/Base/Component/Button/ButtonSeparator.php @@ -0,0 +1,37 @@ +GetTooltip(); @@ -416,14 +425,25 @@ class ButtonUIBlockFactory extends AbstractUIBlockFactory $oButton->SetColor($sColor); return $oButton; + } elseif ($oPopupItem instanceof SeparatorPopupMenuItem) { + $oSeparator = new ButtonSeparator($oPopupItem->GetUID()); + $oSeparator->SetCSSClasses($oPopupItem->GetCssClasses()); + return $oSeparator; } - //TODO How to handle other types of ApplicationPopupMenuItem? For now, we return null. + // Should never happen, but just in case a new type is added, return null return null; } - public static function MakeButtonFromApplicationPopupMenuItem($oPopupItem, $sColor = Button::ENUM_COLOR_SCHEME_NEUTRAL, $sActionType = Button::ENUM_ACTION_TYPE_ALTERNATIVE) + /** + * @param ApplicationPopupMenuItem $oPopupItem + * @param string $sColor + * @param string $sActionType + * + * @return \Combodo\iTop\Application\UI\Base\Component\Button\Button|\Combodo\iTop\Application\UI\Base\Component\Button\ButtonSeparator|null + */ + public static function MakeButtonFromApplicationPopupMenuItem(ApplicationPopupMenuItem $oPopupItem, $sColor = Button::ENUM_COLOR_SCHEME_NEUTRAL, $sActionType = Button::ENUM_ACTION_TYPE_ALTERNATIVE): Button|ButtonSeparator|null { if ($oPopupItem instanceof JSPopupMenuItem) { $oButton = self::MakeForAction( @@ -466,9 +486,13 @@ class ButtonUIBlockFactory extends AbstractUIBlockFactory } return $oButton; + } elseif ($oPopupItem instanceof SeparatorPopupMenuItem) { + $oSeparator = new ButtonSeparator($oPopupItem->GetUID()); + $oSeparator->SetCSSClasses($oPopupItem->GetCssClasses()); + return $oSeparator; } - //TODO How to handle other types of ApplicationPopupMenuItem? For now, we return null. + // Should never happen, but just in case a new type is added, return null return null; } diff --git a/sources/Application/UI/Base/Component/Field/FieldUIBlockFactory.php b/sources/Application/UI/Base/Component/Field/FieldUIBlockFactory.php index 816b461962..cf675d7bd3 100644 --- a/sources/Application/UI/Base/Component/Field/FieldUIBlockFactory.php +++ b/sources/Application/UI/Base/Component/Field/FieldUIBlockFactory.php @@ -72,7 +72,7 @@ class FieldUIBlockFactory extends AbstractUIBlockFactory if (isset($aParams['actions'])) { //TODO make this a configuration parameter - $iMaxActions = 2; + $iMaxActions = 50; $aActions = []; // Create a button for a few action or a kebab button for multiple actions that a more than what's configured if (count($aParams['actions']) > $iMaxActions) { diff --git a/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionFactory.php b/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionFactory.php index 46b020201f..0193c79e94 100644 --- a/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionFactory.php +++ b/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionFactory.php @@ -24,6 +24,7 @@ use ApplicationPopupMenuItem; use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu; use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenuItem\PopoverMenuItemFactory; use JSPopupMenuItem; +use SeparatorPopupMenuItem; use URLPopupMenuItem; /** @@ -61,26 +62,38 @@ class ActivityPanelActionFactory $aSectionPopupItems = [$aSectionPopupItems]; } + // Special index as separators aren't meant to be multiple action across different caselogs + $iSectionSeparatorIndex = 0; foreach ($aSectionPopupItems as $oPopupItem) { if (!$oPopupItem instanceof ApplicationPopupMenuItem) { continue; } $sUid = $oPopupItem->GetUID(); + if ($oPopupItem instanceof SeparatorPopupMenuItem) { + $iSectionSeparatorIndex++; + $sUid = 'ibo-activity-panel--activity-action-separator--'.$iSectionSeparatorIndex; + } if (!isset($aActionsByUid[$sUid])) { $oActivityAction = static::MakeFromApplicationPopupItem($oPopupItem); if ($oActivityAction === null) { continue; } - $oPopoverMenu = new PopoverMenu($oActivityAction->GetId().'-menu'); - $oPopoverMenu->SetContainer(PopoverMenu::ENUM_CONTAINER_BODY); - $oPopoverMenu->SetTogglerFromBlock($oActivityAction); - $oActivityAction->SetPopoverMenu($oPopoverMenu); + if (false === ($oActivityAction instanceof ActivityPanelActionSeparator)) { + $oPopoverMenu = new PopoverMenu($oActivityAction->GetId().'-menu'); + $oPopoverMenu->SetContainer(PopoverMenu::ENUM_CONTAINER_BODY); + $oPopoverMenu->SetTogglerFromBlock($oActivityAction); + $oActivityAction->SetPopoverMenu($oPopoverMenu); + } $aActionsByUid[$sUid] = $oActivityAction; } + if ($aActionsByUid[$sUid] instanceof ActivityPanelActionSeparator) { + continue; + } + $oPopupItemForPopoverMenuItem = clone $oPopupItem; $oPopupItemForPopoverMenuItem->SetLabel($sSectionLabel); $oPopupItemForPopoverMenuItem->SetIconClass(''); @@ -108,9 +121,7 @@ class ActivityPanelActionFactory $oAction->SetIncludeJSFiles($oPopupItem->GetLinkedScripts()); return $oAction; - } - - if ($oPopupItem instanceof URLPopupMenuItem) { + } elseif ($oPopupItem instanceof URLPopupMenuItem) { $oAction = new ActivityPanelActionURL( $oPopupItem->GetLabel(), $oPopupItem->GetIconClass(), @@ -121,9 +132,11 @@ class ActivityPanelActionFactory $oAction->SetTarget($oPopupItem->GetTarget()); return $oAction; + } elseif ($oPopupItem instanceof SeparatorPopupMenuItem) { + return new ActivityPanelActionSeparator($oPopupItem->GetUID()); } - //TODO How to handle other types of ApplicationPopupMenuItem? For now, we return null. + // Should never happen, but just in case a new type is added, return null return null; } diff --git a/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionSeparator.php b/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionSeparator.php new file mode 100644 index 0000000000..76117e8d38 --- /dev/null +++ b/sources/Application/UI/Base/Layout/ActivityPanel/ActivityPanelAction/ActivityPanelActionSeparator.php @@ -0,0 +1,43 @@ +SetUrl($oApplicationPopupItem->GetUrl()); $oTopBarAction->SetTarget($oApplicationPopupItem->GetTarget()); return $oTopBarAction; + } elseif ($oApplicationPopupItem instanceof SeparatorPopupMenuItem) { + $oTopBarAction = new TopBarQuickActionSeparator($oApplicationPopupItem->GetUID()); + $oTopBarAction->SetCSSClasses($oApplicationPopupItem->GetCssClasses()); + return $oTopBarAction; } - //TODO How to handle other types of ApplicationPopupMenuItem? For now, we return null. + // Should never happen, but just in case a new type is added, return null return null; } } diff --git a/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionSeparator.php b/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionSeparator.php new file mode 100644 index 0000000000..f2ff8876f8 --- /dev/null +++ b/sources/Application/UI/Base/Layout/TopBar/TopBarQuickAction/TopBarQuickActionSeparator.php @@ -0,0 +1,45 @@ + + +{% endapply %} + diff --git a/templates/base/layouts/activity-panel/activity-action/activity-action-separator.html.twig b/templates/base/layouts/activity-panel/activity-action/activity-action-separator.html.twig new file mode 100644 index 0000000000..ac56463f54 --- /dev/null +++ b/templates/base/layouts/activity-panel/activity-action/activity-action-separator.html.twig @@ -0,0 +1,4 @@ + + diff --git a/templates/base/layouts/top-bar/top-bar-quick-action/top-bar-quick-action-separator.html.twig b/templates/base/layouts/top-bar/top-bar-quick-action/top-bar-quick-action-separator.html.twig new file mode 100644 index 0000000000..a59bbb3188 --- /dev/null +++ b/templates/base/layouts/top-bar/top-bar-quick-action/top-bar-quick-action-separator.html.twig @@ -0,0 +1,4 @@ +
+