Browse Source

Merge pull request #13690 from vvlladd28/improvement/widgets/clean-data

Optimized the size of dashboards and widgets when saving
pull/14512/head
Vladyslav Prykhodko 10 months ago
committed by GitHub
parent
commit
cce9caa4e3
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 24
      ui-ngx/src/app/core/api/widget-subscription.ts
  2. 18
      ui-ngx/src/app/core/services/dashboard-utils.service.ts
  3. 7
      ui-ngx/src/app/core/services/utils.service.ts
  4. 83
      ui-ngx/src/app/core/utils.ts
  5. 1
      ui-ngx/src/app/modules/home/components/attribute/attribute-table.component.ts
  6. 8
      ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-settings-dialog.component.ts
  7. 12
      ui-ngx/src/app/modules/home/components/widget/lib/alarm/alarms-table-widget.component.ts
  8. 2
      ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-table-widget.component.ts
  9. 1
      ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts
  10. 1
      ui-ngx/src/app/modules/home/components/widget/lib/maps-legacy/providers/image-map.ts
  11. 4
      ui-ngx/src/app/modules/home/components/widget/lib/table-widget.models.ts
  12. 2
      ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts
  13. 4
      ui-ngx/src/app/shared/models/dashboard.models.ts
  14. 1
      ui-ngx/src/app/shared/models/widget.models.ts
  15. 59
      ui-ngx/src/assets/dashboard/api_usage.json
  16. 92
      ui-ngx/src/assets/dashboard/customer_user_home_page.json
  17. 566
      ui-ngx/src/assets/dashboard/sys_admin_home_page.json
  18. 136
      ui-ngx/src/assets/dashboard/tenant_admin_home_page.json

24
ui-ngx/src/app/core/api/widget-subscription.ts

