Browse Source
Merge branch 'master' into improvements/connectors-config
pull/10482/head
Dmytro Mushat
2 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with
33 additions and
10 deletions
-
application/src/main/data/json/system/widget_types/asset_admin_table.json
-
application/src/main/data/json/system/widget_types/device_admin_table.json
-
application/src/main/data/json/system/widget_types/entities_hierarchy.json
-
application/src/main/data/json/system/widget_types/entities_table.json
-
application/src/main/data/json/system/widget_types/timeseries_table.json
-
dao/src/main/java/org/thingsboard/server/dao/tenant/TenantServiceImpl.java
-
ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-hierarchy-widget.component.ts
-
ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-table-widget.component.ts
-
ui-ngx/src/app/modules/home/components/widget/lib/timeseries-table-widget.component.ts
|
|
|
@ -11,7 +11,7 @@ |
|
|
|
"resources": [], |
|
|
|
"templateHtml": "<tb-entities-table-widget \n [ctx]=\"ctx\">\n</tb-entities-table-widget>", |
|
|
|
"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 };\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 };\n}\n\nself.onDestroy = function() {\n}\n", |
|
|
|
"settingsSchema": "", |
|
|
|
"dataKeySettingsSchema": "", |
|
|
|
"settingsDirective": "tb-entities-table-widget-settings", |
|
|
|
|
|
|
|
@ -11,7 +11,7 @@ |
|
|
|
"resources": [], |
|
|
|
"templateHtml": "<tb-entities-table-widget \n [ctx]=\"ctx\">\n</tb-entities-table-widget>", |
|
|
|
"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 };\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 };\n}\n\nself.onDestroy = function() {\n}\n", |
|
|
|
"settingsSchema": "", |
|
|
|
"dataKeySettingsSchema": "", |
|
|
|
"settingsDirective": "tb-entities-table-widget-settings", |
|
|
|
|
|
|
|
@ -11,7 +11,7 @@ |
|
|
|
"resources": [], |
|
|
|
"templateHtml": "<tb-entities-hierarchy-widget \n [ctx]=\"ctx\">\n</tb-entities-hierarchy-widget>", |
|
|
|
"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": "", |
|
|
|
"dataKeySettingsSchema": "", |
|
|
|
"settingsDirective": "tb-entities-hierarchy-widget-settings", |
|
|
|
|
|
|
|
@ -11,7 +11,7 @@ |
|
|
|
"resources": [], |
|
|
|
"templateHtml": "<tb-entities-table-widget \n [ctx]=\"ctx\">\n</tb-entities-table-widget>", |
|
|
|
"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 };\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 };\n}\n\nself.onDestroy = function() {\n}\n", |
|
|
|
"settingsSchema": "", |
|
|
|
"dataKeySettingsSchema": "", |
|
|
|
"settingsDirective": "tb-entities-table-widget-settings", |
|
|
|
|
|
|
|
@ -11,7 +11,7 @@ |
|
|
|
"resources": [], |
|
|
|
"templateHtml": "<tb-timeseries-table-widget \n [ctx]=\"ctx\">\n</tb-timeseries-table-widget>", |
|
|
|
"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": "", |
|
|
|
"dataKeySettingsSchema": "", |
|
|
|
"latestDataKeySettingsSchema": "", |
|
|
|
|
|
|
|
@ -136,18 +136,20 @@ public class TenantServiceImpl extends AbstractCachedEntityService<TenantId, Ten |
|
|
|
TenantId tenantId = savedTenant.getId(); |
|
|
|
publishEvictEvent(new TenantEvictEvent(tenantId, create)); |
|
|
|
|
|
|
|
if (create && defaultEntitiesCreator != null) { |
|
|
|
defaultEntitiesCreator.accept(tenantId); |
|
|
|
} |
|
|
|
|
|
|
|
eventPublisher.publishEvent(SaveEntityEvent.builder().tenantId(tenantId) |
|
|
|
.entityId(tenantId).entity(savedTenant).created(create).build()); |
|
|
|
|
|
|
|
if (create) { |
|
|
|
deviceProfileService.createDefaultDeviceProfile(tenantId); |
|
|
|
assetProfileService.createDefaultAssetProfile(tenantId); |
|
|
|
apiUsageStateService.createDefaultApiUsageState(tenantId, null); |
|
|
|
notificationSettingsService.createDefaultNotificationConfigs(tenantId); |
|
|
|
if (defaultEntitiesCreator != null) { |
|
|
|
defaultEntitiesCreator.accept(tenantId); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
eventPublisher.publishEvent(SaveEntityEvent.builder().tenantId(tenantId) |
|
|
|
.entityId(tenantId).entity(savedTenant).created(create).build()); |
|
|
|
return savedTenant; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -163,6 +163,13 @@ export class EntitiesHierarchyWidgetComponent extends PageComponent implements O |
|
|
|
this.updateNodeData(this.subscription.data); |
|
|
|
} |
|
|
|
|
|
|
|
public onEditModeChanged() { |
|
|
|
if (this.textSearchMode) { |
|
|
|
this.ctx.hideTitlePanel = !this.ctx.isEdit; |
|
|
|
this.ctx.detectChanges(true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private initializeConfig() { |
|
|
|
this.ctx.widgetActions = [this.searchAction]; |
|
|
|
|
|
|
|
|
|
|
|
@ -266,6 +266,13 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni |
|
|
|
this.ctx.detectChanges(); |
|
|
|
} |
|
|
|
|
|
|
|
public onEditModeChanged() { |
|
|
|
if (this.textSearchMode) { |
|
|
|
this.ctx.hideTitlePanel = !this.ctx.isEdit; |
|
|
|
this.ctx.detectChanges(true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public pageLinkSortDirection(): SortDirection { |
|
|
|
return entityDataPageLinkSortDirection(this.pageLink); |
|
|
|
} |
|
|
|
|
|
|
|
@ -307,6 +307,13 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI |
|
|
|
this.ctx.detectChanges(); |
|
|
|
} |
|
|
|
|
|
|
|
public onEditModeChanged() { |
|
|
|
if (this.textSearchMode) { |
|
|
|
this.ctx.hideTitlePanel = !this.ctx.isEdit; |
|
|
|
this.ctx.detectChanges(true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private initialize() { |
|
|
|
this.ctx.widgetActions = [this.searchAction, this.columnDisplayAction]; |
|
|
|
|
|
|
|
|