LOGC#90742: Rapportagekolommen verslepen in plaats van volgnummer invoeren.

svn path=/Website/trunk/; revision=71049
This commit is contained in:
Maykel Geerdink
2025-11-25 10:04:31 +00:00
parent 139b7ded01
commit 7fa36d7df3
4 changed files with 188 additions and 40 deletions

View File

@@ -56,6 +56,28 @@ FCLTHeader.Requires({ plugins: ["jQuery"],
}
}
// Return a helper with preserved width of cells
var fixHelper = function(e, ui)
{
ui.children().each(function()
{
$(this).width($(this).width());
});
ui.css('left', "-2px");
return ui;
};
// Regels verplaatsen is alleen initieel mogelijk als op de kolom "volgnr" gesorteerd is.
// Regels verplaatsen is alleen mogelijk als bij menuitems geldt:
// 1) Er is 1 groep (tabblad) geselecteerd.
// 2) Alleen "Gebruikt" is aangevinkt. "Niet gebruikt" is NIET aangevinkt.
// 3) Er is NIET op een Label(tekst) gefiltert.
// 4) Er is NIET op een Module gefiltert.
// 5) Zolang er NIET clientside gesorteerd is op een (andere) kolom.
// Initieel/Default is de lijst gesorteerd op tablad en daarna op volgnummer. Dan mogen er regels verplaatsen worden.
//
// Als er clientside op een (andere) kolom gesorteerd wordt, wordt het verplaatsen van regels uitgeschakel in de functie "doSort2" van bestand "sorttable.js".
// Sortable moet daarbij op de tbody van een tabel gezet zijn.
var scrollMode = 0;
var scrollThreshold = 20;
$('#menutable tbody').sortable({
@@ -63,7 +85,7 @@ FCLTHeader.Requires({ plugins: ["jQuery"],
axis: "y",
distance: 10,
scroll: false,
helper: "clone",
helper: fixHelper,
sort: function(event, ui) {
var myAbsY = event.originalEvent.clientY + frameElement.offsetTop - parent.scrollY;
if (myAbsY < scrollThreshold) {
@@ -92,12 +114,11 @@ FCLTHeader.Requires({ plugins: ["jQuery"],
var menuKey = parseInt(ui.item.attr("rowKey"), 10) ?? -1;
var nextMenuKey = parseInt(ui.item.next().attr("rowKey"), 10) || -1;
var data = {
previous_menu_key: previousMenuKey,
menu_key: menuKey,
next_menu_key: nextMenuKey,
mgroep: parseInt(<%=mgroep%>, 10),
};
var data = { previous_menu_key: previousMenuKey,
menu_key: menuKey,
next_menu_key: nextMenuKey,
mgroep: parseInt(<%=mgroep%>, 10),
};
<% protectRequest.dataToken("data"); %>
$.post("fac_sort_menu_save.asp",

View File

@@ -107,6 +107,9 @@
"columns": {
"list": {
"requires": { js: ["./fac_reportx.js"] },
"sortable": { params: {"fac_usrrap_key": getQParamInt("fac_usrrap_key", -1) /*, test: 54321*/},
"file": "fac_sort_reportx_save.asp"
},
// da werkt hier niet "orderby": ["visible", "sequence"],
"buttons": [{
"title": L("lcl_usrrap_show"),

View File

@@ -100,11 +100,15 @@ var sorttable = {
sorttable.doSort2.apply(this);
},
doSort2: function(e)
{
sorttable.doSort.apply(this);
/* JGL */ FcltMgr.resized();
if (window.updateTableHeaders)
preserveHeaderWidth();
{ // Als er op een kolom wordt gesorteerd, dan zetten we het verslepen van regels uit.
// Sortable is op de tbody van de tabel gezet.
if ($("#" + e.target.closest("table").id + " tbody").sortable)
$("#" + e.target.closest("table").id + " tbody").sortable("disable"); // Er is op een kolom gesorteerd. Verslepen regels uitzetten.
sorttable.doSort.apply(this);
FcltMgr.resized(); /* JGL */
if (window.updateTableHeaders)
preserveHeaderWidth();
},
doSort: function (e)
@@ -116,7 +120,7 @@ var sorttable = {
if (this.sorttable_sortfunction == sorttable.sort_ddmm || this.sorttable_sortfunction == sorttable.sort_mmdd)
var icon = "fa-sort-amount";
//alert(this.sorttable_sortfunction);
/* JGL */ if (this.preSorttable) eval(this.preSorttable);
if (this.preSorttable) eval(this.preSorttable); /* JGL */
if (this.className.search(/\bsorttable_sorted\b/) != -1) {
// if we're already sorted by this column, just
// reverse the table, which is quicker
@@ -543,4 +547,3 @@ var forEach = function(object, block, context) {
resolve.forEach(object, block, context);
}
};

View File

@@ -166,33 +166,154 @@ function scaffolding_list(model, scf_params)
FcltMgr.openModalDetail(url, scfKeyString.split(",").length + " " + "<%=safe.jsstring(model.records_title)%>", { callback: scf_reload, id: scfKeyString });
}
// Sorteren door drag-and-drop experiment (niet actief)
// Return a helper with preserved width of cells
var fixHelper = function(e, ui) {
ui.children().each(function() {
$(this).width($(this).width());
});
ui.css('left', "-2px");
return ui;
};
var scrollInterval;
var scrollSpeed = 10;
if (window.$ && 0) // TODO: nog even uit, misschien if ("sequence" in fields)
$(function () {
$("#<%=model.table%> tbody").sortable({
axis: "y",
helper: fixHelper,
stop: function( event, ui ) {
//ui.item.children('td').css('color', 'red');
var rows = [];
$("#<%=model.table%> tbody tr").each(function()
{
rows.push(this.getAttribute("ROWKEY"));
}
);
FcltMgr.alert(rows);
}
}).disableSelection() });;
<%= scf_params.list.script %>
// Autoscroll functie
function parentScroll(mode)
{
clearInterval(scrollInterval);
if (mode === 0) return;
var $container = $(window); // Of een specifieke scroll-container
scrollInterval = setInterval(function ()
{
var currentScroll = $container.scrollTop();
$container.scrollTop(currentScroll + (mode === 1 ? 10 : -10));
},
50);
}
// Helper die muis volgt.
var fixHelper = function (e, ui)
{
var $clone = ui.clone();
$clone.children().each(function(index)
{
$(this).width(ui.children().eq(index).width());
});
$clone.css({ position: 'absolute',
pointerEvents: 'none',
zIndex: 1000,
width: ui.width()
}).appendTo('body');
// Volg muis tijdens drag.
$(document).on('mousemove.helperFollow', function (event)
{
$clone.css({top: event.pageY - ($clone.height() * 1.5) + 'px'
//, left: event.pageX + 'px'
});
});
return $clone;
};
var scrollMode = 0;
var scrollThreshold = 20;
if (window.$ && <%=("sortable" in scf_params.list)? 1 : 0%> == 1)
{
$(function () {
// Als er clientside op een (andere) kolom gesorteerd wordt, wordt het verplaatsen van regels uitgeschakel in de functie "doSort2" van bestand "sorttable.js".
// Sortable moet daarbij op de tbody van een tabel gezet worden.
// Daarnaast moet in het model in de columns.list de parameter sortable meegegeven worden die de volgende parameters moet bevatten:
// 1) params: met een keys die nodig zijn voor de file.
// 2) file: met een bestand die de verschovenn volgnummers aanpast aan de nieuwe volgorde.
// Een voorbeeld hiervan zie je in bestand "fac_reportx.asp".
// Daarin is het volgende toegevoegd:
// "sortable": { params: {"fac_usrrap_key": getQParamInt("fac_usrrap_key", -1) /*, test: 54321*/},
// "file": "fac_sort_reportx_save.asp"
// Aan de parameter params kunnen meerdere parameters meegegeven worden als dat nodig is.
// Alle parameters worden doorgegeven aan de file als die wordt aangeroepen.
$("#<%=model.table%> tbody").sortable({
items: "tr",
axis: "y",
distance: 10,
scroll: false, // we doen zelf scroll
helper: fixHelper,
sort: function(event, ui)
{
var clientY = event.originalEvent.clientY;
var windowHeight = $(window).height();
//var scrollTop = $(window).scrollTop();
// Bereken positie van muis binnen viewport
var relativeY = clientY;
if (relativeY < scrollThreshold)
{
if (scrollMode !== -1)
{ // Start scrolling up.
scrollMode = -1;
parentScroll(scrollMode);
}
}
else if (relativeY > windowHeight - scrollThreshold)
{
if (scrollMode !== 1) { // Start scrolling down.
scrollMode = 1;
parentScroll(scrollMode);
}
}
else
{
if (scrollMode !== 0) { // Stop scrolling.
scrollMode = 0;
parentScroll(scrollMode);
}
}
},
stop: function(event, ui)
{
scrollMode = 0;
parentScroll(scrollMode);
e.currentTarget.removeEventListener("touchmove", touchmoveHandler);
element.addEventListener("click", handler, false);
if (document.off)
(document).off('mousemove.helperFollow'); // opruimen
},
update: function(event, ui)
{
var previousRowKey = parseInt(ui.item.prev().attr("rowKey"), 10) || -1;
var rowKey = parseInt(ui.item.attr("rowKey"), 10) ?? -1;
var nextRowKey = parseInt(ui.item.next().attr("rowKey"), 10) || -1;
var data = { previous_row_key: previousRowKey,
row_key: rowKey,
next_row_key: nextRowKey,
};
<% // In de list.sortable parameter zijn de volgende twee parameters meegegeven:
// 1) params: met een keys die nodig zijn voor de file.
// 2) file: met een bestand die de verschovenn volgnummers aanpast aan de nieuwe volgorde.
// Aan de parameter params kunnen meerdere parameters meegegeven worden als dat nodig is.
// Alle parameters worden doorgegeven aan de file als die wordt aangeroepen.
if (scf_params.list.sortable && scf_params.list.sortable.params)
{
var sortParams = scf_params.list.sortable.params;
var sortFile = scf_params.list.sortable.file;
for (var keyName in sortParams)
{
if (sortParams.hasOwnProperty(keyName))
{ %>
data["<%=keyName%>"] = <%=sortParams[keyName]%>;
<% }
}
} %>
<% protectRequest.dataToken("data"); %>
$.post("<%=sortFile%>",
data,
FcltCallbackRefresh,
"json");
}
})
});
}
<%= scf_params.list.script %>
</script>
<% } %>
</head>