import { HttpClient } from '@angular/common/http'; import { ChangeDetectorRef, EventEmitter, Injector, OnChanges, OnInit, SimpleChanges, ViewContainerRef } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { BasicWidgetInfo, DataWithDims, Dimension, DpValue, LinkConfig, RuntimeAggOption, WidgetAnonymityRepo, WidgetContainerMode, WidgetInfo, WidgetRepo, RtfUtilService, DpFsVal } from '@gspwidget/util'; import { RegisteredWidgetConfig, WidgetBase, WidgetEventService, WidgetInstanceInfo } from '@gspwidget/widget-devkit'; import { TranslateService } from '@ngx-translate/core'; import { NzModalService } from 'ng-zorro-antd/modal'; import { Observable } from 'rxjs'; import { DynamicLoaderService, WidgetLoadedData } from '../dynamic-loader.service'; import { InstanceService } from '../instance.service'; import { TitleBarComponent } from '../title-bar/title-bar.component'; declare global { interface Window { widgetI18nResLoaded: boolean; widgetStyleLoaded: boolean; define: any; } } export declare enum WCStatus { LoadingWidget = 0, LoadingData = 1, DataEmpty = 2, Normal = 3, DataError = 4, WidgetLoadError = 5 } export interface GetDataOptions { dpValues: DpValue[]; runtimeAgg: RuntimeAggOption; } export interface FeFilterConfig { fieldName: string; value: any; } /** * 元部件信息传入方式可选以下任意一种: * 1. widgetId * 2. basicWidgetInfo * * 兼容阶段数据加载逻辑 * 若元部件 useDataEngine === true, 说明是老写法、且需要数据的元部件,但其内部未调用加载数据,所以初始化完成后加载一下; * 新数据加载请求处理永远启用,因为仅有新写法元部件会触发; */ export declare class WidgetComponent implements OnInit, OnChanges { private loader; private cd; private injector; private modal; private http; private translate; private widgetEventService; private insSerivce; private widgetRepo; sanitizer: DomSanitizer; private rtfUtil; private widgetAnonymityRepo; /** 元部件 id,widgetId 与 basicWidgetInfo 任选其一 */ widgetId: string; /** widget 数据库信息,widgetId 与 basicWidgetInfo 任选其一 */ basicWidgetInfo: BasicWidgetInfo; /** 必选,此 widget 的配置信息;仅在元部件加载时起作用,若属性改变,必需调用 setPropValues() */ propValues: any; /** * 处理前的 propValues * 注意区分: * 1. 处理前:ce、存储 用的都是处理前,包含完整数据 * 2. 处理后:元部件内部 用的是处理后,仅包含必要信息 * * TODO: Input() 应该是谁?是否要经过处理? */ propValuesBeforeProcess: any; /** * 可选。最终用于给加载器,决定用哪种方式获取组件 factory * 传 widget id 的话,不用传此选项。 * 传 basicWidgetInfo 的话,需要传此选项。 * TODO: 为什么不直接加到 basicWidgetInfo 里? * */ mode: WidgetContainerMode; isDevMode: boolean; /** 可选,widget 的静态资源地址,一般不用管,特殊情况可配置,默认值为 this.basicWidgetInfo.baseUrl + '/assets/' */ assetsBaseUrl: string; /** 可选,部件实例 id, 获取数据可能用到 */ instanceId: string; /** * 必选,元部件内 dataService.loadData() 等主动获取数据时,会调用此方法。 * * 返回 observable * 有值 - 正常展示数据 * 空值、空数组等 * showIfNoData 为真 - 正常显示数据 * showIfNoData 为假 - 显示“暂无数据” * 返回空 - 无动作 * 报错 * showIfNoData 为真 - 正常显示数据 * showIfNoData 为假 - 显示“数据加载失败” */ getData: (getDataOpts: GetDataOptions) => Observable; /** * 部件标题 fallback: * 若 propValues 中存在 title 的值,优先用它做部件标题;若没有,才用此作为 fallback * */ fallbackTitle: string; linkMap: LinkConfig; status: WCStatus; /** 会被合并、覆盖到 widgetInstanceInfo, 被元部件拿到. 可传入 portletId. */ widgetInstanceInfoMixin: WidgetInstanceInfo; /** 三个优先级不同的 wcs,中优先级 wcs 来自元部件公共配置 */ wcsHigher: any; wcsLower: any; /** * 传入初始化的 dp val list,在元部件第一次取数时,就会带上 * 当前用于页面 url 传的 page filter value 的接收过程 */ initFilterDpFsValList: DpFsVal[]; /** 当前这个 comp 实例化完成,用于外部得到此组件实例 */ widgetCompCreated: EventEmitter; widgetInfoLoaded: EventEmitter; /** widget 加载完成,发出当前 widget 的信息 */ widgetLoaded: EventEmitter; /** 元部件加载、初始化完成,发出当前 widget 的信息 */ widgetInit: EventEmitter<{}>; runtimeAggChange: EventEmitter<{}>; resizeTarget: any; widgetContainer: ViewContainerRef; titleBar: TitleBarComponent; private resolveWidgetLoadedPromise; widgetLoadedPromise: Promise<{}>; WCStatus: typeof WCStatus; IGIX_HOME_PATH: string; FILTER_PROP_NAME: string; width: number; height: number; curWidgetConfig: RegisteredWidgetConfig; /** 存在此层的数据。已用于导出 excel。 */ data: any[]; /** 获取数据后存起来的维度。可用于页面设计时、运行时获取、显示维度 */ dims: Dimension[]; widgetInstance: WidgetBase; showRuntimeAgg: boolean; private widgetDataService; /** 元部件的代码元数据,非数据元数据,此数据仅能在此组件内,加载元部件脚本时获取 */ curWidgetLoadedData: WidgetLoadedData; /** 被注入当前元部件实例中的 WidgetInstanceInfo。 */ widgetInstanceInfo: WidgetInstanceInfo; /** scoped 后的 css 的 innerHtml,直接塞模板里就能生效,以节省性能 */ scopedCssInnerHtml: any; /** * 公共配置项 widget comp style,若开启,则根据 pv 中的值计算此值。 * 若无此值,会 */ wcs: any; autoRefreshDataTimer: any; /** 此组件内实际使用的 basic widget info, input 属性那个仅作输入属性使用 */ innerBasicWidgetInfo: BasicWidgetInfo; curbasicWidgetInfo: any; prebasicWidgetInfo: any; curwidgetId: any; prewidgetId: any; isfullscreen: boolean; showfullscreen: boolean; /** * 记录所有订阅, 组件销毁时全部取消订阅 */ private subscriptions; /** * 当前部件框架的筛选参数配置。(相对应的,innerDpValues 是元部件内部的) * 此属性结构:{dp, value, fs}[] * pv 中保存结构:{fs, dp}[](筛选控件 + 取数参数 = 筛选) * 部件实例中保存 { {fs, dp}: filterValue } */ filterDpFsValueList: DpFsVal[]; /** * 用于放大预览时,保存放大前的筛选参数 */ curFilterDpFsValueList: DpFsVal[]; /** * 联动传来的 dpValues */ linkDpValues: DpValue[]; /** * 元部件内部调用取数时,传来的筛选参数-值数据,比如元部件内的分页; * 为何要在此存储一份,每次现传不好吗?原因与前面的 curDpValues 一样: * 当前部件框架内调用取数时,也要同时传递元部件内的筛选状态, * 所以每次部件传来新的 dpValues 都存下来。 */ innerDpValues: DpValue[]; jsOnBootCallbacks: { onLoadData?: (any: any) => any; }; constructor(loader: DynamicLoaderService, cd: ChangeDetectorRef, injector: Injector, modal: NzModalService, http: HttpClient, translate: TranslateService, widgetEventService: WidgetEventService, insSerivce: InstanceService, widgetRepo: WidgetRepo, sanitizer: DomSanitizer, rtfUtil: RtfUtilService, widgetAnonymityRepo: WidgetAnonymityRepo); /** * 全局初始化 */ private _initWidgetEnv; ngOnInit(): void; ngOnChanges(c: SimpleChanges): void; private objTodelete; setTitle(): void; allPropertyValueSetPromise: Promise; /** * 外部更新元部件 propValues 的某属性后,需要调用此方法,否则我们不知道 propValues 发生了变化。 * 不太好精简掉这个方法。尝试过用 keyValueDiffer 在 ngDoCheck 中检测 propValues 变化,但仅能检测一层。 */ setPropertyValue(propName: string, pValue: any, init?: boolean): Promise; private _setWcs; private _clearWcs; private processPV; renderWidget(): Promise; private loadI18nRes; /** * 点击刷新按钮 * 1. 若元部件实现了 onRefresh 回调,则调它,适用部件:需要自身特殊实现刷新 * 2. 若未实现 onRefresh,则部件实例重新初始化 * 说明:2 原先是调用数据集取数 loadNSetData,但有两个问题所以改掉了: * 2-1. 即使报错,也不提示报错。因为它的理想实现应该是,若有数据集,才调数据集取数,否则不需要配数据集的元部件一取数会报错。 * 但因为无法区分当前元部件是否配置了数据集,所以只好都不报错了。 * 若刷新只是 loadNSetData,则不需要配数据集的部件会报错,但如果都注册 onRefresh 来解决, * 要改的元部件就太多了,而且还要单独实现 * 2-2. 非数据集取数的部件无法刷新 */ handleClickRefresh(): void; /** * 塞数据入口 1/2: 加载数据并塞给部件 * TODO: loadNSetData 可能是不带参数的。取数参数可能存在当前部件框架实例里,直接取。 * loadNSetData 有没有可能带着来自部件的额外参数? * showErrorIfError: 若接口报错,是否显示报错,默认显示 */ loadNSetData(showErrorStatusIfError?: boolean): Promise; /** * 获取当前,合并、处理过后,可以直接传给接口的 dpValues */ getCurDpValues(): Promise; feFilterConfigs: FeFilterConfig[]; setFeFilterConfig(feFilterConfig: FeFilterConfig): void; /** 前端过滤,现已用于 feFilter 类型的联动 */ private feFilter; /** * 塞数据入口 2/2 * 给元部件重新设置数据结果,外部可调用此方法给部件设置数据。 */ setData(pDataWithDims: DataWithDims): Promise; isTableDataNull(dataWithDims: DataWithDims): boolean; /** * 给外部:data param 型联动此部件时,调用此方法 * @param dpValues */ setLinkDpValues(dpValues: DpValue[]): void; cleanAllLink(): void; /** * 给外部使用:外部通过此方法设置某个部件启动器的筛选条件,用于页面级筛选等 * 会覆盖掉原先的同名 dpValues * set 完成后会立即调用加载、显示数据 * @param dpFsValues */ setFilterDpValues(dpFsValues: DpFsVal[], triggerLoadNSetData?: boolean): void; handleDataError: () => void; handleClickStatusMore(): void; filterValues: any[]; handleFilterChange(dpValues: DpValue[]): void; /** * 此 runtimeAgg 存储当前运行时用户选的、最新的 runtimeAgg。 * extra 中的是存储在部件中的。 * widget 不负责把 runtimeAgg 放到 extra 里,因为这里不确定是否需要持久化。 */ runtimeAgg: RuntimeAggOption; SHOW_RUNTIME_AGG_PROP_NAME: string; handleRuntimeAggChange(runtimeAgg: RuntimeAggOption): void; /** 当前写法需要保证 renderWidget() 已完成 */ handleTitleBarInit(titleBar: TitleBarComponent): void; initRuntimeAgg(): void; /** * 初始化部件事件监听 */ private initWidgetEventListener; /** * eventPropName 是事件对应的实际属性名, * eventKey 配置在 link 里的事件名。 * 一般他俩是一样的,后者可以不传。 * 若是筛选部件,则两者不同,一个是 'filter',一个是实际的事件(筛选)名称。 */ private initOneEventListener; setRuntimeAggDims(): void; handleExportExcel(): void; /** * @deprecated * 没有 filter widget 了 */ amIFilterWidget(): boolean; handlefullscreenPreview(): void; ngOnDestroy(): void; }