N°4085 - Polishing : bulk modify

This commit is contained in:
acognet
2021-06-25 10:11:34 +02:00
parent 671d112452
commit 275daf3b0d
6 changed files with 93 additions and 55 deletions

View File

@@ -30,6 +30,7 @@ use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\MultiColumn;
use Combodo\iTop\Application\UI\Base\Layout\Object\ObjectFactory;
use Combodo\iTop\Application\UI\Base\Layout\TabContainer\Tab\AjaxTab;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
use Combodo\iTop\Renderer\BlockRenderer;
use Combodo\iTop\Renderer\Console\ConsoleFormRenderer;
@@ -2180,6 +2181,7 @@ EOF
break;
// TODO 3.0.0: Isn't this part obsolete now that we have the activity panel or should we keep it for devs using it in custom extensions or maybe *transition forms* as a caselog can be MUST_PROMPT?
// used for bulk modify in 3.0
case 'CaseLog':
$sInputType = self::ENUM_INPUT_TYPE_HTML_EDITOR;
$aStyles = array();
@@ -4557,30 +4559,27 @@ HTML
$sDisplayValue = $this->GetEditValue($sAttCode);
$aArgs = array('this' => $this, 'formPrefix' => $sPrefix);
$sCommentAsHtml = ($sComment != '') ? '<span>'.$sComment.'</span><br/>' : '';
$sFieldAsHtml = self::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, $sValue, $sDisplayValue, $sInputId, '', $iFlags, $aArgs);
$sHTMLValue = <<<HTML
<div class="field_data">
<div class="field_value">
$sCommentAsHtml
$sFieldAsHtml
</div>
</div>
HTML;
$aFieldsMap[$sAttCode] = $sInputId;
$oPage->add(<<<HTML
<fieldset>
<legend>{$sAttLabel}</legend>
<div class="field_container field_large" data-attribute-code="{$sAttCode}" data-attribute-type="{$sAttDefClass}" data-attribute-label="{$sAttMetaDataLabel}"
data-attribute-flag-hidden="false" data-attribute-flag-read-only="false" data-attribute-flag-mandatory="{$sAttMetaDataFlagMandatory}"
data-attribute-flag-must-change="{$sAttMetaDataFlagMustChange}" data-attribute-flag-must-prompt="{$sAttMetaDataFlagMustPrompt}" data-attribute-flag-slave="false">
{$sHTMLValue}
</div>
</fieldset>
HTML
);
$oFieldset = FieldSetUIBlockFactory::MakeStandard($sAttLabel);
$oPage->AddSubBlock($oFieldset);
$oDivField = FieldUIBlockFactory::MakeLarge("");
// UIContentBlockUIBlockFactory::MakeStandard(null,["field_container field_large"]);
$oDivField->AddDataAttribute("attribute-type", $sAttDefClass);
$oDivField->AddDataAttribute("attribute-label", $sAttMetaDataLabel);
$oDivField->AddDataAttribute("attribute-flag-hidden", false);
$oDivField->AddDataAttribute("attribute-flag-read-only", false);
$oDivField->AddDataAttribute("attribute-flag-mandatory", $sAttMetaDataFlagMandatory);
$oDivField->AddDataAttribute("attribute-flag-must-change", $sAttMetaDataFlagMustChange);
$oDivField->AddDataAttribute("attribute-flag-must-prompt", $sAttMetaDataFlagMustPrompt);
$oDivField->AddDataAttribute("attribute-flag-slave", false);
$oFieldset->AddSubBlock($oDivField);
$sCommentAsHtml = ($sComment != '') ? '<span>'.$sComment.'</span><br/>' : '';
$sFieldAsHtml = self::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, $sValue, $sDisplayValue, $sInputId, '', $iFlags, $aArgs);
$sHTMLValue = $sCommentAsHtml.$sFieldAsHtml;
$oDivField->AddSubBlock(new Html($sHTMLValue));
}
}
@@ -5176,7 +5175,7 @@ EOF
$oFilter = new DBObjectSearch($sClass);
$oFilter->AddCondition('id', $aKeys, 'IN');
$oSet = new CMDBobjectSet($oFilter);
$oDisplaySet = \Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory::MakeStandard("0");
$oDisplaySet = UIContentBlockUIBlockFactory::MakeStandard("0");
$oP->AddSubBlock($oDisplaySet);
$oDisplaySet->AddSubBlock(CMDBAbstractObject::GetDisplaySetBlock($oP, $oSet, array('display_limit' => false, 'menu' => false)));

