From 7ea972d4763102fc95c95df7428822743c3fefcf Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Tue, 1 Aug 2023 11:28:17 +0200 Subject: [PATCH 1/2] Fixed level up backfill selecting too many props Fixed out of order --- .../methods/insertPropertyFromLibraryNode.js | 2 + .../ui/creature/slots/LevelUpDialog.vue | 63 ++++++++++++------- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/app/imports/api/creature/creatureProperties/methods/insertPropertyFromLibraryNode.js b/app/imports/api/creature/creatureProperties/methods/insertPropertyFromLibraryNode.js index deb55bc7..79dcc70c 100644 --- a/app/imports/api/creature/creatureProperties/methods/insertPropertyFromLibraryNode.js +++ b/app/imports/api/creature/creatureProperties/methods/insertPropertyFromLibraryNode.js @@ -60,6 +60,8 @@ const insertPropertyFromLibraryNode = new ValidatedMethod({ nodeIds.forEach(nodeId => { // TODO: Check library view permission for each node before starting node = insertPropertyFromNode(nodeId, ancestors, order); + // Increment order, slightly, to keep the nodes inserted in the given id order + order += 0.001; }); // get one of the root inserted docs diff --git a/app/imports/client/ui/creature/slots/LevelUpDialog.vue b/app/imports/client/ui/creature/slots/LevelUpDialog.vue index aefd4405..dcf4ce08 100644 --- a/app/imports/client/ui/creature/slots/LevelUpDialog.vue +++ b/app/imports/client/ui/creature/slots/LevelUpDialog.vue @@ -81,7 +81,7 @@ v-if="libraryNode._disabledBySlotFillerCondition" class="error--text text-no-wrap text-truncate" > - {{ libraryNode.slotFillerCondition }} + {{ libraryNode._conditionError }}
@@ -192,7 +192,7 @@ import getSlotFillFilter from '/imports/api/creature/creatureProperties/methods/ import Libraries from '/imports/api/library/Libraries.js'; import LibraryNodeExpansionContent from '/imports/client/ui/library/LibraryNodeExpansionContent.vue'; import PropertyTags from '/imports/client/ui/properties/viewers/shared/PropertyTags.vue'; -import { clone, difference } from 'lodash'; +import { clone, difference, isEqual } from 'lodash'; export default { components: { @@ -250,25 +250,39 @@ export default { }, watch: { selectedNodeIds(selectedIds, oldSelectedIds) { - // Skip if we didn't increase the length by adding a new Id - if (oldSelectedIds.length >= selectedIds.length) return; - // Find out which library node was added - const addedId = difference(selectedIds, oldSelectedIds)[0]; - if (!addedId) return; - const addedNode = LibraryNodes.findOne(addedId); - if (!addedNode) return; - // Tick any unchecked nodes of a lower level, but only one per level - const backFilledLevels = new Set(); - this.libraryNodes.forEach(node => { - if ( - !selectedIds.includes(node._id) - && node.level < addedNode.level - && !backFilledLevels.has(node.level) - ) { - selectedIds.push(node._id); - } - }); - this.selectedNodeIds = selectedIds; + // Skip if we increased the length by adding a new Id, see if we need to backfill levels + if (oldSelectedIds.length < selectedIds.length) { + // Find out which library node was added + const addedId = difference(selectedIds, oldSelectedIds)[0]; + if (!addedId) return; + const addedNode = LibraryNodes.findOne(addedId); + if (!addedNode) return; + // Tick any unchecked nodes of a lower level, but only one per level + const backFilledLevels = new Set(); + this.libraryNodes.forEach(node => { + if ( + !selectedIds.includes(node._id) + && node.level < addedNode.level + && !backFilledLevels.has(node.level) + && !this.isDisabled(node) + ) { + selectedIds.push(node._id); + backFilledLevels.add(node.level) + } + }); + this.selectedNodeIds = sortedIds; + } + + // Refetch the library nodes to sort them correctly + const sortedIds = LibraryNodes.find({ + _id: { $in: selectedIds } + }, { + sort: { level: 1, name: 1, order: 1 } + }).map(node => node._id); + // Only update if the order changed + if (!isEqual(this.selectedNodeIds, sortedIds)) { + this.selectedNodeIds = sortedIds; + } } }, methods: { @@ -377,7 +391,7 @@ export default { if (!this.libraryNodeFilter) return []; if (!this.$subReady.classFillers) return []; let nodes = LibraryNodes.find(this.libraryNodeFilter, { - sort: { name: 1, order: 1 } + sort: { level: 1, name: 1, order: 1 } }).fetch(); let disabledNodeCount = 0; // Mark classFillers whose condition isn't met or are too big to fit @@ -390,18 +404,19 @@ export default { if (resultNode?.parseType === 'constant') { if (!resultNode.value) { node._disabledBySlotFillerCondition = true; + node._conditionError = node.slotFillerConditionNote || node.slotFillerCondition; disabledNodeCount += 1; } } else { node._disabledBySlotFillerCondition = true; - node._conditionError = toString(resultNode); + node._conditionError = node.slotFillerConditionNote || toString(resultNode); disabledNodeCount += 1; } } catch (e) { console.warn(e); let error = prettifyParseError(e); node._disabledBySlotFillerCondition = true; - node._conditionError = error; + node._conditionError = 'Condition error: ' + error; disabledNodeCount += 1; } } From a262d773c0bc942f4d01ddee119475aca70ffa16 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Tue, 1 Aug 2023 11:28:39 +0200 Subject: [PATCH 2/2] Reduced snackbar timeout to 15s --- app/imports/client/ui/components/snackbars/SnackbarQueue.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/imports/client/ui/components/snackbars/SnackbarQueue.vue b/app/imports/client/ui/components/snackbars/SnackbarQueue.vue index a17e085f..c746bbb4 100644 --- a/app/imports/client/ui/components/snackbars/SnackbarQueue.vue +++ b/app/imports/client/ui/components/snackbars/SnackbarQueue.vue @@ -52,7 +52,7 @@ export default { props: { timeout: { type: Number, - default: 6000000, + default: 15000, }, pause: { type: Number,