diff --git a/packages/node_modules/@node-red/editor-client/locales/de/editor.json b/packages/node_modules/@node-red/editor-client/locales/de/editor.json index d477d3f0e..d052b5ef8 100755 --- a/packages/node_modules/@node-red/editor-client/locales/de/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/de/editor.json @@ -55,9 +55,6 @@ "export" : "Exportieren", "search" : "Flows durchsuchen", "searchInput" : "durchsuchen Sie Ihre Flows", - "clipboard" : "Zwischenablage", - "library" : "Bibliothek", - "examples" : "Beispiele", "subflows" : "Subflow", "createSubflow" : "Subflow erstellen", "selectionToSubflow" : "Auswahl für Subflow", @@ -136,8 +133,8 @@ } }, "clipboard" : { + "clipboard" : "Zwischenablage", "nodes" : "Knoten", - "selectNodes" : "Wählen Sie den Text oben aus, und kopieren Sie die Datei in die Zwischenablage.", "pasteNodes" : "Knoten hier einfügen", "importNodes" : "Knoten importieren", "exportNodes" : "Knoten in Zwischenablage exportieren", @@ -297,22 +294,19 @@ "managePalette" : "Palette verwalten" }, "library" : { + "library" : "Bibliothek", "openLibrary" : "Bibliothek öffnen ...", "saveToLibrary" : "In Bibliothek speichern ...", "typeLibrary" : "__type__, Bibliothek", "unnamedType" : "Unbenannt __type__", - "exportToLibrary" : "Knoten in Bibliothek exportieren", "dialogSaveOverwrite" : "Ein __libraryType__ mit dem Namen __libraryName__ ist bereits vorhanden. Überschreiben?", "invalidFilename" : "Ungültiger Dateiname", "savedNodes" : "Gespeicherte Knoten", "savedType" : "Gespeichert __type__", "saveFailed" : "Speichern fehlgeschlagen: __message__", - "filename" : "Name der Datei", - "folder" : "Ordner", - "filenamePlaceholder" : "Datei", - "fullFilenamePlaceholder" : "a/b/Datei", - "folderPlaceholder" : "a/b", - "breadcrumb" : "Bibliothek" + "types": { + "examples" : "Beispiele" + } }, "palette" : { "noInfo" : "Keine Informationen verfügbar", @@ -826,4 +820,4 @@ "code" : "code" } } -} \ No newline at end of file +} diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index d178a8f1e..c2eb9ad65 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -59,9 +59,6 @@ "export": "Export", "search": "Search flows", "searchInput": "search your flows", - "clipboard": "Clipboard", - "library": "Library", - "examples": "Examples", "subflows": "Subflows", "createSubflow": "Create Subflow", "selectionToSubflow": "Selection to Subflow", @@ -154,6 +151,7 @@ } }, "clipboard": { + "clipboard": "Clipboard", "nodes": "Nodes", "node": "__count__ node", "node_plural": "__count__ nodes", @@ -163,7 +161,6 @@ "flow_plural": "__count__ flows", "subflow": "__count__ subflow", "subflow_plural": "__count__ subflows", - "selectNodes": "Select the text above and copy to the clipboard.", "pasteNodes": "Paste flow json or", "selectFile": "select a file to import", "importNodes": "Import nodes", @@ -353,23 +350,21 @@ "managePalette": "Manage palette" }, "library": { + "library": "Library", "openLibrary": "Open Library...", "saveToLibrary": "Save to Library...", "typeLibrary": "__type__ library", "unnamedType": "Unnamed __type__", - "exportToLibrary": "Export nodes to library", "exportedToLibrary": "Nodes exported to library", "dialogSaveOverwrite": "A __libraryType__ called __libraryName__ already exists. Overwrite?", "invalidFilename": "Invalid filename", "savedNodes": "Saved nodes", "savedType": "Saved __type__", "saveFailed": "Save failed: __message__", - "filename": "Filename", - "folder": "Folder", - "filenamePlaceholder": "file", - "fullFilenamePlaceholder": "a/b/file", - "folderPlaceholder": "a/b", - "breadcrumb": "Library" + "types": { + "local": "Local", + "examples": "Examples" + } }, "palette": { "noInfo": "no information available", diff --git a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json index 3672dde38..83a00a06e 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json @@ -59,9 +59,6 @@ "export": "書き出し", "search": "ノードを検索", "searchInput": "ノードを検索", - "clipboard": "クリップボード", - "library": "ライブラリ", - "examples": "サンプル", "subflows": "サブフロー", "createSubflow": "サブフローを作成", "selectionToSubflow": "選択部分をサブフロー化", @@ -154,6 +151,7 @@ } }, "clipboard": { + "clipboard": "クリップボード", "nodes": "ノード", "node": "__count__ 個のノード", "node_plural": "__count__ 個のノード", @@ -163,7 +161,6 @@ "flow_plural": "__count__ 個のフロー", "subflow": "__count__ 個のサブフロー", "subflow_plural": "__count__ 個のサブフロー", - "selectNodes": "上のテキストを選択し、クリップボードへコピーしてください", "pasteNodes": "JSON形式のフローデータを貼り付けてください", "selectFile": "読み込むファイルを選択してください", "importNodes": "フローをクリップボートから読み込み", @@ -349,22 +346,19 @@ "managePalette": "パレットの管理" }, "library": { + "library": "ライブラリ", "openLibrary": "ライブラリを開く", "saveToLibrary": "ライブラリへ保存", "typeLibrary": "__type__ ライブラリ", "unnamedType": "名前なし __type__", - "exportToLibrary": "ライブラリへフローを書き出す", "dialogSaveOverwrite": "__libraryName__ という __libraryType__ は既に存在しています 上書きしますか?", "invalidFilename": "不正なファイル名", "savedNodes": "フローを保存しました", "savedType": "__type__ を保存しました", "saveFailed": "保存に失敗しました: __message__", - "filename": "ファイル名", - "folder": "フォルダ", - "filenamePlaceholder": "ファイル", - "fullFilenamePlaceholder": "a/b/file", - "folderPlaceholder": "a/b", - "breadcrumb": "ライブラリ" + "types": { + "examples": "サンプル" + } }, "palette": { "noInfo": "情報がありません", diff --git a/packages/node_modules/@node-red/editor-client/locales/ko/editor.json b/packages/node_modules/@node-red/editor-client/locales/ko/editor.json index da7c69e64..3e7811f53 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ko/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ko/editor.json @@ -58,9 +58,6 @@ "export": "내보내기", "search": "플로우 겅색", "searchInput": "플로우 검색", - "clipboard": "클립보드", - "library": "라이브러리", - "examples": "예시", "subflows": "보조 플로우", "createSubflow": "보조 플로우 생성", "selectionToSubflow": "보조 플로우 선택", @@ -148,6 +145,7 @@ } }, "clipboard": { + "clipboard": "클립보드", "nodes": "노드", "node": "__count__ 개의 노드", "node_plural": "__count__ 개의 노드", @@ -157,7 +155,6 @@ "flow_plural": "__count__ 개의 플로우", "subflow": "__count__ 개의 서브 플로우", "subflow_plural": "__count__ 개의 서브 플로우", - "selectNodes": "텍스트를 선택하고 클립보드에 복사하세요", "pasteNodes": "여기에 노드를 붙여넣기 하세요", "selectFile": "불러올 파일을 선택하세요", "importNodes": "노드 불러오기", @@ -338,22 +335,19 @@ "managePalette": "팔렛트 관리" }, "library": { + "library": "라이브러리", "openLibrary": "라이브러리 열기...", "saveToLibrary": "라이브러리로 저장...", "typeLibrary": "__type__ 라이브러리", "unnamedType": "이름없는 __type__", - "exportToLibrary": "라이브러리로 노드 내보내기", "dialogSaveOverwrite": "__libraryType__이 __libraryName__으로 이미 등록되어있습니다. 덮어쓸까요?", "invalidFilename": "파일명이 올바르지 않습니다", "savedNodes": "저장된 노드", "savedType": "저장된 __type__", "saveFailed": "저장 실패 : __message__", - "filename": "파일명", - "folder": "폴더명", - "filenamePlaceholder": "파일", - "fullFilenamePlaceholder": "a/b/file", - "folderPlaceholder": "a/b", - "breadcrumb": "라이브러리" + "types": { + "examples": "예시" + } }, "palette": { "noInfo": "정보 없음", @@ -904,4 +898,4 @@ "description": "상세 내역", "appearance": "모양" } -} \ No newline at end of file +} diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json index 975a20448..f65f428f6 100644 --- a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json @@ -50,9 +50,6 @@ "export": "导出", "search": "查找流程", "searchInput": "查找流程", - "clipboard": "剪贴板", - "library": "库", - "examples": "例子", "subflows": "子流程", "createSubflow": "新建子流程", "selectionToSubflow": "将选择部分更改为子流程", @@ -100,8 +97,8 @@ } }, "clipboard": { + "clipboard": "剪贴板", "nodes": "节点", - "selectNodes": "选择上面的文本并复制到剪贴板", "pasteNodes": "在这里粘贴节点", "importNodes": "导入节点", "exportNodes": "导出节点至剪贴板", @@ -237,6 +234,7 @@ "managePalette": "管理面板" }, "library": { + "library": "库", "openLibrary": "打开库...", "saveToLibrary": "保存到库...", "typeLibrary": "__type__类型库", @@ -247,12 +245,9 @@ "savedNodes": "保存的节点", "savedType": "已保存__type__", "saveFailed": "保存失败: __message__", - "filename": "文件名", - "folder": "文件夹", - "filenamePlaceholder": "文件", - "fullFilenamePlaceholder": "a/b/文件", - "folderPlaceholder": "a/b", - "breadcrumb": "库" + "types": { + "examples": "例子" + } }, "palette": { "noInfo": "无可用信息", diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 3cbaee458..787166c00 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -462,14 +462,8 @@ var RED = (function() { null ]}); menuOptions.push(null); - menuOptions.push({id:"menu-item-import",label:RED._("menu.label.import"),options:[ - {id:"menu-item-import-clipboard",label:RED._("menu.label.clipboard"),onselect:"core:show-import-dialog"}, - {id:"menu-item-import-library",label:RED._("menu.label.library"),onselect:"core:library-import"} - ]}); - menuOptions.push({id:"menu-item-export",label:RED._("menu.label.export"),options:[ - {id:"menu-item-export-clipboard",label:RED._("menu.label.clipboard"),onselect:"core:show-export-dialog"}, - {id:"menu-item-export-library",label:RED._("menu.label.library"),onselect:"core:library-export"} - ]}); + menuOptions.push({id:"menu-item-import",label:RED._("menu.label.import"),onselect:"core:show-import-dialog"}); + menuOptions.push({id:"menu-item-export",label:RED._("menu.label.export"),onselect:"core:show-export-dialog"}); menuOptions.push(null); menuOptions.push({id:"menu-item-search",label:RED._("menu.label.search"),onselect:"core:search"}); menuOptions.push(null); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js index b84e98ed2..fd339c5c3 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js @@ -24,7 +24,7 @@ RED.clipboard = (function() { var disabled = false; var popover; var currentPopoverError; - var activeExportTab; + var activeTab; var libraryBrowser; function setupDialogs() { @@ -33,7 +33,7 @@ RED.clipboard = (function() { .dialog({ modal: true, autoOpen: false, - width: 800, + width: 700, resizable: false, buttons: [ { @@ -63,7 +63,7 @@ RED.clipboard = (function() { class: "primary", text: RED._("clipboard.export.copy"), click: function() { - if (activeExportTab === "clipboard-dialog-export-tab-clipboard") { + if (activeTab === "clipboard-dialog-export-tab-clipboard") { $("#clipboard-export").select(); document.execCommand("copy"); document.getSelection().removeAllRanges(); @@ -93,9 +93,9 @@ RED.clipboard = (function() { } }); } - if (selectedPath.files) { + if (selectedPath.children) { var exists = false; - selectedPath.files.forEach(function(f) { + selectedPath.children.forEach(function(f) { if (f.label === filename) { exists = true; } @@ -133,7 +133,17 @@ RED.clipboard = (function() { class: "primary", text: RED._("common.label.import"), click: function() { - RED.view.importNodes($("#clipboard-import").val(),$("#import-tab > a.selected").attr('id') === 'import-tab-new'); + var addNewFlow = ($("#import-tab > a.selected").attr('id') === 'import-tab-new'); + if (activeTab === "clipboard-dialog-import-tab-clipboard") { + RED.view.importNodes($("#clipboard-import").val(),addNewFlow); + } else { + var selectedPath = libraryBrowser.getSelected(); + if (selectedPath.path) { + $.get('library/flows/'+selectedPath.path, function(data) { + RED.view.importNodes(data,addNewFlow); + }); + } + } $( this ).dialog( "close" ); } } @@ -160,12 +170,12 @@ RED.clipboard = (function() { ''+ ''+ ''+ - '
').appendTo(parseError);
- $('').text(v.substring(errorPos-12,errorPos)).appendTo(code)
- $('').text(v.charAt(errorPos)).appendTo(code);
- $('').text(v.substring(errorPos+1,errorPos+12)).appendTo(code);
- }
- popover.close(true).setContent(message).open();
- currentPopoverError = errString;
- }
- } else {
+ validateImportTimeout = setTimeout(function() {
+ var importInput = $("#clipboard-import");
+ var v = importInput.val().trim();
+ if (v === "") {
+ popover.close(true);
currentPopoverError = null;
+ importInput.removeClass("input-error");
+ $("#clipboard-dialog-ok").button("disable");
+ return;
}
+ try {
+ if (!/^\[[\s\S]*\]$/m.test(v)) {
+ throw new Error(RED._("clipboard.import.errors.notArray"));
+ }
+ var res = JSON.parse(v);
+ for (var i=0;i
').appendTo(parseError);
+ $('').text(v.substring(errorPos-12,errorPos)).appendTo(code)
+ $('').text(v.charAt(errorPos)).appendTo(code);
+ $('').text(v.substring(errorPos+1,errorPos+12)).appendTo(code);
+ }
+ popover.close(true).setContent(message).open();
+ currentPopoverError = errString;
+ }
+ } else {
+ currentPopoverError = null;
+ }
+ $("#clipboard-dialog-ok").button("disable");
+ }
+ },100);
+ } else {
+ var file = libraryBrowser.getSelected();
+ if (file && file.label && !file.children) {
+ $("#clipboard-dialog-ok").button("enable");
+ } else {
$("#clipboard-dialog-ok").button("disable");
}
- },100);
+ }
}
- function importNodes() {
+ function importNodes(mode) {
if (disabled) {
return;
}
+ mode = mode || "clipboard";
+
dialogContainer.empty();
dialogContainer.append($(importNodesDialog));
+
+ var tabs = RED.tabs.create({
+ id: "clipboard-dialog-import-tabs",
+ vertical: true,
+ onchange: function(tab) {
+ $("#clipboard-dialog-import-tabs-content").children().hide();
+ $("#" + tab.id).show();
+ activeTab = tab.id;
+ if (popover) {
+ popover.close(true);
+ currentPopoverError = null;
+ }
+ if (tab.id === "clipboard-dialog-import-tab-clipboard") {
+ $("#clipboard-import").focus();
+ }
+ validateImport();
+ }
+ });
+ tabs.addTab({
+ id: "clipboard-dialog-import-tab-clipboard",
+ label: RED._("clipboard.clipboard")
+ });
+ tabs.addTab({
+ id: "clipboard-dialog-import-tab-library",
+ label: RED._("library.library")
+ });
+
+ tabs.activateTab("clipboard-dialog-import-tab-"+mode);
+ if (mode === 'clipboard') {
+ setTimeout(function() {
+ $("#clipboard-import").focus();
+ },100)
+ }
+
+
+ $("#clipboard-dialog-tab-library-name").keyup(validateExportFilename);
+ $("#clipboard-dialog-tab-library-name").on('paste',function() { setTimeout(validateExportFilename,10)});
+ $("#clipboard-dialog-export").button("enable");
+
+ libraryBrowser = RED.library.createBrowser({
+ container: $("#clipboard-dialog-import-tab-library-browser"),
+ onselect: function(file) {
+ if (file && file.label && !file.children) {
+ $("#clipboard-dialog-ok").button("enable");
+ } else {
+ $("#clipboard-dialog-ok").button("disable");
+ }
+ }
+ })
+ loadFlowLibrary(libraryBrowser,true);
+
dialogContainer.i18n();
$("#clipboard-dialog-ok").show();
@@ -381,7 +464,7 @@ RED.clipboard = (function() {
onchange: function(tab) {
$("#clipboard-dialog-export-tabs-content").children().hide();
$("#" + tab.id).show();
- activeExportTab = tab.id;
+ activeTab = tab.id;
if (tab.id === "clipboard-dialog-export-tab-clipboard") {
$("#clipboard-dialog-export").button("option","label", RED._("clipboard.export.copy"))
$("#clipboard-dialog-download").show();
@@ -394,11 +477,11 @@ RED.clipboard = (function() {
});
tabs.addTab({
id: "clipboard-dialog-export-tab-clipboard",
- label: "Clipboard"
+ label: RED._("clipboard.clipboard")
});
tabs.addTab({
id: "clipboard-dialog-export-tab-library",
- label: "Library"
+ label: RED._("library.library")
});
tabs.activateTab("clipboard-dialog-export-tab-"+mode);
@@ -416,53 +499,10 @@ RED.clipboard = (function() {
}
}
})
+ loadFlowLibrary(libraryBrowser,false);
- function xformList(list,label,root) {
- var result = {
- icon: root===""?"fa fa-archive":'fa fa-folder',
- label: label,
- path: root
- };
- result.children = [];
-
- if (list.f) {
- list.f.forEach(function(f) {
- result.children.push({
- icon: 'fa fa-file-o',
- label: f,
- path: root+f
- });
- });
- }
- if (list.d) {
- for (var l in list.d) {
- if (list.d.hasOwnProperty(l)) {
- if (root+l !== "_examples_") {
- result.children.push(xformList(list.d[l], l,root+l+"/"))
- }
- }
- }
- }
- result.children.sort(function(A,B){
- if (A.children && !B.children) {
- return -1;
- } else if (!A.children && B.children) {
- return 1;
- } else {
- return A.label.localeCompare(B.label);
- }
- });
- return result;
- }
-
- $.getJSON("library/flows", function(data) {
- var listing = [xformList(data,"Local","")];
- listing[0].expanded = true;
- libraryBrowser.data(listing);
- });
$("#clipboard-dialog-tab-library-name").val("flows.json").select();
-
dialogContainer.i18n();
var format = RED.settings.flowFilePretty ? "export-format-full" : "export-format-mini";
@@ -569,6 +609,60 @@ RED.clipboard = (function() {
$("#clipboard-dialog-download").show();
}
+ function transformFlowList(list,label,root,includeExamples) {
+ var result = {
+ icon: root===""?"fa fa-archive":'fa fa-folder',
+ label: label,
+ path: root
+ };
+ result.children = [];
+
+ if (list.f) {
+ list.f.forEach(function(f) {
+ result.children.push({
+ icon: 'fa fa-file-o',
+ label: f,
+ path: root+f
+ });
+ });
+ }
+ if (list.d) {
+ for (var l in list.d) {
+ if (list.d.hasOwnProperty(l)) {
+ if (root+l !== "_examples_") {
+ result.children.push(transformFlowList(list.d[l], l,root+l+"/",includeExamples))
+ } else if (includeExamples) {
+ result._examples = transformFlowList(list.d[l], l,root+l+"/",includeExamples)
+ }
+ }
+ }
+ }
+ result.children.sort(function(A,B){
+ if (A.children && !B.children) {
+ return -1;
+ } else if (!A.children && B.children) {
+ return 1;
+ } else {
+ return A.label.localeCompare(B.label);
+ }
+ });
+ return result;
+ }
+
+ function loadFlowLibrary(browser,includeExamples) {
+ $.getJSON("library/flows", function(data) {
+ var listing = [transformFlowList(data,RED._("library.types.local"),"",includeExamples)];
+ listing[0].expanded = true;
+ if (includeExamples && listing[0]._examples) {
+ var examples = listing[0]._examples;
+ delete listing[0]._examples;
+ examples.label = RED._("library.types.examples");
+ examples.icon = "fa fa-archive";
+ listing.unshift(examples)
+ }
+ browser.data(listing);
+ });
+ }
function hideDropTarget() {
$("#dropTarget").hide();
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js
index 70054c727..925acfba4 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js
@@ -121,24 +121,41 @@
container.addClass('built');
var childrenAdded = false;
var spinner;
+ var startTime = 0;
item.children(item,function(children) {
childrenAdded = true;
- item.treeList.childList = that._addChildren(container,parent,children,depth);
- if (spinner) {
- spinner.remove();
+ item.treeList.childList = that._addChildren(container,item,children,depth).hide();
+ var delta = Date.now() - startTime;
+ if (delta < 400) {
+ setTimeout(function() {
+ item.treeList.childList.slideDown('fast');
+ if (spinner) {
+ spinner.remove();
+ }
+ },400-delta);
+ } else {
+ item.treeList.childList.slideDown('fast');
+ if (spinner) {
+ spinner.remove();
+ }
}
that._trigger("childrenloaded",null,item)
});
if (!childrenAdded) {
+ startTime = Date.now();
spinner = $('').css({
"background-position": (35+depth*15)+'px 50%'
}).appendTo(container);
}
+ } else {
+ item.treeList.childList.slideDown('fast');
}
container.addClass("expanded");
+
}
item.treeList.collapse = function() {
+ item.treeList.childList.slideUp('fast');
container.removeClass("expanded");
}
@@ -181,7 +198,7 @@
}
if (item.children) {
if (Array.isArray(item.children)) {
- item.treeList.childList = that._addChildren(container,item,item.children,depth);
+ item.treeList.childList = that._addChildren(container,item,item.children,depth).hide();
}
if (item.expanded) {
item.treeList.expand();
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js
index 6b5af77fa..7c8b5d811 100755
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/library.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/library.js
@@ -15,16 +15,14 @@
**/
RED.library = (function() {
- var exportToLibraryDialog;
var loadLibraryBrowser;
var saveLibraryBrowser;
var libraryEditor;
var activeLibrary;
-
var _libraryLookup = ''+
'