diff --git a/addons/userrights/userrightsprofile.class.inc.php b/addons/userrights/userrightsprofile.class.inc.php
index 3d4ff8f71..18117af0b 100644
--- a/addons/userrights/userrightsprofile.class.inc.php
+++ b/addons/userrights/userrightsprofile.class.inc.php
@@ -1,20 +1,7 @@
Get('demo_mode'))
- {
+ if (MetaModel::GetConfig()->Get('demo_mode')) {
// Users deletion is NOT allowed in demo mode
$oDeletionPlan->AddToDelete($this, null);
$oDeletionPlan->SetDeletionIssues($this, array('deletion not allowed in demo mode.'), true);
$oDeletionPlan->ComputeResults();
+
return false;
}
+ try {
+ $this->CheckIfProfileIsAllowed(UR_ACTION_DELETE);
+ }
+ catch (SecurityException $e) {
+ // Users deletion is NOT allowed
+ $oDeletionPlan->AddToDelete($this, null);
+ $oDeletionPlan->SetDeletionIssues($this, [$e->getMessage()], true);
+ $oDeletionPlan->ComputeResults();
+
+ return false;
+ }
+
return parent::CheckToDelete($oDeletionPlan);
}
+ public function DoCheckToDelete(&$oDeletionPlan)
+ {
+ if (MetaModel::GetConfig()->Get('demo_mode')) {
+ // Users deletion is NOT allowed in demo mode
+ $oDeletionPlan->AddToDelete($this, null);
+ $oDeletionPlan->SetDeletionIssues($this, array('deletion not allowed in demo mode.'), true);
+ $oDeletionPlan->ComputeResults();
+
+ return false;
+ }
+ try {
+ $this->CheckIfProfileIsAllowed(UR_ACTION_DELETE);
+ }
+ catch (SecurityException $e) {
+ // Users deletion is NOT allowed
+ $oDeletionPlan->AddToDelete($this, null);
+ $oDeletionPlan->SetDeletionIssues($this, [$e->getMessage()], true);
+ $oDeletionPlan->ComputeResults();
+
+ return false;
+ }
+
+ return parent::DoCheckToDelete($oDeletionPlan);
+ }
+
protected function OnInsert()
{
$this->CheckIfProfileIsAllowed(UR_ACTION_CREATE);
@@ -289,7 +313,6 @@ class URP_UserProfile extends UserRightsBaseClassGUI
protected function OnDelete()
{
- $this->CheckIfProfileIsAllowed(UR_ACTION_DELETE);
}
/**
diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php
index 07654aa77..cf4686625 100644
--- a/application/cmdbabstract.class.inc.php
+++ b/application/cmdbabstract.class.inc.php
@@ -4961,7 +4961,7 @@ EOF
$sSubtitle = Dict::Format('UI:Delect:Confirm_Count_ObjectsOf_Class', count($aObjects),
MetaModel::GetName($sClass));
}
- $oP->AddUiBlock(TitleUIBlockFactory::MakeForPage($sSubtitle));
+ $oP->AddUiBlock(TitleUIBlockFactory::MakeStandard(new Html($sSubtitle)));
foreach ($aObjects as $oObj) {
$aKeys[] = $oObj->GetKey();
diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php
index 64778d58a..53d77186d 100644
--- a/lib/composer/autoload_classmap.php
+++ b/lib/composer/autoload_classmap.php
@@ -219,6 +219,7 @@ return array(
'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreateHelper' => $baseDir . '/sources/application/UI/Base/Component/QuickCreate/QuickCreateHelper.php',
'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\Spinner' => $baseDir . '/sources/application/UI/Base/Component/Spinner/Spinner.php',
'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\SpinnerUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Spinner/SpinnerUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Text\\Text' => $baseDir . '/sources/application/UI/Base/Component/Text/Text.php',
'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\Title' => $baseDir . '/sources/application/UI/Base/Component/Title/Title.php',
'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\TitleUIBlockFactory' => $baseDir . '/sources/application/UI/Base/Component/Title/TitleUIBlockFactory.php',
'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Toolbar' => $baseDir . '/sources/application/UI/Base/Component/Toolbar/Toolbar.php',
diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php
index 0e6806744..b376bca10 100644
--- a/lib/composer/autoload_static.php
+++ b/lib/composer/autoload_static.php
@@ -449,6 +449,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b
'Combodo\\iTop\\Application\\UI\\Base\\Component\\QuickCreate\\QuickCreateHelper' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/QuickCreate/QuickCreateHelper.php',
'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\Spinner' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Spinner/Spinner.php',
'Combodo\\iTop\\Application\\UI\\Base\\Component\\Spinner\\SpinnerUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Spinner/SpinnerUIBlockFactory.php',
+ 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Text\\Text' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Text/Text.php',
'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\Title' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Title/Title.php',
'Combodo\\iTop\\Application\\UI\\Base\\Component\\Title\\TitleUIBlockFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Title/TitleUIBlockFactory.php',
'Combodo\\iTop\\Application\\UI\\Base\\Component\\Toolbar\\Toolbar' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Toolbar/Toolbar.php',
diff --git a/pages/audit.php b/pages/audit.php
index e5baff4bf..d18781a28 100644
--- a/pages/audit.php
+++ b/pages/audit.php
@@ -1,20 +1,7 @@
TrashUnexpectedOutput();
$oP->output();
exit;
- }
- else
- {
+ } else {
$sTitle = Dict::S('UI:Audit:AuditErrors');
$oP->SetBreadCrumbEntry('ui-tool-auditerrors', $sTitle, '', '', 'fas fa-stethoscope', iTopWebPage::ENUM_BREADCRUMB_ENTRY_ICON_TYPE_CSS_CLASSES);
$oBackButton = ButtonUIBlockFactory::MakeIconLink('fas fa-chevron-left', Dict::S('Back to audit results'), "./audit.php?".$oAppContext->GetForLink());
$oP->AddUiBlock($oBackButton);
- $oP->AddUiBlock(new Title($sTitle . $oAuditRule->Get('description')));
-
- $sBlockId = 'audit_errors';
+ $oP->AddUiBlock(TitleUIBlockFactory::MakeForPage($sTitle.$oAuditRule->Get('description')));
+
+ $sBlockId = 'audit_errors';
$oP->p("
");
$oBlock = DisplayBlock::FromObjectSet($oErrorObjectSet, 'csv', array('show_obsolete_data' => true));
$oBlock->Display($oP, 1);
- $oP->p("
");
+ $oP->p("");
// Adjust the size of the Textarea containing the CSV to fit almost all the remaining space
$oP->add_ready_script(" $('#1>textarea').height(400);"); // adjust the size of the block
$sExportUrl = utils::GetAbsoluteUrlAppRoot()."pages/audit.php?operation=csv&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey();
@@ -259,49 +244,49 @@ try
break;
case 'errors':
- $sTitle = Dict::S('UI:Audit:AuditErrors');
- $oP->SetBreadCrumbEntry('ui-tool-auditerrors', $sTitle, '', '', 'fas fa-stethoscope', iTopWebPage::ENUM_BREADCRUMB_ENTRY_ICON_TYPE_CSS_CLASSES);
- $iCategory = utils::ReadParam('category', '');
- $iRuleIndex = utils::ReadParam('rule', 0);
-
- $oAuditCategory = MetaModel::GetObject('AuditCategory', $iCategory);
- $oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
- $oDefinitionFilter->UpdateContextFromUser();
- FilterByContext($oDefinitionFilter, $oAppContext);
- $oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
- $oFilter = GetRuleResultFilter($iRuleIndex, $oDefinitionFilter, $oAppContext);
- $oErrorObjectSet = new CMDBObjectSet($oFilter);
- $oAuditRule = MetaModel::GetObject('AuditRule', $iRuleIndex);
- $oBackButton = ButtonUIBlockFactory::MakeIconLink('fas fa-chevron-left', Dict::S('Back to audit results'), "./audit.php?".$oAppContext->GetForLink());
- $oP->AddUiBlock($oBackButton);
- $oP->AddUiBlock(new Title($sTitle . $oAuditRule->Get('description')));
- $sBlockId = 'audit_errors';
- $oP->p("");
- $oBlock = DisplayBlock::FromObjectSet($oErrorObjectSet, 'list', array('show_obsolete_data' => true));
- $oBlock->Display($oP, 1);
- $oP->p("
");
- $sExportUrl = utils::GetAbsoluteUrlAppRoot()."pages/audit.php?operation=csv&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey();
- $oP->add_ready_script("$('a[href*=\"pages/UI.php?operation=search\"]').attr('href', '".$sExportUrl."')");
- break;
+ $sTitle = Dict::S('UI:Audit:AuditErrors');
+ $oP->SetBreadCrumbEntry('ui-tool-auditerrors', $sTitle, '', '', 'fas fa-stethoscope', iTopWebPage::ENUM_BREADCRUMB_ENTRY_ICON_TYPE_CSS_CLASSES);
+ $iCategory = utils::ReadParam('category', '');
+ $iRuleIndex = utils::ReadParam('rule', 0);
+
+ $oAuditCategory = MetaModel::GetObject('AuditCategory', $iCategory);
+ $oDefinitionFilter = DBObjectSearch::FromOQL($oAuditCategory->Get('definition_set'));
+ $oDefinitionFilter->UpdateContextFromUser();
+ FilterByContext($oDefinitionFilter, $oAppContext);
+ $oDefinitionSet = new CMDBObjectSet($oDefinitionFilter);
+ $oFilter = GetRuleResultFilter($iRuleIndex, $oDefinitionFilter, $oAppContext);
+ $oErrorObjectSet = new CMDBObjectSet($oFilter);
+ $oAuditRule = MetaModel::GetObject('AuditRule', $iRuleIndex);
+ $oBackButton = ButtonUIBlockFactory::MakeIconLink('fas fa-chevron-left', Dict::S('Back to audit results'), "./audit.php?".$oAppContext->GetForLink());
+ $oP->AddUiBlock($oBackButton);
+ $oP->AddUiBlock(TitleUIBlockFactory::MakeForPage($sTitle.$oAuditRule->Get('description')));
+ $sBlockId = 'audit_errors';
+ $oP->p("");
+ $oBlock = DisplayBlock::FromObjectSet($oErrorObjectSet, 'list', array('show_obsolete_data' => true));
+ $oBlock->Display($oP, 1);
+ $oP->p("
");
+ $sExportUrl = utils::GetAbsoluteUrlAppRoot()."pages/audit.php?operation=csv&category=".$oAuditCategory->GetKey()."&rule=".$oAuditRule->GetKey();
+ $oP->add_ready_script("$('a[href*=\"pages/UI.php?operation=search\"]').attr('href', '".$sExportUrl."')");
+ break;
case 'audit':
default:
$oP->SetBreadCrumbEntry('ui-tool-audit', Dict::S('Menu:Audit'), Dict::S('UI:Audit:InteractiveAudit'), '', 'fas fa-stethoscope', iTopWebPage::ENUM_BREADCRUMB_ENTRY_ICON_TYPE_CSS_CLASSES);
- $oP->AddUiBlock(new Title(Dict::S('UI:Audit:InteractiveAudit')));
+ $oP->AddUiBlock(TitleUIBlockFactory::MakeForPage(Dict::S('UI:Audit:InteractiveAudit')));
$oTotalBlock = DashletFactory::MakeForDashletBadge('../images/icons/icons8-audit.svg', '#', 0, Dict::S('UI:Audit:Dashboard:ObjectsAudited'));
$oErrorBlock = DashletFactory::MakeForDashletBadge('../images/icons/icons8-delete.svg', '#', 0, Dict::S('UI:Audit:Dashboard:ObjectsInError'));
$oWorkingBlock = DashletFactory::MakeForDashletBadge('../images/icons/icons8-checkmark.svg', '#', 0, Dict::S('UI:Audit:Dashboard:ObjectsValidated'));
- $aCSSClasses = ['ibo-dashlet--is-inline','ibo-dashlet-badge'];
-
+ $aCSSClasses = ['ibo-dashlet--is-inline', 'ibo-dashlet-badge'];
+
$oDashletContainerTotal = new DashletContainer();
$oDashletContainerError = new DashletContainer();
$oDashletContainerWorking = new DashletContainer();
-
+
$oDashletContainerTotal->AddSubBlock($oTotalBlock)->AddCSSClasses($aCSSClasses);
$oDashletContainerError->AddSubBlock($oErrorBlock)->AddCSSClasses($aCSSClasses);
$oDashletContainerWorking->AddSubBlock($oWorkingBlock)->AddCSSClasses($aCSSClasses);
-
+
$oDashboardRow = new DashboardRow();
$oDashboardColumnTotal = new DashboardColumn(false, true);
diff --git a/pages/schema.php b/pages/schema.php
index 0edcd78fc..7cab5f10c 100644
--- a/pages/schema.php
+++ b/pages/schema.php
@@ -1,20 +1,7 @@
no_cache();
$oPage->SetBreadCrumbEntry('ui-tool-datamodel', Dict::S('Menu:DataModelMenu'), Dict::S('Menu:DataModelMenu+'), '',
'fas fa-book', iTopWebPage::ENUM_BREADCRUMB_ENTRY_ICON_TYPE_CSS_CLASSES);
-$oTitle = new Title(Dict::S('UI:Schema:Title'));
+$oTitle = TitleUIBlockFactory::MakeForPage(Dict::S('UI:Schema:Title'));
$oPage->AddUiBlock($oTitle);
$oLayout->AddSideHtml(" ");
DisplayClassesList($oPage, $oLayout, $sContext);
diff --git a/sources/application/UI/Base/Component/Text/Text.php b/sources/application/UI/Base/Component/Text/Text.php
new file mode 100644
index 000000000..cf7522551
--- /dev/null
+++ b/sources/application/UI/Base/Component/Text/Text.php
@@ -0,0 +1,46 @@
+sText = $sText;
+ parent::__construct($sId);
+ }
+
+
+ /**
+ * @return string
+ */
+ public function GetText(): string
+ {
+ return $this->sText;
+ }
+
+}
\ No newline at end of file
diff --git a/sources/application/UI/Base/Component/Title/Title.php b/sources/application/UI/Base/Component/Title/Title.php
index 7a51a7022..6c2f10566 100644
--- a/sources/application/UI/Base/Component/Title/Title.php
+++ b/sources/application/UI/Base/Component/Title/Title.php
@@ -1,5 +1,5 @@
sTitle = $sTitle;
$this->iLevel = $iLevel;
$this->sIconUrl = null;
$this->sIconCoverMethod = static::DEFAULT_ICON_COVER_METHOD;
$this->bIsMedallion = true;
- }
-
- /**
- * @return string
- */
- public function GetTitle(): string
- {
- return $this->sTitle;
+ $this->AddSubBlock($oTitle);
}
/**
diff --git a/sources/application/UI/Base/Component/Title/TitleUIBlockFactory.php b/sources/application/UI/Base/Component/Title/TitleUIBlockFactory.php
index 2ab363a4f..054869e06 100644
--- a/sources/application/UI/Base/Component/Title/TitleUIBlockFactory.php
+++ b/sources/application/UI/Base/Component/Title/TitleUIBlockFactory.php
@@ -1,5 +1,5 @@
SetIcon($sIconUrl, $sIconCoverMethod, $bIsMedallion);
return $oTitle;
@@ -33,6 +35,11 @@ class TitleUIBlockFactory extends AbstractUIBlockFactory
public static function MakeNeutral(string $sTitle, int $iLevel = 1, ?string $sId = null)
{
- return new Title($sTitle, $iLevel, $sId);
+ return new Title(new Text($sTitle), $iLevel, $sId);
+ }
+
+ public static function MakeStandard(UIBlock $oTitle, int $iLevel = 1, ?string $sId = null)
+ {
+ return new Title($oTitle, $iLevel, $sId);
}
}
\ No newline at end of file
diff --git a/templates/base/components/text/layout.html.twig b/templates/base/components/text/layout.html.twig
new file mode 100644
index 000000000..feeb0a29b
--- /dev/null
+++ b/templates/base/components/text/layout.html.twig
@@ -0,0 +1,5 @@
+{# @copyright Copyright (C) 2010-2021 Combodo SARL #}
+{# @license http://opensource.org/licenses/AGPL-3.0 #}
+{% apply spaceless %}
+ {{ oUIBlock.GetText() }}
+{% endapply %}
\ No newline at end of file
diff --git a/templates/base/components/title/layout.html.twig b/templates/base/components/title/layout.html.twig
index d32273d5c..bda12018d 100644
--- a/templates/base/components/title/layout.html.twig
+++ b/templates/base/components/title/layout.html.twig
@@ -8,7 +8,9 @@
{% block iboPageTitleText %}
- {{ oUIBlock.GetTitle() }}
+ {% for oSubBlock in oUIBlock.GetSubBlocks() %}
+ {{ render_block(oSubBlock, {aPage: aPage}) }}
+ {% endfor %}
{% endblock %}