View File

@@ -538,14 +538,12 @@ class utils
*/
public static function ReadMultipleSelection($oFullSetFilter)
{
$aSelectedObj = utils::ReadParam('selectObject', array());
$aSelectedObj = utils::ReadParam('selectObject[]', array());
$sSelectionMode = utils::ReadParam('selectionMode', '');
if ($sSelectionMode != '')
{
if ($sSelectionMode != '') {
// Paginated selection
$aExceptions = utils::ReadParam('storedSelection', array());
if ($sSelectionMode == 'positive')
{
if ($sSelectionMode == 'positive') {
// Only the explicitely listed items are selected
$aSelectedObj = $aExceptions;
}

View File

@@ -19,7 +19,7 @@ function checkAllDataTable(tableId, value, listId) {
(value) ? currentLine.addClass("selected") : currentLine.removeClass("selected");
});
tableSelector.parent().parent().find(':input[name=selectionMode]').val(selectionMode);
tableSelector.closest(".dataTables_wrapper").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");
@@ -29,25 +29,25 @@ function checkAllDataTable(tableId, value, listId) {
} else {
tableSelector.DataTable().rows({page: 'current'}).deselect();
}
updateDataTableSelection(listId);
updateDataTableSelection(listId, tableId);
return true;
}
function updateDataTableSelection(listId) {
function updateDataTableSelection(listId, tableId) {
let selectionContainer = $('#'+listId+' [data-target="ibo-datatable--selection"]');
let selectionCount = $('#'+listId+' [name="selectionCount"]');
let selectionMode = $('#'+listId+' [name=selectionMode]').val();
selectionContainer.html('');
let currentSelection = window['oSelectedItems'+listId];
for(let i in currentSelection) {
for (let i in currentSelection) {
let value = currentSelection[i];
selectionContainer.append('<input type="hidden" name="storedSelection[]" value="' + value + '">');
selectionContainer.append('<input type="hidden" name="storedSelection[]" value="'+value+'">');
}
if (selectionMode === 'negative') {
let total = $('#'+$aOptions.sListId).DataTable().page.info()["recordsTotal"];
let total = $('#'+tableId).DataTable().page.info()["recordsTotal"];
selectionCount.val(total-currentSelection.length);
} else {
selectionCount.val(currentSelection.length);

View File

@@ -42,8 +42,8 @@ var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
scrollX: true,
{% if oUIBlock.GetOption('sMaxHeight') is not empty %}
scrollY: "{{ oUIBlock.GetOption('sMaxHeight') }}",
scrollCollapse: true,
{% endif %}
scrollCollapse: true,
lengthMenu: [[ {{ iPageSize }}, {{ iPageSize*2 }}, {{ iPageSize*3 }}, {{ iPageSize*4 }}, -1], [ {{ iPageSize }}, {{ iPageSize*2 }}, {{ iPageSize*3 }}, {{ iPageSize*4 }}, "{{ 'UI:Datatables:Language:DisplayLength:All'|dict_s }}"]],
dom: "<'ibo-datatable--toolbar'<'ibo-datatable--toolbar-left' pl><'ibo-datatable--toolbar-right' i>>t<'ibo-datatable--toolbar'<'ibo-datatable--toolbar-left' pl><'ibo-datatable--toolbar-right' i>>",
{% if( oUIBlock.GetOption("sort")[0] is defined ) %}
@@ -113,7 +113,7 @@ var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
sortable: false,
orderable: false,
title:
{% if oUIBlock.GetOption("select_mode") != "single" %}
{% 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,\'{{ 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>'
@@ -182,9 +182,9 @@ var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
this.find('thead').unblock();
{% if oUIBlock.GetOption("select_mode") is not empty %}
updateDataTableSelection('{{ sListId }}');
updateDataTableSelection('{{ sListId }}', '{{ oUIBlock.GetId() }}');
{% if oUIBlock.GetOption("select_mode") != "single" %}
this.api().on('select', function (oEvent, dt, type, indexes) {
this.api().on('select', function (oEvent, dt, type, indexes) {
if (bSelectAllowed{{ oUIBlock.GetId() }})
{
let aData = oTable{{ sListIDForVarSuffix }}.rows(indexes).data().toArray();
@@ -199,7 +199,7 @@ var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
if (oSelectedItems{{ sListId }}.indexOf(iItemId) > -1)
{
oSelectedItems{{ sListId }}.splice(oSelectedItems{{ sListId }}.indexOf(iItemId), 1);
updateDataTableSelection('{{ sListId }}');
updateDataTableSelection('{{ sListId }}', '{{ oUIBlock.GetId() }}');
}
}
}
@@ -214,7 +214,7 @@ var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
if (oSelectedItems{{ sListId }}.indexOf(iItemId) === -1)
{
oSelectedItems{{ sListId }}.push(iItemId);
updateDataTableSelection('{{ sListId }}');
updateDataTableSelection('{{ sListId }}', '{{ oUIBlock.GetId() }}');
}
}
}
@@ -236,7 +236,7 @@ var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
if (oSelectedItems{{ sListId }}.indexOf(iItemId) === -1)
{
oSelectedItems{{ sListId }}.push(iItemId);
updateDataTableSelection('{{ sListId }}');
updateDataTableSelection('{{ sListId }}', '{{ oUIBlock.GetId() }}');
}
}
}
@@ -248,7 +248,7 @@ var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
if (oSelectedItems{{ sListId }}.indexOf(iItemId) > -1)
{
oSelectedItems{{ sListId }}.splice(oSelectedItems{{ sListId }}.indexOf(iItemId), 1);
updateDataTableSelection('{{ sListId }}');
updateDataTableSelection('{{ sListId }}', '{{ oUIBlock.GetId() }}');
}
}
}
@@ -268,7 +268,7 @@ var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
if (oSelectedItems{{ sListId }}.indexOf(iItemId) === -1)
{
oSelectedItems{{ sListId }}.push(iItemId);
updateDataTableSelection('{{ sListId }}');
updateDataTableSelection('{{ sListId }}', '{{ oUIBlock.GetId() }}');
}
}
}
@@ -288,7 +288,7 @@ var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
if (oSelectedItems{{ sListId }}.indexOf(iItemId) > -1)
{
oSelectedItems{{ sListId }}.splice(oSelectedItems{{ sListId }}.indexOf(iItemId), 1);
updateDataTableSelection('{{ sListId }}');
updateDataTableSelection('{{ sListId }}', '{{ oUIBlock.GetId() }}');
}
}
}

