From 1096c53f49625731763ff4f5e11bf5b9e8febb64 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 5 Jun 2023 15:44:53 +0200 Subject: [PATCH] Improved slot filling UI usability --- .../methods/getSlotFillFilter.js | 6 +- .../methods/getSlotFillFilter.test.js | 1 - .../computeSlotQuantityFilled.js | 5 +- .../computeByType/computeSlot.js | 4 +- .../api/library/getCreatureLibraryIds.js | 5 +- app/imports/api/utility/escapeRegex.js | 3 + .../ui/creature/slots/SlotFillDialog.vue | 198 +++++++++++------- .../library/LibraryNodeExpansionContent.vue | 38 +++- app/imports/server/publications/library.js | 7 +- .../server/publications/searchLibraryNodes.js | 5 +- .../server/publications/slotFillers.js | 35 ++-- 11 files changed, 182 insertions(+), 125 deletions(-) create mode 100644 app/imports/api/utility/escapeRegex.js diff --git a/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.js b/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.js index a25e7bf4..f6a5e7f9 100644 --- a/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.js +++ b/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.js @@ -1,7 +1,7 @@ export default function getSlotFillFilter({ slot, libraryIds }) { - if (!slot) throw 'Slot is required'; - if (!libraryIds) throw 'LibraryIds is required'; + if (!slot) throw 'Slot is required for getSlotFillFilter'; + if (!libraryIds) throw 'LibraryIds is required for getSlotFillFilter'; let filter = { removed: { $ne: true }, @@ -13,7 +13,6 @@ export default function getSlotFillFilter({ slot, libraryIds }) { $or: [{ type: slot.slotType }, { - type: 'slotFiller', slotFillerType: slot.slotType, }] }); @@ -22,7 +21,6 @@ export default function getSlotFillFilter({ slot, libraryIds }) { $or: [{ type: 'classLevel', }, { - type: 'slotFiller', slotFillerType: 'classLevel', }] }); diff --git a/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.test.js b/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.test.js index 2e4048d2..5ca0f4ed 100644 --- a/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.test.js +++ b/app/imports/api/creature/creatureProperties/methods/getSlotFillFilter.test.js @@ -50,7 +50,6 @@ describe('Slot fill filter', function () { $or: [{ type: 'feature' }, { - type: 'slotFiller', slotFillerType: 'feature', }], }]); diff --git a/app/imports/api/engine/computation/buildComputation/computeSlotQuantityFilled.js b/app/imports/api/engine/computation/buildComputation/computeSlotQuantityFilled.js index e3adabc8..e9e4a287 100644 --- a/app/imports/api/engine/computation/buildComputation/computeSlotQuantityFilled.js +++ b/app/imports/api/engine/computation/buildComputation/computeSlotQuantityFilled.js @@ -2,7 +2,7 @@ * Only computes `totalFilled`, need to compute `quantityExpected.value` * before `spacesLeft` can be computed */ -export default function computeSlotQuantityFilled(node, dependencyGraph){ +export default function computeSlotQuantityFilled(node, dependencyGraph) { let slot = node.node; if (slot.type !== 'propertySlot') return; slot.totalFilled = 0; @@ -10,9 +10,8 @@ export default function computeSlotQuantityFilled(node, dependencyGraph){ let childProp = child.node; dependencyGraph.addLink(slot._id, childProp._id, 'slotFill'); if ( - childProp.type === 'slotFiller' && Number.isFinite(childProp.slotQuantityFilled) - ){ + ) { slot.totalFilled += childProp.slotQuantityFilled; } else { slot.totalFilled++; diff --git a/app/imports/api/engine/computation/computeComputation/computeByType/computeSlot.js b/app/imports/api/engine/computation/computeComputation/computeByType/computeSlot.js index 9e9dc07b..8128719a 100644 --- a/app/imports/api/engine/computation/computeComputation/computeByType/computeSlot.js +++ b/app/imports/api/engine/computation/computeComputation/computeByType/computeSlot.js @@ -1,6 +1,6 @@ -export default function computSlot(computation, node){ +export default function computeSlot(computation, node) { const prop = node.data; - if (prop.quantityExpected && prop.quantityExpected.value){ + if (prop.quantityExpected && prop.quantityExpected.value) { prop.spaceLeft = prop.quantityExpected.value - prop.totalFilled; } } diff --git a/app/imports/api/library/getCreatureLibraryIds.js b/app/imports/api/library/getCreatureLibraryIds.js index beb9c7d3..a951a042 100644 --- a/app/imports/api/library/getCreatureLibraryIds.js +++ b/app/imports/api/library/getCreatureLibraryIds.js @@ -4,6 +4,7 @@ import getUserLibraryIds from './getUserLibraryIds'; import { intersection, union } from 'lodash'; export default function getCreatureLibraryIds(creature, userId) { + if (!userId) console.log('no userId, returning empty array'); if (!userId) return []; // Get the ids of libraries the user is permitted to view @@ -17,14 +18,14 @@ export default function getCreatureLibraryIds(creature, userId) { allowedLibraryCollections: 1, } }); - if (!creature) return []; + if (!creature) return userLibIds; } // If the creature does not restrict the libraries, let it use them all if (!creature.allowedLibraryCollections && !creature.allowedLibraries) { return userLibIds; } - + // Get the ids of the libraries that the creature allows const allowedCollections = creature.allowedLibraryCollections || []; let creatureLibIds = creature.allowedLibraries || []; diff --git a/app/imports/api/utility/escapeRegex.js b/app/imports/api/utility/escapeRegex.js new file mode 100644 index 00000000..8ec4073c --- /dev/null +++ b/app/imports/api/utility/escapeRegex.js @@ -0,0 +1,3 @@ +export default function escapeRegex(string) { + return string.replace(/[/\-\\^$*+?.()|[\]{}]/g, ''); +} \ No newline at end of file diff --git a/app/imports/client/ui/creature/slots/SlotFillDialog.vue b/app/imports/client/ui/creature/slots/SlotFillDialog.vue index 8b2d24f0..15fc925b 100644 --- a/app/imports/client/ui/creature/slots/SlotFillDialog.vue +++ b/app/imports/client/ui/creature/slots/SlotFillDialog.vue @@ -26,7 +26,7 @@ :string="model.description" />

- {{ slotPropertyTypeName }} with tags: + {{ slotPropertyTypeName }} with library tags:

- -