Browse Source

Merge pull request #71 from deaflynx/develop/2.6-edge

Develop/2.6 edge Edge management, enableEdge
pull/3957/head
VoBa 6 years ago
committed by GitHub
parent
commit
1bb77e2eba
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      ui/src/app/api/edge.service.js
  2. 3
      ui/src/app/api/entity.service.js
  3. 23
      ui/src/app/api/user.service.js
  4. 123
      ui/src/app/common/types.constant.js
  5. 2
      ui/src/app/customer/customer.controller.js
  6. 79
      ui/src/app/edge/edge-fieldset.tpl.html
  7. 2
      ui/src/app/edge/edge.controller.js
  8. 1
      ui/src/app/edge/edge.directive.js
  9. 12
      ui/src/app/edge/edge.routes.js
  10. 5
      ui/src/app/entity/entity-filter.directive.js
  11. 6
      ui/src/app/event/event-header-edge-event.tpl.html
  12. 6
      ui/src/app/event/event-row-edge-event.tpl.html
  13. 18
      ui/src/app/event/event-table.directive.js
  14. 26
      ui/src/app/locale/locale.constant-de_DE.json
  15. 35
      ui/src/app/locale/locale.constant-en_US.json
  16. 24
      ui/src/app/locale/locale.constant-es_ES.json
  17. 24
      ui/src/app/locale/locale.constant-fr_FR.json
  18. 4
      ui/src/app/rulechain/rulechain-card.tpl.html
  19. 49
      ui/src/app/rulechain/rulechain-fieldset.tpl.html
  20. 4
      ui/src/app/rulechain/rulechain.controller.js
  21. 4
      ui/src/app/rulechain/rulechain.directive.js
  22. 70
      ui/src/app/rulechain/rulechain.routes.js
  23. 68
      ui/src/app/rulechain/rulechains.controller.js
  24. 4
      ui/src/app/rulechain/rulechains.tpl.html
  25. 199
      ui/src/app/services/menu.service.js

14
ui/src/app/api/edge.service.js

@ -36,7 +36,8 @@ function EdgeService($http, $q, customerService) {
makeEdgePublic: makeEdgePublic,
setRootRuleChain: setRootRuleChain,
getEdgeEvents: getEdgeEvents,
syncEdge: syncEdge
syncEdge: syncEdge,
findMissingToRelatedRuleChains: findMissingToRelatedRuleChains
};
return service;
@ -305,4 +306,15 @@ function EdgeService($http, $q, customerService) {
});
return deferred.promise;
}
function findMissingToRelatedRuleChains(edgeId) {
var deferred = $q.defer();
var url = '/api/edge/missingToRelatedRuleChains/' + edgeId;
$http.get(url, null).then(function success(response) {
deferred.resolve(response.data);
}, function fail(response) {
deferred.reject(response.data);
});
return deferred.promise;
}
}

3
ui/src/app/api/entity.service.js

@ -910,6 +910,9 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
}
}
}
if (!userService.isEdgesSupportEnabled()) {
delete entityTypes.edge;
}
return entityTypes;
}

23
ui/src/app/api/user.service.js

@ -29,7 +29,8 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time
allowedDashboardIds = [],
redirectParams = null,
userTokenAccessEnabled = false,
userLoaded = false;
userLoaded = false,
edgesSupportEnabled = false;
var refreshTokenQueue = [];
@ -65,7 +66,8 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time
reloadUser: reloadUser,
isUserTokenAccessEnabled: isUserTokenAccessEnabled,
loginAsUser: loginAsUser,
setUserCredentialsEnabled: setUserCredentialsEnabled
setUserCredentialsEnabled: setUserCredentialsEnabled,
isEdgesSupportEnabled: isEdgesSupportEnabled
}
reloadUser();
@ -451,6 +453,7 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time
function loadSystemParams() {
var promises = [];
promises.push(loadIsUserTokenAccessEnabled());
promises.push(loadIsEdgesSupportEnabled());
promises.push(timeService.loadMaxDatapointsLimit());
return $q.all(promises);
}
@ -685,4 +688,20 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time
});
}
function isEdgesSupportEnabled() {
return edgesSupportEnabled;
}
function loadIsEdgesSupportEnabled() {
var deferred = $q.defer();
var url = '/api/edges/enabled';
$http.get(url).then(function success(response) {
edgesSupportEnabled = response.data;
deferred.resolve(response);
}, function fail() {
deferred.reject();
});
return deferred.promise;
}
}

123
ui/src/app/common/types.constant.js

@ -1076,6 +1076,127 @@ export default angular.module('thingsboard.types', [])
},
translate: {
customTranslationsPrefix: "custom."
}
},
edgeEventActionType: {
"ADDED": {
name: "audit-log.type-added"
},
"DELETED": {
name: "audit-log.type-deleted"
},
"UPDATED": {
name: "audit-log.type-updated"
},
"ATTRIBUTES_UPDATED": {
name: "audit-log.type-attributes-updated"
},
"ATTRIBUTES_DELETED": {
name: "audit-log.type-attributes-deleted"
},
"RPC_CALL": {
name: "audit-log.type-rpc-call"
},
"CREDENTIALS_UPDATED": {
name: "audit-log.type-credentials-updated"
},
"RELATION_ADD_OR_UPDATE": {
name: "audit-log.type-relation-add-or-update"
},
"RELATION_DELETED": {
name: "audit-log.type-relation-delete"
},
"ALARM_ACK": {
name: "audit-log.type-alarm-ack"
},
"ALARM_CLEAR": {
name: "audit-log.type-alarm-clear"
},
"CREDENTIALS_REQUEST": {
name: "edge.credentials-request"
},
"ATTRIBUTES_REQUEST": {
name: "edge.attributes-request"
},
"TIMESERIES_UPDATED": {
name: "edge.timeseries-updated"
},
"RELATION_REQUEST": {
name: "edge.relation-request"
},
"RULE_CHAIN_METADATA_REQUEST": {
name: "edge.rule-chain-metadata-request"
},
"GROUP_ENTITIES_REQUEST": {
name: "edge.group_entities_request"
},
"GROUP_PERMISSIONS_REQUEST": {
name: "edge.group-permissions-request"
},
"ASSIGNED_TO_EDGE": {
name: "audit-log.type-assigned-to-edge"
},
"UNASSIGNED_FROM_EDGE": {
name: "audit-log.type-unassigned-from-edge"
}
},
edgeEventTypeTranslations:{
"DASHBOARD": {
name: "entity.type-dashboard"
},
"ASSET": {
name: "entity.type-asset"
},
"DEVICE": {
name: "entity.type-device"
},
"ENTITY_VIEW": {
name: "entity.type-entity_view"
},
"ALARM": {
name: "entity.type-alarm"
},
"RULE_CHAIN": {
name: "entity.type-rulechain"
},
"RULE_CHAIN_META_DATA": {
name: "entity.type-rule-chain-metadata"
},
"EDGE": {
name: "entity.type-edge"
},
"USER": {
name: "entity.type-user"
},
"CUSTOMER": {
name: "entity.type-customer"
},
"RELATION": {
name: "entity.type-relation"
},
"ENTITY_GROUP": {
name: "entity.type-entity-group"
},
"SCHEDULER_EVENT": {
name: "entity.type-scheduler-event"
},
"WHITE_LABELING": {
name: "white-labeling.white-labeling"
},
"LOGIN_WHITE_LABELING": {
name: "white-labeling.login-white-labeling"
},
"CUSTOM_TRANSLATION": {
name: "custom-translation.custom-translation",
},
"WIDGETS_BUNDLE": {
name: "widget.widget-bundle"
},
"WIDGET_TYPE": {
name: "widget.type"
},
"ADMIN_SETTINGS": {
name: "permission.resource.display-type.ADMIN_SETTINGS"
}
},
}
).name;

