Browse Source

Default edge rulechain label fixed. Fixed makeDefaultEdgeRuleChain server side

pull/2436/head
deaflynx 6 years ago
parent
commit
5d385809e7
  1. 2
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java
  2. 2
      dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java
  3. 2
      dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java
  4. 23
      dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java
  5. 23
      msa/js-executor/package-lock.json
  6. 9
      ui/src/app/locale/locale.constant-en_US.json
  7. 10
      ui/src/app/rulechain/rulechain-card.tpl.html
  8. 4
      ui/src/app/rulechain/rulechain.routes.js
  9. 133
      ui/src/app/rulechain/rulechains.controller.js

2
dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java

@ -5,7 +5,7 @@
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

2
dao/src/main/java/org/thingsboard/server/dao/rule/CassandraRuleChainDao.java

@ -109,7 +109,7 @@ public class CassandraRuleChainDao extends CassandraAbstractSearchTextDao<RuleCh
@Override @Override
public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) { public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) {
log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId); log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId);
ListenableFuture<List<EntityRelation>> relations = relationDao.findAllByToAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE); ListenableFuture<List<EntityRelation>> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE);
return Futures.transformAsync(relations, input -> { return Futures.transformAsync(relations, input -> {
List<ListenableFuture<RuleChain>> ruleChainFutures = new ArrayList<>(input.size()); List<ListenableFuture<RuleChain>> ruleChainFutures = new ArrayList<>(input.size());
for (EntityRelation relation : input) { for (EntityRelation relation : input) {

2
dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaRuleChainDao.java

@ -109,7 +109,7 @@ public class JpaRuleChainDao extends JpaAbstractSearchTextDao<RuleChainEntity, R
@Override @Override
public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) { public ListenableFuture<List<RuleChain>> findDefaultEdgeRuleChainsByTenantId(UUID tenantId) {
log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId); log.debug("Try to find default edge rule chains by tenantId [{}]", tenantId);
ListenableFuture<List<EntityRelation>> relations = relationDao.findAllByToAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE); ListenableFuture<List<EntityRelation>> relations = relationDao.findAllByFromAndType(new TenantId(tenantId), new TenantId(tenantId), EntityRelation.CONTAINS_TYPE, RelationTypeGroup.EDGE);
return Futures.transformAsync(relations, input -> { return Futures.transformAsync(relations, input -> {
List<ListenableFuture<RuleChain>> ruleChainsFutures = new ArrayList<>(input.size()); List<ListenableFuture<RuleChain>> ruleChainsFutures = new ArrayList<>(input.size());
for (EntityRelation relation : input) { for (EntityRelation relation : input) {

23
dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java

@ -23,6 +23,7 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageData;
import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.page.TextPageLink;
@ -318,6 +319,28 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest {
ruleChainService.deleteRuleChainById(tenantId, savedRuleChainMetaData.getRuleChainId()); ruleChainService.deleteRuleChainById(tenantId, savedRuleChainMetaData.getRuleChainId());
} }
@Test
public void testGetDefaultEdgeRuleChains() throws Exception {
RuleChainId ruleChainId = saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 1");
saveRuleChainAndSetDefaultEdge("Default Edge Rule Chain 2");
List<RuleChain> result = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId).get();
Assert.assertEquals(2, result.size());
ruleChainService.removeDefaultEdgeRuleChain(tenantId, ruleChainId);
result = ruleChainService.findDefaultEdgeRuleChainsByTenantId(tenantId).get();
Assert.assertEquals(1, result.size());
}
private RuleChainId saveRuleChainAndSetDefaultEdge(String name) {
RuleChain edgeRuleChain = new RuleChain();
edgeRuleChain.setTenantId(tenantId);
edgeRuleChain.setType(RuleChainType.EDGE);
edgeRuleChain.setName(name);
RuleChain savedEdgeRuleChain = ruleChainService.saveRuleChain(edgeRuleChain);
ruleChainService.addDefaultEdgeRuleChain(tenantId, savedEdgeRuleChain.getId());
return savedEdgeRuleChain.getId();
}
private RuleChainMetaData createRuleChainMetadata() throws Exception { private RuleChainMetaData createRuleChainMetadata() throws Exception {
RuleChain ruleChain = new RuleChain(); RuleChain ruleChain = new RuleChain();
ruleChain.setName("My RuleChain"); ruleChain.setName("My RuleChain");

23
msa/js-executor/package-lock.json

@ -1942,14 +1942,12 @@
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@ -1964,20 +1962,17 @@
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
@ -2094,8 +2089,7 @@
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
@ -2107,7 +2101,6 @@
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"number-is-nan": "^1.0.0" "number-is-nan": "^1.0.0"
} }
@ -2122,7 +2115,6 @@
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
@ -2234,8 +2226,7 @@
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
@ -2247,7 +2238,6 @@
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@ -2369,7 +2359,6 @@
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",

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

@ -1554,6 +1554,7 @@
"assign-rulechains": "Assign rulechains", "assign-rulechains": "Assign rulechains",
"assign-new-rulechain": "Assign new rulechain", "assign-new-rulechain": "Assign new rulechain",
"delete-rulechains": "Delete rulechains", "delete-rulechains": "Delete rulechains",
"default": "Default",
"unassign-rulechain": "Unassign rulechain", "unassign-rulechain": "Unassign rulechain",
"unassign-rulechains": "Unassign rulechains", "unassign-rulechains": "Unassign rulechains",
"unassign-rulechain-title": "Are you sure you want to unassign the rulechain '{{ruleChainTitle}}'?", "unassign-rulechain-title": "Are you sure you want to unassign the rulechain '{{ruleChainTitle}}'?",
@ -1576,7 +1577,13 @@
"set-default-root-edge": "Make rule chain default root", "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-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-default-root-edge-rulechain-text": "After the confirmation the rule chain will become default edge root and will handle all incoming transport messages.",
"invalid-rulechain-type-error": "Unable to import rule chain: Invalid rule chain type. Expected type is {{expectedRuleChainType}}." "invalid-rulechain-type-error": "Unable to import rule chain: Invalid rule chain type. Expected type is {{expectedRuleChainType}}.",
"set-default-edge": "Make edge 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 handle all incoming transport messages.",
"remove-default-edge": "Remove edge 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 stop handling all incoming transport messages."
}, },
"rulenode": { "rulenode": {
"details": "Details", "details": "Details",

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

@ -15,5 +15,11 @@
limitations under the License. limitations under the License.
--> -->
<div class="tb-small tb-rule-chain-assigned-edges" ng-show="vm.parentCtl.ruleChainsScope === 'tenant' && vm.item.assignedEdgesText">{{'rulechain.assigned-to-edges' | translate}}: '{{vm.item.assignedEdgesText}}'</div> <div ng-if="(vm.parentCtl.ruleChainsScope === 'tenant' && item && item.root) ||
<div ng-if="(vm.parentCtl.ruleChainsScope === 'tenant' && item && item.root) || (vm.parentCtl.ruleChainsScope === 'edge' && vm.parentCtl.isRootRuleChain(item))" translate>rulechain.root</div> (vm.parentCtl.ruleChainsScope === 'edge' && vm.parentCtl.isRootRuleChain(item)) ||
(vm.parentCtl.ruleChainsScope === 'edges' && vm.parentCtl.isRootRuleChain(item))"
translate>rulechain.root
</div>
<div ng-if="(vm.parentCtl.ruleChainsScope === 'edge' && vm.parentCtl.isDefaultEdgeRuleChain(item))"
translate>rulechain.default
</div>

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

@ -209,7 +209,7 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider
ruleChainsType: 'edge' ruleChainsType: 'edge'
}, },
ncyBreadcrumb: { ncyBreadcrumb: {
label: '{"icon": "settings_ethernet", "label": "{{ vm.edgeRuleChainsTitle }}", "translate": "false"}' label: '{"icon": "settings_ethernet", "label": "rulechain.edge-rulechains"}'
} }
}).state('home.edges.ruleChains.ruleChain', { }).state('home.edges.ruleChains.ruleChain', {
url: '/:ruleChainId', url: '/:ruleChainId',
@ -249,4 +249,4 @@ export default function RuleChainRoutes($stateProvider, NodeTemplatePathProvider
label: '{"icon": "settings_ethernet", "label": "{{ vm.ruleChain.name }}", "translate": "false"}' label: '{"icon": "settings_ethernet", "label": "{{ vm.ruleChain.name }}", "translate": "false"}'
} }
}); });
} }

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

