N°8031 - Make all portal bricks use custom templates for all templates (#691)

* N°8031 - Make all portal bricks use custom templates for all templates

* Rename parameter following code review

* Add const variables following code review

* Modify method name following code review
This commit is contained in:
Stephen Abello
2024-12-18 11:03:52 +01:00
committed by GitHub
parent 0c3a35fc43
commit 5ac6c84813
14 changed files with 241 additions and 85 deletions

View File

@@ -65,6 +65,10 @@ abstract class AbstractBrick
const DEFAULT_ALLOWED_PROFILES_OQL = ''; const DEFAULT_ALLOWED_PROFILES_OQL = '';
/** @var string DEFAULT_DENIED_PROFILES_OQL */ /** @var string DEFAULT_DENIED_PROFILES_OQL */
const DEFAULT_DENIED_PROFILES_OQL = ''; const DEFAULT_DENIED_PROFILES_OQL = '';
/** @var array $DEFAULT_TEMPLATES_PATH */
protected static $DEFAULT_TEMPLATES_PATH = [
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
];
/** @var string $sId */ /** @var string $sId */
protected $sId; protected $sId;
@@ -112,7 +116,7 @@ abstract class AbstractBrick
$this->bActive = static::DEFAULT_ACTIVE; $this->bActive = static::DEFAULT_ACTIVE;
$this->bVisible = static::DEFAULT_VISIBLE; $this->bVisible = static::DEFAULT_VISIBLE;
$this->fRank = static::DEFAULT_RANK; $this->fRank = static::DEFAULT_RANK;
$this->sPageTemplatePath = static::DEFAULT_PAGE_TEMPLATE_PATH; $this->sPageTemplatePath = static::$DEFAULT_TEMPLATES_PATH['page'];
$this->sTitle = static::DEFAULT_TITLE; $this->sTitle = static::DEFAULT_TITLE;
$this->sDescription = static::DEFAULT_DESCRIPTION; $this->sDescription = static::DEFAULT_DESCRIPTION;
$this->sDataLoading = static::DEFAULT_DATA_LOADING; $this->sDataLoading = static::DEFAULT_DATA_LOADING;
@@ -572,6 +576,20 @@ abstract class AbstractBrick
return ($this->sDescription !== null && $this->sDescription !== ''); return ($this->sDescription !== null && $this->sDescription !== '');
} }
/**
* @param $sTemplateId
* @param $sTemplatePath
*
* @return void
* @since 3.2.1
*/
public static function SetDefaultTemplatePath($sTemplateId, $sTemplatePath)
{
if(array_key_exists($sTemplateId, static::$DEFAULT_TEMPLATES_PATH)) {
static::$DEFAULT_TEMPLATES_PATH[$sTemplateId] = $sTemplatePath;
}
}
/** /**
* Load the brick's data from the xml passed as a ModuleDesignElement. * Load the brick's data from the xml passed as a ModuleDesignElement.
* This is used to set all the brick attributes at once. * This is used to set all the brick attributes at once.
@@ -665,14 +683,13 @@ abstract class AbstractBrick
* @param $aPortalProperties * @param $aPortalProperties
* *
* @return void * @return void
* @throws \DOMFormatException
* @since 3.2.1 * @since 3.2.1
*/ */
public function LoadFromPortalProperties($aPortalProperties) public static function LoadClassDefinitionFromPortalProperties($aPortalProperties)
{ {
// Get the bricks templates // Get the bricks templates
$aBricksTemplates = $aPortalProperties['templates']['bricks']; $aBricksTemplates = $aPortalProperties['templates']['bricks'];
$sClassFQCN = get_class($this); $sClassFQCN = static::class;
// Get the current brick templates // Get the current brick templates
$aCurrentBricksTemplates = array_key_exists($sClassFQCN, $aBricksTemplates) ? $aBricksTemplates[$sClassFQCN] : []; $aCurrentBricksTemplates = array_key_exists($sClassFQCN, $aBricksTemplates) ? $aBricksTemplates[$sClassFQCN] : [];
@@ -681,16 +698,7 @@ abstract class AbstractBrick
$sTemplateId = str_ireplace($sClassFQCN.':', '', $sTemplateKey); $sTemplateId = str_ireplace($sClassFQCN.':', '', $sTemplateKey);
// Call the set method for the template // Call the set method for the template
$sSetTemplateMethodName = 'Set'.$sTemplateId.'TemplatePath'; static::SetDefaultTemplatePath($sTemplateId, $sTemplate);
if(method_exists($this, $sSetTemplateMethodName)) {
$this->{$sSetTemplateMethodName}($sTemplate);
}
else {
throw new DOMFormatException(
'Template "'.$sTemplateId.'" is not a valid template for brick ' . $sClassFQCN,
null, null);
}
} }
} }
} }

View File

