thingsboard/ui-ngx/src/app/core/api/widget-api.models.ts

325 lines
11 KiB
TypeScript
Raw Normal View History

///
2021-01-11 13:42:16 +02:00
/// Copyright © 2016-2021 The Thingsboard Authors
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
import { Observable } from 'rxjs';
import { EntityId } from '@app/shared/models/id/entity-id';
2019-09-10 15:12:10 +03:00
import {
2020-02-24 17:16:02 +02:00
DataSet,
Datasource,
DatasourceData,
DatasourceType,
KeyInfo,
2019-09-10 15:12:10 +03:00
LegendConfig,
LegendData,
2020-02-24 17:16:02 +02:00
WidgetActionDescriptor,
widgetType
2019-09-10 15:12:10 +03:00
} from '@shared/models/widget.models';
import { TimeService } from '../services/time.service';
import { DeviceService } from '../http/device.service';
import { UtilsService } from '@core/services/utils.service';
import { Timewindow, WidgetTimewindow } from '@shared/models/time/time.models';
2019-09-10 15:12:10 +03:00
import { EntityType } from '@shared/models/entity-type.models';
import { HttpErrorResponse } from '@angular/common/http';
import { RafService } from '@core/services/raf.service';
import { EntityAliases } from '@shared/models/alias.models';
import { EntityInfo } from '@app/shared/models/entity.models';
2019-11-04 15:47:36 +02:00
import { IDashboardComponent } from '@home/models/dashboard-component.models';
2020-02-24 17:16:02 +02:00
import * as moment_ from 'moment';
import {
2020-07-06 14:42:36 +03:00
AlarmData,
AlarmDataPageLink,
EntityData,
EntityDataPageLink,
EntityFilter,
2020-07-06 14:42:36 +03:00
Filter,
FilterInfo,
Filters,
KeyFilter
} from '@shared/models/query/query.models';
import { EntityDataService } from '@core/api/entity-data.service';
import { PageData } from '@shared/models/page/page-data';
2020-06-24 18:07:47 +03:00
import { TranslateService } from '@ngx-translate/core';
2020-07-03 18:33:06 +03:00
import { AlarmDataService } from '@core/api/alarm-data.service';
import { IDashboardController } from '@home/components/dashboard-page/dashboard-page.models';
export interface TimewindowFunctions {
onUpdateTimewindow: (startTimeMs: number, endTimeMs: number, interval?: number) => void;
onResetTimewindow: () => void;
}
export interface WidgetSubscriptionApi {
2019-09-10 15:12:10 +03:00
createSubscription: (options: WidgetSubscriptionOptions, subscribe?: boolean) => Observable<IWidgetSubscription>;
createSubscriptionFromInfo: (type: widgetType, subscriptionsInfo: Array<SubscriptionInfo>,
options: WidgetSubscriptionOptions, useDefaultComponents: boolean, subscribe: boolean)
=> Observable<IWidgetSubscription>;
removeSubscription: (id: string) => void;
}
export interface RpcApi {
sendOneWayCommand: (method: string, params?: any, timeout?: number) => Observable<any>;
sendTwoWayCommand: (method: string, params?: any, timeout?: number) => Observable<any>;
}
export interface IWidgetUtils {
formatValue: (value: any, dec?: number, units?: string, showZeroDecimals?: boolean) => string | undefined;
}
export interface WidgetActionsApi {
actionDescriptorsBySourceId: {[sourceId: string]: Array<WidgetActionDescriptor>};
getActionDescriptors: (actionSourceId: string) => Array<WidgetActionDescriptor>;
handleWidgetAction: ($event: Event, descriptor: WidgetActionDescriptor,
2020-02-25 11:43:35 +02:00
entityId?: EntityId, entityName?: string, additionalParams?: any, entityLabel?: string) => void;
elementClick: ($event: Event) => void;
2020-02-25 11:43:35 +02:00
getActiveEntityInfo: () => SubscriptionEntityInfo;
}
2019-09-10 15:12:10 +03:00
export interface AliasInfo {
alias?: string;
2019-09-10 15:12:10 +03:00
stateEntity?: boolean;
entityFilter?: EntityFilter;
currentEntity?: EntityInfo;
entityParamName?: string;
resolveMultiple?: boolean;
}
export interface StateEntityInfo {
entityParamName: string;
entityId: EntityId;
2019-09-10 15:12:10 +03:00
}
export interface IAliasController {
2019-09-10 15:12:10 +03:00
entityAliasesChanged: Observable<Array<string>>;
entityAliasResolved: Observable<string>;
filtersChanged: Observable<Array<string>>;
getAliasInfo(aliasId: string): Observable<AliasInfo>;
getEntityAliasId(aliasName: string): string;
getInstantAliasInfo(aliasId: string): AliasInfo;
2020-06-22 18:55:15 +03:00
resolveSingleEntityInfo(aliasId: string): Observable<EntityInfo>;
resolveDatasources(datasources: Array<Datasource>, singleEntity?: boolean): Observable<Array<Datasource>>;
resolveAlarmSource(alarmSource: Datasource): Observable<Datasource>;
getEntityAliases(): EntityAliases;
getFilters(): Filters;
getFilterInfo(filterId: string): FilterInfo;
getKeyFilters(filterId: string): Array<KeyFilter>;
updateCurrentAliasEntity(aliasId: string, currentEntity: EntityInfo);
2020-07-01 20:09:25 +03:00
updateUserFilter(filter: Filter);
updateEntityAliases(entityAliases: EntityAliases);
updateFilters(filters: Filters);
updateAliases(aliasIds?: Array<string>);
dashboardStateChanged();
}
export interface StateObject {
id?: string;
params?: StateParams;
}
export interface StateParams {
entityName?: string;
2020-02-25 11:43:35 +02:00
entityLabel?: string;
targetEntityParamName?: string;
entityId?: EntityId;
[key: string]: any | null;
}
export type StateControllerHolder = () => IStateController;
export interface IStateController {
dashboardCtrl: IDashboardController;
getStateParams(): StateParams;
getStateParamsByStateId(stateId: string): StateParams;
openState(id: string, params?: StateParams, openRightLayout?: boolean): void;
updateState(id?: string, params?: StateParams, openRightLayout?: boolean): void;
resetState(): void;
openRightLayout(): void;
preserveState(): void;
cleanupPreservedStates(): void;
navigatePrevState(index: number): void;
getStateId(): string;
getStateIndex(): number;
getStateIdAtIndex(index: number): string;
getEntityId(entityParamName: string): EntityId;
}
export interface SubscriptionInfo {
2019-09-10 15:12:10 +03:00
type: DatasourceType;
name?: string;
entityType?: EntityType;
entityId?: string;
entityIds?: Array<string>;
entityName?: string;
entityNamePrefix?: string;
timeseries?: Array<KeyInfo>;
attributes?: Array<KeyInfo>;
functions?: Array<KeyInfo>;
alarmFields?: Array<KeyInfo>;
deviceId?: string;
deviceName?: string;
deviceNamePrefix?: string;
deviceIds?: Array<string>;
}
2019-11-04 15:47:36 +02:00
export class WidgetSubscriptionContext {
constructor(private dashboard: IDashboardComponent) {}
get aliasController(): IAliasController {
return this.dashboard.aliasController;
}
dashboardTimewindowApi: TimewindowFunctions = {
onResetTimewindow: this.dashboard.onResetTimewindow.bind(this.dashboard),
onUpdateTimewindow: this.dashboard.onUpdateTimewindow.bind(this.dashboard)
};
timeService: TimeService;
deviceService: DeviceService;
2020-06-24 18:07:47 +03:00
translate: TranslateService;
entityDataService: EntityDataService;
2020-07-03 18:33:06 +03:00
alarmDataService: AlarmDataService;
utils: UtilsService;
raf: RafService;
widgetUtils: IWidgetUtils;
2019-09-10 15:12:10 +03:00
getServerTimeDiff: () => Observable<number>;
}
export type SubscriptionMessageSeverity = 'info' | 'warn' | 'error' | 'success';
export interface SubscriptionMessage {
severity: SubscriptionMessageSeverity;
message: string;
}
2019-09-10 15:12:10 +03:00
export interface WidgetSubscriptionCallbacks {
onDataUpdated?: (subscription: IWidgetSubscription, detectChanges: boolean) => void;
2019-09-10 15:12:10 +03:00
onDataUpdateError?: (subscription: IWidgetSubscription, e: any) => void;
onSubscriptionMessage?: (subscription: IWidgetSubscription, message: SubscriptionMessage) => void;
onInitialPageDataChanged?: (subscription: IWidgetSubscription, nextPageData: PageData<EntityData>) => void;
2021-03-18 19:45:45 +02:00
forceReInit?: () => void;
2019-09-10 15:12:10 +03:00
dataLoading?: (subscription: IWidgetSubscription) => void;
legendDataUpdated?: (subscription: IWidgetSubscription, detectChanges: boolean) => void;
2019-09-10 15:12:10 +03:00
timeWindowUpdated?: (subscription: IWidgetSubscription, timeWindowConfig: Timewindow) => void;
rpcStateChanged?: (subscription: IWidgetSubscription) => void;
onRpcSuccess?: (subscription: IWidgetSubscription) => void;
onRpcFailed?: (subscription: IWidgetSubscription) => void;
onRpcErrorCleared?: (subscription: IWidgetSubscription) => void;
}
export interface WidgetSubscriptionOptions {
2020-02-17 17:26:26 +02:00
type?: widgetType;
2019-09-10 15:12:10 +03:00
stateData?: boolean;
alarmSource?: Datasource;
datasources?: Array<Datasource>;
2020-06-22 18:55:15 +03:00
hasDataPageLink?: boolean;
singleEntity?: boolean;
warnOnPageDataOverflow?: boolean;
2021-03-02 13:21:53 +02:00
ignoreDataUpdateOnIntervalTick?: boolean;
2019-09-10 15:12:10 +03:00
targetDeviceAliasIds?: Array<string>;
targetDeviceIds?: Array<string>;
useDashboardTimewindow?: boolean;
displayTimewindow?: boolean;
timeWindowConfig?: Timewindow;
dashboardTimewindow?: Timewindow;
legendConfig?: LegendConfig;
2020-02-24 17:16:02 +02:00
comparisonEnabled?: boolean;
timeForComparison?: moment_.unitOfTime.DurationConstructor;
2019-09-10 15:12:10 +03:00
decimals?: number;
units?: string;
callbacks?: WidgetSubscriptionCallbacks;
}
export interface SubscriptionEntityInfo {
entityId: EntityId;
entityName: string;
2020-02-25 11:43:35 +02:00
entityLabel: string;
entityDescription: string;
}
export interface IWidgetSubscription {
options: WidgetSubscriptionOptions;
2019-09-10 15:12:10 +03:00
id: string;
init$: Observable<IWidgetSubscription>;
ctx: WidgetSubscriptionContext;
type: widgetType;
callbacks: WidgetSubscriptionCallbacks;
2019-09-10 15:12:10 +03:00
loadingData: boolean;
useDashboardTimewindow: boolean;
legendData: LegendData;
datasourcePages?: PageData<Datasource>[];
dataPages?: PageData<Array<DatasourceData>>[];
2019-09-10 15:12:10 +03:00
datasources?: Array<Datasource>;
data?: Array<DatasourceData>;
hiddenData?: Array<{data: DataSet}>;
timeWindowConfig?: Timewindow;
timeWindow?: WidgetTimewindow;
2021-03-18 19:45:45 +02:00
comparisonEnabled?: boolean;
2020-02-24 17:16:02 +02:00
comparisonTimeWindow?: WidgetTimewindow;
2019-09-10 15:12:10 +03:00
2020-07-03 18:33:06 +03:00
alarms?: PageData<AlarmData>;
2019-09-10 15:12:10 +03:00
alarmSource?: Datasource;
targetDeviceAliasIds?: Array<string>;
targetDeviceIds?: Array<string>;
rpcEnabled?: boolean;
executingRpcRequest?: boolean;
rpcErrorText?: string;
rpcRejection?: HttpErrorResponse;
getFirstEntityInfo(): SubscriptionEntityInfo;
2019-09-10 15:12:10 +03:00
onAliasesChanged(aliasIds: Array<string>): boolean;
onFiltersChanged(filterIds: Array<string>): boolean;
2020-06-22 18:55:15 +03:00
onDashboardTimewindowChanged(dashboardTimewindow: Timewindow): void;
updateDataVisibility(index: number): void;
onUpdateTimewindow(startTimeMs: number, endTimeMs: number, interval?: number): void;
2019-09-10 15:12:10 +03:00
onResetTimewindow(): void;
updateTimewindowConfig(newTimewindow: Timewindow): void;
2019-09-10 15:12:10 +03:00
sendOneWayCommand(method: string, params?: any, timeout?: number): Observable<any>;
sendTwoWayCommand(method: string, params?: any, timeout?: number): Observable<any>;
clearRpcError(): void;
2019-09-10 15:12:10 +03:00
subscribe(): void;
subscribeAllForPaginatedData(pageLink: EntityDataPageLink,
keyFilters: KeyFilter[]): void;
subscribeForPaginatedData(datasourceIndex: number,
pageLink: EntityDataPageLink,
2020-06-25 20:08:07 +03:00
keyFilters: KeyFilter[]): Observable<any>;
2020-06-22 18:55:15 +03:00
2020-07-03 18:33:06 +03:00
subscribeForAlarms(pageLink: AlarmDataPageLink,
keyFilters: KeyFilter[]): void;
2020-02-21 19:41:02 +02:00
isDataResolved(): boolean;
destroy(): void;
2020-01-29 17:20:28 +02:00
update(): void;
[key: string]: any;
}