diff --git a/editor/js/ui/editableList.js b/editor/js/ui/editableList.js
index 6c43f1549..601df0950 100644
--- a/editor/js/ui/editableList.js
+++ b/editor/js/ui/editableList.js
@@ -15,6 +15,27 @@
**/
(function($) {
+/**
+ * options:
+ * - addButton : boolean|string - text for add label, default 'tab'
+ * - addable : boolean (true) - whether to show the add button
+ * - height : number|'auto'
+ * - resize : function - called when list as a whole is resized
+ * - resizeItem : function(item) - called to resize individual item
+ * - sortable : boolean|string - string is the css selector for handle
+ * - sortItems : function(items) - when order of items changes
+ * - connectWith : css selector of other sortables
+ * - removable : boolean - whether to display delete button on items
+ * - addItem : function(row,index,itemData) - when an item is added
+ * - removeItem : function(itemData) - called when an item is removed
+ * methods:
+ * - addItem(itemData)
+ * - removeItem(itemData)
+ * - width(width)
+ * - height(height)
+ * - items()
+ * - empty()
+ */
$.widget( "nodered.editableList", {
_create: function() {
var that = this;
@@ -28,17 +49,25 @@
this.topContainer.addClass('red-ui-editableList');
- var addLabel = "foo";
- if (RED && RED._) {
- addLabel = RED._("editableList.add");
+ if (this.options.addButton !== false) {
+ var addLabel;
+ if (typeof this.options.addButton === 'string') {
+ addLabel = this.options.addButton
+ } else {
+ if (RED && RED._) {
+ addLabel = RED._("editableList.add");
+ } else {
+ addLabel = 'add';
+ }
+ }
+ $(' '+addLabel+'')
+ .appendTo(this.topContainer)
+ .click(function(evt) {
+ evt.preventDefault();
+ that.addItem({});
+ });
}
- var addButton = $(' '+addLabel+'').appendTo(this.topContainer);
- addButton.click(function(evt) {
- evt.preventDefault();
- that.addItem({});
- });
-
this.uiContainer.addClass("red-ui-editableList-container");
this.uiHeight = this.element.height();
@@ -48,18 +77,37 @@
this.uiContainer.css("minHeight",minHeight);
this.element.css("minHeight",0);
}
-
+ if (this.options.height !== 'auto') {
+ this.uiContainer.css("overflow-y","scroll");
+ if (!isNaN(this.options.height)) {
+ this.uiHeight = this.options.height;
+ }
+ }
if (this.options.sortable) {
- this.element.sortable({
+ var handle = (typeof this.options.sortable === 'string')?
+ this.options.sortable :
+ ".red-ui-editableList-item-handle";
+ var sortOptions = {
axis: "y",
update: function( event, ui ) {
- if (that.options.updateOrder) {
- that.options.updateOrder(that.items());
+ if (that.options.sortItems) {
+ that.options.sortItems(that.items());
}
},
- handle:".red-ui-editableList-item-handle",
- cursor: "move"
- });
+ handle:handle,
+ cursor: "move",
+ tolerance: "pointer",
+ forcePlaceholderSize:true,
+ placeholder: "red-ui-editabelList-item-placeholder",
+ start: function(e, ui){
+ ui.placeholder.height(ui.item.height()-4);
+ }
+ };
+ if (this.options.connectWith) {
+ sortOptions.connectWith = this.options.connectWith;
+ }
+
+ this.element.sortable(sortOptions);
}
this._resize();
@@ -71,7 +119,9 @@
var currentFullHeight = this.topContainer.height();
var innerHeight = this.uiContainer.height();
var delta = currentFullHeight - innerHeight;
- this.uiContainer.height(this.uiHeight-delta);
+ if (this.uiHeight != 0) {
+ this.uiContainer.height(this.uiHeight-delta);
+ }
if (this.options.resize) {
this.options.resize();
}
@@ -96,22 +146,22 @@
var that = this;
data = data || {};
var li = $('
').appendTo(this.element);
- li.data('data',data);
var row = $('').addClass("red-ui-editableList-item-content").appendTo(li);
- if (this.options.sortable) {
+ row.data('data',data);
+ if (this.options.sortable === true) {
$('').appendTo(li);
li.addClass("red-ui-editableList-item-sortable");
}
- if (this.options.deletable) {
- var deleteButton = $('',{href:"#",class:"red-ui-editableList-item-delete editor-button editor-button-small"}).appendTo(li);
+ if (this.options.removable) {
+ var deleteButton = $('',{href:"#",class:"red-ui-editableList-item-remove editor-button editor-button-small"}).appendTo(li);
$('',{class:"fa fa-remove"}).appendTo(deleteButton);
- li.addClass("red-ui-editableList-item-deletable");
+ li.addClass("red-ui-editableList-item-removable");
deleteButton.click(function() {
li.addClass("red-ui-editableList-item-deleting")
li.fadeOut(300, function() {
$(this).remove();
- if (that.options.deleteItem) {
- that.options.deleteItem(li.data('data'));
+ if (that.options.removeItem) {
+ that.options.removeItem(row.data('data'));
}
});
});
@@ -123,8 +173,20 @@
},0);
}
},
+ removeItem: function(data) {
+ var items = this.element.children().filter(function(f) {
+ return data === $(this).find(".red-ui-editableList-item-content").data('data');
+ });
+ items.remove();
+ if (this.options.removeItem) {
+ this.options.removeItem(data);
+ }
+ },
items: function() {
return this.element.children().map(function(i) { return $(this).find(".red-ui-editableList-item-content"); });
+ },
+ empty: function() {
+ this.element.empty();
}
});
})(jQuery);
diff --git a/editor/sass/editableList.scss b/editor/sass/editableList.scss
index 2dd01b592..9905bee82 100644
--- a/editor/sass/editableList.scss
+++ b/editor/sass/editableList.scss
@@ -16,27 +16,28 @@
.red-ui-editableList-container {
- min-height: 200px;
border: 1px solid $form-input-border-color;
border-radius: 4px;
padding: 5px;
margin: 0;
vertical-align: middle;
box-sizing: border-box;
- overflow-y:scroll;
.red-ui-editableList-list {
list-style-type:none;
margin: 0;
}
-
+ .red-ui-editabelList-item-placeholder {
+ border: 2px dashed $secondary-border-color !important;
+ }
li {
+ box-sizing: border-box;
position: relative;
background: #fff;
margin:0;
padding:8px 0px;
border-bottom: 1px solid $secondary-border-color;
-
+ min-height: 20px;
.red-ui-editableList-item-handle {
position: absolute;
top: 50%;
@@ -45,18 +46,21 @@
color: #eee;
cursor: move;
}
- .red-ui-editableList-item-delete {
+ .red-ui-editableList-item-remove {
position: absolute;
top: 50%;
right: 0px;
margin-top: -9px;
}
+ &.ui-sortable-helper {
+ border-top: 1px solid $secondary-border-color;
+ }
//.red-ui-editableList-item-content { outline: 1px solid red}
&.red-ui-editableList-item-sortable .red-ui-editableList-item-content {
margin-left: 22px;
}
- &.red-ui-editableList-item-deletable .red-ui-editableList-item-content {
+ &.red-ui-editableList-item-removable .red-ui-editableList-item-content {
margin-right: 28px;
}
&.red-ui-editableList-item-deleting {
diff --git a/nodes/core/logic/10-switch.html b/nodes/core/logic/10-switch.html
index f05ccfa9c..24bc34a0b 100644
--- a/nodes/core/logic/10-switch.html
+++ b/nodes/core/logic/10-switch.html
@@ -173,17 +173,17 @@
}
selectField.change();
},
- deleteItem: function(opt) {
+ removeItem: function(opt) {
var rules = $("#node-input-rule-container").editableList('items');
rules.each(function(i) { $(this).find(".node-input-rule-index").html(i+1); });
},
resizeItem: resizeRule,
- updateOrder: function(rules) {
+ sortItems: function(rules) {
var rules = $("#node-input-rule-container").editableList('items');
rules.each(function(i) { $(this).find(".node-input-rule-index").html(i+1); });
},
sortable: true,
- deletable: true
+ removable: true
});
for (var i=0;i