diff --git a/datamodels/2.x/itop-portal-base/portal/src/controllers/managebrickcontroller.class.inc.php b/datamodels/2.x/itop-portal-base/portal/src/controllers/managebrickcontroller.class.inc.php index a3d47ace6..bc6daf854 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/controllers/managebrickcontroller.class.inc.php +++ b/datamodels/2.x/itop-portal-base/portal/src/controllers/managebrickcontroller.class.inc.php @@ -140,7 +140,7 @@ class ManageBrickController extends BrickController 'value' => $aDistinctResult['grouped_by_1'], 'label' => strip_tags($oFieldExp->MakeValueLabel($oDistinctQuery, $aDistinctResult['grouped_by_1'], '')), 'condition' => $oConditionQuery, - 'count' => $aDistinctResult['_itop_count_'] + 'count' => $aDistinctResult['_itop_count_'], ); unset($oConditionQuery); } @@ -152,7 +152,7 @@ class ManageBrickController extends BrickController 'value' => 'undefined', 'label' => '', 'condition' => null, - 'count' => null + 'count' => null, ); } } @@ -161,11 +161,14 @@ class ManageBrickController extends BrickController { foreach ($aGroupingTabs['groups'] as $aGroup) { + $oConditionQuery = DBSearch::FromOQL($aGroup['condition']); + $oConditionSet = new DBObjectSet($oConditionQuery); + $aGroupingTabsValues[$aGroup['id']] = array( 'value' => $aGroup['id'], 'label' => Dict::S($aGroup['title']), - 'condition' => DBSearch::FromOQL($aGroup['condition']), - 'count' => null + 'condition' => $oConditionQuery, + 'count' => $oConditionSet->Count(), ); } } diff --git a/datamodels/2.x/itop-portal-base/portal/src/entities/managebrick.class.inc.php b/datamodels/2.x/itop-portal-base/portal/src/entities/managebrick.class.inc.php index ea0d95d60..14a4dc0f3 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/entities/managebrick.class.inc.php +++ b/datamodels/2.x/itop-portal-base/portal/src/entities/managebrick.class.inc.php @@ -42,12 +42,14 @@ class ManageBrick extends PortalBrick const DEFAULT_DATA_LOADING = self::ENUM_DATA_LOADING_LAZY; const DEFAULT_COUNT_PER_PAGE_LIST = 20; const DEFAULT_ZLIST_FIELDS = 'list'; + const DEFAULT_SHOW_TAB_COUNTS = false; static $sRouteName = 'p_manage_brick'; protected $sOql; protected $sOpeningMode; protected $aGrouping; protected $aFields; + protected $bShowTabCounts; public function __construct() { @@ -57,6 +59,7 @@ class ManageBrick extends PortalBrick $this->sOpeningMode = static::DEFAULT_OPENING_MODE; $this->aGrouping = array(); $this->aFields = array(); + $this->bShowTabCounts = static::DEFAULT_SHOW_TAB_COUNTS; // This is hardcoded for now, we might allow area grouping on another attribute in the futur $this->AddGrouping('areas', array('attribute' => 'finalclass')); @@ -102,6 +105,16 @@ class ManageBrick extends PortalBrick return $this->aFields; } + /** + * Returns if the brick should display objects count on tabs + * + * @return bool + */ + public function GetShowTabCounts() + { + return $this->bShowTabCounts; + } + /** * Sets the oql of the brick * @@ -148,6 +161,18 @@ class ManageBrick extends PortalBrick return $this; } + /** + * Sets if the brick should display objects count on tab + * + * @param bool $bShowTabCounts + * @return \Combodo\iTop\Portal\Brick\ManageBrick + */ + public function SetShowTabCounts($bShowTabCounts) + { + $this->bShowTabCounts = $bShowTabCounts; + return $this; + } + /** * Adds a grouping. * @@ -356,6 +381,10 @@ class ManageBrick extends PortalBrick { switch ($oGroupingNode->nodeName) { + case 'show_tab_counts'; + $bShowTabCounts = ( $oGroupingNode->GetText(static::DEFAULT_SHOW_TAB_COUNTS) === 'true' ) ? true : false; + $this->SetShowTabCounts($bShowTabCounts); + break; case 'attribute': $sAttribute = $oGroupingNode->GetText(); if ($sAttribute !== '') diff --git a/datamodels/2.x/itop-portal-base/portal/src/views/bricks/manage/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/src/views/bricks/manage/layout.html.twig index 6d3a7976d..a81060781 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/views/bricks/manage/layout.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/src/views/bricks/manage/layout.html.twig @@ -12,7 +12,12 @@ {% if aGroupingTabsValues|length > 1 %}
{% for aGroupingTab in aGroupingTabsValues %} - {{ aGroupingTab.label|raw }} + + {{ aGroupingTab.label|raw }} + {% if oBrick.GetShowTabCounts() %} + {{ aGroupingTab.count|raw }} + {% endif %} + {% endfor %}
{% endif %} diff --git a/datamodels/2.x/itop-portal-base/portal/web/css/bootstrap-theme-combodo.css b/datamodels/2.x/itop-portal-base/portal/web/css/bootstrap-theme-combodo.css index df015a3c2..447bdb1f7 100644 --- a/datamodels/2.x/itop-portal-base/portal/web/css/bootstrap-theme-combodo.css +++ b/datamodels/2.x/itop-portal-base/portal/web/css/bootstrap-theme-combodo.css @@ -4928,6 +4928,13 @@ label { border-radius: 37px !important; box-shadow: -1px 1px 2px rgba(0, 0, 0, 0.4); } +.btn-group.btn_group_explicit .btn .btn_tab_count:before { + content: "("; + margin-left: 2px; +} +.btn-group.btn_group_explicit .btn .btn_tab_count:after { + content: ")"; +} /* Help blocks in forms */ .form_fields .form-group .help-block { margin-top: 0px; diff --git a/datamodels/2.x/itop-portal-base/portal/web/css/bootstrap-theme-combodo.scss b/datamodels/2.x/itop-portal-base/portal/web/css/bootstrap-theme-combodo.scss index bb8629d9c..935aa1617 100644 --- a/datamodels/2.x/itop-portal-base/portal/web/css/bootstrap-theme-combodo.scss +++ b/datamodels/2.x/itop-portal-base/portal/web/css/bootstrap-theme-combodo.scss @@ -5998,18 +5998,28 @@ label { background-color: $combodo-dark-gray-darker; border: 1px solid #EBEAEA; border-radius: 30px; - box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.4) inset; -} -.btn-group.btn_group_explicit .btn{ - color: $white; - background-color: transparent; - border: none; -} -.btn-group.btn_group_explicit .btn.active{ - color: #6B6965; - background-color: $body-bg; - border-radius: 37px !important; - box-shadow: -1px 1px 2px rgba(0, 0, 0, 0.4); + box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.4) inset; + + .btn{ + color: $white; + background-color: transparent; + border: none; + + &.active{ + color: #6B6965; + background-color: $body-bg; + border-radius: 37px !important; + box-shadow: -1px 1px 2px rgba(0, 0, 0, 0.4); + } + + .btn_tab_count:before{ + content: "("; + margin-left: 2px; + } + .btn_tab_count:after{ + content: ")"; + } + } } /* Help blocks in forms */ .form_fields .form-group .help-block{ diff --git a/datamodels/2.x/itop-tickets/datamodel.itop-tickets.xml b/datamodels/2.x/itop-tickets/datamodel.itop-tickets.xml index 39fda9e03..9089e3ca1 100755 --- a/datamodels/2.x/itop-tickets/datamodel.itop-tickets.xml +++ b/datamodels/2.x/itop-tickets/datamodel.itop-tickets.xml @@ -1163,6 +1163,8 @@ + + @@ -1214,6 +1216,8 @@ + + 1