diff --git a/ui/src/app/components/nav-tree.scss b/ui/src/app/components/nav-tree.scss
index dc21431479..da50ccea5e 100644
--- a/ui/src/app/components/nav-tree.scss
+++ b/ui/src/app/components/nav-tree.scss
@@ -132,12 +132,6 @@
}
}
- &.tb-edge-group {
- &::before {
- content: "router";
- }
- }
-
&.tb-rule-chain-group {
&::before {
content: "settings_ethernet";
diff --git a/ui/src/app/customer/customer-fieldset.tpl.html b/ui/src/app/customer/customer-fieldset.tpl.html
index a67a4391df..f24eb3048b 100644
--- a/ui/src/app/customer/customer-fieldset.tpl.html
+++ b/ui/src/app/customer/customer-fieldset.tpl.html
@@ -19,7 +19,7 @@
{{ 'customer.manage-assets' | translate }}
{{ 'customer.manage-devices' | translate }}
{{ 'customer.manage-dashboards' | translate }}
-{{ 'customer.manage-edges' | translate }}
+{{ 'customer.manage-edges' | translate }}
{{ 'customer.delete' | translate }}
diff --git a/ui/src/app/customer/customer.controller.js b/ui/src/app/customer/customer.controller.js
index 2d1d2202a8..8c20cddb6b 100644
--- a/ui/src/app/customer/customer.controller.js
+++ b/ui/src/app/customer/customer.controller.js
@@ -21,7 +21,7 @@ import customerCard from './customer-card.tpl.html';
/* eslint-enable import/no-unresolved, import/default */
/*@ngInject*/
-export default function CustomerController(customerService, $state, $stateParams, $translate, types) {
+export default function CustomerController(customerService, $state, $stateParams, $translate, types, userService) {
var customerActionsList = [
{
@@ -76,21 +76,29 @@ export default function CustomerController(customerService, $state, $stateParams
}
},
icon: "dashboard"
- },
- {
- onAction: function ($event, item) {
- openCustomerEdges($event, item);
- },
- name: function() { return $translate.instant('edge.edge-instances') },
- details: function(customer) {
- if (customer && customer.additionalInfo && customer.additionalInfo.isPublic) {
- return $translate.instant('customer.manage-public-edges')
- } else {
- return $translate.instant('customer.manage-customer-edges')
- }
- },
- icon: "router"
- },
+ }];
+
+ if (userService.isEdgesSupportEnabled()) {
+ customerActionsList.push(
+ {
+ onAction: function ($event, item) {
+ openCustomerEdges($event, item);
+ },
+ name: function() { return $translate.instant('edge.edge-instances') },
+ details: function(customer) {
+ if (customer && customer.additionalInfo && customer.additionalInfo.isPublic) {
+ return $translate.instant('customer.manage-public-edges')
+ } else {
+ return $translate.instant('customer.manage-customer-edges')
+ }
+ },
+ icon: "router",
+ isEnabled: false
+ }
+ )
+ }
+
+ customerActionsList.push(
{
onAction: function ($event, item) {
vm.grid.deleteItem($event, item);
@@ -102,12 +110,14 @@ export default function CustomerController(customerService, $state, $stateParams
return customer && (!customer.additionalInfo || !customer.additionalInfo.isPublic);
}
}
- ];
+ );
var vm = this;
vm.types = types;
+ vm.isEdgesSupportEnabled = userService.isEdgesSupportEnabled();
+
vm.customerGridConfig = {
refreshParamsFunc: null,
diff --git a/ui/src/app/edge/edge-fieldset.tpl.html b/ui/src/app/edge/edge-fieldset.tpl.html
index c5760a939c..68daecac44 100644
--- a/ui/src/app/edge/edge-fieldset.tpl.html
+++ b/ui/src/app/edge/edge-fieldset.tpl.html
@@ -58,7 +58,7 @@
@@ -67,14 +67,14 @@
edge.copy-edge-secret
diff --git a/ui/src/app/locale/locale.constant-de_DE.json b/ui/src/app/locale/locale.constant-de_DE.json
index 1f495ccdf0..8fdef0c489 100644
--- a/ui/src/app/locale/locale.constant-de_DE.json
+++ b/ui/src/app/locale/locale.constant-de_DE.json
@@ -811,7 +811,66 @@
"event-action": "Ereignisaktion",
"load-entity-error": "Entität nicht gefunden. Fehler beim Laden der Informationen",
"unassign-edges-text": "Nach der Bestätigung werden alle ausgewählten Kanten nicht zugewiesen und sind für den Kunden nicht zugänglich.",
- "unassign-edges-title": "Sind Sie sicher, dass Sie die Zuordnung aufheben möchten { count, plural, 1 {1 Rand} other {# Rand} }?"
+ "unassign-edges-title": "Sind Sie sicher, dass Sie die Zuordnung aufheben möchten { count, plural, 1 {1 Rand} other {# Rand} }?",
+ "edge-file": "Edge-Datei",
+ "name-starts-with": "Der Kantenname beginnt mit",
+ "rulechain-templates": "Regelkettenvorlagen",
+ "rulechain-template": "Regelkettenvorlage",
+ "unassign-edges-action-title": "Heben Sie die Zuordnung von {count, plural, 1 {1 edge} other {# edge}} vom Kunden auf",
+ "enter-edge-type": "Geben Sie den Kantentyp ein",
+ "no-edge-types-matching": "Es wurden keine Kantentypen gefunden, die mit '{{entitySubtype}}' übereinstimmen.",
+ "edge-type-list-empty": "Keine Kantentypen ausgewählt.",
+ "edge-types": "Kantentypen",
+ "license-key-hint": "Um Ihre Lizenz zu erhalten, navigieren Sie zur Preisseite und wählen Sie die beste Lizenzoption für Ihre aus Fall.",
+ "cloud-endpoint-hint": "Edge erfordert HTTP-Zugriff auf die Cloud (ThingsBoard CE / PE), um den Lizenzschlüssel zu überprüfen. Bitte geben Sie die Cloud-URL an, zu der Edge eine Verbindung herstellen kann.",
+ "missing-related-rule-chains-title": "In Edge fehlen verwandte Regelketten.",
+ "missing-related-rule-chains-text": "Randregelkette (n) zugewiesen Verwenden Sie Regelknoten, die Nachrichten an Regelkette (n) weiterleiten, die dieser Kante nicht zugeordnet sind.
Liste der fehlenden Regelketten:
{{missingRuleChains}}",
+ "downlinks": "Downlinks",
+ "no-downlinks-prompt": "Keine Downlinks gefunden",
+ "assigned-to-customer-widget": "Zugewiesen an: {{customerTitle}}",
+ "widget-datasource-error": "Dieses Widget unterstützt nur EDGE-Entitätsdatenquellen"
+ },
+ "edge-event": {
+ "type-dashboard": "Dashboard",
+ "type-asset": "Asset",
+ "type-device": "Device",
+ "type-device-profile": "Device Profile",
+ "type-entity-view": "Entity View",
+ "type-alarm": "Alar",
+ "type-rule-chain": "Rule Chain",
+ "type-rule-chain-metadata": "Rule Chain Metadata",
+ "type-edge": "Edge",
+ "type-entity-group": "Entity Group",
+ "type-scheduler-event": "Scheduler Event",
+ "type-white-labeling": "White Labeling",
+ "type-login-white-labeling": "White Labeling Login",
+ "type-user": "User",
+ "type-tenant": "Tenant",
+ "type-customer": "Customer",
+ "type-custom-translation": "Custom Translation",
+ "type-relation": "Relation",
+ "type-widgets-bundle": "Widgets Bundle",
+ "type-widgets-type": "Widgets Type",
+ "type-admin-settings": "Admin Settings",
+ "action-type-added": "Added",
+ "action-type-deleted": "Deleted",
+ "action-type-updated": "Updated",
+ "action-type-post-attributes": "Post Attributes",
+ "action-type-attributes-updated": "Attributes Updated",
+ "action-type-attributes-deleted": "Attributes Deleted",
+ "action-type-timeseries-updated": "Timeseries Updated",
+ "action-type-credentials-updated": "Credentials Updated",
+ "action-type-assigned-to-customer": "Assigned to Customer",
+ "action-type-unassigned-from-customer": "Unassigned from Customer",
+ "action-type-relation-add-or-update": "Relation Add or Update",
+ "action-type-relation-deleted": "Relation Deleted",
+ "action-type-rpc-call": "RPC Call",
+ "action-type-alarm-ack": "Alarm Ack",
+ "action-type-alarm-clear": "Alarm Clear",
+ "action-type-assigned-to-edge": "Assigned to Edge",
+ "action-type-unassigned-from-edge": "Unassigned from Edge",
+ "action-type-credentials-request": "Credentials Request",
+ "action-type-entity-merge-request": "Entity Merge Request"
},
"error": {
"unable-to-connect": "Es konnte keine Verbindung zum Server hergestellt werden! Bitte überprüfen Sie Ihre Internetverbindung.",
@@ -1409,7 +1468,11 @@
"unset-auto-assign-to-edge": "Weisen Sie Kanten bei der Erstellung keine Regelkette zu",
"unset-auto-assign-to-edge-title": "Sind Sie sicher, dass Sie die Kantenregelkette '{{ruleChainName}}' bei der Erstellung nicht den Kanten zuweisen möchten?",
"unset-auto-assign-to-edge-text": "Nach der Bestätigung wird die Kantenregelkette bei der Erstellung nicht mehr automatisch den Kanten zugewiesen.",
- "edge-template-root": "Vorlagenstamm"
+ "edge-template-root": "Vorlagenstamm",
+ "set-auto-assign-to-edge-card": "Bei der Erstellung den Kanten zuweisen",
+ "set-default-root-edge": "Machen Sie die Regelkette zum Standardstamm",
+ "set-default-root-edge-rulechain-title": "Sind Sie sicher, dass Sie die Standardkettenwurzel der Regelkette '{{ruleChainName}}' festlegen möchten?",
+ "set-default-root-edge-rulechain-text": "Nach der Bestätigung wird die Regelkette zum Standard-Edge-Root und verarbeitet alle eingehenden Transportnachrichten."
},
"rulenode": {
"details": "Details",
diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json
index c064e6d83f..7cde59ad04 100644
--- a/ui/src/app/locale/locale.constant-en_US.json
+++ b/ui/src/app/locale/locale.constant-en_US.json
@@ -769,7 +769,6 @@
"management": "Edge management",
"no-edges-matching": "No edges matching '{{entity}}' were found.",
"add": "Add Edge",
- "view": "View Edge",
"no-edges-text": "No edges found",
"edge-details": "Edge details",
"add-edge-text": "Add new edge",
@@ -794,7 +793,6 @@
"id-copied-message": "Edge Id has been copied to clipboard",
"sync": "Sync Edge",
"sync-message": "Edge has been synchronized",
- "permissions": "Permissions",
"edge-required": "Edge required",
"edge-type": "Edge type",
"edge-type-required": "Edge type is required.",
diff --git a/ui/src/app/locale/locale.constant-es_ES.json b/ui/src/app/locale/locale.constant-es_ES.json
index 07acd04e3a..9083bf966b 100644
--- a/ui/src/app/locale/locale.constant-es_ES.json
+++ b/ui/src/app/locale/locale.constant-es_ES.json
@@ -747,7 +747,6 @@
"management": "Gestión de bordes",
"no-edges-matching": "No se encontraron bordes que coincidan con '{{entity}}'",
"add": "Agregar borde",
- "view": "Ver borde",
"no-edges-text": "No se encontraron bordes",
"edge-details": "Detalles del borde",
"add-edge-text": "Agregar nuevo borde",
@@ -771,7 +770,6 @@
"id-copied-message": "El ID de borde se ha copiado al portapapeles",
"sync": "Sinc Edge",
"sync-message": "Edge se ha sincronizado",
- "permissions": "Permisos",
"edge-required": "Edge required",
"edge-type": "Type de la bordure",
"edge-type-required": "El tipo de borde es requerido.",
@@ -824,8 +822,67 @@
"event-action": "Información de la entidad",
"load-entity-error": "Entidad no encontrada. No se pudo cargar la información",
"unassign-edges-text": "Después de la confirmación de todos los bordes seleccionados, se anulará la asignación y el cliente no podrá acceder a ellos.",
- "unassign-edges-title": "¿Está seguro de que desea anular la asignación de {count, plural, 1 {1 borde} other {# bordes}}?"
+ "unassign-edges-title": "¿Está seguro de que desea anular la asignación de {count, plural, 1 {1 borde} other {# bordes}}?",
+ "edge-file": "Archivo de borde",
+ "name-starts-with": "Edge name starts with",
+ "rulechain-templates": "Plantillas de cadena de reglas",
+ "rulechain-template": "Plantilla de cadena de reglas",
+ "unassign-edges-action-title": "Anular la asignación de {count, plural, 1 {1 borde} other {# bordes}} del cliente",
+ "enter-edge-type": "Ingrese el tipo de borde",
+ "no-edge-types-matching": "No se encontraron tipos de aristas que coincidan con '{{entitySubtype}}'.",
+ "edge-type-list-empty": "No se seleccionó ningún tipo de borde.",
+ "edge-types": "Tipos de bordes",
+ "license-key-hint": "Para obtener su licencia, vaya a la página de precios y seleccione la mejor opción de licencia para su caso.",
+ "cloud-endpoint-hint": "Edge requiere acceso HTTP (s) a la nube (ThingsBoard CE / PE) para verificar la clave de licencia. Especifique la URL de la nube a la que Edge puede conectarse.",
+ "missing-related-rule-chains-title": "Al borde le faltan cadenas de reglas relacionadas",
+ "missing-related-rule-chains-text": "Asignado a la (s) cadena (s) de reglas de borde usa nodos de reglas que reenvían mensajes a cadenas de reglas que no están asignadas a este borde.
Lista de cadenas de reglas faltantes:
{{missingRuleChains}}",
+ "downlinks": "Enlaces descendentes",
+ "no-downlinks-prompt": "No se encontraron enlaces descendentes",
+ "assigned-to-customer-widget": "Asignado a: {{customerTitle}}",
+ "widget-datasource-error": "Este widget solo admite la fuente de datos de la entidad EDGE"
},
+ "edge-event": {
+ "type-dashboard": "Dashboard",
+ "type-asset": "Asset",
+ "type-device": "Device",
+ "type-device-profile": "Device Profile",
+ "type-entity-view": "Entity View",
+ "type-alarm": "Alar",
+ "type-rule-chain": "Rule Chain",
+ "type-rule-chain-metadata": "Rule Chain Metadata",
+ "type-edge": "Edge",
+ "type-entity-group": "Entity Group",
+ "type-scheduler-event": "Scheduler Event",
+ "type-white-labeling": "White Labeling",
+ "type-login-white-labeling": "White Labeling Login",
+ "type-user": "User",
+ "type-tenant": "Tenant",
+ "type-customer": "Customer",
+ "type-custom-translation": "Custom Translation",
+ "type-relation": "Relation",
+ "type-widgets-bundle": "Widgets Bundle",
+ "type-widgets-type": "Widgets Type",
+ "type-admin-settings": "Admin Settings",
+ "action-type-added": "Added",
+ "action-type-deleted": "Deleted",
+ "action-type-updated": "Updated",
+ "action-type-post-attributes": "Post Attributes",
+ "action-type-attributes-updated": "Attributes Updated",
+ "action-type-attributes-deleted": "Attributes Deleted",
+ "action-type-timeseries-updated": "Timeseries Updated",
+ "action-type-credentials-updated": "Credentials Updated",
+ "action-type-assigned-to-customer": "Assigned to Customer",
+ "action-type-unassigned-from-customer": "Unassigned from Customer",
+ "action-type-relation-add-or-update": "Relation Add or Update",
+ "action-type-relation-deleted": "Relation Deleted",
+ "action-type-rpc-call": "RPC Call",
+ "action-type-alarm-ack": "Alarm Ack",
+ "action-type-alarm-clear": "Alarm Clear",
+ "action-type-assigned-to-edge": "Assigned to Edge",
+ "action-type-unassigned-from-edge": "Unassigned from Edge",
+ "action-type-credentials-request": "Credentials Request",
+ "action-type-entity-merge-request": "Entity Merge Request"
+ },
"error": {
"unable-to-connect": "¡No se puede conectar al servidor! Por favor, revise su conexión a Internet.",
"unhandled-error-code": "Código de error no controlado: {{errorCode}}",
@@ -1477,7 +1534,11 @@
"unset-auto-assign-to-edge": "No asigne una cadena de reglas a los bordes en la creación",
"unset-auto-assign-to-edge-title": "¿Está seguro de que no desea asignar la cadena de reglas de borde '{{ruleChainName}}' a los bordes en la creación?",
"unset-auto-assign-to-edge-text": "Después de la confirmación, la cadena de reglas de borde ya no se asignará automáticamente a los bordes en la creación.",
- "edge-template-root": "Raíz de plantilla"
+ "edge-template-root": "Raíz de plantilla",
+ "set-auto-assign-to-edge-card": "Asignar a borde (s) en la creación",
+ "set-default-root-edge": "Hacer raíz predeterminada de la cadena de reglas",
+ "set-default-root-edge-rulechain-title": "¿Está seguro de que desea que la cadena de reglas '{{ruleChainName}}' sea la raíz del borde predeterminada?",
+ "set-default-root-edge-rulechain-text": "Después de la confirmación, la cadena de reglas se convertirá en la raíz del borde predeterminada y manejará todos los mensajes de transporte entrantes."
},
"rulenode": {
"details": "Detalles",
diff --git a/ui/src/app/locale/locale.constant-fr_FR.json b/ui/src/app/locale/locale.constant-fr_FR.json
index a4b92cae37..97b0782534 100644
--- a/ui/src/app/locale/locale.constant-fr_FR.json
+++ b/ui/src/app/locale/locale.constant-fr_FR.json
@@ -830,8 +830,67 @@
"event-action": "Action d'événement",
"load-entity-error": "Entité introuvable. Échec du chargement des informations",
"unassign-edges-text": "Après la confirmation, tous les bordures sélectionnés ne seront plus attribués et ne seront pas accessibles par le client.",
- "unassign-edges-title": "Voulez-vous vraiment annuler l'attribution de {count, plural, 1 {1 bordure} other {# bordures}}?"
+ "unassign-edges-title": "Voulez-vous vraiment annuler l'attribution de {count, plural, 1 {1 bordure} other {# bordures}}?",
+ "edge-file": "Fichier Edge",
+ "name-starts-with": "Le nom du bord commence par",
+ "rulechain-templates": "Modèles de chaîne de règles",
+ "rulechain-template": "Modèle de chaîne de règles",
+ "unassign-edges-action-title": "Annuler l'attribution de {count, plural, 1 {1 edge} other {# bords}} au client",
+ "enter-edge-type": "Entrez le type d'arête",
+ "no-edge-types-matching": "Aucun type d'arête correspondant à '{{entitySubtype}}' n'a été trouvé.",
+ "edge-type-list-empty": "Aucun type d'arête sélectionné.",
+ "edge-types": "Types de bords",
+ "license-key-hint": "Pour obtenir votre licence, accédez à la page de tarification et sélectionnez la meilleure option de licence pour votre Cas.",
+ "cloud-endpoint-hint": "Edge nécessite un accès HTTP (s) au Cloud (ThingsBoard CE / PE) pour vérifier la clé de licence. Veuillez spécifier l'URL cloud à laquelle Edge peut se connecter.",
+ "missing-related-rule-chains-title": "Edge n'a pas de chaîne (s) de règles associées",
+ "missing-related-rule-chains-text": "Les chaînes de règles affectées aux tronçons utilisent des nœuds de règles qui transfèrent les messages aux chaînes de règles non affectées à ce tronçon.
Liste des chaînes de règles manquantes:
{{missingRuleChains}}",
+ "downlinks": "Liens descendants",
+ "no-downlinks-prompt": "Aucun lien descendant trouvé",
+ "assigned-to-customer-widget": "Attribué à: {{customerTitle}}",
+ "widget-datasource-error": "Ce widget prend en charge uniquement la source de données d'entité EDGE"
},
+ "edge-event": {
+ "type-dashboard": "Dashboard",
+ "type-asset": "Asset",
+ "type-device": "Device",
+ "type-device-profile": "Device Profile",
+ "type-entity-view": "Entity View",
+ "type-alarm": "Alar",
+ "type-rule-chain": "Rule Chain",
+ "type-rule-chain-metadata": "Rule Chain Metadata",
+ "type-edge": "Edge",
+ "type-entity-group": "Entity Group",
+ "type-scheduler-event": "Scheduler Event",
+ "type-white-labeling": "White Labeling",
+ "type-login-white-labeling": "White Labeling Login",
+ "type-user": "User",
+ "type-tenant": "Tenant",
+ "type-customer": "Customer",
+ "type-custom-translation": "Custom Translation",
+ "type-relation": "Relation",
+ "type-widgets-bundle": "Widgets Bundle",
+ "type-widgets-type": "Widgets Type",
+ "type-admin-settings": "Admin Settings",
+ "action-type-added": "Added",
+ "action-type-deleted": "Deleted",
+ "action-type-updated": "Updated",
+ "action-type-post-attributes": "Post Attributes",
+ "action-type-attributes-updated": "Attributes Updated",
+ "action-type-attributes-deleted": "Attributes Deleted",
+ "action-type-timeseries-updated": "Timeseries Updated",
+ "action-type-credentials-updated": "Credentials Updated",
+ "action-type-assigned-to-customer": "Assigned to Customer",
+ "action-type-unassigned-from-customer": "Unassigned from Customer",
+ "action-type-relation-add-or-update": "Relation Add or Update",
+ "action-type-relation-deleted": "Relation Deleted",
+ "action-type-rpc-call": "RPC Call",
+ "action-type-alarm-ack": "Alarm Ack",
+ "action-type-alarm-clear": "Alarm Clear",
+ "action-type-assigned-to-edge": "Assigned to Edge",
+ "action-type-unassigned-from-edge": "Unassigned from Edge",
+ "action-type-credentials-request": "Credentials Request",
+ "action-type-entity-merge-request": "Entity Merge Request"
+ },
"entity": {
"add-alias": "Ajouter un alias d'entité",
"alarm-name-starts-with": "Les actifs dont le nom commence par '{{prefix}}'",
@@ -1455,7 +1514,11 @@
"unset-auto-assign-to-edge": "N'attribuez pas de chaîne de règles aux arêtes lors de la création",
"unset-auto-assign-to-edge-title": "Êtes-vous sûr de ne pas vouloir attribuer la chaîne de règles d'arête '{{ruleChainName}}' à l'arête (s) lors de la création?",
"unset-auto-assign-to-edge-text": "Après la confirmation, la chaîne de règles d'arêtes ne sera plus automatiquement affectée aux arêtes lors de la création.",
- "edge-template-root": "Racine du modèle"
+ "edge-template-root": "Racine du modèle",
+ "set-auto-assign-to-edge-card": "Affecter aux arêtes lors de la création",
+ "set-default-root-edge": "Rendre la chaîne de règles racine par défaut",
+ "set-default-root-edge-rulechain-title": "Voulez-vous vraiment définir la racine de périphérie par défaut de la chaîne de règles '{{ruleChainName}}'?",
+ "set-default-root-edge-rulechain-text": "Après la confirmation, la chaîne de règles deviendra la racine périphérique par défaut et gérera tous les messages de transport entrants."
},
"rulenode": {
"add": "Ajouter un noeud de règle",
diff --git a/ui/src/app/widget/lib/edges-overview-widget.js b/ui/src/app/widget/lib/edges-overview-widget.js
index c0480afb8d..588b763521 100644
--- a/ui/src/app/widget/lib/edges-overview-widget.js
+++ b/ui/src/app/widget/lib/edges-overview-widget.js
@@ -201,13 +201,15 @@ function EdgesOverviewWidgetController($scope, $translate, types, utils, entityS
function getCustomerTitle(edgeId) {
edgeService.getEdge(edgeId, true).then(
function success(edge) {
- customerService.getCustomer(edge.customerId.id, { ignoreErrors: true }).then(
- function success(customer) {
- vm.customerTitle = $translate.instant('edge.assigned-to-customer-widget', { customerTitle: customer.title });
- },
- function fail() {
- }
- );
+ if (edge.customerId.id !== types.id.nullUid) {
+ customerService.getCustomer(edge.customerId.id, { ignoreErrors: true }).then(
+ function success(customer) {
+ vm.customerTitle = $translate.instant('edge.assigned-to-customer-widget', { customerTitle: customer.title });
+ },
+ function fail() {
+ }
+ );
+ }
},
function fail() {
}