add required fields prop
This commit is contained in:
@@ -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',
|
||||||
|
|||||||
Reference in New Issue
Block a user