From 0cdb36f73d0d13c310653a5fa71b4c8c6f1c8d17 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Fri, 1 Mar 2024 11:08:50 +0000 Subject: [PATCH] support constrained items in editable list --- .../src/js/ui/common/editableList.js | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js index 8ee1f0e29..29cf3172c 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js @@ -174,12 +174,24 @@ this.uiContainer.width(m[1]); } if (this.options.sortable) { + var isCanceled = false; // Flag to track if an item has been canceled from being dropped into a different list + var noDrop = false; // Flag to track if an item is being dragged into a different list var handle = (typeof this.options.sortable === 'string')? this.options.sortable : ".red-ui-editableList-item-handle"; var sortOptions = { axis: "y", update: function( event, ui ) { + // dont trigger update if the item is being canceled + const targetList = $(event.target); + const draggedItem = ui.item; + const draggedItemParent = draggedItem.parent(); + if (!targetList.is(draggedItemParent) && draggedItem.hasClass("red-ui-editabelList-item-constrained")) { + noDrop = true; + } + if (isCanceled || noDrop) { + return; + } if (that.options.sortItems) { that.options.sortItems(that.items()); } @@ -189,8 +201,32 @@ tolerance: "pointer", forcePlaceholderSize:true, placeholder: "red-ui-editabelList-item-placeholder", - start: function(e, ui){ - ui.placeholder.height(ui.item.height()-4); + start: function (event, ui) { + isCanceled = false; + ui.placeholder.height(ui.item.height() - 4); + ui.item.css('cursor', 'grabbing'); // TODO: this doesn't seem to work, use a class instead? + }, + stop: function (event, ui) { + ui.item.css('cursor', 'auto'); + }, + receive: function (event, ui) { + if (ui.item.hasClass("red-ui-editabelList-item-constrained")) { + isCanceled = true; + $(ui.sender).sortable('cancel'); + } + }, + over: function (event, ui) { + // if the dragged item is constrained, prevent it from being dropped into a different list + const targetList = $(event.target); + const draggedItem = ui.item; + const draggedItemParent = draggedItem.parent(); + if (!targetList.is(draggedItemParent) && draggedItem.hasClass("red-ui-editabelList-item-constrained")) { + noDrop = true; + draggedItem.css('cursor', 'no-drop'); // TODO: this doesn't seem to work, use a class instead? + } else { + noDrop = false; + draggedItem.css('cursor', 'grabbing'); // TODO: this doesn't seem to work, use a class instead? + } } }; if (this.options.connectWith) {