Commit d7f8c765a9bba809c2c15951847d33e07f6ca557

Authored by deaflynx
1 parent ad704fe3

Code review and refactoring 2

... ... @@ -53,13 +53,7 @@ export default function AddDashboardsToEdgeController(dashboardService, types, $
53 53 fetchMoreItems_: function () {
54 54 if (vm.dashboards.hasNext && !vm.dashboards.pending) {
55 55 vm.dashboards.pending = true;
56   - var fetchDashboardsPromise;
57   - if (edgeCustomerId === vm.types.id.nullUid) {
58   - fetchDashboardsPromise = dashboardService.getTenantDashboards(vm.dashboards.nextPageLink);
59   - } else {
60   - fetchDashboardsPromise = dashboardService.getCustomerDashboards(edgeCustomerId, vm.dashboards.nextPageLink);
61   - }
62   - fetchDashboardsPromise.then(
  56 + dashboardService.getTenantDashboards(vm.dashboards.nextPageLink).then(
63 57 function success(dashboards) {
64 58 vm.dashboards.data = vm.dashboards.data.concat(dashboards.data);
65 59 vm.dashboards.nextPageLink = dashboards.nextPageLink;
... ...
... ... @@ -708,14 +708,7 @@ export function DashboardsController(userService, dashboardService, customerServ
708 708 $event.stopPropagation();
709 709 }
710 710 var pageSize = 10;
711   - var fetchDashboardsPromise;
712   - if (vm.edgeCustomerId.id === vm.types.id.nullUid) {
713   - fetchDashboardsPromise = dashboardService.getTenantDashboards({limit: pageSize, textSearch: ''});
714   - } else {
715   - fetchDashboardsPromise = dashboardService.getCustomerDashboards(vm.edgeCustomerId.id, {limit: pageSize, textSearch: ''});
716   - }
717   -
718   - fetchDashboardsPromise.then(
  711 + dashboardService.getTenantDashboards({limit: pageSize, textSearch: ''}).then(
719 712 function success(_dashboards) {
720 713 var dashboards = {
721 714 pageSize: pageSize,
... ...
... ... @@ -21,6 +21,8 @@ import devicesTemplate from "../device/devices.tpl.html";
21 21 import assetsTemplate from "../asset/assets.tpl.html";
22 22 import dashboardsTemplate from "../dashboard/dashboards.tpl.html";
23 23 import dashboardTemplate from "../dashboard/dashboard.tpl.html";
  24 +import ruleChainsTemplate from "../rulechain/rulechains.tpl.html";
  25 +import ruleChainTemplate from "../rulechain/rulechain.tpl.html";
24 26
25 27 /* eslint-enable import/no-unresolved, import/default */
26 28
... ... @@ -49,8 +51,7 @@ export default function EdgeRoutes($stateProvider, types) {
49 51 ncyBreadcrumb: {
50 52 label: '{"icon": "transform", "label": "edge.edges"}'
51 53 }
52   - })
53   - .state('home.edges.entityViews', {
  54 + }).state('home.edges.entityViews', {
54 55 url: '/:edgeId/entityViews',
55 56 params: {'topIndex': 0},
56 57 module: 'private',
... ... @@ -72,8 +73,7 @@ export default function EdgeRoutes($stateProvider, types) {
72 73 ncyBreadcrumb: {
73 74 label: '{"icon": "view_quilt", "label": "edge.entity-views"}'
74 75 }
75   - })
76   - .state('home.edges.devices', {
  76 + }).state('home.edges.devices', {
77 77 url: '/:edgeId/devices',
78 78 params: {'topIndex': 0},
79 79 module: 'private',
... ... @@ -95,8 +95,7 @@ export default function EdgeRoutes($stateProvider, types) {
95 95 ncyBreadcrumb: {
96 96 label: '{"icon": "devices_other", "label": "edge.devices"}'
97 97 }
98   - })
99   - .state('home.edges.assets', {
  98 + }).state('home.edges.assets', {
100 99 url: '/:edgeId/assets',
101 100 params: {'topIndex': 0},
102 101 module: 'private',
... ... @@ -118,29 +117,27 @@ export default function EdgeRoutes($stateProvider, types) {
118 117 ncyBreadcrumb: {
119 118 label: '{"icon": "domain", "label": "edge.assets"}'
120 119 }
121   - })
122   - .state('home.edges.dashboards', {
123   - url: '/:edgeId/dashboards',
124   - params: {'topIndex': 0},
125   - module: 'private',
126   - auth: ['TENANT_ADMIN'],
127   - views: {
128   - "content@home": {
129   - templateUrl: dashboardsTemplate,
130   - controllerAs: 'vm',
131   - controller: 'DashboardsController'
  120 + }).state('home.edges.dashboards', {
  121 + url: '/:edgeId/dashboards',
  122 + params: {'topIndex': 0},
  123 + module: 'private',
  124 + auth: ['TENANT_ADMIN'],
  125 + views: {
  126 + "content@home": {
  127 + templateUrl: dashboardsTemplate,
  128 + controllerAs: 'vm',
  129 + controller: 'DashboardsController'
  130 + }
  131 + },
  132 + data: {
  133 + dashboardsType: 'edge',
  134 + searchEnabled: true,
  135 + pageTitle: 'edge.dashboards'
  136 + },
  137 + ncyBreadcrumb: {
  138 + label: '{"icon": "dashboard", "label": "edge.dashboards"}'
132 139 }
133   - },
134   - data: {
135   - dashboardsType: 'edge',
136   - searchEnabled: true,
137   - pageTitle: 'edge.dashboards'
138   - },
139   - ncyBreadcrumb: {
140   - label: '{"icon": "dashboard", "label": "edge.dashboards"}'
141   - }
142   - })
143   - .state('home.edges.dashboards.dashboard', {
  140 + }).state('home.edges.dashboards.dashboard', {
144 141 url: '/:dashboardId?state',
145 142 reloadOnSearch: false,
146 143 module: 'private',
... ... @@ -161,8 +158,7 @@ export default function EdgeRoutes($stateProvider, types) {
161 158 ncyBreadcrumb: {
162 159 label: '{"icon": "dashboard", "label": "{{ vm.dashboard.title }}", "translate": "false"}'
163 160 }
164   - })
165   - .state('home.customers.edges', {
  161 + }).state('home.customers.edges', {
166 162 url: '/:customerId/edges',
167 163 params: {'topIndex': 0},
168 164 module: 'private',
... ... @@ -184,5 +180,62 @@ export default function EdgeRoutes($stateProvider, types) {
184 180 ncyBreadcrumb: {
185 181 label: '{"icon": "router", "label": "{{ vm.customerEdgesTitle }}", "translate": "false"}'
186 182 }
  183 + }).state('home.edges.ruleChains', {
  184 + url: '/:edgeId/ruleChains',
  185 + params: {'topIndex': 0},
  186 + module: 'private',
  187 + auth: ['TENANT_ADMIN'],
  188 + views: {
  189 + "content@home": {
  190 + templateUrl: ruleChainsTemplate,
  191 + controllerAs: 'vm',
  192 + controller: 'RuleChainsController'
  193 + }
  194 + },
  195 + data: {
  196 + searchEnabled: true,
  197 + pageTitle: 'edge.rulechains',
  198 + ruleChainsType: 'edge'
  199 + },
  200 + ncyBreadcrumb: {
  201 + label: '{"icon": "settings_ethernet", "label": "rulechain.edge-rulechains"}'
  202 + }
  203 + }).state('home.edges.ruleChains.ruleChain', {
  204 + url: '/:ruleChainId',
  205 + reloadOnSearch: false,
  206 + module: 'private',
  207 + auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
  208 + views: {
  209 + "content@home": {
  210 + templateUrl: ruleChainTemplate,
  211 + controller: 'RuleChainController',
  212 + controllerAs: 'vm'
  213 + }
  214 + },
  215 + resolve: {
  216 + ruleChain:
  217 + /*@ngInject*/
  218 + function($stateParams, ruleChainService) {
  219 + return ruleChainService.getRuleChain($stateParams.ruleChainId);
  220 + },
  221 + ruleChainMetaData:
  222 + /*@ngInject*/
  223 + function($stateParams, ruleChainService) {
  224 + return ruleChainService.getRuleChainMetaData($stateParams.ruleChainId);
  225 + },
  226 + ruleNodeComponents:
  227 + /*@ngInject*/
  228 + function($stateParams, ruleChainService) {
  229 + return ruleChainService.getRuleNodeComponents(types.ruleChainType.edge);
  230 + }
  231 + },
  232 + data: {
  233 + import: false,
  234 + searchEnabled: false,
  235 + pageTitle: 'edge.rulechain'
  236 + },
  237 + ncyBreadcrumb: {
  238 + label: '{"icon": "settings_ethernet", "label": "{{ vm.ruleChain.name }}", "translate": "false"}'
  239 + }
187 240 });
188 241 }
... ...
... ... @@ -16,12 +16,12 @@
16 16
17 17 -->
18 18 <div class="tb-cell" flex="20">{{ event.createdTime | date : 'yyyy-MM-dd HH:mm:ss' }}</div>
19   -<div class="tb-cell" flex="20">{{ event.edgeEventType }}</div>
20   -<div class="tb-cell" flex="40">{{ event.edgeEventAction }}</div>
  19 +<div class="tb-cell" flex="20">{{ event.type }}</div>
  20 +<div class="tb-cell" flex="40">{{ event.action }}</div>
21 21 <div class="tb-cell" flex="20">{{ event.entityId }}</div>
22 22 <div class="tb-cell" flex="15" ng-style="isPending ? {'color': 'rgba(0, 0, 0, .38)'} : {'color': '#000'}">{{ updateStatus(event.createdTime) | translate }}</div>
23 23 <div class="tb-cell" flex="10">
24   - <md-button class="md-icon-button md-primary"
  24 + <md-button ng-if="checkEdgeEventType(event.type)" class="md-icon-button md-primary"
25 25 ng-click="showEdgeEntityContent($event, 'edge.entity-info', 'JSON')"
26 26 aria-label="{{ 'action.view' | translate }}">
27 27 <md-tooltip md-direction="top">
... ...
1   -/*
2   - * Copyright © 2016-2020 The Thingsboard Authors
3   - *
4   - * Licensed under the Apache License, Version 2.0 (the "License");
5   - * you may not use this file except in compliance with the License.
6   - * You may obtain a copy of the License at
7   - *
8   - * http://www.apache.org/licenses/LICENSE-2.0
9   - *
10   - * Unless required by applicable law or agreed to in writing, software
11   - * distributed under the License is distributed on an "AS IS" BASIS,
12   - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   - * See the License for the specific language governing permissions and
14   - * limitations under the License.
15   - */
16   -/* eslint-disable import/no-unresolved, import/default */
17   -
18   -import eventErrorDialogTemplate from './event-content-dialog.tpl.html';
19   -
20   -import eventRowLcEventTemplate from './event-row-lc-event.tpl.html';
21   -import eventRowStatsTemplate from './event-row-stats.tpl.html';
22   -import eventRowErrorTemplate from './event-row-error.tpl.html';
23   -import eventRowDebugRuleNodeTemplate from './event-row-debug-rulenode.tpl.html';
24   -import eventRowEdgeEventTemplate from './event-row-edge-event.tpl.html';
25   -
26   -/* eslint-enable import/no-unresolved, import/default */
27   -
28   -/*@ngInject*/
29   -export default function EventRowDirective($compile, $templateCache, $mdDialog, $document, $translate,
30   - types, utils, toast, entityService, ruleChainService) {
31   -
32   - var linker = function (scope, element, attrs) {
33   -
34   - var getTemplate = function(eventType) {
35   - var template = '';
36   - switch(eventType) {
37   - case types.eventType.lcEvent.value:
38   - template = eventRowLcEventTemplate;
39   - break;
40   - case types.eventType.stats.value:
41   - template = eventRowStatsTemplate;
42   - break;
43   - case types.eventType.error.value:
44   - template = eventRowErrorTemplate;
45   - break;
46   - case types.debugEventType.debugRuleNode.value:
47   - template = eventRowDebugRuleNodeTemplate;
48   - break;
49   - case types.debugEventType.debugRuleChain.value:
50   - template = eventRowDebugRuleNodeTemplate;
51   - break;
52   - case types.eventType.edgeEvent.value:
53   - template = eventRowEdgeEventTemplate;
54   - break;
55   - }
56   - return $templateCache.get(template);
57   - }
58   -
59   - scope.loadTemplate = function() {
60   - element.html(getTemplate(attrs.eventType));
61   - $compile(element.contents())(scope);
62   - }
63   -
64   - attrs.$observe('eventType', function() {
65   - scope.loadTemplate();
66   - });
67   -
68   - scope.types = types;
69   -
70   - scope.event = attrs.event;
71   -
72   - scope.showContent = function($event, content, title, contentType) {
73   - var onShowingCallback = {
74   - onShowing: function(){}
75   - }
76   - if (!contentType) {
77   - contentType = null;
78   - }
79   - var sortedContent;
80   - try {
81   - sortedContent = angular.toJson(utils.sortObjectKeys(angular.fromJson(content)));
82   - }
83   - catch(err) {
84   - sortedContent = content;
85   - }
86   - $mdDialog.show({
87   - controller: 'EventContentDialogController',
88   - controllerAs: 'vm',
89   - templateUrl: eventErrorDialogTemplate,
90   - locals: {content: sortedContent, title: title, contentType: contentType, showingCallback: onShowingCallback},
91   - parent: angular.element($document[0].body),
92   - fullscreen: true,
93   - targetEvent: $event,
94   - multiple: true,
95   - onShowing: function(scope, element) {
96   - onShowingCallback.onShowing(scope, element);
97   - }
98   - });
99   - }
100   -
101   - scope.showEdgeEntityContent = function($event, title, contentType) {
102   - var onShowingCallback = {
103   - onShowing: function(){}
104   - }
105   - if (!contentType) {
106   - contentType = null;
107   - }
108   - var content = '';
109   - switch(scope.event.edgeEventType) {
110   - case types.edgeEventType.relation:
111   - content = angular.toJson(scope.event.entityBody);
112   - showDialog();
113   - break;
114   - case types.edgeEventType.ruleChainMetaData:
115   - content = ruleChainService.getRuleChainMetaData(scope.event.entityId, {ignoreErrors: true}).then(
116   - function success(info) {
117   - showDialog();
118   - return angular.toJson(info);
119   - }, function fail() {
120   - showError();
121   - });
122   - break;
123   - default:
124   - content = entityService.getEntity(scope.event.edgeEventType, scope.event.entityId, {ignoreErrors: true}).then(
125   - function success(info) {
126   - showDialog();
127   - return angular.toJson(info);
128   - }, function fail() {
129   - showError();
130   - });
131   - break;
132   - }
133   - function showDialog() {
134   - $mdDialog.show({
135   - controller: 'EventContentDialogController',
136   - controllerAs: 'vm',
137   - templateUrl: eventErrorDialogTemplate,
138   - locals: {content: content, title: title, contentType: contentType, showingCallback: onShowingCallback},
139   - parent: angular.element($document[0].body),
140   - fullscreen: true,
141   - targetEvent: $event,
142   - multiple: true,
143   - onShowing: function(scope, element) {
144   - onShowingCallback.onShowing(scope, element);
145   - }
146   - });
147   - }
148   - function showError() {
149   - toast.showError($translate.instant('edge.load-entity-error'));
150   - }
151   - }
152   -
153   - scope.checkTooltip = function($event) {
154   - var el = $event.target;
155   - var $el = angular.element(el);
156   - if(el.offsetWidth < el.scrollWidth && !$el.attr('title')){
157   - $el.attr('title', $el.text());
158   - }
159   - }
160   -
161   - $compile(element.contents())(scope);
162   -
163   - scope.updateStatus = function(eventCreatedTime) {
164   - if (scope.queueStartTs) {
165   - var status;
166   - if (eventCreatedTime < scope.queueStartTs) {
167   - status = $translate.instant('edge.success');
168   - scope.isPending = false;
169   - } else {
170   - status = $translate.instant('edge.failed');
171   - scope.isPending = true;
172   - }
173   - return status;
174   - }
175   - }
176   - }
177   -
178   - return {
179   - restrict: "A",
180   - replace: false,
181   - link: linker,
182   - scope: false
183   - };
184   -}
  1 +/*
  2 + * Copyright © 2016-2020 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +/* eslint-disable import/no-unresolved, import/default */
  17 +
  18 +import eventErrorDialogTemplate from './event-content-dialog.tpl.html';
  19 +
  20 +import eventRowLcEventTemplate from './event-row-lc-event.tpl.html';
  21 +import eventRowStatsTemplate from './event-row-stats.tpl.html';
  22 +import eventRowErrorTemplate from './event-row-error.tpl.html';
  23 +import eventRowDebugRuleNodeTemplate from './event-row-debug-rulenode.tpl.html';
  24 +import eventRowEdgeEventTemplate from './event-row-edge-event.tpl.html';
  25 +
  26 +/* eslint-enable import/no-unresolved, import/default */
  27 +
  28 +/*@ngInject*/
  29 +export default function EventRowDirective($compile, $templateCache, $mdDialog, $document, $translate,
  30 + types, utils, toast, entityService, ruleChainService) {
  31 +
  32 + var linker = function (scope, element, attrs) {
  33 +
  34 + var getTemplate = function(eventType) {
  35 + var template = '';
  36 + switch(eventType) {
  37 + case types.eventType.lcEvent.value:
  38 + template = eventRowLcEventTemplate;
  39 + break;
  40 + case types.eventType.stats.value:
  41 + template = eventRowStatsTemplate;
  42 + break;
  43 + case types.eventType.error.value:
  44 + template = eventRowErrorTemplate;
  45 + break;
  46 + case types.debugEventType.debugRuleNode.value:
  47 + template = eventRowDebugRuleNodeTemplate;
  48 + break;
  49 + case types.debugEventType.debugRuleChain.value:
  50 + template = eventRowDebugRuleNodeTemplate;
  51 + break;
  52 + case types.eventType.edgeEvent.value:
  53 + template = eventRowEdgeEventTemplate;
  54 + break;
  55 + }
  56 + return $templateCache.get(template);
  57 + }
  58 +
  59 + scope.loadTemplate = function() {
  60 + element.html(getTemplate(attrs.eventType));
  61 + $compile(element.contents())(scope);
  62 + }
  63 +
  64 + attrs.$observe('eventType', function() {
  65 + scope.loadTemplate();
  66 + });
  67 +
  68 + scope.types = types;
  69 +
  70 + scope.event = attrs.event;
  71 +
  72 + scope.showContent = function($event, content, title, contentType) {
  73 + var onShowingCallback = {
  74 + onShowing: function(){}
  75 + }
  76 + if (!contentType) {
  77 + contentType = null;
  78 + }
  79 + var sortedContent;
  80 + try {
  81 + sortedContent = angular.toJson(utils.sortObjectKeys(angular.fromJson(content)));
  82 + }
  83 + catch(err) {
  84 + sortedContent = content;
  85 + }
  86 + $mdDialog.show({
  87 + controller: 'EventContentDialogController',
  88 + controllerAs: 'vm',
  89 + templateUrl: eventErrorDialogTemplate,
  90 + locals: {content: sortedContent, title: title, contentType: contentType, showingCallback: onShowingCallback},
  91 + parent: angular.element($document[0].body),
  92 + fullscreen: true,
  93 + targetEvent: $event,
  94 + multiple: true,
  95 + onShowing: function(scope, element) {
  96 + onShowingCallback.onShowing(scope, element);
  97 + }
  98 + });
  99 + }
  100 +
  101 + scope.showEdgeEntityContent = function($event, title, contentType) {
  102 + var onShowingCallback = {
  103 + onShowing: function(){}
  104 + }
  105 + if (!contentType) {
  106 + contentType = null;
  107 + }
  108 + var content = '';
  109 + switch(scope.event.type) {
  110 + case types.edgeEventType.relation:
  111 + case types.edgeEventType.whiteLabeling:
  112 + case types.edgeEventType.loginWhiteLabeling:
  113 + case types.edgeEventType.customTranslation:
  114 + content = angular.toJson(scope.event.body);
  115 + showDialog();
  116 + break;
  117 + case types.edgeEventType.ruleChainMetaData:
  118 + content = ruleChainService.getRuleChainMetaData(scope.event.entityId, {ignoreErrors: true}).then(
  119 + function success(info) {
  120 + showDialog();
  121 + return angular.toJson(info);
  122 + }, function fail() {
  123 + showError();
  124 + });
  125 + break;
  126 + default:
  127 + content = entityService.getEntity(scope.event.type, scope.event.entityId, {ignoreErrors: true}).then(
  128 + function success(info) {
  129 + showDialog();
  130 + return angular.toJson(info);
  131 + }, function fail() {
  132 + showError();
  133 + });
  134 + break;
  135 + }
  136 + function showDialog() {
  137 + $mdDialog.show({
  138 + controller: 'EventContentDialogController',
  139 + controllerAs: 'vm',
  140 + templateUrl: eventErrorDialogTemplate,
  141 + locals: {content: content, title: title, contentType: contentType, showingCallback: onShowingCallback},
  142 + parent: angular.element($document[0].body),
  143 + fullscreen: true,
  144 + targetEvent: $event,
  145 + multiple: true,
  146 + onShowing: function(scope, element) {
  147 + onShowingCallback.onShowing(scope, element);
  148 + }
  149 + });
  150 + }
  151 + function showError() {
  152 + toast.showError($translate.instant('edge.load-entity-error'));
  153 + }
  154 + }
  155 +
  156 + scope.checkEdgeEventType = function (edgeEventType) {
  157 + return !(edgeEventType === types.edgeEventType.widgetType ||
  158 + edgeEventType === types.edgeEventType.adminSettings ||
  159 + edgeEventType === types.edgeEventType.widgetsBundle );
  160 + }
  161 +
  162 + scope.checkTooltip = function($event) {
  163 + var el = $event.target;
  164 + var $el = angular.element(el);
  165 + if(el.offsetWidth < el.scrollWidth && !$el.attr('title')){
  166 + $el.attr('title', $el.text());
  167 + }
  168 + }
  169 +
  170 + $compile(element.contents())(scope);
  171 +
  172 + scope.updateStatus = function(eventCreatedTime) {
  173 + if (scope.queueStartTs) {
  174 + var status;
  175 + if (eventCreatedTime < scope.queueStartTs) {
  176 + status = $translate.instant('edge.success');
  177 + scope.isPending = false;
  178 + } else {
  179 + status = $translate.instant('edge.failed');
  180 + scope.isPending = true;
  181 + }
  182 + return status;
  183 + }
  184 + }
  185 + }
  186 +
  187 + return {
  188 + restrict: "A",
  189 + replace: false,
  190 + link: linker,
  191 + scope: false
  192 + };
  193 +}
... ...
... ... @@ -54,7 +54,7 @@ export default function AddRuleChainsToEdgeController(ruleChainService, $mdDialo
54 54 vm.ruleChains.pending = true;
55 55 ruleChainService.getEdgesRuleChains(vm.ruleChains.nextPageLink).then(
56 56 function success(ruleChains) {
57   - vm.ruleChains.data = ruleChains.data;
  57 + vm.ruleChains.data = vm.ruleChains.data.concat(ruleChains.data);
58 58 vm.ruleChains.nextPageLink = ruleChains.nextPageLink;
59 59 vm.ruleChains.hasNext = ruleChains.hasNext;
60 60 if (vm.ruleChains.hasNext) {
... ...
... ... @@ -191,62 +191,5 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider
191 191 ncyBreadcrumb: {
192 192 label: '{"icon": "settings_ethernet", "label": "{{ vm.ruleChain.name }}", "translate": "false"}'
193 193 }
194   - }).state('home.edges.ruleChains', {
195   - url: '/:edgeId/ruleChains',
196   - params: {'topIndex': 0},
197   - module: 'private',
198   - auth: ['TENANT_ADMIN'],
199   - views: {
200   - "content@home": {
201   - templateUrl: ruleChainsTemplate,
202   - controllerAs: 'vm',
203   - controller: 'RuleChainsController'
204   - }
205   - },
206   - data: {
207   - searchEnabled: true,
208   - pageTitle: 'edge.rulechains',
209   - ruleChainsType: 'edge'
210   - },
211   - ncyBreadcrumb: {
212   - label: '{"icon": "settings_ethernet", "label": "rulechain.edge-rulechains"}'
213   - }
214   - }).state('home.edges.ruleChains.ruleChain', {
215   - url: '/:ruleChainId',
216   - reloadOnSearch: false,
217   - module: 'private',
218   - auth: ['SYS_ADMIN', 'TENANT_ADMIN'],
219   - views: {
220   - "content@home": {
221   - templateUrl: ruleChainTemplate,
222   - controller: 'RuleChainController',
223   - controllerAs: 'vm'
224   - }
225   - },
226   - resolve: {
227   - ruleChain:
228   - /*@ngInject*/
229   - function($stateParams, ruleChainService) {
230   - return ruleChainService.getRuleChain($stateParams.ruleChainId);
231   - },
232   - ruleChainMetaData:
233   - /*@ngInject*/
234   - function($stateParams, ruleChainService) {
235   - return ruleChainService.getRuleChainMetaData($stateParams.ruleChainId);
236   - },
237   - ruleNodeComponents:
238   - /*@ngInject*/
239   - function($stateParams, ruleChainService) {
240   - return ruleChainService.getRuleNodeComponents(types.ruleChainType.edge);
241   - }
242   - },
243   - data: {
244   - import: false,
245   - searchEnabled: false,
246   - pageTitle: 'edge.rulechain'
247   - },
248   - ncyBreadcrumb: {
249   - label: '{"icon": "settings_ethernet", "label": "{{ vm.ruleChain.name }}", "translate": "false"}'
250   - }
251 194 });
252 195 }
... ...
... ... @@ -397,7 +397,7 @@ export default function RuleChainsController(ruleChainService, userService, impo
397 397 }
398 398 var ruleChainParams = {ruleChainId: ruleChain.id.id};
399 399 if (vm.ruleChainsScope === 'edge') {
400   - $state.go('home.edges.ruleChains.ruleChain', {...ruleChainParams, edgeId: vm.edge.id.id});
  400 + $state.go('home.edges.ruleChains.ruleChain', Object.assign(ruleChainParams, edgeId = vm.edge.id.id));
401 401 } else if (vm.ruleChainsScope === 'edges') {
402 402 $state.go('home.ruleChains.edge.ruleChain', ruleChainParams);
403 403 } else {
... ...