add required fields prop

pull/257/head
Pete Matsyburka 2 years ago
parent f9ae79dd5b
commit 7a29894926

@ -68,7 +68,7 @@
@keydown.enter.prevent="onNameEnter" @keydown.enter.prevent="onNameEnter"
@focus="onNameFocus" @focus="onNameFocus"
@blur="onNameBlur" @blur="onNameBlur"
>{{ optionIndexText }} {{ field.name || defaultName }}</span> >{{ optionIndexText }} {{ (defaultField ? (field.title || field.name) : field.name) || defaultName }}</span>
<div <div
v-if="isNameFocus && !['checkbox', 'phone'].includes(field.type)" v-if="isNameFocus && !['checkbox', 'phone'].includes(field.type)"
class="flex items-center ml-1.5" class="flex items-center ml-1.5"

@ -37,7 +37,7 @@
class="btn btn-primary btn-ghost text-base hidden md:flex" class="btn btn-primary btn-ghost text-base hidden md:flex"
:target="template.submitters.length > 1 ? '' : '_blank'" :target="template.submitters.length > 1 ? '' : '_blank'"
:data-turbo-frame="template.submitters.length > 1 ? 'modal' : ''" :data-turbo-frame="template.submitters.length > 1 ? 'modal' : ''"
@click="maybeShowEmptyTemplateAlert" @click="maybeShowErrorTemplateAlert"
> >
<IconWritingSign <IconWritingSign
width="22" width="22"
@ -51,7 +51,7 @@
:href="`/templates/${template.id}/submissions/new?with_link=true`" :href="`/templates/${template.id}/submissions/new?with_link=true`"
data-turbo-frame="modal" data-turbo-frame="modal"
class="white-button md:!px-6" class="white-button md:!px-6"
@click="maybeShowEmptyTemplateAlert" @click="maybeShowErrorTemplateAlert"
> >
<IconUsersPlus <IconUsersPlus
width="20" width="20"
@ -159,7 +159,7 @@
:selected-submitter="selectedSubmitter" :selected-submitter="selectedSubmitter"
:document="document" :document="document"
:is-drag="!!dragField" :is-drag="!!dragField"
:default-fields="defaultFields" :default-fields="[...defaultRequiredFields, ...defaultFields]"
:allow-draw="!onlyDefinedFields" :allow-draw="!onlyDefinedFields"
:default-submitters="defaultSubmitters" :default-submitters="defaultSubmitters"
:draw-field="drawField" :draw-field="drawField"
@ -242,7 +242,8 @@
:with-help="withHelp" :with-help="withHelp"
:default-submitters="defaultSubmitters" :default-submitters="defaultSubmitters"
:draw-field-type="drawFieldType" :draw-field-type="drawFieldType"
:default-fields="defaultFields" :default-fields="[...defaultRequiredFields, ...defaultFields]"
:default-required-fields="defaultRequiredFields"
:field-types="fieldTypes" :field-types="fieldTypes"
:with-sticky-submitters="withStickySubmitters" :with-sticky-submitters="withStickySubmitters"
:only-defined-fields="onlyDefinedFields" :only-defined-fields="onlyDefinedFields"
@ -273,7 +274,7 @@
<MobileFields <MobileFields
v-if="sortedDocuments.length && !drawField && editable" v-if="sortedDocuments.length && !drawField && editable"
:fields="template.fields" :fields="template.fields"
:default-fields="defaultFields" :default-fields="[...defaultRequiredFields, ...defaultFields]"
:field-types="fieldTypes" :field-types="fieldTypes"
:selected-submitter="selectedSubmitter" :selected-submitter="selectedSubmitter"
@select="startFieldDraw($event)" @select="startFieldDraw($event)"
@ -371,6 +372,11 @@ export default {
required: false, required: false,
default: () => [] default: () => []
}, },
defaultRequiredFields: {
type: Array,
required: false,
default: () => []
},
withSelectedFieldType: { withSelectedFieldType: {
type: Boolean, type: Boolean,
required: false, required: false,
@ -425,6 +431,13 @@ export default {
return () => {} return () => {}
} }
}, },
onChange: {
type: Function,
required: false,
default () {
return () => {}
}
},
withStickySubmitters: { withStickySubmitters: {
type: Boolean, type: Boolean,
required: false, required: false,
@ -522,6 +535,11 @@ export default {
return areas return areas
}, },
isAllRequiredFieldsAdded () {
return !this.defaultRequiredFields?.some((f) => {
return !this.template.fields?.some((field) => field.name === f.name)
})
},
selectedField () { selectedField () {
return this.template.fields.find((f) => f.areas?.includes(this.selectedAreaRef.value)) return this.template.fields.find((f) => f.areas?.includes(this.selectedAreaRef.value))
}, },
@ -1093,7 +1111,13 @@ export default {
this.save() 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) { if (!this.template.fields.length) {
e.preventDefault() e.preventDefault()
@ -1101,6 +1125,10 @@ export default {
} }
}, },
onSaveClick () { onSaveClick () {
if (!this.isAllRequiredFieldsAdded) {
return alert(this.t('add_all_required_fields_to_continue'))
}
if (this.template.fields.length) { if (this.template.fields.length) {
this.isSaving = true this.isSaving = true
@ -1131,6 +1159,10 @@ export default {
}) })
}, },
save ({ force } = { force: false }) { save ({ force } = { force: false }) {
if (this.onChange) {
this.onChange(this.template)
}
if (!this.autosave && !force) { if (!this.autosave && !force) {
return Promise.resolve({}) return Promise.resolve({})
} }

@ -34,6 +34,7 @@
v-model="description" v-model="description"
dir="auto" dir="auto"
class="base-textarea !text-base w-full" class="base-textarea !text-base w-full"
:readonly="!editable"
@input="resizeTextarea" @input="resizeTextarea"
/> />
</div> </div>
@ -49,6 +50,7 @@
id="title_field" id="title_field"
v-model="title" v-model="title"
dir="auto" dir="auto"
:readonly="!editable"
class="base-input !text-base w-full" class="base-input !text-base w-full"
> >
</div> </div>
@ -73,6 +75,11 @@ export default {
type: Object, type: Object,
required: true required: true
}, },
editable: {
type: Boolean,
required: false,
default: true
},
buildDefaultName: { buildDefaultName: {
type: Function, type: Function,
required: true required: true

@ -21,7 +21,7 @@
/> />
<Contenteditable <Contenteditable
ref="name" ref="name"
:model-value="field.name || defaultName" :model-value="(defaultField ? (field.title || field.name) : field.name) || defaultName"
:editable="editable && !defaultField" :editable="editable && !defaultField"
:icon-inline="true" :icon-inline="true"
:icon-width="18" :icon-width="18"
@ -235,6 +235,7 @@
<input <input
v-model="field.required" v-model="field.required"
type="checkbox" type="checkbox"
:disabled="!editable || defaultField"
class="toggle toggle-xs" class="toggle toggle-xs"
@update:model-value="save" @update:model-value="save"
> >
@ -481,6 +482,7 @@
> >
<FormulaModal <FormulaModal
:field="field" :field="field"
:editable="editable && !defaultField"
:build-default-name="buildDefaultName" :build-default-name="buildDefaultName"
@close="isShowFormulaModal = false" @close="isShowFormulaModal = false"
/> />
@ -501,6 +503,7 @@
> >
<DescriptionModal <DescriptionModal
:field="field" :field="field"
:editable="editable && !defaultField"
:build-default-name="buildDefaultName" :build-default-name="buildDefaultName"
@close="isShowDescriptionModal = false" @close="isShowDescriptionModal = false"
/> />

@ -86,9 +86,16 @@
:button-width="20" :button-width="20"
/> />
<span class="block pl-0.5"> <span class="block pl-0.5">
{{ field.name }} {{ field.title || field.name }}
</span> </span>
</div> </div>
<span
v-if="defaultRequiredFields.includes(field)"
:data-tip="t('required')"
class="text-red-400 text-3xl pr-1.5 tooltip tooltip-left h-8"
>
*
</span>
</div> </div>
</div> </div>
</template> </template>
@ -210,6 +217,11 @@ export default {
required: false, required: false,
default: () => [] default: () => []
}, },
defaultRequiredFields: {
type: Array,
required: false,
default: () => []
},
onlyDefinedFields: { onlyDefinedFields: {
type: Boolean, type: Boolean,
required: false, required: false,

@ -49,6 +49,7 @@
ref="textarea" ref="textarea"
v-model="formula" v-model="formula"
class="base-textarea !rounded-xl !text-base font-mono w-full !outline-0 !ring-0 !px-3" class="base-textarea !rounded-xl !text-base font-mono w-full !outline-0 !ring-0 !px-3"
:readonly="!editable"
required="true" required="true"
@input="resizeTextarea" @input="resizeTextarea"
/> />
@ -134,6 +135,11 @@ export default {
type: Object, type: Object,
required: true required: true
}, },
editable: {
type: Boolean,
required: false,
default: true
},
buildDefaultName: { buildDefaultName: {
type: Function, type: Function,
required: true required: true

@ -3,6 +3,7 @@ const en = {
field_not_found: 'Field not found', field_not_found: 'Field not found',
clear: 'Clear', clear: 'Clear',
align: 'Align', align: 'Align',
add_all_required_fields_to_continue: 'Add all required fields to continue',
left: 'Left', left: 'Left',
right: 'Right', right: 'Right',
center: 'Center', center: 'Center',

Loading…
Cancel
Save