Browse Source

TB-63: Improve alarms widget. Introduce auto-fill height setting for dashboard layout.

pull/171/head
Igor Kulikov 9 years ago
parent
commit
69a0b74c6b
  1. 10
      ui/src/app/asset/assets.tpl.html
  2. 1
      ui/src/app/common/types.constant.js
  3. 17
      ui/src/app/common/utils.service.js
  4. 89
      ui/src/app/components/dashboard.directive.js
  5. 5
      ui/src/app/components/dashboard.tpl.html
  6. 8
      ui/src/app/components/grid.directive.js
  7. 5
      ui/src/app/components/widget.controller.js
  8. 10
      ui/src/app/customer/customers.tpl.html
  9. 1
      ui/src/app/dashboard/dashboard-settings.controller.js
  10. 3
      ui/src/app/dashboard/dashboard-settings.tpl.html
  11. 1
      ui/src/app/dashboard/layouts/dashboard-layout.tpl.html
  12. 6
      ui/src/app/dashboard/states/dashboard-state-dialog.controller.js
  13. 7
      ui/src/app/dashboard/states/dashboard-state-dialog.tpl.html
  14. 4
      ui/src/app/dashboard/states/default-state-controller.js
  15. 19
      ui/src/app/dashboard/states/entity-state-controller.js
  16. 10
      ui/src/app/device/devices.tpl.html
  17. 6
      ui/src/app/locale/locale.constant.js
  18. 3
      ui/src/app/locale/translate-handler.js
  19. 10
      ui/src/app/plugin/plugins.tpl.html
  20. 10
      ui/src/app/rule/rules.tpl.html
  21. 10
      ui/src/app/tenant/tenants.tpl.html
  22. 6
      ui/src/app/widget/lib/alarms-table-widget.js
  23. 8
      ui/src/scss/main.scss

10
ui/src/app/asset/assets.tpl.html

@ -31,7 +31,7 @@
on-unassign-from-customer="vm.unassignFromCustomer(event, vm.grid.detailsConfig.currentItem, isPublic)" on-unassign-from-customer="vm.unassignFromCustomer(event, vm.grid.detailsConfig.currentItem, isPublic)"
on-delete-asset="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-asset> on-delete-asset="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-asset>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'attribute.attributes' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.attributes' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.asset}}" entity-type="{{vm.types.entityType.asset}}"
@ -39,7 +39,7 @@
default-attribute-scope="{{vm.types.attributesScope.server.value}}"> default-attribute-scope="{{vm.types.attributesScope.server.value}}">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'attribute.latest-telemetry' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.latest-telemetry' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.asset}}" entity-type="{{vm.types.entityType.asset}}"
@ -48,19 +48,19 @@
disable-attribute-scope-selection="true"> disable-attribute-scope-selection="true">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'alarm.alarms' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'alarm.alarms' | translate }}">
<tb-alarm-table flex entity-type="vm.types.entityType.asset" <tb-alarm-table flex entity-type="vm.types.entityType.asset"
entity-id="vm.grid.operatingItem().id.id"> entity-id="vm.grid.operatingItem().id.id">
</tb-alarm-table> </tb-alarm-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'asset.events' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'asset.events' | translate }}">
<tb-event-table flex entity-type="vm.types.entityType.asset" <tb-event-table flex entity-type="vm.types.entityType.asset"
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
tenant-id="vm.grid.operatingItem().tenantId.id" tenant-id="vm.grid.operatingItem().tenantId.id"
default-event-type="{{vm.types.eventType.error.value}}"> default-event-type="{{vm.types.eventType.error.value}}">
</tb-event-table> </tb-event-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'relation.relations' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'relation.relations' | translate }}">
<tb-relation-table flex <tb-relation-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.asset}}"> entity-type="{{vm.types.entityType.asset}}">

1
ui/src/app/common/types.constant.js

@ -394,7 +394,6 @@ export default angular.module('thingsboard.types', [])
cards: "cards" cards: "cards"
}, },
translate: { translate: {
dashboardStatePrefix: "dashboardState.state.",
customTranslationsPrefix: "custom." customTranslationsPrefix: "custom."
} }
} }

17
ui/src/app/common/utils.service.js

@ -135,7 +135,8 @@ function Utils($mdColorPalette, $rootScope, $window, $translate, types) {
isLocalUrl: isLocalUrl, isLocalUrl: isLocalUrl,
validateDatasources: validateDatasources, validateDatasources: validateDatasources,
createKey: createKey, createKey: createKey,
createLabelFromDatasource: createLabelFromDatasource createLabelFromDatasource: createLabelFromDatasource,
insertVariable: insertVariable
} }
return service; return service;
@ -407,4 +408,18 @@ function Utils($mdColorPalette, $rootScope, $window, $translate, types) {
return label; return label;
} }
function insertVariable(pattern, name, value) {
var result = angular.copy(pattern);
var match = varsRegex.exec(pattern);
while (match !== null) {
var variable = match[0];
var variableName = match[1];
if (variableName === name) {
result = result.split(variable).join(value);
}
match = varsRegex.exec(pattern);
}
return result;
}
} }

89
ui/src/app/components/dashboard.directive.js

