Files
docuseal/app/javascript/template_builder/preview.vue
T

200 lines
6.1 KiB
Vue
Raw Normal View History

2023-05-31 00:50:43 +03:00
<template>
<div>
<div class="relative">
<img
:src="previewImage.url"
:width="previewImage.metadata.width"
:height="previewImage.metadata.height"
class="rounded border"
loading="lazy"
>
<div
2024-12-07 01:35:59 +02:00
class="group flex justify-end cursor-pointer top-0 bottom-0 left-0 right-0 absolute p-1 hover:bg-black/10 transition-colors"
2023-05-31 00:50:43 +03:00
@click="$emit('scroll-to', item)"
>
2023-11-04 01:19:32 +02:00
<div
v-if="editable"
class="flex justify-between w-full"
>
2024-12-07 01:35:59 +02:00
<div
style="width: 26px"
class="flex flex-col justify-between group-hover:opacity-100"
:class="{'opacity-0': !item.conditions?.length }"
>
<div>
<button
2025-03-18 17:34:11 +02:00
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 document-control-button"
2024-12-07 01:35:59 +02:00
@click.stop="isShowConditionsModal = true"
>
<IconRouteAltLeft
:width="14"
:stroke-width="1.6"
/>
</button>
</div>
</div>
2023-07-26 20:35:53 +03:00
<div class="">
<ReplaceButton
2023-11-09 10:54:56 +02:00
v-if="withReplaceButton"
2023-07-26 20:35:53 +03:00
:template-id="template.id"
2023-09-05 20:33:40 +03:00
:accept-file-types="acceptFileTypes"
2023-07-26 20:35:53 +03:00
class="opacity-0 group-hover:opacity-100"
@click.stop
@success="$emit('replace', { replaceSchemaItem: item, ...$event })"
/>
2023-05-31 00:50:43 +03:00
</div>
<div
2023-07-26 20:35:53 +03:00
class="flex flex-col justify-between opacity-0 group-hover:opacity-100"
2023-05-31 00:50:43 +03:00
>
2023-07-26 20:35:53 +03:00
<div>
<button
2025-03-18 17:34:11 +02:00
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 document-control-button"
2023-07-26 20:35:53 +03:00
style="width: 24px; height: 24px"
@click.stop="$emit('remove', item)"
>
&times;
</button>
</div>
<div
class="flex flex-col space-y-1"
2023-05-31 00:50:43 +03:00
>
2025-01-04 14:01:09 +02:00
<span
:data-tip="t('reorder_fields')"
class="tooltip tooltip-left before:text-xs"
2023-07-26 20:35:53 +03:00
>
2025-01-04 14:01:09 +02:00
<button
2025-03-18 17:34:11 +02:00
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 document-control-button"
2025-01-04 14:01:09 +02:00
@click.stop="$emit('reorder', item)"
>
<IconSortDescending2
:width="18"
:height="18"
:stroke-width="1.6"
/>
</button>
</span>
<template v-if="withArrows">
<button
2025-03-18 17:34:11 +02:00
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 document-control-button"
2025-01-04 14:01:09 +02:00
style="width: 24px; height: 24px"
@click.stop="$emit('up', item)"
>
&uarr;
</button>
<button
2025-03-18 17:34:11 +02:00
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 document-control-button"
2025-01-04 14:01:09 +02:00
style="width: 24px; height: 24px"
@click.stop="$emit('down', item)"
>
&darr;
</button>
</template>
2023-07-26 20:35:53 +03:00
</div>
2023-05-31 00:50:43 +03:00
</div>
</div>
</div>
</div>
2025-03-18 17:34:11 +02:00
<div class="flex pb-2 pt-1.5 document-preview-name">
2023-05-31 00:50:43 +03:00
<Contenteditable
:model-value="item.name"
:icon-width="16"
2023-12-20 21:58:47 +02:00
:editable="editable"
2023-06-03 00:53:46 +03:00
style="max-width: 95%"
2023-05-31 00:50:43 +03:00
class="mx-auto"
@update:model-value="onUpdateName"
/>
</div>
2025-01-10 16:00:14 +02:00
<Teleport
v-if="isShowConditionsModal"
:to="modalContainerEl"
>
<ConditionsModal
:item="item"
:build-default-name="buildDefaultName"
@close="isShowConditionsModal = false"
/>
</Teleport>
2023-05-31 00:50:43 +03:00
</div>
</template>
<script>
import Contenteditable from './contenteditable'
2023-07-26 20:35:53 +03:00
import Upload from './upload'
2025-01-04 14:01:09 +02:00
import { IconRouteAltLeft, IconSortDescending2 } from '@tabler/icons-vue'
2024-12-07 01:35:59 +02:00
import ConditionsModal from './conditions_modal'
2023-07-26 20:35:53 +03:00
import ReplaceButton from './replace'
2024-12-07 01:35:59 +02:00
import Field from './field'
import FieldType from './field_type'
2023-05-31 00:50:43 +03:00
export default {
name: 'DocumentPreview',
components: {
2023-07-26 20:35:53 +03:00
Contenteditable,
2024-12-07 01:35:59 +02:00
IconRouteAltLeft,
ConditionsModal,
2025-01-04 14:01:09 +02:00
ReplaceButton,
IconSortDescending2
2023-05-31 00:50:43 +03:00
},
2024-12-07 01:35:59 +02:00
inject: ['t'],
2023-05-31 00:50:43 +03:00
props: {
item: {
type: Object,
required: true
},
2023-07-26 20:35:53 +03:00
template: {
type: Object,
required: true
},
2023-05-31 00:50:43 +03:00
document: {
type: Object,
required: true
},
2023-11-04 01:19:32 +02:00
editable: {
type: Boolean,
required: false,
default: true
},
2023-09-05 20:33:40 +03:00
acceptFileTypes: {
type: String,
required: false,
default: 'image/*, application/pdf'
},
2023-11-09 10:54:56 +02:00
withReplaceButton: {
type: Boolean,
required: true,
default: true
},
2023-05-31 00:50:43 +03:00
withArrows: {
type: Boolean,
required: false,
default: true
}
},
2025-01-04 14:01:09 +02:00
emits: ['scroll-to', 'change', 'remove', 'up', 'down', 'replace', 'reorder'],
2024-12-07 01:35:59 +02:00
data () {
return {
isShowConditionsModal: false
}
},
2023-05-31 00:50:43 +03:00
computed: {
2024-12-07 01:35:59 +02:00
fieldNames: FieldType.computed.fieldNames,
fieldLabels: FieldType.computed.fieldLabels,
2023-05-31 00:50:43 +03:00
previewImage () {
2023-10-22 01:54:20 +03:00
return [...this.document.preview_images].sort((a, b) => parseInt(a.filename) - parseInt(b.filename))[0]
2024-12-07 01:35:59 +02:00
},
modalContainerEl () {
return this.$el.getRootNode().querySelector('#docuseal_modal_container')
2023-05-31 00:50:43 +03:00
}
},
methods: {
2023-07-26 20:35:53 +03:00
upload: Upload.methods.upload,
2024-12-07 01:35:59 +02:00
buildDefaultName: Field.methods.buildDefaultName,
2023-05-31 00:50:43 +03:00
onUpdateName (value) {
this.item.name = value
this.$emit('change')
}
}
}
</script>