diff --git a/application/displayblock.class.inc.php b/application/displayblock.class.inc.php index 2423858b4..cadcbf76a 100644 --- a/application/displayblock.class.inc.php +++ b/application/displayblock.class.inc.php @@ -224,9 +224,10 @@ class DisplayBlock $oPage->AddUiBlock($this->GetDisplay($oPage, $sId, $aExtraParams)); } - public function GetDisplay(WebPage $oPage, $sId, $aExtraParams = array()): iUIBlock + public function GetDisplay(WebPage $oPage, $sId, $aExtraParams = array()): UIContentBlock { - $oHtml = new UIContentBlock(); + $oHtml = new UIContentBlock($sId); + $oHtml->AddCSSClasses("display_block"); $aExtraParams = array_merge($aExtraParams, $this->m_aParams); $aExtraParams['currentId'] = $sId; $sExtraParams = addslashes(str_replace('"', "'", json_encode($aExtraParams))); // JSON encode, change the style of the quotes and escape them @@ -262,7 +263,7 @@ HTML; } } else { // render it as an Ajax (asynchronous) call - $oHtml->AddCSSClasses("display_block loading"); + $oHtml->AddCSSClasses("loading"); $oHtml->AddHtml("

".Dict::S('UI:Loading').'

'); $oPage->add_script(' $.post("ajax.render.php?style='.$this->m_sStyle.'", @@ -431,7 +432,7 @@ HTML; switch($this->m_sStyle) { case 'count': - $oBlock = $this->RenderCount($aExtraParams, $sId); + $oBlock = $this->RenderCount($aExtraParams); break; case 'join': @@ -459,11 +460,11 @@ HTML; break; case 'csv': - $oBlock = $this->RenderCsv($oAppContext, $sId); + $oBlock = $this->RenderCsv($oAppContext); break; case 'search': - $oBlock = $this->RenderSearch($oPage, $sId, $aExtraParams); + $oBlock = $this->RenderSearch($oPage, $aExtraParams); break; case 'chart': @@ -871,7 +872,6 @@ JS /** * @param array $aExtraParams - * @param string|null $sId * * @return \Combodo\iTop\Application\UI\Base\iUIBlock * @throws \ArchivedObjectException @@ -881,7 +881,7 @@ JS * @throws \MySQLHasGoneAwayException * @throws \Exception */ - protected function RenderCount(array $aExtraParams, ?string $sId): iUIBlock + protected function RenderCount(array $aExtraParams): iUIBlock { if (isset($aExtraParams['group_by'])) { $this->MakeGroupByQuery($aExtraParams, $oGroupByExp, $sGroupByLabel, $aGroupBy, $sAggregationFunction, $sFctVar, $sAggregationAttr, $sSql); @@ -946,17 +946,15 @@ JS /** * @param \WebPage $oPage - * @param string|null $sId * @param array $aExtraParams * * @return \Combodo\iTop\Application\UI\Base\iUIBlock */ - protected function RenderSearch(WebPage $oPage, ?string $sId, array $aExtraParams): iUIBlock + protected function RenderSearch(WebPage $oPage, array $aExtraParams): iUIBlock { $oBlock = null; if (!$oPage->IsPrintableVersion()) { - $aExtraParams['currentId'] = $sId; $oSearchForm = new SearchForm(); $oBlock = $oSearchForm->GetSearchFormUIBlock($oPage, $this->m_oSet, $aExtraParams); } @@ -1216,7 +1214,7 @@ JS } /** - * @param string|null $sId + * @param string|null $sChartId * @param array $aQueryParams * * @param array $aExtraParams @@ -1225,7 +1223,7 @@ JS * @throws \ArchivedObjectException * @throws \CoreException */ - protected function RenderChart(?string $sId, array $aQueryParams, array $aExtraParams) + protected function RenderChart(?string $sChartId, array $aQueryParams, array $aExtraParams) { static $iChartCounter = 0; $iChartCounter++; @@ -1233,7 +1231,7 @@ JS $oBlock = new BlockChart(); $oBlock->iChartCounter = $iChartCounter; - $oBlock->sId = $sId; + $oBlock->sChartId = $sChartId; $sChartType = isset($aExtraParams['chart_type']) ? $aExtraParams['chart_type'] : 'pie'; $sGroupBy = isset($aExtraParams['group_by']) ? $aExtraParams['group_by'] : ''; @@ -1248,9 +1246,9 @@ JS $sOrderDirection = isset($aExtraParams['order_direction']) ? $aExtraParams['order_direction'] : ''; if (isset($aExtraParams['group_by_label'])) { - $sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart¶ms[group_by]=$sGroupBy{$sGroupByExpr}¶ms[group_by_label]={$aExtraParams['group_by_label']}¶ms[chart_type]=$sChartType¶ms[currentId]=$sId{$iChartCounter}¶ms[order_direction]=$sOrderDirection¶ms[order_by]=$sOrderBy¶ms[limit]=$sLimit¶ms[aggregation_function]=$sAggregationFunction¶ms[aggregation_attribute]=$sAggregationAttr&id=$sId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam; + $sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart¶ms[group_by]=$sGroupBy{$sGroupByExpr}¶ms[group_by_label]={$aExtraParams['group_by_label']}¶ms[chart_type]=$sChartType¶ms[currentId]=$sChartId{$iChartCounter}¶ms[order_direction]=$sOrderDirection¶ms[order_by]=$sOrderBy¶ms[limit]=$sLimit¶ms[aggregation_function]=$sAggregationFunction¶ms[aggregation_attribute]=$sAggregationAttr&id=$sChartId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam; } else { - $sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart¶ms[group_by]=$sGroupBy{$sGroupByExpr}¶ms[chart_type]=$sChartType¶ms[currentId]=$sId{$iChartCounter}¶ms[order_direction]=$sOrderDirection¶ms[order_by]=$sOrderBy¶ms[limit]=$sLimit¶ms[aggregation_function]=$sAggregationFunction¶ms[aggregation_attribute]=$sAggregationAttr&id=$sId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam; + $sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart¶ms[group_by]=$sGroupBy{$sGroupByExpr}¶ms[chart_type]=$sChartType¶ms[currentId]=$sChartId{$iChartCounter}¶ms[order_direction]=$sOrderDirection¶ms[order_by]=$sOrderBy¶ms[limit]=$sLimit¶ms[aggregation_function]=$sAggregationFunction¶ms[aggregation_attribute]=$sAggregationAttr&id=$sChartId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam; } $oBlock->sUrl = $sUrl; @@ -1330,15 +1328,14 @@ JS /** * @param \ApplicationContext $oAppContext - * @param string|null $sId * * @return iUIBlock * @throws \ArchivedObjectException * @throws \CoreException */ - protected function RenderCsv(ApplicationContext $oAppContext, string $sId = null) + protected function RenderCsv(ApplicationContext $oAppContext) { - $oBlock = new BlockCsv($sId); + $oBlock = new BlockCsv(); $oBlock->bAdvancedMode = utils::ReadParam('advanced', false); $oBlock->sCsvFile = strtolower($this->m_oFilter->GetClass()).'.csv'; @@ -1353,7 +1350,7 @@ JS ); if ($oBlock->bAdvancedMode) { $oBlock->sDownloadLink .= '&fields_advanced=1'; - $aParamsToPost['fields_advance'] = 1; + $aParamsToPost['fields_advanced'] = 1; $oBlock->sChecked = 'CHECKED'; } else { $oBlock->sLinkToToggle = $oBlock->sLinkToToggle.'&advanced=1'; diff --git a/application/menunode.class.inc.php b/application/menunode.class.inc.php index 65eb515d4..6bb56bc53 100644 --- a/application/menunode.class.inc.php +++ b/application/menunode.class.inc.php @@ -1130,7 +1130,7 @@ class OQLMenuNode extends MenuNode } //$oPage->add("

$sIcon ".utils::HtmlEntities(Dict::S($sTitle))."

"); - $oPage->add("
"); + $oPage->add("
"); $oTitle = TitleFactory::MakeForPage($sTitle); $oPage->AddUiBlock($oTitle); diff --git a/css/backoffice/application/_all.scss b/css/backoffice/application/_all.scss new file mode 100644 index 000000000..2b1c120e8 --- /dev/null +++ b/css/backoffice/application/_all.scss @@ -0,0 +1,4 @@ +/*! + * copyright Copyright (C) 2010-2020 Combodo SARL + * license http://opensource.org/licenses/AGPL-3.0 + */ diff --git a/css/backoffice/components/_datatable.scss b/css/backoffice/components/_datatable.scss index 7b50a54de..a85a340ad 100644 --- a/css/backoffice/components/_datatable.scss +++ b/css/backoffice/components/_datatable.scss @@ -172,4 +172,9 @@ $ibo-datatable-panel--body--padding: $ibo-panel--body--padding-top 0px $ibo-pane } .ibo-datatable-panel > .ibo-panel--body { padding: $ibo-datatable-panel--body--padding; +} + +// For cancel / OK / next... selection validation buttons +.ibo-datatable--selection-validation-buttons-toolbar { + clear: both; } \ No newline at end of file diff --git a/css/backoffice/main.scss b/css/backoffice/main.scss index 8fc3d7238..b24de003a 100644 --- a/css/backoffice/main.scss +++ b/css/backoffice/main.scss @@ -22,4 +22,5 @@ @import "components/all"; @import "layout/all"; @import "pages/all"; +@import "application/all"; @import "themes/all"; diff --git a/js/dataTables.main.js b/js/dataTables.main.js new file mode 100644 index 000000000..21f660af9 --- /dev/null +++ b/js/dataTables.main.js @@ -0,0 +1,44 @@ +function checkAllDataTable(tableId, value, listId) { + let tableSelector = $('#'+tableId); + // Set the 'selectionMode' for the future objects to load + let selectionMode = 'positive'; + if (value) { + selectionMode = 'negative'; + } + window['oSelectedItems' + listId] = []; + updateDataTableSelection(listId); + // Mark all the displayed items as check or unchecked depending on the value + tableSelector.find(':checkbox[name^=selectObj]:not([disabled])').each(function () { + let currentCheckbox = $(this); + currentCheckbox.prop('checked', value); + let currentLine = currentCheckbox.closest("tr"); + (value) ? currentLine.addClass("selected") : currentLine.removeClass("selected"); + }); + + tableSelector.parent().parent().find(':input[name=selectionMode]').val(selectionMode); + // Reset the list of saved selection... + $(':input[name^=storedSelection]').remove(); + tableSelector.parent().find(':checkbox[name^=selectObj]').trigger("change"); + + if (value) { + tableSelector.DataTable().rows().select(); + $('#btn_ok_'+tableId).prop('disabled', false); + } else { + tableSelector.DataTable().rows({page: 'current'}).deselect(); + $('#btn_ok_'+tableId).prop('disabled', true); + } + + return true; +} + +function updateDataTableSelection(listId) { + let selectionContainer = $('#'+listId+' [data-target="ibo-datatable--selection"]'); + let selectionCount = $('#'+listId+' [name="selectionCount"]'); + selectionContainer.html(''); + let currentSelection = window['oSelectedItems'+listId]; + for(let i in currentSelection) { + let value = currentSelection[i]; + selectionContainer.append(''); + } + selectionCount.val(currentSelection.length); +} \ No newline at end of file diff --git a/js/linkswidget.js b/js/linkswidget.js index 791007a8a..0eb82ad57 100644 --- a/js/linkswidget.js +++ b/js/linkswidget.js @@ -208,7 +208,6 @@ function LinksWidget(id, sClass, sAttCode, iInputId, sSuffix, bDuplicates, oWizH theMap[this.name].push(this.value); $(this).remove(); // Remove the selection for the next time the dialog re-opens }); - theMap["storedSelection[]"] = eval("oSelectedItemsResultsToAdd_" + me.id); // Retrieve the 'filter' definition theMap['filter'] = $(':input[name=filter]', context).val(); diff --git a/js/search/search_form_handler.js b/js/search/search_form_handler.js index 34088930c..ea163789d 100644 --- a/js/search/search_form_handler.js +++ b/js/search/search_form_handler.js @@ -752,11 +752,9 @@ $(function() } else { - oResultAreaElem = $('
').insertAfter(this.element.closest('.display_block')); + oResultAreaElem = $('
').insertAfter(this.element.closest('.display_block')); } } - //oResultAreaElem.addClass('display_block sf_results_area'); - // Make placeholder if nothing yet if(oResultAreaElem.html() === '') { diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 13385dd7d..16bc152a3 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -162,7 +162,7 @@ return array( 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletContainer' => $baseDir . '/sources/application/UI/Base/Component/Dashlet/DashletContainer.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletFactory' => $baseDir . '/sources/application/UI/Base/Component/Dashlet/DashletFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletHeaderStatic' => $baseDir . '/sources/application/UI/Base/Component/Dashlet/DashletHeaderStatic.php', - 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableBlock' => $baseDir . '/sources/application/UI/Base/Component/DataTable/DataTable.php', + 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTable' => $baseDir . '/sources/application/UI/Base/Component/DataTable/DataTable.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableFactory' => $baseDir . '/sources/application/UI/Base/Component/DataTable/DataTableFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableSettings' => $baseDir . '/sources/application/UI/Base/Component/DataTable/DataTableSettings.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\FormTableRow\\FormTableRow' => $baseDir . '/sources/application/UI/Base/Component/DataTable/StaticTable/FormTableRow/FormTableRow.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index f558d7b9f..6a78e4963 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -392,7 +392,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletContainer' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Dashlet/DashletContainer.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Dashlet/DashletFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\Dashlet\\DashletHeaderStatic' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/Dashlet/DashletHeaderStatic.php', - 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableBlock' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/DataTable.php', + 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTable' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/DataTable.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableFactory' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/DataTableFactory.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\DataTableSettings' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/DataTableSettings.php', 'Combodo\\iTop\\Application\\UI\\Base\\Component\\DataTable\\StaticTable\\FormTableRow\\FormTableRow' => __DIR__ . '/../..' . '/sources/application/UI/Base/Component/DataTable/StaticTable/FormTableRow/FormTableRow.php', diff --git a/pages/UI.php b/pages/UI.php index 5b276118e..b7bd256ef 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -249,6 +249,7 @@ function DisplaySearchSet($oP, $oFilter, $bSearchForm = true, $sBaseClass = '', //add result block $oUIBlock = $oBlock->GetDisplay($oP, $sTableId); $oUIBlock->AddCSSClasses("display_block sf_results_area"); + $oUIBlock->AddDataAttribute('target', 'search_results'); //$oUIBlockForm->AddSubBlock($oUIBlock); $oP->AddUiBlock($oUIBlockForm); $oP->AddUiBlock($oUIBlock); diff --git a/pages/preferences.php b/pages/preferences.php index c24e527ed..79b1dcbf6 100644 --- a/pages/preferences.php +++ b/pages/preferences.php @@ -24,6 +24,7 @@ use Combodo\iTop\Application\UI\Base\Component\Input\InputFactory; use Combodo\iTop\Application\UI\Base\Component\Panel\Panel; use Combodo\iTop\Application\UI\Base\Component\Title\TitleFactory; use Combodo\iTop\Application\UI\Base\Layout\PageContent\PageContentFactory; +use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock; require_once('../approot.inc.php'); require_once(APPROOT.'/application/application.inc.php'); @@ -122,30 +123,32 @@ EOF ////////////////////////////////////////////////////////////////////////// $oFavoriteOrganizationsBlock = new Panel(Dict::S('UI:FavoriteOrganizations'), array(), 'grey', 'ibo-favorite-organizations'); - $oFavoriteOrganizationsBlock->AddHtml(Dict::S('UI:FavoriteOrganizations+')); - $oFavoriteOrganizationsBlock->AddHtml('
'); + $oFavoriteOrganizationsForm = new Form(); + $oFavoriteOrganizationsBlock->AddSubBlock($oFavoriteOrganizationsForm); // Favorite organizations: the organizations listed in the drop-down menu $sOQL = ApplicationMenu::GetFavoriteSiloQuery(); $oFilter = DBObjectSearch::FromOQL($sOQL); $oBlock = new DisplayBlock($oFilter, 'list', false); - $oFavoriteOrganizationsBlock->AddSubBlock($oBlock->GetDisplay($oP, 1, array( + $oFavoriteOrganizationsForm->AddSubBlock($oBlock->GetDisplay($oP, 1, [ 'menu' => false, 'selection_mode' => true, 'selection_type' => 'multiple', 'cssCount' => '.selectedCount', 'table_id' => 'user_prefs', - ))); - $oFavoriteOrganizationsBlock->AddSubBlock($oAppContext->GetForFormBlock()); + 'surround_with_panel' => false, + ])); + $oFavoriteOrganizationsForm->AddSubBlock($oAppContext->GetForFormBlock()); + $oFavoriteOrganizationsToolBar = new UIContentBlock(null, 'ibo-datatable--selection-validation-buttons-toolbar'); + $oFavoriteOrganizationsForm->AddSubBlock($oFavoriteOrganizationsToolBar); // - Cancel button $oFavoriteOrganizationsCancelButton = ButtonFactory::MakeForSecondaryAction(Dict::S('UI:Button:Cancel')); + $oFavoriteOrganizationsToolBar->AddSubBlock($oFavoriteOrganizationsCancelButton); $oFavoriteOrganizationsCancelButton->SetOnClickJsCode("window.location.href = '$sURL'"); // - Submit button $oFavoriteOrganizationsSubmitButton = ButtonFactory::MakeForPrimaryAction(Dict::S('UI:Button:Apply'), 'operation', 'apply', true); - - $sFavoriteOrganizationsEndHtml = '
'; - $oFavoriteOrganizationsEndHtmlBlock = new Html($sFavoriteOrganizationsEndHtml); + $oFavoriteOrganizationsToolBar->AddSubBlock($oFavoriteOrganizationsSubmitButton); $aFavoriteOrgs = appUserPreferences::GetPref('favorite_orgs', null); if ($aFavoriteOrgs == null) @@ -153,17 +156,8 @@ EOF // All checked $oP->add_ready_script( << 0) - { - // paginated display, restore the selection - var pager = $('#user_prefs form .pager'); - $(':input[name=selectionMode]', pager).val('negative'); - $('#user_prefs table.listResults').trigger('load_selection'); - } - else - { - $('#user_prefs table.listResults').trigger('check_all'); - } + $('#1 .checkAll').prop('checked', true); + checkAllDataTable('datatable_1',true,'1'); EOF ); @@ -201,10 +195,6 @@ EOF ); } - $oFavoriteOrganizationsBlock->AddSubBlock($oFavoriteOrganizationsCancelButton); - $oFavoriteOrganizationsBlock->AddSubBlock($oFavoriteOrganizationsSubmitButton); - $oFavoriteOrganizationsBlock->AddSubBlock($oFavoriteOrganizationsEndHtmlBlock); - $oContentLayout->AddMainBlock($oFavoriteOrganizationsBlock); ////////////////////////////////////////////////////////////////////////// @@ -217,9 +207,17 @@ EOF $oBMSearch = new DBObjectSearch('Shortcut'); $oBMSearch->AddCondition('user_id', UserRights::GetUserId(), '='); - $aExtraParams = array(); - $oBlock = new DisplayBlock($oBMSearch, 'list', false, $aExtraParams); - $oShortcutsBlock->AddSubBlock($oBlock->GetDisplay($oP, 'shortcut_list', array('view_link' => false, 'menu' => false, 'toolkit_menu' => false, 'selection_mode' => true, 'selection_type' => 'multiple', 'cssCount' => '#shortcut_selection_count', 'table_id' => 'user_prefs_shortcuts'))); + $oBlock = new DisplayBlock($oBMSearch, 'list', false); + $oShortcutsBlock->AddSubBlock($oBlock->GetDisplay($oP, 'shortcut_list', [ + 'view_link' => false, + 'menu' => false, + 'toolkit_menu' => false, + 'selection_mode' => true, + 'selection_type' => 'multiple', + 'cssCount' => '#shortcut_selection_count', + 'table_id' => 'user_prefs_shortcuts', + 'surround_with_panel' => false, + ])); $sShortcutsHtml = '

'; $oSet = new DBObjectSet($oBMSearch); @@ -282,7 +280,7 @@ function OnSelectionCountChange() var oUpperCheckBox = $('#datatable_shortcut_list .checkAll').first(); oUpperCheckBox.parent().width(oUpperCheckBox.width() + 2); -$('#datatable_shortcut_list').append('   $sButtons'); +$('#shortcut_list').append('   $sButtons'); $('#shortcut_selection_count').bind('change', OnSelectionCountChange); $('#shortcut_btn_rename').bind('click', OnShortcutBtnRename); $('#shortcut_btn_delete').bind('click', OnShortcutBtnDelete); diff --git a/sources/application/UI/Base/Component/Button/Button.php b/sources/application/UI/Base/Component/Button/Button.php index 51dd043a5..29cfcfe16 100644 --- a/sources/application/UI/Base/Component/Button/Button.php +++ b/sources/application/UI/Base/Component/Button/Button.php @@ -118,6 +118,8 @@ class Button extends UIBlock string $sActionType = self::DEFAULT_ACTION_TYPE, string $sColor = self::DEFAULT_COLOR, string $sJsCode = '', string $sOnClickJsCode = '' ) { + parent::__construct($sId); + $this->sLabel = $sLabel; $this->sName = $sName; $this->sValue = $sValue; @@ -130,8 +132,7 @@ class Button extends UIBlock $this->sOnClickJsCode = $sOnClickJsCode; $this->bIsDisabled = false; $this->aAdditionalCSSClasses = []; - - parent::__construct($sId); + $this->aDataAttributes = ['role' => 'ibo-button']; } /** diff --git a/sources/application/UI/Base/Component/DataTable/DataTable.php b/sources/application/UI/Base/Component/DataTable/DataTable.php index 6b8493bf5..dacf291da 100644 --- a/sources/application/UI/Base/Component/DataTable/DataTable.php +++ b/sources/application/UI/Base/Component/DataTable/DataTable.php @@ -16,7 +16,7 @@ use DataTableConfig; * @package Combodo\iTop\Application\UI\Base\Component\DataTable * @since 3.0.0 */ -class DataTableBlock extends UIContentBlock +class DataTable extends UIContentBlock { // Overloaded constants public const BLOCK_CODE = 'ibo-datatable'; @@ -30,6 +30,7 @@ class DataTableBlock extends UIContentBlock 'lib/datatables/js/dataTables.responsive.min.js', 'lib/datatables/js/dataTables.scroller.min.js', 'lib/datatables/js/dataTables.select.min.js', + 'js/dataTables.main.js', 'js/dataTables.settings.js', 'js/dataTables.pipeline.js', ]; @@ -69,15 +70,26 @@ class DataTableBlock extends UIContentBlock /** * @return mixed */ - public function GetAjaxData(): string + public function GetAjaxData(string $sName) { - return $this->sAjaxData; + if (isset($this->sAjaxData[$sName])) { + return $this->sAjaxData[$sName]; + } + return ''; + } + + /** + * @return mixed + */ + public function GetJsonAjaxData(): string + { + return json_encode($this->sAjaxData); } /** * @param mixed $sAjaxData */ - public function SetAjaxData(string $sAjaxData): void + public function SetAjaxData(array $sAjaxData): void { $this->sAjaxData = $sAjaxData; } diff --git a/sources/application/UI/Base/Component/DataTable/DataTableConfig/DataTableConfig.php b/sources/application/UI/Base/Component/DataTable/DataTableConfig/DataTableConfig.php index 868e33b8d..4021c7089 100644 --- a/sources/application/UI/Base/Component/DataTable/DataTableConfig/DataTableConfig.php +++ b/sources/application/UI/Base/Component/DataTable/DataTableConfig/DataTableConfig.php @@ -1,6 +1,6 @@ oDataTable = $oDataTable; } /** - * @return \Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableBlock + * @return \Combodo\iTop\Application\UI\Base\Component\DataTable\DataTable */ - private function GetDataTable(): DataTableBlock + private function GetDataTable(): DataTable { return $this->oDataTable; } diff --git a/sources/application/UI/Base/Component/DataTable/DataTableFactory.php b/sources/application/UI/Base/Component/DataTable/DataTableFactory.php index 90e00ce3a..d05369695 100644 --- a/sources/application/UI/Base/Component/DataTable/DataTableFactory.php +++ b/sources/application/UI/Base/Component/DataTable/DataTableFactory.php @@ -14,6 +14,7 @@ use Combodo\iTop\Application\UI\Base\Component\DataTable\StaticTable\FormTable\F use Combodo\iTop\Application\UI\Base\Component\DataTable\StaticTable\StaticTable; use Combodo\iTop\Application\UI\Base\Component\Panel\PanelFactory; use Combodo\iTop\Application\UI\Base\Component\Title\TitleFactory; +use Combodo\iTop\Application\UI\Base\Component\Toolbar\Toolbar; use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock; use DBObjectSet; use Dict; @@ -38,7 +39,7 @@ class DataTableFactory * @param \DBObjectSet $oSet * @param array $aExtraParams * - * @return \Combodo\iTop\Application\UI\Base\Component\Panel\Panel + * @return \Combodo\iTop\Application\UI\Base\Layout\UIContentBlock * @throws \ApplicationException * @throws \ArchivedObjectException * @throws \CoreException @@ -52,17 +53,8 @@ class DataTableFactory */ public static function MakeForResult(WebPage $oPage, string $sListId, DBObjectSet $oSet, $aExtraParams = array()) { - $oPanel = PanelFactory::MakeForClass($oSet->GetClass(), "Result")->AddCSSClasses('ibo-datatable-panel'); $oDataTable = DataTableFactory::MakeForRendering($sListId, $oSet, $aExtraParams); - $oPanel->AddMainBlock($oDataTable); - - $oMenuBlock = new MenuBlock($oSet->GetFilter(), 'list'); - $oBlock = $oMenuBlock->GetRenderContent($oPage, $aExtraParams, $sListId); - $oBlockMenu = new UIContentBlock(); - $oBlockMenu->AddSubBlock($oBlock); - $oPanel->AddToolbarBlock($oBlockMenu); - - return $oPanel; + return self::RenderDataTable($oDataTable, 'list', $oPage, $sListId, $oSet, $aExtraParams); } /** @@ -71,7 +63,7 @@ class DataTableFactory * @param DBObjectSet $oSet * @param array $aExtraParams * - * @return \Combodo\iTop\Application\UI\Base\Component\Panel\Panel + * @return \Combodo\iTop\Application\UI\Base\Layout\UIContentBlock * @throws \ArchivedObjectException * @throws \CoreException * @throws \CoreUnexpectedValue @@ -84,17 +76,51 @@ class DataTableFactory */ public static function MakeForObject(WebPage $oPage, string $sListId, DBObjectSet $oSet, $aExtraParams = array()) { - $oPanel = PanelFactory::MakeForClass($oSet->GetClass(), "Result"); $oDataTable = DataTableFactory::MakeForRenderingObject($sListId, $oSet, $aExtraParams); - $oPanel->AddMainBlock($oDataTable); + return self::RenderDataTable($oDataTable, 'listInObject', $oPage, $sListId, $oSet, $aExtraParams); + } - $oMenuBlock = new MenuBlock($oSet->GetFilter(), 'listInObject'); - $oBlock = $oMenuBlock->GetRenderContent($oPage, $aExtraParams, $sListId); - $oBlockMenu = new UIContentBlock(); - $oBlockMenu->AddSubBlock($oBlock); - $oPanel->AddToolbarBlock($oBlockMenu); + /** + * @param \Combodo\iTop\Application\UI\Base\Component\DataTable\DataTable $oDataTable + * @param string $sStyle + * @param \WebPage $oPage + * @param string $sListId + * @param \DBObjectSet $oSet + * @param array $aExtraParams + * + * @return \Combodo\iTop\Application\UI\Base\Layout\UIContentBlock + * @throws \ArchivedObjectException + * @throws \CoreException + * @throws \CoreUnexpectedValue + * @throws \DictExceptionMissingString + * @throws \MissingQueryArgument + * @throws \MySQLException + * @throws \MySQLHasGoneAwayException + * @throws \OQLException + * @throws \ReflectionException + */ + protected static function RenderDataTable(DataTable $oDataTable, string $sStyle, WebPage $oPage, string $sListId, DBObjectSet $oSet, array $aExtraParams) + { + if (!isset($aExtraParams['menu']) || $aExtraParams['menu']) { + $oMenuBlock = new MenuBlock($oSet->GetFilter(), $sStyle); + $oBlockMenu = $oMenuBlock->GetRenderContent($oPage, $aExtraParams, $sListId); + } else { + $oBlockMenu = new UIContentBlock(); + } - return $oPanel; + if (!isset($aExtraParams['surround_with_panel']) || $aExtraParams['surround_with_panel']) { + $oContainer = PanelFactory::MakeForClass($oSet->GetClass(), "Result")->AddCSSClasses('ibo-datatable-panel'); + $oContainer->AddToolbarBlock($oBlockMenu); + $oContainer->AddMainBlock($oDataTable); + } else { + $oContainer = new UIContentBlock(); + $oToolbar = new Toolbar(); + $oToolbar->AddSubBlock($oBlockMenu); + $oContainer->AddSubBlock($oToolbar); + $oContainer->AddSubBlock($oDataTable); + } + + return $oContainer; } /** @@ -104,7 +130,7 @@ class DataTableFactory * @param \DBObjectSet $oSet * @param array $aExtraParams * - * @return DataTableBlock + * @return DataTable * @throws \ApplicationException * @throws \ArchivedObjectException * @throws \CoreException @@ -114,7 +140,7 @@ class DataTableFactory */ public static function MakeForRendering(string $sListId, DBObjectSet $oSet, $aExtraParams = array()) { - $oDataTable = new DataTableBlock('datatable_'.$sListId); + $oDataTable = new DataTable('datatable_'.$sListId); /////////////////////////////////////////////////// /*TODO 3.0.0 PrintableVersion if ($oPage->IsPrintableVersion() || $oPage->is_pdf()) @@ -332,14 +358,14 @@ class DataTableFactory $oDataTable->SetOptions($aOptions); $oDataTable->SetAjaxUrl(utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php"); - $oDataTable->SetAjaxData(json_encode([ + $oDataTable->SetAjaxData([ "operation" => 'search', "filter" => $oSet->GetFilter()->serialize(), "columns" => $oCustomSettings->aColumns, "extra_params" => $aExtraParams, "class_aliases" => $aClassAliases, "select_mode" => $sSelectMode, - ])); + ]); $oDataTable->SetDisplayColumns($aColumnDefinition); $oDataTable->SetResultColumns($oCustomSettings->aColumns); @@ -351,7 +377,7 @@ class DataTableFactory * @param DBObjectSet $oSet * @param array $aExtraParams * - * @return \Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableBlock + * @return \Combodo\iTop\Application\UI\Base\Component\DataTable\DataTable * @throws \ArchivedObjectException * @throws \CoreException * @throws \CoreUnexpectedValue @@ -360,7 +386,7 @@ class DataTableFactory */ public static function MakeForRenderingObject(string $sListId, DBObjectSet $oSet, $aExtraParams = array()) { - $oDataTable = new DataTableBlock('datatable_'.$sListId); + $oDataTable = new DataTable('datatable_'.$sListId); $aList = array(); // Initialize and check the parameters @@ -544,14 +570,14 @@ class DataTableFactory $oDataTable->SetOptions($aOptions); $oDataTable->SetAjaxUrl("ajax.render.php"); - $oDataTable->SetAjaxData(json_encode([ + $oDataTable->SetAjaxData([ "operation" => 'search', "filter" => $oSet->GetFilter()->serialize(), "columns" => $oCustomSettings->aColumns, "extra_params" => $aExtraParams, "class_aliases" => $aClassAliases, "select_mode" => $sSelectMode, - ])); + ]); $oDataTable->SetDisplayColumns($aColumnDefinition); $oDataTable->SetResultColumns($oCustomSettings->aColumns); @@ -572,6 +598,7 @@ class DataTableFactory { $aOptions = []; $sTableId=$aExtraParams["table_id"]; + $sListId = $aExtraParams["list_id"]; $aColumnsDefinitions = []; $aColumnDefinition = []; @@ -580,7 +607,7 @@ class DataTableFactory $aColumnDefinition["searchable"] = false; $aColumnDefinition["sortable"] = false; if ($sSelectMode != "single") { - $aColumnDefinition["title"] = ""; + $aColumnDefinition["title"] = ""; } else{ $aColumnDefinition["title"] = ""; } diff --git a/sources/application/UI/Base/Layout/UIContentBlock.php b/sources/application/UI/Base/Layout/UIContentBlock.php index 4be26762a..ad2cc3da5 100644 --- a/sources/application/UI/Base/Layout/UIContentBlock.php +++ b/sources/application/UI/Base/Layout/UIContentBlock.php @@ -30,8 +30,6 @@ class UIContentBlock extends UIBlock implements iUIContentBlock /** @var array */ protected $aCSSClasses; - /** @var array Array => which will be output as HTML data-xxx attributes (eg. data-="") */ - protected $aDataAttributes; /** @var array */ protected $aSubBlocks; /** @var array */ @@ -49,7 +47,6 @@ class UIContentBlock extends UIBlock implements iUIContentBlock $this->aSubBlocks = []; $this->aDeferredBlocks = []; - $this->aDataAttributes = []; $this->SetCSSClasses($sContainerClass); } @@ -159,38 +156,6 @@ class UIContentBlock extends UIBlock implements iUIContentBlock return $this; } - /** - * @return array - */ - public function GetDataAttributes(): array - { - return $this->aDataAttributes; - } - - /** - * @param array $aDataAttributes - * - * @return $this - */ - public function SetDataAttributes(array $aDataAttributes) - { - $this->aDataAttributes = $aDataAttributes; - return $this; - } - - - /** - * @param string $sName - * @param string $sValue - * - * @return $this - */ - public function AddDataAttribute(string $sName, string $sValue) - { - $this->aDataAttributes[$sName] = $sValue; - return $this; - } - /** * @inheritDoc */ diff --git a/sources/application/UI/Base/UIBlock.php b/sources/application/UI/Base/UIBlock.php index 014426ac6..641f67198 100644 --- a/sources/application/UI/Base/UIBlock.php +++ b/sources/application/UI/Base/UIBlock.php @@ -80,6 +80,8 @@ abstract class UIBlock implements iUIBlock protected $aJsFilesRelPath; /** @var array */ protected $aCssFilesRelPath; + /** @var array Array => which will be output as HTML data-xxx attributes (eg. data-="") */ + protected $aDataAttributes; /** * UIBlock constructor. @@ -97,6 +99,7 @@ abstract class UIBlock implements iUIBlock $this->aJsTemplateRelPath[self::JS_TYPE_ON_READY] = static::DEFAULT_JS_ON_READY_TEMPLATE_REL_PATH; $this->sCssTemplateRelPath = static::DEFAULT_CSS_TEMPLATE_REL_PATH; $this->sGlobalTemplateRelPath = static::DEFAULT_GLOBAL_TEMPLATE_REL_PATH; + $this->aDataAttributes = []; } /** @@ -317,4 +320,37 @@ abstract class UIBlock implements iUIBlock return $aFiles; } + + + /** + * @return array + */ + public function GetDataAttributes(): array + { + return $this->aDataAttributes; + } + + /** + * @param array $aDataAttributes + * + * @return $this + */ + public function SetDataAttributes(array $aDataAttributes) + { + $this->aDataAttributes = $aDataAttributes; + return $this; + } + + + /** + * @param string $sName + * @param string $sValue + * + * @return $this + */ + public function AddDataAttribute(string $sName, string $sValue) + { + $this->aDataAttributes[$sName] = $sValue; + return $this; + } } diff --git a/sources/application/UI/DisplayBlock/BlockChart/BlockChart.php b/sources/application/UI/DisplayBlock/BlockChart/BlockChart.php index 4ab4869a2..05dca6593 100644 --- a/sources/application/UI/DisplayBlock/BlockChart/BlockChart.php +++ b/sources/application/UI/DisplayBlock/BlockChart/BlockChart.php @@ -24,7 +24,7 @@ class BlockChart extends UIBlock /** @var int */ public $iChartCounter; /** @var string */ - public $sId; + public $sChartId; /** @var string */ public $sUrl; } \ No newline at end of file diff --git a/templates/application/display-block/block-chart/layout.html.twig b/templates/application/display-block/block-chart/layout.html.twig index 8541ac814..ad268ed08 100644 --- a/templates/application/display-block/block-chart/layout.html.twig +++ b/templates/application/display-block/block-chart/layout.html.twig @@ -1,7 +1,7 @@ {# @copyright Copyright (C) 2010-2020 Combodo SARL #} {# @license http://opensource.org/licenses/AGPL-3.0 #} {% apply spaceless %} -

+
diff --git a/templates/base/components/button/layout.html.twig b/templates/base/components/button/layout.html.twig index 3dd3619f1..23cebe466 100644 --- a/templates/base/components/button/layout.html.twig +++ b/templates/base/components/button/layout.html.twig @@ -1,6 +1,10 @@