2
ui/src/app/customer/customer.controller.js

@ -81,7 +81,7 @@ export default function CustomerController(customerService, $state, $stateParams
onAction: function ($event, item) {
openCustomerEdges($event, item);
},
name: function() { return $translate.instant('edge.edges') },
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')

79
ui/src/app/edge/edge-fieldset.tpl.html

@ -15,34 +15,38 @@
limitations under the License.
-->
<md-button ng-click="onAssignToCustomer({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant' && !isAssignedToCustomer"
class="md-raised md-primary">{{ 'edge.assign-to-customer' | translate }}</md-button>
<md-button ng-click="onUnassignFromCustomer({event: $event, isPublic: isPublic})"
ng-show="!isEdit && (edgeScope === 'customer' || edgeScope === 'tenant') && isAssignedToCustomer"
class="md-raised md-primary">{{ isPublic ? 'edge.make-private' : 'edge.unassign-from-customer' | translate }}</md-button>
<md-button ng-click="onMakePublic({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant' && !isAssignedToCustomer && !isPublic"
class="md-raised md-primary">{{ 'edge.make-public' | translate }}</md-button>
<md-button ng-click="onManageEdgeAssets({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.manage-edge-assets' | translate }}</md-button>
<md-button ng-click="onManageEdgeDevices({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.manage-edge-devices' | translate }}</md-button>
<md-button ng-click="onManageEdgeEntityViews({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.manage-edge-entity-views' | translate }}</md-button>
<md-button ng-click="onManageEdgeDashboards({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.manage-edge-dashboards' | translate }}</md-button>
<md-button ng-click="onManageEdgeRuleChains({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.manage-edge-rulechains' | translate }}</md-button>
<md-button ng-click="onDeleteEdge({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.delete' | translate }}</md-button>
<div layout="row">
<md-button ng-click="onAssignToCustomer({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant' && !isAssignedToCustomer"
class="md-raised md-primary">{{ 'edge.assign-to-customer' | translate }}</md-button>
<md-button ng-click="onUnassignFromCustomer({event: $event, isPublic: isPublic})"
ng-show="!isEdit && (edgeScope === 'customer' || edgeScope === 'tenant') && isAssignedToCustomer"
class="md-raised md-primary">{{ isPublic ? 'edge.make-private' : 'edge.unassign-from-customer' | translate }}</md-button>
<md-button ng-click="onMakePublic({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant' && !isAssignedToCustomer && !isPublic"
class="md-raised md-primary">{{ 'edge.make-public' | translate }}</md-button>
<md-button ng-click="onDeleteEdge({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.delete' | translate }}</md-button>
</div>
<div layout="row">
<md-button ng-click="onManageEdgeAssets({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.assets' | translate }}</md-button>
<md-button ng-click="onManageEdgeDevices({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.devices' | translate }}</md-button>
<md-button ng-click="onManageEdgeEntityViews({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.entity-views' | translate }}</md-button>
<md-button ng-click="onManageEdgeDashboards({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.dashboards' | translate }}</md-button>
<md-button ng-click="onManageEdgeRuleChains({event: $event})"
ng-show="!isEdit && edgeScope === 'tenant'"
class="md-raised md-primary">{{ 'edge.rulechain-templates' | translate }}</md-button>
</div>
<div layout="row">
<md-button ngclipboard data-clipboard-action="copy"
ngclipboard-success="onEdgeIdCopied()"
@ -98,14 +102,7 @@
ng-model="edge.type"
entity-type="types.entityType.edge">
</tb-entity-subtype-autocomplete>
<md-input-container class="md-block">
<label translate>edge.label</label>
<input name="label" ng-model="edge.label">
</md-input-container>
<md-input-container class="md-block">
<label translate>edge.description</label>
<textarea ng-model="edge.additionalInfo.description" rows="2"></textarea>
</md-input-container>
<div translate class="tb-hint">edge.license-key-hint</div>
<md-input-container class="md-block">
<label translate>edge.edge-license-key</label>
<input required name="edgeLicenseKey" ng-model="edge.edgeLicenseKey">
@ -113,6 +110,7 @@
<div translate ng-message="required">edge.edge-license-key-required</div>
</div>
</md-input-container>
<div translate class="tb-hint">edge.cloud-endpoint-hint</div>
<md-input-container class="md-block">
<label translate>edge.cloud-endpoint</label>
<input required name="cloudEndpoint" ng-model="edge.cloudEndpoint">
@ -122,7 +120,6 @@
</md-input-container>
</fieldset>
<div layout="row">
<md-input-container class="md-block" flex>
<label translate>edge.edge-key</label>
<input ng-model="edge.routingKey" disabled>
@ -152,4 +149,14 @@
</md-tooltip>
</md-button>
</div>
<fieldset ng-disabled="$root.loading || !isEdit">
<md-input-container class="md-block">
<label translate>edge.label</label>
<input name="label" ng-model="edge.label">
</md-input-container>
<md-input-container class="md-block">
<label translate>edge.description</label>
<textarea ng-model="edge.additionalInfo.description" rows="2"></textarea>
</md-input-container>
</fieldset>
</md-content>

2
ui/src/app/edge/edge.controller.js

@ -283,7 +283,7 @@ export function EdgeController($rootScope, userService, edgeService, customerSer
details: function() {
return $translate.instant('edge.manage-edge-rulechains');
},
icon: "code"
icon: "settings_ethernet"
}
);

1
ui/src/app/edge/edge.directive.js

@ -36,6 +36,7 @@ export default function EdgeDirective($compile, $templateCache, $translate, $mdD
scope.edge.routingKey = utils.guid('');
scope.edge.secret = generateSecret(20);
scope.edge.cloudEndpoint = utils.baseUrl();
scope.edge.type = 'default';
}
if (scope.edge.customerId && scope.edge.customerId.id !== types.id.nullUid) {
scope.isAssignedToCustomer = true;

12
ui/src/app/edge/edge.routes.js

@ -46,10 +46,10 @@ export default function EdgeRoutes($stateProvider, types) {
searchEnabled: true,
searchByEntitySubtype: true,
searchEntityType: types.entityType.edge,
pageTitle: 'edge.edges'
pageTitle: 'edge.edge-instances'
},
ncyBreadcrumb: {
label: '{"icon": "router", "label": "edge.edges"}'
label: '{"icon": "router", "label": "edge.edge-instances"}'
}
}).state('home.edges.entityViews', {
url: '/:edgeId/entityViews',
@ -194,11 +194,11 @@ export default function EdgeRoutes($stateProvider, types) {
},
data: {
searchEnabled: true,
pageTitle: 'edge.rulechains',
pageTitle: 'edge.rulechain-templates',
ruleChainsType: 'edge'
},
ncyBreadcrumb: {
label: '{"icon": "code", "label": "rulechain.edge-rulechains"}'
label: '{"icon": "settings_ethernet", "label": "edge.rulechain-templates"}'
}
}).state('home.edges.ruleChains.ruleChain', {
url: '/:ruleChainId',
@ -232,10 +232,10 @@ export default function EdgeRoutes($stateProvider, types) {
data: {
import: false,
searchEnabled: false,
pageTitle: 'edge.rulechain'
pageTitle: 'edge.rulechain-templates'
},
ncyBreadcrumb: {
label: '{"icon": "code", "label": "{{ vm.ruleChain.name }}", "translate": "false"}'
label: '{"icon": "settings_ethernet", "label": "{{ vm.ruleChain.name }}", "translate": "false"}'
}
});
}

