From 5120f1604f467696e9cf28edeaba77d1b56ecf79 Mon Sep 17 00:00:00 2001 From: Julian Leucker <leuckerj@gmail.com> Date: Mon, 13 Feb 2023 15:15:33 +0100 Subject: [PATCH] Allow grids to declare disabled fields --- src/DragGrid.vue | 27 ++++++++++++++++++++++++++- src/GridItem.vue | 28 ++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/GridItem.vue diff --git a/src/DragGrid.vue b/src/DragGrid.vue index 44b5e40..7ecd69e 100644 --- a/src/DragGrid.vue +++ b/src/DragGrid.vue @@ -20,7 +20,7 @@ :data="getObject('data', item)" :context="context" :grid-id="gridId" - :disabled="disabled" + :disabled="disabled || item.disabled" > <slot v-bind="transformItem(item)" :raw-item="item" name="item"> <dl> @@ -35,6 +35,16 @@ </dl> </slot> </DragContainer> + <template v-for="disabledField in disabledFields"> + <GridItem + class="disabledField" + :x="disabledField.x" + :y="disabledField.y" + :key="disabledField" + > + <slot name="disabledField"></slot> + </GridItem> + </template> <slot></slot> </div> </template> @@ -42,10 +52,12 @@ <script> import DragContainer from "./DragContainer.vue"; import { v4 as uuidv4 } from "uuid"; +import GridItem from "./GridItem.vue"; export default { name: "DragGrid", components: { + GridItem, DragContainer, }, emits: ["input", "itemChanged"], @@ -92,6 +104,11 @@ export default { required: false, default: false, }, + disabledFields: { + type: Array, + required: false, + default: () => [], + }, }, methods: { positionAllowed(x, y, key) { @@ -99,6 +116,14 @@ export default { if (x > this.cols) return false; if (y > this.rows) return false; + if ( + this.disabledFields.filter((field) => field.x === x && field.y === y) + .length > 0 + ) { + // Field is disabled + return false; + } + for (let item of this.value) { if (key === item.key) continue; if ( diff --git a/src/GridItem.vue b/src/GridItem.vue new file mode 100644 index 0000000..4597204 --- /dev/null +++ b/src/GridItem.vue @@ -0,0 +1,28 @@ +<template> + <div> + <slot></slot> + </div> +</template> + +<script> +export default { + name: "GridItem", + props: { + x: { + type: Number, + required: true, + }, + y: { + type: Number, + required: true, + }, + }, +}; +</script> + +<style scoped> +div { + grid-column: v-bind(x) / span 1; + grid-row: v-bind(y) / span 1; +} +</style> -- GitLab