Skip to content
Snippets Groups Projects
App.vue 3.38 KiB
Newer Older
Julian's avatar
Julian committed
<script setup>
Julian's avatar
Julian committed
import DragGrid from "../../src/DragGrid.vue";
Julian's avatar
Julian committed
import CircularCard from "./components/CircularCard.vue";
Julian's avatar
Julian committed
</script>

<template>
  <div id="app">
Julian's avatar
Julian committed
    <DragGrid :rows="8" :cols="5" :pos-validation="blockField" v-model="items">
      <div id="blocker">
        This field is blocked because it's filled, the next one programmatically
      </div>
      <template #item="item">
        <div class="container">{{ item }}</div>
      </template>
Julian's avatar
Julian committed
    </DragGrid>
    <div class="ttt-container">
      <DragGrid
        :rows="3"
        :cols="3"
        v-model="ticTacToe1"
        class="tic-tac-toe"
        context="ticTacToe"
Julian's avatar
Julian committed
        :validate-element="randomKey"
      >
        <template #item="item">
          <CircularCard>
            {{ item.key.startsWith("a") ? "X" : "O" }}</CircularCard
          >
        </template>
      </DragGrid>
Julian's avatar
Julian committed
      <div>
        <p>These two are two different grids but we can drag from right to left!</p>
        <p>Drag items from the container on the right to play on the left.</p>
      </div>
      <DragGrid
Julian's avatar
Julian committed
        :rows="1"
        :cols="2"
        v-model="ticTacToe2"
        class="tic-tac-toe"
        context="ticTacToe"
Julian's avatar
Julian committed
        :pos-validation="blockAllMoving"
      >
        <template #item="item">
          <CircularCard>
            {{ item.key.startsWith("a") ? "X" : "O" }}</CircularCard
          >
        </template>
      </DragGrid>
    </div>
Julian's avatar
Julian committed
  </div>
</template>

<script>
export default {
  name: "App",
  methods: {
    blockField(x, y, key) {
      // We won't move fields with ID 'obj8' and nothing into (4, 3)
      if (x === 4 && y === 3) return false;
      return key !== "obj8";
    },
Julian's avatar
Julian committed
    blockAllMoving() {
      return false;
    },
    randomKey(element) {
      if (element.key !== "a" && element !== "b") return;
      element.key += Math.random().toString(36).replace('0.', '');
    },
  data() {
    return {
      items: [
        { x: 1, y: 3, w: 1, h: 1, key: "obj1", data: {} },
        { x: 2, y: 1, w: 1, h: 1, key: "obj2", data: {} },
        { x: 3, y: 1, w: 2, h: 2, key: "obj3", data: {} },
        { x: 5, y: 2, w: 1, h: 1, key: "obj4", data: {} },
        { x: 1, y: 1, w: 1, h: 2, key: "obj5", data: {} },
        { x: 5, y: 1, w: 1, h: 1, key: "obj6", data: {} },
        { x: 2, y: 2, w: 1, h: 3, key: "obj7", data: {} },
        {
          x: 1,
          y: 4,
          w: 1,
          h: 1,
          key: "obj8",
          data: { title: "I'm blocked from moving!" },
        },
        { x: 5, y: 3, w: 1, h: 1, key: "obj9", data: {} },
      ],
      ticTacToe1: [
Julian's avatar
Julian committed
        { x: 1, y: 1, w: 1, h: 1, key: "a1", data: {} },
        { x: 3, y: 3, w: 1, h: 1, key: "b1", data: {} },
Julian's avatar
Julian committed
      ],
Julian's avatar
Julian committed
      ticTacToe2: [
          { x: 1, y: 1, w: 1, h: 1, key: "a", data: {} },
          { x: 2, y: 1, w: 1, h: 1, key: "b", data: {} },
      ],
};
</script>

<style scoped>
#blocker {
  grid-row: 3 / span 1;
  grid-column: 3 / span 1;
  background-image: linear-gradient(
    45deg,
    #edd85f 25%,
    #0f2b3d 25%,
    #0f2b3d 50%,
    #edd85f 50%,
    #edd85f 75%,
    #0f2b3d 75%,
    #0f2b3d 100%
  );
  background-size: 56.57px 56.57px;
  color: white;
  font-size: large;
  font-weight: bold;
  text-shadow: 4px 4px 4px #2c3e50;
}

.container {
  background: lightcoral;
  width: 100%;
  height: 100%;
}
Julian's avatar
Julian committed

.tic-tac-toe {
  max-width: 400px;
}

.ttt-container {
  display: flex;
  justify-content: space-between;
}
</style>