optimize form render with many fields

This commit is contained in:
Pete Matsyburka
2023-12-31 17:23:27 +02:00
parent fd4e15003a
commit f358f24abb
5 changed files with 46 additions and 13 deletions
+10 -3
View File
@@ -326,18 +326,25 @@
:can-send-email="canSendEmail && !!submitter.email"
:submitter-slug="submitterSlug"
/>
<div class="flex justify-center">
<div class="flex items-center mt-5 mb-1">
<div
v-if="stepFields.length < 80"
class="flex justify-center"
>
<div class="flex items-center mt-4 mb-1 flex-wrap">
<a
v-for="(step, index) in stepFields"
:key="step[0].uuid"
href="#"
class="inline border border-base-300 h-3 w-3 rounded-full mx-1"
class="inline border border-base-300 h-3 w-3 rounded-full mx-1 mt-1"
:class="{ 'bg-base-300': index === currentStep, 'bg-base-content': (index < currentStep && stepFields[index].every((f) => !f.required || ![null, undefined, ''].includes(values[f.uuid]))) || isCompleted, 'bg-white': index > currentStep }"
@click.prevent="isCompleted ? '' : [saveStep(), goToStep(step, true)]"
/>
</div>
</div>
<div
v-else
class="mt-5"
/>
</div>
</div>
</template>
+6 -4
View File
@@ -205,7 +205,7 @@
<div
v-if="withFieldsList"
class="relative w-80 flex-none mt-1 pr-4 pl-0.5 hidden md:block"
:class="drawField ? 'overflow-hidden' : 'overflow-auto'"
:class="drawField ? 'overflow-hidden' : 'overflow-y-auto overflow-x-hidden'"
>
<div
v-if="drawField"
@@ -888,9 +888,11 @@ export default {
})
},
save () {
if (this.$el.closest('template-builder')) {
this.$el.closest('template-builder').dataset.template = JSON.stringify(this.template)
}
this.$nextTick(() => {
if (this.$el.closest('template-builder')) {
this.$el.closest('template-builder').dataset.template = JSON.stringify(this.template)
}
})
this.pushUndo()
+5 -1
View File
@@ -72,6 +72,8 @@
<span
v-else
class="dropdown dropdown-end"
@mouseenter="renderDropdown = true"
@touchstart="renderDropdown = true"
>
<label
tabindex="0"
@@ -84,6 +86,7 @@
/>
</label>
<ul
v-if="renderDropdown"
tabindex="0"
class="mt-1.5 dropdown-content menu menu-xs p-2 shadow bg-base-100 rounded-box w-52 z-10"
draggable="true"
@@ -331,7 +334,8 @@ export default {
data () {
return {
isNameFocus: false,
showPaymentModal: false
showPaymentModal: false,
renderDropdown: false
}
},
computed: {
@@ -1,5 +1,9 @@
<template>
<div v-if="mobileView">
<div
v-if="mobileView"
@mouseenter="renderDropdown = true"
@touchstart="renderDropdown = true"
>
<div class="flex space-x-2 items-end">
<div class="group/contenteditable-container bg-base-100 rounded-md p-2 border border-base-300 w-full flex justify-between items-end">
<div class="flex items-center space-x-2">
@@ -29,7 +33,7 @@
/>
</label>
<ul
v-if="editable"
v-if="editable && renderDropdown"
tabindex="0"
class="rounded-md min-w-max mb-2"
:class="menuClasses"
@@ -85,6 +89,8 @@
<div
v-else
class="dropdown"
@mouseenter="renderDropdown = true"
@touchstart="renderDropdown = true"
>
<label
v-if="compact"
@@ -125,7 +131,7 @@
</span>
</label>
<ul
v-if="editable || !compact"
v-if="(editable || !compact) && renderDropdown"
tabindex="0"
:class="menuClasses"
@click="closeDropdown"
@@ -222,6 +228,11 @@ export default {
}
},
emits: ['update:model-value', 'remove', 'new-submitter', 'name-change'],
data () {
return {
renderDropdown: false
}
},
computed: {
colors () {
return [
+11 -2
View File
@@ -1,5 +1,9 @@
<template>
<span class="dropdown">
<span
class="dropdown"
@mouseenter="renderDropdown = true"
@touchstart="renderDropdown = true"
>
<slot>
<label
tabindex="0"
@@ -15,7 +19,7 @@
</label>
</slot>
<ul
v-if="editable"
v-if="editable && renderDropdown"
tabindex="0"
class="dropdown-content menu menu-xs p-2 shadow rounded-box w-52 z-10 mb-3"
:class="menuClasses"
@@ -78,6 +82,11 @@ export default {
}
},
emits: ['update:model-value'],
data () {
return {
renderDropdown: false
}
},
computed: {
fieldNames () {
return {