Skip to content
Snippets Groups Projects
Grid.vue 1.27 KiB
Newer Older
<template>
Julian's avatar
Julian committed
  <div @dragover.prevent @drop.prevent="handleDrop" class="grid">
    <slot name="highlight">
      <div id="highlight"></div>
    </slot>
Julian's avatar
Julian committed
    <DragContainer
      v-for="item in items"
      :key="item.key"
      :x="item.x"
      :y="item.y"
      :w="item.w"
      :h="item.h"
    >
    </DragContainer>
  </div>
</template>

<script>
Julian's avatar
Julian committed
import DragContainer from "./DragContainer.vue";

export default {
Julian's avatar
Julian committed
  name: "Grid",
  components: {
    DragContainer,
  },
  props: {
    rows: {
      type: Number,
Julian's avatar
Julian committed
      required: true,
    },
    cols: {
      type: Number,
Julian's avatar
Julian committed
      required: true,
    },
  },
  methods: {
    handleDrop(event) {
      let data = event.dataTransfer.getData("text");
      event.target.appendChild(document.getElementById(data));
Julian's avatar
Julian committed
    },
  },
  data() {
    return {
      items: [
        { x: 3, y: 3, w: 1, h: 1, key: "obj1" },
        { x: 1, y: 1, w: 1, h: 1, key: "obj2" },
        { x: 4, y: 3, w: 2, h: 2, key: "obj3" },
      ],
    };
  },
};
</script>

<style scoped>
#highlight {
  background: darkgrey;
  border: grey dashed 2px;
}
Julian's avatar
Julian committed

.grid {
  display: grid;
  grid-template-columns: repeat(v-bind(cols), 1fr);
  grid-template-rows: repeat(v-bind(rows), 1fr);
  width: 100%;
  height: 100%;
  min-width: 100px;
  min-height: 100px;
  gap: 1em;
}
Julian's avatar
Julian committed
</style>