Commit d0bff3d6eb2b2f0724798df2ebe9688cb6387b50
Committed by
GitHub
Merge pull request #61 from deaflynx/develop/2.6-edge
Develop/2.6 edge UI updates
Showing
25 changed files
with
81 additions
and
22 deletions
... | ... | @@ -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)"> | ... | ... |