Merge remote-tracking branch 'upstream/master' into feature/cell-click-action
This commit is contained in:
commit
4425871d3e
@ -11,7 +11,7 @@
|
|||||||
"resources": [],
|
"resources": [],
|
||||||
"templateHtml": "<tb-entities-table-widget \n [ctx]=\"ctx\">\n</tb-entities-table-widget>",
|
"templateHtml": "<tb-entities-table-widget \n [ctx]=\"ctx\">\n</tb-entities-table-widget>",
|
||||||
"templateCss": "",
|
"templateCss": "",
|
||||||
"controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.entitiesTableWidget.onDataUpdated();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n hasDataPageLink: true,\n warnOnPageDataOverflow: false,\n dataKeysOptional: true\n };\n}\n\nself.actionSources = function() {\n return {\n 'actionCellButton': {\n name: 'widget-action.action-cell-button',\n multiple: true,\n hasShowCondition: true\n },\n 'rowClick': {\n name: 'widget-action.row-click',\n multiple: false\n },\n 'rowDoubleClick': {\n name: 'widget-action.row-double-click',\n multiple: false\n },\n 'cellClick': {\n name: 'widget-action.cell-click',\n multiple: true\n }\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
"controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.entitiesTableWidget.onDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.entitiesTableWidget.onEditModeChanged();\n}\n\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n hasDataPageLink: true,\n warnOnPageDataOverflow: false,\n dataKeysOptional: true\n };\n}\n\nself.actionSources = function() {\n return {\n 'actionCellButton': {\n name: 'widget-action.action-cell-button',\n multiple: true,\n hasShowCondition: true\n },\n 'rowClick': {\n name: 'widget-action.row-click',\n multiple: false\n },\n 'rowDoubleClick': {\n name: 'widget-action.row-double-click',\n multiple: false\n },\n 'cellClick': {\n name: 'widget-action.cell-click',\n multiple: false\n }\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
||||||
"settingsSchema": "",
|
"settingsSchema": "",
|
||||||
"dataKeySettingsSchema": "",
|
"dataKeySettingsSchema": "",
|
||||||
"settingsDirective": "tb-entities-table-widget-settings",
|
"settingsDirective": "tb-entities-table-widget-settings",
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
"resources": [],
|
"resources": [],
|
||||||
"templateHtml": "<tb-entities-table-widget \n [ctx]=\"ctx\">\n</tb-entities-table-widget>",
|
"templateHtml": "<tb-entities-table-widget \n [ctx]=\"ctx\">\n</tb-entities-table-widget>",
|
||||||
"templateCss": "",
|
"templateCss": "",
|
||||||
"controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.entitiesTableWidget.onDataUpdated();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n hasDataPageLink: true,\n warnOnPageDataOverflow: false,\n dataKeysOptional: true\n };\n}\n\nself.actionSources = function() {\n return {\n 'actionCellButton': {\n name: 'widget-action.action-cell-button',\n multiple: true,\n hasShowCondition: true\n },\n 'rowClick': {\n name: 'widget-action.row-click',\n multiple: false\n },\n 'rowDoubleClick': {\n name: 'widget-action.row-double-click',\n multiple: false\n },\n 'cellClick': {\n name: 'widget-action.cell-click',\n multiple: true\n }\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
"controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.entitiesTableWidget.onDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.entitiesTableWidget.onEditModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n hasDataPageLink: true,\n warnOnPageDataOverflow: false,\n dataKeysOptional: true\n };\n}\n\nself.actionSources = function() {\n return {\n 'actionCellButton': {\n name: 'widget-action.action-cell-button',\n multiple: true,\n hasShowCondition: true\n },\n 'rowClick': {\n name: 'widget-action.row-click',\n multiple: false\n },\n 'rowDoubleClick': {\n name: 'widget-action.row-double-click',\n multiple: false\n },\n 'cellClick': {\n name: 'widget-action.cell-click',\n multiple: false\n }\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
||||||
"settingsSchema": "",
|
"settingsSchema": "",
|
||||||
"dataKeySettingsSchema": "",
|
"dataKeySettingsSchema": "",
|
||||||
"settingsDirective": "tb-entities-table-widget-settings",
|
"settingsDirective": "tb-entities-table-widget-settings",
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
"resources": [],
|
"resources": [],
|
||||||
"templateHtml": "<tb-entities-hierarchy-widget \n [ctx]=\"ctx\">\n</tb-entities-hierarchy-widget>",
|
"templateHtml": "<tb-entities-hierarchy-widget \n [ctx]=\"ctx\">\n</tb-entities-hierarchy-widget>",
|
||||||
"templateCss": "",
|
"templateCss": "",
|
||||||
"controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.entitiesHierarchyWidget.onDataUpdated();\n}\n\nself.typeParameters = function() {\n return {\n dataKeysOptional: true\n };\n}\n\nself.actionSources = function() {\n return {\n 'nodeSelected': {\n name: 'widget-action.node-selected',\n multiple: false\n }\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
"controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.entitiesHierarchyWidget.onDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.entitiesHierarchyWidget.onEditModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n dataKeysOptional: true\n };\n}\n\nself.actionSources = function() {\n return {\n 'nodeSelected': {\n name: 'widget-action.node-selected',\n multiple: false\n }\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
||||||
"settingsSchema": "",
|
"settingsSchema": "",
|
||||||
"dataKeySettingsSchema": "",
|
"dataKeySettingsSchema": "",
|
||||||
"settingsDirective": "tb-entities-hierarchy-widget-settings",
|
"settingsDirective": "tb-entities-hierarchy-widget-settings",
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
"resources": [],
|
"resources": [],
|
||||||
"templateHtml": "<tb-entities-table-widget \n [ctx]=\"ctx\">\n</tb-entities-table-widget>",
|
"templateHtml": "<tb-entities-table-widget \n [ctx]=\"ctx\">\n</tb-entities-table-widget>",
|
||||||
"templateCss": "",
|
"templateCss": "",
|
||||||
"controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.entitiesTableWidget.onDataUpdated();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n hasDataPageLink: true,\n warnOnPageDataOverflow: false,\n dataKeysOptional: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'name', type: 'entityField' }];\n }\n };\n}\n\nself.actionSources = function() {\n return {\n 'actionCellButton': {\n name: 'widget-action.action-cell-button',\n multiple: true,\n hasShowCondition: true\n },\n 'rowClick': {\n name: 'widget-action.row-click',\n multiple: false\n },\n 'rowDoubleClick': {\n name: 'widget-action.row-double-click',\n multiple: false\n },\n 'cellClick': {\n name: 'widget-action.cell-click',\n multiple: true\n }\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
"controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.entitiesTableWidget.onDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.entitiesTableWidget.onEditModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n hasDataPageLink: true,\n warnOnPageDataOverflow: false,\n dataKeysOptional: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'name', type: 'entityField' }];\n }\n };\n}\n\nself.actionSources = function() {\n return {\n 'actionCellButton': {\n name: 'widget-action.action-cell-button',\n multiple: true,\n hasShowCondition: true\n },\n 'rowClick': {\n name: 'widget-action.row-click',\n multiple: false\n },\n 'rowDoubleClick': {\n name: 'widget-action.row-double-click',\n multiple: false\n },\n 'cellClick': {\n name: 'widget-action.cell-click',\n multiple: false\n }\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
||||||
"settingsSchema": "",
|
"settingsSchema": "",
|
||||||
"dataKeySettingsSchema": "",
|
"dataKeySettingsSchema": "",
|
||||||
"settingsDirective": "tb-entities-table-widget-settings",
|
"settingsDirective": "tb-entities-table-widget-settings",
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
"resources": [],
|
"resources": [],
|
||||||
"templateHtml": "<tb-timeseries-table-widget \n [ctx]=\"ctx\">\n</tb-timeseries-table-widget>",
|
"templateHtml": "<tb-timeseries-table-widget \n [ctx]=\"ctx\">\n</tb-timeseries-table-widget>",
|
||||||
"templateCss": "",
|
"templateCss": "",
|
||||||
"controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.timeseriesTableWidget.onDataUpdated();\n}\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.timeseriesTableWidget.onLatestDataUpdated();\n}\n\nself.typeParameters = function() {\n return {\n ignoreDataUpdateOnIntervalTick: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'temperature', label: 'Temperature', type: 'timeseries', units: '°C', decimals: 0 }];\n }\n };\n}\n\nself.actionSources = function() {\n return {\n 'actionCellButton': {\n name: 'widget-action.action-cell-button',\n multiple: true,\n hasShowCondition: true\n },\n 'rowClick': {\n name: 'widget-action.row-click',\n multiple: false\n }\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
"controllerScript": "self.onInit = function() {\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.timeseriesTableWidget.onDataUpdated();\n}\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.timeseriesTableWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.timeseriesTableWidget.onEditModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n ignoreDataUpdateOnIntervalTick: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'temperature', label: 'Temperature', type: 'timeseries', units: '°C', decimals: 0 }];\n }\n };\n}\n\nself.actionSources = function() {\n return {\n 'actionCellButton': {\n name: 'widget-action.action-cell-button',\n multiple: true,\n hasShowCondition: true\n },\n 'rowClick': {\n name: 'widget-action.row-click',\n multiple: false\n }\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
||||||
"settingsSchema": "",
|
"settingsSchema": "",
|
||||||
"dataKeySettingsSchema": "",
|
"dataKeySettingsSchema": "",
|
||||||
"latestDataKeySettingsSchema": "",
|
"latestDataKeySettingsSchema": "",
|
||||||
|
|||||||
@ -103,7 +103,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
|
|||||||
RuleChain ruleChain = service.findRuleChainById(tenantId, entityId);
|
RuleChain ruleChain = service.findRuleChainById(tenantId, entityId);
|
||||||
if (ruleChain != null && RuleChainType.CORE.equals(ruleChain.getType())) {
|
if (ruleChain != null && RuleChainType.CORE.equals(ruleChain.getType())) {
|
||||||
List<RuleNode> ruleNodeList = service.getRuleChainNodes(tenantId, entityId);
|
List<RuleNode> ruleNodeList = service.getRuleChainNodes(tenantId, entityId);
|
||||||
log.trace("[{}][{}] Starting rule chain with {} nodes", tenantId, entityId, ruleNodeList.size());
|
log.debug("[{}][{}] Starting rule chain with {} nodes", tenantId, entityId, ruleNodeList.size());
|
||||||
// Creating and starting the actors;
|
// Creating and starting the actors;
|
||||||
for (RuleNode ruleNode : ruleNodeList) {
|
for (RuleNode ruleNode : ruleNodeList) {
|
||||||
log.trace("[{}][{}] Creating rule node [{}]: {}", entityId, ruleNode.getId(), ruleNode.getName(), ruleNode);
|
log.trace("[{}][{}] Creating rule node [{}]: {}", entityId, ruleNode.getId(), ruleNode.getName(), ruleNode);
|
||||||
@ -124,7 +124,7 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh
|
|||||||
if (ruleChain != null && RuleChainType.CORE.equals(ruleChain.getType())) {
|
if (ruleChain != null && RuleChainType.CORE.equals(ruleChain.getType())) {
|
||||||
ruleChainName = ruleChain.getName();
|
ruleChainName = ruleChain.getName();
|
||||||
List<RuleNode> ruleNodeList = service.getRuleChainNodes(tenantId, entityId);
|
List<RuleNode> ruleNodeList = service.getRuleChainNodes(tenantId, entityId);
|
||||||
log.trace("[{}][{}] Updating rule chain with {} nodes", tenantId, entityId, ruleNodeList.size());
|
log.debug("[{}][{}] Updating rule chain with {} nodes", tenantId, entityId, ruleNodeList.size());
|
||||||
for (RuleNode ruleNode : ruleNodeList) {
|
for (RuleNode ruleNode : ruleNodeList) {
|
||||||
RuleNodeCtx existing = nodeActors.get(ruleNode.getId());
|
RuleNodeCtx existing = nodeActors.get(ruleNode.getId());
|
||||||
if (existing == null) {
|
if (existing == null) {
|
||||||
|
|||||||
@ -121,6 +121,7 @@ public class BaseRelationService implements RelationService {
|
|||||||
keys.add(new RelationCacheKey(null, event.getTo(), event.getType(), event.getTypeGroup(), EntitySearchDirection.TO));
|
keys.add(new RelationCacheKey(null, event.getTo(), event.getType(), event.getTypeGroup(), EntitySearchDirection.TO));
|
||||||
keys.add(new RelationCacheKey(null, event.getTo(), null, event.getTypeGroup(), EntitySearchDirection.TO));
|
keys.add(new RelationCacheKey(null, event.getTo(), null, event.getTypeGroup(), EntitySearchDirection.TO));
|
||||||
cache.evict(keys);
|
cache.evict(keys);
|
||||||
|
log.debug("Processed evict event: {}", event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -17,11 +17,13 @@ package org.thingsboard.server.dao.relation;
|
|||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.ToString;
|
||||||
import org.thingsboard.server.common.data.id.EntityId;
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
import org.thingsboard.server.common.data.relation.EntityRelation;
|
import org.thingsboard.server.common.data.relation.EntityRelation;
|
||||||
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
|
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
|
@ToString
|
||||||
public class EntityRelationEvent {
|
public class EntityRelationEvent {
|
||||||
@Getter
|
@Getter
|
||||||
private final EntityId from;
|
private final EntityId from;
|
||||||
|
|||||||
@ -197,6 +197,7 @@ public class BaseRuleChainService extends AbstractEntityService implements RuleC
|
|||||||
List<RuleNodeUpdateResult> updatedRuleNodes = new ArrayList<>();
|
List<RuleNodeUpdateResult> updatedRuleNodes = new ArrayList<>();
|
||||||
List<RuleNode> existingRuleNodes = getRuleChainNodes(tenantId, ruleChainMetaData.getRuleChainId());
|
List<RuleNode> existingRuleNodes = getRuleChainNodes(tenantId, ruleChainMetaData.getRuleChainId());
|
||||||
for (RuleNode existingNode : existingRuleNodes) {
|
for (RuleNode existingNode : existingRuleNodes) {
|
||||||
|
relationService.deleteEntityRelations(tenantId, existingNode.getId());
|
||||||
Integer index = ruleNodeIndexMap.get(existingNode.getId());
|
Integer index = ruleNodeIndexMap.get(existingNode.getId());
|
||||||
RuleNode newRuleNode = null;
|
RuleNode newRuleNode = null;
|
||||||
if (index != null) {
|
if (index != null) {
|
||||||
|
|||||||
@ -135,6 +135,11 @@ public class TenantServiceImpl extends AbstractCachedEntityService<TenantId, Ten
|
|||||||
Tenant savedTenant = tenantDao.save(tenant.getId(), tenant);
|
Tenant savedTenant = tenantDao.save(tenant.getId(), tenant);
|
||||||
TenantId tenantId = savedTenant.getId();
|
TenantId tenantId = savedTenant.getId();
|
||||||
publishEvictEvent(new TenantEvictEvent(tenantId, create));
|
publishEvictEvent(new TenantEvictEvent(tenantId, create));
|
||||||
|
|
||||||
|
if (create && defaultEntitiesCreator != null) {
|
||||||
|
defaultEntitiesCreator.accept(tenantId);
|
||||||
|
}
|
||||||
|
|
||||||
eventPublisher.publishEvent(SaveEntityEvent.builder().tenantId(tenantId)
|
eventPublisher.publishEvent(SaveEntityEvent.builder().tenantId(tenantId)
|
||||||
.entityId(tenantId).entity(savedTenant).created(create).build());
|
.entityId(tenantId).entity(savedTenant).created(create).build());
|
||||||
|
|
||||||
@ -143,10 +148,8 @@ public class TenantServiceImpl extends AbstractCachedEntityService<TenantId, Ten
|
|||||||
assetProfileService.createDefaultAssetProfile(tenantId);
|
assetProfileService.createDefaultAssetProfile(tenantId);
|
||||||
apiUsageStateService.createDefaultApiUsageState(tenantId, null);
|
apiUsageStateService.createDefaultApiUsageState(tenantId, null);
|
||||||
notificationSettingsService.createDefaultNotificationConfigs(tenantId);
|
notificationSettingsService.createDefaultNotificationConfigs(tenantId);
|
||||||
if (defaultEntitiesCreator != null) {
|
|
||||||
defaultEntitiesCreator.accept(tenantId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return savedTenant;
|
return savedTenant;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -163,6 +163,13 @@ export class EntitiesHierarchyWidgetComponent extends PageComponent implements O
|
|||||||
this.updateNodeData(this.subscription.data);
|
this.updateNodeData(this.subscription.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public onEditModeChanged() {
|
||||||
|
if (this.textSearchMode) {
|
||||||
|
this.ctx.hideTitlePanel = !this.ctx.isEdit;
|
||||||
|
this.ctx.detectChanges(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private initializeConfig() {
|
private initializeConfig() {
|
||||||
this.ctx.widgetActions = [this.searchAction];
|
this.ctx.widgetActions = [this.searchAction];
|
||||||
|
|
||||||
|
|||||||
@ -273,6 +273,13 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni
|
|||||||
this.ctx.detectChanges();
|
this.ctx.detectChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public onEditModeChanged() {
|
||||||
|
if (this.textSearchMode) {
|
||||||
|
this.ctx.hideTitlePanel = !this.ctx.isEdit;
|
||||||
|
this.ctx.detectChanges(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public pageLinkSortDirection(): SortDirection {
|
public pageLinkSortDirection(): SortDirection {
|
||||||
return entityDataPageLinkSortDirection(this.pageLink);
|
return entityDataPageLinkSortDirection(this.pageLink);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -307,6 +307,13 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI
|
|||||||
this.ctx.detectChanges();
|
this.ctx.detectChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public onEditModeChanged() {
|
||||||
|
if (this.textSearchMode) {
|
||||||
|
this.ctx.hideTitlePanel = !this.ctx.isEdit;
|
||||||
|
this.ctx.detectChanges(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private initialize() {
|
private initialize() {
|
||||||
this.ctx.widgetActions = [this.searchAction, this.columnDisplayAction];
|
this.ctx.widgetActions = [this.searchAction, this.columnDisplayAction];
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user