From 291240dd94f50e45d0047518558232074e920d8a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 20 May 2016 22:13:28 +0100 Subject: [PATCH] Add editableList widget and update Switch/Change nodes to use it --- Gruntfile.js | 3 +- editor/js/ui/editableList.js | 130 ++++++++++++++++ editor/sass/editableList.scss | 67 ++++++++ editor/sass/style.scss | 1 + nodes/core/logic/10-switch.html | 199 ++++++++++-------------- nodes/core/logic/15-change.html | 246 ++++++++++++++---------------- red/api/locales/en-US/editor.json | 3 + 7 files changed, 397 insertions(+), 252 deletions(-) create mode 100644 editor/js/ui/editableList.js create mode 100644 editor/sass/editableList.scss diff --git a/Gruntfile.js b/Gruntfile.js index 39a2045f6..895f7cafe 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -126,7 +126,8 @@ module.exports = function(grunt) { "editor/js/ui/notifications.js", "editor/js/ui/subflow.js", "editor/js/ui/touch/radialMenu.js", - "editor/js/ui/typedInput.js" + "editor/js/ui/typedInput.js", + "editor/js/ui/editableList.js" ], dest: "public/red/red.js" }, diff --git a/editor/js/ui/editableList.js b/editor/js/ui/editableList.js new file mode 100644 index 000000000..6c43f1549 --- /dev/null +++ b/editor/js/ui/editableList.js @@ -0,0 +1,130 @@ +/** + * Copyright 2016 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ +(function($) { + + $.widget( "nodered.editableList", { + _create: function() { + var that = this; + + this.element.addClass('red-ui-editableList-list'); + this.uiWidth = this.element.width(); + this.uiContainer = this.element + .wrap( "
" ) + .parent(); + this.topContainer = this.uiContainer.wrap("
").parent(); + + this.topContainer.addClass('red-ui-editableList'); + + var addLabel = "foo"; + if (RED && RED._) { + addLabel = RED._("editableList.add"); + } + + 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(); + + var minHeight = this.element.css("minHeight"); + if (minHeight !== '0px') { + this.uiContainer.css("minHeight",minHeight); + this.element.css("minHeight",0); + } + + if (this.options.sortable) { + this.element.sortable({ + axis: "y", + update: function( event, ui ) { + if (that.options.updateOrder) { + that.options.updateOrder(that.items()); + } + }, + handle:".red-ui-editableList-item-handle", + cursor: "move" + }); + } + + this._resize(); + + // this.menu = this._createMenu(this.types, function(v) { that.type(v) }); + // this.type(this.options.default||this.types[0].value); + }, + _resize: function() { + var currentFullHeight = this.topContainer.height(); + var innerHeight = this.uiContainer.height(); + var delta = currentFullHeight - innerHeight; + this.uiContainer.height(this.uiHeight-delta); + if (this.options.resize) { + this.options.resize(); + } + if (this.options.resizeItem) { + var that = this; + this.element.children().each(function(i) { + that.options.resizeItem($(this).find(".red-ui-editableList-item-content")); + }); + } + }, + _destroy: function() { + }, + width: function(desiredWidth) { + this.uiWidth = desiredWidth; + this._resize(); + }, + height: function(desiredHeight) { + this.uiHeight = desiredHeight; + this._resize(); + }, + addItem: function(data) { + 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) { + $('').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); + $('',{class:"fa fa-remove"}).appendTo(deleteButton); + li.addClass("red-ui-editableList-item-deletable"); + 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 (this.options.addItem) { + var index = that.element.children().length-1; + setTimeout(function() { + that.options.addItem(row,index,data); + },0); + } + }, + items: function() { + return this.element.children().map(function(i) { return $(this).find(".red-ui-editableList-item-content"); }); + } + }); +})(jQuery); diff --git a/editor/sass/editableList.scss b/editor/sass/editableList.scss new file mode 100644 index 000000000..2dd01b592 --- /dev/null +++ b/editor/sass/editableList.scss @@ -0,0 +1,67 @@ +/** + * Copyright 2016 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + + + .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; + } + + li { + position: relative; + background: #fff; + margin:0; + padding:8px 0px; + border-bottom: 1px solid $secondary-border-color; + + .red-ui-editableList-item-handle { + position: absolute; + top: 50%; + left: 2px; + margin-top: -7px; + color: #eee; + cursor: move; + } + .red-ui-editableList-item-delete { + position: absolute; + top: 50%; + right: 0px; + margin-top: -9px; + } + //.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 { + margin-right: 28px; + } + &.red-ui-editableList-item-deleting { + background: #fee; + } + } + + } diff --git a/editor/sass/style.scss b/editor/sass/style.scss index 19c89f188..2687d47fe 100644 --- a/editor/sass/style.scss +++ b/editor/sass/style.scss @@ -42,6 +42,7 @@ @import "flow"; @import "typedInput"; +@import "editableList"; @import "dragdrop"; diff --git a/nodes/core/logic/10-switch.html b/nodes/core/logic/10-switch.html index 78fa23f4e..f05ccfa9c 100644 --- a/nodes/core/logic/10-switch.html +++ b/nodes/core/logic/10-switch.html @@ -1,5 +1,5 @@