@ -58,6 +58,7 @@ function Dashboard() {
columns: '=', columns: '=',
margins: '=', margins: '=',
isEdit: '=', isEdit: '=',
autofillHeight: '=',
isMobile: '=', isMobile: '=',
isMobileDisabled: '=?', isMobileDisabled: '=?',
isEditActionEnabled: '=', isEditActionEnabled: '=',
@ -102,6 +103,8 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
vm.isMobileDisabled = angular.isDefined(vm.isMobileDisabled) ? vm.isMobileDisabled : false; vm.isMobileDisabled = angular.isDefined(vm.isMobileDisabled) ? vm.isMobileDisabled : false;
vm.isMobileSize = false;
if (!('dashboardTimewindow' in vm)) { if (!('dashboardTimewindow' in vm)) {
vm.dashboardTimewindow = timeService.defaultTimewindow(); vm.dashboardTimewindow = timeService.defaultTimewindow();
} }
@ -178,6 +181,7 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
vm.widgetPadding = widgetPadding; vm.widgetPadding = widgetPadding;
vm.showWidgetTitle = showWidgetTitle; vm.showWidgetTitle = showWidgetTitle;
vm.showWidgetTitlePanel = showWidgetTitlePanel; vm.showWidgetTitlePanel = showWidgetTitlePanel;
vm.showWidgetActions = showWidgetActions;
vm.widgetTitleStyle = widgetTitleStyle; vm.widgetTitleStyle = widgetTitleStyle;
vm.widgetTitle = widgetTitle; vm.widgetTitle = widgetTitle;
vm.widgetActions = widgetActions; vm.widgetActions = widgetActions;
@ -271,12 +275,15 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
function updateMobileOpts() { function updateMobileOpts() {
var isMobileDisabled = vm.isMobileDisabled === true; var isMobileDisabled = vm.isMobileDisabled === true;
var isMobile = vm.isMobile === true && !isMobileDisabled; var isMobile = vm.isMobile === true && !isMobileDisabled || vm.autofillHeight;
var mobileBreakPoint = isMobileDisabled ? 0 : (isMobile ? 20000 : 960); var mobileBreakPoint = isMobileDisabled ? 0 : (isMobile ? 20000 : 960);
if (!isMobile && !isMobileDisabled) { if (!isMobile && !isMobileDisabled) {
isMobile = !$mdMedia('gt-sm'); isMobile = !$mdMedia('gt-sm');
} }
var rowHeight = isMobile ? 70 : 'match';
var rowHeight = detectRowSize(isMobile);
if (vm.gridsterOpts.isMobile != isMobile) { if (vm.gridsterOpts.isMobile != isMobile) {
vm.gridsterOpts.isMobile = isMobile; vm.gridsterOpts.isMobile = isMobile;
vm.gridsterOpts.mobileModeEnabled = isMobile; vm.gridsterOpts.mobileModeEnabled = isMobile;
@ -287,6 +294,17 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
if (vm.gridsterOpts.rowHeight != rowHeight) { if (vm.gridsterOpts.rowHeight != rowHeight) {
vm.gridsterOpts.rowHeight = rowHeight; vm.gridsterOpts.rowHeight = rowHeight;
} }
vm.isMobileSize = checkIsMobileSize();
}
function checkIsMobileSize() {
var isMobileDisabled = vm.isMobileDisabled === true;
var isMobileSize = vm.isMobile === true && !isMobileDisabled;
if (!isMobileSize && !isMobileDisabled) {
isMobileSize = !$mdMedia('gt-sm');
}
return isMobileSize;
} }
$scope.$watch(function() { return $mdMedia('gt-sm'); }, function() { $scope.$watch(function() { return $mdMedia('gt-sm'); }, function() {
@ -297,6 +315,34 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
updateMobileOpts(); updateMobileOpts();
}); });
$scope.$watch('vm.autofillHeight', function () {
if (vm.autofillHeight) {
//if (gridsterParent.height()) {
// updateMobileOpts();
//} else {
if ($scope.parentHeighWatcher) {
$scope.parentHeighWatcher();
}
if (gridsterParent.height()) {
updateMobileOpts();
}
$scope.parentHeighWatcher = $scope.$watch(function() { return gridsterParent.height(); },
function(newHeight) {
if (newHeight) {
updateMobileOpts();
}
}
);
} else {
if ($scope.parentHeighWatcher) {
$scope.parentHeighWatcher();
$scope.parentHeighWatcher = null;
}
updateMobileOpts();
}
});
$scope.$watch('vm.isMobileDisabled', function () { $scope.$watch('vm.isMobileDisabled', function () {
updateMobileOpts(); updateMobileOpts();
}); });
@ -333,6 +379,12 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
$scope.$broadcast('toggleDashboardEditMode', vm.isEdit); $scope.$broadcast('toggleDashboardEditMode', vm.isEdit);
}); });
$scope.$watch('vm.isMobileSize', function (newVal, prevVal) {
if (!angular.equals(newVal, prevVal)) {
$scope.$broadcast('mobileModeChanged', vm.isMobileSize);
}
});
$scope.$on('gridster-resized', function (event, sizes, theGridster) { $scope.$on('gridster-resized', function (event, sizes, theGridster) {
if (checkIsLocalGridsterElement(theGridster)) { if (checkIsLocalGridsterElement(theGridster)) {
vm.gridster = theGridster; vm.gridster = theGridster;
@ -345,13 +397,12 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
$scope.$on('gridster-mobile-changed', function (event, theGridster) { $scope.$on('gridster-mobile-changed', function (event, theGridster) {
if (checkIsLocalGridsterElement(theGridster)) { if (checkIsLocalGridsterElement(theGridster)) {
vm.gridster = theGridster; vm.gridster = theGridster;
var rowHeight = vm.gridster.isMobile ? 70 : 'match'; var rowHeight = detectRowSize(vm.gridster.isMobile);
if (vm.gridsterOpts.rowHeight != rowHeight) { if (vm.gridsterOpts.rowHeight != rowHeight) {
vm.gridsterOpts.rowHeight = rowHeight; vm.gridsterOpts.rowHeight = rowHeight;
updateGridsterParams(); updateGridsterParams();
} }
vm.isMobileSize = checkIsMobileSize();
$scope.$broadcast('mobileModeChanged', vm.gridster.isMobile);
//TODO: widgets visibility //TODO: widgets visibility
/*$timeout(function () { /*$timeout(function () {
@ -360,6 +411,21 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
} }
}); });
function detectRowSize(isMobile) {
var rowHeight = isMobile ? 70 : 'match';
if (vm.autofillHeight) {
var viewportHeight = gridsterParent.height();
var totalRows = 0;
for (var i = 0; i < vm.widgets.length; i++) {
var w = vm.widgets[i];
var sizeY = widgetSizeY(w);
totalRows += sizeY;
}
rowHeight = (viewportHeight - (vm.gridsterOpts.margins[1])) / totalRows;
}
return rowHeight;
}
function widgetOrder(widget) { function widgetOrder(widget) {
var order; var order;
if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) { if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
@ -650,7 +716,7 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
} }
function widgetSizeY(widget) { function widgetSizeY(widget) {
if (vm.gridsterOpts.isMobile) { if (vm.gridsterOpts.isMobile && !vm.autofillHeight) {
var mobileHeight; var mobileHeight;
if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) { if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
mobileHeight = vm.widgetLayouts[widget.id].mobileHeight; mobileHeight = vm.widgetLayouts[widget.id].mobileHeight;
@ -673,7 +739,7 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
} }
function setWidgetSizeY(widget, sizeY) { function setWidgetSizeY(widget, sizeY) {
if (!vm.gridsterOpts.isMobile) { if (!vm.gridsterOpts.isMobile && !vm.autofillHeight) {
if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) { if (vm.widgetLayouts && vm.widgetLayouts[widget.id]) {
vm.widgetLayouts[widget.id].sizeY = sizeY; vm.widgetLayouts[widget.id].sizeY = sizeY;
} else { } else {
@ -759,6 +825,15 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
} }
} }
function showWidgetActions(widget) {
var ctx = widgetContext(widget);
if (ctx && ctx.hideTitlePanel) {
return false;
} else {
return true;
}
}
function widgetTitleStyle(widget) { function widgetTitleStyle(widget) {
if (angular.isDefined(widget.config.titleStyle)) { if (angular.isDefined(widget.config.titleStyle)) {
return widget.config.titleStyle; return widget.config.titleStyle;

5
ui/src/app/components/dashboard.tpl.html

@ -23,7 +23,7 @@
</md-content> </md-content>
<md-menu md-position-mode="target target" tb-mousepoint-menu> <md-menu md-position-mode="target target" tb-mousepoint-menu>
<md-content id="gridster-parent" class="tb-dashboard-content" flex layout-wrap ng-click="" tb-contextmenu="vm.openDashboardContextMenu($event, $mdOpenMousepointMenu)"> <md-content id="gridster-parent" class="tb-dashboard-content" flex layout-wrap ng-click="" tb-contextmenu="vm.openDashboardContextMenu($event, $mdOpenMousepointMenu)">
<div ng-class="vm.dashboardClass" id="gridster-background" style="height: auto; min-height: 100%;"> <div ng-class="vm.dashboardClass" id="gridster-background" style="height: auto; min-height: 100%; display: inline;">
<div id="gridster-child" gridster="vm.gridsterOpts"> <div id="gridster-child" gridster="vm.gridsterOpts">
<ul> <ul>
<li gridster-item="vm.widgetItemMap" class="tb-noselect" ng-repeat="widget in vm.widgets"> <li gridster-item="vm.widgetItemMap" class="tb-noselect" ng-repeat="widget in vm.widgets">
@ -50,7 +50,7 @@
<span ng-show="vm.showWidgetTitle(widget)" ng-style="vm.widgetTitleStyle(widget)" class="md-subhead">{{vm.widgetTitle(widget)}}</span> <span ng-show="vm.showWidgetTitle(widget)" ng-style="vm.widgetTitleStyle(widget)" class="md-subhead">{{vm.widgetTitle(widget)}}</span>
<tb-timewindow aggregation="{{vm.hasAggregation(widget)}}" ng-if="vm.hasTimewindow(widget)" ng-model="widget.config.timewindow"></tb-timewindow> <tb-timewindow aggregation="{{vm.hasAggregation(widget)}}" ng-if="vm.hasTimewindow(widget)" ng-model="widget.config.timewindow"></tb-timewindow>
</div> </div>
<div class="tb-widget-actions" layout="row" layout-align="start center" ng-show="vm.showWidgetTitlePanel(widget)" tb-mousedown="$event.stopPropagation()"> <div class="tb-widget-actions" layout="row" layout-align="start center" ng-show="vm.showWidgetActions(widget)" tb-mousedown="$event.stopPropagation()">
<md-button ng-repeat="action in vm.widgetActions(widget)" <md-button ng-repeat="action in vm.widgetActions(widget)"
aria-label="{{ action.name | translate }}" aria-label="{{ action.name | translate }}"
ng-show="!vm.isEdit && action.show" ng-show="!vm.isEdit && action.show"
@ -103,6 +103,7 @@
aliasController: vm.aliasController, aliasController: vm.aliasController,
stateController: vm.stateController, stateController: vm.stateController,
isEdit: vm.isEdit, isEdit: vm.isEdit,
isMobile: vm.isMobileSize,
stDiff: vm.stDiff, stDiff: vm.stDiff,
dashboardTimewindow: vm.dashboardTimewindow, dashboardTimewindow: vm.dashboardTimewindow,
dashboardTimewindowApi: vm.dashboardTimewindowApi }"> dashboardTimewindowApi: vm.dashboardTimewindowApi }">

8
ui/src/app/components/grid.directive.js

@ -124,7 +124,7 @@ function Grid() {
} }
/*@ngInject*/ /*@ngInject*/
function GridController($scope, $state, $mdDialog, $document, $q, $timeout, $translate, $mdMedia, $templateCache) { function GridController($scope, $state, $mdDialog, $document, $q, $timeout, $translate, $mdMedia, $templateCache, $window) {
var vm = this; var vm = this;
@ -155,6 +155,7 @@ function GridController($scope, $state, $mdDialog, $document, $q, $timeout, $tra
vm.refreshList = refreshList; vm.refreshList = refreshList;
vm.saveItem = saveItem; vm.saveItem = saveItem;
vm.toggleItemSelection = toggleItemSelection; vm.toggleItemSelection = toggleItemSelection;
vm.triggerResize = triggerResize;
$scope.$watch(function () { $scope.$watch(function () {
return $mdMedia('xs') || $mdMedia('sm'); return $mdMedia('xs') || $mdMedia('sm');
@ -600,6 +601,11 @@ function GridController($scope, $state, $mdDialog, $document, $q, $timeout, $tra
} }
} }
function triggerResize() {
var w = angular.element($window);
w.triggerHandler('resize');
}
function moveToTop() { function moveToTop() {
moveToIndex(0, true); moveToIndex(0, true);
} }

5
ui/src/app/components/widget.controller.js

@ -21,7 +21,7 @@ import Subscription from '../api/subscription';
/*@ngInject*/ /*@ngInject*/
export default function WidgetController($scope, $timeout, $window, $element, $q, $log, $injector, $filter, $compile, tbRaf, types, utils, timeService, export default function WidgetController($scope, $timeout, $window, $element, $q, $log, $injector, $filter, $compile, tbRaf, types, utils, timeService,
datasourceService, alarmService, entityService, deviceService, visibleRect, isEdit, stDiff, dashboardTimewindow, datasourceService, alarmService, entityService, deviceService, visibleRect, isEdit, isMobile, stDiff, dashboardTimewindow,
dashboardTimewindowApi, widget, aliasController, stateController, widgetInfo, widgetType) { dashboardTimewindowApi, widget, aliasController, stateController, widgetInfo, widgetType) {
var vm = this; var vm = this;
@ -50,7 +50,7 @@ export default function WidgetController($scope, $timeout, $window, $element, $q
height: 0, height: 0,
hideTitlePanel: false, hideTitlePanel: false,
isEdit: isEdit, isEdit: isEdit,
isMobile: false, isMobile: isMobile,
widgetConfig: widget.config, widgetConfig: widget.config,
settings: widget.config.settings, settings: widget.config.settings,
units: widget.config.units || '', units: widget.config.units || '',
@ -618,7 +618,6 @@ export default function WidgetController($scope, $timeout, $window, $element, $q
function gridsterItemInitialized(item) { function gridsterItemInitialized(item) {
if (item && item.gridster) { if (item && item.gridster) {
widgetContext.isMobile = item.gridster.isMobile;
gridsterItemInited = true; gridsterItemInited = true;
onInit(); onInit();
// gridsterItemElement = $(item.$element); // gridsterItemElement = $(item.$element);

10
ui/src/app/customer/customers.tpl.html

@ -31,7 +31,7 @@
on-manage-dashboards="vm.openCustomerDashboards(event, vm.grid.detailsConfig.currentItem)" on-manage-dashboards="vm.openCustomerDashboards(event, vm.grid.detailsConfig.currentItem)"
on-delete-customer="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-customer> on-delete-customer="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-customer>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'attribute.attributes' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.attributes' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.customer}}" entity-type="{{vm.types.entityType.customer}}"
@ -39,7 +39,7 @@
default-attribute-scope="{{vm.types.attributesScope.server.value}}"> default-attribute-scope="{{vm.types.attributesScope.server.value}}">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'attribute.latest-telemetry' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.latest-telemetry' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.customer}}" entity-type="{{vm.types.entityType.customer}}"
@ -48,19 +48,19 @@
disable-attribute-scope-selection="true"> disable-attribute-scope-selection="true">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'alarm.alarms' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'alarm.alarms' | translate }}">
<tb-alarm-table flex entity-type="vm.types.entityType.customer" <tb-alarm-table flex entity-type="vm.types.entityType.customer"
entity-id="vm.grid.operatingItem().id.id"> entity-id="vm.grid.operatingItem().id.id">
</tb-alarm-table> </tb-alarm-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'customer.events' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'customer.events' | translate }}">
<tb-event-table flex entity-type="vm.types.entityType.customer" <tb-event-table flex entity-type="vm.types.entityType.customer"
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
tenant-id="vm.grid.operatingItem().tenantId.id" tenant-id="vm.grid.operatingItem().tenantId.id"
default-event-type="{{vm.types.eventType.error.value}}"> default-event-type="{{vm.types.eventType.error.value}}">
</tb-event-table> </tb-event-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'relation.relations' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'relation.relations' | translate }}">
<tb-relation-table flex <tb-relation-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.customer}}"> entity-type="{{vm.types.entityType.customer}}">

1
ui/src/app/dashboard/dashboard-settings.controller.js

@ -68,6 +68,7 @@ export default function DashboardSettingsController($scope, $mdDialog, statesCon
vm.gridSettings.color = vm.gridSettings.color || 'rgba(0,0,0,0.870588)'; vm.gridSettings.color = vm.gridSettings.color || 'rgba(0,0,0,0.870588)';
vm.gridSettings.columns = vm.gridSettings.columns || 24; vm.gridSettings.columns = vm.gridSettings.columns || 24;
vm.gridSettings.margins = vm.gridSettings.margins || [10, 10]; vm.gridSettings.margins = vm.gridSettings.margins || [10, 10];
vm.gridSettings.autoFillHeight = angular.isDefined(vm.gridSettings.autoFillHeight) ? vm.gridSettings.autoFillHeight : false;
vm.hMargin = vm.gridSettings.margins[0]; vm.hMargin = vm.gridSettings.margins[0];
vm.vMargin = vm.gridSettings.margins[1]; vm.vMargin = vm.gridSettings.margins[1];
vm.gridSettings.backgroundSizeMode = vm.gridSettings.backgroundSizeMode || '100%'; vm.gridSettings.backgroundSizeMode = vm.gridSettings.backgroundSizeMode || '100%';

3
ui/src/app/dashboard/dashboard-settings.tpl.html

@ -121,6 +121,9 @@
</div> </div>
</md-input-container> </md-input-container>
</div> </div>
<md-checkbox flex aria-label="{{ 'dashboard.autofill-height' | translate }}"
ng-model="vm.gridSettings.autoFillHeight">{{ 'dashboard.autofill-height' | translate }}
</md-checkbox>
<div flex <div flex
ng-required="false" ng-required="false"
md-color-picker md-color-picker

1
ui/src/app/dashboard/layouts/dashboard-layout.tpl.html

@ -49,6 +49,7 @@
state-controller="vm.dashboardCtx.stateController" state-controller="vm.dashboardCtx.stateController"
dashboard-timewindow="vm.dashboardCtx.dashboardTimewindow" dashboard-timewindow="vm.dashboardCtx.dashboardTimewindow"
is-edit="vm.isEdit" is-edit="vm.isEdit"
autofill-height="vm.layoutCtx.gridSettings.autoFillHeight && !vm.isEdit"
is-mobile="vm.isMobile" is-mobile="vm.isMobile"
is-mobile-disabled="vm.widgetEditMode" is-mobile-disabled="vm.widgetEditMode"
is-edit-action-enabled="vm.isEdit" is-edit-action-enabled="vm.isEdit"

6
ui/src/app/dashboard/states/dashboard-state-dialog.controller.js

@ -53,12 +53,6 @@ export default function DashboardStateDialogController($scope, $mdDialog, $filte
if (!vm.stateIdTouched && vm.isAdd) { if (!vm.stateIdTouched && vm.isAdd) {
vm.state.id = vm.state.name.toLowerCase().replace(/\W/g,"_"); vm.state.id = vm.state.name.toLowerCase().replace(/\W/g,"_");
} }
var result = $filter('filter')(vm.allStates, {name: vm.state.name}, true);
if (result && result.length && result[0].id !== vm.prevStateId) {
$scope.theForm.name.$setValidity('stateExists', false);
} else {
$scope.theForm.name.$setValidity('stateExists', true);
}
} }
function checkStateId() { function checkStateId() {

7
ui/src/app/dashboard/states/dashboard-state-dialog.tpl.html

@ -37,18 +37,15 @@
<input name="name" required ng-model="vm.state.name"> <input name="name" required ng-model="vm.state.name">
<div ng-messages="theForm.name.$error"> <div ng-messages="theForm.name.$error">
<div ng-message="required" translate>dashboard.state-name-required</div> <div ng-message="required" translate>dashboard.state-name-required</div>
<div ng-message="stateExists" translate>dashboard.state-name-exists</div>
</div> </div>
</md-input-container> </md-input-container>
<md-input-container class="md-block"> <md-input-container class="md-block">
<label translate>dashboard.state-id</label> <label translate>dashboard.state-id</label>
<input name="stateId" ng-model="vm.state.id" <input name="stateId" required ng-model="vm.state.id"
ng-change="vm.stateIdTouched = true" ng-change="vm.stateIdTouched = true">
ng-pattern="/^[a-zA-Z0-9_]*$/">
<div ng-messages="theForm.stateId.$error"> <div ng-messages="theForm.stateId.$error">
<div ng-message="required" translate>dashboard.state-id-required</div> <div ng-message="required" translate>dashboard.state-id-required</div>
<div ng-message="stateExists" translate>dashboard.state-id-exists</div> <div ng-message="stateExists" translate>dashboard.state-id-exists</div>
<div ng-message="pattern" translate>dashboard.invalid-state-id-format</div>
</div> </div>
</md-input-container> </md-input-container>
<md-checkbox flex aria-label="{{ 'dashboard.is-root-state' | translate }}" <md-checkbox flex aria-label="{{ 'dashboard.is-root-state' | translate }}"

4
ui/src/app/dashboard/states/default-state-controller.js

@ -97,10 +97,10 @@ export default function DefaultStateController($scope, $location, $state, $state
function getStateName(id, state) { function getStateName(id, state) {
var result = ''; var result = '';
var translationId = types.translate.dashboardStatePrefix + id; var translationId = types.translate.customTranslationsPrefix + state.name;
var translation = $translate.instant(translationId); var translation = $translate.instant(translationId);
if (translation != translationId) { if (translation != translationId) {
result = translation; result = translation + '';
} else { } else {
result = state.name; result = state.name;
} }

19
ui/src/app/dashboard/states/entity-state-controller.js

@ -17,7 +17,7 @@
import './entity-state-controller.scss'; import './entity-state-controller.scss';
/*@ngInject*/ /*@ngInject*/
export default function EntityStateController($scope, $location, $state, $stateParams, $q, $translate, types, dashboardUtils, entityService) { export default function EntityStateController($scope, $location, $state, $stateParams, $q, $translate, utils, types, dashboardUtils, entityService) {
var vm = this; var vm = this;
@ -106,18 +106,17 @@ export default function EntityStateController($scope, $location, $state, $stateP
function getStateName(index) { function getStateName(index) {
var result = ''; var result = '';
if (vm.stateObject[index]) { if (vm.stateObject[index]) {
var stateName = vm.states[vm.stateObject[index].id].name;
var translationId = types.translate.customTranslationsPrefix + stateName;
var translation = $translate.instant(translationId);
if (translation != translationId) {
stateName = translation + '';
}
var params = vm.stateObject[index].params; var params = vm.stateObject[index].params;
if (params && params.entityName) { if (params && params.entityName) {
result = params.entityName; result = utils.insertVariable(stateName, 'entityName', params.entityName);
} else { } else {
var id = vm.stateObject[index].id; result = stateName;
var translationId = types.translate.dashboardStatePrefix + id;
var translation = $translate.instant(translationId);
if (translation != translationId) {
result = translation;
} else {
result = vm.states[vm.stateObject[index].id].name;
}
} }
} }
return result; return result;

10
ui/src/app/device/devices.tpl.html

@ -32,7 +32,7 @@
on-manage-credentials="vm.manageCredentials(event, vm.grid.detailsConfig.currentItem)" on-manage-credentials="vm.manageCredentials(event, vm.grid.detailsConfig.currentItem)"
on-delete-device="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-device> on-delete-device="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-device>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'attribute.attributes' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.attributes' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.device}}" entity-type="{{vm.types.entityType.device}}"
@ -40,7 +40,7 @@
default-attribute-scope="{{vm.types.attributesScope.client.value}}"> default-attribute-scope="{{vm.types.attributesScope.client.value}}">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'attribute.latest-telemetry' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.latest-telemetry' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.device}}" entity-type="{{vm.types.entityType.device}}"
@ -49,19 +49,19 @@
disable-attribute-scope-selection="true"> disable-attribute-scope-selection="true">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'alarm.alarms' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'alarm.alarms' | translate }}">
<tb-alarm-table flex entity-type="vm.types.entityType.device" <tb-alarm-table flex entity-type="vm.types.entityType.device"
entity-id="vm.grid.operatingItem().id.id"> entity-id="vm.grid.operatingItem().id.id">
</tb-alarm-table> </tb-alarm-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'device.events' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'device.events' | translate }}">
<tb-event-table flex entity-type="vm.types.entityType.device" <tb-event-table flex entity-type="vm.types.entityType.device"
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
tenant-id="vm.grid.operatingItem().tenantId.id" tenant-id="vm.grid.operatingItem().tenantId.id"
default-event-type="{{vm.types.eventType.error.value}}"> default-event-type="{{vm.types.eventType.error.value}}">
</tb-event-table> </tb-event-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'relation.relations' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'relation.relations' | translate }}">
<tb-relation-table flex <tb-relation-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.device}}"> entity-type="{{vm.types.entityType.device}}">

6
ui/src/app/locale/locale.constant.js

@ -431,6 +431,7 @@ export default angular.module('thingsboard.locale', [])
"vertical-margin-required": "Vertical margin value is required.", "vertical-margin-required": "Vertical margin value is required.",
"min-vertical-margin-message": "Only 0 is allowed as minimum vertical margin value.", "min-vertical-margin-message": "Only 0 is allowed as minimum vertical margin value.",
"max-vertical-margin-message": "Only 50 is allowed as maximum vertical margin value.", "max-vertical-margin-message": "Only 50 is allowed as maximum vertical margin value.",
"autofill-height": "Auto fill layout height",
"display-title": "Display dashboard title", "display-title": "Display dashboard title",
"toolbar-always-open": "Keep toolbar opened", "toolbar-always-open": "Keep toolbar opened",
"title-color": "Title color", "title-color": "Title color",
@ -472,11 +473,9 @@ export default angular.module('thingsboard.locale', [])
"state": "Dashboard state", "state": "Dashboard state",
"state-name": "Name", "state-name": "Name",
"state-name-required": "Dashboard state name is required.", "state-name-required": "Dashboard state name is required.",
"state-name-exists": "Dashboard state with the same name is already exists.",
"state-id": "State Id", "state-id": "State Id",
"state-id-required": "Dashboard state id is required.", "state-id-required": "Dashboard state id is required.",
"state-id-exists": "Dashboard state with the same id is already exists.", "state-id-exists": "Dashboard state with the same id is already exists.",
"invalid-state-id-format": "Only alphanumeric characters and underscore are allowed.",
"is-root-state": "Root state", "is-root-state": "Root state",
"delete-state-title": "Delete dashboard state", "delete-state-title": "Delete dashboard state",
"delete-state-text": "Are you sure you want delete dashboard state with name '{{stateName}}'?", "delete-state-text": "Are you sure you want delete dashboard state with name '{{stateName}}'?",
@ -1169,9 +1168,6 @@ export default angular.module('thingsboard.locale', [])
"es_ES": "Spanish" "es_ES": "Spanish"
}, },
"custom": { "custom": {
"alarms": {
"title": "Super ${entityName}"
}
} }
} }
} }

3
ui/src/app/locale/translate-handler.js

@ -18,8 +18,7 @@
export default function ThingsboardMissingTranslateHandler($log, types) { export default function ThingsboardMissingTranslateHandler($log, types) {
return function (translationId) { return function (translationId) {
if (translationId && !translationId.startsWith(types.translate.dashboardStatePrefix) && if (translationId && !translationId.startsWith(types.translate.customTranslationsPrefix)) {
!translationId.startsWith(types.translate.customTranslationsPrefix)) {
$log.warn('Translation for ' + translationId + ' doesn\'t exist'); $log.warn('Translation for ' + translationId + ' doesn\'t exist');
} }
}; };

10
ui/src/app/plugin/plugins.tpl.html

@ -31,7 +31,7 @@
on-export-plugin="vm.exportPlugin(event, vm.grid.detailsConfig.currentItem)" on-export-plugin="vm.exportPlugin(event, vm.grid.detailsConfig.currentItem)"
on-delete-plugin="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-plugin> on-delete-plugin="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-plugin>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isPluginEditable(vm.grid.operatingItem())" label="{{ 'attribute.attributes' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isPluginEditable(vm.grid.operatingItem())" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.attributes' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.plugin}}" entity-type="{{vm.types.entityType.plugin}}"
@ -39,7 +39,7 @@
default-attribute-scope="{{vm.types.attributesScope.server.value}}"> default-attribute-scope="{{vm.types.attributesScope.server.value}}">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isPluginEditable(vm.grid.operatingItem())" label="{{ 'attribute.latest-telemetry' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isPluginEditable(vm.grid.operatingItem())" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.latest-telemetry' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.plugin}}" entity-type="{{vm.types.entityType.plugin}}"
@ -48,19 +48,19 @@
disable-attribute-scope-selection="true"> disable-attribute-scope-selection="true">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isPluginEditable(vm.grid.operatingItem())" label="{{ 'alarm.alarms' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isPluginEditable(vm.grid.operatingItem())" md-on-select="vm.grid.triggerResize()" label="{{ 'alarm.alarms' | translate }}">
<tb-alarm-table flex entity-type="vm.types.entityType.plugin" <tb-alarm-table flex entity-type="vm.types.entityType.plugin"
entity-id="vm.grid.operatingItem().id.id"> entity-id="vm.grid.operatingItem().id.id">
</tb-alarm-table> </tb-alarm-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isPluginEditable(vm.grid.operatingItem())" label="{{ 'plugin.events' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isPluginEditable(vm.grid.operatingItem())" md-on-select="vm.grid.triggerResize()" label="{{ 'plugin.events' | translate }}">
<tb-event-table flex entity-type="vm.types.entityType.plugin" <tb-event-table flex entity-type="vm.types.entityType.plugin"
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
tenant-id="vm.grid.operatingItem().tenantId.id" tenant-id="vm.grid.operatingItem().tenantId.id"
default-event-type="{{vm.types.eventType.lcEvent.value}}"> default-event-type="{{vm.types.eventType.lcEvent.value}}">
</tb-event-table> </tb-event-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isPluginEditable(vm.grid.operatingItem())" label="{{ 'relation.relations' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isPluginEditable(vm.grid.operatingItem())" md-on-select="vm.grid.triggerResize()" label="{{ 'relation.relations' | translate }}">
<tb-relation-table flex <tb-relation-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.plugin}}"> entity-type="{{vm.types.entityType.plugin}}">

10
ui/src/app/rule/rules.tpl.html

@ -31,7 +31,7 @@
on-export-rule="vm.exportRule(event, vm.grid.detailsConfig.currentItem)" on-export-rule="vm.exportRule(event, vm.grid.detailsConfig.currentItem)"
on-delete-rule="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-rule> on-delete-rule="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-rule>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isRuleEditable(vm.grid.operatingItem())" label="{{ 'attribute.attributes' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isRuleEditable(vm.grid.operatingItem())" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.attributes' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.rule}}" entity-type="{{vm.types.entityType.rule}}"
@ -39,7 +39,7 @@
default-attribute-scope="{{vm.types.attributesScope.server.value}}"> default-attribute-scope="{{vm.types.attributesScope.server.value}}">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isRuleEditable(vm.grid.operatingItem())" label="{{ 'attribute.latest-telemetry' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isRuleEditable(vm.grid.operatingItem())" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.latest-telemetry' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.rule}}" entity-type="{{vm.types.entityType.rule}}"
@ -48,19 +48,19 @@
disable-attribute-scope-selection="true"> disable-attribute-scope-selection="true">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isRuleEditable(vm.grid.operatingItem())" label="{{ 'alarm.alarms' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isRuleEditable(vm.grid.operatingItem())" md-on-select="vm.grid.triggerResize()" label="{{ 'alarm.alarms' | translate }}">
<tb-alarm-table flex entity-type="vm.types.entityType.rule" <tb-alarm-table flex entity-type="vm.types.entityType.rule"
entity-id="vm.grid.operatingItem().id.id"> entity-id="vm.grid.operatingItem().id.id">
</tb-alarm-table> </tb-alarm-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isRuleEditable(vm.grid.operatingItem())" label="{{ 'rule.events' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isRuleEditable(vm.grid.operatingItem())" md-on-select="vm.grid.triggerResize()" label="{{ 'rule.events' | translate }}">
<tb-event-table flex entity-type="vm.types.entityType.rule" <tb-event-table flex entity-type="vm.types.entityType.rule"
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
tenant-id="vm.grid.operatingItem().tenantId.id" tenant-id="vm.grid.operatingItem().tenantId.id"
default-event-type="{{vm.types.eventType.lcEvent.value}}"> default-event-type="{{vm.types.eventType.lcEvent.value}}">
</tb-event-table> </tb-event-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isRuleEditable(vm.grid.operatingItem())" label="{{ 'relation.relations' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode && vm.isRuleEditable(vm.grid.operatingItem())" md-on-select="vm.grid.triggerResize()" label="{{ 'relation.relations' | translate }}">
<tb-relation-table flex <tb-relation-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.rule}}"> entity-type="{{vm.types.entityType.rule}}">

10
ui/src/app/tenant/tenants.tpl.html

@ -29,7 +29,7 @@
on-manage-users="vm.openTenantUsers(event, vm.grid.detailsConfig.currentItem)" on-manage-users="vm.openTenantUsers(event, vm.grid.detailsConfig.currentItem)"
on-delete-tenant="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-tenant> on-delete-tenant="vm.grid.deleteItem(event, vm.grid.detailsConfig.currentItem)"></tb-tenant>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'attribute.attributes' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.attributes' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.tenant}}" entity-type="{{vm.types.entityType.tenant}}"
@ -37,7 +37,7 @@
default-attribute-scope="{{vm.types.attributesScope.server.value}}"> default-attribute-scope="{{vm.types.attributesScope.server.value}}">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'attribute.latest-telemetry' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'attribute.latest-telemetry' | translate }}">
<tb-attribute-table flex <tb-attribute-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.tenant}}" entity-type="{{vm.types.entityType.tenant}}"
@ -46,19 +46,19 @@
disable-attribute-scope-selection="true"> disable-attribute-scope-selection="true">
</tb-attribute-table> </tb-attribute-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'alarm.alarms' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'alarm.alarms' | translate }}">
<tb-alarm-table flex entity-type="vm.types.entityType.tenant" <tb-alarm-table flex entity-type="vm.types.entityType.tenant"
entity-id="vm.grid.operatingItem().id.id"> entity-id="vm.grid.operatingItem().id.id">
</tb-alarm-table> </tb-alarm-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'tenant.events' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'tenant.events' | translate }}">
<tb-event-table flex entity-type="vm.types.entityType.tenant" <tb-event-table flex entity-type="vm.types.entityType.tenant"
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
tenant-id="vm.types.id.nullUid" tenant-id="vm.types.id.nullUid"
default-event-type="{{vm.types.eventType.error.value}}"> default-event-type="{{vm.types.eventType.error.value}}">
</tb-event-table> </tb-event-table>
</md-tab> </md-tab>
<md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" label="{{ 'relation.relations' | translate }}"> <md-tab ng-if="!vm.grid.detailsConfig.isDetailsEditMode" md-on-select="vm.grid.triggerResize()" label="{{ 'relation.relations' | translate }}">
<tb-relation-table flex <tb-relation-table flex
entity-id="vm.grid.operatingItem().id.id" entity-id="vm.grid.operatingItem().id.id"
entity-type="{{vm.types.entityType.tenant}}"> entity-type="{{vm.types.entityType.tenant}}">

6
ui/src/app/widget/lib/alarms-table-widget.js

@ -210,6 +210,9 @@ function AlarmsTableWidgetController($element, $scope, $filter, $mdMedia, $mdDia
var cssString = 'table.md-table th.md-column {\n'+ var cssString = 'table.md-table th.md-column {\n'+
'color: ' + mdDarkSecondary + ';\n'+ 'color: ' + mdDarkSecondary + ';\n'+
'}\n'+ '}\n'+
'table.md-table th.md-column.md-checkbox-column md-checkbox:not(.md-checked) .md-icon {\n'+
'border-color: ' + mdDarkSecondary + ';\n'+
'}\n'+
'table.md-table th.md-column md-icon.md-sort-icon {\n'+ 'table.md-table th.md-column md-icon.md-sort-icon {\n'+
'color: ' + mdDarkDisabled + ';\n'+ 'color: ' + mdDarkDisabled + ';\n'+
'}\n'+ '}\n'+
@ -220,6 +223,9 @@ function AlarmsTableWidgetController($element, $scope, $filter, $mdMedia, $mdDia
'color: ' + mdDark + ';\n'+ 'color: ' + mdDark + ';\n'+
'border-top: 1px '+mdDarkDivider+' solid;\n'+ 'border-top: 1px '+mdDarkDivider+' solid;\n'+
'}\n'+ '}\n'+
'table.md-table td.md-cell.md-checkbox-cell md-checkbox:not(.md-checked) .md-icon {\n'+
'border-color: ' + mdDarkSecondary + ';\n'+
'}\n'+
'table.md-table td.md-cell.md-placeholder {\n'+ 'table.md-table td.md-cell.md-placeholder {\n'+
'color: ' + mdDarkDisabled + ';\n'+ 'color: ' + mdDarkDisabled + ';\n'+
'}\n'+ '}\n'+

8
ui/src/scss/main.scss

@ -324,8 +324,14 @@ pre.tb-highlight {
tr { tr {
&.md-row:not([disabled]) { &.md-row:not([disabled]) {
outline: none; outline: none;
&:hover {
background-color: rgba(221, 221, 221, 0.3) !important;
}
&.md-selected {
background-color: rgba(221, 221, 221, 0.5) !important;
}
&.tb-current, &.tb-current:hover{ &.tb-current, &.tb-current:hover{
background-color: #dddddd !important; background-color: rgba(221, 221, 221, 0.65) !important;
} }
} }
} }

Loading…
Cancel
Save