@ -94,6 +94,8 @@ export default function RuleChainsController(ruleChainService, userService, edge
vm.isRootRuleChain = isRootRuleChain; vm.isRootRuleChain = isRootRuleChain;
vm.isNonRootRuleChain = isNonRootRuleChain; vm.isNonRootRuleChain = isNonRootRuleChain;
vm.isDefaultEdgeRuleChain = isDefaultEdgeRuleChain;
var defaultEdgeRuleChainIds = [];
vm.exportRuleChain = exportRuleChain; vm.exportRuleChain = exportRuleChain;
vm.setRootRuleChain = setRootRuleChain; vm.setRootRuleChain = setRootRuleChain;
@ -234,9 +236,10 @@ export default function RuleChainsController(ruleChainService, userService, edge
details: function() { return $translate.instant('rulechain.import') }, details: function() { return $translate.instant('rulechain.import') },
icon: "file_upload" icon: "file_upload"
}); });
} else if (vm.ruleChainsScope === 'edge') { } else if (vm.ruleChainsScope === 'edge') {
fetchRuleChainsFunction = function (pageLink) { fetchRuleChainsFunction = function (pageLink) {
return ruleChainService.getEdgeRuleChains(edgeId, pageLink); return fetchEdgeRuleChains(edgeId, pageLink);
}; };
deleteRuleChainFunction = function (ruleChainId) { deleteRuleChainFunction = function (ruleChainId) {
return ruleChainService.unassignRuleChainFromEdge(edgeId, ruleChainId); return ruleChainService.unassignRuleChainFromEdge(edgeId, ruleChainId);
@ -252,6 +255,26 @@ export default function RuleChainsController(ruleChainService, userService, edge
isEnabled: isNonRootRuleChain isEnabled: isNonRootRuleChain
}); });
ruleChainActionsList.push({
onAction: function ($event, item) {
setDefaultEdgeRuleChain($event, item);
},
name: function() { return $translate.instant('rulechain.set-default-edge') },
details: function() { return $translate.instant('rulechain.set-default-edge') },
icon: "bookmark_outline",
isEnabled: isNonDefaultEdgeRuleChain
});
ruleChainActionsList.push({
onAction: function ($event, item) {
removeDefaultEdgeRuleChain($event, item);
},
name: function() { return $translate.instant('rulechain.remove-default-edge') },
details: function() { return $translate.instant('rulechain.remove-default-edge') },
icon: "bookmark",
isEnabled: isDefaultEdgeRuleChain
});
ruleChainActionsList.push( ruleChainActionsList.push(
{ {
onAction: function ($event, item) { onAction: function ($event, item) {
@ -315,29 +338,51 @@ export default function RuleChainsController(ruleChainService, userService, edge
vm.grid = grid; vm.grid = grid;
} }
function getDefaultEdges(ruleChains) {
var deferred = $q.defer();
ruleChainService.getDefaultEdgeRuleChains(null).then(
function success(response) {
response.map(function (ruleChain) {
defaultEdgeRuleChainIds.push(ruleChain.id.id)
});
const data = ruleChains.data;
data.map(function (ruleChain) {
ruleChain.isDefault = defaultEdgeRuleChainIds.some(
id => ruleChain.id.id.includes(id));
return ruleChain;
});
ruleChains.data = data;
deferred.resolve(ruleChains);
}, function fail() {
deferred.reject();
}
)
return deferred.promise;
}
function fetchRuleChains(pageLink, type) { function fetchRuleChains(pageLink, type) {
if (type === types.systemRuleChainType) { return ruleChainService.getRuleChains(pageLink, null, type);
return ruleChainService.getRuleChains(pageLink, null, type); }
} else {
var deferred = $q.defer(); function fetchEdgeRuleChains(edgeId, pageLink) {
ruleChainService.getRuleChains(pageLink, null, type).then( var deferred = $q.defer();
// TODO: deaflynx ruleChainService.getRuleChains(pageLink, null, types.edgeRuleChainType).then(
// function success(response) { function success(ruleChains) {
// ruleChainService.getDefaultEdgeRuleChains().then( getDefaultEdges(ruleChains).then(
// function success(defaultEdgeRuleChains) { function success(response) {
// // response.data merge with defaultEdgeRuleChains deferred.resolve(response);
// deferred.resolve(data); }, function fail() {
// }, deferred.reject();
// function fail() { }
// deferred.reject(); );
// } // deferred.resolve(response);
// ); }, function fail() {
// },
function fail() {
deferred.reject(); deferred.reject();
}); }
return deferred.promise; );
} return deferred.promise;
} }
function saveRuleChain(ruleChain) { function saveRuleChain(ruleChain) {
@ -389,6 +434,14 @@ export default function RuleChainsController(ruleChainService, userService, edge
} }
} }
function isDefaultEdgeRuleChain(ruleChain) {
return angular.isDefined(ruleChain) && !ruleChain.root && defaultEdgeRuleChainIds.includes(ruleChain.id.id) === true;
}
function isNonDefaultEdgeRuleChain(ruleChain) {
return angular.isDefined(ruleChain) && !ruleChain.root && defaultEdgeRuleChainIds.includes(ruleChain.id.id) === false;
}
function exportRuleChain($event, ruleChain) { function exportRuleChain($event, ruleChain) {
$event.stopPropagation(); $event.stopPropagation();
importExport.exportRuleChain(ruleChain.id.id); importExport.exportRuleChain(ruleChain.id.id);
@ -421,6 +474,42 @@ export default function RuleChainsController(ruleChainService, userService, edge
}); });
} }
function setDefaultEdgeRuleChain($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'))
.cancel($translate.instant('action.no'))
.ok($translate.instant('action.yes'));
$mdDialog.show(confirm).then(function () {
ruleChainService.addDefaultEdgeRuleChain(ruleChain.id.id).then(
() => {
vm.grid.refreshList();
}
);
});
}
function removeDefaultEdgeRuleChain($event, ruleChain) {
$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'))
.cancel($translate.instant('action.no'))
.ok($translate.instant('action.yes'));
$mdDialog.show(confirm).then(function () {
ruleChainService.removeDefaultEdgeRuleChain(ruleChain.id.id).then(
() => {
vm.grid.refreshList();
}
);
});
}
function setDefaultRootEdgeRuleChain($event, ruleChain) { function setDefaultRootEdgeRuleChain($event, ruleChain) {
$event.stopPropagation(); $event.stopPropagation();
var confirm = $mdDialog.confirm() var confirm = $mdDialog.confirm()

Loading…
Cancel
Save