From f8467b2da1891ec2e4d69a4b506783a612cf0181 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Thu, 21 Aug 2025 13:59:44 +0300 Subject: [PATCH] nested formula --- .../submission_form/formula_areas.vue | 20 ++++++++++++++++++- .../template_builder/formula_modal.vue | 18 ++++++++++++----- lib/submitters/submit_values.rb | 16 +++++++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/app/javascript/submission_form/formula_areas.vue b/app/javascript/submission_form/formula_areas.vue index 062e2f67..d5f80507 100644 --- a/app/javascript/submission_form/formula_areas.vue +++ b/app/javascript/submission_form/formula_areas.vue @@ -58,6 +58,13 @@ export default { computed: { isInlineSize () { return CSS.supports('container-type: size') + }, + fieldsUuidIndex () { + return this.fields.reduce((acc, field) => { + acc[field.uuid] = field + + return acc + }, {}) } }, async mounted () { @@ -96,8 +103,19 @@ export default { findPageElementForArea (area) { return (this.$root.$el?.parentNode?.getRootNode() || document).getElementById(`page-${area.attachment_uuid}-${area.page}`) }, + normalizeFormula (formula, depth = 0) { + if (depth > 10) return formula + + return formula.replace(/{{(.*?)}}/g, (match, uuid) => { + if (this.fieldsUuidIndex[uuid]) { + return `(${this.normalizeFormula(this.fieldsUuidIndex[uuid].preferences.formula, depth + 1)})` + } else { + return match + } + }) + }, calculateFormula (field) { - const transformedFormula = field.preferences.formula.replace(/{{(.*?)}}/g, (match, uuid) => { + const transformedFormula = this.normalizeFormula(field.preferences.formula).replace(/{{(.*?)}}/g, (match, uuid) => { return this.readonlyValues[uuid] || this.values[uuid] || 0.0 }) diff --git a/app/javascript/template_builder/formula_modal.vue b/app/javascript/template_builder/formula_modal.vue index 6ce34dbe..3d41c221 100644 --- a/app/javascript/template_builder/formula_modal.vue +++ b/app/javascript/template_builder/formula_modal.vue @@ -28,14 +28,21 @@ class="link" >{{ t('available_in_pro') }} -
+