View File

@@ -1,7 +1,7 @@
{% set sListId = oUIBlock.GetId() %}
{% set sListIDForVarSuffix = ('' ~ sListId)|sanitize(constant('utils::ENUM_SANITIZATION_FILTER_VARIABLE_NAME')) %}
var table{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
language: {
emptyTable: "{{ 'UI:Message:EmptyList:UseAdd'|dict_s }}"
},
@@ -44,17 +44,22 @@ var table{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
});
{% if (oUIBlock.GetOption('bFullscreen')) %}
var myheight = $("#ibo-main-content").height()-$("#ibo-main-content")[0].scrollHeight+$("#{{ oUIBlock.GetId() }}").height();
if (myheight < 200)
var heightS{{ sListIDForVarSuffix }} = 0;
var heightD{{ sListIDForVarSuffix }} = 0;
if ($("#{{ oUIBlock.GetId() }}").height() > 0)
{
myheight = 200;
};
$("#{{ oUIBlock.GetId() }}_wrapper").find(".dataTables_scrollBody").height(myheight);
heightD{{ sListIDForVarSuffix }} = $("#ibo-main-content").height()-$("#ibo-main-content")[0].scrollHeight+$("#{{ oUIBlock.GetId() }}").height();
heightS{{ sListIDForVarSuffix }} = $("#ibo-main-content").height();
if (heightD{{ sListIDForVarSuffix }} > 200)
{
$("#{{ oUIBlock.GetId() }}_wrapper").find(".dataTables_scrollBody").height(heightD{{ sListIDForVarSuffix }});
}
}
{% endif %}
if ($('#{{ oUIBlock.GetId() }}').find('thead').is(':visible'))
{
table{{ sListIDForVarSuffix }}.columns.adjust().draw();
oTable{{ sListIDForVarSuffix }}.columns.adjust().draw();
}
if (window.ResizeObserver)
@@ -67,4 +72,40 @@ if (window.ResizeObserver)
}, 120);
});
oFromTable{{ sListIDForVarSuffix }}Resize.observe($('#{{ oUIBlock.GetId() }}')[0]);
{% if (oUIBlock.GetOption('bFullscreen')) %}
let heightScreen{{ sListIDForVarSuffix }} = heightS{{ sListIDForVarSuffix }};
let heightDatatable{{ sListIDForVarSuffix }} = heightD{{ sListIDForVarSuffix }};
let oFromScreen{{ sListIDForVarSuffix }}ResizeTimeout = null;
const oFromScreen{{ sListIDForVarSuffix }}Resize = new ResizeObserver(function () {
clearTimeout(oFromScreen{{ sListIDForVarSuffix }}ResizeTimeout);
oFromScreen{{ sListIDForVarSuffix }}ResizeTimeout = setTimeout(function () {
if ($("#{{ oUIBlock.GetId() }}_wrapper").height() > 0)
{
console.warn("$_wrapper).height()"+$("#{{ oUIBlock.GetId() }}_wrapper").height());
if (heightDatatable{{ sListIDForVarSuffix }}> 0)
{
let calcul = $("#ibo-main-content").height()+heightDatatable{{ sListIDForVarSuffix }}-heightScreen{{ sListIDForVarSuffix }};
if (calcul > 200)
{
$("#{{ oUIBlock.GetId() }}_wrapper").find(".dataTables_scrollBody").height(calcul);
}
}
else
{
heightDatatable{{ sListIDForVarSuffix }} = $("#ibo-main-content").height()-$("#ibo-main-content")[0].scrollHeight+$("#{{ oUIBlock.GetId() }}_wrapper").height();
heightScreen{{ sListIDForVarSuffix }} = $("#ibo-main-content").height();
if (heightDatatable{{ sListIDForVarSuffix }} > 200)
{
$("#{{ oUIBlock.GetId() }}_wrapper").find(".dataTables_scrollBody").height(heightDatatable{{ sListIDForVarSuffix }});
}
}
}
}, 120);
});
oFromScreen{{ sListIDForVarSuffix }}Resize.observe($('#ibo-main-content')[0]);
{% endif %}
}

