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.
		
		
		
		
		
			
		
			
				
					
					
						
							103 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
	
	
							103 lines
						
					
					
						
							2.3 KiB
						
					
					
				<template>
 | 
						|
  <div
 | 
						|
    class="bg-red-100 absolute opacity-70"
 | 
						|
    :style="positionStyle"
 | 
						|
    @mousedown="startDrag"
 | 
						|
  >
 | 
						|
    <div
 | 
						|
      v-if="field"
 | 
						|
      class="flex items-center justify-center h-full w-full"
 | 
						|
    >
 | 
						|
      {{ field?.name || field.type }}
 | 
						|
    </div>
 | 
						|
    <span
 | 
						|
      class="h-2 w-2 right-0 bottom-0 bg-red-900 absolute cursor-nwse-resize"
 | 
						|
      @mousedown.stop="startResize"
 | 
						|
    />
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
export default {
 | 
						|
  name: 'FieldArea',
 | 
						|
  props: {
 | 
						|
    bounds: {
 | 
						|
      type: Object,
 | 
						|
      required: false,
 | 
						|
      default () {
 | 
						|
        return {
 | 
						|
          x: 0,
 | 
						|
          y: 0,
 | 
						|
          w: 0,
 | 
						|
          h: 0
 | 
						|
        }
 | 
						|
      }
 | 
						|
    },
 | 
						|
    field: {
 | 
						|
      type: Object,
 | 
						|
      required: false,
 | 
						|
      default: null
 | 
						|
    }
 | 
						|
  },
 | 
						|
  emits: ['start-resize', 'stop-resize', 'start-drag', 'stop-drag'],
 | 
						|
  data () {
 | 
						|
    return {
 | 
						|
      isResize: false,
 | 
						|
      dragFrom: { x: 0, y: 0 }
 | 
						|
    }
 | 
						|
  },
 | 
						|
  computed: {
 | 
						|
    positionStyle () {
 | 
						|
      const { x, y, w, h } = this.bounds
 | 
						|
 | 
						|
      return {
 | 
						|
        top: y * 100 + '%',
 | 
						|
        left: x * 100 + '%',
 | 
						|
        width: w * 100 + '%',
 | 
						|
        height: h * 100 + '%'
 | 
						|
      }
 | 
						|
    }
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    resize (e) {
 | 
						|
      this.bounds.w = e.layerX / e.toElement.clientWidth - this.bounds.x
 | 
						|
      this.bounds.h = e.layerY / e.toElement.clientHeight - this.bounds.y
 | 
						|
    },
 | 
						|
    drag (e) {
 | 
						|
      if (e.toElement.id === 'mask') {
 | 
						|
        this.bounds.x = (e.layerX - this.dragFrom.x) / e.toElement.clientWidth
 | 
						|
        this.bounds.y = (e.layerY - this.dragFrom.y) / e.toElement.clientHeight
 | 
						|
      }
 | 
						|
    },
 | 
						|
    startDrag (e) {
 | 
						|
      const rect = e.target.getBoundingClientRect()
 | 
						|
 | 
						|
      this.dragFrom = { x: e.clientX - rect.left, y: e.clientY - rect.top }
 | 
						|
 | 
						|
      document.addEventListener('mousemove', this.drag)
 | 
						|
      document.addEventListener('mouseup', this.stopDrag)
 | 
						|
 | 
						|
      this.$emit('start-drag')
 | 
						|
    },
 | 
						|
    stopDrag () {
 | 
						|
      document.removeEventListener('mousemove', this.drag)
 | 
						|
      document.removeEventListener('mouseup', this.stopDrag)
 | 
						|
 | 
						|
      this.$emit('stop-drag')
 | 
						|
    },
 | 
						|
    startResize () {
 | 
						|
      document.addEventListener('mousemove', this.resize)
 | 
						|
      document.addEventListener('mouseup', this.stopResize)
 | 
						|
 | 
						|
      this.$emit('start-resize')
 | 
						|
    },
 | 
						|
    stopResize () {
 | 
						|
      document.removeEventListener('mousemove', this.resize)
 | 
						|
      document.removeEventListener('mouseup', this.stopResize)
 | 
						|
 | 
						|
      this.$emit('stop-resize')
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
</script>
 |