diff --git a/app/javascript/template_builder/area.vue b/app/javascript/template_builder/area.vue
index cef69348..2aef3c39 100644
--- a/app/javascript/template_builder/area.vue
+++ b/app/javascript/template_builder/area.vue
@@ -68,7 +68,7 @@
@keydown.enter.prevent="onNameEnter"
@focus="onNameFocus"
@blur="onNameBlur"
- >{{ optionIndexText }} {{ field.name || defaultName }}
+ >{{ optionIndexText }} {{ (defaultField ? (field.title || field.name) : field.name) || defaultName }}
[]
},
+ defaultRequiredFields: {
+ type: Array,
+ required: false,
+ default: () => []
+ },
withSelectedFieldType: {
type: Boolean,
required: false,
@@ -425,6 +431,13 @@ export default {
return () => {}
}
},
+ onChange: {
+ type: Function,
+ required: false,
+ default () {
+ return () => {}
+ }
+ },
withStickySubmitters: {
type: Boolean,
required: false,
@@ -522,6 +535,11 @@ export default {
return areas
},
+ isAllRequiredFieldsAdded () {
+ return !this.defaultRequiredFields?.some((f) => {
+ return !this.template.fields?.some((field) => field.name === f.name)
+ })
+ },
selectedField () {
return this.template.fields.find((f) => f.areas?.includes(this.selectedAreaRef.value))
},
@@ -1093,7 +1111,13 @@ export default {
this.save()
},
- maybeShowEmptyTemplateAlert (e) {
+ maybeShowErrorTemplateAlert (e) {
+ if (!this.isAllRequiredFieldsAdded) {
+ e.preventDefault()
+
+ return alert(this.t('add_all_required_fields_to_continue'))
+ }
+
if (!this.template.fields.length) {
e.preventDefault()
@@ -1101,6 +1125,10 @@ export default {
}
},
onSaveClick () {
+ if (!this.isAllRequiredFieldsAdded) {
+ return alert(this.t('add_all_required_fields_to_continue'))
+ }
+
if (this.template.fields.length) {
this.isSaving = true
@@ -1131,6 +1159,10 @@ export default {
})
},
save ({ force } = { force: false }) {
+ if (this.onChange) {
+ this.onChange(this.template)
+ }
+
if (!this.autosave && !force) {
return Promise.resolve({})
}
diff --git a/app/javascript/template_builder/description_modal.vue b/app/javascript/template_builder/description_modal.vue
index 2234f8a0..277aa515 100644
--- a/app/javascript/template_builder/description_modal.vue
+++ b/app/javascript/template_builder/description_modal.vue
@@ -34,6 +34,7 @@
v-model="description"
dir="auto"
class="base-textarea !text-base w-full"
+ :readonly="!editable"
@input="resizeTextarea"
/>
@@ -49,6 +50,7 @@
id="title_field"
v-model="title"
dir="auto"
+ :readonly="!editable"
class="base-input !text-base w-full"
>
@@ -73,6 +75,11 @@ export default {
type: Object,
required: true
},
+ editable: {
+ type: Boolean,
+ required: false,
+ default: true
+ },
buildDefaultName: {
type: Function,
required: true
diff --git a/app/javascript/template_builder/field.vue b/app/javascript/template_builder/field.vue
index 6f03612b..52d71b93 100644
--- a/app/javascript/template_builder/field.vue
+++ b/app/javascript/template_builder/field.vue
@@ -21,7 +21,7 @@
/>
@@ -481,6 +482,7 @@
>
@@ -501,6 +503,7 @@
>
diff --git a/app/javascript/template_builder/fields.vue b/app/javascript/template_builder/fields.vue
index 9b689eec..aabe8a23 100644
--- a/app/javascript/template_builder/fields.vue
+++ b/app/javascript/template_builder/fields.vue
@@ -86,9 +86,16 @@
:button-width="20"
/>
- {{ field.name }}
+ {{ field.title || field.name }}
+
+ *
+
@@ -210,6 +217,11 @@ export default {
required: false,
default: () => []
},
+ defaultRequiredFields: {
+ type: Array,
+ required: false,
+ default: () => []
+ },
onlyDefinedFields: {
type: Boolean,
required: false,
diff --git a/app/javascript/template_builder/formula_modal.vue b/app/javascript/template_builder/formula_modal.vue
index 5c2b0e13..402e5bdd 100644
--- a/app/javascript/template_builder/formula_modal.vue
+++ b/app/javascript/template_builder/formula_modal.vue
@@ -49,6 +49,7 @@
ref="textarea"
v-model="formula"
class="base-textarea !rounded-xl !text-base font-mono w-full !outline-0 !ring-0 !px-3"
+ :readonly="!editable"
required="true"
@input="resizeTextarea"
/>
@@ -134,6 +135,11 @@ export default {
type: Object,
required: true
},
+ editable: {
+ type: Boolean,
+ required: false,
+ default: true
+ },
buildDefaultName: {
type: Function,
required: true
diff --git a/app/javascript/template_builder/i18n.js b/app/javascript/template_builder/i18n.js
index bb9ef62a..4ca50a86 100644
--- a/app/javascript/template_builder/i18n.js
+++ b/app/javascript/template_builder/i18n.js
@@ -3,6 +3,7 @@ const en = {
field_not_found: 'Field not found',
clear: 'Clear',
align: 'Align',
+ add_all_required_fields_to_continue: 'Add all required fields to continue',
left: 'Left',
right: 'Right',
center: 'Center',