From 7a2989492603a9ea46b4dc79ec596265aee43d78 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Mon, 15 Apr 2024 16:34:44 +0300 Subject: [PATCH] add required fields prop --- app/javascript/template_builder/area.vue | 2 +- app/javascript/template_builder/builder.vue | 44 ++++++++++++++++--- .../template_builder/description_modal.vue | 7 +++ app/javascript/template_builder/field.vue | 5 ++- app/javascript/template_builder/fields.vue | 14 +++++- .../template_builder/formula_modal.vue | 6 +++ app/javascript/template_builder/i18n.js | 1 + 7 files changed, 70 insertions(+), 9 deletions(-) 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',