document conditions

This commit is contained in:
Pete Matsyburka
2024-12-07 01:35:59 +02:00
parent 38b5eccb65
commit 4429d742b3
17 changed files with 252 additions and 65 deletions
+1 -1
View File
@@ -257,7 +257,7 @@
:to="modalContainerEl"
>
<ConditionsModal
:field="field"
:item="field"
:build-default-name="buildDefaultName"
@close="isShowConditionsModal = false"
/>
@@ -362,6 +362,7 @@
:default-submitters="defaultSubmitters"
:draw-field-type="drawFieldType"
:default-fields="[...defaultRequiredFields, ...defaultFields]"
:template="template"
:default-required-fields="defaultRequiredFields"
:field-types="fieldTypes"
:with-sticky-submitters="withStickySubmitters"
@@ -1023,6 +1024,22 @@ export default {
if (!field.areas.length) {
this.template.fields.splice(this.template.fields.indexOf(field), 1)
this.template.fields.forEach((f) => {
(f.conditions || []).forEach((c) => {
if (c.field_uuid === field.uuid) {
f.conditions.splice(f.conditions.indexOf(c), 1)
}
})
})
this.template.schema.forEach((item) => {
(item.conditions || []).forEach((c) => {
if (c.field_uuid === field.uuid) {
item.conditions.splice(item.conditions.indexOf(c), 1)
}
})
})
}
this.save()
@@ -9,7 +9,7 @@
<div class="modal-box pt-4 pb-6 px-6 mt-20 max-h-none w-full max-w-xl">
<div class="flex justify-between items-center border-b pb-2 mb-2 font-medium">
<span>
{{ t('condition') }} - {{ field.name || buildDefaultName(field, template.fields) }}
{{ t('condition') }} - {{ item.name || buildDefaultName(item, template.fields) }}
</span>
<a
href="#"
@@ -138,12 +138,12 @@
</button>
</form>
<div
v-if="field.conditions?.[0]?.field_uuid"
v-if="item.conditions?.[0]?.field_uuid"
class="text-center w-full mt-4"
>
<button
class="link"
@click="[conditions = [], delete field.conditions, validateSaveAndClose()]"
@click="[conditions = [], delete item.conditions, validateSaveAndClose()]"
>
{{ t('remove_condition') }}
</button>
@@ -158,7 +158,7 @@ export default {
name: 'ConditionModal',
inject: ['t', 'save', 'template', 'withConditions'],
props: {
field: {
item: {
type: Object,
required: true
},
@@ -170,22 +170,26 @@ export default {
emits: ['close'],
data () {
return {
conditions: this.field.conditions?.[0] ? JSON.parse(JSON.stringify(this.field.conditions)) : [{}]
conditions: this.item.conditions?.[0] ? JSON.parse(JSON.stringify(this.item.conditions)) : [{}]
}
},
computed: {
fields () {
return this.template.fields.reduce((acc, f) => {
if (f !== this.field && f.submitter_uuid === this.field.submitter_uuid) {
acc.push(f)
}
if (this.item.submitter_uuid) {
return this.template.fields.reduce((acc, f) => {
if (f !== this.item && f.submitter_uuid === this.item.submitter_uuid) {
acc.push(f)
}
return acc
}, [])
return acc
}, [])
} else {
return this.template.fields
}
}
},
created () {
this.field.conditions ||= []
this.item.conditions ||= []
},
methods: {
conditionField (condition) {
@@ -219,9 +223,9 @@ export default {
}
if (this.conditions.find((f) => f.field_uuid)) {
this.field.conditions = this.conditions
this.item.conditions = this.conditions
} else {
delete this.field.conditions
delete this.item.conditions
}
this.save()
+2 -2
View File
@@ -236,7 +236,7 @@
:to="modalContainerEl"
>
<ConditionsModal
:field="field"
:item="field"
:build-default-name="buildDefaultName"
@close="isShowConditionsModal = false"
/>
@@ -365,7 +365,7 @@ export default {
} else {
const typeIndex = fields.filter((f) => f.type === field.type).indexOf(field)
if (this.field.type === 'heading') {
if (field.type === 'heading') {
return `${this.fieldNames[field.type]} ${typeIndex + 1}`
} else {
return `${this.fieldLabels[field.type]} ${typeIndex + 1}`
@@ -229,6 +229,10 @@ export default {
type: Array,
required: true
},
template: {
type: Object,
required: true
},
withHelp: {
type: Boolean,
required: false,
@@ -380,6 +384,14 @@ export default {
})
})
this.template.schema.forEach((item) => {
(item.conditions || []).forEach((c) => {
if (c.field_uuid === field.uuid) {
item.conditions.splice(item.conditions.indexOf(c), 1)
}
})
})
this.save()
}
}
+46 -2
View File
@@ -9,14 +9,30 @@
loading="lazy"
>
<div
class="group flex justify-end cursor-pointer top-0 bottom-0 left-0 right-0 absolute p-1"
class="group flex justify-end cursor-pointer top-0 bottom-0 left-0 right-0 absolute p-1 hover:bg-black/10 transition-colors"
@click="$emit('scroll-to', item)"
>
<div
v-if="editable"
class="flex justify-between w-full"
>
<div style="width: 26px" />
<div
style="width: 26px"
class="flex flex-col justify-between group-hover:opacity-100"
:class="{'opacity-0': !item.conditions?.length }"
>
<div>
<button
class="btn border-base-200 bg-white text-base-content btn-xs rounded hover:text-base-100 hover:bg-base-content hover:border-base-content w-full transition-colors p-0"
@click.stop="isShowConditionsModal = true"
>
<IconRouteAltLeft
:width="14"
:stroke-width="1.6"
/>
</button>
</div>
</div>
<div class="">
<ReplaceButton
v-if="withReplaceButton"
@@ -73,19 +89,36 @@
/>
</div>
</div>
<Teleport
v-if="isShowConditionsModal"
:to="modalContainerEl"
>
<ConditionsModal
:item="item"
:build-default-name="buildDefaultName"
@close="isShowConditionsModal = false"
/>
</Teleport>
</template>
<script>
import Contenteditable from './contenteditable'
import Upload from './upload'
import { IconRouteAltLeft } from '@tabler/icons-vue'
import ConditionsModal from './conditions_modal'
import ReplaceButton from './replace'
import Field from './field'
import FieldType from './field_type'
export default {
name: 'DocumentPreview',
components: {
Contenteditable,
IconRouteAltLeft,
ConditionsModal,
ReplaceButton
},
inject: ['t'],
props: {
item: {
type: Object,
@@ -121,13 +154,24 @@ export default {
}
},
emits: ['scroll-to', 'change', 'remove', 'up', 'down', 'replace'],
data () {
return {
isShowConditionsModal: false
}
},
computed: {
fieldNames: FieldType.computed.fieldNames,
fieldLabels: FieldType.computed.fieldLabels,
previewImage () {
return [...this.document.preview_images].sort((a, b) => parseInt(a.filename) - parseInt(b.filename))[0]
},
modalContainerEl () {
return this.$el.getRootNode().querySelector('#docuseal_modal_container')
}
},
methods: {
upload: Upload.methods.upload,
buildDefaultName: Field.methods.buildDefaultName,
onUpdateName (value) {
this.item.name = value