N°3123 - DataTables rework (WIP)

This commit is contained in:
Eric
2020-12-10 17:13:15 +01:00
parent b03c5232b0
commit 2bef89137e
24 changed files with 293 additions and 218 deletions

View File

@@ -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("<p><img src=\"../images/indicator_arrows.gif\"> ".Dict::S('UI:Loading').'</p>');
$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&params[group_by]=$sGroupBy{$sGroupByExpr}&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$sId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam;
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$sChartId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sChartId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam;
} else {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[chart_type]=$sChartType&params[currentId]=$sId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam;
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[chart_type]=$sChartType&params[currentId]=$sChartId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[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';

View File

@@ -1130,7 +1130,7 @@ class OQLMenuNode extends MenuNode
}
//$oPage->add("<p class=\"page-header\">$sIcon ".utils::HtmlEntities(Dict::S($sTitle))."</p>");
$oPage->add("<div class='sf_results_area'>");
$oPage->add("<div class='sf_results_area' data-target='search_results'>");
$oTitle = TitleFactory::MakeForPage($sTitle);
$oPage->AddUiBlock($oTitle);

View File

@@ -0,0 +1,4 @@
/*!
* copyright Copyright (C) 2010-2020 Combodo SARL
* license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -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;
}

View File

@@ -22,4 +22,5 @@
@import "components/all";
@import "layout/all";
@import "pages/all";
@import "application/all";
@import "themes/all";

44
js/dataTables.main.js Normal file
View File

@@ -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('<input type="hidden" name="storedSelection[]" value="' + value + '">');
}
selectionCount.val(currentSelection.length);
}

View File

@@ -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();

View File

@@ -752,11 +752,9 @@ $(function()
}
else
{
oResultAreaElem = $('<div class="display_block"></div>').insertAfter(this.element.closest('.display_block'));
oResultAreaElem = $('<div class="display_block sf_results_area" data-target="search_results"></div>').insertAfter(this.element.closest('.display_block'));
}
}
//oResultAreaElem.addClass('display_block sf_results_area');
// Make placeholder if nothing yet
if(oResultAreaElem.html() === '')
{

View File

@@ -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',

View File

@@ -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',

View File

@@ -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);

View File

@@ -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('<form method="post">');
$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 = '</form>';
$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(
<<<EOF
if ($('#user_prefs table.pagination').length > 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 = '<p>';
$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('<tr><td colspan="2">&nbsp;&nbsp;&nbsp;$sButtons</td></tr>');
$('#shortcut_list').append('<tr><td colspan="2">&nbsp;&nbsp;&nbsp;$sButtons</td></tr>');
$('#shortcut_selection_count').bind('change', OnSelectionCountChange);
$('#shortcut_btn_rename').bind('click', OnShortcutBtnRename);
$('#shortcut_btn_delete').bind('click', OnShortcutBtnDelete);

View File

@@ -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'];
}
/**

View File

@@ -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;
}

View File

@@ -1,6 +1,6 @@
<?php
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableBlock;
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTable;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock;
/**
@@ -13,19 +13,19 @@ class DataTableConfig extends UIContentBlock
public const BLOCK_CODE = 'ibo-datatableconfig';
public const DEFAULT_HTML_TEMPLATE_REL_PATH = 'base/components/datatable/config/layout';
/** @var DataTableBlock */
/** @var DataTable */
private $oDataTable;
public function __construct(DataTableBlock $oDataTable, ?string $sId = null)
public function __construct(DataTable $oDataTable, ?string $sId = null)
{
parent::__construct($sId);
$this->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;
}

View File

@@ -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"] = "<span class=\"row_input\"><input type=\"checkbox\" onclick=\"checkAllDataTable('#".$sTableId."',this.checked);\" class=\"checkAll\" id=\"field_".$sTableId."_check_all\" name=\"field_".$sTableId."_check_all\" title=\"".Dict::S('UI:SearchValue:CheckAll' )." / ".Dict::S('UI:SearchValue:UncheckAll')."\" /></span>";
$aColumnDefinition["title"] = "<span class=\"row_input\"><input type=\"checkbox\" onclick=\"checkAllDataTable('".$sTableId."',this.checked,'".$sListId."');\" class=\"checkAll\" id=\"field_".$sTableId."_check_all\" name=\"field_".$sTableId."_check_all\" title=\"".Dict::S('UI:SearchValue:CheckAll' )." / ".Dict::S('UI:SearchValue:UncheckAll')."\" /></span>";
} else{
$aColumnDefinition["title"] = "";
}

