add complete button

This commit is contained in:
Pete Matsyburka
2024-11-07 20:58:43 +02:00
parent 0b0f0b497e
commit c79fca75f3
3 changed files with 77 additions and 5 deletions
+64 -4
View File
@@ -24,6 +24,44 @@
:fields="formulaFields"
:values="values"
/>
<Teleport
v-if="completeButtonToRef"
:to="completeButtonToRef"
>
<span
v-if="(emptyValueRequiredStep && ((stepFields.length - 1) !== currentStep || currentStepFields !== emptyValueRequiredStep)) || isCompleted"
class="tooltip-left"
:class="{ tooltip: !isCompleted }"
:data-tip="t('fill_all_required_fields_to_complete')"
>
<button
class="btn btn-sm btn-neutral text-white px-4 w-full flex justify-center btn-disabled pointer-events-auto"
@click="[isFormVisible = true, !isCompleted && goToStep(stepFields.indexOf(emptyValueRequiredStep), true, false)]"
>
{{ t('complete') }}
</button>
</span>
<button
v-else
id="complete_form_button"
class="btn btn-sm btn-neutral text-white px-4 w-full flex justify-center"
form="steps_form"
type="submit"
name="completed"
value="true"
:disabled="isSubmittingComplete"
>
<span class="flex items-center">
<IconInnerShadowTop
v-if="isSubmittingComplete"
class="mr-1 animate-spin w-5 h-5"
/>
<span>
{{ t('complete') }}
</span>
</span>
</button>
</Teleport>
<button
v-if="!isFormVisible"
id="expand_form_button"
@@ -74,6 +112,7 @@
>
<form
v-if="!isCompleted && !isInvite"
id="steps_form"
ref="form"
:action="submitPath"
method="post"
@@ -592,6 +631,11 @@ export default {
required: false,
default: false
},
completeButtonToRef: {
type: Object,
required: false,
default: null
},
attachments: {
type: Array,
required: false,
@@ -772,6 +816,7 @@ export default {
phoneVerifiedValues: {},
orientation: screen?.orientation?.type,
isSubmitting: false,
isSubmittingComplete: false,
submittedValues: {},
recalculateButtonDisabledKey: ''
}
@@ -780,6 +825,13 @@ export default {
isMobile () {
return /android|iphone|ipad/i.test(navigator.userAgent)
},
emptyValueRequiredStep () {
return this.stepFields.find((fields, index) => {
return fields.some((f) => {
return f.required && isEmpty(this.values[f.uuid])
})
})
},
submitButtonText () {
if (this.alwaysMinimize) {
return this.t('submit')
@@ -1146,9 +1198,15 @@ export default {
scrollIntoArea (area) {
return this.$refs.areas.scrollIntoArea(area)
},
async submitStep () {
async submitStep (e) {
this.isSubmitting = true
const forceComplete = e.submitter?.getAttribute('name') === 'completed'
if (forceComplete) {
this.isSubmittingComplete = true
}
const submitStep = this.currentStep
const stepPromise = ['signature', 'phone', 'initials', 'payment'].includes(this.currentField.type)
@@ -1157,7 +1215,7 @@ export default {
stepPromise().then(async () => {
const emptyRequiredField = this.stepFields.find((fields, index) => {
if (index >= submitStep) {
if (forceComplete ? index === submitStep : index >= submitStep) {
return false
}
@@ -1167,7 +1225,7 @@ export default {
})
const formData = new FormData(this.$refs.form)
const isLastStep = submitStep === this.stepFields.length - 1
const isLastStep = (submitStep === this.stepFields.length - 1) || forceComplete
if (isLastStep && !emptyRequiredField && !this.inviteSubmitters.length) {
formData.append('completed', 'true')
@@ -1192,7 +1250,7 @@ export default {
return Promise.reject(new Error(data.error))
}
const nextStep = (isLastStep && emptyRequiredField) || this.stepFields[submitStep + 1]
const nextStep = (isLastStep && emptyRequiredField) || (forceComplete ? null : this.stepFields[submitStep + 1])
if (nextStep) {
if (this.alwaysMinimize) {
@@ -1213,6 +1271,7 @@ export default {
console.error(error)
}).finally(() => {
this.isSubmitting = false
this.isSubmittingComplete = false
})
}).catch(error => {
if (error?.message === 'Image too small') {
@@ -1222,6 +1281,7 @@ export default {
}
}).finally(() => {
this.isSubmitting = false
this.isSubmittingComplete = false
})
},
minimizeForm () {