summaryrefslogtreecommitdiffstats
path: root/dgbuilder/public/red/ui/library.js
diff options
context:
space:
mode:
Diffstat (limited to 'dgbuilder/public/red/ui/library.js')
-rw-r--r--dgbuilder/public/red/ui/library.js370
1 files changed, 370 insertions, 0 deletions
diff --git a/dgbuilder/public/red/ui/library.js b/dgbuilder/public/red/ui/library.js
new file mode 100644
index 00000000..0c803bf0
--- /dev/null
+++ b/dgbuilder/public/red/ui/library.js
@@ -0,0 +1,370 @@
+/**
+ * Copyright 2013 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.library = (function() {
+
+
+ function loadFlowLibrary() {
+ $.getJSON("library/flows",function(data) {
+ //console.log(data);
+
+ var buildMenu = function(data,root) {
+ var i;
+ var li;
+ var a;
+ var ul = document.createElement("ul");
+ ul.id = "btn-import-library-submenu";
+ ul.className = "dropdown-menu";
+ if (data.d) {
+ for (i in data.d) {
+ if (data.d.hasOwnProperty(i)) {
+ li = document.createElement("li");
+ li.className = "dropdown-submenu pull-left";
+ a = document.createElement("a");
+ a.href="#";
+ a.innerHTML = i;
+ li.appendChild(a);
+ li.appendChild(buildMenu(data.d[i],root+(root!==""?"/":"")+i));
+ ul.appendChild(li);
+ }
+ }
+ }
+ if (data.f) {
+ for (i in data.f) {
+ if (data.f.hasOwnProperty(i)) {
+ li = document.createElement("li");
+ a = document.createElement("a");
+ a.href="#";
+ a.innerHTML = data.f[i];
+ a.flowName = root+(root!==""?"/":"")+data.f[i];
+ a.onclick = function() {
+ $.get('library/flows/'+this.flowName, function(data) {
+ RED.view.importNodes(data);
+ });
+ };
+ li.appendChild(a);
+ ul.appendChild(li);
+ }
+ }
+ }
+ return ul;
+ };
+ var menu = buildMenu(data,"");
+ //TODO: need an api in RED.menu for this
+ $("#btn-import-library-submenu").replaceWith(menu);
+ });
+ }
+ loadFlowLibrary();
+
+
+
+ function createUI(options) {
+ var libraryData = {};
+ var selectedLibraryItem = null;
+ var libraryEditor = null;
+
+ function buildFileListItem(item) {
+ var li = document.createElement("li");
+ li.onmouseover = function(e) { $(this).addClass("list-hover"); };
+ li.onmouseout = function(e) { $(this).removeClass("list-hover"); };
+ return li;
+ }
+
+ function buildFileList(root,data) {
+ var ul = document.createElement("ul");
+ var li;
+ for (var i=0;i<data.length;i++) {
+ var v = data[i];
+ if (typeof v === "string") {
+ // directory
+ li = buildFileListItem(v);
+ li.onclick = (function () {
+ var dirName = v;
+ return function(e) {
+ var bcli = $('<li class="active"><span class="divider">/</span> <a href="#">'+dirName+'</a></li>');
+ $("a",bcli).click(function(e) {
+ $(this).parent().nextAll().remove();
+ $.getJSON("library/"+options.url+root+dirName,function(data) {
+ $("#node-select-library").children().first().replaceWith(buildFileList(root+dirName+"/",data));
+ });
+ e.stopPropagation();
+ });
+ var bc = $("#node-dialog-library-breadcrumbs");
+ $(".active",bc).removeClass("active");
+ bc.append(bcli);
+ $.getJSON("library/"+options.url+root+dirName,function(data) {
+ $("#node-select-library").children().first().replaceWith(buildFileList(root+dirName+"/",data));
+ });
+ }
+ })();
+ li.innerHTML = '<i class="fa fa-folder"></i> '+v+"</i>";
+ ul.appendChild(li);
+ } else {
+ // file
+ li = buildFileListItem(v);
+ li.innerHTML = v.name;
+ li.onclick = (function() {
+ var item = v;
+ return function(e) {
+ $(".list-selected",ul).removeClass("list-selected");
+ $(this).addClass("list-selected");
+ $.get("library/"+options.url+root+item.fn, function(data) {
+ selectedLibraryItem = item;
+ libraryEditor.setText(data);
+ });
+ }
+ })();
+ ul.appendChild(li);
+ }
+ }
+ return ul;
+ }
+
+/*
+//Commented this portion as is not used by the DGBuilder application
+ $('#node-input-name').addClass('input-append-left').css("width","65%").after(
+ '<div class="btn-group" style="margin-left: 0px;">'+
+ '<button id="node-input-'+options.type+'-lookup" class="btn input-append-right" data-toggle="dropdown"><i class="fa fa-book"></i> <i class="fa fa-caret-down"></i></button>'+
+ '<ul class="dropdown-menu pull-right" role="menu">'+
+ '<li><a id="node-input-'+options.type+'-menu-open-library" tabindex="-1" href="#">Open Library...</a></li>'+
+ '<li><a id="node-input-'+options.type+'-menu-save-library" tabindex="-1" href="#">Save to Library...</a></li>'+
+ '</ul></div>'
+ );
+
+
+
+ $('#node-input-'+options.type+'-menu-open-library').click(function(e) {
+ $("#node-select-library").children().remove();
+ var bc = $("#node-dialog-library-breadcrumbs");
+ bc.children().first().nextAll().remove();
+ libraryEditor.setText('');
+
+ $.getJSON("library/"+options.url,function(data) {
+ $("#node-select-library").append(buildFileList("/",data));
+ $("#node-dialog-library-breadcrumbs a").click(function(e) {
+ $(this).parent().nextAll().remove();
+ $("#node-select-library").children().first().replaceWith(buildFileList("/",data));
+ e.stopPropagation();
+ });
+ $( "#node-dialog-library-lookup" ).dialog( "open" );
+ });
+
+ e.preventDefault();
+ });
+
+ $('#node-input-'+options.type+'-menu-save-library').click(function(e) {
+ //var found = false;
+ var name = $("#node-input-name").val().replace(/(^\s*)|(\s*$)/g,"");
+
+ //var buildPathList = function(data,root) {
+ // var paths = [];
+ // if (data.d) {
+ // for (var i in data.d) {
+ // var dn = root+(root==""?"":"/")+i;
+ // var d = {
+ // label:dn,
+ // files:[]
+ // };
+ // for (var f in data.d[i].f) {
+ // d.files.push(data.d[i].f[f].fn.split("/").slice(-1)[0]);
+ // }
+ // paths.push(d);
+ // paths = paths.concat(buildPathList(data.d[i],root+(root==""?"":"/")+i));
+ // }
+ // }
+ // return paths;
+ //};
+ $("#node-dialog-library-save-folder").attr("value","");
+
+ var filename = name.replace(/[^\w-]/g,"-");
+ if (filename === "") {
+ filename = "unnamed-"+options.type;
+ }
+ $("#node-dialog-library-save-filename").attr("value",filename+".js");
+
+ //var paths = buildPathList(libraryData,"");
+ //$("#node-dialog-library-save-folder").autocomplete({
+ // minLength: 0,
+ // source: paths,
+ // select: function( event, ui ) {
+ // $("#node-dialog-library-save-filename").autocomplete({
+ // minLength: 0,
+ // source: ui.item.files
+ // });
+ // }
+ //});
+
+ $( "#node-dialog-library-save" ).dialog( "open" );
+ e.preventDefault();
+ });
+ require(["orion/editor/edit"], function(edit) {
+ libraryEditor = edit({
+ parent:document.getElementById('node-select-library-text'),
+ lang:"js",
+ readonly: true
+ });
+ });
+
+
+ $( "#node-dialog-library-lookup" ).dialog({
+ title: options.type+" library",
+ modal: true,
+ autoOpen: false,
+ width: 800,
+ height: 450,
+ buttons: [
+ {
+ text: "Ok",
+ click: function() {
+ if (selectedLibraryItem) {
+ for (var i=0;i<options.fields.length;i++) {
+ var field = options.fields[i];
+ $("#node-input-"+field).val(selectedLibraryItem[field]);
+ }
+ options.editor.setText(libraryEditor.getText());
+ }
+ $( this ).dialog( "close" );
+ }
+ },
+ {
+ text: "Cancel",
+ click: function() {
+ $( this ).dialog( "close" );
+ }
+ }
+ ],
+ open: function(e) {
+ var form = $("form",this);
+ form.height(form.parent().height()-30);
+ $("#node-select-library-text").height("100%");
+ $(".form-row:last-child",form).children().height(form.height()-60);
+ },
+ resize: function(e) {
+ var form = $("form",this);
+ form.height(form.parent().height()-30);
+ $(".form-row:last-child",form).children().height(form.height()-60);
+ }
+ });
+
+ */
+ function saveToLibrary(overwrite) {
+ var name = $("#node-input-name").val().replace(/(^\s*)|(\s*$)/g,"");
+ if (name === "") {
+ name = "Unnamed "+options.type;
+ }
+ var filename = $("#node-dialog-library-save-filename").val().replace(/(^\s*)|(\s*$)/g,"");
+ var pathname = $("#node-dialog-library-save-folder").val().replace(/(^\s*)|(\s*$)/g,"");
+ if (filename === "" || !/.+\.js$/.test(filename)) {
+ RED.notify("Invalid filename","warning");
+ return;
+ }
+ var fullpath = pathname+(pathname===""?"":"/")+filename;
+ if (!overwrite) {
+ //var pathnameParts = pathname.split("/");
+ //var exists = false;
+ //var ds = libraryData;
+ //for (var pnp in pathnameParts) {
+ // if (ds.d && pathnameParts[pnp] in ds.d) {
+ // ds = ds.d[pathnameParts[pnp]];
+ // } else {
+ // ds = null;
+ // break;
+ // }
+ //}
+ //if (ds && ds.f) {
+ // for (var f in ds.f) {
+ // if (ds.f[f].fn == fullpath) {
+ // exists = true;
+ // break;
+ // }
+ // }
+ //}
+ //if (exists) {
+ // $("#node-dialog-library-save-type").html(options.type);
+ // $("#node-dialog-library-save-name").html(fullpath);
+ // $("#node-dialog-library-save-confirm").dialog( "open" );
+ // return;
+ //}
+ }
+ var queryArgs = [];
+ for (var i=0;i<options.fields.length;i++) {
+ var field = options.fields[i];
+ if (field == "name") {
+ queryArgs.push("name="+encodeURIComponent(name));
+ } else {
+ queryArgs.push(encodeURIComponent(field)+"="+encodeURIComponent($("#node-input-"+field).val()));
+ }
+ }
+ var queryString = queryArgs.join("&");
+
+ var text = options.editor.getText();
+ $.post("library/"+options.url+'/'+fullpath+"?"+queryString,text,function() {
+ RED.notify("Saved "+options.type,"success");
+ });
+ }
+ $( "#node-dialog-library-save-confirm" ).dialog({
+ title: "Save to library",
+ modal: true,
+ autoOpen: false,
+ width: 530,
+ height: 230,
+ buttons: [
+ {
+ text: "Ok",
+ click: function() {
+ saveToLibrary(true);
+ $( this ).dialog( "close" );
+ }
+ },
+ {
+ text: "Cancel",
+ click: function() {
+ $( this ).dialog( "close" );
+ }
+ }
+ ]
+ });
+ $( "#node-dialog-library-save" ).dialog({
+ title: "Save to library",
+ modal: true,
+ autoOpen: false,
+ width: 530,
+ height: 230,
+ buttons: [
+ {
+ text: "Ok",
+ click: function() {
+ saveToLibrary(false);
+ $( this ).dialog( "close" );
+ }
+ },
+ {
+ text: "Cancel",
+ click: function() {
+ $( this ).dialog( "close" );
+ }
+ }
+ ]
+ });
+
+ }
+
+ return {
+ create: createUI,
+ loadFlowLibrary: loadFlowLibrary
+ }
+})();
+
+