mirror of https://github.com/docusealco/docuseal
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							156 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
	
	
							156 lines
						
					
					
						
							3.4 KiB
						
					
					
				<template>
 | 
						|
  <div
 | 
						|
    class="flex"
 | 
						|
    style="max-height: calc(100vh - 24px)"
 | 
						|
  >
 | 
						|
    <div
 | 
						|
      class="overflow-auto w-full"
 | 
						|
      style="max-width: 280px"
 | 
						|
    >
 | 
						|
      Show documents preview (not pages but documents)
 | 
						|
      Allow to edit name
 | 
						|
      Allow to reorder
 | 
						|
      {{ flow.schema }}
 | 
						|
      <Upload
 | 
						|
        :flow-id="flow.id"
 | 
						|
        @success="updateFromUpload"
 | 
						|
      />
 | 
						|
      <button
 | 
						|
        class="bg-green-300"
 | 
						|
        @click="save"
 | 
						|
      >
 | 
						|
        Save changes
 | 
						|
      </button>
 | 
						|
 | 
						|
      <a
 | 
						|
        :href="`/flows/${flow.id}/submissions`"
 | 
						|
      >
 | 
						|
        Add Recepients
 | 
						|
      </a>
 | 
						|
    </div>
 | 
						|
    <div class="w-full overflow-auto">
 | 
						|
      <Document
 | 
						|
        v-for="document in sortedDocuments"
 | 
						|
        :key="document.uuid"
 | 
						|
        :areas-index="fieldAreasIndex[document.uuid]"
 | 
						|
        :document="document"
 | 
						|
        :is-draw="!!drawField"
 | 
						|
        :is-drag="!!dragFieldType"
 | 
						|
        @draw="onDraw"
 | 
						|
        @drop-field="onDropfield"
 | 
						|
      />
 | 
						|
    </div>
 | 
						|
    <div
 | 
						|
      class="w-full relative"
 | 
						|
      :class="drawField ? 'overflow-hidden' : 'overflow-auto'"
 | 
						|
      style="max-width: 280px"
 | 
						|
    >
 | 
						|
      <div
 | 
						|
        v-if="drawField"
 | 
						|
        class="sticky inset-0 bg-white h-full"
 | 
						|
      >
 | 
						|
        Draw {{ drawField.name }} field on the page
 | 
						|
        <button @click="drawField = false">
 | 
						|
          Cancel
 | 
						|
        </button>
 | 
						|
      </div>
 | 
						|
      <div>
 | 
						|
        FIelds
 | 
						|
        <Fields
 | 
						|
          ref="fields"
 | 
						|
          v-model:fields="flow.fields"
 | 
						|
          @set-draw="drawField = $event"
 | 
						|
          @set-drag="dragFieldType = $event"
 | 
						|
          @drag-end="dragFieldType = null"
 | 
						|
        />
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
import Upload from './upload'
 | 
						|
import Fields from './fields'
 | 
						|
import Document from './document'
 | 
						|
 | 
						|
export default {
 | 
						|
  name: 'FlowBuilder',
 | 
						|
  components: {
 | 
						|
    Upload,
 | 
						|
    Document,
 | 
						|
    Fields
 | 
						|
  },
 | 
						|
  props: {
 | 
						|
    flow: {
 | 
						|
      type: Object,
 | 
						|
      required: true
 | 
						|
    }
 | 
						|
  },
 | 
						|
  data () {
 | 
						|
    return {
 | 
						|
      drawField: null,
 | 
						|
      dragFieldType: null
 | 
						|
    }
 | 
						|
  },
 | 
						|
  computed: {
 | 
						|
    fieldAreasIndex () {
 | 
						|
      const areas = {}
 | 
						|
 | 
						|
      this.flow.fields.forEach((f) => {
 | 
						|
        (f.areas || []).forEach((a) => {
 | 
						|
          areas[a.attachment_uuid] ||= {}
 | 
						|
 | 
						|
          const acc = (areas[a.attachment_uuid][a.page] ||= [])
 | 
						|
 | 
						|
          acc.push({ area: a, field: f })
 | 
						|
        })
 | 
						|
      })
 | 
						|
 | 
						|
      return areas
 | 
						|
    },
 | 
						|
    sortedDocuments () {
 | 
						|
      return this.flow.schema.map((item) => {
 | 
						|
        return this.flow.documents.find(doc => doc.uuid === item.attachment_uuid)
 | 
						|
      })
 | 
						|
    }
 | 
						|
  },
 | 
						|
  mounted () {
 | 
						|
    document.addEventListener('keyup', this.disableDrawOnEsc)
 | 
						|
  },
 | 
						|
  unmounted () {
 | 
						|
    document.removeEventListener('keyup', this.disableDrawOnEsc)
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    disableDrawOnEsc (e) {
 | 
						|
      if (e.code === 'Escape') {
 | 
						|
        this.drawField = null
 | 
						|
      }
 | 
						|
    },
 | 
						|
    onDraw (area) {
 | 
						|
      this.drawField.areas ||= []
 | 
						|
      this.drawField.areas.push(area)
 | 
						|
 | 
						|
      this.drawField = null
 | 
						|
    },
 | 
						|
    onDropfield (area) {
 | 
						|
      this.$refs.fields.addField(this.dragFieldType, area)
 | 
						|
    },
 | 
						|
    updateFromUpload ({ schema, documents }) {
 | 
						|
      this.flow.schema.push(...schema)
 | 
						|
      this.flow.documents.push(...documents)
 | 
						|
 | 
						|
      this.save()
 | 
						|
    },
 | 
						|
    save () {
 | 
						|
      return fetch(`/api/flows/${this.flow.id}`, {
 | 
						|
        method: 'PUT',
 | 
						|
        body: JSON.stringify({ flow: this.flow }),
 | 
						|
        headers: { 'Content-Type': 'application/json' }
 | 
						|
      }).then((resp) => {
 | 
						|
        console.log(resp)
 | 
						|
      })
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
</script>
 |