@ -1456,20 +1456,18 @@ export class WidgetSubscription implements IWidgetSubscription {
this.datasources.forEach((datasource) => {
datasource.dataKeys.forEach((dataKey) => {
if (datasource.generated || datasource.isAdditional) {
dataKey._hash = Math.random();
dataKey.color = this.ctx.utils.getMaterialColor(index);
}
index++;
});
if (datasource.latestDataKeys) {
datasource.latestDataKeys.forEach((dataKey) => {
if (datasource.generated || datasource.isAdditional) {
dataKey._hash = Math.random();
// dataKey.color = this.ctx.utils.getMaterialColor(index);
}
// index++;
});
}
// if (datasource.latestDataKeys) {
// datasource.latestDataKeys.forEach((dataKey) => {
// if (datasource.generated || datasource.isAdditional) {
// // dataKey.color = this.ctx.utils.getMaterialColor(index);
// }
// // index++;
// });
// }
});
if (this.comparisonEnabled) {
this.datasourcePages.forEach(datasourcePage => {
@ -1499,9 +1497,9 @@ export class WidgetSubscription implements IWidgetSubscription {
private entityDataToDatasourceData(datasource: Datasource, data: Array<DataSetHolder>): Array<DatasourceData> {
let datasourceDataArray: Array<DatasourceData> = [];
datasourceDataArray = datasourceDataArray.concat(datasource.dataKeys.map((dataKey, keyIndex) => {
dataKey.hidden = !!dataKey.settings.hideDataByDefault;
dataKey.inLegend = dataKey.settings.showInLegend ||
(isUndefined(dataKey.settings.showInLegend) && !dataKey.settings.removeFromLegend);
dataKey.hidden = !!dataKey.settings?.hideDataByDefault;
dataKey.inLegend = dataKey.settings?.showInLegend ||
(isUndefined(dataKey.settings?.showInLegend) && !dataKey.settings?.removeFromLegend);
dataKey.label = this.ctx.utils.customTranslation(dataKey.label, dataKey.label);
const datasourceData: DatasourceData = {
datasource,

18
ui-ngx/src/app/core/services/dashboard-utils.service.ts

@ -35,7 +35,15 @@ import {
LayoutType,
WidgetLayout
} from '@shared/models/dashboard.models';
import { deepClone, isDefined, isDefinedAndNotNull, isNotEmptyStr, isString, isUndefined } from '@core/utils';
import {
deepClean,
deepClone,
isDefined,
isDefinedAndNotNull,
isNotEmptyStr,
isString,
isUndefined
} from '@core/utils';
import {
Datasource,
datasourcesHasAggregation,
@ -80,7 +88,10 @@ export class DashboardUtilsService {
public validateAndUpdateDashboard(dashboard: Dashboard): Dashboard {
if (!dashboard.configuration) {
dashboard.configuration = {};
dashboard.configuration = {
entityAliases: {},
filters: {},
};
}
if (isUndefined(dashboard.configuration.widgets)) {
dashboard.configuration.widgets = {};
@ -350,7 +361,7 @@ export class DashboardUtilsService {
}
}
}
return widgetConfig;
return deepClean(widgetConfig, {cleanKeys: ['_hash'], cleanOnlyKey: true});
}
private removeTimewindowConfigIfUnused(widget: Widget) {
@ -377,6 +388,7 @@ export class DashboardUtilsService {
public prepareWidgetForSaving(widget: Widget): Widget {
this.removeTimewindowConfigIfUnused(widget);
widget = deepClean(widget, {cleanKeys: ['_hash'], cleanOnlyKey: true});
return widget;
}

7
ui-ngx/src/app/core/services/utils.service.ts

@ -97,7 +97,6 @@ export class UtilsService {
color: this.getMaterialColor(0),
funcBody: this.getPredefinedFunctionBody('Sin'),
settings: {},
_hash: Math.random()
};
defaultDatasource: Datasource = {
@ -153,8 +152,7 @@ export class UtilsService {
type: DataKeyType.alarm,
label: this.translate.instant(alarmFields[name].name),
color: this.getMaterialColor(i),
settings: {},
_hash: Math.random()
settings: {}
};
this.defaultAlarmDataKeys.push(dataKey);
}
@ -267,8 +265,7 @@ export class UtilsService {
type,
label,
funcBody: keyInfo.funcBody,
settings: {},
_hash: Math.random()
settings: {}
};
if (keyInfo.units) {
dataKey.units = keyInfo.units;

83
ui-ngx/src/app/core/utils.ts

@ -34,7 +34,7 @@ import {
} from '@shared/models/js-function.models';
import { DomSanitizer } from '@angular/platform-browser';
import { SecurityContext } from '@angular/core';
import { AbstractControl, ValidationErrors, Validators } from '@angular/forms';
import { AbstractControl, ValidationErrors } from '@angular/forms';
const varsRegex = /\${([^}]*)}/g;
const emailRegex = /^[A-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i;
@ -795,31 +795,72 @@ export function deepTrim<T>(obj: T): T {
}, (Array.isArray(obj) ? [] : {}) as T);
}
const isValidValue = (value: any): boolean => {
return (
value !== undefined &&
value !== null &&
value !== '' &&
!Number.isNaN(value)
);
};
export function deepClean<T extends Record<string, any> | any[]>(obj: T, {
cleanKeys = []
cleanKeys = [],
cleanOnlyKey = false
} = {}): T {
return _.transform(obj, (result, value, key) => {
if (cleanKeys.includes(key)) {
return;
}
if (Array.isArray(value) || isLiteralObject(value)) {
value = deepClean(value, {cleanKeys});
}
if(isLiteralObject(value) && isEmpty(value)) {
return;
}
if (Array.isArray(value) && !value.length) {
return;
}
if (value === undefined || value === null || value === '' || Number.isNaN(value)) {
return;
const keysToRemove = new Set(cleanKeys);
const clean = (input: any): any => {
if (Array.isArray(input)) {
const result: any[] = [];
for (const item of input) {
const value = clean(item);
if (cleanOnlyKey) {
result.push(value);
continue;
}
if (isValidValue(value)) {
const isEmptyArray = Array.isArray(value) && value.length === 0;
const isEmptyObj = isLiteralObject(value) && Object.keys(value).length === 0;
if (!isEmptyArray && !isEmptyObj) {
result.push(value);
}
}
}
return result;
}
if (Array.isArray(result)) {
return result.push(value);
if (isLiteralObject(input)) {
const result: Record<string, any> = {};
for (const key in input) {
if (keysToRemove.has(key)) continue;
const value = clean(input[key]);
if (cleanOnlyKey) {
result[key] = value;
continue;
}
if (isValidValue(value)) {
const isEmptyArray = Array.isArray(value) && value.length === 0;
const isEmptyObj = isLiteralObject(value) && Object.keys(value).length === 0;
if (!isEmptyArray && !isEmptyObj) {
result[key] = value;
}
}
}
return result;
}
result[key] = value;
});
return input;
};
return clean(obj);
}
export function generateSecret(length?: number): string {

1
ui-ngx/src/app/modules/home/components/attribute/attribute-table.component.ts

@ -541,7 +541,6 @@ export class AttributeTableComponent extends PageComponent implements AfterViewI
type: dataKeyType,
color: this.utils.getMaterialColor(i),
settings: {},
_hash: Math.random()
};
this.widgetDatasource.dataKeys.push(dataKey);
}

8
ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-settings-dialog.component.ts

@ -14,7 +14,7 @@
/// limitations under the License.
///
import { Component, Inject, OnDestroy, OnInit, SkipSelf } from '@angular/core';
import { Component, Inject, OnDestroy, SkipSelf } from '@angular/core';
import { ErrorStateMatcher } from '@angular/material/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { Store } from '@ngrx/store';
@ -33,7 +33,7 @@ import {
viewFormatTypes,
viewFormatTypeTranslationMap
} from '@app/shared/models/dashboard.models';
import { isDefined, isUndefined } from '@core/utils';
import { deepClean, deepTrim, isDefined, isUndefined } from '@core/utils';
import { StatesControllerService } from './states/states-controller.service';
import { DashboardUtilsService } from '@core/services/dashboard-utils.service';
import { merge, Subject } from 'rxjs';
@ -295,10 +295,10 @@ export class DashboardSettingsDialogComponent extends DialogComponent<DashboardS
let settings: DashboardSettings = null;
let gridSettings: GridSettings = null;
if (this.settings) {
settings = {...this.settings, ...this.settingsFormGroup.getRawValue()};
settings = deepClean(deepTrim({...this.settings, ...this.settingsFormGroup.getRawValue()}));
}
if (this.gridSettings) {
gridSettings = {...this.gridSettings, ...this.gridSettingsFormGroup.getRawValue()};
gridSettings = deepClean(deepTrim({...this.gridSettings, ...this.gridSettingsFormGroup.getRawValue()}));
}
this.dialogRef.close({settings, gridSettings});
}

12
ui-ngx/src/app/modules/home/components/widget/lib/alarm/alarms-table-widget.component.ts

@ -37,15 +37,7 @@ import { DataKey, WidgetActionDescriptor, WidgetConfig } from '@shared/models/wi
import { IWidgetSubscription } from '@core/api/widget-api.models';
import { UtilsService } from '@core/services/utils.service';
import { TranslateService } from '@ngx-translate/core';
import {
deepClone,
hashCode,
isDefined,
isDefinedAndNotNull,
isNotEmptyStr,
isObject,
isUndefined
} from '@core/utils';
import { deepClone, hashCode, isDefined, isDefinedAndNotNull, isNotEmptyStr, isObject, isUndefined } from '@core/utils';
import cssjs from '@core/css/css';
import { sortItems } from '@shared/models/page/page-link';
import { Direction } from '@shared/models/page/sort-order';
@ -450,7 +442,7 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit,
if (this.subscription.alarmSource) {
this.subscription.alarmSource.dataKeys.forEach((alarmDataKey) => {
const dataKey: EntityColumn = deepClone(alarmDataKey) as EntityColumn;
const keySettings: TableWidgetDataKeySettings = dataKey.settings;
const keySettings: TableWidgetDataKeySettings = dataKey.settings ?? {};
dataKey.entityKey = dataKeyToEntityKey(alarmDataKey);
dataKey.label = this.utils.customTranslation(dataKey.label, dataKey.label);
dataKey.title = getHeaderTitle(dataKey, keySettings, this.utils);

2
ui-ngx/src/app/modules/home/components/widget/lib/entity/entities-table-widget.component.ts

@ -471,7 +471,7 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni
}
dataKeys.push(dataKey);
const keySettings: TableWidgetDataKeySettings = dataKey.settings;
const keySettings: TableWidgetDataKeySettings = dataKey.settings ?? {};
dataKey.label = this.utils.customTranslation(dataKey.label, dataKey.label);
dataKey.title = getHeaderTitle(dataKey, keySettings, this.utils);
dataKey.def = 'def' + this.columns.length;

1
ui-ngx/src/app/modules/home/components/widget/lib/flot-widget.ts

@ -525,7 +525,6 @@ export class TbFlot {
lineWidth: threshold.lineWidth,
color: threshold.color
} as TbFlotThresholdKeySettings,
_hash: Math.random()
};
if (datasource) {
datasource.dataKeys.push(dataKey);

1
ui-ngx/src/app/modules/home/components/widget/lib/maps-legacy/providers/image-map.ts

@ -91,7 +91,6 @@ export class ImageMap extends LeafletMap {
name: imageUrlAttribute,
label: imageUrlAttribute,
settings: {},
_hash: Math.random()
}
]
}

4
ui-ngx/src/app/modules/home/components/widget/lib/table-widget.models.ts

@ -484,8 +484,8 @@ export function constructTableCssString(widgetConfig: WidgetConfig): string {
return cssString;
}
export function getHeaderTitle(dataKey: DataKey, keySettings: TableWidgetDataKeySettings, utils: UtilsService) {
if (isDefined(keySettings.customTitle) && isNotEmptyStr(keySettings.customTitle)) {
export function getHeaderTitle(dataKey: DataKey, keySettings: TableWidgetDataKeySettings | undefined, utils: UtilsService) {
if (isNotEmptyStr(keySettings?.customTitle)) {
return utils.customTranslation(keySettings.customTitle, keySettings.customTitle);
}
return dataKey.label;

2
ui-ngx/src/app/modules/home/components/widget/widget-config.component.ts

@ -771,7 +771,6 @@ export class WidgetConfigComponent extends PageComponent implements OnInit, OnDe
public generateDataKey(chip: any, type: DataKeyType, dataKeySettingsForm: FormProperty[],
isLatestDataKey: boolean, dataKeySettingsFunction: DataKeySettingsFunction): DataKey {
if (isObject(chip)) {
(chip as DataKey)._hash = Math.random();
return chip;
} else {
let label: string = chip;
@ -789,7 +788,6 @@ export class WidgetConfigComponent extends PageComponent implements OnInit, OnDe
label,
color: this.genNextColor(),
settings: {},
_hash: Math.random()
};
if (type === DataKeyType.function) {
result.name = 'f(x)';

4
ui-ngx/src/app/shared/models/dashboard.models.ts

@ -186,8 +186,8 @@ export interface DashboardConfiguration {
settings?: DashboardSettings;
widgets?: {[id: string]: Widget } | Widget[];
states?: {[id: string]: DashboardState };
entityAliases?: EntityAliases;
filters?: Filters;
entityAliases: EntityAliases;
filters: Filters;
[key: string]: any;
}

1
ui-ngx/src/app/shared/models/widget.models.ts

@ -401,7 +401,6 @@ export interface DataKey extends KeyInfo {
inLegend?: boolean;
isAdditional?: boolean;
origDataKeyIndex?: number;
_hash?: number;
}
export type CellClickColumnInfo = Pick<DataKey, 'name' | 'label'>;

59
ui-ngx/src/assets/dashboard/api_usage.json

@ -25,8 +25,7 @@
"useCellStyleFunction": false,
"useCellContentFunction": true,
"cellContentFunction": "return JSON.parse(value).ruleChainName;"
},
"_hash": 0.9954481282345906
}
},
{
"name": "ruleEngineException",
@ -37,8 +36,7 @@
"useCellStyleFunction": false,
"useCellContentFunction": true,
"cellContentFunction": "return JSON.parse(value).ruleNodeName;"
},
"_hash": 0.18580357036589978
}
},
{
"name": "ruleEngineException",
@ -49,8 +47,7 @@
"useCellStyleFunction": false,
"useCellContentFunction": true,
"cellContentFunction": "return JSON.parse(value).message;"
},
"_hash": 0.7255162989552142
}
}
],
"alarmFilterConfig": {
@ -64,16 +61,14 @@
"type": "entityField",
"label": "Queue name",
"color": "#ffc107",
"settings": {},
"_hash": 0.6889245277142959
"settings": {}
},
{
"name": "serviceId",
"type": "entityField",
"label": "Service Id",
"color": "#607d8b",
"settings": {},
"_hash": 0.7972226575450785
"settings": {}
}
]
}
@ -207,7 +202,6 @@
}
}
},
"_hash": 0.15490750967648736,
"aggregationType": null,
"units": null,
"decimals": null,
@ -280,7 +274,6 @@
}
}
},
"_hash": 0.4186621166514697,
"aggregationType": null,
"units": null,
"decimals": null,
@ -353,7 +346,6 @@
}
}
},
"_hash": 0.49891007198715376,
"aggregationType": null,
"units": null,
"decimals": null,
@ -373,16 +365,14 @@
"type": "entityField",
"label": "Queue name",
"color": "#ffc107",
"settings": {},
"_hash": 0.7021721434431745
"settings": {}
},
{
"name": "serviceId",
"type": "entityField",
"label": "Service Id",
"color": "#607d8b",
"settings": {},
"_hash": 0.5924381120750077
"settings": {}
}
]
}
@ -759,7 +749,6 @@
}
}
},
"_hash": 0.565222981550328,
"aggregationType": null,
"units": null,
"decimals": null,
@ -832,7 +821,6 @@
}
}
},
"_hash": 0.2679547062508352,
"aggregationType": null,
"units": null,
"decimals": null,
@ -852,16 +840,14 @@
"type": "entityField",
"label": "Queue name",
"color": "#f44336",
"settings": {},
"_hash": 0.7066844328378095
"settings": {}
},
{
"name": "serviceId",
"type": "entityField",
"label": "Service Id",
"color": "#ffc107",
"settings": {},
"_hash": 0.1371570237026627
"settings": {}
}
]
}
@ -1204,7 +1190,6 @@
},
"type": "bar"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -1560,7 +1545,6 @@
},
"type": "bar"
},
"_hash": 0.46849996721308895,
"units": null,
"decimals": null,
"funcBody": null,
@ -1949,7 +1933,6 @@
}
}
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -2355,7 +2338,6 @@
}
}
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -2710,7 +2692,6 @@
},
"type": "bar"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -3071,7 +3052,6 @@
},
"type": "bar"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -3438,7 +3418,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -3845,7 +3824,6 @@
"color": ""
}
},
"_hash": 0.12814821361119078,
"aggregationType": null,
"units": null,
"decimals": null,
@ -4262,7 +4240,6 @@
"color": ""
}
},
"_hash": 0.01948850513940492,
"aggregationType": null,
"units": null,
"decimals": null,
@ -4689,7 +4666,6 @@
"color": ""
}
},
"_hash": 0.5125470598651091,
"aggregationType": null,
"units": null,
"decimals": null,
@ -5082,7 +5058,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -5436,7 +5411,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -5799,7 +5773,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -6167,7 +6140,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -6521,7 +6493,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -6884,7 +6855,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -7252,7 +7222,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -7615,7 +7584,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -7988,7 +7956,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -8342,7 +8309,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -8705,7 +8671,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -9078,7 +9043,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -9432,7 +9396,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -9795,7 +9758,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -10163,7 +10125,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -10517,7 +10478,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,
@ -10880,7 +10840,6 @@
"type": "bar",
"yAxisId": "default"
},
"_hash": 0.0661644137210089,
"units": null,
"decimals": null,
"funcBody": null,

