From 75ea462e6450987c6becd171cf76af3f04d670b5 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Thu, 24 Aug 2023 14:51:09 +0200 Subject: [PATCH] Added conditions to action resources --- .../buildComputation/linkTypeDependencies.js | 9 ++++ .../computeByType/computeAction.js | 11 ++++- app/imports/api/properties/Actions.js | 26 ++++++++++++ .../components/actions/ActionCard.vue | 16 +++++++- .../actions/ActionConditionView.vue | 29 +++++++++++++ .../actions/AttributeConsumedView.vue | 2 +- .../properties/forms/ActionConditionForm.vue | 36 ++++++++++++++++ .../forms/ActionConditionsListForm.vue | 41 +++++++++++++++++++ .../ui/properties/forms/ResourcesForm.vue | 25 +++++++++++ .../ui/properties/viewers/ActionViewer.vue | 15 +++++++ 10 files changed, 205 insertions(+), 5 deletions(-) create mode 100644 app/imports/client/ui/properties/components/actions/ActionConditionView.vue create mode 100644 app/imports/client/ui/properties/forms/ActionConditionForm.vue create mode 100644 app/imports/client/ui/properties/forms/ActionConditionsListForm.vue diff --git a/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js b/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js index 4a83ab62..85a7b551 100644 --- a/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js +++ b/app/imports/api/engine/computation/buildComputation/linkTypeDependencies.js @@ -80,6 +80,15 @@ function linkAction(dependencyGraph, prop, { propsById }) { key: `resources.attributesConsumed[${index}].quantity`, }); }); + // Link conditions + prop.resources.conditions?.forEach((con, index) => { + // Link the property to its condition calculation + dependOnCalc({ + dependencyGraph, + prop, + key: `resources.conditions[${index}].condition`, + }); + }); } function linkAdjustment(dependencyGraph, prop) { diff --git a/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js b/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js index 646bd97c..a8243f40 100644 --- a/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js +++ b/app/imports/api/engine/computation/computeComputation/computeByType/computeAction.js @@ -8,13 +8,20 @@ export default function computeAction(computation, node) { } computeResources(computation, node); if (!prop.resources) return; - prop.resources.itemsConsumed.forEach(itemConsumed => { + prop.resources.conditions?.forEach(conObj => { + const condition = conObj.condition; + if (!condition) return; + if (condition.calculation && !condition.value) { + prop.insufficientResources = true; + } + }); + prop.resources.itemsConsumed?.forEach(itemConsumed => { if (!itemConsumed.itemId) return; if (itemConsumed.available < itemConsumed.quantity?.value) { prop.insufficientResources = true; } }); - prop.resources.attributesConsumed.forEach(attConsumed => { + prop.resources.attributesConsumed?.forEach(attConsumed => { if (!attConsumed.variableName) return; if (!(attConsumed.available >= attConsumed.quantity?.value)) { prop.insufficientResources = true; diff --git a/app/imports/api/properties/Actions.js b/app/imports/api/properties/Actions.js index 3de84914..163d938d 100644 --- a/app/imports/api/properties/Actions.js +++ b/app/imports/api/properties/Actions.js @@ -77,6 +77,7 @@ let ActionSchema = createPropertySchema({ 'resources.itemsConsumed': { type: Array, defaultValue: [], + max: 32, }, 'resources.itemsConsumed.$': { type: Object, @@ -104,6 +105,7 @@ let ActionSchema = createPropertySchema({ 'resources.attributesConsumed': { type: Array, defaultValue: [], + max: 32, }, 'resources.attributesConsumed.$': { type: Object, @@ -124,6 +126,30 @@ let ActionSchema = createPropertySchema({ type: 'fieldToCompute', optional: true, }, + 'resources.conditions': { + type: Array, + defaultValue: [], + max: 32, + }, + 'resources.conditions.$': { + type: Object, + }, + 'resources.conditions.$._id': { + type: String, + regEx: SimpleSchema.RegEx.Id, + autoValue() { + if (!this.isSet) return Random.id(); + } + }, + 'resources.conditions.$.condition': { + type: 'fieldToCompute', + optional: true, + }, + 'resources.conditions.$.conditionNote': { + type: String, + optional: true, + max: STORAGE_LIMITS.calculation, + }, // Prevent the property from showing up in the log silent: { type: Boolean, diff --git a/app/imports/client/ui/properties/components/actions/ActionCard.vue b/app/imports/client/ui/properties/components/actions/ActionCard.vue index 9565868f..fd568b69 100644 --- a/app/imports/client/ui/properties/components/actions/ActionCard.vue +++ b/app/imports/client/ui/properties/components/actions/ActionCard.vue @@ -63,9 +63,14 @@