From 505c71b18c1f491a3c7f7305c9cc27e211e01a22 Mon Sep 17 00:00:00 2001 From: adisposkofh Date: Tue, 4 Aug 2026 16:10:40 +0200 Subject: [PATCH] reworked applying tabulator presets for efficiency --- public/js/components/filter/Filter.js | 2 + .../components/filter/Filter/TablePresets.js | 45 ++-------------- .../customModules/TablePresetsModule.js | 53 +++++++++++++++++++ 3 files changed, 59 insertions(+), 41 deletions(-) create mode 100644 public/js/tabulator/customModules/TablePresetsModule.js diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index 22cf684e6..2df32d041 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -26,6 +26,7 @@ import moduleLayoutFitDataStretchFrozen from "../../tabulator/layouts/fitDataStr import InternalToExternalEventBroadcastModule from "../../tabulator/customModules/InternalToExternalEventBroadcastModule.js"; import MenuExtensionModule from "../../tabulator/customModules/MenuExtensionModule.js"; import ResponsiveLayoutExtensionModule from "../../tabulator/customModules/ResponsiveLayoutExtensionModule.js"; +import TablePresetsModule from "../../tabulator/customModules/TablePresetsModule.js"; import { debounce } from "../../helpers/DebounceHelper.js"; @@ -1057,6 +1058,7 @@ export const CoreFilterCmpt = { Tabulator.registerModule(InternalToExternalEventBroadcastModule); Tabulator.registerModule(MenuExtensionModule); Tabulator.registerModule(ResponsiveLayoutExtensionModule); + Tabulator.registerModule(TablePresetsModule); }, mounted() { this.initTabulator().then(() => { diff --git a/public/js/components/filter/Filter/TablePresets.js b/public/js/components/filter/Filter/TablePresets.js index 780bb26b3..79f1b3e91 100644 --- a/public/js/components/filter/Filter/TablePresets.js +++ b/public/js/components/filter/Filter/TablePresets.js @@ -1,5 +1,5 @@ /** - * Copyright (C) 2022 fhcomplete.org + * Copyright (C) 2026 fhcomplete.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -172,7 +172,7 @@ export default { } if (shouldUpdatePresetInfo) { - this.presetInfo = {...preset}; + this.presetInfo = { ...preset }; } this.hideNewPresetForm(); @@ -398,45 +398,8 @@ export default { window.localStorage["tabulatorPreset-" + this.$props.presetsId] = preset.id ? "custom:" + preset.id : "general:" + preset.name; - let columns = this.$props.tabulator - .getColumnDefinitions() - .filter((column) => column.field !== "collapse"); - columns.forEach((column) => - this.$props.tabulator.hideColumn(column.field), - ); - - preset.displayedColumns?.forEach( - (columnField, index, displayedColumns) => { - this.$props.tabulator.showColumn(columnField); - if (index === 0) return; - this.$props.tabulator.moveColumn( - columnField, - displayedColumns[index - 1], - true, - ); - }, - ); - - this.$props.tabulator.clearHeaderFilter(); - if (preset.headerFilters) { - Object.entries(preset.headerFilters).forEach( - ([columnField, filterValue]) => { - this.$props.tabulator.setHeaderFilterValue( - columnField, - filterValue, - ); - }, - ); - } - - this.$props.tabulator.clearSort(); - if (preset.sort?.column) { - this.$props.tabulator.setSort( - preset.sort.column, - preset.sort.direction ?? "asc", - ); - } - + this.$props.tabulator.modules.tablePresets.applyPreset(preset); + this.$emit("tablePresetApplied", { preset }); }, async fetchCustomUserTabulatorPresets() { diff --git a/public/js/tabulator/customModules/TablePresetsModule.js b/public/js/tabulator/customModules/TablePresetsModule.js new file mode 100644 index 000000000..cb67e91fd --- /dev/null +++ b/public/js/tabulator/customModules/TablePresetsModule.js @@ -0,0 +1,53 @@ +import Module from "../../../../vendor/olifolkerd/tabulator5/src/js/core/Module.js"; + +export default class TablePresetsModule extends Module { + static moduleName = "tablePresets"; + static moduleInitNumber = 1; + + constructor(table) { + super(table); + } + + applyPreset(preset) { + let columnsConfig = this.table.options.columns; + let reorderedColumnsConfig = []; + preset.displayedColumns.forEach((columnField) => { + let columnConfig = columnsConfig.find( + (column) => column.field === columnField, + ); + if (!columnConfig) return; + columnConfig.visible = true; + reorderedColumnsConfig.push(columnConfig); + }); + + let hiddenColumnsConfig = columnsConfig + .filter((column) => !preset.displayedColumns.includes(column.field)) + .map((column) => { + column.visible = false; + return column; + }); + this.table.setColumns( + reorderedColumnsConfig.concat(hiddenColumnsConfig), + ); + + this.table.clearHeaderFilter(); + if (preset.headerFilters) { + Object.entries(preset.headerFilters).forEach( + ([columnField, filterValue]) => { + this.table.setHeaderFilterValue( + columnField, + filterValue, + ); + }, + ); + } + + this.table.clearSort(); + if (preset.sort?.column) { + this.table.setSort( + preset.sort.column, + preset.sort.direction ?? "asc", + ); + } + } +}