92
ui-ngx/src/assets/dashboard/customer_user_home_page.json

@ -12,11 +12,6 @@
"sizeY": 3,
"config": {
"datasources": [],
"timewindow": {
"realtime": {
"timewindowMs": 60000
}
},
"showTitle": false,
"backgroundColor": "rgb(255, 255, 255)",
"color": "rgba(0, 0, 0, 0.87)",
@ -108,7 +103,6 @@
"label": "totalDevices",
"color": "#2196f3",
"settings": {},
"_hash": 0.8491768696709192,
"aggregationType": null,
"units": null,
"decimals": null,
@ -130,7 +124,6 @@
"label": "activeDevices",
"color": "#4caf50",
"settings": {},
"_hash": 0.1262449138010293,
"aggregationType": null,
"units": null,
"decimals": null,
@ -152,7 +145,6 @@
"label": "inactiveDevices",
"color": "#f44336",
"settings": {},
"_hash": 0.39119172615806797,
"aggregationType": null,
"units": null,
"decimals": null,
@ -163,30 +155,6 @@
]
}
],
"timewindow": {
"displayValue": "",
"selectedTab": 0,
"realtime": {
"realtimeType": 1,
"interval": 1000,
"timewindowMs": 60000,
"quickInterval": "CURRENT_DAY"
},
"history": {
"historyType": 0,
"interval": 1000,
"timewindowMs": 60000,
"fixedTimewindow": {
"startTimeMs": 1680168340431,
"endTimeMs": 1680254740431
},
"quickInterval": "CURRENT_DAY"
},
"aggregation": {
"type": "AVG",
"limit": 25000
}
},
"showTitle": false,
"backgroundColor": "#fff",
"color": "rgba(0, 0, 0, 0.87)",
@ -210,7 +178,6 @@
"fontWeight": 400
},
"showLegend": false,
"useDashboardTimewindow": true,
"widgetCss": "",
"pageSize": 1024,
"noDataDisplayMessage": ""
@ -238,7 +205,6 @@
"label": "totalAlarms",
"color": "#ffc107",
"settings": {},
"_hash": 0.8743321483507485,
"aggregationType": null,
"units": null,
"decimals": null,
@ -265,7 +231,6 @@
"label": "assignedToMeAlarms",
"color": "#ffc107",
"settings": {},
"_hash": 0.6392390736755882,
"aggregationType": null,
"units": null,
"decimals": null,
@ -293,7 +258,6 @@
"label": "criticalAlarms",
"color": "#ffc107",
"settings": {},
"_hash": 0.8329478098552843,
"aggregationType": null,
"units": null,
"decimals": null,
@ -312,37 +276,13 @@
}
}
],
"timewindow": {
"displayValue": "",
"selectedTab": 0,
"realtime": {
"realtimeType": 1,
"interval": 1000,
"timewindowMs": 60000,
"quickInterval": "CURRENT_DAY"
},
"history": {
"historyType": 0,
"interval": 1000,
"timewindowMs": 60000,
"fixedTimewindow": {
"startTimeMs": 1680168340431,
"endTimeMs": 1680254740431
},
"quickInterval": "CURRENT_DAY"
},
"aggregation": {
"type": "AVG",
"limit": 25000
}
},
"showTitle": false,
"backgroundColor": "#fff",
"color": "rgba(0, 0, 0, 0.87)",
"padding": "16px",
"settings": {
"useMarkdownTextFunction": false,
"markdownTextPattern": "<div class=\"tb-card-content\">\n <div class=\"tb-content-container\">\n <div class=\"tb-card-header\">\n <div class=\"tb-card-title\">\n <a class=\"tb-home-widget-title tb-home-widget-link\" routerLink=\"/alarms\">{{ 'alarm.alarms' | translate }}</a>\n </div>\n </div>\n <div class=\"tb-item-cards\">\n <a class=\"tb-item-card tb-critical\" routerLink=\"/alarms\" [queryParams]=\"{severityList: ['CRITICAL']}\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.critical</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${criticalAlarms:0}</div>\n </div>\n </a>\n <a class=\"tb-item-card tb-assigned\" routerLink=\"/alarms\" [queryParams]=\"{assignedToMe: true}\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.assigned-to-me</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${assignedToMeAlarms:0}</div>\n </div>\n </a>\n <a class=\"tb-item-card tb-total md:!hidden\" routerLink=\"/alarms\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.total</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${totalAlarms:0}</div>\n </div>\n </a>\n </div>\n </div>\n</div>",
"markdownTextPattern": "<div class=\"tb-card-content\">\n <div class=\"tb-content-container\">\n <div class=\"tb-card-header\">\n <div class=\"tb-card-title\">\n <a class=\"tb-home-widget-title tb-home-widget-link\" routerLink=\"/alarms/alarms\">{{ 'alarm.alarms' | translate }}</a>\n </div>\n </div>\n <div class=\"tb-item-cards\">\n <a class=\"tb-item-card tb-critical\" routerLink=\"/alarms/alarms\" [queryParams]=\"{severityList: ['CRITICAL']}\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.critical</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${criticalAlarms:0}</div>\n </div>\n </a>\n <a class=\"tb-item-card tb-assigned\" routerLink=\"/alarms/alarms\" [queryParams]=\"{assignedToMe: true}\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.assigned-to-me</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${assignedToMeAlarms:0}</div>\n </div>\n </a>\n <a class=\"tb-item-card tb-total md:!hidden\" routerLink=\"/alarms/alarms\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.total</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${totalAlarms:0}</div>\n </div>\n </a>\n </div>\n </div>\n</div>",
"applyDefaultMarkdownStyle": false,
"markdownCss": ".tb-card-content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: row;\n}\n\n.tb-content-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n gap: 12px;\n}\n\n.tb-card-header {\n height: 36px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n}\n\n.tb-item-cards {\n flex: 1;\n display: flex;\n flex-direction: row;\n gap: 12px;\n}\n\na.tb-item-card {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 8px 12px;\n border: 1px solid;\n border-radius: 10px;\n margin-bottom: 12px;\n}\n\na.tb-item-card.tb-critical {\n background: rgba(209, 39, 48, 0.04);\n border-color: rgba(209, 39, 48, 0.06);\n}\n\na.tb-item-card.tb-assigned {\n background: rgba(48, 86, 128, 0.04);\n border-color: rgba(48, 86, 128, 0.12);\n}\n\na.tb-item-card.tb-total {\n background: rgba(0, 0, 0, 0.01);\n border-color: rgba(0, 0, 0, 0.05);\n}\n\n.tb-item-title-container {\n display: grid;\n}\n\n.tb-item-title {\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0.2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; \n color: rgba(0, 0, 0, 0.76);\n}\n\n.tb-item-title.tb-home-widget-link:after {\n position: absolute;\n right: 0;\n}\n\na.tb-item-card:hover .tb-item-title.tb-home-widget-link:after { \n color: rgba(0, 0, 0, 0.38);\n}\n\na.tb-item-card:hover {\n box-shadow: 0px 4px 10px rgba(23, 33, 90, 0.08);\n}\n\n.tb-count-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.tb-count {\n font-style: normal;\n font-weight: 500;\n font-size: 24px;\n line-height: 36px;\n white-space: nowrap;\n color: rgba(0, 0, 0, 0.87);\n}\n\na.tb-item-card.tb-critical .tb-count:after {\n content: \"warning\";\n display: inline-block;\n position: relative;\n font-family: 'Material Icons Round';\n color: #D12730;\n vertical-align: bottom;\n margin-left: 6px;\n}\n\n@media screen and (max-width: 959px) {\n .tb-item-cards {\n flex-direction: column;\n }\n a.tb-item-card {\n margin-bottom: 0;\n }\n}\n\n@media screen and (max-width: 1279px) {\n a.tb-item-card {\n flex-direction: row;\n align-items: center;\n }\n .tb-item-title.tb-home-widget-link:after {\n position: relative;\n }\n .tb-count-container {\n align-items: flex-end;\n }\n}\n\n@media screen and (min-width: 960px) and (max-width: 1819px) {\n .tb-item-title {\n font-size: 11px;\n line-height: 16px;\n }\n .tb-count {\n font-size: 16px;\n line-height: 24px;\n }\n a.tb-item-card {\n padding: 4px 8px;\n margin-bottom: 6px;\n }\n a.tb-item-card:hover {\n box-shadow: 0px 2px 5px rgba(23, 33, 90, 0.08);\n }\n a.tb-item-card.tb-critical .tb-count:after {\n margin-left: 2px;\n }\n}\n"
},
@ -359,7 +299,6 @@
"fontWeight": 400
},
"showLegend": false,
"useDashboardTimewindow": true,
"widgetCss": "",
"pageSize": 1024,
"noDataDisplayMessage": ""
@ -429,7 +368,8 @@
"backgroundImageUrl": null,
"mobileAutoFillHeight": false,
"mobileRowHeight": 20,
"outerMargin": true
"outerMargin": true,
"layoutType": "default"
}
}
}
@ -521,33 +461,14 @@
}
},
"timewindow": {
"displayValue": "",
"hideInterval": false,
"hideLastInterval": false,
"hideQuickInterval": false,
"hideAggregation": false,
"hideAggInterval": false,
"hideTimezone": false,
"selectedTab": 0,
"realtime": {
"realtimeType": 0,
"interval": 1000,
"timewindowMs": 60000,
"quickInterval": "CURRENT_DAY"
},
"history": {
"historyType": 0,
"interval": 1000,
"timewindowMs": 60000,
"fixedTimewindow": {
"startTimeMs": 1680168326072,
"endTimeMs": 1680254726072
},
"quickInterval": "CURRENT_DAY"
"timewindowMs": 60000
},
"aggregation": {
"type": "AVG",
"limit": 25000
"type": "AVG"
}
},
"settings": {
@ -567,6 +488,5 @@
"dashboardCss": ".tb-widget-container > .tb-widget {\n border: 1px solid rgba(0, 0, 0, 0.05);\n box-shadow: 0px 5px 16px rgba(0, 0, 0, 0.04);\n border-radius: 12px;\n}\n\n.tb-widget-container > .tb-widget:not([style*=\"padding: 0\"]) {\n padding: 16px !important;\n}\n\n.tb-card-title {\n display: grid;\n}\n\n.tb-home-widget-title {\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0.25px;\n color: rgba(0, 0, 0, 0.54);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tb-home-widget-link {\n position: relative;\n border-bottom: none;\n}\n\n.tb-home-widget-link:hover {\n border-bottom: none;\n}\n\n.tb-home-widget-link:focus {\n border-bottom: none;\n}\n\n.tb-home-widget-link::after {\n content: 'arrow_forward';\n display: inline-block;\n transform: rotate(315deg);\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 18px;\n color: rgba(0, 0, 0, 0.12);\n vertical-align: bottom;\n margin-left: 6px; \n}\n\n.tb-home-widget-link:hover::after {\n color: inherit;\n}\n\n.tb-home-widget-info-icon {\n color: rgba(0, 0, 0, 0.12);\n font-size: 16px;\n width: 16px;\n height: 16px;\n line-height: 15px;\n vertical-align: middle;\n}\n\n.tb-widget-container > .tb-widget .tb-timewindow {\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0.25px;\n color: rgba(0, 0, 0, 0.54);\n padding: 0;\n}\n\n.tb-widget-container > .tb-widget .tb-legend-keys .tb-legend-label {\n cursor: pointer;\n user-select: none;\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0.2px;\n color: rgba(0, 0, 0, 0.54);\n}\n\n@media screen and (min-width: 960px) and (max-width: 1279px) {\n .tb-widget-container > .tb-widget {\n border-radius: 4px;\n }\n .tb-widget-container > .tb-widget:not([style*=\"padding: 0\"]) {\n padding: 2px !important;\n }\n .tb-hide-md {\n display: none;\n }\n}\n\n@media screen and (min-width: 1280px) and (max-width: 1819px) {\n .tb-widget-container > .tb-widget:not([style*=\"padding: 0\"]) {\n padding: 8px !important;\n }\n .tb-hide-lg {\n display: none;\n }\n}\n\n@media screen and (min-width: 960px) and (max-width: 1819px) {\n .tb-hide-md-lg {\n display: none;\n }\n\n .tb-home-widget-title {\n font-size: 12px;\n line-height: 16px;\n }\n \n .tb-widget-container > .tb-widget .tb-widget-title {\n padding: 0;\n }\n\n .tb-widget-container > .tb-widget .tb-timewindow {\n font-size: 12px;\n line-height: 16px;\n min-height: 24px;\n padding: 0;\n }\n\n .tb-widget-container > .tb-widget .tb-timewindow .mat-mdc-icon-button.tb-mat-32 {\n width: 24px;\n height: 24px;\n line-height: 24px;\n }\n\n .tb-widget-container > .tb-widget .tb-timewindow .mat-mdc-icon-button.tb-mat-32 .mat-icon {\n width: 18px;\n height: 18px;\n font-size: 18px;\n }\n \n .tb-widget-container > .tb-widget tb-legend {\n padding-bottom: 0 !important;\n }\n \n .tb-widget-container > .tb-widget .tb-legend-keys .tb-legend-label {\n font-size: 11px;\n line-height: 16px;\n letter-spacing: 0.25px;\n }\n}\n\n@media screen and (max-width: 959px), screen and (min-width: 1820px) {\n .tb-hide-not-md-lg {\n display: none;\n }\n}\n"
}
},
"externalId": null,
"name": "Customer User Home Page"
}
}