5
ui/src/app/entity/entity-filter.directive.js

@ -22,7 +22,7 @@ import entityFilterTemplate from './entity-filter.tpl.html';
import './entity-filter.scss';
/*@ngInject*/
export default function EntityFilterDirective($compile, $templateCache, $q, $document, $mdDialog, types, entityService) {
export default function EntityFilterDirective($compile, $templateCache, $q, $document, $mdDialog, types, entityService, userService) {
var linker = function (scope, element, attrs, ngModelCtrl) {
@ -31,6 +31,9 @@ export default function EntityFilterDirective($compile, $templateCache, $q, $doc
scope.ngModelCtrl = ngModelCtrl;
scope.types = types;
if (!userService.isEdgesSupportEnabled()) {
scope.allowedEntityTypes = Object.values(types.entityType).filter(entityType => entityType !== types.entityType.edge);
}
scope.aliasFilterTypes = entityService.getAliasFilterTypesByEntityTypes(scope.allowedEntityTypes);
scope.$watch('filter.type', function (newType, prevType) {

6
ui/src/app/event/event-header-edge-event.tpl.html

@ -16,8 +16,8 @@
-->
<div translate class="tb-cell" flex="20">event.event-time</div>
<div translate class="tb-cell" flex="20">event.event-type</div>
<div translate class="tb-cell" flex="40">edge.event-action</div>
<div translate class="tb-cell" flex="20">edge.entity-id</div>
<div translate class="tb-cell" flex="10">event.event-type</div>
<div translate class="tb-cell" flex="15">edge.event-action</div>
<div translate class="tb-cell" flex="30">edge.entity-id</div>
<div translate class="tb-cell" flex="15">edge.status</div>
<div translate class="tb-cell" flex="10">edge.entity-info</div>

6
ui/src/app/event/event-row-edge-event.tpl.html

@ -16,9 +16,9 @@
-->
<div class="tb-cell" flex="20">{{ event.createdTime | date : 'yyyy-MM-dd HH:mm:ss' }}</div>
<div class="tb-cell" flex="20">{{ event.type }}</div>
<div class="tb-cell" flex="40">{{ event.action }}</div>
<div class="tb-cell" flex="20">{{ event.entityId }}</div>
<div class="tb-cell" flex="10">{{ event.edgeEventTypeText }}</div>
<div class="tb-cell" flex="15">{{ event.edgeEventActionText }}</div>
<div class="tb-cell" flex="30">{{ event.entityId }}</div>
<div class="tb-cell" flex="15" ng-style="{'color': statusColor}">{{ updateStatus(event.createdTime) }}</div>
<div class="tb-cell" flex="10">
<md-button ng-if="checkEdgeEventType(event.type)" class="md-icon-button md-primary"

18
ui/src/app/event/event-table.directive.js

@ -22,7 +22,7 @@ import eventTableTemplate from './event-table.tpl.html';
/* eslint-enable import/no-unresolved, import/default */
/*@ngInject*/
export default function EventTableDirective($compile, $templateCache, $rootScope, types,
export default function EventTableDirective($compile, $templateCache, $rootScope, $translate, types,
eventService, edgeService, attributeService) {
var linker = function (scope, element, attrs) {
@ -118,7 +118,11 @@ export default function EventTableDirective($compile, $templateCache, $rootScope
scope.events.pending = true;
promise.then(
function success(events) {
scope.events.data = scope.events.data.concat(events.data);
if (scope.eventType === types.eventType.edgeEvent.value) {
scope.events.data = scope.events.data.concat(prepareEdgeEventData(events.data));
} else {
scope.events.data = scope.events.data.concat(events.data);
}
scope.events.nextPageLink = events.nextPageLink;
scope.events.hasNext = events.hasNext;
if (scope.events.hasNext) {
@ -266,6 +270,16 @@ export default function EventTableDirective($compile, $templateCache, $rootScope
$compile(element.contents())(scope);
}
function prepareEdgeEventData(data) {
data.forEach(
edgeEvent => {
edgeEvent.edgeEventActionText = $translate.instant(types.edgeEventActionType[edgeEvent.action].name);
edgeEvent.edgeEventTypeText = $translate.instant(types.edgeEventTypeTranslations[edgeEvent.edgeId.entityType].name);
}
);
return data;
}
return {
restrict: "E",

26
ui/src/app/locale/locale.constant-de_DE.json

@ -431,7 +431,7 @@
"customer-required": "Kunde ist erforderlich",
"select-default-customer": "Wählen Sie den Standardkunden aus.",
"default-customer": "Standardkunde",
"edges": "Kunden Rand",
"edge-instances": "Kunden Rand",
"default-customer-required": "Ein Standardkunde ist erforderlich, um das Dashboard auf Mandantenebene zu testen."
},
"datetime": {
@ -730,7 +730,7 @@
},
"edge": {
"edge": "Rand",
"edges": "Rand",
"edge-instances": "Rand",
"management": "Rand verwalten",
"no-edges-matching": "Keine passenden Rand '{{entity}}' gefunden.",
"add": "Rand hinzufügen",
@ -1355,8 +1355,6 @@
"rulechain": {
"rulechain": "Regelkette",
"rulechains": "Regelketten",
"core-rulechains": "Kernregelketten",
"edge-rulechains": "Randregelketten",
"root": "Wurzel",
"delete": "Regelkette löschen",
"name": "Name",
@ -1393,7 +1391,6 @@
"assign-rulechains": "Regelketten zuweisen",
"assign-new-rulechain": "Neues Regelkette zuweisen",
"delete-rulechains": "Regelketten löschen",
"default": "Standard",
"unassign-rulechain": "Nicht zugeordnete Regelkette",
"unassign-rulechains": "Nicht zugeordnete Regelketten",
"unassign-rulechain-title": "Möchten Sie die Zuordnung die Regelkette '{{ruleChainTitle}}' wirklich aufheben?",
@ -1403,16 +1400,17 @@
"unassign-rulechains-from-edge-text": "Nach der Bestätigung wird die Zuordnung aller ausgewählten Regelketten aufgehoben und sie sind für den Rand nicht mehr zugänglich.",
"assign-rulechain-to-edge": "Regelkette(n) dem Rand zuordnen",
"assign-rulechain-to-edge-text": "Bitte wählen Sie die Regelketten aus, die Sie dem Rand zuordnen möchten",
"set-default-root-edge": "Machen Sie Randregelkette zur Wurzel Standard",
"set-default-root-edge-rulechain-title": "Sind Sie sicher, dass Sie die Randregelkette '{{ruleChainName}}' zur Wurzel machen Standard?",
"set-default-root-edge-rulechain-text": "Nach der Bestätigung wird die Randregelkette zur Wurzel Standard und behandelt alle eingehenden Transportnachrichten.",
"set-edge-template-root-rulechain": "Regelkette als Rand der Kantenvorlage erstellen",
"set-edge-template-root-rulechain-title": "Möchten Sie die Kantenvorlage der Regelkette '{{ruleChainName}}' wirklich als Root festlegen?",
"set-edge-template-root-rulechain-text": "Nach der Bestätigung wird die Regelkette zum Stamm der Kantenvorlage und zur Stammregelkette für neu erstellte Kanten.",
"invalid-rulechain-type-error": "Regelkette konnte nicht importiert werden: Ungültige Regelkettentyp. Erwarteter Typ ist {{expectedRuleChainType}}.",
"set-default-edge": "Machen Sie Regelkette Standard",
"set-default-edge-title": "Sind Sie sicher, dass Sie die Randregelkette '{{ruleChainName}}' machen Standard?",
"set-default-edge-text": "Nach der Bestätigung wird die Randregelkette für neu erstellte Rand vergeben.",
"remove-default-edge": "Randregelkette Standard entfernen",
"remove-default-edge-title": "Sind Sie sicher, dass Sie die Randregelkette '{{ruleChainName}}' aus der Standardliste entfernen?",
"remove-default-edge-text": "Nach der Bestätigung wird die Randregelkette nicht für neu erstellte Rand vergeben."
"set-auto-assign-to-edge": "Weisen Sie den Kanten bei der Erstellung eine Regelkette zu",
"set-auto-assign-to-edge-title": "Sind Sie sicher, dass Sie die Kantenregelkette '{{ruleChainName}}' bei der Erstellung den Kanten zuweisen möchten? ",
"set-auto-assign-to-edge-text": "Nach der Bestätigung wird die Kantenregelkette bei der Erstellung automatisch den Kanten zugewiesen.",
"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"
},
"rulenode": {
"details": "Details",

35
ui/src/app/locale/locale.constant-en_US.json

@ -457,7 +457,7 @@
"select-default-customer": "Select default customer",
"default-customer": "Default customer",
"default-customer-required": "Default customer is required in order to debug dashboard on Tenant level",
"edges": "Customer Edges"
"edges": "Customer edge instances"
},
"datetime": {
"date-from": "Date from",
@ -764,7 +764,7 @@
},
"edge": {
"edge": "Edge",
"edges": "Edges",
"edge-instances": "Edge instances",
"edge-file": "Edge file",
"management": "Edge management",
"no-edges-matching": "No edges matching '{{entity}}' were found.",
@ -828,8 +828,8 @@
"unassign-from-edge": "Unassign from edge",
"dashboards": "Edge Dashboards",
"manage-edge-rulechains": "Manage edge rule chains",
"rulechains": "Edge Rule Chains",
"rulechain": "Edge Rule Chain",
"rulechain-templates": "Rule chain templates",
"rulechain-template": "Rule chain template",
"edge-key": "Edge key",
"copy-edge-key": "Copy edge key",
"edge-key-copied-message": "Edge key has been copied to clipboard",
@ -852,7 +852,11 @@
"enter-edge-type": "Enter edge type",
"no-edge-types-matching": "No edge types matching '{{entitySubtype}}' were found.",
"edge-type-list-empty": "No edge types selected.",
"edge-types": "Edge types"
"edge-types": "Edge types",
"license-key-hint": "To obtain your license please navigate to the <a href='https://thingsboard.io/pricing/?active=thingsboard-edge' target='_blank'>pricing page</a> and select the best license option for your case.",
"cloud-endpoint-hint": "Edge requires HTTP(s) access to Cloud (ThingsBoard CE/PE) to verify the license key. Please specify Cloud URL that Edge is able to connect to.",
"missing-related-rule-chains-title": "Edge has missing related rule chain(s)",
"missing-related-rule-chains-text": "Assigned to edge rule chain(s) use rule nodes that forward message(s) to rule chain(s) that are not assigned to this edge. <br><br> List of missing rule chain(s): <br> {{missingRuleChains}}"
},
"error": {
"unable-to-connect": "Unable to connect to the server! Please check your internet connection.",
@ -1549,9 +1553,6 @@
"rulechain": {
"rulechain": "Rule chain",
"rulechains": "Rule chains",
"core-rulechains": "Core Rule chains",
"edge-rulechains": "Edge Rule chains",
"default-root": "Default root",
"root": "Root",
"delete": "Delete rule chain",
"name": "Name",
@ -1588,7 +1589,7 @@
"assign-rulechains": "Assign rulechains",
"assign-new-rulechain": "Assign new rulechain",
"delete-rulechains": "Delete rulechains",
"default": "Default",
"set-auto-assign-to-edge-card": "Assign to edge(s) on creation",
"unassign-rulechain": "Unassign rulechain",
"unassign-rulechains": "Unassign rulechains",
"unassign-rulechain-title": "Are you sure you want to unassign the rulechain '{{ruleChainTitle}}'?",
@ -1601,13 +1602,17 @@
"set-default-root-edge": "Make rule chain default root",
"set-default-root-edge-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' default edge root?",
"set-default-root-edge-rulechain-text": "After the confirmation the rule chain will become default edge root and will handle all incoming transport messages.",
"set-edge-template-root-rulechain": "Make rule chain as edge template root",
"set-edge-template-root-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' edge template root?",
"set-edge-template-root-rulechain-text": "After the confirmation the rule chain will become edge template root and will be root rule chain for a newly created edges.",
"invalid-rulechain-type-error": "Unable to import rule chain: Invalid rule chain type. Expected type is {{expectedRuleChainType}}.",
"set-default-edge": "Make rule chain default",
"set-default-edge-title": "Are you sure you want to make the edge rule chain '{{ruleChainName}}' default?",
"set-default-edge-text": "After the confirmation the edge rule chain will be added to default list and assigned to newly created edge(s).",
"remove-default-edge": "Remove rule chain from defaults",
"remove-default-edge-title": "Are you sure you want to remove the edge rule chain '{{ruleChainName}}' from default list?",
"remove-default-edge-text": "After the confirmation the edge rule chain will not be assigned for a newly created edges."
"set-auto-assign-to-edge": "Assign rule chain to edge(s) on creation",
"set-auto-assign-to-edge-title": "Are you sure you want to assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?",
"set-auto-assign-to-edge-text": "After the confirmation the edge rule chain will be automatically assigned to edge(s) on creation.",
"unset-auto-assign-to-edge": "Do not assign rule chain to edge(s) on creation",
"unset-auto-assign-to-edge-title": "Are you sure you do not want to assign the edge rule chain '{{ruleChainName}}' to edge(s) on creation?",
"unset-auto-assign-to-edge-text": "After the confirmation the edge rule chain will no longer be automatically assigned to edge(s) on creation.",
"edge-template-root": "Template Root"
},
"rulenode": {
"details": "Details",

24
ui/src/app/locale/locale.constant-es_ES.json

@ -743,7 +743,7 @@
},
"edge": {
"edge": "Borde",
"edges": "Bordes",
"edge-instances": "Bordes",
"management": "Gestión de bordes",
"no-edges-matching": "No se encontraron bordes que coincidan con '{{entity}}'",
"add": "Agregar borde",
@ -1423,8 +1423,6 @@
"rulechain": {
"rulechain": "Cadena de reglas",
"rulechains": "Cadenas de reglas",
"core-rulechains": "Cadenas de reglas centrales",
"edge-rulechains": "Cadenas de reglas de borde",
"root": "Raíz",
"delete": "Eliminar cadena de reglas",
"name": "Nombre",
@ -1461,7 +1459,6 @@
"assign-rulechains": "Asignar cadenas de reglas",
"assign-new-rulechain": "Asignar nueva cadena de reglas",
"delete-rulechains": "Eliminar cadenas de reglas",
"default": "Predeterminado",
"unassign-rulechain": "Anular asignación de cadena de reglas",
"unassign-rulechains": "Anular asignación de cadenas de reglas",
"unassign-rulechain-title": "¿Está seguro de que desea desasignar la cadena de reglas '{{ruleChainTitle}}'?",
@ -1471,16 +1468,17 @@
"unassign-rulechains-from-edge-text": "Después de la confirmación, todas las cadenas de reglas seleccionadas quedarán sin asignar y el borde no podrá acceder a ellas",
"assign-rulechain-to-edge": "Asignar cadena (s) de reglas a borde",
"assign-rulechain-to-edge-text": "Seleccione las cadenas de reglas para asignar al borde",
"set-default-root-edge": "Hacer que la cadena de reglas sea la raíz predeterminada",
"set-default-root-edge-rulechain-title": "¿Está seguro de que desea hacer que la cadena de reglas '{{ruleChainName}}' sea la raíz de borde predeterminada?",
"set-default-root-edge-rulechain-text": "Después de la confirmación, la cadena de reglas se convertirá en raíz raíz predeterminada y manejará todos los mensajes de transporte entrantes",
"set-edge-template-root-rulechain": "Hacer una cadena de reglas como raíz de la plantilla de borde",
"set-edge-template-root-rulechain-title": "¿Está seguro de que desea que la cadena de reglas '{{ruleChainName}}' sea la raíz de la plantilla de borde?",
"set-edge-template-root-rulechain-text": "Después de la confirmación, la cadena de reglas se convertirá en la raíz de la plantilla de borde y será la cadena de reglas raíz para los bordes recién creados.",
"invalid-rulechain-type-error": "No se puede importar la cadena de reglas: Tipo de cadena de reglas no válido. El tipo esperado es {{expectedRuleChainType}}",
"set-default-edge": "Hacer que la cadena de reglas de borde sea predeterminada",
"set-default-edge-title": "¿Está seguro de que desea que la cadena de reglas de borde '{{ruleChainName}}' sea predeterminada?",
"set-default-edge-text": "Después de la confirmación, la cadena de reglas de borde se agregará a la lista predeterminada y se asignará a los bordes recién creados",
"remove-default-edge": "Eliminar la cadena de regla de borde de los valores predeterminados",
"remove-default-edge-title": "¿Está seguro de que desea eliminar la cadena de reglas de borde '{{ruleChainName}}' de la lista predeterminada?",
"remove-default-edge-text": "Después de la confirmación, la cadena de reglas de borde no se asignará a los bordes recién creados"
"set-auto-assign-to-edge": "Asignar cadena de reglas a los bordes en la creación",
"set-auto-assign-to-edge-title": "¿Está seguro de que desea asignar la cadena de reglas de borde '{{ruleChainName}}' a los bordes en la creación?",
"set-auto-assign-to-edge-text": "Después de la confirmación, la cadena de reglas de borde se asignará automáticamente a los bordes en la creación.",
"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"
},
"rulenode": {
"details": "Detalles",

24
ui/src/app/locale/locale.constant-fr_FR.json

@ -748,7 +748,7 @@
},
"edge": {
"edge": "Bordure",
"edges": "Bordures",
"edge-instances": "Bordures",
"management": "Gestion des bordures",
"no-edges-matching": "Aucun bordure correspondant à {{entity}} n'a été trouvé.",
"add": "Ajouter un bordure",
@ -1429,8 +1429,6 @@
"rulechain-required": "Chaîne de règles requise",
"rulechains": "Chaînes de règles",
"select-rulechain": "Sélectionner la chaîne de règles",
"core-rulechains": "Chaînes de règles fondamentales",
"edge-rulechains": "Chaînes de règles de la bordure",
"set-root": "Rend la chaîne de règles racine (root) ",
"set-root-rulechain-text": "Après la confirmation, la chaîne de règles deviendra racine (root) et gérera tous les messages de transport entrants.",
"set-root-rulechain-title": "Voulez-vous vraiment que la chaîne de règles '{{ruleChainName}} soit racine (root) ?",
@ -1438,7 +1436,6 @@
"assign-rulechains": "Attribuer aux chaînes de règles",
"assign-new-rulechain": "Attribuer une nouvele chaînes de règles",
"delete-rulechains": "Supprimer une chaînes de règles",
"default": "Défaut",
"unassign-rulechain": "Retirer chaîne de règles",
"unassign-rulechains": "Retirer chaînes de règles",
"unassign-rulechain-title": "AÊtes-vous sûr de vouloir retirer l'attribution de chaînes de règles '{{ruleChainTitle}}'?",
@ -1448,16 +1445,17 @@
"unassign-rulechains-from-edge-text": "Après la confirmation, tous les chaînes de règles sélectionnés ne seront pas attribués et ne seront pas accessibles a la bordure.",
"assign-rulechain-to-edge": "Attribuer les chaînes de règles a la bordure",
"assign-rulechain-to-edge-text": "Veuillez sélectionner la bordure pour attribuer le ou les chaînes de règles",
"set-default-root-edge": "Définir la racine par défaut de la chaîne de règles",
"set-default-root-edge-rulechain-title": "AVoulez-vous vraiment créer de chaînes de règles par défaut '{{ruleChainName}}'?",
"set-default-root-edge-rulechain-text": "Après la confirmation, la chaîne de règles deviendra la racine de la bordure par défaut et gérera tous les messages de transport entrants.",
"set-edge-template-root-rulechain": "Faire de la chaîne de règles la racine du modèle d'arête",
"set-edge-template-root-rulechain-title": "Voulez-vous vraiment définir la racine du modèle d'arête de la chaîne de règles '{{ruleChainName}}'?",
"set-edge-template-root-rulechain-text": "Après la confirmation, la chaîne de règles deviendra la racine du modèle d'arête et sera la chaîne de règles racine pour les arêtes nouvellement créées.",
"invalid-rulechain-type-error": "Impossible d'importer la chaîne de règles: type de chaîne de règles non valide. Le type attendu est {{attenduRuleChainType}}.",
"set-default-edge": "Définir la chaîne de règles de la bordure par défaut",
"set-default-edge-title": "Voulez-vous vraiment définir la chaîne de règles de la bordure '{{ruleChainName}}' par défaut?",
"set-default-edge-text": "Après la confirmation, la chaîne de règles d'arête sera ajoutée à la liste par défaut et affectée aux arêtes nouvellement créées.",
"remove-default-edge": "Supprimer la chaîne de règles de la bordure des valeurs par défaut",
"remove-default-edge-title": "Voulez-vous vraiment supprimer la chaîne de règles de la bordure '{{ruleChainName}}' de la liste par défaut",
"remove-default-edge-text": "Après la confirmation, la chaîne de règles d'arête ne sera pas affectée aux arêtes nouvellement créées."
"set-auto-assign-to-edge": "Attribuer une chaîne de règles aux arêtes lors de la création",
"set-auto-assign-to-edge-title": "Voulez-vous vraiment attribuer la chaîne de règles d'arête '{{ruleChainName}}' à l'arête (s) lors de la création?",
"set-auto-assign-to-edge-text": "Après la confirmation, la chaîne de règles d'arêtes sera automatiquement affectée aux arêtes lors de la création.",
"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"
},
"rulenode": {
"add": "Ajouter un noeud de règle",

4
ui/src/app/rulechain/rulechain-card.tpl.html

@ -18,6 +18,6 @@
<div ng-if="(vm.parentCtl.ruleChainsScope === 'tenant' && item && item.root) ||
(vm.parentCtl.ruleChainsScope === 'edge' && vm.parentCtl.isRootRuleChain(item))" translate>rulechain.root</div>
<div ng-if="vm.parentCtl.ruleChainsScope === 'edges' && vm.parentCtl.isRootRuleChain(item)" translate>rulechain.default-root</div>
<div ng-if="vm.parentCtl.ruleChainsScope === 'edges' && vm.parentCtl.isRootRuleChain(item)" translate>rulechain.edge-template-root</div>
<div ng-if="(vm.parentCtl.ruleChainsScope === 'edges' && vm.parentCtl.isDefaultEdgeRuleChain(item))" translate>rulechain.default</div>
<div ng-if="(vm.parentCtl.ruleChainsScope === 'edges' && vm.parentCtl.isDefaultEdgeRuleChain(item))" translate>rulechain.set-auto-assign-to-edge-card</div>

49
ui/src/app/rulechain/rulechain-fieldset.tpl.html

@ -15,32 +15,31 @@
limitations under the License.
-->
<md-button ng-click="onExportRuleChain({event: $event})"
ng-show="!isEdit"
class="md-raised md-primary">{{ 'rulechain.export' | translate }}</md-button>
<md-button ng-click="onSetRootRuleChain({event: $event})"
ng-show="!isEdit && !ruleChain.root && ruleChainsScope == 'tenant'"
class="md-raised md-primary">{{ 'rulechain.set-root' | translate }}</md-button>
<md-button ng-click="onSetRootRuleChain({event: $event})"
ng-show="!isEdit && !ruleChain.root && ruleChainsScope == 'edges'"
class="md-raised md-primary">{{ 'rulechain.set-default-root-edge' | translate }}</md-button>
<md-button ng-click="onSetDefaultEdgeRuleChain({event: $event})"
ng-show="!isEdit && !ruleChain.root && !ruleChain.isDefault && ruleChainsScope == 'edges'"
class="md-raised md-primary">{{ 'rulechain.set-default-edge' | translate }}</md-button>
<md-button ng-click="onRemoveDefaultEdgeRuleChain({event: $event})"
ng-show="!isEdit && !ruleChain.root && ruleChain.isDefault && ruleChainsScope == 'edges'"
class="md-raised md-primary">{{ 'rulechain.remove-default-edge' | translate }}</md-button>
<md-button ng-click="onSetRootRuleChain({event: $event})"
ng-show="!isEdit && ruleChainsScope == 'edge' && edge.rootRuleChainId.id !== ruleChain.id.id"
class="md-raised md-primary">{{ 'rulechain.set-root' | translate }}</md-button>
<md-button ng-click="onDeleteRuleChain({event: $event})"
ng-show="!isEdit && !ruleChain.root && ruleChainsScope != 'edge'"
class="md-raised md-primary">{{ 'rulechain.delete' | translate }}</md-button>
<div layout="row">
<md-button ng-click="onExportRuleChain({event: $event})"
ng-show="!isEdit"
class="md-raised md-primary">{{ 'rulechain.export' | translate }}</md-button>
<md-button ng-click="onDeleteRuleChain({event: $event})"
ng-show="!isEdit && !ruleChain.root && ruleChainsScope != 'edge'"
class="md-raised md-primary">{{ 'rulechain.delete' | translate }}</md-button>
</div>
<div layout="row"><md-button ng-click="onSetRootRuleChain({event: $event})"
ng-show="!isEdit && !ruleChain.root && ruleChainsScope == 'tenant'"
class="md-raised md-primary">{{ 'rulechain.set-root' | translate }}</md-button>
<md-button ng-click="onSetRootRuleChain({event: $event})"
ng-show="!isEdit && !ruleChain.root && ruleChainsScope == 'edges'"
class="md-raised md-primary">{{ 'rulechain.set-edge-template-root-rulechain' | translate }}</md-button>
<md-button ng-click="onSetAutoAssignToEdgeRuleChain({event: $event})"
ng-show="!isEdit && !ruleChain.root && !ruleChain.isDefault && ruleChainsScope == 'edges'"
class="md-raised md-primary">{{ 'rulechain.set-auto-assign-to-edge' | translate }}</md-button>
<md-button ng-click="onUnsetAutoAssignToEdgeRuleChain({event: $event})"
ng-show="!isEdit && !ruleChain.root && ruleChain.isDefault && ruleChainsScope == 'edges'"
class="md-raised md-primary">{{ 'rulechain.unset-auto-assign-to-edge' | translate }}</md-button>
<md-button ng-click="onSetRootRuleChain({event: $event})"
ng-show="!isEdit && ruleChainsScope == 'edge' && edge.rootRuleChainId.id !== ruleChain.id.id"
class="md-raised md-primary">{{ 'rulechain.set-root' | translate }}</md-button>
</div>
<div layout="row">
<md-button ngclipboard data-clipboard-action="copy"
ngclipboard-success="onRuleChainIdCopied(e)"

4
ui/src/app/rulechain/rulechain.controller.js

@ -1270,9 +1270,9 @@ export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $time
vm.isImport = false;
$mdUtil.nextTick(() => {
if (vm.ruleChain.type === vm.types.ruleChainType.core) {
$state.go('home.ruleChains.core.ruleChain', {ruleChainId: vm.ruleChain.id.id});
$state.go('home.ruleChains.ruleChain', {ruleChainId: vm.ruleChain.id.id});
} else {
$state.go('home.ruleChains.edge.ruleChain', {ruleChainId: vm.ruleChain.id.id});
$state.go('home.edges.edgeRuleChains.ruleChain', {ruleChainId: vm.ruleChain.id.id});
}
});
} else {

4
ui/src/app/rulechain/rulechain.directive.js

@ -42,8 +42,8 @@ export default function RuleChainDirective($compile, $templateCache, $mdDialog,
theForm: '=',
ruleChainsScope: '=',
edge: '=',
onSetDefaultEdgeRuleChain: '&',
onRemoveDefaultEdgeRuleChain: '&',
onSetAutoAssignToEdgeRuleChain: '&',
onUnsetAutoAssignToEdgeRuleChain: '&',
onSetRootRuleChain: '&',
onExportRuleChain: '&',
onDeleteRuleChain: '&'

70
ui/src/app/rulechain/rulechain.routes.js

@ -29,15 +29,6 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider
$stateProvider
.state('home.ruleChains', {
url: '/ruleChains',
module: 'private',
auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
redirectTo: 'home.ruleChains.core',
ncyBreadcrumb: {
label: '{"icon": "settings_ethernet", "label": "rulechain.rulechains"}'
}
})
.state('home.ruleChains.core', {
url: '/ruleChains/core',
params: {'topIndex': 0},
module: 'private',
auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
@ -50,13 +41,13 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider
},
data: {
searchEnabled: true,
pageTitle: 'rulechain.core-rulechains',
pageTitle: 'rulechain.rulechains',
ruleChainsType: 'tenant'
},
ncyBreadcrumb: {
label: '{"icon": "settings_ethernet", "label": "rulechain.core-rulechains"}'
label: '{"icon": "settings_ethernet", "label": "rulechain.rulechains"}'
}
}).state('home.ruleChains.core.ruleChain', {
}).state('home.ruleChains.ruleChain', {
url: '/:ruleChainId',
reloadOnSearch: false,
module: 'private',
@ -134,8 +125,8 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider
ncyBreadcrumb: {
label: '{"icon": "settings_ethernet", "label": "{{ (\'rulechain.import\' | translate) + \': \'+ vm.ruleChain.name }}", "translate": "false"}'
}
}).state('home.ruleChains.edge', {
url: '/ruleChains/edge',
}).state('home.edges.edgeRuleChains', {
url: '/ruleChains',
params: {'topIndex': 0},
module: 'private',
auth: ['TENANT_ADMIN'],
@ -148,13 +139,13 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider
},
data: {
searchEnabled: true,
pageTitle: 'rulechain.edge-rulechains',
pageTitle: 'edge.rulechain-templates',
ruleChainsType: 'edges'
},
ncyBreadcrumb: {
label: '{"icon": "code", "label": "rulechain.edge-rulechains"}'
label: '{"icon": "settings_ethernet", "label": "edge.rulechain-templates"}'
}
}).state('home.ruleChains.edge.ruleChain', {
}).state('home.edges.edgeRuleChains.ruleChain', {
url: '/:ruleChainId',
reloadOnSearch: false,
module: 'private',
@ -186,10 +177,51 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider
data: {
import: false,
searchEnabled: false,
pageTitle: 'edge.rulechain'
pageTitle: 'edge.rulechain-template'
},
ncyBreadcrumb: {
label: '{"icon": "settings_ethernet", "label": "{{ vm.ruleChain.name }}", "translate": "false"}'
}
}).state('home.edges.edgeRuleChains.importRuleChain', {
url: '/edges/ruleChains/import',
reloadOnSearch: false,
module: 'private',
auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
views: {
"content@home": {
templateUrl: ruleChainTemplate,
controller: 'RuleChainController',
controllerAs: 'vm'
}
},
params: {
ruleChainImport: {},
ruleChainType: {}
},
resolve: {
ruleChain:
/*@ngInject*/
function($stateParams) {
return $stateParams.ruleChainImport.ruleChain;
},
ruleChainMetaData:
/*@ngInject*/
function($stateParams) {
return $stateParams.ruleChainImport.metadata;
},
ruleNodeComponents:
/*@ngInject*/
function($stateParams, ruleChainService) {
return ruleChainService.getRuleNodeComponents($stateParams.ruleChainType);
}
},
data: {
import: true,
searchEnabled: true,
pageTitle: 'edge.rulechain-template'
},
ncyBreadcrumb: {
label: '{"icon": "code", "label": "{{ vm.ruleChain.name }}", "translate": "false"}'
label: '{"icon": "settings_ethernet", "label": "{{ (\'rulechain.import\' | translate) + \': \'+ vm.ruleChain.name }}", "translate": "false"}'
}
});
}

68
ui/src/app/rulechain/rulechains.controller.js

@ -97,7 +97,7 @@ export default function RuleChainsController(ruleChainService, userService, impo
vm.exportRuleChain = exportRuleChain;
vm.setRootRuleChain = setRootRuleChain;
vm.setDefaultEdgeRuleChain = setDefaultEdgeRuleChain;
vm.setAutoAssignToEdgeRuleChain = setAutoAssignToEdgeRuleChain;
vm.unsetAutoAssignToEdgeRuleChain = unsetAutoAssignToEdgeRuleChain;
initController();
@ -185,10 +185,10 @@ export default function RuleChainsController(ruleChainService, userService, impo
ruleChainActionsList.push({
onAction: function ($event, item) {
setDefaultEdgeRuleChain($event, item);
setAutoAssignToEdgeRuleChain($event, item);
},
name: function() { return $translate.instant('rulechain.set-default-edge') },
details: function() { return $translate.instant('rulechain.set-default-edge') },
name: function() { return $translate.instant('rulechain.set-auto-assign-to-edge') },
details: function() { return $translate.instant('rulechain.set-auto-assign-to-edge') },
icon: "bookmark_outline",
isEnabled: isNonDefaultEdgeRuleChain
});
@ -197,8 +197,8 @@ export default function RuleChainsController(ruleChainService, userService, impo
onAction: function ($event, item) {
unsetAutoAssignToEdgeRuleChain($event, item);
},
name: function() { return $translate.instant('rulechain.remove-default-edge') },
details: function() { return $translate.instant('rulechain.remove-default-edge') },
name: function() { return $translate.instant('rulechain.unset-auto-assign-to-edge') },
details: function() { return $translate.instant('rulechain.unset-auto-assign-to-edge') },
icon: "bookmark",
isEnabled: isDefaultEdgeRuleChain
});
@ -207,8 +207,8 @@ export default function RuleChainsController(ruleChainService, userService, impo
onAction: function ($event, item) {
setEdgeTemplateRootRuleChain($event, item);
},
name: function() { return $translate.instant('rulechain.set-default-root-edge') },
details: function() { return $translate.instant('rulechain.set-default-root-edge') },
name: function() { return $translate.instant('rulechain.set-edge-template-root-rulechain') },
details: function() { return $translate.instant('rulechain.set-edge-template-root-rulechain') },
icon: "flag",
isEnabled: isNonRootRuleChain
});
@ -247,7 +247,7 @@ export default function RuleChainsController(ruleChainService, userService, impo
onAction: function ($event) {
importExport.importRuleChain($event, types.ruleChainType.edge).then(
function(ruleChainImport) {
$state.go('home.ruleChains.importRuleChain', {ruleChainImport:ruleChainImport, ruleChainType: types.ruleChainType.edge});
$state.go('home.edges.edgeRuleChains.importRuleChain', {ruleChainImport:ruleChainImport, ruleChainType: types.ruleChainType.edge});
}
);
},
@ -401,9 +401,9 @@ export default function RuleChainsController(ruleChainService, userService, impo
if (vm.ruleChainsScope === 'edge') {
$state.go('home.edges.ruleChains.ruleChain', Object.assign(ruleChainParams, edgeId = vm.edge.id.id));
} else if (vm.ruleChainsScope === 'edges') {
$state.go('home.ruleChains.edge.ruleChain', ruleChainParams);
$state.go('home.edges.edgeRuleChains.ruleChain', ruleChainParams);
} else {
$state.go('home.ruleChains.core.ruleChain', ruleChainParams);
$state.go('home.ruleChains.ruleChain', ruleChainParams);
}
}
@ -471,13 +471,13 @@ export default function RuleChainsController(ruleChainService, userService, impo
});
}
function setDefaultEdgeRuleChain($event, ruleChain) {
function setAutoAssignToEdgeRuleChain($event, ruleChain) {
$event.stopPropagation();
var confirm = $mdDialog.confirm()
.targetEvent($event)
.title($translate.instant('rulechain.set-default-edge-title', {ruleChainName: ruleChain.name}))
.htmlContent($translate.instant('rulechain.set-default-edge-text'))
.ariaLabel($translate.instant('rulechain.set-default-edge'))
.title($translate.instant('rulechain.set-auto-assign-to-edge-title', {ruleChainName: ruleChain.name}))
.htmlContent($translate.instant('rulechain.set-auto-assign-to-edge-text'))
.ariaLabel($translate.instant('rulechain.set-auto-assign-to-edge'))
.cancel($translate.instant('action.no'))
.ok($translate.instant('action.yes'));
$mdDialog.show(confirm).then(function () {
@ -493,9 +493,9 @@ export default function RuleChainsController(ruleChainService, userService, impo
$event.stopPropagation();
var confirm = $mdDialog.confirm()
.targetEvent($event)
.title($translate.instant('rulechain.remove-default-edge-title', {ruleChainName: ruleChain.name}))
.htmlContent($translate.instant('rulechain.remove-default-edge-text'))
.ariaLabel($translate.instant('rulechain.remove-default-edge'))
.title($translate.instant('rulechain.unset-auto-assign-to-edge-title', {ruleChainName: ruleChain.name}))
.htmlContent($translate.instant('rulechain.unset-auto-assign-to-edge-text'))
.ariaLabel($translate.instant('rulechain.unset-auto-assign-to-edge'))
.cancel($translate.instant('action.no'))
.ok($translate.instant('action.yes'));
$mdDialog.show(confirm).then(function () {
@ -511,8 +511,8 @@ export default function RuleChainsController(ruleChainService, userService, impo
$event.stopPropagation();
var confirm = $mdDialog.confirm()
.targetEvent($event)
.title($translate.instant('rulechain.set-default-root-edge-rulechain-title', {ruleChainName: ruleChain.name}))
.htmlContent($translate.instant('rulechain.set-default-root-edge-rulechain-text'))
.title($translate.instant('rulechain.set-edge-template-root-rulechain-title', {ruleChainName: ruleChain.name}))
.htmlContent($translate.instant('rulechain.set-edge-template-root-rulechain-text'))
.ariaLabel($translate.instant('rulechain.set-root-rulechain-text'))
.cancel($translate.instant('action.no'))
.ok($translate.instant('action.yes'));
@ -572,8 +572,32 @@ export default function RuleChainsController(ruleChainService, userService, impo
fullscreen: true,
targetEvent: $event
}).then(function () {
vm.grid.refreshList();
}, function () {
edgeService.findMissingToRelatedRuleChains(edgeId).then(
function success(missingRuleChains) {
if (missingRuleChains && Object.keys(missingRuleChains).length > 0) {
let formattedMissingRuleChains = [];
for (const missingRuleChain of Object.keys(missingRuleChains)) {
const arrayOfMissingRuleChains = missingRuleChains[missingRuleChain];
const tmp = "- '" + missingRuleChain + "': '" + arrayOfMissingRuleChains.join("', ") + "'";
formattedMissingRuleChains.push(tmp);
}
var alert = $mdDialog.alert()
.parent(angular.element($document[0].body))
.clickOutsideToClose(true)
.title($translate.instant('edge.missing-related-rule-chains-title'))
.htmlContent($translate.instant('edge.missing-related-rule-chains-text', {missingRuleChains: formattedMissingRuleChains.join("<br>")}))
.ok($translate.instant('action.close'));
alert._options.fullscreen = true;
$mdDialog.show(alert).then(
function () {
vm.grid.refreshList();
}
);
} else {
vm.grid.refreshList();
}
}
);
});
},
function fail() {

4
ui/src/app/rulechain/rulechains.tpl.html

@ -28,8 +28,8 @@
the-form="vm.grid.detailsForm"
rule-chains-scope="vm.ruleChainsScope"
edge="vm.edge"
on-set-default-edge-rule-chain="vm.setDefaultEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)"
on-remove-default-edge-rule-chain="vm.unsetAutoAssignToEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)"
on-set-auto-assign-to-edge-rule-chain="vm.setAutoAssignToEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)"
on-unset-auto-assign-to-edge-rule-chain="vm.unsetAutoAssignToEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)"
on-set-root-rule-chain="vm.setRootRuleChain(event, vm.grid.detailsConfig.currentItem)"
on-export-rule-chain="vm.exportRuleChain(event, vm.grid.detailsConfig.currentItem)"
on-delete-rule-chain="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)">

199
ui/src/app/services/menu.service.js

@ -156,24 +156,9 @@ function Menu(userService, $state, $rootScope) {
},
{
name: 'rulechain.rulechains',
type: 'toggle',
type: 'link',
state: 'home.ruleChains',
height: '80px',
icon: 'settings_ethernet',
pages: [
{
name: 'rulechain.core-rulechains',
type: 'link',
state: 'home.ruleChains.core',
icon: 'settings_ethernet'
},
{
name: 'rulechain.edge-rulechains',
type: 'link',
state: 'home.ruleChains.edge',
icon: 'code'
}
]
icon: 'settings_ethernet'
},
{
name: 'customer.customers',
@ -198,13 +183,33 @@ function Menu(userService, $state, $rootScope) {
type: 'link',
state: 'home.entityViews',
icon: 'view_quilt'
},
{
name: 'edge.edges',
type: 'link',
state: 'home.edges',
icon: 'router'
},
}];
if (userService.isEdgesSupportEnabled()) {
sections.push(
{
name: 'edge.management',
type: 'toggle',
state: 'home.edges',
height: '80px',
icon: 'router',
pages: [
{
name: 'edge.edge-instances',
type: 'link',
state: 'home.edges',
icon: 'router'
},
{
name: 'edge.rulechain-templates',
type: 'link',
state: 'home.edges.edgeRuleChains',
icon: 'settings_ethernet'
}
]
}
);
}
sections.push(
{
name: 'widget.widget-library',
type: 'link',
@ -222,21 +227,17 @@ function Menu(userService, $state, $rootScope) {
type: 'link',
state: 'home.auditLogs',
icon: 'track_changes'
}];
}
);
homeSections =
[{
name: 'rulechain.management',
name: 'rulechain.rulechains',
places: [
{
name: 'rulechain.core-rulechains',
name: 'rulechain.rulechains',
icon: 'settings_ethernet',
state: 'home.ruleChains.core'
},
{
name: 'rulechain.edge-rulechains',
icon: 'code',
state: 'home.ruleChains.edge'
state: 'home.ruleChains'
}
]
},
@ -279,43 +280,51 @@ function Menu(userService, $state, $rootScope) {
state: 'home.entityViews'
}
]
},
{
name: 'edge.management',
places: [
{
name: 'edge.edges',
icon: 'router',
state: 'home.edges'
}
]
},
{
name: 'dashboard.management',
places: [
{
name: 'widget.widget-library',
icon: 'now_widgets',
state: 'home.widgets-bundles'
},
{
name: 'dashboard.dashboards',
icon: 'dashboard',
state: 'home.dashboards'
}
]
},
{
name: 'audit-log.audit',
places: [
{
name: 'audit-log.audit-logs',
icon: 'track_changes',
state: 'home.auditLogs'
}
]
}];
if (userService.isEdgesSupportEnabled()) {
homeSections.push({
name: 'edge.management',
places: [
{
name: 'edge.edge-instances',
icon: 'router',
state: 'home.edges'
},
{
name: 'edge.rulechain-templates',
icon: 'settings_ethernet',
state: 'home.edges.edgeRuleChains'
}
]
});
}
homeSections.push(
{
name: 'dashboard.management',
places: [
{
name: 'widget.widget-library',
icon: 'now_widgets',
state: 'home.widgets-bundles'
},
{
name: 'dashboard.dashboards',
icon: 'dashboard',
state: 'home.dashboards'
}
]
},
{
name: 'audit-log.audit',
places: [
{
name: 'audit-log.audit-logs',
icon: 'track_changes',
state: 'home.auditLogs'
}
]
});
} else if (authority === 'CUSTOMER_USER') {
sections = [
{
@ -341,19 +350,25 @@ function Menu(userService, $state, $rootScope) {
type: 'link',
state: 'home.entityViews',
icon: 'view_quilt'
},
{
name: 'edge.edges',
type: 'link',
state: 'home.edges',
icon: 'router'
},
}];
if (userService.isEdgesSupportEnabled()) {
sections.push(
{
name: 'edge.edge-instances',
type: 'link',
state: 'home.edges',
icon: 'router'
}
);
}
sections.push(
{
name: 'dashboard.dashboards',
type: 'link',
state: 'home.dashboards',
icon: 'dashboard'
}];
}
);
homeSections =
[{
@ -385,17 +400,22 @@ function Menu(userService, $state, $rootScope) {
state: 'home.entityViews'
}
]
},
{
name: 'edge.management',
places: [
{
name: 'edge.edges',
icon: 'router',
state: 'home.edges'
}
]
},
}];
if (userService.isEdgesSupportEnabled()) {
homeSections.push(
{
name: 'edge.edge-instances',
places: [
{
name: 'edge.edge-instances',
icon: 'router',
state: 'home.edges'
}
]
}
);
}
homeSections.push(
{
name: 'dashboard.view-dashboards',
places: [
@ -405,7 +425,8 @@ function Menu(userService, $state, $rootScope) {
state: 'home.dashboards'
}
]
}];
}
);
}
}
}
@ -423,4 +444,4 @@ function Menu(userService, $state, $rootScope) {
return $state.includes(section.state);
}
}
}

Loading…
Cancel
Save