Skip to content
Snippets Groups Projects
DragContainer.vue 1.33 KiB
Newer Older
<template>
Julian's avatar
Julian committed
  <div @dragstart="handleDragStart" :draggable="!isDisabled" id="wrapper">
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: "DragContainer",
  methods: {
    handleDragStart(event) {
Julian's avatar
Julian committed
      if (this.isDisabled) return;
Julian's avatar
Julian committed
      event.dataTransfer.setData(
Julian's avatar
Julian committed
        "vueDrag/gridItem",
        JSON.stringify({
          key: this.dragID,
          x: this.x,
          y: this.y,
          w: this.w,
          h: this.h,
Julian's avatar
Julian committed
          data: this.data,
          context: this.context,
Julian's avatar
Julian committed
          originGridId: this.gridId,
Julian's avatar
Julian committed
        })
Julian's avatar
Julian committed
      );
Julian's avatar
Julian committed
    },
  },
  props: {
Julian's avatar
Julian committed
    dragID: String,
Julian's avatar
Julian committed
    x: Number,
    y: Number,
    w: Number,
    h: Number,
Julian's avatar
Julian committed
    data: Object,
    context: String,
Julian's avatar
Julian committed
    gridId: String,
    disabled: Boolean,
  },
  computed: {
    isInGrid() {
      return this.x >= 0 && this.y >= 0;
    },
    isNotInGrid() {
      return this.x === -1 || this.y === -1;
    },
    getX() {
      return this.x === 0 ? "auto" : this.x;
    },
    getY() {
      return this.y === 0 ? "auto" : this.y;
    },
    getDisplay() {
      return this.isInGrid ? "block" : "none";
    },
    isDisabled() {
      return this.disabled || this.isNotInGrid;
    },
</script>

<style scoped>
Julian's avatar
Julian committed
#wrapper {
Julian's avatar
Julian committed
  grid-column: v-bind(getX) / span v-bind(w);
  grid-row: v-bind(getY) / span v-bind(h);
  display: v-bind(getDisplay);
Julian's avatar
Julian committed
</style>