Merge branch 'master' into master

This commit is contained in:
sonics007
2024-11-10 21:45:15 +01:00
committed by GitHub
26 changed files with 296 additions and 142 deletions

View File

@@ -27,7 +27,8 @@
"lock": "Bloquear",
"unlock": "Desbloquear",
"locked": "Bloqueado",
"unlocked": "Desbloqueado"
"unlocked": "Desbloqueado",
"format": "Formato"
},
"type": {
"string": "texto",
@@ -303,7 +304,8 @@
"missingType": "La entrada no es un flujo válido - elemento __index__ falta la propiedad 'type'"
},
"conflictNotification1": "Algunos de los nodos que estás importando ya existen en tu espacio de trabajo.",
"conflictNotification2": "Selecciona qué nodos importar y si reemplazar los nodos existentes o importar una copia de los mismos."
"conflictNotification2": "Selecciona qué nodos importar y si reemplazar los nodos existentes o importar una copia de los mismos.",
"alreadyExists": "Este nodo ya existe"
},
"copyMessagePath": "Ruta copiada",
"copyMessageValue": "Valor copiado",
@@ -371,8 +373,12 @@
"deleted": "eliminado",
"flowDeleted": "flujo eliminado",
"flowAdded": "flujo añadido",
"moved": "movido",
"movedTo": "movido a __id__",
"movedFrom": "movido desde __id__"
"movedFrom": "movido desde __id__",
"none": "ninguno",
"position": "posición",
"wires": "conectores"
},
"nodeCount": "__count__ nodo",
"nodeCount_plural": "__count__ nodos",
@@ -381,9 +387,14 @@
"reviewChanges": "Revisar Cambios",
"noBinaryFileShowed": "No se puede mostrar el contenido del archivo binario",
"viewCommitDiff": "Ver cambios de commit",
"commit": "Commit",
"compareChanges": "Comparar Cambios",
"saveConflict": "Guardar resolución de conflictos",
"conflictHeader": "<span>__resolved__</span> de <span>__unresolved__</span> conflictos resueltos",
"localChanges": "Cambios Locales",
"remoteChanges": "Cambios Remotos",
"useLocalChanges": "utilizar cambios locales",
"useRemoteChanges": "utilizar cambios remotos",
"commonVersionError": "La versión común no contiene JSON válido:",
"oldVersionError": "La versión anterior no contiene JSON válido:",
"newVersionError": "La versión nueva no contiene JSON válido:"
@@ -551,7 +562,9 @@
"types": {
"local": "Local",
"examples": "Ejemplos"
}
},
"type": "Tipo",
"name": "Nombre"
},
"palette": {
"noInfo": "no hay información disponible",
@@ -613,6 +626,8 @@
},
"nodeCount": "__label__ nodo",
"nodeCount_plural": "__label__ nodos",
"pluginCount": "__count__ extensión",
"pluginCount_plural": "__count__ extensiones",
"moduleCount": "__count__ módulo disponible",
"moduleCount_plural": "__count__ módulos disponibles",
"inuse": "en uso",
@@ -640,6 +655,7 @@
"errors": {
"catalogLoadFailed": "<p>La carga del catálogo de nodos ha fallado</p><p>Revise la consola del navegador para mas información</p>",
"installFailed": "<p>Fallo al instalar: __module__</p><p>__message__</p><p>Revise el log para mas información</p>",
"installTimeout": "<p>La instalación continúa en segundo plano.</p><p>Los nodos aparecerán en la paleta cuando finalice. Consulta el registro para obtener más información.</p>",
"removeFailed": "<p>Fallo al eliminar: __module__</p><p>__message__</p><p>Revise el log para mas información</p>",
"updateFailed": "<p>Fallo al actualizar: __module__</p><p>__message__</p><p>Revise el log para mas información</p>",
"enableFailed": "<p>Fallo al activar: __module__</p><p>__message__</p><p>Revise el log para mas información</p>",
@@ -654,6 +670,9 @@
"body":"<p>Eliminando '__module__'</p><p>La eliminación del nodo lo desinstalará de Node-RED. Es posible que el nodo siga utilizando recursos hasta que Node-RED sea reiniciado.</p>",
"title": "Eliminar nodos"
},
"removePlugin": {
"body": "<p>Extensión __module__ eliminada. Vuelve a cargar el editor para borrar los elementos sobrantes.</p>"
},
"update": {
"body":"<p>Actualizando '__module__'</p><p>La actualización del nodo requerirá un reinicio manual de Node-RED para completarse. Debe ser reiniciado manualmente.</p>",
"title": "Actualizar nodos"
@@ -665,7 +684,8 @@
"review": "Abrir información del nodo",
"install": "Instalar",
"remove": "Eliminar",
"update": "Actualizar"
"update": "Actualizar",
"understood": "Entendido"
}
}
}
@@ -718,6 +738,7 @@
"nodeHelp": "Ayuda de nodo",
"showHelp": "Mostrar ayuda",
"showInOutline": "Mostrar en controno",
"hideTopics": "Esconder temas",
"showTopics": "Mostrar temas",
"noHelp": "No hay ningun tema de ayuda seleccionado",
"changeLog": "Registro de Cambios"
@@ -792,6 +813,7 @@
"branches": "Ramas",
"noBranches": "Sin ramas",
"deleteConfirm": "¿Estás seguro de que quieres eliminar la rama local '__name__'? Esta acción no puede deshacerse.",
"deleteBranch": "Eliminar rama",
"unmergedConfirm": "La rama local '__name__' tiene cambios no fusionados que se perderán. ¿Estás seguro de que quieres eliminarla?",
"deleteUnmergedBranch": "Eliminar rama no fusionada",
"gitRemotes": "Git remotes",
@@ -913,6 +935,8 @@
}
},
"typedInput": {
"selected": "__count__ seleccionado",
"selected_plural": "__count__ seleccionados",
"type": {
"str": "texto",
"num": "número",
@@ -923,7 +947,14 @@
"date": "marca tiempo",
"jsonata": "expresión",
"env": "variable de entorno",
"cred": "credencial"
"cred": "credencial",
"conf-types": "nodo configuración"
},
"date": {
"format": {
"timestamp": "milisegundos desde epoch",
"object": "Objeto de fecha de JavaScript"
}
}
},
"editableList": {
@@ -1205,6 +1236,18 @@
"diagnostics": {
"title": "Información Sistema"
},
"languages": {
"de": "Deutsch",
"en-US": "English",
"es-ES": "Español (España)",
"fr": "Français",
"ja": "日本語",
"ko": "Korean",
"pt-BR": "Português (Brasil)",
"ru": "Русский",
"zh-CN": "简体中文",
"zh-TW": "繁體中文"
},
"validator": {
"errors": {
"invalid-json": "Datos JSON inválidos: __error__",

View File

@@ -1,6 +1,6 @@
{
"name": "@node-red/editor-client",
"version": "4.0.3",
"version": "4.0.5",
"license": "Apache-2.0",
"repository": {
"type": "git",

View File

@@ -73,7 +73,13 @@ RED.nodes = (function() {
var exports = {
setModulePendingUpdated: function(module,version) {
moduleList[module].pending_version = version;
if (!!RED.plugins.getModule(module)) {
// The module updated is a plugin
RED.plugins.getModule(module).pending_version = version;
} else {
moduleList[module].pending_version = version;
}
RED.events.emit("registry:module-updated",{module:module,version:version});
},
getModule: function(module) {
@@ -2408,7 +2414,7 @@ RED.nodes = (function() {
}
// If importing a link node, ensure both ends of each link are either:
// - not in a subflow
// - both in the same subflow
// - both in the same subflow (not for link call node)
if (/^link /.test(n.type) && n.links) {
n.links = n.links.filter(function(id) {
const otherNode = node_map[id] || RED.nodes.node(id);
@@ -2419,9 +2425,13 @@ RED.nodes = (function() {
if (otherNode.z === n.z) {
// Both ends in the same flow/subflow
return true
} else if (n.type === "link call" && !getSubflow(otherNode.z)) {
// Link call node can call out of a subflow as long as otherNode is
// not in a subflow
return true
} else if (!!getSubflow(n.z) || !!getSubflow(otherNode.z)) {
// One end is in a subflow - remove the link
return false
return false
}
return true
});

View File

@@ -589,7 +589,9 @@ RED.deploy = (function() {
RED.notify('<p>' + RED._("deploy.successfulDeploy") + '</p>', "success");
}
const flowsToLock = new Set()
// Node's properties cannot be modified if its workspace is locked.
function ensureUnlocked(id) {
// TODO: `RED.nodes.subflow` is useless
const flow = id && (RED.nodes.workspace(id) || RED.nodes.subflow(id) || null);
const isLocked = flow ? flow.locked : false;
if (flow && isLocked) {
@@ -642,6 +644,7 @@ RED.deploy = (function() {
delete confNode.credentials;
}
});
// Subflow cannot be locked
RED.nodes.eachSubflow(function (subflow) {
if (subflow.changed) {
subflow.changed = false;
@@ -650,12 +653,18 @@ RED.deploy = (function() {
});
RED.nodes.eachWorkspace(function (ws) {
if (ws.changed || ws.added) {
ensureUnlocked(ws.z)
// Ensure the Workspace is unlocked to modify its properties.
ensureUnlocked(ws.id);
ws.changed = false;
delete ws.added
if (flowsToLock.has(ws)) {
ws.locked = true;
flowsToLock.delete(ws);
}
RED.events.emit("flows:change", ws)
}
});
// Ensures all workspaces to be locked have been locked.
flowsToLock.forEach(flow => {
flow.locked = true
})

View File

@@ -131,7 +131,7 @@ RED.editor.envVarList = (function() {
nameField.trigger('change');
}
},
sortable: ".red-ui-editableList-item-handle",
sortable: true,
removable: false
});
var parentEnv = {};

View File

@@ -382,7 +382,7 @@ RED.typeSearch = (function() {
var items = [];
RED.nodes.registry.getNodeTypes().forEach(function(t) {
var def = RED.nodes.getType(t);
if (def.category !== 'config' && t !== 'unknown' && t !== 'tab') {
if (def.set?.enabled !== false && def.category !== 'config' && t !== 'unknown' && t !== 'tab') {
items.push({type:t,def: def, label:getTypeLabel(t,def)});
}
});

View File

@@ -1102,18 +1102,27 @@ RED.view.tools = (function() {
const paletteLabel = RED.utils.getPaletteLabel(n.type, nodeDef)
const defaultNodeNameRE = new RegExp('^'+paletteLabel.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')+' (\\d+)$')
if (!typeIndex.hasOwnProperty(n.type)) {
const existingNodes = RED.nodes.filterNodes({type: n.type})
let maxNameNumber = 0;
existingNodes.forEach(n => {
let match = defaultNodeNameRE.exec(n.name)
const existingNodes = RED.nodes.filterNodes({ type: n.type });
const existingIds = existingNodes.reduce((ids, node) => {
let match = defaultNodeNameRE.exec(node.name);
if (match) {
let nodeNumber = parseInt(match[1])
if (nodeNumber > maxNameNumber) {
maxNameNumber = nodeNumber
const nodeNumber = parseInt(match[1], 10);
if (!ids.includes(nodeNumber)) {
ids.push(nodeNumber);
}
}
})
typeIndex[n.type] = maxNameNumber + 1
return ids;
}, []).sort((a, b) => a - b);
let availableNameNumber = 1;
for (let i = 0; i < existingIds.length; i++) {
if (existingIds[i] !== availableNameNumber) {
break;
}
availableNameNumber++;
}
typeIndex[n.type] = availableNameNumber;
}
if ((options.renameBlank && n.name === '') || (options.renameClash && defaultNodeNameRE.test(n.name))) {
if (generateHistory) {