diff --git a/docs/guide/index.md b/docs/guide/index.md index 9b6d2f8c8630a57e5970d2ba3ca7daeddea3ce7f..115775542cf3d495a3cd1244ca9fb53699c81bf6 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -77,6 +77,10 @@ disabledFields: [ ]; ``` +To highlight, which fields are disabled, the `disabledField` slot can be used. It receives the slot prop `isDraggedOver`, +which is a boolean indicating whether something is currently dragged over the grid. This can be used to only show the +disabled fields when something is dragging. An example for this can be found in Example number 7. + ## Prevent items from being dragged To disable dragging of a specific item, simply set the attribute `disabled` of the item to `true`. diff --git a/example/index.html b/example/index.html index 049aebe05d829113e7de6e200e93c62954d817f4..53db67a8ed1d6f2b1db997237c4725a3af3cbc3c 100644 --- a/example/index.html +++ b/example/index.html @@ -1,4 +1,4 @@ -<!DOCTYPE html> +<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> diff --git a/example/src/Example5Colors.vue b/example/src/Example5Colors.vue index 47c2d4ec9345724a0c0a4e2778cf4dbd66a6d551..f3224df18eb07927c6bf429cdfb4ec1f7676ec7d 100644 --- a/example/src/Example5Colors.vue +++ b/example/src/Example5Colors.vue @@ -91,7 +91,7 @@ export default { // Moved to gridA this.findAndRemove( item.originGridId === "gridB" ? this.placedB : this.placedC, - item.key + item.key, ); this.placedA.push(item.key); break; @@ -99,7 +99,7 @@ export default { // Moved to gridB this.findAndRemove( item.originGridId === "gridA" ? this.placedA : this.placedC, - item.key + item.key, ); this.placedB.push(item.key); break; @@ -107,7 +107,7 @@ export default { // Moved to gridC this.findAndRemove( item.originGridId === "gridB" ? this.placedB : this.placedA, - item.key + item.key, ); this.placedC.push(item.key); break; diff --git a/example/src/Example7DisabledItems.vue b/example/src/Example7DisabledItems.vue index dff2a1d248466e8e5bc1f1628b483abd0dd58c8d..09d2858057c055bbfc4b2acb2638a4da18d299e3 100644 --- a/example/src/Example7DisabledItems.vue +++ b/example/src/Example7DisabledItems.vue @@ -3,23 +3,31 @@ import DragGrid from "../../src/DragGrid.vue"; </script> <template> - <drag-grid - v-model="someDisabledItems" - :cols="4" - :rows="4" - class="size" - :disabled-fields="disabledFields" - > - <template #item="{ rawItem }"> - <div - class="container" - :style="{ background: rawItem.disabled ? 'red' : 'green' }" - ></div> - </template> - <template #disabledField - ><div class="container">This field is disabled!</div></template + <div> + <label> + <input type="checkbox" v-model="showDisabled" /> + Show disabled fields even when not dragged over? + </label> + <drag-grid + v-model="someDisabledItems" + :cols="4" + :rows="4" + class="size" + :disabled-fields="disabledFields" > - </drag-grid> + <template #item="{ rawItem }"> + <div + class="container" + :style="{ background: rawItem.disabled ? 'red' : 'green' }" + ></div> + </template> + <template #disabledField="{ isDraggedOver }"> + <div class="container" v-show="showDisabled || isDraggedOver"> + This field is disabled! + </div> + </template> + </drag-grid> + </div> </template> <script> @@ -40,6 +48,7 @@ export default { { x: 2, y: 3 }, { x: 4, y: 2 }, ], + showDisabled: false, }; }, }; diff --git a/src/DragGrid.vue b/src/DragGrid.vue index 49bba443ca14a52e17969e06ffe7792a7d37c47e..1572374d6b64265cfe91c8ef0b489833d905ce61 100644 --- a/src/DragGrid.vue +++ b/src/DragGrid.vue @@ -3,7 +3,7 @@ droppable @dropmove="disabled || loading ? undefined : handleDragOver($event)" @drop.prevent="disabled || loading ? undefined : handleDrop($event)" - @dragleave="$refs.highlightContainer.style.display = 'none'" + @dragleave="handleDragLeave" class="grid" > <template v-if="loading"> @@ -56,7 +56,7 @@ :y="disabledField.y" :key="disabledField.x + '|' + disabledField.y" > - <slot name="disabledField"></slot> + <slot name="disabledField" :is-dragged-over="isDraggedOver"></slot> </GridItem> </template> <slot></slot> @@ -76,6 +76,11 @@ export default { DragContainer, }, emits: ["input", "itemChanged"], + data() { + return { + isDraggedOver: false, + }; + }, props: { rows: { type: Number, @@ -174,7 +179,7 @@ export default { let element = JSON.parse(data); let coords = this.getCoords( event.dragEvent.client.x - element.mouseX, - event.dragEvent.client.y - element.mouseY + event.dragEvent.client.y - element.mouseY, ); if (element.context !== this.context || this.noHighlight) { @@ -182,6 +187,8 @@ export default { return; } + this.isDraggedOver = true; + let newPositionValid = true; for (let x = coords.x; x < coords.x + element.w; x++) { @@ -204,6 +211,7 @@ export default { this.$refs.highlightContainer.style.gridRowEnd = "span " + element.h; }, handleDrop(event) { + this.isDraggedOver = false; this.$refs.highlightContainer.style.display = "none"; let data = event.relatedTarget.dataset.transfer; if (!data) return; @@ -217,7 +225,7 @@ export default { let coords = this.getCoords( event.dragEvent.client.x - element.mouseX, - event.dragEvent.client.y - element.mouseY + event.dragEvent.client.y - element.mouseY, ); let newPositionValid = true; @@ -256,7 +264,7 @@ export default { if (e.code === DOMException.DATA_CLONE_ERR) { // We use functions for properties → we can't clone; only emit `item-changed` event console.debug( - "Grid couldn't be cloned, please listen to the `item-changed` event and handle changes yourself." + "Grid couldn't be cloned, please listen to the `item-changed` event and handle changes yourself.", ); } else { throw e; @@ -267,6 +275,10 @@ export default { this.$emit("itemChanged", element); }, + handleDragLeave() { + this.isDraggedOver = false; + this.$refs.highlightContainer.style.display = "none"; + }, clamp: (min, num, max) => Math.min(Math.max(num, min), max), getCoords(x, y) { let rect = this.$el.getBoundingClientRect(); @@ -274,12 +286,12 @@ export default { x: this.clamp( 1, Math.ceil((x - rect.x) / (rect.width / this.cols)), - this.cols + this.cols, ), y: this.clamp( 1, Math.ceil((y - rect.y) / (rect.height / this.rows)), - this.rows + this.rows, ), }; }, @@ -314,7 +326,7 @@ export default { if (this.value.some((item) => item.w > 1)) { console.warn( "You are using multipleItemsY but some items have a width greater than 1.", - "This is not supported and will lead to unexpected behaviour." + "This is not supported and will lead to unexpected behaviour.", ); }