View File

@@ -3,12 +3,12 @@
{% set sListId = oUIBlock.GetId() %}
{% set sListIDForVarSuffix = ('' ~ sListId)|sanitize(constant('utils::ENUM_SANITIZATION_FILTER_VARIABLE_NAME')) %}
{% if oUIBlock.GetOption("iPageSize") is not empty %}
{% set iPageSize = oUIBlock.GetOption("iPageSize") %}
{% set iPageSize = oUIBlock.GetOption("iPageSize") %}
{% else %}
{% set iPageSize = 10 %}
{% set iPageSize = 10 %}
{% endif %}
$('#{{ oUIBlock.GetId() }}').DataTable({
var oTable{{ sListIDForVarSuffix }} = $('#{{ oUIBlock.GetId() }}').DataTable({
language: {
processing: "{{ 'UI:Datatables:Language:Processing'|dict_s }}",
search: "{{ 'UI:Datatables:Language:Search'|dict_s }}",
@@ -32,8 +32,8 @@ $('#{{ oUIBlock.GetId() }}').DataTable({
scrollX: true,
{% if oUIBlock.GetOption('sMaxHeight') is not empty %}
scrollY: "{{ oUIBlock.GetOption('sMaxHeight') }}",
scrollCollapse: true,
{% endif %}
scrollCollapse: true,
order: [],
autoWidth: false,
rowId: "id",