diff --git a/application/applicationextension.inc.php b/application/applicationextension.inc.php index 5759db1a60..d1a66149dc 100644 --- a/application/applicationextension.inc.php +++ b/application/applicationextension.inc.php @@ -30,6 +30,15 @@ require_once(APPROOT.'application/newsroomprovider.class.inc.php'); * @license http://opensource.org/licenses/AGPL-3.0 * @since 2.7.0 */ + +require_once(APPROOT.'application/applicationextension/common/ApplicationPopupMenuItem.php'); +require_once(APPROOT.'application/applicationextension/common/iPopupMenuExtension.php'); +require_once(APPROOT.'application/applicationextension/common/JSButtonItem.php'); +require_once(APPROOT.'application/applicationextension/common/JSPopupMenuItem.php'); +require_once(APPROOT.'application/applicationextension/common/SeparatorPopupMenuItem.php'); +require_once(APPROOT.'application/applicationextension/common/URLButtonItem.php'); +require_once(APPROOT.'application/applicationextension/common/URLPopupMenuItem.php'); + require_once(APPROOT.'application/applicationextension/backoffice/iApplicationUIExtension.php'); require_once(APPROOT.'application/applicationextension/backoffice/iBackofficeDictEntriesExtension.php'); require_once(APPROOT.'application/applicationextension/backoffice/iBackofficeDictEntriesPrefixesExtension.php'); @@ -43,19 +52,12 @@ require_once(APPROOT.'application/applicationextension/backoffice/iBackofficeScr require_once(APPROOT.'application/applicationextension/backoffice/iBackofficeStyleExtension.php'); require_once(APPROOT.'application/applicationextension/backoffice/iFieldRendererMappingsExtension.php'); require_once(APPROOT.'application/applicationextension/backoffice/iPageUIBlockExtension.php'); -require_once(APPROOT.'application/applicationextension/backoffice/iPopupMenuExtension.php'); require_once(APPROOT.'application/applicationextension/backoffice/iPreferencesExtension.php'); require_once(APPROOT.'application/applicationextension/backoffice/iWelcomePopupExtension.php'); require_once(APPROOT.'application/applicationextension/backoffice/AbstractApplicationUIExtension.php'); require_once(APPROOT.'application/applicationextension/backoffice/AbstractPageUIBlockExtension.php'); require_once(APPROOT.'application/applicationextension/backoffice/AbstractPreferencesExtension.php'); require_once(APPROOT.'application/applicationextension/backoffice/AbstractWelcomePopupExtension.php'); -require_once(APPROOT.'application/applicationextension/backoffice/ApplicationPopupMenuItem.php'); -require_once(APPROOT.'application/applicationextension/backoffice/JSButtonItem.php'); -require_once(APPROOT.'application/applicationextension/backoffice/JSPopupMenuItem.php'); -require_once(APPROOT.'application/applicationextension/backoffice/SeparatorPopupMenuItem.php'); -require_once(APPROOT.'application/applicationextension/backoffice/URLButtonItem.php'); -require_once(APPROOT.'application/applicationextension/backoffice/URLPopupMenuItem.php'); require_once(APPROOT.'application/applicationextension/iBackupExtraFilesExtension.php'); require_once(APPROOT.'application/applicationextension/iKPILoggerExtension.php'); diff --git a/application/applicationextension/backoffice/ApplicationPopupMenuItem.php b/application/applicationextension/common/ApplicationPopupMenuItem.php similarity index 52% rename from application/applicationextension/backoffice/ApplicationPopupMenuItem.php rename to application/applicationextension/common/ApplicationPopupMenuItem.php index 0a1baaf6ba..f0ecaccbe6 100644 --- a/application/applicationextension/backoffice/ApplicationPopupMenuItem.php +++ b/application/applicationextension/common/ApplicationPopupMenuItem.php @@ -1,5 +1,9 @@ sLabel; } + /** + * @param string $sLabel + * + * @api + * @since 3.3.0 + */ + public function SetLabel(string $sLabel): void + { + $this->sLabel = $sLabel; + } + /** * Get the CSS classes * @@ -141,9 +162,76 @@ abstract class ApplicationPopupMenuItem */ abstract public function GetMenuItem(); + /** + * Get additional data, child classes can use this without having to worry about this class interfaces + * @return array + * @since 3.3.0 + */ + protected function GetMenuItemAdditionalData(): array + { + $aAdditionalData = []; + + $aDataAttributes = $this->GetDataAttributes()->GetAttributes(); + if (!empty($aDataAttributes)) { + $aAdditionalData['data_attributes'] = $aDataAttributes; + } + + $aAriaAttributes = $this->GetAriaAttributes()->GetAttributes(); + if (!empty($aAriaAttributes)) { + $aAdditionalData['aria_attributes'] = $aAriaAttributes; + } + + $oGrouping = $this->GetGrouping(); + if ($oGrouping !== null) { + $aAdditionalData['grouping_uid'] = $oGrouping->GetUID(); + } + + return $aAdditionalData; + } + /** @ignore */ public function GetLinkedScripts() { return []; } + + /** + * @api + * @since 3.3.0 + */ + public function GetAriaAttributes(): AriaAttributes + { + return $this->oAriaAttributes ??= new AriaAttributes(); + } + + /** + * @api + * @since 3.3.0 + */ + public function GetDataAttributes(): DataAttributes + { + return $this->oDataAttributes ??= new DataAttributes(); + } + + /** + * @api + * @since 3.3.0 + */ + public function GetGrouping(): ?Grouping + { + return $this->oGrouping; + } + + /** + * @param Grouping|null $oGrouping + * @return static + * @api + * @since 3.3.0 + */ + public function SetGrouping(?Grouping $oGrouping): static + { + $this->oGrouping = $oGrouping; + + return $this; + } } diff --git a/application/applicationextension/backoffice/JSButtonItem.php b/application/applicationextension/common/JSButtonItem.php similarity index 100% rename from application/applicationextension/backoffice/JSButtonItem.php rename to application/applicationextension/common/JSButtonItem.php diff --git a/application/applicationextension/backoffice/JSPopupMenuItem.php b/application/applicationextension/common/JSPopupMenuItem.php similarity index 90% rename from application/applicationextension/backoffice/JSPopupMenuItem.php rename to application/applicationextension/common/JSPopupMenuItem.php index 03f68af617..b3308e53b2 100644 --- a/application/applicationextension/backoffice/JSPopupMenuItem.php +++ b/application/applicationextension/common/JSPopupMenuItem.php @@ -3,7 +3,7 @@ /** * Class for adding an item into a popup menu that triggers some Javascript code * - * Note: This works only in the backoffice, {@see \JSButtonItem} for the end-user portal + * Note: This works only in the backoffice, {@see \common\JSButtonItem} for the end-user portal * * @api * @package UIExtensibilityAPI @@ -40,7 +40,7 @@ class JSPopupMenuItem extends ApplicationPopupMenuItem public function GetMenuItem() { // Note: the semicolumn is a must here! - return [ + $aData = [ 'label' => $this->GetLabel(), 'onclick' => $this->GetJsCode().'; return false;', 'url' => $this->GetUrl(), @@ -48,6 +48,8 @@ class JSPopupMenuItem extends ApplicationPopupMenuItem 'icon_class' => $this->sIconClass, 'tooltip' => $this->sTooltip, ]; + + return array_merge($aData, $this->GetMenuItemAdditionalData()); } /** @ignore */ diff --git a/application/applicationextension/backoffice/SeparatorPopupMenuItem.php b/application/applicationextension/common/SeparatorPopupMenuItem.php similarity index 72% rename from application/applicationextension/backoffice/SeparatorPopupMenuItem.php rename to application/applicationextension/common/SeparatorPopupMenuItem.php index 3be00a0f78..f1cf27c9a1 100644 --- a/application/applicationextension/backoffice/SeparatorPopupMenuItem.php +++ b/application/applicationextension/common/SeparatorPopupMenuItem.php @@ -24,6 +24,12 @@ class SeparatorPopupMenuItem extends ApplicationPopupMenuItem /** @ignore */ public function GetMenuItem() { - return ['label' => '', 'url' => '', 'css_classes' => $this->aCssClasses]; + $aData = [ + 'label' => '', + 'url' => '', + 'css_classes' => $this->aCssClasses, + ]; + + return array_merge($aData, $this->GetMenuItemAdditionalData()); } } diff --git a/application/applicationextension/backoffice/URLButtonItem.php b/application/applicationextension/common/URLButtonItem.php similarity index 100% rename from application/applicationextension/backoffice/URLButtonItem.php rename to application/applicationextension/common/URLButtonItem.php diff --git a/application/applicationextension/backoffice/URLPopupMenuItem.php b/application/applicationextension/common/URLPopupMenuItem.php similarity index 86% rename from application/applicationextension/backoffice/URLPopupMenuItem.php rename to application/applicationextension/common/URLPopupMenuItem.php index bd330bf6a5..4276627fda 100644 --- a/application/applicationextension/backoffice/URLPopupMenuItem.php +++ b/application/applicationextension/common/URLPopupMenuItem.php @@ -3,7 +3,7 @@ /** * Class for adding an item into a popup menu that browses to the given URL * - * Note: This works only in the backoffice, {@see \URLButtonItem} for the end-user portal + * Note: This works only in the backoffice, {@see \common\URLButtonItem} for the end-user portal * * @api * @package UIExtensibilityAPI @@ -35,13 +35,15 @@ class URLPopupMenuItem extends ApplicationPopupMenuItem /** @ignore */ public function GetMenuItem() { - return ['label' => $this->GetLabel(), + $aData = ['label' => $this->GetLabel(), 'url' => $this->GetUrl(), 'target' => $this->GetTarget(), 'css_classes' => $this->aCssClasses, 'icon_class' => $this->sIconClass, 'tooltip' => $this->sTooltip, ]; + + return array_merge($aData, $this->GetMenuItemAdditionalData()); } /** @ignore */ diff --git a/application/applicationextension/common/iAriaAttributesProvider.php b/application/applicationextension/common/iAriaAttributesProvider.php new file mode 100644 index 0000000000..8f7298706b --- /dev/null +++ b/application/applicationextension/common/iAriaAttributesProvider.php @@ -0,0 +1,15 @@ + Attribute name => value, ready to be escaped and printed */ + public function GetHtmlAttributes(): array; +} diff --git a/application/applicationextension/backoffice/iPopupMenuExtension.php b/application/applicationextension/common/iPopupMenuExtension.php similarity index 80% rename from application/applicationextension/backoffice/iPopupMenuExtension.php rename to application/applicationextension/common/iPopupMenuExtension.php index 0f9f507ff6..87a28efb6a 100644 --- a/application/applicationextension/backoffice/iPopupMenuExtension.php +++ b/application/applicationextension/common/iPopupMenuExtension.php @@ -95,7 +95,24 @@ interface iPopupMenuExtension * @todo */ public const PORTAL_MENU_ACTIONS = 10; - + /** + * Get the list of items to be added to the backoffice top-bar items + * $param is an array: [] for now, in a distant future we want to give a complete context + * @since 3.3.0 + */ + public const MENU_TOPBAR_ACTIONS = 11; + /** + * Get the list of items to be added to the actions on a given form field (i.e. the attribute of an object) + * $param is an array: ['object' => DBObject, att_code => attribute code , mode => edit/read] + * @since 3.3.0 + */ + public const MENU_OBJDETAILS_FIELD_ACTIONS = 12; + /** + * Get the list of items to be added to the actions in the activity panel (read-only mode) + * $param is an array: ['object' => DBObject, caselog_att_code => caselog attribute code or 'activity'] + * @since 3.3.0 + */ + public const MENU_OBJDETAILS_ACTIVITY_PANEL_ACTIONS = 13; /** * Get the list of items to be added to a menu. * diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php index 9836c31027..dda98b793f 100644 --- a/application/cmdbabstract.class.inc.php +++ b/application/cmdbabstract.class.inc.php @@ -49,6 +49,7 @@ use Combodo\iTop\Application\WebPage\WebPage; use Combodo\iTop\Renderer\BlockRenderer; use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer; use Combodo\iTop\Renderer\Console\ConsoleFormRenderer; +use Combodo\iTop\Service\InterfaceDiscovery\InterfaceDiscovery; use Combodo\iTop\Service\Links\LinkSetDataTransformer; use Combodo\iTop\Service\Links\LinkSetModel; use Combodo\iTop\Service\TemporaryObjects\TemporaryObjectHelper; @@ -1065,6 +1066,14 @@ HTML } } $val['value_raw'] = ($bExcludeRawValue === false) ? $this->Get($sAttCode) : ''; + $val['actions'] = []; + + /** @var \iPopupMenuExtension $oExtensionInstance */ + foreach (InterfaceDiscovery::GetInstance()->FindItopClasses('iPopupMenuExtension') as $oExtensionInstance) { + foreach ($oExtensionInstance::EnumItems(iPopupMenuExtension::MENU_OBJDETAILS_FIELD_ACTIONS, ['object' => $this, 'att_code' => $sAttCode, 'mode' => $bEditMode ? 'edit' : 'read']) as $oMenuItem) { + $val['actions'][] = $oMenuItem; + } + } // The field is visible, add it to the current column $oField = FieldUIBlockFactory::MakeFromParams($val); diff --git a/application/dashboard.class.inc.php b/application/dashboard.class.inc.php index 967fc92ad5..b42f29223d 100644 --- a/application/dashboard.class.inc.php +++ b/application/dashboard.class.inc.php @@ -586,7 +586,7 @@ JS /** @var \Dashlet $oDashlet */ foreach ($aCell as $oDashlet) { if ($oDashlet->IsVisible()) { - $oPage->add('