From 1aa6cd53fa5aad78ae18b0d20a76a866a65064b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Kr=C4=8Dek?= Date: Wed, 30 Jul 2025 16:06:44 +0200 Subject: [PATCH] p-q and limitations to processing only 200 items --- package-lock.json | 35 +++++++++++ package.json | 1 + .../components/wizard/StepRowFilter.svelte | 59 +++++++++++-------- 3 files changed, 69 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 26e3f8c..d439cf2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "fontkit": "^2.0.4", "heic-convert": "^2.1.0", "idb": "^8.0.3", + "p-queue": "^8.1.0", "pdf-lib": "^1.17.1", "uuid": "^11.1.0" }, @@ -1013,6 +1014,12 @@ "dev": true, "license": "MIT" }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -1443,6 +1450,34 @@ } } }, + "node_modules/p-queue": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", + "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pako": { "version": "1.0.11", "license": "(MIT AND Zlib)" diff --git a/package.json b/package.json index b096f43..2b264ab 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "fontkit": "^2.0.4", "heic-convert": "^2.1.0", "idb": "^8.0.3", + "p-queue": "^8.1.0", "pdf-lib": "^1.17.1", "uuid": "^11.1.0" } diff --git a/src/lib/components/wizard/StepRowFilter.svelte b/src/lib/components/wizard/StepRowFilter.svelte index e1a5215..9285992 100644 --- a/src/lib/components/wizard/StepRowFilter.svelte +++ b/src/lib/components/wizard/StepRowFilter.svelte @@ -107,25 +107,19 @@ return processedRow; }); - // Initially select rows based on validity and "Already Printed" status - selectedRows = new Set( - processedData - .filter((row) => { - if (!row._isValid) return false; + // Initially select rows based on validity and "Already Printed" status, up to 200 + const rowsToConsider = processedData.filter((row) => { + if (!row._isValid) return false; + const alreadyPrinted = row.alreadyPrinted; + if (alreadyPrinted) { + const value = String(alreadyPrinted).toLowerCase().trim(); + return !(value === 'true' || value === 'yes' || value === '1' || value === 'x'); + } + return true; + }); - // Check "Already Printed" column value - const alreadyPrinted = row.alreadyPrinted; - if (alreadyPrinted) { - const value = String(alreadyPrinted).toLowerCase().trim(); - // If the value is "true", "yes", "1", or any truthy value, don't select - return !(value === 'true' || value === 'yes' || value === '1' || value === 'x'); - } - - // If empty or falsy, select the row - return true; - }) - .map((row) => row._rowIndex) - ); + const initialSelection = rowsToConsider.slice(0, 200).map((row) => row._rowIndex); + selectedRows = new Set(initialSelection); updateSelectAllState(); } finally { @@ -137,6 +131,10 @@ if (selectedRows.has(rowIndex)) { selectedRows.delete(rowIndex); } else { + if (selectedRows.size >= 200) { + alert('You can only select a maximum of 200 rows at a time.'); + return; + } selectedRows.add(rowIndex); } selectedRows = new Set(selectedRows); // Trigger reactivity @@ -145,19 +143,28 @@ function toggleSelectAll() { if (selectAll) { - // Deselect all visible valid rows that aren't already printed + // Deselect all visible valid rows filteredData.forEach((row) => { - if (row._isValid && !isRowAlreadyPrinted(row)) { + if (row._isValid) { selectedRows.delete(row._rowIndex); } }); } else { - // Select all visible valid rows that aren't already printed - filteredData.forEach((row) => { - if (row._isValid && !isRowAlreadyPrinted(row)) { - selectedRows.add(row._rowIndex); - } - }); + // Select all visible valid rows that aren't already printed, up to the limit + const rowsToSelect = filteredData.filter( + (row) => row._isValid && !isRowAlreadyPrinted(row) && !selectedRows.has(row._rowIndex) + ); + + const availableSlots = 200 - selectedRows.size; + if (rowsToSelect.length > availableSlots) { + alert( + `You can only select up to 200 rows. Only the first ${availableSlots} available rows will be selected.` + ); + } + + for (let i = 0; i < Math.min(rowsToSelect.length, availableSlots); i++) { + selectedRows.add(rowsToSelect[i]._rowIndex); + } } selectedRows = new Set(selectedRows); updateSelectAllState();