Commit ba14bc11e7667d6f98c37abea046f63552e9c0e9

Authored by Volodymyr Babak
2 parents 3a46cbe5 d0bff3d6

Merge branch 'develop/2.6-edge' of github.com:volodymyr-babak/thingsboard into develop/2.6-edge

... ... @@ -28,31 +28,31 @@ function ComponentDescriptorService($http, $q) {
28 28
29 29 return service;
30 30
31   - function getComponentDescriptorsByTypes(componentTypes, type) {
  31 + function getComponentDescriptorsByTypes(componentTypes, ruleChainType) {
32 32 var deferred = $q.defer();
33 33 var result = [];
34   - if (!componentsByType[type]) {
35   - componentsByType[type] = {};
  34 + if (!componentsByType[ruleChainType]) {
  35 + componentsByType[ruleChainType] = {};
36 36 }
37 37 for (var i=componentTypes.length-1;i>=0;i--) {
38 38 var componentType = componentTypes[i];
39   - if (componentsByType[type][componentType]) {
40   - result = result.concat(componentsByType[type][componentType]);
  39 + if (componentsByType[ruleChainType][componentType]) {
  40 + result = result.concat(componentsByType[ruleChainType][componentType]);
41 41 componentTypes.splice(i, 1);
42 42 }
43 43 }
44 44 if (!componentTypes.length) {
45 45 deferred.resolve(result);
46 46 } else {
47   - var url = '/api/components?componentTypes=' + componentTypes.join(',') + '&ruleChainType=' + type;
  47 + var url = '/api/components?componentTypes=' + componentTypes.join(',') + '&ruleChainType=' + ruleChainType;
48 48 $http.get(url, null).then(function success(response) {
49 49 var components = response.data;
50 50 for (var i = 0; i < components.length; i++) {
51 51 var component = components[i];
52   - var componentsList = componentsByType[type][component.type];
  52 + var componentsList = componentsByType[ruleChainType][component.type];
53 53 if (!componentsList) {
54 54 componentsList = [];
55   - componentsByType[type][component.type] = componentsList;
  55 + componentsByType[ruleChainType][component.type] = componentsList;
56 56 }
57 57 componentsList.push(component);
58 58 componentsByClazz[component.clazz] = component;
... ...
... ... @@ -27,6 +27,9 @@
27 27 <md-button ng-click="onDeleteAsset({event: $event})"
28 28 ng-show="!isEdit && assetScope === 'tenant'"
29 29 class="md-raised md-primary">{{ 'asset.delete' | translate }}</md-button>
  30 +<md-button ng-click="onUnassignFromEdge({event: $event})"
  31 + ng-show="!isEdit && assetScope === 'edge'"
  32 + class="md-raised md-primary">{{ 'edge.unassign-from-edge' | translate }}</md-button>
30 33
31 34 <div layout="row">
32 35 <md-button ngclipboard data-clipboard-action="copy"
... ...
... ... @@ -130,6 +130,7 @@ export function AssetController($rootScope, userService, assetService, customerS
130 130 vm.assignToCustomer = assignToCustomer;
131 131 vm.makePublic = makePublic;
132 132 vm.unassignFromCustomer = unassignFromCustomer;
  133 + vm.unassignFromEdge = unassignFromEdge;
133 134
134 135 initController();
135 136
... ...
... ... @@ -66,7 +66,8 @@ export default function AssetDirective($compile, $templateCache, toast, $transla
66 66 onAssignToCustomer: '&',
67 67 onMakePublic: '&',
68 68 onUnassignFromCustomer: '&',
69   - onDeleteAsset: '&'
  69 + onDeleteAsset: '&',
  70 + onUnassignFromEdge: '&'
70 71 }
71 72 };
72 73 }
... ...
... ... @@ -29,6 +29,7 @@
29 29 on-assign-to-customer="vm.assignToCustomer(event, [ vm.grid.detailsConfig.currentItem.id.id ])"
30 30 on-make-public="vm.makePublic(event, vm.grid.detailsConfig.currentItem)"
31 31 on-unassign-from-customer="vm.unassignFromCustomer(event, vm.grid.detailsConfig.currentItem, isPublic)"
  32 + on-unassign-from-edge="vm.unassignFromEdge(event, vm.grid.detailsConfig.currentItem)"
32 33 on-delete-asset="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-asset>
33 34 </md-tab>
34 35 <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.attributes' | translate }}">
... ...
... ... @@ -16,7 +16,7 @@
16 16
17 17 -->
18 18 <md-button ng-click="onExportDashboard({event: $event})"
19   - ng-show="!isEdit && dashboardScope === 'tenant'"
  19 + ng-show="!isEdit && (dashboardScope === 'tenant' || dashboardScope === 'edge')"
20 20 class="md-raised md-primary">{{ 'dashboard.export' | translate }}</md-button>
21 21 <md-button ng-click="onMakePublic({event: $event})"
22 22 ng-show="!isEdit && dashboardScope === 'tenant' && !dashboard.publicCustomerId"
... ... @@ -34,6 +34,9 @@
34 34 <md-button ng-click="onDeleteDashboard({event: $event})"
35 35 ng-show="!isEdit && dashboardScope === 'tenant'"
36 36 class="md-raised md-primary">{{ 'dashboard.delete' | translate }}</md-button>
  37 +<md-button ng-click="onUnassignFromEdge({event: $event})"
  38 + ng-show="!isEdit && dashboardScope === 'edge'"
  39 + class="md-raised md-primary">{{ 'edge.unassign-from-edge' | translate }}</md-button>
37 40 <md-content class="md-padding" layout="column">
38 41 <md-input-container class="md-block"
39 42 ng-show="!isEdit && dashboard.assignedCustomersText && dashboardScope === 'tenant'">
... ...
... ... @@ -48,12 +48,14 @@ export default function DashboardDirective($compile, $templateCache, $translate,
48 48 dashboard: '=',
49 49 isEdit: '=',
50 50 customerId: '=',
  51 + edgeId: '=',
51 52 dashboardScope: '=',
52 53 theForm: '=',
53 54 onMakePublic: '&',
54 55 onMakePrivate: '&',
55 56 onManageAssignedCustomers: '&',
56 57 onUnassignFromCustomer: '&',
  58 + onUnassignFromEdge: '&',
57 59 onExportDashboard: '&',
58 60 onDeleteDashboard: '&'
59 61 }
... ...
... ... @@ -129,6 +129,7 @@ export function DashboardsController(userService, dashboardService, customerServ
129 129 vm.manageAssignedCustomers = manageAssignedCustomers;
130 130 vm.unassignFromCustomer = unassignFromCustomer;
131 131 vm.exportDashboard = exportDashboard;
  132 + vm.unassignFromEdge = unassignFromEdge;
132 133
133 134 initController();
134 135
... ... @@ -156,6 +157,10 @@ export function DashboardsController(userService, dashboardService, customerServ
156 157 );
157 158 }
158 159
  160 + if (edgeId) {
  161 + vm.edgeId = edgeId;
  162 + }
  163 +
159 164 if (vm.dashboardsScope === 'tenant') {
160 165 fetchDashboardsFunction = function (pageLink) {
161 166 return dashboardService.getTenantDashboards(pageLink);
... ...
... ... @@ -26,12 +26,14 @@
26 26 is-edit="vm.grid.detailsConfig.isDetailsEditMode"
27 27 dashboard-scope="vm.dashboardsScope"
28 28 customer-id="vm.customerId"
  29 + edge-id="vm.edgeId"
29 30 the-form="vm.grid.detailsForm"
30 31 on-make-public="vm.makePublic(event, vm.grid.detailsConfig.currentItem)"
31 32 on-make-private="vm.makePrivate(event, vm.grid.detailsConfig.currentItem)"
32 33 on-manage-assigned-customers="vm.manageAssignedCustomers(event, vm.grid.detailsConfig.currentItem)"
33 34 on-unassign-from-customer="vm.unassignFromCustomer(event, vm.grid.detailsConfig.currentItem, vm.customerId)"
34   - on-export-dashboard="vm.exportDashboard(event, vm.grid.detailsConfig.currentItem)"
  35 + on-unassign-from-edge="vm.unassignFromEdge(event, vm.grid.detailsConfig.currentItem, vm.edgeId)"
  36 + on-export-dashboard="vm.exportDashboard(event, vm.grid.detailsConfig.currentItem)"
35 37 on-delete-dashboard="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-dashboard-details>
36 38 </md-tab>
37 39 <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.grid.isTenantAdmin()" md-on-select="vm.grid.triggerResize()" label="{{ 'audit-log.audit-logs' | translate }}">
... ...
... ... @@ -24,6 +24,9 @@
24 24 <md-button ng-click="onUnassignFromCustomer({event: $event, isPublic: isPublic})"
25 25 ng-show="!isEdit && (deviceScope === 'customer' || deviceScope === 'tenant') && isAssignedToCustomer"
26 26 class="md-raised md-primary">{{ isPublic ? 'device.make-private' : 'device.unassign-from-customer' | translate }}</md-button>
  27 +<md-button ng-click="onUnassignFromEdge({event: $event})"
  28 + ng-show="!isEdit && deviceScope === 'edge'"
  29 + class="md-raised md-primary">{{ 'edge.unassign-from-edge' | translate }}</md-button>
27 30 <md-button ng-click="onManageCredentials({event: $event})"
28 31 ng-show="!isEdit"
29 32 class="md-raised md-primary">{{ (deviceScope === 'customer_user' ? 'device.view-credentials' : 'device.manage-credentials') | translate }}</md-button>
... ...
... ... @@ -131,6 +131,7 @@ export function DeviceController($rootScope, userService, deviceService, custome
131 131 vm.makePublic = makePublic;
132 132 vm.unassignFromCustomer = unassignFromCustomer;
133 133 vm.manageCredentials = manageCredentials;
  134 + vm.unassignFromEdge = unassignFromEdge;
134 135
135 136 initController();
136 137
... ...
... ... @@ -82,7 +82,8 @@ export default function DeviceDirective($compile, $templateCache, toast, $transl
82 82 onMakePublic: '&',
83 83 onUnassignFromCustomer: '&',
84 84 onManageCredentials: '&',
85   - onDeleteDevice: '&'
  85 + onDeleteDevice: '&',
  86 + onUnassignFromEdge: '&',
86 87 }
87 88 };
88 89 }
... ...
... ... @@ -29,6 +29,7 @@
29 29 on-assign-to-customer="vm.assignToCustomer(event, [ vm.grid.detailsConfig.currentItem.id.id ])"
30 30 on-make-public="vm.makePublic(event, vm.grid.detailsConfig.currentItem)"
31 31 on-unassign-from-customer="vm.unassignFromCustomer(event, vm.grid.detailsConfig.currentItem, isPublic)"
  32 + on-unassign-from-edge="vm.unassignFromEdge(event, vm.grid.detailsConfig.currentItem)"
32 33 on-manage-credentials="vm.manageCredentials(event, vm.grid.detailsConfig.currentItem)"
33 34 on-delete-device="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-device>
34 35 </md-tab>
... ...
... ... @@ -283,7 +283,7 @@ export function EdgeController($rootScope, userService, edgeService, customerSer
283 283 details: function() {
284 284 return $translate.instant('edge.manage-edge-rulechains');
285 285 },
286   - icon: "settings_ethernet"
  286 + icon: "code"
287 287 }
288 288 );
289 289
... ...
... ... @@ -49,7 +49,7 @@ export default function EdgeRoutes($stateProvider, types) {
49 49 pageTitle: 'edge.edges'
50 50 },
51 51 ncyBreadcrumb: {
52   - label: '{"icon": "transform", "label": "edge.edges"}'
  52 + label: '{"icon": "router", "label": "edge.edges"}'
53 53 }
54 54 }).state('home.edges.entityViews', {
55 55 url: '/:edgeId/entityViews',
... ...
... ... @@ -27,6 +27,9 @@
27 27 <md-button ng-click="onDeleteEntityView({event: $event})"
28 28 ng-show="!isEdit && entityViewScope === 'tenant'"
29 29 class="md-raised md-primary">{{ 'entity-view.delete' | translate }}</md-button>
  30 +<md-button ng-click="onUnassignFromEdge({event: $event})"
  31 + ng-show="!isEdit && entityViewScope === 'edge'"
  32 + class="md-raised md-primary">{{ 'edge.unassign-from-edge' | translate }}</md-button>
30 33
31 34 <div layout="row">
32 35 <md-button ngclipboard data-clipboard-action="copy"
... ...
... ... @@ -106,6 +106,7 @@ export function EntityViewController($rootScope, userService, entityViewService,
106 106 vm.assignToCustomer = assignToCustomer;
107 107 vm.makePublic = makePublic;
108 108 vm.unassignFromCustomer = unassignFromCustomer;
  109 + vm.unassignFromEdge = unassignFromEdge;
109 110
110 111 initController();
111 112
... ...
... ... @@ -144,7 +144,8 @@ export default function EntityViewDirective($q, $compile, $templateCache, $filte
144 144 onAssignToCustomer: '&',
145 145 onMakePublic: '&',
146 146 onUnassignFromCustomer: '&',
147   - onDeleteEntityView: '&'
  147 + onDeleteEntityView: '&',
  148 + onUnassignFromEdge: '&'
148 149 }
149 150 };
150 151 }
... ...
... ... @@ -29,6 +29,7 @@
29 29 on-assign-to-customer="vm.assignToCustomer(event, [ vm.grid.detailsConfig.currentItem.id.id ])"
30 30 on-make-public="vm.makePublic(event, vm.grid.detailsConfig.currentItem)"
31 31 on-unassign-from-customer="vm.unassignFromCustomer(event, vm.grid.detailsConfig.currentItem, isPublic)"
  32 + on-unassign-from-edge="vm.unassignFromEdge(event, vm.grid.detailsConfig.currentItem)"
32 33 on-delete-entity-view="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-entity-view>
33 34 </md-tab>
34 35 <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.attributes' | translate }}">
... ...
... ... @@ -844,7 +844,8 @@
844 844 "set-root-rule-chain-to-edges-text": "Set root rule chain for { count, plural, 1 {1 edge} other {# edges} }",
845 845 "status": "Received by edge",
846 846 "deployed": "Deployed",
847   - "pending": "Pending"
  847 + "pending": "Pending",
  848 + "unassign-edges-action-title": "Unassign { count, plural, 1 {1 edge} other {# edges} } from customer"
848 849 },
849 850 "error": {
850 851 "unable-to-connect": "Unable to connect to the server! Please check your internet connection.",
... ... @@ -1539,6 +1540,7 @@
1539 1540 "rulechains": "Rule chains",
1540 1541 "core-rulechains": "Core Rule chains",
1541 1542 "edge-rulechains": "Edge Rule chains",
  1543 + "default-root": "Default root",
1542 1544 "root": "Root",
1543 1545 "delete": "Delete rule chain",
1544 1546 "name": "Name",
... ... @@ -1589,10 +1591,10 @@
1589 1591 "set-default-root-edge-rulechain-title": "Are you sure you want to make the rule chain '{{ruleChainName}}' default edge root?",
1590 1592 "set-default-root-edge-rulechain-text": "After the confirmation the rule chain will become default edge root and will handle all incoming transport messages.",
1591 1593 "invalid-rulechain-type-error": "Unable to import rule chain: Invalid rule chain type. Expected type is {{expectedRuleChainType}}.",
1592   - "set-default-edge": "Make edge rule chain default",
  1594 + "set-default-edge": "Make rule chain default",
1593 1595 "set-default-edge-title": "Are you sure you want to make the edge rule chain '{{ruleChainName}}' default?",
1594 1596 "set-default-edge-text": "After the confirmation the edge rule chain will be added to default list and assigned to newly created edge(s).",
1595   - "remove-default-edge": "Remove edge rule chain from defaults",
  1597 + "remove-default-edge": "Remove rule chain from defaults",
1596 1598 "remove-default-edge-title": "Are you sure you want to remove the edge rule chain '{{ruleChainName}}' from default list?",
1597 1599 "remove-default-edge-text": "After the confirmation the edge rule chain will not be assigned for a newly created edges."
1598 1600 },
... ...
... ... @@ -16,7 +16,8 @@
16 16
17 17 -->
18 18 <div ng-if="(vm.parentCtl.ruleChainsScope === 'tenant' && item && item.root) ||
19   - (vm.parentCtl.ruleChainsScope === 'edge' && vm.parentCtl.isRootRuleChain(item)) ||
20   - (vm.parentCtl.ruleChainsScope === 'edges' && vm.parentCtl.isRootRuleChain(item))" translate>rulechain.root</div>
  19 + (vm.parentCtl.ruleChainsScope === 'edge' && vm.parentCtl.isRootRuleChain(item))" translate>rulechain.root</div>
  20 +
  21 +<div ng-if="vm.parentCtl.ruleChainsScope === 'edges' && vm.parentCtl.isRootRuleChain(item)" translate>rulechain.default-root</div>
21 22
22 23 <div ng-if="(vm.parentCtl.ruleChainsScope === 'edges' && vm.parentCtl.isDefaultEdgeRuleChain(item))" translate>rulechain.default</div>
... ...
... ... @@ -18,11 +18,27 @@
18 18 <md-button ng-click="onExportRuleChain({event: $event})"
19 19 ng-show="!isEdit"
20 20 class="md-raised md-primary">{{ 'rulechain.export' | translate }}</md-button>
  21 +
21 22 <md-button ng-click="onSetRootRuleChain({event: $event})"
22   - ng-show="!isEdit && !ruleChain.root"
  23 + ng-show="!isEdit && !ruleChain.root && ruleChainsScope == 'tenant'"
23 24 class="md-raised md-primary">{{ 'rulechain.set-root' | translate }}</md-button>
  25 +
  26 +<md-button ng-click="onSetRootRuleChain({event: $event})"
  27 + ng-show="!isEdit && !ruleChain.root && ruleChainsScope == 'edges'"
  28 + class="md-raised md-primary">{{ 'rulechain.set-default-root-edge' | translate }}</md-button>
  29 +<md-button ng-click="onSetDefaultEdgeRuleChain({event: $event})"
  30 + ng-show="!isEdit && !ruleChain.root && !ruleChain.isDefault && ruleChainsScope == 'edges'"
  31 + class="md-raised md-primary">{{ 'rulechain.set-default-edge' | translate }}</md-button>
  32 +<md-button ng-click="onRemoveDefaultEdgeRuleChain({event: $event})"
  33 + ng-show="!isEdit && !ruleChain.root && ruleChain.isDefault && ruleChainsScope == 'edges'"
  34 + class="md-raised md-primary">{{ 'rulechain.remove-default-edge' | translate }}</md-button>
  35 +
  36 +<md-button ng-click="onSetRootRuleChain({event: $event})"
  37 + ng-show="!isEdit && ruleChainsScope == 'edge' && edge.rootRuleChainId.id !== ruleChain.id.id"
  38 + class="md-raised md-primary">{{ 'rulechain.set-root' | translate }}</md-button>
  39 +
24 40 <md-button ng-click="onDeleteRuleChain({event: $event})"
25   - ng-show="!isEdit && !ruleChain.root"
  41 + ng-show="!isEdit && !ruleChain.root && ruleChainsScope != 'edge'"
26 42 class="md-raised md-primary">{{ 'rulechain.delete' | translate }}</md-button>
27 43
28 44 <div layout="row">
... ...
... ... @@ -40,6 +40,10 @@ export default function RuleChainDirective($compile, $templateCache, $mdDialog,
40 40 isEdit: '=',
41 41 isReadOnly: '=',
42 42 theForm: '=',
  43 + ruleChainsScope: '=',
  44 + edge: '=',
  45 + onSetDefaultEdgeRuleChain: '&',
  46 + onRemoveDefaultEdgeRuleChain: '&',
43 47 onSetRootRuleChain: '&',
44 48 onExportRuleChain: '&',
45 49 onDeleteRuleChain: '&'
... ...
... ... @@ -97,6 +97,8 @@ export default function RuleChainsController(ruleChainService, userService, impo
97 97
98 98 vm.exportRuleChain = exportRuleChain;
99 99 vm.setRootRuleChain = setRootRuleChain;
  100 + vm.setDefaultEdgeRuleChain = setDefaultEdgeRuleChain;
  101 + vm.removeDefaultEdgeRuleChain = removeDefaultEdgeRuleChain;
100 102
101 103 initController();
102 104
... ...
... ... @@ -26,6 +26,10 @@
26 26 is-edit="vm.grid.detailsConfig.isDetailsEditMode"
27 27 is-read-only="vm.grid.isDetailsReadOnly(vm.grid.operatingItem())"
28 28 the-form="vm.grid.detailsForm"
  29 + rule-chains-scope="vm.ruleChainsScope"
  30 + edge="vm.edge"
  31 + on-set-default-edge-rule-chain="vm.setDefaultEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)"
  32 + on-remove-default-edge-rule-chain="vm.removeDefaultEdgeRuleChain(event, vm.grid.detailsConfig.currentItem)"
29 33 on-set-root-rule-chain="vm.setRootRuleChain(event, vm.grid.detailsConfig.currentItem)"
30 34 on-export-rule-chain="vm.exportRuleChain(event, vm.grid.detailsConfig.currentItem)"
31 35 on-delete-rule-chain="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)">
... ...