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 %}