File size: 1,522 Bytes
730b0a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<script lang="ts" setup>
import {useDrag} from 'vue3-dnd'
import {ItemTypes} from './ItemTypes'
import {toRefs} from '@vueuse/core'

const props = defineProps<{
  id: any
  left: number
  top: number
  hideSourceOnDrag?: boolean
  loading?: boolean
}>()

const [collect, drag] = useDrag(() => ({
  type: ItemTypes.BOX,
  item: {id: props.id, left: props.left, top: props.top},
  collect: monitor => ({
    isDragging: monitor.isDragging(),
  }),
}))
const {isDragging} = toRefs(collect)
</script>

<template>
  <div v-if="isDragging && hideSourceOnDrag" :ref="drag"/>
  <div
      v-else
      :ref="drag"
      class="absolute"
      :style="{ left: `${left}px`, top: `${top}px` }"
      role="Box"
      data-testid="box"
  >
    <div v-if="loading">
      <div
          class="border-gray-200 shadow hover:bg-gray-100 cursor-pointer transition inline-flex items-center text-2xl space-x-2.5 py-2.5 px-4 font-medium border rounded-lg ">
        <svg class="animate-spin -ml-1 mr-2 h-6 w-6 text-gray-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
          <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
          <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
        </svg>
        <span>
          Loading
        </span>
      </div>
    </div>
    <slot v-else></slot>
  </div>
</template>

<style scoped>

</style>