566
ui-ngx/src/assets/dashboard/sys_admin_home_page.json

File diff suppressed because it is too large

136
ui-ngx/src/assets/dashboard/tenant_admin_home_page.json

@ -12,30 +12,6 @@
"sizeY": 3.5,
"config": {
"datasources": [],
"timewindow": {
"displayValue": "",
"selectedTab": 0,
"realtime": {
"realtimeType": 1,
"interval": 1000,
"timewindowMs": 60000,
"quickInterval": "CURRENT_DAY"
},
"history": {
"historyType": 0,
"interval": 1000,
"timewindowMs": 60000,
"fixedTimewindow": {
"startTimeMs": 1680168340431,
"endTimeMs": 1680254740431
},
"quickInterval": "CURRENT_DAY"
},
"aggregation": {
"type": "AVG",
"limit": 25000
}
},
"showTitle": false,
"backgroundColor": "#fff",
"color": "rgba(0, 0, 0, 0.87)",
@ -59,7 +35,6 @@
"fontWeight": 400
},
"showLegend": false,
"useDashboardTimewindow": true,
"widgetCss": "",
"pageSize": 1024,
"noDataDisplayMessage": ""
@ -75,11 +50,6 @@
"sizeY": 3,
"config": {
"datasources": [],
"timewindow": {
"realtime": {
"timewindowMs": 60000
}
},
"showTitle": false,
"backgroundColor": "rgb(255, 255, 255)",
"color": "rgba(0, 0, 0, 0.87)",
@ -196,7 +166,6 @@
"label": "totalDevices",
"color": "#2196f3",
"settings": {},
"_hash": 0.8491768696709192,
"aggregationType": null,
"units": null,
"decimals": null,
@ -218,7 +187,6 @@
"label": "activeDevices",
"color": "#4caf50",
"settings": {},
"_hash": 0.1262449138010293,
"aggregationType": null,
"units": null,
"decimals": null,
@ -240,7 +208,6 @@
"label": "inactiveDevices",
"color": "#f44336",
"settings": {},
"_hash": 0.39119172615806797,
"aggregationType": null,
"units": null,
"decimals": null,
@ -251,30 +218,6 @@
]
}
],
"timewindow": {
"displayValue": "",
"selectedTab": 0,
"realtime": {
"realtimeType": 1,
"interval": 1000,
"timewindowMs": 60000,
"quickInterval": "CURRENT_DAY"
},
"history": {
"historyType": 0,
"interval": 1000,
"timewindowMs": 60000,
"fixedTimewindow": {
"startTimeMs": 1680168340431,
"endTimeMs": 1680254740431
},
"quickInterval": "CURRENT_DAY"
},
"aggregation": {
"type": "AVG",
"limit": 25000
}
},
"showTitle": false,
"backgroundColor": "#fff",
"color": "rgba(0, 0, 0, 0.87)",
@ -298,7 +241,6 @@
"fontWeight": 400
},
"showLegend": false,
"useDashboardTimewindow": true,
"widgetCss": "",
"pageSize": 1024,
"noDataDisplayMessage": ""
@ -326,7 +268,6 @@
"label": "totalAlarms",
"color": "#ffc107",
"settings": {},
"_hash": 0.8743321483507485,
"aggregationType": null,
"units": null,
"decimals": null,
@ -353,7 +294,6 @@
"label": "assignedToMeAlarms",
"color": "#ffc107",
"settings": {},
"_hash": 0.6392390736755882,
"aggregationType": null,
"units": null,
"decimals": null,
@ -381,7 +321,6 @@
"label": "criticalAlarms",
"color": "#ffc107",
"settings": {},
"_hash": 0.8329478098552843,
"aggregationType": null,
"units": null,
"decimals": null,
@ -400,37 +339,13 @@
}
}
],
"timewindow": {
"displayValue": "",
"selectedTab": 0,
"realtime": {
"realtimeType": 1,
"interval": 1000,
"timewindowMs": 60000,
"quickInterval": "CURRENT_DAY"
},
"history": {
"historyType": 0,
"interval": 1000,
"timewindowMs": 60000,
"fixedTimewindow": {
"startTimeMs": 1680168340431,
"endTimeMs": 1680254740431
},
"quickInterval": "CURRENT_DAY"
},
"aggregation": {
"type": "AVG",
"limit": 25000
}
},
"showTitle": false,
"backgroundColor": "#fff",
"color": "rgba(0, 0, 0, 0.87)",
"padding": "16px",
"settings": {
"useMarkdownTextFunction": false,
"markdownTextPattern": "<div class=\"tb-card-content\">\n <div class=\"tb-content-container\">\n <div class=\"tb-card-header\">\n <div class=\"tb-card-title\">\n <a class=\"tb-home-widget-title tb-home-widget-link\" routerLink=\"/alarms\">{{ 'alarm.alarms' | translate }}</a>\n </div>\n </div>\n <div class=\"tb-item-cards\">\n <a class=\"tb-item-card tb-critical\" routerLink=\"/alarms\" [queryParams]=\"{severityList: ['CRITICAL']}\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.critical</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${criticalAlarms:0}</div>\n </div>\n </a>\n <a class=\"tb-item-card tb-assigned\" routerLink=\"/alarms\" [queryParams]=\"{assignedToMe: true}\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.assigned-to-me</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${assignedToMeAlarms:0}</div>\n </div>\n </a>\n <a class=\"tb-item-card tb-total md:!hidden\" routerLink=\"/alarms\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.total</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${totalAlarms:0}</div>\n </div>\n </a>\n </div>\n </div>\n</div>",
"markdownTextPattern": "<div class=\"tb-card-content\">\n <div class=\"tb-content-container\">\n <div class=\"tb-card-header\">\n <div class=\"tb-card-title\">\n <a class=\"tb-home-widget-title tb-home-widget-link\" routerLink=\"/alarms/alarms\">{{ 'alarm.alarms' | translate }}</a>\n </div>\n </div>\n <div class=\"tb-item-cards\">\n <a class=\"tb-item-card tb-critical\" routerLink=\"/alarms/alarms\" [queryParams]=\"{severityList: ['CRITICAL']}\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.critical</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${criticalAlarms:0}</div>\n </div>\n </a>\n <a class=\"tb-item-card tb-assigned\" routerLink=\"/alarms/alarms\" [queryParams]=\"{assignedToMe: true}\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.assigned-to-me</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${assignedToMeAlarms:0}</div>\n </div>\n </a>\n <a class=\"tb-item-card tb-total md:!hidden\" routerLink=\"/alarms/alarms\">\n <div class=\"tb-item-title-container\">\n <div class=\"tb-item-title tb-home-widget-link\" translate>widgets.alarms.total</div>\n </div> \n <div class=\"tb-count-container\">\n <div class=\"tb-count\">${totalAlarms:0}</div>\n </div>\n </a>\n </div>\n </div>\n</div>",
"applyDefaultMarkdownStyle": false,
"markdownCss": ".tb-card-content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: row;\n}\n\n.tb-content-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n gap: 12px;\n}\n\n.tb-card-header {\n height: 36px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n}\n\n.tb-item-cards {\n flex: 1;\n display: flex;\n flex-direction: row;\n gap: 12px;\n overflow: hidden;\n}\n\na.tb-item-card {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 8px 12px;\n border: 1px solid;\n border-radius: 10px;\n margin-bottom: 12px;\n overflow: hidden;\n justify-content: space-evenly;\n}\n\na.tb-item-card.tb-critical {\n background: rgba(209, 39, 48, 0.04);\n border-color: rgba(209, 39, 48, 0.06);\n}\n\na.tb-item-card.tb-assigned {\n background: rgba(48, 86, 128, 0.04);\n border-color: rgba(48, 86, 128, 0.12);\n}\n\na.tb-item-card.tb-total {\n background: rgba(0, 0, 0, 0.01);\n border-color: rgba(0, 0, 0, 0.05);\n}\n\n.tb-item-title-container {\n display: grid;\n}\n\n.tb-item-title {\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0.2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; \n color: rgba(0, 0, 0, 0.76);\n}\n\n.tb-item-title.tb-home-widget-link:after {\n position: absolute;\n right: 0;\n}\n\na.tb-item-card:hover .tb-item-title.tb-home-widget-link:after { \n color: rgba(0, 0, 0, 0.38);\n}\n\na.tb-item-card:hover {\n box-shadow: 0px 4px 10px rgba(23, 33, 90, 0.08);\n}\n\n.tb-count-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.tb-count {\n font-style: normal;\n font-weight: 500;\n font-size: 24px;\n line-height: 36px;\n white-space: nowrap;\n color: rgba(0, 0, 0, 0.87);\n}\n\na.tb-item-card.tb-critical .tb-count:after {\n content: \"warning\";\n display: inline-block;\n position: relative;\n font-family: 'Material Icons Round';\n color: #D12730;\n vertical-align: bottom;\n margin-left: 6px;\n}\n\n@media screen and (max-width: 959px) {\n .tb-item-cards {\n flex-direction: column;\n }\n a.tb-item-card {\n margin-bottom: 0;\n }\n}\n\n@media screen and (max-width: 1279px) {\n a.tb-item-card {\n flex-direction: row;\n align-items: center;\n }\n .tb-item-title.tb-home-widget-link:after {\n position: relative;\n }\n .tb-count-container {\n align-items: flex-end;\n }\n}\n\n@media screen and (min-width: 960px) and (max-width: 1819px) {\n .tb-item-title {\n font-size: 11px;\n line-height: 16px;\n }\n .tb-count {\n font-size: 16px;\n line-height: 24px;\n }\n a.tb-item-card {\n padding: 4px 8px;\n margin-bottom: 6px;\n }\n a.tb-item-card:hover {\n box-shadow: 0px 2px 5px rgba(23, 33, 90, 0.08);\n }\n a.tb-item-card.tb-critical .tb-count:after {\n margin-left: 2px;\n }\n}\n"
},
@ -447,7 +362,6 @@
"fontWeight": 400
},
"showLegend": false,
"useDashboardTimewindow": true,
"widgetCss": "",
"pageSize": 1024,
"noDataDisplayMessage": ""
@ -533,7 +447,6 @@
}
}
},
"_hash": 0.39181957822569946,
"decimals": 0
}
],
@ -859,7 +772,6 @@
}
}
},
"_hash": 0.39181957822569946,
"decimals": 0,
"aggregationType": null,
"funcBody": null,
@ -1146,7 +1058,8 @@
"fontWeight": 400
},
"widgetCss": "",
"noDataDisplayMessage": ""
"noDataDisplayMessage": "",
"datasources": []
},
"row": 0,
"col": 0,
@ -1169,7 +1082,8 @@
"enableFullscreen": false,
"widgetStyle": {},
"widgetCss": "",
"noDataDisplayMessage": ""
"noDataDisplayMessage": "",
"datasources": []
},
"row": 0,
"col": 0,
@ -1212,7 +1126,8 @@
"showTitleIcon": false,
"titleTooltip": "",
"titleStyle": null,
"borderRadius": "12px"
"borderRadius": "12px",
"datasources": []
},
"row": 0,
"col": 0,
@ -1298,7 +1213,8 @@
"backgroundImageUrl": null,
"mobileAutoFillHeight": false,
"mobileRowHeight": 20,
"outerMargin": true
"outerMargin": true,
"layoutType": "default"
}
}
}
@ -1325,7 +1241,8 @@
"backgroundImageUrl": null,
"mobileAutoFillHeight": true,
"mobileRowHeight": 70,
"outerMargin": true
"outerMargin": true,
"layoutType": "default"
}
}
}
@ -1352,7 +1269,8 @@
"autoFillHeight": true,
"backgroundImageUrl": null,
"mobileAutoFillHeight": true,
"mobileRowHeight": 70
"mobileRowHeight": 70,
"layoutType": "default"
}
}
}
@ -1386,7 +1304,8 @@
"autoFillHeight": true,
"backgroundImageUrl": null,
"mobileAutoFillHeight": false,
"mobileRowHeight": 20
"mobileRowHeight": 20,
"layoutType": "default"
}
}
}
@ -1478,33 +1397,14 @@
}
},
"timewindow": {
"displayValue": "",
"hideInterval": false,
"hideLastInterval": false,
"hideQuickInterval": false,
"hideAggregation": false,
"hideAggInterval": false,
"hideTimezone": false,
"selectedTab": 0,
"realtime": {
"realtimeType": 0,
"interval": 1000,
"timewindowMs": 60000,
"quickInterval": "CURRENT_DAY"
},
"history": {
"historyType": 0,
"interval": 1000,
"timewindowMs": 60000,
"fixedTimewindow": {
"startTimeMs": 1680168326072,
"endTimeMs": 1680254726072
},
"quickInterval": "CURRENT_DAY"
"timewindowMs": 60000
},
"aggregation": {
"type": "AVG",
"limit": 25000
"type": "AVG"
}
},
"settings": {
@ -1525,4 +1425,4 @@
}
},
"name": "Tenant Administrator Home Page"
}
}
Loading…
Cancel
Save