From b3a0c6119e43c9237695d8cdb226f44e97678d03 Mon Sep 17 00:00:00 2001 From: Guillaume Lajarige Date: Mon, 13 Mar 2017 14:06:43 +0000 Subject: [PATCH] =?UTF-8?q?N=C2=B0762:=20Portal:=20New=20filter=20brick=20?= =?UTF-8?q?that=20pre-filters=20a=20Browse=20or=20Manage=20brick=20results?= =?UTF-8?q?=20from=20the=20home=20page.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SVN:trunk[4575] --- .../cs.dict.itop-portal-base.php | 7 + .../de.dict.itop-portal-base.php | 7 + .../en.dict.itop-portal-base.php | 7 + .../es_cr.dict.itop-portal-base.php | 7 + .../fr.dict.itop-portal-base.php | 7 + .../managebrickcontroller.class.inc.php | 3 +- .../src/entities/filterbrick.class.inc.php | 179 ++++++++++++++++++ .../src/views/bricks/browse/layout.html.twig | 2 +- .../views/bricks/browse/mode_list.html.twig | 8 +- .../views/bricks/browse/mode_tree.html.twig | 2 +- .../src/views/bricks/filter/tile.html.twig | 37 ++++ .../src/views/bricks/manage/layout.html.twig | 30 ++- .../web/css/bootstrap-theme-combodo.css | 3 + .../web/css/bootstrap-theme-combodo.scss | 3 + .../portal/web/css/portal.css | 33 +++- .../portal/web/css/portal.scss | 34 +++- .../ru.dict.itop-portal-base.php | 7 + 17 files changed, 363 insertions(+), 13 deletions(-) create mode 100644 datamodels/2.x/itop-portal-base/portal/src/entities/filterbrick.class.inc.php create mode 100644 datamodels/2.x/itop-portal-base/portal/src/views/bricks/filter/tile.html.twig diff --git a/datamodels/2.x/itop-portal-base/cs.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/cs.dict.itop-portal-base.php index 333673ed44..e3d59b8663 100644 --- a/datamodels/2.x/itop-portal-base/cs.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/cs.dict.itop-portal-base.php @@ -121,3 +121,10 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array( 'Brick:Portal:Create:Name' => 'Rychlé vytvoření', 'Brick:Portal:Create:ChooseType' => 'Please, choose a type~~', )); + +// Filter brick +Dict::Add('CS CZ', 'Czech', 'Čeština', array( + 'Brick:Portal:Filter:Name' => 'Prefilter a brick~~', + 'Brick:Portal:Filter:SearchInput:Placeholder' => 'eg: install office~~', + 'Brick:Portal:Filter:SearchInput:Submit' => 'Search~~', +)); diff --git a/datamodels/2.x/itop-portal-base/de.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/de.dict.itop-portal-base.php index 09bdd0ffb9..1cb2a5e265 100644 --- a/datamodels/2.x/itop-portal-base/de.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/de.dict.itop-portal-base.php @@ -116,3 +116,10 @@ Dict::Add('DE DE', 'German', 'Deutsch', array( 'Brick:Portal:Create:Name' => 'Schnelles Erstellen', 'Brick:Portal:Create:ChooseType' => 'Please, choose a type~~', )); + +// Filter brick +Dict::Add('DE DE', 'German', 'Deutsch', array( + 'Brick:Portal:Filter:Name' => 'Prefilter a brick~~', + 'Brick:Portal:Filter:SearchInput:Placeholder' => 'eg: install office~~', + 'Brick:Portal:Filter:SearchInput:Submit' => 'Search~~', +)); diff --git a/datamodels/2.x/itop-portal-base/en.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/en.dict.itop-portal-base.php index 1d5bded2ae..08a122cf2b 100644 --- a/datamodels/2.x/itop-portal-base/en.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/en.dict.itop-portal-base.php @@ -117,3 +117,10 @@ Dict::Add('EN US', 'English', 'English', array( 'Brick:Portal:Create:Name' => 'Quick creation', 'Brick:Portal:Create:ChooseType' => 'Please, choose a type', )); + +// Filter brick +Dict::Add('EN US', 'English', 'English', array( + 'Brick:Portal:Filter:Name' => 'Prefilter a brick', + 'Brick:Portal:Filter:SearchInput:Placeholder' => 'eg: install office', + 'Brick:Portal:Filter:SearchInput:Submit' => 'Search', +)); diff --git a/datamodels/2.x/itop-portal-base/es_cr.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/es_cr.dict.itop-portal-base.php index b4b9d6996d..276b22efe9 100644 --- a/datamodels/2.x/itop-portal-base/es_cr.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/es_cr.dict.itop-portal-base.php @@ -117,3 +117,10 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array( 'Brick:Portal:Create:Name' => 'Creación rápida', 'Brick:Portal:Create:ChooseType' => 'Please, choose a type~~', )); + +// Filter brick +Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array( + 'Brick:Portal:Filter:Name' => 'Prefilter a brick~~', + 'Brick:Portal:Filter:SearchInput:Placeholder' => 'eg: install office~~', + 'Brick:Portal:Filter:SearchInput:Submit' => 'Search~~', +)); diff --git a/datamodels/2.x/itop-portal-base/fr.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/fr.dict.itop-portal-base.php index 533b60acc3..aca618400e 100644 --- a/datamodels/2.x/itop-portal-base/fr.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/fr.dict.itop-portal-base.php @@ -118,3 +118,10 @@ Dict::Add('FR FR', 'French', 'Français', array( 'Brick:Portal:Create:ChooseType' => 'Veuillez choisir le type', )); +// Filter brick +Dict::Add('FR FR', 'French', 'Français', array( + 'Brick:Portal:Filter:Name' => 'Préfiltre une brique', + 'Brick:Portal:Filter:SearchInput:Placeholder' => 'ex : installation office', + 'Brick:Portal:Filter:SearchInput:Submit' => 'Rechercher', +)); + 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 f180265f7d..a8afacc39a 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 @@ -57,7 +57,7 @@ class ManageBrickController extends BrickController $aQueries = array(); // Getting current dataloading mode (First from router parameter, then query parameter, then default brick value) - $sDataLoading = ($sDataLoading !== null) ? $sDataLoading : ( ($oRequest->query->get('sDataLoading') !== null) ? $oRequest->query->get('sDataLoading') : $oBrick->GetDataLoading() ); + $sDataLoading = ($sDataLoading !== null) ? $sDataLoading : ( ($oRequest->get('sDataLoading') !== null) ? $oRequest->get('sDataLoading') : $oBrick->GetDataLoading() ); // Getting search value $sSearchValue = $oRequest->get('sSearchValue', null); @@ -465,6 +465,7 @@ class ManageBrickController extends BrickController 'aGroupingAreasData' => $aGroupingAreasData, 'sDateFormat' => AttributeDate::GetFormat()->ToMomentJS(), 'sDateTimeFormat' => AttributeDateTime::GetFormat()->ToMomentJS(), + 'sSearchValue' => $sSearchValue, ); $oResponse = $oApp['twig']->render($oBrick->GetPageTemplatePath(), $aData); diff --git a/datamodels/2.x/itop-portal-base/portal/src/entities/filterbrick.class.inc.php b/datamodels/2.x/itop-portal-base/portal/src/entities/filterbrick.class.inc.php new file mode 100644 index 0000000000..87a60a9273 --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/src/entities/filterbrick.class.inc.php @@ -0,0 +1,179 @@ + + +namespace Combodo\iTop\Portal\Brick; + +use \Combodo\iTop\DesignElement; +use \Combodo\iTop\Portal\Brick\PortalBrick; +use \Combodo\iTop\Portal\Brick\BrowseBrick; + +/** + * Description of FilterBrick + * + * @author Guillaume Lajarige + */ +class FilterBrick extends PortalBrick +{ + const DEFAULT_VISIBLE_NAVIGATION_MENU = false; + const DEFAULT_TILE_TEMPLATE_PATH = 'itop-portal-base/portal/src/views/bricks/filter/tile.html.twig'; + const DEFAULT_TARGET_BRICK_CLASS = 'Combodo\\iTop\\Portal\\Brick\\BrowseBrick'; + const DEFAULT_SEARCH_PLACEHOLDER_VALUE = 'Brick:Portal:Filter:SearchInput:Placeholder'; + const DEFAULT_SEARCH_SUBMIT_LABEL = 'Brick:Portal:Filter:SearchInput:Submit'; + const DEFAULT_SEARCH_SUBMIT_CLASS = ''; + + protected $sTargetBrickId; + protected $sTargetBrickClass; + protected $sTargetBrickTab; + protected $sSearchPlaceholderValue; + protected $sSearchSubmitLabel; + protected $sSearchSubmitClass; + + public function __construct() + { + parent::__construct(); + + $this->sTargetBrickClass = static::DEFAULT_TARGET_BRICK_CLASS; + $this->sSearchPlaceholderValue = static::DEFAULT_SEARCH_PLACEHOLDER_VALUE; + $this->sSearchSubmitLabel = static::DEFAULT_SEARCH_SUBMIT_LABEL; + $this->sSearchSubmitClass = static::DEFAULT_SEARCH_SUBMIT_CLASS; + } + + public function GetTargetBrickId() + { + return $this->sTargetBrickId; + } + + public function GetTargetBrickClass() + { + return $this->sTargetBrickClass; + } + + public function GetTargetBrickTab() + { + return $this->sTargetBrickTab; + } + + public function GetSearchPlaceholderValue() + { + return $this->sSearchPlaceholderValue; + } + + public function GetSearchSubmitLabel() + { + return $this->sSearchSubmitLabel; + } + + public function GetSearchSubmitClass() + { + return $this->sSearchSubmitClass; + } + + public function SetTargetBrickId($sTargetBrickId) + { + $this->sTargetBrickId = $sTargetBrickId; + return $this; + } + + public function SetTargetBrickClass($sTargetBrickClass) + { + $this->sTargetBrickClass = $sTargetBrickClass; + } + + public function SetTargetBrickTab($sTargetBrickTab) + { + $this->sTargetBrickTab = $sTargetBrickTab; + return $this; + } + + public function SetSearchPlaceholderValue($sSearchPlaceholderValue) + { + $this->sSearchPlaceholderValue = $sSearchPlaceholderValue; + return $this; + } + + public function SetSearchSubmitLabel($sSearchSubmitLabel) + { + $this->sSearchSubmitLabel = $sSearchSubmitLabel; + return $this; + } + + public function SetSearchSubmitClass($sSearchSubmitClass) + { + $this->sSearchSubmitClass = $sSearchSubmitClass; + return $this; + } + + /** + * Load the brick's data from the xml passed as a ModuleDesignElement. + * This is used to set all the brick attributes at once. + * + * @param \Combodo\iTop\DesignElement $oMDElement + * @return BrowseBrick + * @throws DOMFormatException + */ + public function LoadFromXml(DesignElement $oMDElement) + { + parent::LoadFromXml($oMDElement); + + // Checking specific elements + foreach ($oMDElement->GetNodes('./*') as $oBrickSubNode) + { + switch ($oBrickSubNode->nodeName) + { + case 'target_brick': + foreach ($oBrickSubNode->childNodes as $oTargetBrickNode) + { + switch ($oTargetBrickNode->nodeName) + { + case 'id': + $this->SetTargetBrickId($oTargetBrickNode->GetText()); + break; + case 'type': + $this->SetTargetBrickClass($oTargetBrickNode->GetText()); + break; + case 'tab': + $this->SetTargetBrickTab($oTargetBrickNode->GetText()); + break; + } + } + break; + case 'search_placeholder_value': + $this->SetSearchPlaceholderValue($oBrickSubNode->GetText(static::DEFAULT_SEARCH_PLACEHOLDER_VALUE)); + break; + case 'search_submit_label': + $this->SetSearchSubmitLabel($oBrickSubNode->GetText(static::DEFAULT_SEARCH_SUBMIT_LABEL)); + break; + case 'search_submit_class': + $this->SetSearchSubmitClass($oBrickSubNode->GetText(static::DEFAULT_SEARCH_SUBMIT_CLASS)); + break; + } + } + + // Checking that the brick has at least a target brick id + if (($this->GetTargetBrickId() === null) || ($this->GetTargetBrickId() === '')) + { + throw new DOMFormatException('FilterBrick : Must have a target brick id', null, null, $oMDElement); + } + + return $this; + } + +} + +?> \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/layout.html.twig index 59c2d1970b..9316b23b74 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/layout.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/layout.html.twig @@ -19,7 +19,7 @@ {% endblock %} {% block pMainContentHolder%} - {% if iItemsCount > 0 %} + {% if iItemsCount > 0 or sSearchValue is not null %}
{% block bBrowseMainContent %} {% endblock %} diff --git a/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/mode_list.html.twig b/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/mode_list.html.twig index 279dc62b30..e5e9568008 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/mode_list.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/mode_list.html.twig @@ -24,9 +24,9 @@ var aKeyTimeoutFilteredKeys = [16, 17, 18, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40]; // Shift, Ctrl, Alt, Pause, Esc, Page Up/Down, Home, End, Left/Up/Right/Down arrows // Show a loader inside the table - var showTableLoader = function() + var showTableLoader = function(oElem) { - $('#brick-content-table > tbody').html('' + $('#page_overlay').html() + ''); + oElem.children('tbody').html('' + $('#page_overlay').html() + ''); }; // Columns definition for the table from the oLevelsProperties var getColumnsDefinition = function() @@ -210,7 +210,7 @@ $(document).ready(function() { - showTableLoader(); + showTableLoader($('#brick-content-table')); // Note : Those options should be externalized in an library so we can use them on any DataTables for the portal. // We would just have to override / complete the necessary elements @@ -301,7 +301,7 @@ $('#brick-content-table').on('processing.dt', function(event, settings, processing){ if(processing === true) { - showTableLoader(); + showTableLoader($(this)); } }); diff --git a/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/mode_tree.html.twig b/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/mode_tree.html.twig index ba4fc8b14b..2318413f82 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/mode_tree.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/src/views/bricks/browse/mode_tree.html.twig @@ -28,7 +28,7 @@
-