From fba85a72c17f830aa8c165c06ba7e64ba1cc48ce Mon Sep 17 00:00:00 2001 From: Jeppe Bundgaard Date: Tue, 12 May 2026 15:03:03 +0200 Subject: [PATCH] Refactor pagination components to use `provide` and `usePaginatedList`, optimize fast link handling with queuing and concurrency limits, and update XLVask content generation logic and caching. --- .../department/pos/orders/ordersTable.vue | 3 +- .../pos/sync/xlvaskUsageOrdersTable.vue | 48 +++++++++++++++---- .../models/DepartmentPos/OrdersPagination.vue | 11 ++++- .../InvoiceOrdersPagination.vue | 12 ++++- vite.config.js | 2 +- 5 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/components/displays/department/pos/orders/ordersTable.vue b/src/components/displays/department/pos/orders/ordersTable.vue index adc19a3d..5eae0a69 100644 --- a/src/components/displays/department/pos/orders/ordersTable.vue +++ b/src/components/displays/department/pos/orders/ordersTable.vue @@ -56,7 +56,8 @@ import { useRoute } from "vue-router"; import { departments, getDepartments, isLoading, getDepartmentName } from "@/components/pagination/departmentTabs.vue"; import { showPopper, removePopperIfOpen, popperBox } from "@/components/displays/PopperDefault.vue"; import { SessionUser } from "@/components/session/token/SessionUser.vue"; -import { orderBy, orderDirection, setOrder, loadList } from "@/components/pagination/paginatedList.vue"; +import { usePaginatedListInstance } from "@/components/pagination/paginatedList.vue"; +const { orderBy, orderDirection, setOrder, loadList } = usePaginatedListInstance(); import ActionSettingsWheelItem from "@/components/displays/buttons/ActionSettingsWheelItem.vue"; import OrderContentTable from "@/components/displays/superuser/tables/OrderContentTable.vue"; import InvoiceMultipleCollectionsModal from "@/components/displays/modals/InvoiceMultipleCollectionsModal.vue"; diff --git a/src/components/displays/department/pos/sync/xlvaskUsageOrdersTable.vue b/src/components/displays/department/pos/sync/xlvaskUsageOrdersTable.vue index 17a3a1b6..2a755946 100644 --- a/src/components/displays/department/pos/sync/xlvaskUsageOrdersTable.vue +++ b/src/components/displays/department/pos/sync/xlvaskUsageOrdersTable.vue @@ -37,6 +37,32 @@ import { getCachedXlvaskUsageAmount, setCachedXlvaskUsageAmount } from "@/components/displays/department/pos/sync/xlvaskUsageAmountCache.js"; +import { REQUEST_QUEUE_CONFIG } from "@/config.js"; + +const FAST_LINK_MAX_CONCURRENT = Math.ceil(REQUEST_QUEUE_CONFIG.concurrency.GET / 2); +let fastLinkInFlight = 0; +const fastLinkQueue = []; + +const drainFastLinkQueue = () => { + while (fastLinkInFlight < FAST_LINK_MAX_CONCURRENT && fastLinkQueue.length > 0) { + const object = fastLinkQueue.shift(); + if (object.loading) { + continue; + } + fastLinkInFlight++; + generateContent(object).finally(() => { + fastLinkInFlight--; + drainFastLinkQueue(); + }); + } +}; + +const scheduleFastLink = (object) => { + if (!fastLinkQueue.includes(object) && object.fast_link_key && !object.loading) { + fastLinkQueue.push(object); + } + drainFastLinkQueue(); +}; const redirectDepartmentOrderPage = (orderId, departmentId) => { // Send the user to the order page (In a new tab) @@ -218,10 +244,12 @@ const applyGeneratedContent = (object, data) => { const potentialDuplicates = Array.isArray(data?.potential_duplicates) ? data.potential_duplicates : []; object.items = orderItems; - object.selectedDuplicateId = potentialDuplicates.length ? parseInt(potentialDuplicates[0].id) : null; - object.duplicates = potentialDuplicates; - if (orderItems.length > 0) { - object.total_net_amount = getPriceFromOrderItems(orderItems); + if (potentialDuplicates.length > 0) { + object.selectedDuplicateId = parseInt(potentialDuplicates[0].id); + object.duplicates = potentialDuplicates; + } + if (data?.automation !== undefined) { + object.automation = data.automation; } object.fast_link_key = undefined; object.loading = false; @@ -239,15 +267,15 @@ const applyCachedGeneratedContent = (object) => { const generateContent = (object) => { if (applyCachedGeneratedContent(object)) { - return; + return Promise.resolve(); } if (!object.fast_link_key || object.loading) { - return; // If no fast link key, do not generate content + return Promise.resolve(); // If no fast link key, do not generate content } object.loading = true; // Set loading state to true // Generate content based on the object - SessionUser.request( + return SessionUser.request( '/modules/xlvask/services/usage/orders/fast-link?fast_link_key=' + object.fast_link_key, 'GET' ).then((response) => { @@ -256,6 +284,7 @@ const generateContent = (object) => { setCachedXlvaskUsageAmount(object, { order_items: object.items, potential_duplicates: object.duplicates, + automation: object.automation, }); } ).catch((error) => { @@ -354,8 +383,8 @@ watch(() => props.objects, (newObjects) => { return; } - if (isHighlightedUsageLog(object) && object.fast_link_key && !object.loading) { - generateContent(object); + if (object.fast_link_key && !object.loading) { + scheduleFastLink(object); } }); }, { immediate: true, deep: true }); @@ -876,7 +905,6 @@ const filteredObjects = computed(() => { - {{generateContent(object)}}