import { AfterViewInit, ChangeDetectorRef, ElementRef, EventEmitter, OnDestroy, OnInit, QueryList, SimpleChanges, TemplateRef } from "@angular/core"; import { FormBuilder, FormGroup } from "@angular/forms"; import { NzDatePickerComponent, NzInputNumberComponent, NzRangePickerComponent, NzSelectComponent, NzTimePickerComponent } from "ng-zorro-antd"; import { NzFormatEmitEvent } from "ng-zorro-antd/core"; import { TotalOption } from "../hd-detail-lines/hd-detail-lines.service"; import { TreeGrid } from "../hd-table/hd-table.service"; import { SelectOptionTableColumn } from "../model/common-type"; import { CommonSessionService } from "../service/common-session.service"; import { FormLine, FormLinesCacheOption } from "./hd-form-lines.service"; export declare class HdFormLinesComponent implements OnInit, AfterViewInit, OnDestroy { private fb; private cdr; private commonSessionService; formInputDomList: QueryList; showLineNumber: boolean; allowEmpty: boolean; deleteLastLineEvent: EventEmitter<{}>; showKeyboardOperateTip: boolean; /** 是否启用键盘方向键/Enter 在单元格间跳转,默认开启 */ enableKeyboardOperate: boolean; tableLoading: boolean; showSearch: boolean; /** 是否展示行勾选列,用于外部批量操作勾选行 */ showCheckbox: boolean; /** 是否展示列设置(齿轮),默认开启;仅非 hide 的 ViewDom 可配置,禁止拖拽调序 */ showColSettings: boolean; /** 列设置缓存 key 片段;有值时持久化到 IndexedDB,无则仅当前会话生效 */ uuid: string; formLines: Array; formLinesData: any; operateButtons: Array; scroll: { [key: string]: string; }; changeEvent: EventEmitter<{}>; /** 新增空行后抛出该行 FormGroup(手动添加、键盘跳行自动补行等) */ addLineEvent: EventEmitter; /** 勾选变化时抛出当前勾选行 FormGroup 列表 */ selectionChange: EventEmitter; showDeleteConfirm: boolean; paginationPageIndex: number; paginationPageSize: number; validateHdFormLines: FormGroup; newLine: any; inputValue: string; showTotal: boolean; totalOption: Array; columnsNumber: number | string; totalOptionList: any[]; showForm: boolean; filterStr: string; storeFormLinesData: any; filterStoreFormLinesData: any; filterIndexStore: Array; isFilterData: boolean; formValid: boolean; /** 勾选的行 id(跨页、搜索重建后仍保留) */ private selectedRowIds; private searchSubject; private debounceTimeout; private searchSubscription; private formInputDomListSub; private openChangeSubject; private openChangeDebounceTimeout; private openChangeSubscription; collectDomList: Array>; activeDomX: number; activeDomY: number; activeDom: ElementRef | NzSelectComponent | NzInputNumberComponent | NzDatePickerComponent | NzRangePickerComponent | NzTimePickerComponent; activeSelectedComponentOpen: boolean; ViewDomRightTemplate: TemplateRef; /** 工具栏左侧自定义按钮,用法同 hd-table 的 tableLeftButton */ formLinesLeftButton: TemplateRef; /** 工具栏右侧自定义按钮,用法同 hd-table 的 tableRightButton */ formLinesRightButton: TemplateRef; /** 表格上方自定义区域(如勾选提示),用法同 hd-table 的 tableTotal */ tableTotal: TemplateRef; isDropdownVisible: boolean; showListNodes: boolean; nowListNodes: Array; hideListNodes: Array; cancelNowListNodes: Array; cancelHideListNodes: Array; formLinesCacheOption: FormLinesCacheOption; private localforage; private localtionTmp; private userSession; /** 是否已从 IndexedDB 读到过列设置缓存(含 cols 为空) */ private colsCacheLoaded; constructor(fb: FormBuilder, cdr: ChangeDetectorRef, commonSessionService: CommonSessionService); ngOnInit(): void; ngAfterViewInit(): void; ngOnDestroy(): void; readonly formLinesLength: any; readonly operateColWidth: number; /** allowEmpty 且操作列仅有删除时:允许 0 行,初始化与删至空都不自动补空行 */ readonly isTrulyEmptyAllowed: boolean; /** 勾选列固定时,序号列的 left 偏移 */ readonly lineNumberLeft: "40px" | "0px"; private generateRowId; private getRowId; /** 当前页的行(用于表头全选,仅作用于当前页,跨页勾选仍保留) */ private getCurrentPageLines; isLineChecked(line: FormGroup): boolean; isAllChecked(): boolean; isIndeterminate(): boolean; onAllChecked(checked: boolean): void; onLineCheckedChange(line: FormGroup, checked: boolean): void; private emitSelectionChange; private removeLineFromSelection; private applyValuesToLine; /** * 仅在用户交互后、且当前值确实为空的 required 错误时展示红框, * 避免批量赋值时 ng-zorro 残留「不能为空」提示 */ getControlValidateStatus(line: FormGroup, formItem: FormLine): string; /** 用户输入时按 maxLength 截断(不使用原生 maxlength,避免干扰程序化赋值) */ limitInputLength(event: Event, line: FormGroup, formItem: FormLine): void; /** 获取当前勾选且已挂载的行 FormGroup(当前筛选结果内) */ getSelectedLines(): FormGroup[]; /** * 获取全部勾选行数据(含跨页、搜索后未展示但仍勾选的行) */ getSelectedLinesData(): any[]; /** * 批量填充勾选行字段(支持跨页、搜索后未展示但仍勾选的行) * @param values 要写入的字段,如 { remark: '批量备注', price: 10 } * @param emitEvent 是否触发 valueChanges / onChangeEvent,默认 true * @returns 实际填充的行数 */ batchFillSelected(values: { [field: string]: any; }, emitEvent?: boolean): number; /** 清空勾选 */ clearSelection(): void; /** 当前勾选数量(含跨页、搜索保留) */ getSelectedCount(): number; /** 是否展示顶部工具栏 */ readonly showToolbar: boolean; /** 是否展示列设置齿轮(有可配置 ViewDom 时) */ readonly showColSettingsButton: boolean; /** 列是否渲染:hide 永不展示;ViewDom 受 isShow 控制 */ isColumnVisible(item: FormLine): boolean; /** 可进入列设置的字段:非 hide 的 ViewDom */ getConfigurableFormLines(): FormLine[]; private getCacheKey; private initColSettings; private hasColsCache; private saveFormLinesCacheOption; /** 按 formLines 原始顺序排列节点(禁止调序时保持源顺序) */ private sortNodesByFormLinesOrder; setCols(): void; cancelDropdown(): void; confirmDropdown(): void; submitGrids(): void; /** 勾选/取消:仅在显示/隐藏两组间移动,不改变 formLines 顺序 */ checkAction(event: NzFormatEmitEvent): void; setActiveSelectedComponentOpen(value: boolean): void; getSelectTableColumnStyle(column: SelectOptionTableColumn): { [key: string]: string; }; createDOMStructure(formItem: any, line: any): HTMLDivElement; collectDomData(): void; /** * ng-zorro 8 在 input 的 onKeyDown 里用上下键调 up()/down() 改 step。 * 只覆盖 onKeyDown(不动 up/down),键盘方向键交给表单跳转,+/- 按钮仍可用。 */ private disableInputNumberKeyboardStep; jumpToNextInput(x: number, y: number): void; /** * 增加新行并且聚焦到第一个元素, * 这里要注意,如果存在翻页情况,需要处理 */ addNewLineAndFocus(): void; jumpToPrevInput(x: number, y: number): void; /** * 聚焦到某个dom * @param x 坐标x * @param y 坐标y * @param jumpDirection 跳转方向 */ focusDom(x: number, y: number, jumpDirection?: string): void; cleanFocusDom(x: number, y: number): void; setActiveDom(x: number, y: number): void; /** * 根据行号和列号名称获取当前聚焦的dom位置 * @param rowNumber 行号 * @param colNumber 列号 */ setActiveDomInFormLines(rowNumber: number, colNumber: number): void; /** * 键盘点击事件 * @param event 键盘事件 * @returns */ onKeyDown(event: KeyboardEvent): void; /** * 根据在初始dom下标和数据集 获取在collectDomList中的下标 * @param index 初始下标 * @param list 老数据集 * @returns */ private getDomIndex; /** * 根据在collectDomList中的下标和数据集 获取初始dom下标 * @param index 新下标 * @param list 老数据集 * @returns */ private getOldDomIndex; readonly linesFormArray: any; readonly LodashRound: any; getValid(): boolean; onSearchEvent(fn: any, event: any, line: any, onSearchEventDebounceTime: any): void; onOpenChangeEvent(fn: any, open: boolean, line: any, onOpenChangeEventDebounceTime: any, formItem?: any): void; /** 有 onOpenChangeEvent 时展开下拉先清空选项,由业务回调再写入新数据 */ private clearSelectOptionsOnOpen; /** * * @param fn 父组件函数 * @param event 事件值 * @param line 触发的行 */ triggerEvent(fn: any, event: any, line: any): void; innerGetValid(): boolean; getLines(): any[]; searchLines(): void; setStoreData(): void; getStyle(line: FormGroup, formItem: any, width: string): { "min-width": string; }; ngOnChanges(changes: SimpleChanges): void; calculateTotal(): void; private init; /** * 创建表单 */ private createForm; delayJumpToNextInput(): void; /** * 定义空的newLineItem 结构 */ private newLineItem; /** * 根据行数据创建 FormGroup(含隐藏字段、select 的 label 等附属字段) * @param formLinesDataItem 行数据,空行传 null * @param isEmptyLine 是否空行(影响必填校验规则,与历史逻辑保持一致) * @param regenerateRowId 是否强制生成新行 id(复制行时使用) */ private createLineFromValues; private calculateLineNumber; /** * 编辑的时候数据处理 */ addFormLineWithData(): void; /** * 在指定行下方新增空行;不传 afterLine 则追加到末尾 * @param afterLine 当前行 FormGroup(不要传 lineIndex,避免序号偏移导致插错位置) */ addFormLine(afterLine?: FormGroup | null, isFocus?: boolean): void; /** * 复制当前行:在当前行下方新增一行,复制所有字段值(含隐藏字段) */ copyFormLine(line: FormGroup): void; deleteLineEvent: EventEmitter<{}>; /** * 删除行 * @param lineOrIndex 行 FormGroup,或 1-based 的 lineIndex(兼容 resetForm) */ deleteFormLine(lineOrIndex: FormGroup | number): void; /** 在指定行后方的插入下标;无行则追加到末尾 */ private getInsertIndexAfter; /** 全局行下标转当前页内的行下标(供聚焦用) */ private toPageLocalRowIndex; pageIndexChange(event: number): void; pageSizeChange(event: number): void; private onHdFormValueChanged; private checkList; submitForm(): void; resetForm(): void; inputClean(formItem: any, line: any): void; selectValue(id: string, rowNumber: number, colNumber: number): void; private textWidthCache; isTextOverflow(text: string, maxWidth: number): boolean; judgeColEmpty(str: any): any; judgeValueIsNotEmpty(str: any): boolean; }