@@ -39,7 +39,10 @@ class AggregatePageBrick extends PortalBrick
const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-tachometer-alt'; const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-tachometer-alt';
const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-tachometer-alt fa-2x'; const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-tachometer-alt fa-2x';
const DEFAULT_PAGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/aggregate-page/layout.html.twig'; const DEFAULT_PAGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/aggregate-page/layout.html.twig';
protected static $DEFAULT_TEMPLATES_PATH = [
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
];
// Overloaded variables // Overloaded variables
public static $sRouteName = 'p_aggregatepage_brick'; public static $sRouteName = 'p_aggregatepage_brick';

View File

@@ -62,7 +62,7 @@ class BrickCollection
* @throws \Exception * @throws \Exception
* @since 3.2.1 Added $aCombodoPortalInstanceConf parameter * @since 3.2.1 Added $aCombodoPortalInstanceConf parameter
*/ */
public function __construct(ModuleDesign $oModuleDesign, $aCombodoPortalInstanceConf) public function __construct(ModuleDesign $oModuleDesign, array $aCombodoPortalInstanceConf)
{ {
$this->oModuleDesign = $oModuleDesign; $this->oModuleDesign = $oModuleDesign;
$this->aAllowedBricks = null; $this->aAllowedBricks = null;
@@ -202,11 +202,12 @@ class BrickCollection
{ {
if (class_exists($sBrickClass)) if (class_exists($sBrickClass))
{ {
/** @var \Combodo\iTop\Portal\Brick\PortalBrick $oBrick */
$oBrick = new $sBrickClass();
// Load the portal properties that are common to all bricks of this type // Load the portal properties that are common to all bricks of this type
$oBrick->LoadFromPortalProperties($this->aCombodoPortalInstanceConf['properties']); $sBrickClass::LoadClassDefinitionFromPortalProperties($this->aCombodoPortalInstanceConf['properties']);
/** @var \Combodo\iTop\Portal\Brick\PortalBrick $oBrick */
$oBrick = new $sBrickClass();
// Load the brick specific properties from its XML definition // Load the brick specific properties from its XML definition
$oBrick->LoadFromXml($oBrickNode); $oBrick->LoadFromXml($oBrickNode);

View File

@@ -32,6 +32,13 @@ use Combodo\iTop\DesignElement;
*/ */
class BrowseBrick extends PortalBrick class BrowseBrick extends PortalBrick
{ {
/** @var string DEFAULT_PAGE_TEMPLATE_PATH */
const DEFAULT_MODE_LIST_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/browse/mode_list.html.twig';
/** @var string DEFAULT_MODE_MOSAIC_TEMPLATE_PATH */
const DEFAULT_MODE_MOSAIC_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/browse/mode_mosaic.html.twig';
/** @var string DEFAULT_MODE_TREE_TEMPLATE_PATH */
const DEFAULT_MODE_TREE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/browse/mode_tree.html.twig';
/** @var string ENUM_BROWSE_MODE_LIST */ /** @var string ENUM_BROWSE_MODE_LIST */
const ENUM_BROWSE_MODE_LIST = 'list'; const ENUM_BROWSE_MODE_LIST = 'list';
/** @var string ENUM_BROWSE_MODE_TREE */ /** @var string ENUM_BROWSE_MODE_TREE */
@@ -77,6 +84,13 @@ class BrowseBrick extends PortalBrick
const DEFAULT_ACTION_OPENING_TARGET = self::ENUM_OPENING_TARGET_MODAL; const DEFAULT_ACTION_OPENING_TARGET = self::ENUM_OPENING_TARGET_MODAL;
/** @var int DEFAULT_LIST_LENGTH */ /** @var int DEFAULT_LIST_LENGTH */
const DEFAULT_LIST_LENGTH = 20; const DEFAULT_LIST_LENGTH = 20;
protected static $DEFAULT_TEMPLATES_PATH = [
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
'mode-list'=> self::DEFAULT_MODE_LIST_TEMPLATE_PATH,
'mode-mosaic'=> self::DEFAULT_MODE_MOSAIC_TEMPLATE_PATH,
'mode-tree'=> self::DEFAULT_MODE_TREE_TEMPLATE_PATH,
];
// Overloaded variables // Overloaded variables
public static $sRouteName = 'p_browse_brick'; public static $sRouteName = 'p_browse_brick';
@@ -359,7 +373,7 @@ class BrowseBrick extends PortalBrick
} }
else else
{ {
$sTemplatePath = 'itop-portal-base/portal/templates/bricks/browse/mode_'.$sModeId.'.html.twig'; $sTemplatePath = static::$DEFAULT_TEMPLATES_PATH['mode-'.$sModeId];
} }
$aModeData['template'] = $sTemplatePath; $aModeData['template'] = $sTemplatePath;

View File

@@ -36,7 +36,10 @@ class CreateBrick extends PortalBrick
const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-plus'; const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-plus';
const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-plus fa-2x'; const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-plus fa-2x';
const DEFAULT_PAGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/create/modal.html.twig'; const DEFAULT_PAGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/create/modal.html.twig';
protected static $DEFAULT_TEMPLATES_PATH = [
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
];
/** @var string DEFAULT_CLASS */ /** @var string DEFAULT_CLASS */
const DEFAULT_CLASS = ''; const DEFAULT_CLASS = '';

View File

@@ -37,7 +37,10 @@ class FilterBrick extends PortalBrick
const DEFAULT_TILE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/filter/tile.html.twig'; const DEFAULT_TILE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/filter/tile.html.twig';
const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-search'; const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-search';
const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-search fa-2x'; const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-search fa-2x';
protected static $DEFAULT_TEMPLATES_PATH = [
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
];
/** @var string DEFAULT_TARGET_BRICK_CLASS */ /** @var string DEFAULT_TARGET_BRICK_CLASS */
const DEFAULT_TARGET_BRICK_CLASS = 'Combodo\\iTop\\Portal\\Brick\\BrowseBrick'; const DEFAULT_TARGET_BRICK_CLASS = 'Combodo\\iTop\\Portal\\Brick\\BrowseBrick';
/** @var string DEFAULT_SEARCH_PLACEHOLDER_VALUE */ /** @var string DEFAULT_SEARCH_PLACEHOLDER_VALUE */

View File

@@ -63,6 +63,14 @@ class ManageBrick extends PortalBrick
const DEFAULT_DATA_LOADING = self::ENUM_DATA_LOADING_LAZY; const DEFAULT_DATA_LOADING = self::ENUM_DATA_LOADING_LAZY;
const DEFAULT_TILE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-default.html.twig'; const DEFAULT_TILE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-default.html.twig';
const DEFAULT_TILE_CONTROLLER_ACTION = 'Combodo\\iTop\\Portal\\Controller\\ManageBrickController::TileAction'; const DEFAULT_TILE_CONTROLLER_ACTION = 'Combodo\\iTop\\Portal\\Controller\\ManageBrickController::TileAction';
const DEFAULT_LAYOUT_CHART_TEMPLATE_PATH = self::ENUM_PAGE_TEMPLATE_PATH_CHART;
const DEFAULT_LAYOUT_TABLE_TEMPLATE_PATH = self::ENUM_PAGE_TEMPLATE_PATH_TABLE;
const DEFAULT_LAYOUT_BADGE_TEMPLATE_PATH = self::ENUM_PAGE_TEMPLATE_PATH_TABLE;
const DEFAULT_TILE_CHART_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-chart.html.twig';
const DEFAULT_TILE_TOP_LIST_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-top-list.html.twig';
const DEFAULT_TILE_BADGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-badge.html.twig';
const DEFAULT_TILE_DEFAULT_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-default.html.twig';
const DEFAULT_POPUP_EXPORT_EXCEL_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/popup-export-excel.html.twig';
/** @var string DEFAULT_OQL */ /** @var string DEFAULT_OQL */
const DEFAULT_OQL = ''; const DEFAULT_OQL = '';
@@ -83,6 +91,19 @@ class ManageBrick extends PortalBrick
/** @var bool DEFAULT_GROUP_SHOW_OTHERS */ /** @var bool DEFAULT_GROUP_SHOW_OTHERS */
const DEFAULT_GROUP_SHOW_OTHERS = true; const DEFAULT_GROUP_SHOW_OTHERS = true;
protected static $DEFAULT_TEMPLATES_PATH = [
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
'layout-chart' => self::DEFAULT_LAYOUT_CHART_TEMPLATE_PATH,
'layout-table' => self::DEFAULT_LAYOUT_TABLE_TEMPLATE_PATH,
'layout-badge' => self::DEFAULT_LAYOUT_BADGE_TEMPLATE_PATH,
'tile-chart' => self::DEFAULT_TILE_CHART_TEMPLATE_PATH,
'tile-top-list' => self::DEFAULT_TILE_TOP_LIST_TEMPLATE_PATH,
'tile-badge' => self::DEFAULT_TILE_BADGE_TEMPLATE_PATH,
'tile-default' => self::DEFAULT_TILE_DEFAULT_TEMPLATE_PATH,
'popup-export-excel' => self::DEFAULT_POPUP_EXPORT_EXCEL_TEMPLATE_PATH,
];
/** @var array $aDisplayModes */ /** @var array $aDisplayModes */
static $aDisplayModes = array( static $aDisplayModes = array(
self::ENUM_DISPLAY_MODE_LIST, self::ENUM_DISPLAY_MODE_LIST,
@@ -97,44 +118,13 @@ class ManageBrick extends PortalBrick
self::ENUM_TILE_MODE_BAR, self::ENUM_TILE_MODE_BAR,
self::ENUM_TILE_MODE_TOP, self::ENUM_TILE_MODE_TOP,
); );
/** Initialized in its getter as we need DEFAULT_TEMPLATE static values to be accessible */
/** @var array $aDefaultPresentationData */
private static $aDefaultPresentationData = [];
/** Specific data for the current brick, including brick definition overloads */
/** @var array $aPresentationData */ /** @var array $aPresentationData */
public static $aPresentationData = array( public $aPresentationData = [];
self::ENUM_TILE_MODE_BADGE => array(
'decorationCssClass' => 'fas fa-id-card fa-2x',
'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-badge.html.twig',
'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_TABLE,
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
'need_details' => true,
),
self::ENUM_TILE_MODE_TOP => array(
'decorationCssClass' => 'fas fa-signal fa-rotate-270 fa-2x',
'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-top-list.html.twig',
'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_TABLE,
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
'need_details' => true,
),
self::ENUM_TILE_MODE_PIE => array(
'decorationCssClass' => 'fas fa-chart-pie fa-2x',
'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-chart.html.twig',
'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_CHART,
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_PIE,
'need_details' => false,
),
self::ENUM_TILE_MODE_BAR => array(
'decorationCssClass' => 'fas fa-chart-bar fa-2x',
'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-chart.html.twig',
'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_CHART,
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_BAR,
'need_details' => false,
),
self::ENUM_TILE_MODE_TEXT => array(
'decorationCssClass' => 'fas fa-pen-square fa-2x',
'tileTemplate' => self::DEFAULT_TILE_TEMPLATE_PATH,
'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_TABLE,
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
'need_details' => true,
),
);
// Overloaded variables // Overloaded variables
public static $sRouteName = 'p_manage_brick'; public static $sRouteName = 'p_manage_brick';
@@ -163,6 +153,8 @@ class ManageBrick extends PortalBrick
protected $bGroupShowOthers; protected $bGroupShowOthers;
/** @var int $iDefaultListLength */ /** @var int $iDefaultListLength */
protected $iDefaultListLength; protected $iDefaultListLength;
/** @var string $sPopupExportExcelTemplatePath */
protected $sPopupExportExcelTemplatePath;
/** /**
* Returns true if the $sDisplayMode need objects details for rendering. * Returns true if the $sDisplayMode need objects details for rendering.
@@ -174,7 +166,7 @@ class ManageBrick extends PortalBrick
static public function AreDetailsNeededForDisplayMode($sDisplayMode) static public function AreDetailsNeededForDisplayMode($sDisplayMode)
{ {
$bNeedDetails = false; $bNeedDetails = false;
foreach (static::$aPresentationData as $aData) foreach (static::GetDefaultPresentationData() as $aData)
{ {
if ($aData['layoutDisplayMode'] === $sDisplayMode) if ($aData['layoutDisplayMode'] === $sDisplayMode)
{ {
@@ -195,8 +187,8 @@ class ManageBrick extends PortalBrick
*/ */
static public function GetPageTemplateFromDisplayMode($sDisplayMode) static public function GetPageTemplateFromDisplayMode($sDisplayMode)
{ {
$sTemplate = static::DEFAULT_PAGE_TEMPLATE_PATH; $sTemplate = static::$DEFAULT_TEMPLATES_PATH['page'];
foreach (static::$aPresentationData as $aData) foreach (static::GetDefaultPresentationData() as $aData)
{ {
if ($aData['layoutDisplayMode'] === $sDisplayMode) if ($aData['layoutDisplayMode'] === $sDisplayMode)
{ {
@@ -227,6 +219,7 @@ class ManageBrick extends PortalBrick
$this->iGroupLimit = static::DEFAULT_GROUP_LIMIT; $this->iGroupLimit = static::DEFAULT_GROUP_LIMIT;
$this->bGroupShowOthers = static::DEFAULT_GROUP_SHOW_OTHERS; $this->bGroupShowOthers = static::DEFAULT_GROUP_SHOW_OTHERS;
$this->iDefaultListLength = static::DEFAULT_LIST_LENGTH; $this->iDefaultListLength = static::DEFAULT_LIST_LENGTH;
$this->sPopupExportExcelTemplatePath = static::$DEFAULT_TEMPLATES_PATH['popup-export-excel'];
// This is hardcoded for now, we might allow area grouping on another attribute in the future // This is hardcoded for now, we might allow area grouping on another attribute in the future
$this->AddGrouping('areas', array('attribute' => 'finalclass')); $this->AddGrouping('areas', array('attribute' => 'finalclass'));
@@ -328,7 +321,7 @@ class ManageBrick extends PortalBrick
public function GetDecorationCssClass() public function GetDecorationCssClass()
{ {
return static::$aPresentationData[$this->sTileMode]['decorationCssClass']; return static::GetDefaultPresentationData()[$this->sTileMode]['decorationCssClass'];
} }
/** /**
* Sets the tile mode (display) * Sets the tile mode (display)
@@ -344,6 +337,52 @@ class ManageBrick extends PortalBrick
return $this; return $this;
} }
public static function GetDefaultPresentationData()
{
/** If the table isn't initialized yet, do it now */
if (count(static::$aDefaultPresentationData) === 0) {
static::$aDefaultPresentationData = array(
self::ENUM_TILE_MODE_BADGE => array(
'decorationCssClass' => 'fas fa-id-card fa-2x',
'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-badge'],
'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-table'],
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
'need_details' => true,
),
self::ENUM_TILE_MODE_TOP => array(
'decorationCssClass' => 'fas fa-signal fa-rotate-270 fa-2x',
'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-top-list'],
'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-table'],
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
'need_details' => true,
),
self::ENUM_TILE_MODE_PIE => array(
'decorationCssClass' => 'fas fa-chart-pie fa-2x',
'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-chart'],
'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-chart'],
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_PIE,
'need_details' => false,
),
self::ENUM_TILE_MODE_BAR => array(
'decorationCssClass' => 'fas fa-chart-bar fa-2x',
'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-chart'],
'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-chart'],
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_BAR,
'need_details' => false,
),
self::ENUM_TILE_MODE_TEXT => array(
'decorationCssClass' => 'fas fa-pen-square fa-2x',
'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-default'],
'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-table'],
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
'need_details' => true,
),
);
}
return static::$aDefaultPresentationData;
}
/** /**
* @param string $sTileMode * @param string $sTileMode
* *
@@ -351,12 +390,12 @@ class ManageBrick extends PortalBrick
*/ */
public function GetPresentationDataForTileMode($sTileMode) public function GetPresentationDataForTileMode($sTileMode)
{ {
if (isset(static::$aPresentationData[$sTileMode])) if (isset(static::GetDefaultPresentationData()[$sTileMode]))
{ {
return static::$aPresentationData[$sTileMode]; return static::GetDefaultPresentationData()[$sTileMode];
} }
return static::$aPresentationData[static::DEFAULT_TILE_MODE]; return static::GetDefaultPresentationData()[static::DEFAULT_TILE_MODE];
} }
/** /**
@@ -467,6 +506,15 @@ class ManageBrick extends PortalBrick
return $this; return $this;
} }
public function GetPopupExportExcelTemplatePath() {
return $this->sPopupExportExcelTemplatePath;
}
public function SetPopupExportExcelTemplatePath($sPopupExportExcelTemplatePath) {
$this->sPopupExportExcelTemplatePath = $sPopupExportExcelTemplatePath;
return $this;
}
/** /**
* Adds a grouping. * Adds a grouping.
* *
@@ -965,10 +1013,10 @@ class ManageBrick extends PortalBrick
// Checking the navigation icon // Checking the navigation icon
$sDecorationClassNavigationMenu = $this->GetDecorationClassNavigationMenu(); $sDecorationClassNavigationMenu = $this->GetDecorationClassNavigationMenu();
if (empty($sDecorationClassNavigationMenu) && isset(static::$aPresentationData[$this->sTileMode])) if (empty($sDecorationClassNavigationMenu) && isset(static::GetDefaultPresentationData()[$this->sTileMode]))
{ {
/** @var string $sDecorationClassNavigationMenu */ /** @var string $sDecorationClassNavigationMenu */
$sDecorationClassNavigationMenu = static::$aPresentationData[$this->sTileMode]['decorationCssClass']; $sDecorationClassNavigationMenu = static::GetDefaultPresentationData()[$this->sTileMode]['decorationCssClass'];
if (!empty($sDecorationClassNavigationMenu)) if (!empty($sDecorationClassNavigationMenu))
{ {
$this->SetDecorationClassNavigationMenu($sDecorationClassNavigationMenu); $this->SetDecorationClassNavigationMenu($sDecorationClassNavigationMenu);

View File

@@ -0,0 +1,59 @@
<?php
namespace Combodo\iTop\Portal\Brick;
/**
* Description of ObjectBrick
*
* @package Combodo\iTop\Portal\Brick
* @since 3.2.1
* @author Stephen Abello <stephen.abello@combodo.com>
*/
abstract class ObjectBrick extends AbstractBrick
{
/** @var string DEFAULT_PAGE_TEMPLATE_PATH */
const DEFAULT_PAGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/object/layout.html.twig';
/** @var string DEFAULT_MODAL_TEMPLATE_PATH */
const DEFAULT_MODAL_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/object/modal.html.twig';
/** @var string DEFAULT_MODE_LOADER_TEMPLATE_PATH */
const DEFAULT_MODE_LOADER_TEMPLATE_PATH = 'itop-portal-base/portal/templates/modal/mode_loader.html.twig';
protected static $DEFAULT_TEMPLATES_PATH = [
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
'modal' => self::DEFAULT_MODAL_TEMPLATE_PATH,
'mode_loader' => self::DEFAULT_MODE_LOADER_TEMPLATE_PATH,
];
/**
* @param $aCombodoPortalInstanceConf
*
* @return void
*/
public static function InitializeSelf($aCombodoPortalInstanceConf): void
{
static::LoadClassDefinitionFromPortalProperties($aCombodoPortalInstanceConf['properties']);
}
/**
* @return string
*/
public static function GetPageDefaultTemplatePath(): string
{
return static::$DEFAULT_TEMPLATES_PATH['page'];
}
/**
* @return string
*/
public static function GetModalDefaultTemplatePath(): string
{
return static::$DEFAULT_TEMPLATES_PATH['modal'];
}
/**
* @return string
*/
public static function GetModeLoaderDefaultTemplatePath(): string
{
return static::$DEFAULT_TEMPLATES_PATH['mode_loader'];
}
}

View File

@@ -63,6 +63,11 @@ abstract class PortalBrick extends AbstractBrick
/** @var string DEFAULT_OPENING_TARGET */ /** @var string DEFAULT_OPENING_TARGET */
const DEFAULT_OPENING_TARGET = self::ENUM_OPENING_TARGET_MODAL; const DEFAULT_OPENING_TARGET = self::ENUM_OPENING_TARGET_MODAL;
protected static $DEFAULT_TEMPLATES_PATH = [
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
];
/** @var string|null $sRouteName */ /** @var string|null $sRouteName */
static $sRouteName = null; static $sRouteName = null;
/** @var array $aOpeningTargets */ /** @var array $aOpeningTargets */
@@ -121,7 +126,7 @@ abstract class PortalBrick extends AbstractBrick
$this->bVisibleNavigationMenu = static::DEFAULT_VISIBLE_NAVIGATION_MENU; $this->bVisibleNavigationMenu = static::DEFAULT_VISIBLE_NAVIGATION_MENU;
$this->sDecorationClassHome = static::DEFAULT_DECORATION_CLASS_HOME; $this->sDecorationClassHome = static::DEFAULT_DECORATION_CLASS_HOME;
$this->sDecorationClassNavigationMenu = static::DEFAULT_DECORATION_CLASS_NAVIGATION_MENU; $this->sDecorationClassNavigationMenu = static::DEFAULT_DECORATION_CLASS_NAVIGATION_MENU;
$this->sTileTemplatePath = static::DEFAULT_TILE_TEMPLATE_PATH; $this->sTileTemplatePath = static::$DEFAULT_TEMPLATES_PATH['tile'];
$this->sTileControllerAction = static::DEFAULT_TILE_CONTROLLER_ACTION; $this->sTileControllerAction = static::DEFAULT_TILE_CONTROLLER_ACTION;
$this->sOpeningTarget = static::DEFAULT_OPENING_TARGET; $this->sOpeningTarget = static::DEFAULT_OPENING_TARGET;
} }

View File

@@ -39,7 +39,10 @@ class UserProfileBrick extends PortalBrick
const DEFAUT_TITLE = 'Brick:Portal:UserProfile:Title'; const DEFAUT_TITLE = 'Brick:Portal:UserProfile:Title';
const DEFAULT_DECORATION_CLASS_HOME = 'glyphicon glyphicon-user'; const DEFAULT_DECORATION_CLASS_HOME = 'glyphicon glyphicon-user';
const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'glyphicon glyphicon-user'; const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'glyphicon glyphicon-user';
protected static $DEFAULT_TEMPLATES_PATH = [
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
];
/** @var bool DEFAULT_SHOW_PICTURE_FORM */ /** @var bool DEFAULT_SHOW_PICTURE_FORM */
const DEFAULT_SHOW_PICTURE_FORM = true; const DEFAULT_SHOW_PICTURE_FORM = true;
/** @var bool DEFAULT_SHOW_PREFERENCES_FORM */ /** @var bool DEFAULT_SHOW_PREFERENCES_FORM */

View File

@@ -70,7 +70,9 @@ use utils;
*/ */
class ManageBrickController extends BrickController class ManageBrickController extends BrickController
{ {
/** @var string EXCEL_EXPORT_TEMPLATE_PATH */ /** @var string EXCEL_EXPORT_TEMPLATE_PATH
* @deprecated since 3.2.1
*/
const EXCEL_EXPORT_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/popup-export-excel.html.twig'; const EXCEL_EXPORT_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/popup-export-excel.html.twig';
/** /**
@@ -281,7 +283,7 @@ class ManageBrickController extends BrickController
'sWikiUrl' => 'https://www.itophub.io/wiki/page?id='.utils::GetItopVersionWikiSyntax().'%3Auser%3Alists#excel_export', 'sWikiUrl' => 'https://www.itophub.io/wiki/page?id='.utils::GetItopVersionWikiSyntax().'%3Auser%3Alists#excel_export',
); );
return $this->render(static::EXCEL_EXPORT_TEMPLATE_PATH, $aData); return $this->render($oBrick->GetPopupExportExcelTemplatePath(), $aData);
} }
/** /**

View File

@@ -29,6 +29,7 @@ use BinaryExpression;
use Combodo\iTop\Form\Field\DateTimeField; use Combodo\iTop\Form\Field\DateTimeField;
use Combodo\iTop\Portal\Brick\BrickCollection; use Combodo\iTop\Portal\Brick\BrickCollection;
use Combodo\iTop\Portal\Brick\CreateBrick; use Combodo\iTop\Portal\Brick\CreateBrick;
use Combodo\iTop\Portal\Brick\ObjectBrick;
use Combodo\iTop\Portal\Helper\ApplicationHelper; use Combodo\iTop\Portal\Helper\ApplicationHelper;
use Combodo\iTop\Portal\Helper\ContextManipulatorHelper; use Combodo\iTop\Portal\Helper\ContextManipulatorHelper;
use Combodo\iTop\Portal\Helper\NavigationRuleHelper; use Combodo\iTop\Portal\Helper\NavigationRuleHelper;
@@ -82,8 +83,11 @@ class ObjectController extends BrickController
* @param \Combodo\iTop\Portal\Brick\BrickCollection $oBrickCollection * @param \Combodo\iTop\Portal\Brick\BrickCollection $oBrickCollection
* @param \Combodo\iTop\Portal\Helper\ObjectFormHandlerHelper $oObjectFormHandlerHelper * @param \Combodo\iTop\Portal\Helper\ObjectFormHandlerHelper $oObjectFormHandlerHelper
* @param \Combodo\iTop\Portal\Helper\NavigationRuleHelper $oNavigationRuleHelper * @param \Combodo\iTop\Portal\Helper\NavigationRuleHelper $oNavigationRuleHelper
* @param \Combodo\iTop\Portal\Helper\ContextManipulatorHelper $oContextManipulatorHelper
* @param array $aCombodoPortalInstanceConf
* *
* @since 3.2.0 N°6933 * @since 3.2.0 N°6933
* @since 3.2.1 Added $aCombodoPortalInstanceConf parameter
*/ */
public function __construct( public function __construct(
protected SecurityHelper $oSecurityHelper, protected SecurityHelper $oSecurityHelper,
@@ -93,10 +97,11 @@ class ObjectController extends BrickController
protected BrickCollection $oBrickCollection, protected BrickCollection $oBrickCollection,
protected ObjectFormHandlerHelper $oObjectFormHandlerHelper, protected ObjectFormHandlerHelper $oObjectFormHandlerHelper,
protected NavigationRuleHelper $oNavigationRuleHelper, protected NavigationRuleHelper $oNavigationRuleHelper,
protected ContextManipulatorHelper $oContextManipulatorHelper protected ContextManipulatorHelper $oContextManipulatorHelper,
protected array $aCombodoPortalInstanceConf
) )
{ {
ObjectBrick::InitializeSelf($this->aCombodoPortalInstanceConf);
} }
/** /**
@@ -232,7 +237,7 @@ class ObjectController extends BrickController
if ($oRequest->isXmlHttpRequest()) { if ($oRequest->isXmlHttpRequest()) {
// We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form. // We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form.
if (empty($sOperation)) { if (empty($sOperation)) {
$oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/modal.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetModalDefaultTemplatePath(), $aData);
} else { } else {
$oResponse = new JsonResponse($aData); $oResponse = new JsonResponse($aData);
} }
@@ -246,7 +251,7 @@ class ObjectController extends BrickController
} }
} }
$aData['sPageTitle'] = $aData['form']['title']; $aData['sPageTitle'] = $aData['form']['title'];
$oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/layout.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetPageDefaultTemplatePath(), $aData);
} }
return $oResponse; return $oResponse;
@@ -307,7 +312,7 @@ class ObjectController extends BrickController
// We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form. // We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form.
if (empty($sOperation)) if (empty($sOperation))
{ {
$oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/modal.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetModalDefaultTemplatePath(), $aData);
} }
else else
{ {
@@ -327,7 +332,7 @@ class ObjectController extends BrickController
} }
} }
$aData['sPageTitle'] = $aData['form']['title']; $aData['sPageTitle'] = $aData['form']['title'];
$oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/layout.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetPageDefaultTemplatePath(), $aData);
} }
return $oResponse; return $oResponse;
@@ -534,11 +539,11 @@ class ObjectController extends BrickController
// We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form. // We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form.
if (empty($sOperation)) if (empty($sOperation))
{ {
$oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/modal.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetModalDefaultTemplatePath(), $aData);
} }
elseif ($sOperation === 'redirect') elseif ($sOperation === 'redirect')
{ {
$oResponse = $this->render('itop-portal-base/portal/templates/modal/mode_loader.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetModeLoaderDefaultTemplatePath(), $aData);
} }
else else
{ {
@@ -547,7 +552,7 @@ class ObjectController extends BrickController
} }
else else
{ {
$oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/layout.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetPageDefaultTemplatePath(), $aData);
} }
return $oResponse; return $oResponse;
@@ -1011,12 +1016,12 @@ class ObjectController extends BrickController
if ($oRequest->isXmlHttpRequest()) if ($oRequest->isXmlHttpRequest())
{ {
$oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/modal.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetModalDefaultTemplatePath(), $aData);
} }
else else
{ {
//throw new HttpException(Response::HTTP_NOT_FOUND, Dict::S('UI:ObjectDoesNotExist')); //throw new HttpException(Response::HTTP_NOT_FOUND, Dict::S('UI:ObjectDoesNotExist'));
$oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/layout.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetPageDefaultTemplatePath(), $aData);
} }
} }
else else
@@ -1597,7 +1602,7 @@ class ObjectController extends BrickController
// We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form. // We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form.
if (empty($sOperation)) if (empty($sOperation))
{ {
$oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/modal.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetModalDefaultTemplatePath(), $aData);
} }
else else
{ {
@@ -1617,7 +1622,7 @@ class ObjectController extends BrickController
} }
} }
$aData['sPageTitle'] = $aData['form']['title']; $aData['sPageTitle'] = $aData['form']['title'];
$oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/layout.html.twig', $aData); $oResponse = $this->render(ObjectBrick::GetPageDefaultTemplatePath(), $aData);
} }
return $oResponse; return $oResponse;

View File

@@ -14,6 +14,7 @@ return array(
'Combodo\\iTop\\Portal\\Brick\\CreateBrick' => $baseDir . '/src/Brick/CreateBrick.php', 'Combodo\\iTop\\Portal\\Brick\\CreateBrick' => $baseDir . '/src/Brick/CreateBrick.php',
'Combodo\\iTop\\Portal\\Brick\\FilterBrick' => $baseDir . '/src/Brick/FilterBrick.php', 'Combodo\\iTop\\Portal\\Brick\\FilterBrick' => $baseDir . '/src/Brick/FilterBrick.php',
'Combodo\\iTop\\Portal\\Brick\\ManageBrick' => $baseDir . '/src/Brick/ManageBrick.php', 'Combodo\\iTop\\Portal\\Brick\\ManageBrick' => $baseDir . '/src/Brick/ManageBrick.php',
'Combodo\\iTop\\Portal\\Brick\\ObjectBrick' => $baseDir . '/src/Brick/ObjectBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PortalBrick' => $baseDir . '/src/Brick/PortalBrick.php', 'Combodo\\iTop\\Portal\\Brick\\PortalBrick' => $baseDir . '/src/Brick/PortalBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PropertyNotFoundException' => $baseDir . '/src/Brick/PropertyNotFoundException.php', 'Combodo\\iTop\\Portal\\Brick\\PropertyNotFoundException' => $baseDir . '/src/Brick/PropertyNotFoundException.php',
'Combodo\\iTop\\Portal\\Brick\\UserProfileBrick' => $baseDir . '/src/Brick/UserProfileBrick.php', 'Combodo\\iTop\\Portal\\Brick\\UserProfileBrick' => $baseDir . '/src/Brick/UserProfileBrick.php',

View File

@@ -34,6 +34,7 @@ class ComposerStaticInitdf408f3f8ea034d298269cdf7647358b
'Combodo\\iTop\\Portal\\Brick\\CreateBrick' => __DIR__ . '/../..' . '/src/Brick/CreateBrick.php', 'Combodo\\iTop\\Portal\\Brick\\CreateBrick' => __DIR__ . '/../..' . '/src/Brick/CreateBrick.php',
'Combodo\\iTop\\Portal\\Brick\\FilterBrick' => __DIR__ . '/../..' . '/src/Brick/FilterBrick.php', 'Combodo\\iTop\\Portal\\Brick\\FilterBrick' => __DIR__ . '/../..' . '/src/Brick/FilterBrick.php',
'Combodo\\iTop\\Portal\\Brick\\ManageBrick' => __DIR__ . '/../..' . '/src/Brick/ManageBrick.php', 'Combodo\\iTop\\Portal\\Brick\\ManageBrick' => __DIR__ . '/../..' . '/src/Brick/ManageBrick.php',
'Combodo\\iTop\\Portal\\Brick\\ObjectBrick' => __DIR__ . '/../..' . '/src/Brick/ObjectBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PortalBrick' => __DIR__ . '/../..' . '/src/Brick/PortalBrick.php', 'Combodo\\iTop\\Portal\\Brick\\PortalBrick' => __DIR__ . '/../..' . '/src/Brick/PortalBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PropertyNotFoundException' => __DIR__ . '/../..' . '/src/Brick/PropertyNotFoundException.php', 'Combodo\\iTop\\Portal\\Brick\\PropertyNotFoundException' => __DIR__ . '/../..' . '/src/Brick/PropertyNotFoundException.php',
'Combodo\\iTop\\Portal\\Brick\\UserProfileBrick' => __DIR__ . '/../..' . '/src/Brick/UserProfileBrick.php', 'Combodo\\iTop\\Portal\\Brick\\UserProfileBrick' => __DIR__ . '/../..' . '/src/Brick/UserProfileBrick.php',