View File

@@ -30,8 +30,6 @@ class UIContentBlock extends UIBlock implements iUIContentBlock
/** @var array */
protected $aCSSClasses;
/** @var array Array <KEY> => <VALUE> which will be output as HTML data-xxx attributes (eg. data-<KEY>="<VALUE>") */
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
*/

View File

@@ -80,6 +80,8 @@ abstract class UIBlock implements iUIBlock
protected $aJsFilesRelPath;
/** @var array */
protected $aCssFilesRelPath;
/** @var array Array <KEY> => <VALUE> which will be output as HTML data-xxx attributes (eg. data-<KEY>="<VALUE>") */
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;
}
}

View File

@@ -24,7 +24,7 @@ class BlockChart extends UIBlock
/** @var int */
public $iChartCounter;
/** @var string */
public $sId;
public $sChartId;
/** @var string */
public $sUrl;
}

View File

@@ -1,7 +1,7 @@
{# @copyright Copyright (C) 2010-2020 Combodo SARL #}
{# @license http://opensource.org/licenses/AGPL-3.0 #}
{% apply spaceless %}
<div style="height:250px;width:100%" class="dashboard_chart" id="my_chart_{{ oUIBlock.sId }}{{ oUIBlock.iChartCounter }}">
<div style="height:250px;width:100%" class="dashboard_chart" id="my_chart_{{ oUIBlock.sChartId }}{{ oUIBlock.iChartCounter }}">
<div style="height:200px;line-height:200px;vertical-align:center;text-align:center;width:100%">
<img src="../images/indicator.gif">
</div>

View File

@@ -1,6 +1,10 @@
<button id="{{ oUIBlock.GetId() }}"
class="ibo-button ibo-is-{{ oUIBlock.GetActionType() }} ibo-is-{{ oUIBlock.GetColor() }} {{ oUIBlock.GetAdditionalCSSClass() }}"
data-role="ibo-button"
{% if oUIBlock.GetDataAttributes() %}
{% for sName, sValue in oUIBlock.GetDataAttributes() %}
data-{{ sName }}="{{ sValue }}"
{% endfor %}
{% endif %}
type="{{ oUIBlock.GetType() }}"
name="{{ oUIBlock.GetName() }}"
value="{{ oUIBlock.GetValue() }}"

View File

@@ -1,21 +1,24 @@
{% for oSubBlock in oUIBlock.GetSubBlocks() %}{{ render_block(oSubBlock, {aPage: aPage}) }}{% endfor %}
{% if oUIBlock.GetOptions()["select_mode"] is defined %}
<input type="hidden" name="selectionMode" value="positive"/>
{% if oUIBlock.GetAjaxData()["extra_params"] is not empty %}
<input type="hidden" name="extra_params" value="{{ oUIBlock.GetAjaxData()["extra_params"] }}"/>
{% endif %}
{% if oUIBlock.GetAjaxData()["filter"] is not empty %}
<input type="hidden" name="filter" value="{{ oUIBlock.GetAjaxData()["filter"] }}"/>
{% endif %}
{% if oUIBlock.GetOptions("select_mode") is not empty %}
<input type="hidden" name="selectionMode" value="positive"/>
<input type="hidden" name="selectionCount" value="0"/>
<div data-target="ibo-datatable--selection"></div>
{% if oUIBlock.GetAjaxData("extra_params") is not empty %}
<input type="hidden" name="extra_params" value="{{ oUIBlock.GetAjaxData("extra_params")|raw|json_encode }}"/>
{% endif %}
{% if oUIBlock.GetAjaxData("filter") is not empty %}
<input type="hidden" name="filter" value="{{ oUIBlock.GetAjaxData("filter")|raw }}"/>
{% endif %}
{% endif %}
<table id="{{ oUIBlock.GetId() }}" width="100%" class="{{ oUIBlock.GetBlockCode() }}">
<thead>
{% if oUIBlock.GetOptions()["select_mode"] is defined %}
<th></th>
{% endif %}
{% for aColumn in oUIBlock.GetDisplayColumns() %}
<th class="ibo-datatable-header" {% if aColumn["description"] is not empty %}title="{{ aColumn["description"] }}"{% endif %}>{{ aColumn["attribute_label"] }} </th>
{% endfor %}
</thead>
</table>
<thead>
{% if oUIBlock.GetOption("select_mode") is not empty %}
<th></th>
{% endif %}
{% for aColumn in oUIBlock.GetDisplayColumns() %}
<th class="ibo-datatable-header" {% if aColumn["description"] is not empty %}title="{{ aColumn["description"] }}"{% endif %}>{{ aColumn["attribute_label"] }} </th>
{% endfor %}
</thead>
</table>

View File

@@ -1,8 +1,13 @@
{# @copyright Copyright (C) 2010-2020 Combodo SARL #}
{# @license http://opensource.org/licenses/AGPL-3.0 #}
{% set sListId = oUIBlock.GetOption('sListId') %}
{% set iPageSize = oUIBlock.GetOptions()["iPageSize"] %}
$('#{{ oUIBlock.GetId() }}').closest("[role=dialog]").on("dialogbeforeclose", function () {
$('#{{ oUIBlock.GetId() }}').DataTable().clear();
});
$('#{{ sListId }}').data('target', 'ibo-datatables--outer');
if ($.fn.dataTable.isDataTable('#{{ oUIBlock.GetId() }}')) {
$('#{{ oUIBlock.GetId() }}').DataTable().destroy(false);
@@ -29,35 +34,33 @@ var oTable{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').DataTable({
sortDescending: ": {{ 'UI:Datatables:Language:Sort:Descending'|dict_s }}"
}
},
lengthMenu: [[ {{ oUIBlock.GetOptions()["iPageSize"] }}, {{ oUIBlock.GetOptions()["iPageSize"]*2 }}, {{ oUIBlock.GetOptions()["iPageSize"]*3 }}, {{ oUIBlock.GetOptions()["iPageSize"]*4 }}, -1], [ {{ oUIBlock.GetOptions()["iPageSize"] }}, {{ oUIBlock.GetOptions()["iPageSize"]*2 }}, {{ oUIBlock.GetOptions()["iPageSize"]*3 }}, {{ oUIBlock.GetOptions()["iPageSize"]*4 }}, "{{ 'Portal:Datatables:Language:DisplayLength:All'|dict_s }}"]],
lengthMenu: [[ {{ iPageSize }}, {{ iPageSize*2 }}, {{ iPageSize*3 }}, {{ iPageSize*4 }}, -1], [ {{ iPageSize }}, {{ iPageSize*2 }}, {{ iPageSize*3 }}, {{ iPageSize*4 }}, "{{ 'Portal:Datatables:Language:DisplayLength:All'|dict_s }}"]],
dom: "<'ibo-datatable-toolbar'pil>t<'ibo-datatable-toolbar'pil>",
{% if( oUIBlock.GetOptions()["sort"][0] is defined ) %}
{% if( oUIBlock.GetOptions("sort")[0] is defined ) %}
order: [[{{ oUIBlock.GetOptions()["sort"][0] }}, '{{ oUIBlock.GetOptions()["sort"][1] }}']],
{% else %}
order: [],
{% endif %}
ordering: true,
{% if oUIBlock.GetOption("select_mode") is defined %}
{% if oUIBlock.GetOption("select_mode") is not empty %}
select: {
style: "{{ oUIBlock.GetOption("select_mode") }}"
},
rowCallback: function (oRow, oData) {
// Hiding pagination if only one page
if ($(this).closest('.ibo-panel--body').find('[name=selectionMode]') === "negative") {
if (!oData.id in oSelectedItems{{ oUIBlock.GetOption('sListId') }}) {
if ($(this).closest('.ibo-panel--body').find('[name=selectionMode]').val() === "negative") {
if (oSelectedItems{{ sListId }}.indexOf(oData.id) === -1) {
$(oRow).select();
$(oRow).find('td:first-child input').prop('checked', true);
}
} else {
if (oData.id in oSelectedItems{{ oUIBlock.GetOption('sListId') }}) {
if (oSelectedItems{{ sListId }}.indexOf(oData.id) > -1) {
$(oRow).select();
$(oRow).find('td:first-child input').prop('checked', true);
}
}
},
drawCallback: function () {
// Hiding pagination if only one page
if ($(this).closest('.ibo-panel--body').find('[name=selectionMode]') === "negative") {
if ($(this).closest('.ibo-panel--body').find('[name=selectionMode]').val() === "negative") {
$(this).find('[name=selectAll]').checked();
$(table).DataTable().rows({page: 'current'}).select();
} else {
@@ -74,23 +77,23 @@ var oTable{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').DataTable({
columns: [
{% if oUIBlock.GetOption("select_mode") is not empty %}
{
width: "auto",
width: "20px",
searchable: false,
sortable: false,
title:
{% if oUIBlock.GetOption("select_mode") != "single" %}
'<span class="row_input"><input type="checkbox" onclick="checkAllDataTable(\'#{{ oUIBlock.GetId() }}\',this.checked);" class="checkAll" id="field_{{ oUIBlock.GetId() }}_check_all" name="field_{{ oUIBlock.GetId() }}_check_all" title="{{ 'UI:SearchValue:CheckAll'|dict_s }} / {{ 'UI:SearchValue:UncheckAll'|dict_s }}" /></span>'
{% if oUIBlock.GetOption("select_mode") != "single" %}
'<span class="row_input"><input type="checkbox" onclick="checkAllDataTable(\'{{ oUIBlock.GetId() }}\',this.checked,\'{{ oUIBlock.GetOption("sListId") }}\');" class="checkAll" id="field_{{ oUIBlock.GetId() }}_check_all" name="field_{{ oUIBlock.GetId() }}_check_all" title="{{ 'UI:SearchValue:CheckAll'|dict_s }} / {{ 'UI:SearchValue:UncheckAll'|dict_s }}" /></span>'
{% else %}
'<span class="row_input"><input type="checkbox" style="display: none;" onclick="checkAllDataTable(\'#{{ oUIBlock.GetId() }}\',this.checked);" class="checkAll" id="field_{{ oUIBlock.GetId() }}_check_all" name="field_{{ oUIBlock.GetId() }}_check_all" title="{{ 'UI:SearchValue:CheckAll'|dict_s }} / {{ 'UI:SearchValue:UncheckAll'|dict_s }}" /></span>'
'<span class="row_input"><input type="checkbox" style="display: none;" onclick="checkAllDataTable(\'{{ oUIBlock.GetId() }}\',this.checked,\'{{ oUIBlock.GetOption("sListId") }}\');" class="checkAll" id="field_{{ oUIBlock.GetId() }}_check_all" name="field_{{ oUIBlock.GetId() }}_check_all" title="{{ 'UI:SearchValue:CheckAll'|dict_s }} / {{ 'UI:SearchValue:UncheckAll'|dict_s }}" /></span>'
{% endif %},
type: "html",
data: "",
render: function (data, type, row) {
var oCheckboxElem =
{% if oUIBlock.GetOption("select_mode") != "single" %}
$('<span class="row_input"><input type="checkbox" class="selectList{{ oUIBlock.GetId() }}" name="selectObject[]" /></span>');
$('<span class="row_input"><input type="checkbox" class="selectList{{ oUIBlock.GetId() }}" name="selectObject[]" value="'+row.id+'"/></span>');
{% else %}
$('<span class="row_input"><input type="radio" class="selectList{{ oUIBlock.GetId() }}" name="selectObject[]" /></span>');
$('<span class="row_input"><input type="radio" class="selectList{{ oUIBlock.GetId() }}" name="selectObject[]" value="'+row.id+'"/></span>');
{% endif %}
if (row.limited_access) {
oCheckboxElem.html('-');
@@ -125,14 +128,14 @@ var oTable{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').DataTable({
],
ajax: $.fn.dataTable.pipeline({
url: "{{ oUIBlock.GetAjaxUrl() }}",
data: {{ oUIBlock.GetAjaxData() |raw }},
data: {{ oUIBlock.GetJsonAjaxData() |raw }},
method: "post",
pages: 5 // number of pages to cache
}),
initComplete: function () {
if (this.api().page.info().pages === 1) {
$('.dataTables_paginate').hide();
$('.dataTables_length').hide();
this.parent().find('.dataTables_paginate').hide();
this.parent().find('.dataTables_length').hide();
}
}
});
@@ -150,11 +153,12 @@ var oTable{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').DataTable({
// Saving values in temp array
for (var i in aData) {
var iItemId = aData[i].id;
if (oSelectedItems{{ oUIBlock.GetOption('sListId') }}.indexOf(iItemId) > -1) {
oSelectedItems{{ oUIBlock.GetOption('sListId') }}.splice(oSelectedItems{{ oUIBlock.GetOption('sListId') }}.indexOf(iItemId), 1);
if (oSelectedItems{{ sListId }}.indexOf(iItemId) > -1) {
oSelectedItems{{ sListId }}.splice(oSelectedItems{{ sListId }}.indexOf(iItemId), 1);
updateDataTableSelection('{{ sListId }}');
}
}
if (oSelectedItems{{ oUIBlock.GetOption('sListId') }}.length === oTable{{ oUIBlock.GetId() }}.page.info()["recordsTotal"] ) {
if (oSelectedItems{{ sListId }}.length === oTable{{ oUIBlock.GetId() }}.page.info()["recordsTotal"] ) {
$('#btn_ok_{{ oUIBlock.GetOption('sTableId') }}').prop('disabled', true);
} else {
$('#btn_ok_{{ oUIBlock.GetOption('sTableId') }}').prop('disabled', false);
@@ -166,8 +170,9 @@ var oTable{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').DataTable({
// Saving values in temp array
for (var i in aData) {
var iItemId = aData[i].id;
if (oSelectedItems{{ oUIBlock.GetOption('sListId') }}.indexOf(iItemId) === -1) {
oSelectedItems{{ oUIBlock.GetOption('sListId') }}.push(iItemId);
if (oSelectedItems{{ sListId }}.indexOf(iItemId) === -1) {
oSelectedItems{{ sListId }}.push(iItemId);
updateDataTableSelection('{{ sListId }}');
}
}
$('#btn_ok_{{ oUIBlock.GetOption('sTableId') }}').prop('disabled', false);
@@ -183,11 +188,12 @@ var oTable{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').DataTable({
if ($(this).closest('.ibo-panel--body').find('[name=selectionMode]').val() === "negative") {
for (var i in aData) {
var iItemId = aData[i].id;
if (oSelectedItems{{ oUIBlock.GetOption('sListId') }}.indexOf(iItemId) === -1) {
oSelectedItems{{ oUIBlock.GetOption('sListId') }}.push(iItemId);
if (oSelectedItems{{ sListId }}.indexOf(iItemId) === -1) {
oSelectedItems{{ sListId }}.push(iItemId);
updateDataTableSelection('{{ sListId }}');
}
}
if (oSelectedItems{{ oUIBlock.GetOption('sListId') }}.length === oTable{{ oUIBlock.GetId() }}.page.info()["recordsTotal"]) {
if (oSelectedItems{{ sListId }}.length === oTable{{ oUIBlock.GetId() }}.page.info()["recordsTotal"]) {
$('#btn_ok_{{ oUIBlock.GetOption('sTableId') }}').prop('disabled', true);
} else {
$('#btn_ok_{{ oUIBlock.GetOption('sTableId') }}').prop('disabled', false);
@@ -195,11 +201,12 @@ var oTable{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').DataTable({
} else {
for (var i in aData) {
var iItemId = aData[i].id;
if (oSelectedItems{{ oUIBlock.GetOption('sListId') }}.indexOf(iItemId) > -1) {
oSelectedItems{{ oUIBlock.GetOption('sListId') }}.splice(oSelectedItems{{ oUIBlock.GetOption('sListId') }}.indexOf(iItemId), 1);
if (oSelectedItems{{ sListId }}.indexOf(iItemId) > -1) {
oSelectedItems{{ sListId }}.splice(oSelectedItems{{ sListId }}.indexOf(iItemId), 1);
updateDataTableSelection('{{ sListId }}');
}
}
if (oSelectedItems{{ oUIBlock.GetOption('sListId') }}.length === 0) {
if (oSelectedItems{{ sListId }}.length === 0) {
$('#btn_ok_{{ oUIBlock.GetOption('sTableId') }}').prop('disabled', true);
} else {
$('#btn_ok_{{ oUIBlock.GetOption('sTableId') }}').prop('disabled', false);
@@ -214,11 +221,12 @@ var oTable{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').DataTable({
// Saving values in temp array
for (var i in aData) {
var iItemId = aData[i].id;
if (oSelectedItems{{ oUIBlock.GetOption('sListId') }}.indexOf(iItemId) === -1) {
oSelectedItems{{ oUIBlock.GetOption('sListId') }}.push(iItemId);
if (oSelectedItems{{ sListId }}.indexOf(iItemId) === -1) {
oSelectedItems{{ sListId }}.push(iItemId);
updateDataTableSelection('{{ sListId }}');
}
}
$('#btn_ok_{{ oUIBlock.GetOption('sListId') }}').prop('disabled', false);
$('#btn_ok_{{ sListId }}').prop('disabled', false);
});
oTable{{ oUIBlock.GetId() }}.off('deselect').on('deselect', function (oEvent, dt, type, indexes) {
@@ -229,8 +237,9 @@ var oTable{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').DataTable({
// Saving values in temp array
for (var i in aData) {
var iItemId = aData[i].id;
if (oSelectedItems{{ oUIBlock.GetOption('sListId') }}.indexOf(iItemId) > -1) {
oSelectedItems{{ oUIBlock.GetOption('sListId') }}.splice(oSelectedItems{{ oUIBlock.GetOption('sListId') }}.indexOf(iItemId), 1);
if (oSelectedItems{{ sListId }}.indexOf(iItemId) > -1) {
oSelectedItems{{ sListId }}.splice(oSelectedItems{{ sListId }}.indexOf(iItemId), 1);
updateDataTableSelection('{{ sListId }}');
}
}
});
@@ -246,7 +255,7 @@ $('#datatable_dlg_{{ oUIBlock.GetId() }}').dialog(
$('#datatable_dlg_{{ oUIBlock.GetId() }}').find('[name=action]').val("none");
},
close: function (event, ui) { //save data and refresh
if( $('#datatable_dlg_{{ oUIBlock.GetId() }}').find('[name=action]').val() == "none") {
if( $('#datatable_dlg_{{ oUIBlock.GetId() }}').find('[name=action]').val() === "none") {
$('#datatable_dlg_{{ oUIBlock.GetId() }}').DataTableSettings('onDlgCancel');
}
}
@@ -262,7 +271,7 @@ $aOptions = {
sTableId: '{{ oUIBlock.GetOption("sTableId") }}',
//oExtraParams
sRenderUrl: "{{ oUIBlock.GetAjaxUrl() }}",
oData: {{ oUIBlock.GetAjaxData() |raw }},//ttt
oData: {{ oUIBlock.GetJsonAjaxData() |raw }},
oDefaultSettings: {{ oUIBlock.GetOption("oDefaultSettings")|raw }},
oLabels: {moveup: "{{ 'UI:Button:MoveUp'|dict_s }}", movedown: "{{ 'UI:Button:MoveDown'|dict_s }}"},
};

View File

@@ -1,34 +1,5 @@
function checkAllDataTable(table, value) {
// Set the 'selectionMode' for the future objects to load
var selectionMode = 'positive';
if (value) {
selectionMode = 'negative';
}
oSelectedItems{{ oUIBlock.GetOption('sListId') }} =[];
// Mark all the displayed items as check or unchecked depending on the value
$(table).find(':checkbox[name^=selectObj]:not([disabled])').each(function () {
var $currentCheckbox = $(this);
$currentCheckbox.prop('checked', value);
$currentLine = $currentCheckbox.closest("tr");
(value) ? $currentLine.addClass("selected") : $currentLine.removeClass("selected");
});
$(table).parent().parent().find(':input[name=selectionMode]').val(selectionMode);
// Reset the list of saved selection...
$(':input[name^=storedSelection]').remove();
$(table).parent().find(':checkbox[name^=selectObj]').trigger("change");
if (value) {
$(table).DataTable().rows().select();
$('#btn_ok_{{ oUIBlock.GetOption('sTableId') }}').prop('disabled', false);
} else {
$(table).DataTable().rows({page: 'current'}).deselect();
$('#btn_ok_{{ oUIBlock.GetOption('sTableId') }}').prop('disabled', true);
}
return true;
}
{% if oUIBlock.GetOption("select_mode") is defined %}
{% if oUIBlock.GetOption("select_mode") is not empty %}
var oSelectedItems{{ oUIBlock.GetOption('sListId') }} = [];
{% endif %}
{% endif %}