|
5 | 5 | </p>
|
6 | 6 | </div>
|
7 | 7 | <form v-else-if="dataForm" @submit.prevent="">
|
| 8 | + <template v-if='form.show_progress_bar'> |
| 9 | + <div v-if='isIframe' class='mb-4 p-2'> |
| 10 | + <div class='w-full h-2 bg-gray-200 dark:bg-gray-600 relative border rounded-full overflow-hidden'> |
| 11 | + <div class='h-full transition-all duration-300 rounded-r-full' |
| 12 | + :class="{ 'w-0': formProgress === 0 }" |
| 13 | + :style="{ width: formProgress + '%', background: form.color }" |
| 14 | + /> |
| 15 | + </div> |
| 16 | + </div> |
| 17 | + <div v-else class='fixed top-0 left-0 right-0 z-50'> |
| 18 | + <div class='w-full h-[0.2rem] bg-gray-200 dark:bg-gray-600 relative overflow-hidden'> |
| 19 | + <div class='h-full transition-all duration-300' |
| 20 | + :class="{ 'w-0': formProgress === 0 }" |
| 21 | + :style="{ width: formProgress + '%', background: form.color }" |
| 22 | + /> |
| 23 | + </div> |
| 24 | + </div> |
| 25 | + </template> |
8 | 26 | <transition name="fade" mode="out-in">
|
9 | 27 | <div :key="currentFieldGroupIndex" class="form-group flex flex-wrap w-full">
|
10 | 28 | <draggable v-model="currentFields"
|
@@ -147,6 +165,15 @@ export default {
|
147 | 165 | groups.push(currentGroup)
|
148 | 166 | return groups
|
149 | 167 | },
|
| 168 | + formProgress () { |
| 169 | + const requiredFields = this.fields.filter(field => field.required) |
| 170 | + if (requiredFields.length === 0) { |
| 171 | + return 100 |
| 172 | + } |
| 173 | + const completedFields = requiredFields.filter(field => ![null, undefined, ''].includes(this.dataFormValue[field.id])) |
| 174 | + const progress = (completedFields.length / requiredFields.length) * 100 |
| 175 | + return Math.round(progress) |
| 176 | + }, |
150 | 177 | currentFields: {
|
151 | 178 | get () {
|
152 | 179 | return this.fieldGroups[this.currentFieldGroupIndex]
|
|
0 commit comments