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 7a7661b1f..27993fa9f 100644 --- 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 @@ -424,6 +424,8 @@ "updated": "updated", "install": "install", "installed": "installed", + "conflict": "conflict", + "conflictTip": "

The module cannot be installed as it includes a
node type that has already been installed

Conflicts with __module__

", "loading": "Loading catalogues...", "tab-nodes": "Nodes", "tab-install": "Install", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js index 12febdcf2..c8f4e3d7d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js @@ -321,7 +321,7 @@ RED.palette.editor = (function() { var catalogueLoadStart; var catalogueLoadErrors = false; - var activeSort = sortModulesAZ; + var activeSort = sortModulesRelevance; function handleCatalogResponse(err,catalog,index,v) { catalogueLoadStatus.push(err||v); @@ -333,6 +333,9 @@ RED.palette.editor = (function() { if (m.keywords) { m.index = m.index.concat(m.keywords); } + if (m.types) { + m.index = m.index.concat(m.types); + } if (m.updated_at) { m.timestamp = new Date(m.updated_at).getTime(); } else { @@ -413,6 +416,17 @@ RED.palette.editor = (function() { packageList.editableList('addItem',{start:10,more:filteredList.length-10}) } } + function sortModulesRelevance(A,B) { + var currentFilter = searchInput.searchBox('value').trim(); + if (currentFilter === "") { + return sortModulesAZ(A,B); + } + var i = A.info.index.indexOf(currentFilter) - B.info.index.indexOf(currentFilter); + if (i === 0) { + return sortModulesAZ(A,B); + } + return i; + } function sortModulesAZ(A,B) { return A.info.id.localeCompare(B.info.id); } @@ -747,32 +761,29 @@ RED.palette.editor = (function() { $('').text(RED._("palette.editor.sort")+' ').appendTo(toolBar); var sortGroup = $('').appendTo(toolBar); - var sortAZ = $('').appendTo(sortGroup); - var sortRecent = $('').appendTo(sortGroup); + var sortRelevance = $('').appendTo(sortGroup); + var sortAZ = $('').appendTo(sortGroup); + var sortRecent = $('').appendTo(sortGroup); - sortAZ.click(function(e) { - e.preventDefault(); - if ($(this).hasClass("selected")) { - return; - } - $(this).addClass("selected"); - sortRecent.removeClass("selected"); - activeSort = sortModulesAZ; - refreshFilteredItems(); + + var sortOpts = [ + {button: sortRelevance, func: sortModulesRelevance}, + {button: sortAZ, func: sortModulesAZ}, + {button: sortRecent, func: sortModulesRecent} + ] + sortOpts.forEach(function(opt) { + opt.button.click(function(e) { + e.preventDefault(); + if ($(this).hasClass("selected")) { + return; + } + $(".palette-editor-install-sort-option").removeClass("selected"); + $(this).addClass("selected"); + activeSort = opt.func; + refreshFilteredItems(); + }); }); - sortRecent.click(function(e) { - e.preventDefault(); - if ($(this).hasClass("selected")) { - return; - } - $(this).addClass("selected"); - sortAZ.removeClass("selected"); - activeSort = sortModulesRecent; - refreshFilteredItems(); - }); - - var refreshSpan = $('').appendTo(toolBar); var refreshButton = $('').appendTo(refreshSpan); refreshButton.click(function(e) { @@ -814,10 +825,23 @@ RED.palette.editor = (function() { $('').attr('href',entry.url).appendTo(titleRow); var descRow = $('
').appendTo(headerRow); $('
',{class:"palette-module-description"}).text(entry.description).appendTo(descRow); - var metaRow = $('
').appendTo(headerRow); $(' '+entry.version+'').appendTo(metaRow); $(' '+formatUpdatedAt(entry.updated_at)+'').appendTo(metaRow); + + var duplicateType = false; + if (entry.types && entry.types.length > 0) { + + for (var i=0;i',{class:"palette-module-meta"}).text(entry.types.join(",")).appendTo(headerRow); + } + var buttonRow = $('
',{class:"palette-module-meta"}).appendTo(headerRow); var buttonGroup = $('
',{class:"palette-module-button-group"}).appendTo(buttonRow); var installButton = $('').text(RED._('palette.editor.install')).appendTo(buttonGroup); @@ -830,6 +854,16 @@ RED.palette.editor = (function() { if (nodeEntries.hasOwnProperty(entry.id)) { installButton.addClass('disabled'); installButton.text(RED._('palette.editor.installed')); + } else if (duplicateType) { + installButton.addClass('disabled'); + installButton.text(RED._('palette.editor.conflict')); + RED.popover.create({ + target:installButton, + content: RED._('palette.editor.conflictTip',{module:duplicateType}), + trigger:"hover", + direction:"bottom", + delay:{show:750,hide:50} + }) } object.elements = { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/popover.scss b/packages/node_modules/@node-red/editor-client/src/sass/popover.scss index 55b88452f..d703b29a7 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/popover.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/popover.scss @@ -159,3 +159,8 @@ border-color: #666 !important; } } +.red-ui-popover code { + border: none; + background: none; + color: #ccc; +}