fantasy-ngzorro 2.1.21 → 2.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/fantasy-ngzorro.umd.js +29 -16
- package/bundles/fantasy-ngzorro.umd.js.map +1 -1
- package/bundles/fantasy-ngzorro.umd.min.js +2 -2
- package/bundles/fantasy-ngzorro.umd.min.js.map +1 -1
- package/esm2015/hd-button/hd-button.component.js +1 -1
- package/esm2015/hd-button-group/hd-button-group.component.js +1 -1
- package/esm2015/hd-current-table/hd-current-table.component.js +1 -1
- package/esm2015/hd-detail-form/hd-detail-form.component.js +1 -1
- package/esm2015/hd-detail-lines/hd-detail-lines.component.js +1 -1
- package/esm2015/hd-detail-lines-page/hd-detail-lines-page.component.js +1 -1
- package/esm2015/hd-detail-tip/hd-detail-tip.component.js +1 -1
- package/esm2015/hd-filter/hd-filter.component.js +1 -1
- package/esm2015/hd-form/hd-form.component.js +1 -1
- package/esm2015/hd-form-lines/hd-form-lines.component.js +17 -4
- package/esm2015/hd-popconfirm/hd-popconfirm.component.js +1 -1
- package/esm2015/hd-status/hd-status.component.js +1 -1
- package/esm2015/hd-table/hd-table.component.js +1 -1
- package/esm2015/hd-tip/hd-tip.component.js +1 -1
- package/esm5/hd-button/hd-button.component.js +1 -1
- package/esm5/hd-button-group/hd-button-group.component.js +1 -1
- package/esm5/hd-current-table/hd-current-table.component.js +1 -1
- package/esm5/hd-detail-form/hd-detail-form.component.js +1 -1
- package/esm5/hd-detail-lines/hd-detail-lines.component.js +1 -1
- package/esm5/hd-detail-lines-page/hd-detail-lines-page.component.js +1 -1
- package/esm5/hd-detail-tip/hd-detail-tip.component.js +1 -1
- package/esm5/hd-filter/hd-filter.component.js +1 -1
- package/esm5/hd-form/hd-form.component.js +1 -1
- package/esm5/hd-form-lines/hd-form-lines.component.js +17 -4
- package/esm5/hd-popconfirm/hd-popconfirm.component.js +1 -1
- package/esm5/hd-status/hd-status.component.js +1 -1
- package/esm5/hd-table/hd-table.component.js +1 -1
- package/esm5/hd-tip/hd-tip.component.js +1 -1
- package/fantasy-ngzorro.metadata.json +1 -1
- package/fesm2015/fantasy-ngzorro.js +29 -16
- package/fesm2015/fantasy-ngzorro.js.map +1 -1
- package/fesm5/fantasy-ngzorro.js +29 -16
- package/fesm5/fantasy-ngzorro.js.map +1 -1
- package/hd-form-lines/hd-form-lines.component.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/tslib/tslib.es6.js","ng://fantasy-ngzorro/hd-button-group/hd-button-group.component.ts","ng://fantasy-ngzorro/hd-button-group/hd-button-group.module.ts","ng://fantasy-ngzorro/hd-button/hd-button.service.ts","ng://fantasy-ngzorro/hd-button/hd-button.component.ts","ng://fantasy-ngzorro/hd-button/hd-button.module.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.component.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.module.ts","ng://fantasy-ngzorro/hd-space/hd-space.service.ts","ng://fantasy-ngzorro/hd-space/hd-space.component.ts","ng://fantasy-ngzorro/hd-space/hd-space.module.ts","ng://fantasy-ngzorro/model/common-type.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.component.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.module.ts","ng://fantasy-ngzorro/hd-detail-lines-page/hd-detail-lines-page.component.ts","ng://fantasy-ngzorro/hd-detail-lines-page/hd-detail-lines-page.module.ts","ng://fantasy-ngzorro/hd-status/hd-status.service.ts","ng://fantasy-ngzorro/hd-detail-tip/hd-detail-tip.component.ts","ng://fantasy-ngzorro/hd-detail-tip/hd-detail-tip.module.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.component.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.module.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.service.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.component.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.module.ts","ng://fantasy-ngzorro/hd-form/hd-form.service.ts","ng://fantasy-ngzorro/hd-form/hd-form.component.ts","ng://fantasy-ngzorro/hd-form/hd-form.module.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.component.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.module.ts","ng://fantasy-ngzorro/hd-log/hd-log.component.ts","ng://fantasy-ngzorro/hd-log/hd-log.service.ts","ng://fantasy-ngzorro/hd-log/hd-log.module.ts","ng://fantasy-ngzorro/hd-popconfirm/hd-popconfirm.component.ts","ng://fantasy-ngzorro/hd-popconfirm/hd-popconfirm.module.ts","ng://fantasy-ngzorro/hd-status/hd-status.component.ts","ng://fantasy-ngzorro/hd-status/hd-status.module.ts","ng://fantasy-ngzorro/service/common-session.service.ts","ng://fantasy-ngzorro/model/colWidth.ts","ng://fantasy-ngzorro/hd-table/hd-table-cell.pipe.ts","ng://fantasy-ngzorro/hd-table/hd-table.service.ts","ng://fantasy-ngzorro/hd-table/hd-table.component.ts","ng://fantasy-ngzorro/hd-table/hd-table.module.ts","ng://fantasy-ngzorro/hd-tip/hd-tip.component.ts","ng://fantasy-ngzorro/hd-tip/hd-tip.module.ts","ng://fantasy-ngzorro/service/hd-overlay-cleanup.service.ts","ng://fantasy-ngzorro/hd-component.module.ts","ng://fantasy-ngzorro/fantasy-ngzorro.module.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.service.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.service.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.service.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.service.ts","ng://fantasy-ngzorro/utils.ts","ng://fantasy-ngzorro/model/staticConst.ts"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__decorate","decorators","target","key","desc","d","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__metadata","metadataKey","metadataValue","metadata","__values","o","Symbol","iterator","m","next","value","done","TypeError","__read","e","ar","push","error","__spread","concat","HdButtonGroupComponent","ngOnInit","Component","args","selector","template","ContentChild","static","HdButtonGroupModule","NgModule","imports","CommonModule","FormsModule","NgZorroAntdModule","declarations","exports","primary","dashed","danger","default","link","submit","reset","add","normal","small","HdButtonService","Injectable","providedIn","HdButtonComponent","type","ButtonType","size","ButtonSize","disabled","clickAction","EventEmitter","nzOnConfirm","loading","observers","innerClickAction","option","emit","Input","Output","tslib_1.__decorate","InputBoolean","HdButtonModule","HdDetailFormComponent","formCols","Array","nzColumn","xxl","xl","lg","md","sm","xs","filter","item","hide","ngOnChanges","changes","JSON","stringify","currentValue","previousValue","triggerEvent","fn","event","HdDetailFormModule","Style","HdSpaceService","HdSpaceComponent","SpaceType","background","style","HdSpaceModule","ReactiveFormsModule","totalPages","totalElements","pageNumber","pageSize","hasContent","hasNext","content","HdOption","SelectOption","showLabelAndValue","hdDropdownMatchSelectWidth","hdServerSearch","hdShowItemCode","hdShowSearch","hdAllowClear","RadioOption","CheckboxOption","SelectOptionTableColumn","SelectOptionTableColumnIcon","InputNumber","min","max","step","precision","CascaderOption","HdDetailLinesComponent","showSelected","allowDrop","showSearch","searchFields","scroll","x","selectField","selectEvent","showTotal","totalOption","columnsNumber","hdFrontPagination","totalOptionList","tableData","Page","tableLoading","tablePageIndex","tablePageSize","isAllDisplayDataChecked","isIndeterminate","listOfDisplayData","listOfAllData","mapOfCheckedId","mapOfCheckList","displayLines","isFilterData","storeFormLinesData","syncStoreFromLinesInput","applyDisplayFromStore","countSelected","calculateTotal","lines","source","data","parse","restoreFromStore","searchLines","_this","filterStr","trim","filterValue","toLowerCase","filteredData","_c","tslib_1.__values","keys","_d","toString","includes","_e","_f","selectedField","forEach","round","drop","moveItemInArray","previousIndex","currentIndex","Number","fill","insertIndex","insertValue","align","showDecimal","isHide","currentPageDataChange","$event","refreshStatus","resetStatus","every","some","values","checkAll","HdDetailLinesModule","NzTableModule","DragDropModule","schemas","NO_ERRORS_SCHEMA","HdDetailLinesPageComponent","tablePageIndexChange","tablePageSizeChange","pageChange","isCrossPageSelectLocal","isCrossPageSelect","getRowIndex","localIndex","onPageIndexChange","pageIndex","onPageSizeChange","HdDetailLinesPageModule","statusToColor","#FAB13B","#9FA4A2","#F5222D","#3B77E3","#20B95D","#F05B24","HdDetailTipComponent","HdStatusService","tip","setStatusColor","findKey","state","indexOf","toUpperCase","statusColor","HdDetailTipModule","HdFilterComponent","fb","searchEvent","resetEvent","isShowMore","filterListModular","searchSubject","Subject","debounceTimeout","searchSubscription","pipe","debounceTime","subscribe","_a","selectOption","init","checkList","filterList","formGroupList","index","name","control","show","validateFilterForm","group","onChangeEvent","onChangeEventDebounceTime","get","valueChanges","onSearchEvent","onSearchEventDebounceTime","unsubscribe","computeOffset","list","nameList","tslib_1.__spread","Set","submitForm","getRawValue","resetForm","resetFilterFormWithValue","resetValue","patchValue","getFilterData","showMore","inputClean","patchObject","FormBuilder","HdFilterModule","require","hideViewDomValue","inputNumber","hdShowToday","showTime","canSearch","ColorOption","ExplainOption","Select","Date","DateRange","TextArea","MultipleSelect","ViewDom","Switch","Time","HdFormLinesService","HdFormLinesComponent","cdr","showLineNumber","allowEmpty","deleteLastLineEvent","showKeyboardOperateTip","showCheckbox","operateButtons","changeEvent","selectionChange","showDeleteConfirm","paginationPageIndex","paginationPageSize","showForm","filterStoreFormLinesData","filterIndexStore","formValid","selectedRowIds","openChangeSubject","openChangeDebounceTimeout","collectDomList","activeDomX","activeDomY","activeDom","activeSelectedComponentOpen","deleteLineEvent","textWidthCache","line","openChangeSubscription","formLinesData","ngAfterViewInit","collectDomData","formInputDomListSub","formInputDomList","ngOnDestroy","linesFormArray","controls","count","btn","Math","buttons","generateRowId","now","random","slice","getRowId","getCurrentPageLines","start","end","isLineChecked","id","has","isAllChecked","pageLines","checkedCount","onAllChecked","checked","delete","emitSelectionChange","onLineCheckedChange","getSelectedLines","markForCheck","removeLineFromSelection","applyValuesToLine","emitEvent","addControl","setValue","markAsPristine","onlySelf","markAsUntouched","updateValueAndValidity","formItem","formLines","find","detectChanges","getControlValidateStatus","empty","undefined","dirty","touched","hasError","limitInputLength","maxLength","input","getSelectedLinesData","result","mountedById","Map","set","_hdRowId","batchFillSelected","storeItem","clearSelection","clear","getSelectedCount","formLinesLeftButton","formLinesRightButton","setActiveSelectedComponentOpen","setTimeout","domList","document","querySelectorAll","dom","header","remove","oldIndex","getOldDomIndex","insertBefore","createDOMStructure","firstChild","getSelectTableColumnStyle","column","width","hdOptionHeader","createElement","className","paddingLeft","SELECT_TABLE_OPTION_HORIZONTAL_PADDING","paddingRight","tableColumns","selectOptionTableColumn","columnDiv","widthStyle","label","labelText","createTextNode","appendChild","pageDomList","toArray","startIndex","endIndex","pageLinesLength","formLinesLength","interval","splice","disableInputNumberKeyboardStep","j","this_1","NzInputNumberComponent","onKeyDown","keyCode","setValidateValue","jumpToNextInput","y","NzSelectComponent","console","log","focusDom","addNewLineAndFocus","ceil","addFormLine","jumpToPrevInput","jumpDirection","cleanFocusDom","dom_1","nzDisabled","nzSelectTopControlComponent","inputElement","nativeElement","scrollIntoView","behavior","block","inline","nzSelectService","mode","focus","inputDom_1","getElementById","nzId","select","ElementRef","NzDatePickerComponent","NzRangePickerComponent","NzTimePickerComponent","setActiveDom","blur","nzOpen","open","setActiveDomInFormLines","rowNumber","colNumber","getDomIndex","nowActiveDom_1","test","typeList","validateHdFormLines","getValid","debounceMs","onOpenChangeEvent","onOpenChangeEventDebounceTime","innerGetValid","tmpValidateHdFormLines","array","formLinesDataItem","formGroupObj","judgeValueIsNotEmpty","Validators","required","lineIndex","formGroupTmp","insert","valid","getLines","allLines","setStoreData","_b","getStyle","styleObj","min-width","colorOption","color","isEdit","createForm","addFormLineWithData","isTrulyEmptyAllowed","onHdFormValueChanged","newLine","newLineItem","delayJumpToNextInput","createLineFromValues","isEmptyLine","regenerateRowId","rowId","isHdFormLineSearchAdd","formGroupSubmit","handleChange","FormLineType","calculateLineNumber","afterLine","isFocus","insertAt","getInsertIndexAfter","floor","toPageLocalRowIndex","copyFormLine","sourceIndex","sourceValues","deleteFormLine","lineOrIndex","removeAt","removedLine","at","maxPage","idx","globalIndex","pageIndexChange","pageSizeChange","lines_1","getNowLines","addIndex","deletedIndex_1","filterIndex_1","pop","selectOptionCheckList","innerItem","selectValue","querySelector","isTextOverflow","text","maxWidth","cachedWidth","span","visibility","position","whiteSpace","fontSize","display","innerText","body","isOverflow","offsetWidth","removeChild","judgeColEmpty","str","ChangeDetectorRef","ViewChildren","HdFormLinesModule","totalWidth","isRowFirst","ValidatorKey","Cascader","Radio","Checkbox","HdFormService","HdFormComponent","inputNumberDefaultFormatter","inputNumberDefaultParser","formList","dealRow","year","month","day","newDateStr","toLocaleDateString","replace","validator","formItemDate","map","FormListType","checkboxOption","checkboxValue","isArray","validateHdForm","formListLength","columnItems","space","markAsDirty","isCheckboxChecked","current","onCheckboxItemChange","HdFormModule","HdCurrentTableComponent","showTableTotal","tableSearchEvent","tableTotalOptionList","search","selectedList","HdCurrentTableModule","HdLogComponent","HdLogService","modalService","showLogs","logs","create","nzTitle","nzContent","nzComponentParams","nzFooter","nzWidth","NzModalService","HdLogModule","entryComponents","providers","HdPopconfirmComponent","confirmOption","cancelOption","cancel","confirm","HdPopconfirmModule","bootstrap","STATUS_COLOR_MAP","HdStatusComponent","statusLower","status","HdStatusModule","CommonSessionService","putSession","session_key","session","window","sessionStorage","setItem","removeItem","getSession","getItem","removeSession","ColWidth","tableImageColWidth","tableTwoImageColWidth","billNumberColWidth","nameColWidth","codeColWidth","codeNameColWidth","enumColWidth","dateColWidth","dateTimeColWidth","dateRangeWidth","operateColWidth","numberColWidth","remarkColWidth","fixColWidth","maxColWidth","HdTableCellPipe","transform","col","title","isEmpty","overflow","raw","render","getHdTableCellRaw","String","charCodeAt","estimateTextWidth","Pipe","pure","fixed","btnList","isShow","canSort","canWarp","OperateBtn","showConfirm","isRepeat","HdTableTotalOption","TableCacheOption","colWidths","selectable","isLeaf","expanded","HdTableComponent","commonSessionService","tableCols","showOperateColWarpButton","virtualScroll","sortEvent","tablePageSizeChangeEvent","tableCacheOption","tableColsCache","showTable","selectColListNodes","selectColListNodesCache","showListNodes","isDropdownVisible","nowListNodes","hideListNodes","cancelNowListNodes","cancelHideListNodes","showDetail","localforage","localtionTmp","isFirstEntrySearchLocal","measuredVirtualItemSize","virtualScrollActive","tableColWidthTotal","trackByRow","virtualTrackByRow","trackByCol","_index","beforeDrop","arg","node","origin","dragNode","pos","of","TreeGrid","dragNodeIndex","findIndex","nodeIndex","delay","localforage.createInstance","driver","localforage.INDEXEDDB","version","storeName","isFirstEntrySearch","location","pathname","userSession","userCode","deleteHideItem","ready","then","getInitLocalforage","catch","applyTableScrollMode","sort","toggleShowDetail","refreshVirtualScrollViewport","virtualItemSize","rowCount","maxOffset","tableTotal","estimatedHeight","effectiveVirtualItemSize","innerHeight","uuid","normalizeTableCacheOption","initTable","err","judgeRepeatCols","dealCols","setCols","dealOperateBtn","forceRemount","useVirtual","useVirtualScroll","modeChanged","dealScroll","afterTableRender","measureVirtualItemSize","syncHorizontalScroll","forceMeasure","viewport","nzTableComponent","cdkVirtualScrollViewport","checkViewportSize","force","tableBody","row","elementRef","offsetHeight","height","cancelDropdown","confirmDropdown","submitGrids","cols","saveTableCacheOption","hasColsCache","reduce","notIncols","incols","a","b","element","moveElementNearby","arr","elementToMoveTitle","targetElementTitle","tmpArray","targetIndex","elementIndex","newIndex","removedElement","checkAction","title_1","temporaryNodeList","temporaryNodeList_1","getHideListNodes","nodeItem","minWidth","leftFixedCols","rightFixedCols","normalCols","resultCols","colWidths_1","onResize","tempWidth","operateCol","textStr_1","needShowConfirm","getVirtualScrollY","getTableViewportWidth","tableMainElement","tableMain","wrapper","closest","clientWidth","host","resolveScrollX","colWidth","viewportWidth","innerWidth","scrollX","fixedWidth","getStateField","isState","stateField","changeDetection","ChangeDetectionStrategy","OnPush","ViewChild","HdTableModule","NzToolTipModule","NzPopconfirmModule","NzResizableModule","NzDropDownModule","NzTreeModule","NzIconModule","HdTipComponent","showIcon","HdTipModule","HdOverlayCleanupService","router","started","addEventListener","clearStuckTooltips","events","NavigationStart","el","pane","parentNode","Router","Optional","HdComponentModule","_overlayCleanup","FantasyNgzorroModule","HdDetailFormService","TotalOption","Month","HdFilterService","Utils","fillSelectOption","options","returnData","selectList","fillArrayFormItem","obj","arrayToSelectOptionList","labelTip","valueTip","returnItem","nums","Error","num","nums_1","nums_1_1","subtract","shift","nums_2","nums_2_1","multiply","nums_3","nums_3_1","divide","nums_4","nums_4_1","MaxPageSize"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, ContentChild, Input, OnInit, TemplateRef } from '@angular/core';\n\n@Component({\n selector: 'hd-button-group',\n templateUrl: './hd-button-group.component.html',\n styleUrls: ['./hd-button-group.component.less']\n})\nexport class HdButtonGroupComponent implements OnInit {\n @ContentChild(\"buttonGroupLeft\", { static: false }) buttonGroupLeft: TemplateRef<any>;\n @ContentChild(\"buttonGroupRight\", { static: false }) buttonGroupRight: TemplateRef<any>;\n\n constructor() { }\n\n ngOnInit() {\n\n }\n}\n","import { HdButtonGroupComponent } from './hd-button-group.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdButtonGroupComponent],\n exports: [HdButtonGroupComponent]\n})\nexport class HdButtonGroupModule { }\n","import { Injectable } from '@angular/core';\n\nexport enum ButtonType {\n primary = 'primary',\n dashed = 'dashed',\n danger = 'danger',\n default = 'default',\n link = 'link',\n submit = 'submit',\n // 增加类型\n reset = 'reset',\n add = 'add'\n}\n\nexport enum ButtonSize {\n normal = 'normal',\n small = 'small'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdButtonService {\n\n constructor() { }\n\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { InputBoolean } from 'ng-zorro-antd';\nimport { ButtonSize, ButtonType } from './hd-button.service';\n@Component({\n selector: 'hd-button',\n templateUrl: './hd-button.component.html',\n styleUrls: ['./hd-button.component.less']\n})\nexport class HdButtonComponent implements OnInit {\n\n // 默认default\n @Input() type: ButtonType = ButtonType.default;\n @Input() size: ButtonSize = ButtonSize.normal;\n @Input() @InputBoolean() loading: boolean;\n @Input() @InputBoolean() disabled: boolean = false;\n @Output() clickAction = new EventEmitter<any>();\n @Output() nzOnConfirm = new EventEmitter<any>();\n constructor() { }\n\n ngOnInit() {\n if ((this.loading === false || this.loading === true) && this.clickAction.observers.length === 0 && this.nzOnConfirm.observers.length === 0) {\n throw '存在loading效果的hd-button组件禁止使用click绑定点击事件,请使用clickAction绑定!';\n }\n if (this.type === 'submit') {\n throw '禁止使用submit类型的按钮,请使用普通按钮+click事件触发表单提交!';\n }\n }\n\n /** loading 时一并禁用,避免与外部 [disabled] 绑定互相翻转状态 */\n get isDisabled(): boolean {\n return this.disabled || this.loading;\n }\n\n innerClickAction(option: any) {\n // loading 状态下,不允许触发点击事件\n if (this.loading) {\n return;\n }\n this.clickAction.emit(option);\n }\n}\n","import { HdButtonComponent } from './hd-button.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdButtonComponent],\n exports: [HdButtonComponent]\n})\nexport class HdButtonModule { }\n","import { Component, Input, OnInit, SimpleChange } from '@angular/core';\nimport { HdOption } from '../model/common-type';\n\n@Component({\n selector: 'hd-detail-form',\n templateUrl: './hd-detail-form.component.html',\n styleUrls: ['./hd-detail-form.component.less']\n})\nexport class HdDetailFormComponent implements OnInit {\n @Input() formCols: Array<HdOption> = new Array();\n /** 列数,支持数字或响应式配置,默认按屏幕宽度自适应 */\n @Input() nzColumn: number | { xxl?: number; xl?: number; lg?: number; md?: number; sm?: number; xs?: number } =\n { xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 };\n\n constructor() { }\n\n ngOnInit() {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n\n ngOnChanges(changes: SimpleChange) {\n if (changes['formCols'] && JSON.stringify(changes['formCols'].currentValue) !== JSON.stringify(changes['formCols'].previousValue)) {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n }\n\n triggerEvent(fn: any) {\n if (fn) {\n fn(event);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdDetailFormComponent } from './hd-detail-form.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule\n ],\n exports: [HdDetailFormComponent],\n declarations: [HdDetailFormComponent]\n})\nexport class HdDetailFormModule { }\n","import { Injectable } from '@angular/core';\n\nexport enum SpaceType {\n row = 'row',\n column = 'column'\n}\n\nexport class Style {\n background: string\n width: string\n height: string\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdSpaceService {\n\n constructor() { }\n\n}\n","import { Component, Input, OnInit, Output } from '@angular/core';\nimport { Style, SpaceType } from \"./hd-space.service\"; \n\n@Component({\n selector: 'hd-space',\n templateUrl: './hd-space.component.html',\n styleUrls: ['./hd-space.component.less']\n})\nexport class HdSpaceComponent implements OnInit {\n @Input() type: SpaceType = SpaceType.row; \n @Input() size: number; \n @Input() background: string = 'inherit'; \n\n style: Style = new Style();\n\n constructor() { }\n\n ngOnInit() {\n this.style['background'] = this.background;\n if(this.type === SpaceType.row){\n this.style['width'] = '100%';\n this.style['height'] = this.size + 'px';\n }else{\n this.style['height'] = '100%';\n this.style['width'] = this.size + 'px';\n }\n }\n\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdSpaceComponent } from './hd-space.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdSpaceComponent],\n exports: [HdSpaceComponent]\n})\nexport class HdSpaceModule { }\n","export class Page<T> {\n totalPages = 0;\n totalElements = 0;\n pageNumber = 0;\n pageSize = 10;\n hasContent = false;\n hasNext = false;\n content: Array<T> = [];\n}\n\nexport class HdOption {\n label: string;\n value: any;\n color?: string;\n hide?: boolean;\n clickText?: string;\n click?: (value: any) => void;\n}\n\nexport class SelectOption {\n label: string;\n value: string;\n selectList?: Array<any>;\n selectListName?: string;\n showLabelAndValue?: boolean = false;\n hdDropdownMatchSelectWidth?: boolean = false;\n hdServerSearch?: boolean = false;\n hdShowItemCode?: boolean = false; // 是否用[value]label显示选项列表\n tableColumns?: Array<SelectOptionTableColumn>;\n hdShowSearch?: boolean = true;\n hdAllowClear?: boolean = true;\n}\n\nexport class RadioOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class CheckboxOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class SelectOptionTableColumn {\n width: number;\n label: string; // 这里对应的是列名\n name: string; // 对应selectList里面的name值, 如果有render字段 则去render函数渲染\n icons?: Array<SelectOptionTableColumnIcon>; // 对应的图片名字\n render?: (value: any) => string;\n}\n\nexport class SelectOptionTableColumnIcon {\n iconName: string;\n fieldName: string;\n}\n\nexport class InputNumber {\n min?: number = 0;\n max?: number = 99999999;\n step?: number = 1;\n precision?: number = 4;\n nzFormatter?: Function;\n nzParser?: Function;\n}\n\nexport class CascaderOption {\n options: Array<any>;\n}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"./hd-detail-lines.service\";\n\n@Component({\n selector: \"hd-detail-lines\",\n templateUrl: \"./hd-detail-lines.component.html\",\n styleUrls: [\"./hd-detail-lines.component.less\"],\n})\nexport class HdDetailLinesComponent implements OnInit, OnChanges {\n @Input() lines: Array<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() allowDrop: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n // 不传递这个字段时默认为查询所有字段是否有匹配的\n @Input() searchFields: string[] = [];\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n @Output() selectEvent = new EventEmitter();\n @ContentChild(\"detailLineHead\", { static: false })\n detailLineHead: TemplateRef<any>;\n @ContentChild(\"detailLineBody\", { static: false })\n detailLineBody: TemplateRef<any>;\n // 合计区域\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n @Input() hdFrontPagination: boolean = false;\n totalOptionList = [];\n\n tableData: Page<any> = new Page();\n tableLoading: boolean = false;\n // 表格分页参数\n tablePageIndex: number = 1;\n @Input() tablePageSize: number = 100;\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n filterStr: string;\n /** 表格实际展示的数据(筛选结果或全量) */\n displayLines: Array<any> = [];\n /** 是否处于筛选状态 */\n isFilterData = false;\n storeFormLinesData: any = []; // 缓存的总的列表数据\n\n constructor() {}\n\n ngOnInit(): void {\n this.syncStoreFromLinesInput();\n this.applyDisplayFromStore();\n this.countSelected();\n this.calculateTotal();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes[\"lines\"]) {\n if (!this.isFilterData) {\n this.syncStoreFromLinesInput();\n this.displayLines = this.lines || [];\n } else if (\n !this.storeFormLinesData ||\n this.storeFormLinesData.length === 0\n ) {\n this.syncStoreFromLinesInput();\n }\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n private syncStoreFromLinesInput(source?: Array<any>): void {\n const data = source || this.lines;\n this.storeFormLinesData = data ? JSON.parse(JSON.stringify(data)) : [];\n }\n\n /** 未筛选时与父组件 lines 同源,避免模板内 ngModel 与父数据脱节 */\n private applyDisplayFromStore(): void {\n if (this.lines && this.lines.length > 0) {\n this.displayLines = this.lines;\n return;\n }\n this.displayLines = this.storeFormLinesData\n ? JSON.parse(JSON.stringify(this.storeFormLinesData))\n : [];\n }\n\n private restoreFromStore(): void {\n this.isFilterData = false;\n this.applyDisplayFromStore();\n this.tableLoading = false;\n this.countSelected();\n this.calculateTotal();\n }\n\n // 全局性的搜索(涵盖页面上所有的可视文字)\n searchLines() {\n // 清空搜索:即使当前展示为空也要能从缓存恢复(对齐 hd-form-lines)\n if (!this.filterStr || !this.filterStr.trim()) {\n if (!this.storeFormLinesData || this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n this.restoreFromStore();\n return;\n }\n if (!this.storeFormLinesData || this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n const filterValue = this.filterStr.trim().toLowerCase();\n this.isFilterData = true;\n\n const filteredData = this.storeFormLinesData.filter((data: any) => {\n if (!this.searchFields || this.searchFields.length === 0) {\n for (const item of Object.keys(data)) {\n if (\n data[item] &&\n data[item].toString().toLowerCase().includes(filterValue)\n ) {\n return true;\n }\n }\n return false;\n }\n for (const item of this.searchFields) {\n if (\n data[item] &&\n data[item].toString().toLowerCase().includes(filterValue)\n ) {\n return true;\n }\n }\n return false;\n });\n this.displayLines = JSON.parse(JSON.stringify(filteredData));\n this.tableLoading = false;\n this.countSelected();\n this.calculateTotal();\n }\n\n private countSelected(): void {\n if (\n this.showSelected &&\n this.selectedField &&\n this.displayLines &&\n this.displayLines.length\n ) {\n this.displayLines.forEach((item) => {\n if (item[this.selectedField] === true) {\n this.mapOfCheckedId[item[this.selectField]] = true;\n this.mapOfCheckList[item[this.selectField]] = item;\n }\n });\n if (\n this.displayLines.length === Object.keys(this.mapOfCheckList).length\n ) {\n this.isAllDisplayDataChecked = true;\n this.isIndeterminate = true;\n }\n }\n }\n\n get LodashRound() {\n return round;\n }\n\n drop(event: CdkDragDrop<string[]>): void {\n moveItemInArray(this.displayLines, event.previousIndex, event.currentIndex);\n this.displayLines = JSON.parse(JSON.stringify(this.displayLines));\n if (!this.isFilterData) {\n this.storeFormLinesData = JSON.parse(JSON.stringify(this.displayLines));\n }\n }\n\n calculateTotal() {\n // 这里处理合计数据\n if (this.showTotal && this.displayLines && this.displayLines.length) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"right\",\n showDecimal: item.showDecimal || false,\n isHide: item.isHide || false,\n };\n }\n });\n }\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n this.selectEvent.emit(Object.values(this.mapOfCheckList));\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n }\n}\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { HdButtonGroupModule } from \"../hd-button-group/hd-button-group.module\";\nimport { NgZorroAntdModule } from \"ng-zorro-antd\";\nimport { NzTableModule } from \"ng-zorro-antd/table\";\nimport { HdButtonModule } from \"../hd-button/hd-button.module\";\nimport { HdSpaceModule } from \"../hd-space/hd-space.module\";\nimport { HdDetailLinesComponent } from \"./hd-detail-lines.component\";\n\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n DragDropModule,\n FormsModule,\n NgZorroAntdModule,\n HdSpaceModule,\n HdButtonModule,\n HdButtonGroupModule,\n ],\n declarations: [HdDetailLinesComponent],\n exports: [HdDetailLinesComponent],\n schemas: [NO_ERRORS_SCHEMA],\n})\nexport class HdDetailLinesModule {}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\n\n@Component({\n selector: \"hd-detail-lines-page\",\n templateUrl: \"./hd-detail-lines-page.component.html\",\n styleUrls: [\"./hd-detail-lines-page.component.less\"],\n})\nexport class HdDetailLinesPageComponent implements OnInit, OnChanges {\n @Input() lines: Array<any> = [];\n /** 与 hd-table 一致,可传 Page 对象;未传 lines 时使用 tableData.content */\n @Input() tableData: Page<any> = new Page();\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() allowDrop: boolean = false;\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n @Input() isCrossPageSelect: boolean;\n @Output() selectEvent = new EventEmitter();\n @ContentChild(\"detailLineHead\", { static: false })\n detailLineHead: TemplateRef<any>;\n @ContentChild(\"detailLineBody\", { static: false })\n detailLineBody: TemplateRef<any>;\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n @Input() tableLoading: boolean = false;\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 100;\n @Output() tablePageIndexChange = new EventEmitter<number>();\n @Output() tablePageSizeChange = new EventEmitter<number>();\n @Output() pageChange = new EventEmitter<void>();\n\n totalOptionList = [];\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n isCrossPageSelectLocal: boolean = false;\n\n constructor() {}\n\n ngOnInit(): void {\n if (this.isCrossPageSelect === true) {\n this.isCrossPageSelectLocal = this.isCrossPageSelect;\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n changes &&\n changes[\"tableData\"] &&\n changes[\"tableData\"][\"currentValue\"] &&\n changes[\"tableData\"][\"previousValue\"]\n ) {\n if (\n changes[\"tableData\"][\"currentValue\"][\"pageSize\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageSize\"] ||\n changes[\"tableData\"][\"currentValue\"][\"pageNumber\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageNumber\"]\n ) {\n this.countSelected();\n this.calculateTotal();\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n get displayLines(): Array<any> {\n if (this.lines && this.lines.length) {\n return this.lines;\n }\n return (this.tableData && this.tableData.content) || [];\n }\n\n get totalCount(): number {\n if (this.tableData && this.tableData.totalElements != null) {\n return this.tableData.totalElements;\n }\n return this.displayLines.length;\n }\n\n getRowIndex(localIndex: number): number {\n return (this.tablePageIndex - 1) * this.tablePageSize + localIndex;\n }\n\n onPageIndexChange(pageIndex: number): void {\n this.tablePageIndex = pageIndex;\n this.tablePageIndexChange.emit(this.tablePageIndex);\n this.pageChange.emit();\n }\n\n onPageSizeChange(pageSize: number): void {\n this.tablePageSize = pageSize;\n this.tablePageIndex = 1;\n this.tablePageSizeChange.emit(this.tablePageSize);\n this.tablePageIndexChange.emit(this.tablePageIndex);\n this.pageChange.emit();\n }\n\n private countSelected(): void {\n if (\n this.showSelected &&\n this.selectedField &&\n this.displayLines &&\n this.displayLines.length\n ) {\n this.displayLines.forEach((item) => {\n if (item[this.selectedField] === true) {\n this.mapOfCheckedId[item[this.selectField]] = true;\n this.mapOfCheckList[item[this.selectField]] = item;\n }\n });\n if (\n this.displayLines.length === Object.keys(this.mapOfCheckList).length\n ) {\n this.isAllDisplayDataChecked = true;\n this.isIndeterminate = true;\n }\n }\n }\n\n get LodashRound() {\n return round;\n }\n\n drop(event: CdkDragDrop<string[]>): void {\n const lines = [...this.displayLines];\n moveItemInArray(lines, event.previousIndex, event.currentIndex);\n this.lines = lines;\n }\n\n calculateTotal() {\n if (this.showTotal && this.displayLines && this.displayLines.length) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"right\",\n showDecimal: item.showDecimal || false,\n isHide: item.isHide || false,\n };\n }\n });\n }\n }\n\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n if (this.selectEvent) {\n this.selectEvent.emit(Object.values(this.mapOfCheckList));\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n }\n}\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\nimport { NzTableModule } from \"ng-zorro-antd/table\";\nimport { HdDetailLinesPageComponent } from \"./hd-detail-lines-page.component\";\n\n@NgModule({\n imports: [CommonModule, NzTableModule, DragDropModule],\n declarations: [HdDetailLinesPageComponent],\n exports: [HdDetailLinesPageComponent],\n schemas: [NO_ERRORS_SCHEMA],\n})\nexport class HdDetailLinesPageModule {}\n","import { Injectable } from '@angular/core';\n\n/**\n * 状态码 → 颜色(来源:sunan-server 业务 *State/*Status 枚举全量去重)\n * 已排除:银行支付 / AGV / HTTP StatusCode\n * 颜色语义:\n * 黄-过程中/中间态;灰-初始未开始/线下停用类;红-作废拒绝失效;\n * 蓝-审核流转中;绿-完成启用生效;橙-部分完成/预警\n */\nexport const statusToColor = {\n // 黄色:过程中 / 中间态 / 待处理动作\n '#FAB13B': [\n 'partshipped', 'partShipped', 'committed', 'COMMITTED', 'partValid', 'confirm', 'picking',\n 'prepareSubmitted', 'prepareConfirmed', 'receiving', 'shipping', 'delivering', 'approving',\n 'tendering', 'forPick', 'forPickup', 'forMove', 'forLoss', 'forMachiningTask', 'forReturn',\n 'forTransfer', 'forWholesale', 'outTransit', 'unconfirmedPrice', 'reSubmitted', 'submit',\n 'firstReview', 'Locked', 'beingUsed', 'transferLock', 'agvTransferLock', 'suspend',\n 'collected', 'merged', 'planCared', 'toBeConfirm', 'toBePaid', 'UNRECEIVED',\n '开票中', '红冲开票中', '待生效',\n ],\n // 灰色:初始 / 未开始 / 未提交 / 线下停用 / 未读未打印\n '#9FA4A2': [\n 'initial', 'INITIAL', 'INIT', 'uncommitted', 'OFF_LINE', 'UN_PRINTED', 'unpublish', 'pastpublish',\n 'TO_COMMIT', 'unpublished', 'UNPUBLISHED', '未审核', 'returned', 'saved', 'SAVED', 'unaudited',\n 'UN_AUDIT', 'unlock', 'free', 'unKnow', 'noSign', 'NOT_INVOICED', 'notConfirm', 'unshipped',\n 'unPlanCar', 'UNREAD', 'UNSEND', '未提交', '未确认', '已保存',\n ],\n // 红色:删除 / 作废 / 拒绝 / 失效 / 禁用\n '#F5222D': [\n 'delete', 'deleted', 'DELETED', 'abort', 'ABORTED', 'aborted', 'rejected', 'REJECTED',\n '停用', '禁用', '已停用', 'unpicked', 'AUDIT_REJECT', 'invalid', 'INVALID', 'disabled', 'DISABLED',\n '', 'canceled', 'cancelled', 'BLANK_OUT', 'complaintRejected', 'prepareRejected',\n 'returnedBeforeAudit', 'RETURNED_BEFORE_AUDIT', 'returnedBeforeConfirm', 'handleReturned',\n 'TAKE_DOWN', 'expired', 'paidFailed', 'submitFailed', 'exception',\n '已作废', '已删除', '已失效',\n ],\n // 蓝色:已审核 / 提交后流转 / 处理中\n '#3B77E3': [\n 'audited', 'adjusted', 'invoiced', 'INVOICED', 'audit', 'submitted', 'SUBMITTED', 'TO_AUDIT',\n '已审核', '处理中', 'processing', 'firstReviewed', 'awaiting_effective', 'AWAITING_EFFECTIVE',\n 'checking', 'reviewed', 'running', 'SENT', 'uploaded', 'snapped', 'handling',\n '已提交', '已初审', '已复审', '已分配', '已生成费用单',\n ],\n // 绿色:完成 / 成功 / 启用 / 生效\n '#20B95D': [\n 'shipped', 'SHIPPED', 'received', 'RECEIVED', 'checked', 'using', 'USING', 'reverse', 'valid',\n 'approved', 'ON_LINE', 'finished', 'FINISHED', 'finish', 'opened', 'PRINTED', '启用', 'picked',\n 'published', 'PUBLISHED', 'AUDITED', '已收票', '付款完成', '收款完成', '已收款', 'accepted',\n 'offered', 'confirmed', 'effective', 'EFFECTIVE', '已发布', 'paid', 'successful', 'READ',\n 'signed', 'ON_SALE', 'enabled', 'entrucked', 'normal', 'statemented',\n '已付款', '已核销', '已开票', '已完成', '已确认', '已红冲', '已结束', '已发货', '已收货',\n ],\n // 橙色:部分完成 / 打印后修改 / 临期预警\n '#F05B24': [\n 'partialReceived', 'partDelete', 'tender', 'MODIFIED_AFTER_PRINTED', '部分付款', '部分收款',\n 'partPublished', 'partOffered', 'partInvoiced', 'partStatemented', '部分核销', 'willExpired',\n 'supplierConfirmed',\n ],\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdStatusService {\n constructor() {\n }\n}\n","import { Component, Input, OnInit, SimpleChange } from \"@angular/core\";\nimport { statusToColor } from \"../hd-status/hd-status.service\";\n\n@Component({\n selector: \"hd-detail-tip\",\n templateUrl: \"./hd-detail-tip.component.html\",\n styleUrls: [\"./hd-detail-tip.component.less\"],\n})\nexport class HdDetailTipComponent implements OnInit {\n constructor() {}\n @Input() state: string;\n @Input() stateText: string;\n @Input() billNumber: string;\n @Input() tip: string = \"详情\";\n statusColor: string;\n\n ngOnInit() {\n this.setStatusColor();\n }\n\n ngOnChanges() {\n this.setStatusColor();\n }\n\n setStatusColor() {\n let findKey = '';\n for (let key in statusToColor) {\n if (\n this.state &&\n (statusToColor[key].indexOf(this.state) !== -1 ||\n statusToColor[key].indexOf(this.state.toUpperCase()) !== -1 ||\n statusToColor[key].indexOf(this.state.toLowerCase()) !== -1)\n ) {\n findKey = key;\n }\n }\n if (findKey) {\n this.statusColor = findKey;\n } else {\n this.statusColor = '#9FA4A2';\n }\n }\n}\n","import { HdDetailTipComponent } from './hd-detail-tip.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdDetailTipComponent],\n exports: [HdDetailTipComponent]\n})\nexport class HdDetailTipModule { }\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { Filter } from './hd-filter.service';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n@Component({\n selector: 'hd-filter',\n templateUrl: './hd-filter.component.html',\n styleUrls: ['./hd-filter.component.less']\n})\nexport class HdFilterComponent implements OnInit {\n\n @Input() filterList: Array<Filter>;\n @Output() searchEvent = new EventEmitter();\n @Output() resetEvent = new EventEmitter();\n\n validateFilterForm: FormGroup;\n isShowMore: boolean = true;\n // 对filterList取模运算\n filterListModular: number = 0;\n private searchSubject = new Subject<{ fn: any, event: any, selectOption?: any; }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n\n private searchSubscription: Subscription | undefined;\n constructor(private fb: FormBuilder) {\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\n }\n\n ngOnInit() {\n this.init();\n }\n\n ngOnChanges() {\n this.init();\n }\n\n private init(): void {\n this.isShowMore = true;\n // 异常捕获\n if (!this.checkList(this.filterList)) {\n throw 'filter组件数据格式不规范';\n }\n this.filterListModular = this.filterList.length % 4;\n // 首先根据定义的组件数组 去初始化表单\n let formGroupList = {};\n this.filterList.forEach((item, index) => {\n formGroupList[item.name] = this.fb.control(item.value, []);\n // 初始化控件显影\n item.show = index < 7;\n });\n this.validateFilterForm = this.fb.group(formGroupList);\n this.filterList.forEach((item) => {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n this.validateFilterForm.get(item.name).valueChanges\n .pipe(\n debounceTime(item.onChangeEventDebounceTime)\n )\n .subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n } else {\n this.validateFilterForm.get(item.name).valueChanges.subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n }\n }\n });\n }\n\n onSearchEvent(fn: any, event: any, onSearchEventDebounceTime: any, selectOption?: any) {\n if (onSearchEventDebounceTime) {\n // 更新防抖时间\n this.debounceTimeout = onSearchEventDebounceTime;\n\n // 取消之前的订阅\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n\n // 创建新的订阅\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\n\n // 发送事件\n this.searchSubject.next({ fn, event, selectOption });\n } else {\n this.triggerEvent(fn, event, selectOption);\n }\n }\n\n triggerEvent(fn: any, event: any, selectOption?: any) {\n if (fn && selectOption) {\n fn(event, selectOption);\n } else if (fn) {\n fn(event);\n } else {\n return;\n }\n }\n\n computeOffset() {\n // 特殊处理下等于4个选项的情况\n if (this.filterList.length === 4) {\n return 18;\n }\n return this.isShowMore ? ((this.filterListModular === 0 || this.filterList.length > 7) ? 0 : (3 - this.filterListModular) * 6) : (this.filterListModular === 0 ? 18 : (3 - this.filterListModular) * 6);\n }\n\n private checkList(list: Array<Filter>): boolean {\n if (!list || (list && list.length === 0)) {\n return true;\n }\n let nameList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FilterListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {\n // throw 'filter组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw 'filter组件数据格式不规范,存在重复name值!';\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n this.searchEvent.emit(this.validateFilterForm.getRawValue());\n }\n\n public resetForm(): void {\n this.resetFilterFormWithValue();\n // this.validateFilterForm.reset();\n if (this.resetEvent.observers.length > 0) {\n // 如果有父组件绑定了 resetEvent 的处理器\n this.resetEvent.emit(this.validateFilterForm.getRawValue());\n } else {\n // 如果没有绑定处理器,则触发 searchEvent\n this.searchEvent.emit(this.validateFilterForm.getRawValue());\n }\n }\n\n /**\n * 带初始值重置表单\n */\n public resetFilterFormWithValue() {\n const resetValue: { [key: string]: any } = {};\n this.filterList.forEach((item) => {\n resetValue[item.name] = item.value;\n });\n // 重置表单值(会触发valueChanges事件)\n this.validateFilterForm.patchValue(resetValue);\n }\n\n public getFilterData() {\n return this.validateFilterForm.getRawValue();\n }\n\n public showMore(): void {\n this.isShowMore = !this.isShowMore;\n this.filterList.forEach((item, index) => {\n item.show = this.isShowMore ? index < 7 : true;\n });\n }\n\n public inputClean(filter: Filter): void {\n const patchObject = {};\n patchObject[filter.name] = null;\n\n this.validateFilterForm.patchValue(patchObject);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdFilterComponent } from './hd-filter.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule\n ],\n declarations: [HdFilterComponent],\n exports: [HdFilterComponent]\n})\nexport class HdFilterModule { }\n","import { Injectable } from \"@angular/core\";\nimport { InputNumber, SelectOption } from \"../model/common-type\";\n// 控件列表\nexport class FormLine {\n type: FormLineType; // 控件类型\n label: string; // 文本\n name: string; // 字段名称\n placeholder?: string; // 输入框的提示文件\n require?: boolean = false; // 是否必填\n hide?: boolean = false; // 是否为隐藏字段,仅用于填充表单的字段,不显示在页面上\n hideViewDomValue?: boolean = false; // type为ViewDom时,是否隐藏value值, 用于特殊场景,譬如列表中图片的显示\n align?: \"left\" | \"right\" | \"center\"; // 列对齐方式\n value?: string | boolean | number | Date | Array<string | Date> | null = null; // 值 不传默认为null\n isSelect?: boolean; // 输入框等是否允许点击之后全选内容\n selectOption?: SelectOption; // 控件为Select时,选项列表\n explainOptionRight?: ExplainOption; // 明细字段的说明(右侧)\n explainOption?: ExplainOption; // 明细字段的说明\n colorOption?: ColorOption; // 颜色字段的说明\n // 组件内部成员\n maxLength?: number; // input控件的输入长度\n preserveNumber?: number; // 需要保留小数的列的位数\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n onOpenChangeEvent?: Function; // select下拉展开/收起事件,回调参数 (open, line),可用于按当前行请求 selectList\n defaultLabel?: any; // select选择器不初始化的时候可以使用defaultLabel搭配value,设置默认值\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n hdShowToday?: boolean = true; // 对应 nzShowToday,是否显示「今天」按钮,默认 true\n disabled?: boolean; // 不可输入状态\n showTime?: boolean = false; // 日期选择器是否包含时间\n style?: object;\n canSearch?: boolean = false; // 指明hide 情况下的控件是否可以被搜索,默认false\n onChangeEventDebounceTime?: number; // change事件防抖,未配置或为0时同步触发(不防抖)\n onSearchEventEventDebounceTime?: number; // search事件防抖,未配置或为0时同步触发(不防抖)\n onOpenChangeEventDebounceTime?: number; // 下拉展开事件防抖,未配置或为0时同步触发(不防抖)\n}\n\nexport class ColorOption {\n name: string;\n color?: string;\n}\n\nexport class ExplainOption {\n show: boolean;\n name: string;\n color?: string;\n}\n\n// 控件类型\nexport enum FormLineType {\n Input = \"Input\", // 输入框\n Select = \"Select\", // 单项选择器\n Date = \"Date\", // 单个日期选择\n DateRange = \"DateRange\", // 日期范围选择\n TextArea = \"TextArea\", // 块级输入框\n InputNumber = \"InputNumber\", // 数字输入\n MultipleSelect = \"MultipleSelect\", // 多选\n ViewDom = \"ViewDom\", // 单纯的显示控件\n Switch = \"Switch\", // 开关\n Time = \"Time\", // 时间选择器\n}\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class HdFormLinesService {\n constructor() {}\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n SimpleChanges,\n TemplateRef,\n ViewChildren,\n} from \"@angular/core\";\nimport { FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\nimport { round } from \"lodash\";\nimport {\n InputBoolean,\n NzDatePickerComponent,\n NzInputNumberComponent,\n NzRangePickerComponent,\n NzSelectComponent,\n NzTimePickerComponent,\n} from \"ng-zorro-antd\";\nimport { Subject, Subscription } from \"rxjs\";\nimport { debounceTime } from \"rxjs/operators\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\nimport { SelectOptionTableColumn } from \"../model/common-type\";\nimport { FormLine, FormLineType } from \"./hd-form-lines.service\";\n\n/** 与 ant-select 选项项水平内边距一致,用于表头与选项行对齐 */\nconst SELECT_TABLE_OPTION_HORIZONTAL_PADDING = 12;\n\n@Component({\n selector: \"hd-form-lines\",\n templateUrl: \"./hd-form-lines.component.html\",\n styleUrls: [\"./hd-form-lines.component.less\"],\n})\nexport class HdFormLinesComponent implements OnInit, AfterViewInit, OnDestroy {\n @ViewChildren(\"formInputDom\") formInputDomList!: QueryList<ElementRef>;\n\n @Input() @InputBoolean() showLineNumber: boolean = true;\n @Input() @InputBoolean() allowEmpty: boolean = true;\n @Output() deleteLastLineEvent = new EventEmitter();\n @Input() @InputBoolean() showKeyboardOperateTip: boolean = false;\n @Input() @InputBoolean() tableLoading: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n /** 是否展示行勾选列,用于外部批量操作勾选行 */\n @Input() @InputBoolean() showCheckbox: boolean = false;\n @Input() formLines: Array<FormLine>;\n // 针对formLines里面所有的name,\n @Input() formLinesData: any;\n @Input() operateButtons: Array<string> = [\"add\", \"delete\"]; // 操作列按钮:add / delete / copy\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Output() changeEvent = new EventEmitter();\n /** 勾选变化时抛出当前勾选行 FormGroup 列表 */\n @Output() selectionChange = new EventEmitter<FormGroup[]>();\n @Input() @InputBoolean() showDeleteConfirm: boolean = false;\n paginationPageIndex: number = 1;\n paginationPageSize: number = 10;\n validateHdFormLines: FormGroup;\n newLine: any;\n inputValue: string;\n\n // 合计区域\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n totalOptionList = [];\n\n showForm: boolean = false;\n filterStr: string;\n storeFormLinesData: any = []; // 缓存的总的表单数据\n filterStoreFormLinesData: any = []; // 筛选出来的数据列表\n filterIndexStore: Array<number> = []; // 筛选出来的数据在原始列表中的下标\n isFilterData: boolean = false; // 是否是已经筛选过的数据\n formValid: boolean = false; // 表单当前的状态\n /** 勾选的行 id(跨页、搜索重建后仍保留) */\n private selectedRowIds = new Set<string>();\n private searchSubject = new Subject<{ fn: any; event: any; line: any }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n\n private searchSubscription: Subscription | undefined;\n private formInputDomListSub: Subscription | undefined;\n\n private openChangeSubject = new Subject<{ fn: any; event: any; line: any }>();\n private openChangeDebounceTimeout: number = 0;\n private openChangeSubscription: Subscription | undefined;\n\n // 当前页的dom二维数组\n collectDomList: Array<\n Array<\n | ElementRef\n | NzSelectComponent\n | NzInputNumberComponent\n | NzDatePickerComponent\n | NzRangePickerComponent\n | NzTimePickerComponent\n >\n > = [];\n // 当前聚焦的dom元素坐标\n activeDomX: number = null;\n activeDomY: number = null;\n activeDom:\n | ElementRef\n | NzSelectComponent\n | NzInputNumberComponent\n | NzDatePickerComponent\n | NzRangePickerComponent\n | NzTimePickerComponent = null;\n activeSelectedComponentOpen: boolean = false;\n @ContentChild(\"ViewDomRightTemplate\", { static: false })\n ViewDomRightTemplate: TemplateRef<any>;\n /** 工具栏左侧自定义按钮,用法同 hd-table 的 tableLeftButton */\n @ContentChild(\"formLinesLeftButton\", { static: false })\n formLinesLeftButton: TemplateRef<any>;\n /** 工具栏右侧自定义按钮,用法同 hd-table 的 tableRightButton */\n @ContentChild(\"formLinesRightButton\", { static: false })\n formLinesRightButton: TemplateRef<any>;\n\n constructor(\n private fb: FormBuilder,\n private cdr: ChangeDetectorRef,\n ) {\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event, line }) => this.triggerEvent(fn, event, line));\n this.openChangeSubscription = this.openChangeSubject\n .pipe(debounceTime(this.openChangeDebounceTimeout))\n .subscribe(({ fn, event, line }) => {\n if (event) {\n this.triggerEvent(fn, event, line);\n }\n });\n }\n\n ngOnInit() {\n // 缓存一下总的表单数据\n this.storeFormLinesData = this.formLinesData;\n this.init();\n }\n\n ngAfterViewInit() {\n this.collectDomData();\n this.formInputDomListSub = this.formInputDomList.changes.subscribe(() => {\n this.collectDomData();\n });\n }\n\n ngOnDestroy() {\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n if (this.openChangeSubscription) {\n this.openChangeSubscription.unsubscribe();\n }\n if (this.formInputDomListSub) {\n this.formInputDomListSub.unsubscribe();\n }\n }\n\n get formLinesLength() {\n return this.linesFormArray.controls.length;\n }\n\n get operateColWidth() {\n const count = (this.operateButtons || []).filter((btn) =>\n [\"add\", \"copy\", \"delete\"].includes(btn),\n ).length;\n return Math.max(count * 40, 80);\n }\n\n /** allowEmpty 且操作列仅有删除时:允许 0 行,初始化与删至空都不自动补空行 */\n get isTrulyEmptyAllowed(): boolean {\n const buttons = (this.operateButtons || []).filter((btn) =>\n [\"add\", \"copy\", \"delete\"].includes(btn),\n );\n return (\n this.allowEmpty &&\n buttons.length === 1 &&\n buttons[0] === \"delete\"\n );\n }\n\n /** 勾选列固定时,序号列的 left 偏移 */\n get lineNumberLeft() {\n return this.showCheckbox ? \"40px\" : \"0px\";\n }\n\n private generateRowId(): string {\n return `hd_row_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private getRowId(line: FormGroup): string {\n if (!line || !line.get(\"_hdRowId\")) {\n return null;\n }\n return line.get(\"_hdRowId\").value;\n }\n\n /** 当前页的行(用于表头全选,仅作用于当前页,跨页勾选仍保留) */\n private getCurrentPageLines(): FormGroup[] {\n const start = (this.paginationPageIndex - 1) * this.paginationPageSize;\n const end = start + this.paginationPageSize;\n return (this.linesFormArray.controls as FormGroup[]).slice(start, end);\n }\n\n isLineChecked(line: FormGroup): boolean {\n const id = this.getRowId(line);\n return !!id && this.selectedRowIds.has(id);\n }\n\n isAllChecked(): boolean {\n const pageLines = this.getCurrentPageLines();\n return (\n pageLines.length > 0 &&\n pageLines.every((line) => this.isLineChecked(line))\n );\n }\n\n isIndeterminate(): boolean {\n const pageLines = this.getCurrentPageLines();\n const checkedCount = pageLines.filter((line) =>\n this.isLineChecked(line),\n ).length;\n return checkedCount > 0 && checkedCount < pageLines.length;\n }\n\n onAllChecked(checked: boolean): void {\n this.getCurrentPageLines().forEach((line) => {\n const id = this.getRowId(line);\n if (!id) {\n return;\n }\n if (checked) {\n this.selectedRowIds.add(id);\n } else {\n this.selectedRowIds.delete(id);\n }\n });\n this.emitSelectionChange();\n }\n\n onLineCheckedChange(line: FormGroup, checked: boolean): void {\n const id = this.getRowId(line);\n if (!id) {\n return;\n }\n if (checked) {\n this.selectedRowIds.add(id);\n } else {\n this.selectedRowIds.delete(id);\n }\n this.emitSelectionChange();\n }\n\n private emitSelectionChange(): void {\n this.selectionChange.emit(this.getSelectedLines());\n this.cdr.markForCheck();\n }\n\n private removeLineFromSelection(line: FormGroup): void {\n const id = this.getRowId(line);\n if (id && this.selectedRowIds.has(id)) {\n this.selectedRowIds.delete(id);\n this.emitSelectionChange();\n }\n }\n\n private applyValuesToLine(\n line: FormGroup,\n values: { [field: string]: any },\n emitEvent: boolean,\n ): void {\n Object.keys(values).forEach((key) => {\n let control = line.get(key);\n if (!control) {\n line.addControl(key, this.fb.control(values[key]));\n control = line.get(key);\n }\n // 静默赋值,避免 valueChanges / DOM maxlength 回写把校验态打乱\n control.setValue(values[key], { emitEvent: false });\n control.markAsPristine({ onlySelf: true });\n control.markAsUntouched({ onlySelf: true });\n control.updateValueAndValidity({ emitEvent: false });\n if (emitEvent) {\n const formItem = this.formLines.find((item) => item.name === key);\n if (formItem && formItem.onChangeEvent) {\n this.triggerEvent(formItem.onChangeEvent, values[key], line);\n }\n }\n });\n this.cdr.detectChanges();\n }\n\n /**\n * 仅在用户交互后、且当前值确实为空的 required 错误时展示红框,\n * 避免批量赋值时 ng-zorro 残留「不能为空」提示\n */\n getControlValidateStatus(line: FormGroup, formItem: FormLine): string {\n const control = line.get(formItem.name);\n if (!control || control.disabled) {\n return \"\";\n }\n const empty =\n control.value === null ||\n control.value === undefined ||\n control.value === \"\";\n if (\n (control.dirty || control.touched) &&\n empty &&\n control.hasError(\"required\")\n ) {\n return \"error\";\n }\n return \"\";\n }\n\n /** 用户输入时按 maxLength 截断(不使用原生 maxlength,避免干扰程序化赋值) */\n limitInputLength(event: Event, line: FormGroup, formItem: FormLine): void {\n if (!formItem || !formItem.maxLength) {\n return;\n }\n const input = event.target as HTMLInputElement;\n if (input && input.value && input.value.length > formItem.maxLength) {\n const next = input.value.slice(0, formItem.maxLength);\n input.value = next;\n const control = line.get(formItem.name);\n if (control) {\n control.setValue(next);\n }\n }\n }\n\n /** 获取当前勾选且已挂载的行 FormGroup(当前筛选结果内) */\n public getSelectedLines(): FormGroup[] {\n return (this.linesFormArray.controls as FormGroup[]).filter((line) =>\n this.isLineChecked(line),\n );\n }\n\n /**\n * 获取全部勾选行数据(含跨页、搜索后未展示但仍勾选的行)\n */\n public getSelectedLinesData(): any[] {\n const result = [];\n const mountedById = new Map<string, any>();\n (this.linesFormArray.controls as FormGroup[]).forEach((line) => {\n const id = this.getRowId(line);\n if (id && this.selectedRowIds.has(id)) {\n mountedById.set(id, line.getRawValue());\n }\n });\n\n (this.storeFormLinesData || []).forEach((data) => {\n const id = data && data._hdRowId;\n if (id && this.selectedRowIds.has(id)) {\n result.push(mountedById.has(id) ? mountedById.get(id) : { ...data });\n }\n });\n\n // 兜底:刚新增、尚未进 store 的勾选行\n this.selectedRowIds.forEach((id) => {\n if (\n !result.some((item) => item && item._hdRowId === id) &&\n mountedById.has(id)\n ) {\n result.push(mountedById.get(id));\n }\n });\n return result;\n }\n\n /**\n * 批量填充勾选行字段(支持跨页、搜索后未展示但仍勾选的行)\n * @param values 要写入的字段,如 { remark: '批量备注', price: 10 }\n * @param emitEvent 是否触发 valueChanges / onChangeEvent,默认 true\n * @returns 实际填充的行数\n */\n public batchFillSelected(\n values: { [field: string]: any },\n emitEvent: boolean = true,\n ): number {\n if (!values || this.selectedRowIds.size === 0) {\n return 0;\n }\n const mountedById = new Map<string, FormGroup>();\n (this.linesFormArray.controls as FormGroup[]).forEach((line) => {\n const id = this.getRowId(line);\n if (id) {\n mountedById.set(id, line);\n }\n });\n\n let count = 0;\n this.selectedRowIds.forEach((id) => {\n const line = mountedById.get(id);\n if (line) {\n this.applyValuesToLine(line, values, emitEvent);\n count++;\n return;\n }\n // 当前筛选/页面未挂载:直接改总数据,退出搜索后可见\n const storeItem = (this.storeFormLinesData || []).find(\n (data) => data && data._hdRowId === id,\n );\n if (storeItem) {\n Object.keys(values).forEach((key) => {\n storeItem[key] = values[key];\n });\n count++;\n }\n });\n return count;\n }\n\n /** 清空勾选 */\n public clearSelection(): void {\n if (this.selectedRowIds.size === 0) {\n return;\n }\n this.selectedRowIds.clear();\n this.emitSelectionChange();\n }\n\n /** 当前勾选数量(含跨页、搜索保留) */\n public getSelectedCount(): number {\n return this.selectedRowIds.size;\n }\n\n /** 是否展示顶部工具栏 */\n get showToolbar(): boolean {\n return (\n !!this.showSearch ||\n !!this.showCheckbox ||\n !!this.formLinesLeftButton ||\n !!this.formLinesRightButton\n );\n }\n\n setActiveSelectedComponentOpen(value: boolean) {\n this.activeSelectedComponentOpen = value;\n if (value === true) {\n setTimeout(() => {\n const domList = document.querySelectorAll(\n \".ant-select-dropdown.hd-select-table\",\n );\n if (domList.length > 0) {\n const dom = domList[0];\n dom\n .querySelectorAll(\".hd-option-header\")\n .forEach((header) => header.remove());\n const oldIndex = this.getOldDomIndex(this.activeDomY, this.formLines);\n dom.insertBefore(\n this.createDOMStructure(\n this.formLines[oldIndex],\n this.linesFormArray.controls.slice(\n (this.paginationPageIndex - 1) * this.paginationPageSize,\n (this.paginationPageIndex - 1) * this.paginationPageSize +\n this.paginationPageSize,\n )[this.activeDomX],\n ),\n dom.firstChild,\n );\n }\n }, 0);\n }\n }\n\n getSelectTableColumnStyle(column: SelectOptionTableColumn): {\n [key: string]: string;\n } {\n if (!column || !column.width) {\n return { width: \"unset\" };\n }\n return { width: `${column.width}px` };\n }\n\n createDOMStructure(formItem, line) {\n // 创建外部 div\n const hdOptionHeader = document.createElement(\"div\");\n hdOptionHeader.className = \"hd-option-header\";\n hdOptionHeader.style.paddingLeft = `${SELECT_TABLE_OPTION_HORIZONTAL_PADDING}px`;\n hdOptionHeader.style.paddingRight = `${SELECT_TABLE_OPTION_HORIZONTAL_PADDING}px`;\n\n // 检查条件,确定是否要创建子元素\n // const selectListLength = (formItem && formItem.selectOption && formItem.selectOption.selectList && formItem.selectOption.selectList.length) || 0;\n // if\n // const lineValueLength = (line.get(formItem.selectOption.selectListName) && line.get(formItem.selectOption.selectListName).value && line.get(formItem.selectOption.selectListName).value.length) || 0;\n\n // if (selectListLength > 0 || lineValueLength > 0) {\n // 遍历 tableColumns 创建内部列 div\n formItem.selectOption.tableColumns.forEach((selectOptionTableColumn) => {\n const columnDiv = document.createElement(\"div\");\n columnDiv.className = \"hd-option-header-column\";\n\n const widthStyle = this.getSelectTableColumnStyle(\n selectOptionTableColumn,\n );\n columnDiv.style.width = widthStyle.width;\n\n // 添加列标签内容\n if (selectOptionTableColumn.label) {\n const labelText = document.createTextNode(\n selectOptionTableColumn.label,\n );\n columnDiv.appendChild(labelText);\n }\n\n // 添加列 div 到外部 div\n hdOptionHeader.appendChild(columnDiv);\n });\n // }\n\n return hdOptionHeader;\n }\n\n collectDomData() {\n this.collectDomList = [];\n const pageDomList = this.formInputDomList.toArray();\n // Step 1: 获取当前页的数据量\n const startIndex = (this.paginationPageIndex - 1) * this.paginationPageSize;\n const endIndex = this.paginationPageIndex * this.paginationPageSize;\n const adjustedEndIndex =\n endIndex > this.formLinesLength ? this.formLinesLength : endIndex;\n const pageLinesLength = adjustedEndIndex - startIndex;\n\n const interval = pageDomList.length / pageLinesLength;\n // Step 2: 拆分formInputDomList\n for (let i = 0; i < pageLinesLength; i++) {\n this.collectDomList.push(pageDomList.splice(0, interval));\n }\n this.disableInputNumberKeyboardStep();\n }\n\n /**\n * ng-zorro 8 在 input 的 onKeyDown 里用上下键调 up()/down() 改 step。\n * 只覆盖 onKeyDown(不动 up/down),键盘方向键交给表单跳转,+/- 按钮仍可用。\n */\n private disableInputNumberKeyboardStep(): void {\n for (let i = 0; i < this.collectDomList.length; i++) {\n for (let j = 0; j < this.collectDomList[i].length; j++) {\n const dom = this.collectDomList[i][j];\n if (dom instanceof NzInputNumberComponent) {\n dom.onKeyDown = (e: KeyboardEvent) => {\n if (e.keyCode === 38 || e.keyCode === 40) {\n return;\n }\n if (e.keyCode === 13) {\n dom.setValidateValue();\n }\n };\n }\n }\n }\n }\n\n // 聚焦下一个dom\n jumpToNextInput(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n // 如果是最后一个可输入元素,新增行\n if (\n !(this.activeDom instanceof NzSelectComponent) &&\n x === this.collectDomList.length - 1 &&\n y === this.collectDomList[0].length - 1\n ) {\n this.addNewLineAndFocus();\n } else {\n if (y === this.collectDomList[0].length - 1) {\n console.log(\"执行过程1\");\n // 如果是最后一列,则跳转到下一行第一个输入框\n this.focusDom(x + 1, 0, \"right\");\n } else {\n console.log(\"执行过程2\");\n // 如果不是最后一列,则跳转到当前行下一个输入框\n this.focusDom(x, y + 1, \"right\");\n }\n }\n }\n\n /**\n * 增加新行并且聚焦到第一个元素,\n * 这里要注意,如果存在翻页情况,需要处理\n */\n addNewLineAndFocus() {\n // 当前行为当前页最后一行的时候,判断下一页是否有数据\n // 1、如果有:翻页+聚焦第一行第一个元素\n // 2、如果没有:新增行+翻页+聚焦第一行第一个元素\n if (this.activeDomX === this.paginationPageSize - 1) {\n // 判断下一页是否有数据\n if (\n this.paginationPageIndex <\n Math.ceil(this.formLinesLength / this.paginationPageSize)\n ) {\n // 翻页+聚焦第一行第一个元素\n this.paginationPageIndex++;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程3\");\n this.focusDom(0, 0, \"right\");\n }, 0);\n } else {\n // 新增行+翻页+聚焦第一行第一个元素\n this.addFormLine();\n this.paginationPageIndex++;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程4\");\n this.focusDom(0, 0);\n }, 0);\n }\n } else {\n this.addFormLine();\n }\n }\n\n // 聚焦到上一个dom\n jumpToPrevInput(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n if (x === 0 && y === 0) {\n // 如果是第一个可输入元素, 判断是否有上一页, 如果有,则翻页+聚焦到上一页最后一个元素\n if (this.paginationPageIndex > 1) {\n // 翻页+聚焦到上一页最后一个元素\n this.paginationPageIndex--;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程5\");\n this.focusDom(\n this.collectDomList.length - 1,\n this.collectDomList[0].length - 1,\n );\n }, 0);\n }\n return;\n } else {\n if (y === 0) {\n console.log(\"执行过程6\");\n // 如果是第一列,则跳转到上一行最后一个输入框\n this.focusDom(x - 1, this.collectDomList[0].length - 1, \"left\");\n } else {\n console.log(\"执行过程7\");\n // 如果不是第一列,则跳转到当前行上一个输入框\n this.focusDom(x, y - 1, \"left\");\n }\n }\n }\n\n /**\n * 聚焦到某个dom\n * @param x 坐标x\n * @param y 坐标y\n * @param jumpDirection 跳转方向\n */\n focusDom(x: number, y: number, jumpDirection: string = \"right\") {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n // 先清除一下当前的焦点\n this.cleanFocusDom(this.activeDomX, this.activeDomY);\n if (this.collectDomList[x] && this.collectDomList[x][y]) {\n const dom = this.collectDomList[x][y];\n // 需要判断下一个focus的dom是否是禁用状态,如果是禁用状态需要跳过\n if (dom instanceof NzSelectComponent) {\n if (dom.nzDisabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n dom.nzSelectTopControlComponent.inputElement.nativeElement.scrollIntoView(\n { behavior: \"smooth\", block: \"center\", inline: \"center\" },\n );\n // 这里多选框需要额外处理下,因为向下的时候会触发内部Input的聚焦,把下一个dom的focus放到宏任务中,延迟处理。\n if (dom.nzSelectService.mode === \"multiple\") {\n setTimeout(() => {\n dom.focus();\n }, 0);\n } else {\n dom.focus();\n }\n } else if (dom instanceof NzInputNumberComponent) {\n if (dom.nzDisabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n const inputDom: any = document.getElementById(dom.nzId);\n inputDom.focus();\n inputDom.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\",\n });\n setTimeout(() => {\n inputDom.select();\n }, 0);\n } else if (dom instanceof ElementRef) {\n if (dom.nativeElement.disabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n dom.nativeElement.focus();\n dom.nativeElement.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\",\n });\n setTimeout(() => {\n dom.nativeElement.select();\n }, 0);\n } else if (\n dom instanceof NzDatePickerComponent ||\n dom instanceof NzRangePickerComponent ||\n dom instanceof NzTimePickerComponent\n ) {\n // TODO:在ngzorro8.5.x版本,时间相关的选择器没有暴露出open方法,暂时先不处理。(10.x及以上版本提供了open方法)\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n this.setActiveDom(x, y);\n } else {\n // 没有dom的场景下,需要判断是左还是右,\n }\n }\n\n cleanFocusDom(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n if (this.collectDomList[x] && this.collectDomList[x][y]) {\n const dom = this.collectDomList[x][y];\n if (dom instanceof NzSelectComponent) {\n dom.blur();\n dom.nzOpen = false;\n } else if (dom instanceof NzInputNumberComponent) {\n dom.blur();\n } else if (dom instanceof ElementRef) {\n dom.nativeElement.blur();\n } else {\n }\n }\n }\n\n setActiveDom(x: number, y: number) {\n this.activeDomX = x;\n this.activeDomY = y;\n this.activeDom = this.collectDomList[this.activeDomX][this.activeDomY];\n if (this.activeDom instanceof NzSelectComponent) {\n this.setActiveSelectedComponentOpen(this.activeDom.open);\n }\n }\n\n /**\n * 根据行号和列号名称获取当前聚焦的dom位置\n * @param rowNumber 行号\n * @param colNumber 列号\n */\n setActiveDomInFormLines(rowNumber: number, colNumber: number) {\n this.activeDomX = rowNumber;\n this.activeDomY = this.getDomIndex(colNumber, this.formLines);\n this.setActiveDom(this.activeDomX, this.activeDomY);\n }\n\n /**\n * 键盘点击事件\n * @param event 键盘事件\n * @returns\n */\n onKeyDown(event: KeyboardEvent) {\n if (this.activeDomX === null || this.activeDomY === null) {\n return;\n }\n switch (event.key) {\n case \"ArrowUp\":\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen\n ) {\n return;\n }\n if (this.activeDomX !== 0) {\n this.focusDom(this.activeDomX - 1, this.activeDomY);\n }\n break;\n case \"ArrowDown\":\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen\n ) {\n return;\n }\n // 判断是否在最后一行,加行\n if (this.activeDomX === this.collectDomList.length - 1) {\n this.cleanFocusDom(this.activeDomX, this.activeDomY);\n this.addNewLineAndFocus();\n break;\n } else {\n this.focusDom(this.activeDomX + 1, this.activeDomY);\n }\n break;\n case \"ArrowLeft\":\n this.jumpToPrevInput(this.activeDomX, this.activeDomY);\n break;\n case \"ArrowRight\":\n this.jumpToNextInput(this.activeDomX, this.activeDomY);\n break;\n case \"Enter\":\n if (this.activeDom instanceof NzSelectComponent) {\n this.setActiveSelectedComponentOpen(this.activeDom.open);\n if (this.activeSelectedComponentOpen === false) {\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n } else if (this.activeDomX === this.collectDomList.length - 1) {\n this.addNewLineAndFocus();\n }\n break;\n case \"Escape\":\n if (this.activeDom instanceof NzSelectComponent) {\n const nowActiveDom = this.activeDom as NzSelectComponent;\n setTimeout(() => {\n this.setActiveSelectedComponentOpen(nowActiveDom.open);\n if (this.activeSelectedComponentOpen === false) {\n if (nowActiveDom.nzSelectService.mode === \"multiple\") {\n setTimeout(() => {\n this.focusDom(this.activeDomX, this.activeDomY);\n }, 0);\n } else {\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n }\n }, 0);\n }\n break;\n default:\n // 如果当前聚焦的是选择框,且键入0-9a-zA-Z,则弹出\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen === false &&\n /^[0-9a-zA-Z]$/.test(event.key)\n ) {\n const dom = this.activeDom;\n dom.nzOpen = true;\n this.setActiveSelectedComponentOpen(true);\n // // TODO:这里暂时注释,不能直接带入键入值,这样会导致输入中文的时候带入英文字符,不符合预期\n // dom.nzSelectTopControlComponent.inputValue = event.key;\n // // 获取 input 元素\n // const inputElement = dom.nzSelectTopControlComponent.inputElement.nativeElement;\n // setTimeout(() => {\n // // 触发输入事件,以确保 Angular 检测到值的变化\n // const eventInput = new Event('input', { bubbles: true });\n // inputElement.dispatchEvent(eventInput);\n // }, 0);\n }\n break;\n }\n }\n\n /**\n * 根据在初始dom下标和数据集 获取在collectDomList中的下标\n * @param index 初始下标\n * @param list 老数据集\n * @returns\n */\n private getDomIndex(index: number, list: Array<FormLine>): number {\n const typeList = [\n \"Input\",\n \"Select\",\n \"Date\",\n \"DateRange\",\n \"TextArea\",\n \"InputNumber\",\n \"MultipleSelect\",\n ];\n let filterList = [];\n for (let i = 0; i < list.length; i++) {\n if (i === index) {\n return filterList.length;\n }\n // 与模板一致:hide 的列不渲染 #formInputDom,不计入 collectDomList 的列下标\n if (typeList.includes(list[i].type) && !list[i].hide) {\n filterList.push(list[i]);\n }\n }\n return null;\n }\n\n /**\n * 根据在collectDomList中的下标和数据集 获取初始dom下标\n * @param index 新下标\n * @param list 老数据集\n * @returns\n */\n private getOldDomIndex(index: number, list: Array<FormLine>): number {\n console.log(\"index\", index);\n console.log(\"list\", list);\n const typeList = [\n \"Input\",\n \"Select\",\n \"Date\",\n \"DateRange\",\n \"TextArea\",\n \"InputNumber\",\n \"MultipleSelect\",\n ];\n let filterList = [];\n for (let i = 0; i < list.length; i++) {\n if (typeList.includes(list[i].type) && !list[i].hide) {\n filterList.push(list[i]);\n if (filterList.length === index + 1) {\n return i;\n }\n }\n }\n return null;\n }\n\n get linesFormArray(): any {\n return this.validateHdFormLines.get(\"lines\") as FormArray;\n }\n\n get LodashRound() {\n return round;\n }\n\n // 暴露的方法,用于获取所有数据的valid状态\n public getValid() {\n return this.formValid;\n }\n\n onSearchEvent(\n fn: any,\n event: any,\n line: any,\n onSearchEventDebounceTime: any,\n ) {\n if (!fn) {\n return;\n }\n const debounceMs =\n onSearchEventDebounceTime != null ? onSearchEventDebounceTime : 0;\n // 未配置或为 0:同步触发,不走 debounceTime(避免异步)\n if (!debounceMs) {\n this.triggerEvent(fn, event, line);\n } else {\n this.debounceTimeout = debounceMs;\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event, line }) => this.triggerEvent(fn, event, line));\n this.searchSubject.next({ fn, event, line });\n }\n setTimeout(() => {\n this.setActiveSelectedComponentOpen(true);\n }, 0);\n }\n\n onOpenChangeEvent(\n fn: any,\n open: boolean,\n line: any,\n onOpenChangeEventDebounceTime: any,\n ) {\n if (!fn) {\n return;\n }\n const debounceMs =\n onOpenChangeEventDebounceTime != null\n ? onOpenChangeEventDebounceTime\n : 0;\n // 未配置或为 0:同步触发,不走 debounceTime(避免异步)\n if (!debounceMs) {\n if (open) {\n this.triggerEvent(fn, open, line);\n }\n return;\n }\n this.openChangeDebounceTimeout = debounceMs;\n if (this.openChangeSubscription) {\n this.openChangeSubscription.unsubscribe();\n }\n this.openChangeSubscription = this.openChangeSubject\n .pipe(debounceTime(this.openChangeDebounceTimeout))\n .subscribe(({ fn, event, line }) => {\n if (event) {\n this.triggerEvent(fn, event, line);\n }\n });\n this.openChangeSubject.next({ fn, event: open, line });\n }\n\n /**\n *\n * @param fn 父组件函数\n * @param event 事件值\n * @param line 触发的行\n */\n triggerEvent(fn: any, event: any, line: any) {\n if (fn) {\n fn(event, line);\n }\n }\n\n innerGetValid() {\n let tmpValidateHdFormLines = this.fb.group({\n lines: this.fb.array([]),\n });\n this.storeFormLinesData.forEach((formLinesDataItem) => {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = this.fb.control(\n {\n value: this.judgeValueIsNotEmpty(formLinesDataItem[item.name])\n ? formLinesDataItem[item.name]\n : item.value || null,\n disabled: item.disabled,\n },\n item.require ? [Validators.required] : [],\n );\n if (item.selectOption && item.selectOption.label) {\n formGroupObj[item.selectOption.label] = this.fb.control(\n formLinesDataItem[item.selectOption.label] || null,\n [],\n );\n }\n });\n formGroupObj.lineIndex = this.fb.control(\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).controls.length + 1,\n [],\n );\n let formGroupTmp = this.fb.group(formGroupObj);\n this.formLines.forEach((item) => {\n if (item.onChangeEvent) {\n const debounceMs =\n item.onChangeEventDebounceTime != null\n ? item.onChangeEventDebounceTime\n : 0;\n const control = formGroupTmp.get(item.name);\n // 未配置或为 0:同步订阅,不走 debounceTime\n if (debounceMs > 0) {\n control.valueChanges\n .pipe(debounceTime(debounceMs))\n .subscribe((value) => {\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n } else {\n control.valueChanges.subscribe((value) => {\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n }\n }\n });\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).insert(\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).controls.length,\n formGroupTmp,\n );\n });\n return tmpValidateHdFormLines.valid;\n }\n\n // 暴露的方法,用于获取所有数据\n public getLines() {\n let allLines = [];\n this.storeFormLinesData.forEach((formLinesDataItem) => {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = formLinesDataItem[item.name];\n });\n formGroupObj.lineIndex = formLinesDataItem.lineIndex;\n allLines.push(formGroupObj);\n });\n return allLines;\n }\n\n // 全局性的搜索(涵盖页面上所有的可视文字)\n searchLines() {\n if (this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n // 如果没有输入搜索字符串,则显示缓存内的所有数据\n if (!this.filterStr) {\n this.isFilterData = false;\n this.setStoreData();\n return;\n }\n const filterValue = this.filterStr.trim().toLowerCase();\n this.isFilterData = true;\n this.filterIndexStore = [];\n\n // 根据搜索字符串过滤数据\n const filteredData = this.storeFormLinesData.filter(\n (data: any, index: number) => {\n for (const item of this.formLines) {\n if (\n (item.hide && item.canSearch) ||\n (!item.hide && item.name !== \"uuid\")\n ) {\n console.log(\"item\", item.name);\n const value = data[item.name]\n ? data[item.name].toString().toLowerCase()\n : \"\";\n if (value.includes(filterValue)) {\n this.filterIndexStore.push(index);\n return true;\n }\n }\n }\n return false;\n },\n );\n // 缓存一下筛选后的表单数据\n this.filterStoreFormLinesData = filteredData;\n // 处理筛选好的数据 然后重新渲染\n this.formLinesData = filteredData;\n this.init(true);\n }\n\n setStoreData() {\n this.formLinesData = this.storeFormLinesData;\n this.init(true);\n }\n\n getStyle(line: FormGroup, formItem: any, width: string) {\n let styleObj = {\n \"min-width\": width,\n };\n if (formItem.style) {\n styleObj = { ...styleObj, ...formItem.style };\n }\n if (\n formItem.colorOption &&\n formItem.colorOption.name &&\n line.get(formItem.colorOption.name).value\n ) {\n styleObj = {\n ...styleObj,\n ...{ color: line.get(formItem.colorOption.name).value },\n };\n }\n return styleObj;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n changes[\"formLinesData\"] &&\n JSON.stringify(changes[\"formLinesData\"].currentValue) !==\n JSON.stringify(changes[\"formLinesData\"].previousValue)\n ) {\n if (this.storeFormLinesData && this.storeFormLinesData.length === 0) {\n this.storeFormLinesData = this.formLinesData;\n }\n this.init();\n }\n if (\n changes[\"totalOption\"] &&\n JSON.stringify(changes[\"totalOption\"].currentValue) !==\n JSON.stringify(changes[\"totalOption\"].previousValue)\n ) {\n this.calculateTotal();\n }\n }\n\n calculateTotal() {\n // 这里处理合计数据\n if (this.showTotal) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"left\",\n showDecimal: item.showDecimal || false,\n };\n }\n });\n }\n }\n\n private init(isEdit: boolean = false): void {\n this.paginationPageIndex = 1;\n // 异常捕获\n if (!this.checkList(this.formLines)) {\n this.tableLoading = false;\n return;\n }\n this.createForm();\n // 如果没有formLinesData,则认为是新增\n if (\n !isEdit &&\n (!this.formLinesData ||\n (this.formLinesData && this.formLinesData.length === 0))\n ) {\n this.tableLoading = false;\n // allowEmpty 且仅删除按钮:不自动补空行\n if (!this.isTrulyEmptyAllowed) {\n this.addFormLine(null, false);\n }\n this.showForm = true;\n } else {\n // 编辑逻辑\n this.addFormLineWithData();\n }\n this.validateHdFormLines.valueChanges.subscribe((data) =>\n this.onHdFormValueChanged(data),\n );\n this.onHdFormValueChanged();\n }\n\n /**\n * 创建表单\n */\n private createForm() {\n this.validateHdFormLines = this.fb.group({\n lines: this.fb.array([]),\n });\n this.newLine = this.newLineItem();\n }\n\n delayJumpToNextInput() {\n setTimeout(() => {\n this.jumpToNextInput(this.activeDomX, this.activeDomY);\n }, 0);\n }\n\n /**\n * 定义空的newLineItem 结构\n */\n private newLineItem(): FormGroup {\n return this.createLineFromValues(null, true);\n }\n\n /**\n * 根据行数据创建 FormGroup(含隐藏字段、select 的 label 等附属字段)\n * @param formLinesDataItem 行数据,空行传 null\n * @param isEmptyLine 是否空行(影响必填校验规则,与历史逻辑保持一致)\n * @param regenerateRowId 是否强制生成新行 id(复制行时使用)\n */\n private createLineFromValues(\n formLinesDataItem: any,\n isEmptyLine: boolean = false,\n regenerateRowId: boolean = false,\n ): FormGroup {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n formGroupObj[item.name] = this.fb.control(\n {\n value:\n formLinesDataItem != null\n ? formLinesDataItem[item.name]\n : item.value,\n disabled: item.disabled,\n },\n isEmptyLine\n ? item.require && !item.hide\n ? [Validators.required]\n : []\n : item.require\n ? [Validators.required]\n : [],\n );\n if (item.selectOption && item.selectOption.label) {\n formGroupObj[item.selectOption.label] = this.fb.control(\n formLinesDataItem != null\n ? formLinesDataItem[item.selectOption.label] || null\n : null,\n [],\n );\n }\n });\n\n // 稳定行 id:搜索重建表单后用于保留勾选\n const rowId =\n !regenerateRowId && formLinesDataItem && formLinesDataItem._hdRowId\n ? formLinesDataItem._hdRowId\n : this.generateRowId();\n formGroupObj._hdRowId = this.fb.control(rowId);\n if (formLinesDataItem && !formLinesDataItem._hdRowId) {\n formLinesDataItem._hdRowId = rowId;\n }\n\n // 复制源行上多余的字段(隐藏附属字段、selectListName 等)\n if (formLinesDataItem) {\n Object.keys(formLinesDataItem).forEach((key) => {\n if (\n key === \"lineIndex\" ||\n key === \"isHdFormLineSearchAdd\" ||\n key === \"_hdRowId\"\n ) {\n return;\n }\n if (!formGroupObj[key]) {\n formGroupObj[key] = this.fb.control(formLinesDataItem[key]);\n }\n });\n }\n\n formGroupObj.lineIndex = this.fb.control(\n this.linesFormArray.controls.length + 1,\n [],\n );\n formGroupObj.isHdFormLineSearchAdd = this.fb.control(this.isFilterData, []);\n let formGroupSubmit = this.fb.group(formGroupObj);\n this.formLines.forEach((item) => {\n if (item.onChangeEvent) {\n const debounceMs =\n item.onChangeEventDebounceTime != null\n ? item.onChangeEventDebounceTime\n : 0;\n const control = formGroupSubmit.get(item.name);\n const handleChange = (value: any) => {\n if (item.type === FormLineType.Select && value !== null) {\n this.delayJumpToNextInput();\n }\n this.triggerEvent(item.onChangeEvent, value, formGroupSubmit);\n };\n // 未配置或为 0:同步订阅,不走 debounceTime\n if (debounceMs > 0) {\n control.valueChanges\n .pipe(debounceTime(debounceMs))\n .subscribe(handleChange);\n } else {\n control.valueChanges.subscribe(handleChange);\n }\n }\n });\n return formGroupSubmit;\n }\n\n private calculateLineNumber() {\n this.linesFormArray.controls.forEach((item, index) => {\n item.get(\"lineIndex\").setValue(index + 1, { emitEvent: false });\n });\n }\n\n /**\n * 编辑的时候数据处理\n */\n addFormLineWithData() {\n this.formLinesData.forEach((formLinesDataItem) => {\n this.linesFormArray.insert(\n this.linesFormArray.controls.length,\n this.createLineFromValues(formLinesDataItem),\n );\n });\n this.calculateLineNumber();\n this.tableLoading = false;\n this.showForm = true;\n }\n\n /**\n * 在指定行下方新增空行;不传 afterLine 则追加到末尾\n * @param afterLine 当前行 FormGroup(不要传 lineIndex,避免序号偏移导致插错位置)\n */\n addFormLine(afterLine?: FormGroup | null, isFocus: boolean = true) {\n const insertAt = this.getInsertIndexAfter(afterLine);\n this.linesFormArray.insert(insertAt, this.newLineItem());\n this.calculateLineNumber();\n // 跳到新增行所在页,避免页码异常时看不到数据\n this.paginationPageIndex =\n Math.floor(insertAt / this.paginationPageSize) + 1;\n setTimeout(() => {\n this.collectDomData();\n if (isFocus) {\n this.activeDomX = this.toPageLocalRowIndex(insertAt);\n this.activeDomY = 0;\n console.log(\"执行过程13\");\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n }, 0);\n }\n\n /**\n * 复制当前行:在当前行下方新增一行,复制所有字段值(含隐藏字段)\n */\n copyFormLine(line: FormGroup) {\n const sourceIndex = this.linesFormArray.controls.indexOf(line);\n if (sourceIndex < 0) {\n return;\n }\n // getRawValue 包含 disabled 字段;复制行使用新的 _hdRowId\n const sourceValues = line.getRawValue();\n const insertAt = sourceIndex + 1;\n this.linesFormArray.insert(\n insertAt,\n this.createLineFromValues(sourceValues, false, true),\n );\n this.calculateLineNumber();\n setTimeout(() => {\n this.collectDomData();\n this.activeDomX = this.toPageLocalRowIndex(insertAt);\n this.activeDomY = 0;\n this.focusDom(this.activeDomX, this.activeDomY);\n }, 0);\n }\n\n @Output() deleteLineEvent = new EventEmitter();\n\n /**\n * 删除行\n * @param lineOrIndex 行 FormGroup,或 1-based 的 lineIndex(兼容 resetForm)\n */\n deleteFormLine(lineOrIndex: FormGroup | number) {\n let removeAt = -1;\n if (typeof lineOrIndex === \"number\") {\n removeAt = lineOrIndex - 1;\n } else if (lineOrIndex) {\n removeAt = this.linesFormArray.controls.indexOf(lineOrIndex);\n }\n console.log(\n \"index\",\n typeof lineOrIndex === \"number\" ? lineOrIndex : removeAt,\n );\n if (removeAt < 0) {\n return;\n }\n // 最后一条数据的时候要判断一下\n if (this.linesFormArray.controls.length === 1 && !this.allowEmpty) {\n if (this.deleteLastLineEvent) {\n this.deleteLastLineEvent.emit();\n }\n return;\n }\n const removedLine = this.linesFormArray.at(removeAt) as FormGroup;\n this.linesFormArray.removeAt(removeAt);\n this.removeLineFromSelection(removedLine);\n if (\n !this.isFilterData &&\n this.linesFormArray.controls &&\n this.linesFormArray.controls.length === 0 &&\n !this.isTrulyEmptyAllowed\n ) {\n this.addFormLine();\n } else {\n // 当前页已无数据时回退页码,且页码最小为 1(避免删空后变成 0 导致再添加看不见)\n const maxPage = Math.max(\n 1,\n Math.ceil(\n this.linesFormArray.controls.length / this.paginationPageSize,\n ),\n );\n if (this.paginationPageIndex > maxPage) {\n this.paginationPageIndex = maxPage;\n }\n this.calculateLineNumber();\n }\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n /** 在指定行后方的插入下标;无行则追加到末尾 */\n private getInsertIndexAfter(afterLine?: FormGroup | null): number {\n if (!afterLine) {\n return this.linesFormArray.controls.length;\n }\n const idx = this.linesFormArray.controls.indexOf(afterLine);\n return idx >= 0 ? idx + 1 : this.linesFormArray.controls.length;\n }\n\n /** 全局行下标转当前页内的行下标(供聚焦用) */\n private toPageLocalRowIndex(globalIndex: number): number {\n return (\n globalIndex - (this.paginationPageIndex - 1) * this.paginationPageSize\n );\n }\n\n public pageIndexChange(event: number): void {\n this.paginationPageIndex = event;\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n public pageSizeChange(event: number): void {\n this.paginationPageSize = event;\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n private onHdFormValueChanged(data?: any) {\n if (this.isFilterData) {\n if (data && data.lines && this.filterIndexStore.length !== 0) {\n const lines = data.lines;\n if (lines.length === this.filterIndexStore.length) {\n this.filterIndexStore.forEach((item, index) => {\n this.storeFormLinesData[item] = {\n ...this.filterStoreFormLinesData[index],\n ...lines[index],\n };\n });\n } else if (lines.length > this.filterIndexStore.length) {\n // 有新增数据的情况\n // step 1: 先找新增的index下标\n const getNowLines = this.validateHdFormLines.getRawValue().lines;\n let addIndex = -1;\n for (let i = 0; i < getNowLines.length; i++) {\n if (getNowLines[i].isHdFormLineSearchAdd) {\n addIndex = i;\n break;\n }\n }\n if (addIndex !== -1) {\n this.storeFormLinesData.splice(\n this.filterIndexStore[addIndex - 1] + 1,\n 0,\n getNowLines[addIndex],\n );\n }\n this.filterIndexStore.push(this.filterIndexStore[addIndex - 1] + 1);\n } else {\n // 有删除数据的情况\n // step 1:先找到删除的index下标\n let deletedIndex = -1;\n let count = 0;\n if (lines.length === 0) {\n deletedIndex = 0;\n } else {\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].lineIndex - count > 1) {\n deletedIndex = i;\n break;\n }\n count++;\n }\n }\n if (deletedIndex !== -1) {\n // step 2: 删除总数据中的对应数据, 把下标数组和lines长度对齐,同时把下标数组在deletedIndex后面的值全都-1\n this.storeFormLinesData = this.storeFormLinesData.filter(\n (item, index) => {\n return index !== this.filterIndexStore[deletedIndex];\n },\n );\n this.filterIndexStore.splice(deletedIndex, 1);\n for (let i = 0; i < this.filterIndexStore.length; i++) {\n if (i >= deletedIndex) {\n this.filterIndexStore[i]--;\n }\n }\n } else {\n // step 2: 没有找到deletedIndex说明删除操作在最后一行\n const filterIndex =\n this.filterIndexStore[this.filterIndexStore.length - 1];\n this.storeFormLinesData = this.storeFormLinesData.filter(\n (item, index) => {\n return index !== filterIndex;\n },\n );\n this.filterIndexStore.pop();\n }\n }\n } else {\n if (data && data.lines) {\n this.storeFormLinesData = data.lines;\n }\n }\n } else {\n if (data && data.lines) {\n this.storeFormLinesData = data.lines;\n }\n }\n\n // 总表单\n if (!this.isFilterData) {\n this.formValid = this.validateHdFormLines.valid;\n } else {\n if (this.formValid) {\n // 如果整体表单是true,不管子表单是什么,都变成子表单的状态\n this.formValid = this.validateHdFormLines.valid;\n } else {\n // 如果整体表单是false:1、子表单为true,需要重算;2、子表单为false,用子表单状态\n if (this.validateHdFormLines.valid) {\n this.formValid = this.innerGetValid();\n } else {\n this.formValid = this.validateHdFormLines.valid;\n }\n }\n }\n // this.calculateLineNumber();\n this.changeEvent.emit(this.validateHdFormLines);\n }\n\n private checkList(list: Array<FormLine>): boolean {\n if (!list || (list && list.length === 0)) {\n return false;\n }\n let nameList = [];\n let selectOptionCheckList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FormLineType.Select && (!item.selectList || (item.selectList && item.selectList.length === 0))) {\n // throw 'formLines组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n\n // 校验有onSearch的字段的selectOption的value、label是否在formLine里面都定义了\n if (item.onSearchEvent && item.selectOption) {\n selectOptionCheckList = [];\n list.forEach((innerItem) => {\n if (\n innerItem.name === item.selectOption.value ||\n innerItem.name === item.selectOption.label\n ) {\n selectOptionCheckList.push(innerItem.name);\n }\n });\n if (selectOptionCheckList.length < 2) {\n throw `formLines组件数据格式不规范,字段${item.name}的selectOption的value、label字段未能在formLines中找到对应字段!`;\n }\n }\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw \"formLines组件数据格式不规范,存在重复name值!\";\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n this.changeEvent.emit(this.validateHdFormLines.getRawValue());\n }\n\n public resetForm(): void {\n // 删除\n this.clearSelection();\n for (let i = this.linesFormArray.controls.length; i >= 0; i--) {\n this.deleteFormLine(i);\n }\n this.paginationPageIndex = 1;\n }\n\n public inputClean(formItem: any, line: any): void {\n line.get(formItem.name).setValue(null);\n }\n\n public selectValue(id: string, rowNumber: number, colNumber: number): void {\n const inputDom: any = document.querySelector(id);\n inputDom.select();\n this.setActiveDomInFormLines(rowNumber, colNumber);\n }\n\n private textWidthCache: { [key: string]: number } = {};\n\n isTextOverflow(text: string, maxWidth: number): boolean {\n const cachedWidth = this.textWidthCache[text];\n if (cachedWidth !== undefined) {\n return cachedWidth + 15 >= maxWidth;\n }\n\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = text;\n document.body.appendChild(span);\n const isOverflow = span.offsetWidth + 15 >= maxWidth;\n this.textWidthCache[text] = span.offsetWidth;\n span.style.display = \"none\";\n document.body.removeChild(span);\n return isOverflow;\n }\n\n judgeColEmpty(str: any) {\n if (str || str === 0) {\n return str;\n } else {\n return \"<空>\";\n }\n }\n\n judgeValueIsNotEmpty(str: any) {\n if (str === null && str === undefined) {\n return false;\n } else {\n return true;\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonGroupModule } from '../hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\nimport { HdFormLinesComponent } from './hd-form-lines.component';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule,\n HdSpaceModule,\n HdButtonGroupModule\n ],\n declarations: [HdFormLinesComponent],\n exports: [HdFormLinesComponent]\n})\nexport class HdFormLinesModule { }\n","import { Injectable } from \"@angular/core\";\nimport { ValidatorFn } from \"@angular/forms\";\nimport {\n CascaderOption,\n CheckboxOption,\n InputNumber,\n RadioOption,\n SelectOption,\n} from \"../model/common-type\";\n\n// 控件列表\nexport class FormItem {\n type: FormListType;\n label: string; // 文本\n name: string; // 字段名称\n require?: boolean = false; // 是否必填\n placeholder?: string; // 输入框提示文案\n width?: number = 1; // 占据的列数。默认1\n hide?: boolean = false; // 是否为隐藏字段,仅用于填充表单的字段,不显示在页面上\n totalWidth?: number = 0;\n isRowFirst?: number = 0; // 是否是一行的第一个元素\n columnItems?: Array<any>; // 当前行的所有列的items\n value?:\n | string\n | boolean\n | number\n | Date\n | Array<string | number | boolean | Date>\n | null = null; // 值 不传默认为null\n disabled?: boolean;\n color?: string;\n // 组件内部成员\n maxLength?: number; // input控件的输入长度\n prefix?: string; // input前缀文字,对应 nz-input-group nzPrefix\n prefixIcon?: string; // input前缀图标,对应 nz-icon nzType\n selectOption?: SelectOption; // 控件为Select时,选项列表\n radioOption?: RadioOption; // 控件为Radio时,选项列表\n checkboxOption?: CheckboxOption; // 控件为Checkbox组时,选项列表\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n onOpenChangeEvent?: Function; // select下拉展开/收起事件,可用于按需请求 selectList\n defaultLabel?: string | Array<string>; // select选择器不初始化的时候可以使用defaultLabel搭配value,设置默认值\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n hdShowToday?: boolean = true; // 对应 nzShowToday,是否显示「今天」按钮,默认 true\n explain?: string; // label底部的介绍\n textAreaRows?: number; // textArea的行数\n showTime?: boolean = false; // 日期选择器是否包含时间\n labelColor?: string; // label的文字的颜色\n validatorKeys?: Array<ValidatorKey>;\n validator?: ValidatorFn;\n onChangeEventDebounceTime?: number; // change事件防抖,未配置或为0时同步触发(不防抖)\n onSearchEventEventDebounceTime?: number; // search事件防抖,未配置或为0时同步触发(不防抖)\n onOpenChangeEventDebounceTime?: number; // 下拉展开事件防抖,未配置或为0时同步触发(不防抖)\n cascaderOption?: CascaderOption; // 级联选择器配置\n format?: string; // 时间的格式化规则\n}\n\nexport class ValidatorKey {\n key: string;\n label: string;\n}\n\n// 控件类型\nexport enum FormListType {\n Input, // 输入框\n Select, // 单项选择器\n Date, // 单个日期选择\n DateRange, // 日期范围选择\n TextArea, // 块级输入框\n InputNumber, // 数字输入\n MultipleSelect, // 多选\n ViewDom, // 单纯的显示控件\n Switch, // 开关\n Time, // 时间选择器\n Cascader, // 级联选择器\n Radio, // 单选\n Checkbox, // 复选框\n}\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class HdFormService {\n constructor() {}\n}\n","import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n SimpleChanges,\n} from \"@angular/core\";\nimport { FormBuilder, FormGroup, Validators } from \"@angular/forms\";\nimport { Subject, Subscription } from \"rxjs\";\nimport { debounceTime } from \"rxjs/operators\";\nimport { FormItem, FormListType } from \"./hd-form.service\";\n// import * as moment from 'moment';\n@Component({\n selector: \"hd-form\",\n templateUrl: \"./hd-form.component.html\",\n styleUrls: [\"./hd-form.component.less\"],\n})\nexport class HdFormComponent implements OnInit {\n @Input() formList: Array<FormItem>;\n @Output() changeEvent = new EventEmitter();\n validateHdForm: FormGroup;\n inputValue: string;\n\n private searchSubject = new Subject<{ fn: any; event: any }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n private searchSubscription: Subscription | undefined;\n\n private openChangeSubject = new Subject<{ fn: any; event: any }>();\n private openChangeDebounceTimeout: number = 0;\n private openChangeSubscription: Subscription | undefined;\n\n constructor(private fb: FormBuilder) {\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event }) => this.triggerEvent(fn, event));\n this.openChangeSubscription = this.openChangeSubject\n .pipe(debounceTime(this.openChangeDebounceTimeout))\n .subscribe(({ fn, event }) => {\n // 防抖结束后仅展开态触发业务回调,避免频繁开关仍打接口\n if (event) {\n this.triggerEvent(fn, event);\n }\n });\n }\n\n ngOnInit() {\n if (!this.formList || this.formList.length === 0) {\n return;\n }\n\n this.init();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n changes[\"formList\"] &&\n JSON.stringify(changes[\"formList\"].currentValue) !==\n JSON.stringify(changes[\"formList\"].previousValue)\n ) {\n if (!this.formList || this.formList.length === 0) {\n return;\n }\n this.init();\n }\n }\n\n onSearchEvent(fn: any, event: any, onSearchEventDebounceTime: any) {\n if (!fn) {\n return;\n }\n const debounceMs =\n onSearchEventDebounceTime != null ? onSearchEventDebounceTime : 0;\n // 未配置或为 0:同步触发,不走 debounceTime(避免异步)\n if (!debounceMs) {\n this.triggerEvent(fn, event);\n return;\n }\n this.debounceTimeout = debounceMs;\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event }) => this.triggerEvent(fn, event));\n this.searchSubject.next({ fn, event });\n }\n\n onOpenChangeEvent(\n fn: any,\n open: boolean,\n onOpenChangeEventDebounceTime: any,\n ) {\n if (!fn) {\n return;\n }\n const debounceMs =\n onOpenChangeEventDebounceTime != null\n ? onOpenChangeEventDebounceTime\n : 0;\n // 未配置或为 0:同步触发,不走 debounceTime(避免异步)\n if (!debounceMs) {\n if (open) {\n this.triggerEvent(fn, open);\n }\n return;\n }\n this.openChangeDebounceTimeout = debounceMs;\n if (this.openChangeSubscription) {\n this.openChangeSubscription.unsubscribe();\n }\n this.openChangeSubscription = this.openChangeSubject\n .pipe(debounceTime(this.openChangeDebounceTimeout))\n .subscribe(({ fn, event }) => {\n if (event) {\n this.triggerEvent(fn, event);\n }\n });\n this.openChangeSubject.next({ fn, event: open });\n }\n\n triggerEvent(fn: any, event: any) {\n if (fn) {\n fn(event);\n }\n }\n\n private init(): void {\n // 异常捕获\n if (!this.checkList(this.formList)) {\n throw \"form组件数据格式不规范\";\n }\n // 对表单数据做初始化,用row隔离每行数据item\n this.dealRow();\n // 首先根据定义的组件数组 去初始化表单\n let formGroupList = {};\n this.formList.forEach((item, index) => {\n // 日期相关的控件做特殊处理\n if (item.type === 2 && item.value) {\n const [year, month, day] = item.value\n .toString()\n .split(\"-\")\n .map((str) => parseInt(str));\n const newDateStr = new Date(year, month - 1, day)\n .toLocaleDateString(\"zh-Hans-CN\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n })\n .replace(/\\//g, \"-\");\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: new Date(newDateStr), disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: new Date(newDateStr), disabled: item.disabled },\n item.require && !item.hide ? [Validators.required] : [],\n );\n }\n } else if (item.type === 3 && item.value) {\n let formItemDate = JSON.parse(JSON.stringify(item.value));\n if (formItemDate && formItemDate instanceof Array) {\n formItemDate = formItemDate.map((item) => {\n const [year, month, day] = item\n .split(\"-\")\n .map((str) => parseInt(str));\n const newDateStr = new Date(year, month - 1, day)\n .toLocaleDateString(\"zh-Hans-CN\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n })\n .replace(/\\//g, \"-\");\n item = new Date(newDateStr);\n });\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: formItemDate, disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: formItemDate, disabled: item.disabled },\n item.require && !item.hide ? [Validators.required] : [],\n );\n }\n } else {\n throw \"form组件中DateRange控件value值格式不规范,正确示例['2020-01-22', '2020-01-23']\";\n }\n } else if (item.type === FormListType.Checkbox && item.checkboxOption) {\n const checkboxValue = Array.isArray(item.value) ? item.value : [];\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: checkboxValue, disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: checkboxValue, disabled: item.disabled },\n item.require && !item.hide ? [Validators.required] : [],\n );\n }\n } else if (item.type === FormListType.Checkbox) {\n const checkboxValue = item.value != null ? item.value : false;\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: checkboxValue, disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: checkboxValue, disabled: item.disabled },\n item.require && !item.hide ? [Validators.required] : [],\n );\n }\n } else {\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: item.value, disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: item.value, disabled: item.disabled },\n item.require && !item.hide ? [Validators.required] : [],\n );\n }\n }\n });\n\n this.validateHdForm = this.fb.group(formGroupList);\n\n this.formList.forEach((item) => {\n if (item.onChangeEvent) {\n const debounceMs =\n item.onChangeEventDebounceTime != null\n ? item.onChangeEventDebounceTime\n : 0;\n const control = this.validateHdForm.get(item.name);\n // 未配置或为 0:同步订阅,不走 debounceTime(避免异步破坏 patchValue 联动回显)\n if (debounceMs > 0) {\n control.valueChanges\n .pipe(debounceTime(debounceMs))\n .subscribe((value) =>\n this.triggerEvent(item.onChangeEvent, value),\n );\n } else {\n control.valueChanges.subscribe((value) =>\n this.triggerEvent(item.onChangeEvent, value),\n );\n }\n }\n });\n this.validateHdForm.valueChanges.subscribe((data) =>\n this.onHdFormValueChanged(data),\n );\n this.onHdFormValueChanged();\n }\n\n private dealRow() {\n // 一阶段 遍历数据计算相关数据\n const formListLength = this.formList.length;\n let step = 0;\n for (let i = 0; i < formListLength; i++) {\n if (!this.formList[i].hide) {\n if (i === 0) {\n this.formList[i].totalWidth = this.formList[i].width || 1;\n this.formList[i].isRowFirst = 1;\n step = step + 4;\n } else {\n // 去找到前一个非hide的控件\n for (let j = i - 1; j >= 0; j--) {\n if (this.formList[j].totalWidth) {\n this.formList[i].totalWidth =\n this.formList[j].totalWidth + (this.formList[i].width || 1);\n if (\n this.formList[j].totalWidth + (this.formList[i].width || 1) >\n step &&\n this.formList[j].totalWidth <= step\n ) {\n step = step + 4;\n this.formList[i].isRowFirst = 1;\n } else {\n this.formList[i].isRowFirst = 0;\n }\n break;\n }\n }\n }\n }\n }\n\n // 二阶段 isRowFirst的数组项增加子节点\n for (let m = 0; m < formListLength; m++) {\n if (this.formList[m].isRowFirst === 1) {\n this.formList[m].columnItems = [];\n let space = 0;\n for (let n = 1; n < formListLength - m; n++) {\n if (space === 4 || this.formList[m + n].isRowFirst === 1) {\n break;\n }\n if (\n !this.formList[m + n].hide &&\n this.formList[m + n] &&\n this.formList[m + n].isRowFirst === 0\n ) {\n this.formList[m].columnItems.push(this.formList[m + n]);\n space++;\n }\n }\n }\n }\n }\n\n private onHdFormValueChanged(data?: any) {\n this.changeEvent.emit(this.validateHdForm);\n }\n\n private checkList(list: Array<FormItem>): boolean {\n if (!list || (list && list.length === 0)) {\n return false;\n }\n let nameList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FormListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {\n // throw 'form组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw \"form组件数据格式不规范,存在重复name值!\";\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n Object.values(this.validateHdForm.controls).forEach((control) => {\n control.markAsDirty();\n control.updateValueAndValidity();\n });\n this.changeEvent.emit(this.validateHdForm.getRawValue());\n }\n\n public resetForm(): void {\n this.validateHdForm.reset();\n Object.values(this.validateHdForm.controls).forEach((control) => {\n control.markAsDirty();\n control.updateValueAndValidity();\n });\n this.changeEvent.emit(this.validateHdForm.getRawValue());\n }\n\n public inputClean(filter: FormItem): void {\n const patchObject = {};\n patchObject[filter.name] = null;\n this.validateHdForm.patchValue(patchObject);\n }\n\n isCheckboxChecked(name: string, value: any): boolean {\n const control = this.validateHdForm.get(name);\n const current = control ? control.value : null;\n return Array.isArray(current) && current.indexOf(value) !== -1;\n }\n\n onCheckboxItemChange(name: string, value: any, checked: boolean): void {\n const control = this.validateHdForm.get(name);\n if (!control) {\n return;\n }\n const current = Array.isArray(control.value) ? [...control.value] : [];\n const index = current.indexOf(value);\n if (checked && index === -1) {\n current.push(value);\n } else if (!checked && index !== -1) {\n current.splice(index, 1);\n }\n control.setValue(current);\n control.markAsDirty();\n control.updateValueAndValidity();\n }\n\n readonly inputNumberDefaultFormatter = (value: unknown) => value;\n readonly inputNumberDefaultParser = (value: string) => value;\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdFormComponent } from './hd-form.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule\n ],\n declarations: [HdFormComponent],\n exports: [HdFormComponent]\n})\nexport class HdFormModule { }\n","import { Component, ContentChild, EventEmitter, Input, OnInit, Output, SimpleChange, SimpleChanges, TemplateRef } from '@angular/core';\nimport { TableTotalOption } from './hd-current-table.service';\nimport { InputBoolean } from 'ng-zorro-antd/core';\nimport { Page } from '../model/common-type';\n\n@Component({\n selector: 'hd-current-table',\n templateUrl: './hd-current-table.component.html',\n styleUrls: ['./hd-current-table.component.less']\n})\nexport class HdCurrentTableComponent implements OnInit {\n @Input() tableData: Page<any>;\n @Input() scroll: { [key: string]: string } = { x: '1px' };\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() selectField: string = 'billNumber';\n // 合计区域\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<TableTotalOption>;\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n @ContentChild(\"tableHead\", { static: false }) tableHead: TemplateRef<any>;\n @ContentChild(\"tableBody\", { static: false }) tableBody: TemplateRef<any>;\n @ContentChild(\"tableTotal\", { static: false }) tableTotal: TemplateRef<any>;\n\n @Input() tableLoading: boolean = false;\n // 表格分页参数\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 10;\n @Output() tablePageIndexChange = new EventEmitter<any>();\n @Output() tablePageSizeChange = new EventEmitter<any>();\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n\n tableTotalOptionList = [];\n\n constructor() { }\n\n ngOnInit(): void { }\n\n ngOnChanges(changes: SimpleChange) {\n // 数据改变时,重置勾选状态\n if (changes && changes['tableData'] && changes['tableData']['currentValue'] && changes['tableData']['previousValue']) {\n if(changes['tableData']['currentValue']['pageSize'] !== changes['tableData']['previousValue']['pageSize']\n || changes['tableData']['currentValue']['pageNumber'] !== changes['tableData']['previousValue']['pageNumber']){\n return;\n }\n this.resetStatus();\n }\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n this.resetStatus();\n }\n\n search(reset: boolean) {\n if(reset){\n this.tablePageSizeChange.emit(this.tablePageSize);\n }else{\n this.tablePageIndexChange.emit(this.tablePageIndex);\n }\n // 触发父组件查询事件\n this.tableSearchEvent.emit(reset);\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] && (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] && delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(item => this.mapOfCheckedId[item[this.selectField]]);\n this.isIndeterminate =\n this.listOfDisplayData.some(item => this.mapOfCheckedId[item[this.selectField]]) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n const selectedList: Array<any> = Object.values(this.mapOfCheckList);\n this.selectEvent.emit(selectedList);\n }\n // 如果数据为空,则清空勾选标识\n if (this.tableData.content.length === 0) {\n this.isAllDisplayDataChecked = false;\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach(item => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] && (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] && delete this.mapOfCheckList[item[this.selectField]];\n }\n\n this.mapOfCheckedId[item[this.selectField]] = value\n });\n this.refreshStatus();\n }\n}\n","import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdCurrentTableComponent } from './hd-current-table.component';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\n\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n HdSpaceModule\n ],\n declarations: [HdCurrentTableComponent],\n exports: [HdCurrentTableComponent],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class HdCurrentTableModule { }\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'hd-log',\n templateUrl: './hd-log.component.html',\n styleUrls: ['./hd-log.component.less']\n})\nexport class HdLogComponent implements OnInit {\n @Input() logs: any[];\n\n constructor() {\n }\n\n ngOnInit() {\n }\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport { NzModalService } from 'ng-zorro-antd';\nimport { HdLogComponent } from './hd-log.component';\n\n@Injectable({\n providedIn: 'root',\n})\n\nexport class HdLogService {\n\n constructor(private modalService: NzModalService) { }\n\n showLogs(logs: any[]) {\n this.modalService.create({\n nzTitle: '操作日志',\n nzContent: HdLogComponent,\n nzComponentParams: { logs },\n nzFooter: null,\n nzWidth: 1000\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdLogComponent } from './hd-log.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdDetailLinesModule } from '../hd-detail-lines/hd-detail-lines.module';\nimport { HdLogService } from './hd-log.service';\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule,\n HdDetailLinesModule\n ],\n entryComponents: [HdLogComponent],\n declarations: [HdLogComponent],\n exports: [HdLogComponent],\n providers: [HdLogService]\n})\nexport class HdLogModule { }\n","import { Component, OnInit, Output, Input, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'hd-popconfirm',\n templateUrl: './hd-popconfirm.component.html',\n styleUrls: ['./hd-popconfirm.component.less']\n})\nexport class HdPopconfirmComponent implements OnInit {\n @Input() message: string;\n @Output() confirmOption = new EventEmitter<any>();\n @Output() cancelOption = new EventEmitter<any>();\n\n constructor() { }\n\n ngOnInit() {\n }\n\n\n cancel(e: any): void{\n this.cancelOption.emit();\n }\n\n confirm(e: any): void{\n this.confirmOption.emit();\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdPopconfirmComponent } from \"./hd-popconfirm.component\";\n\n@NgModule({\n declarations: [\n HdPopconfirmComponent\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgZorroAntdModule,\n ],\n exports: [HdPopconfirmComponent],\n providers: [],\n bootstrap: [HdPopconfirmComponent]\n})\nexport class HdPopconfirmModule {\n}\n","import { Component, OnInit, Input, OnChanges } from \"@angular/core\";\nimport { statusToColor } from \"./hd-status.service\";\n\n/** status 值 → 颜色,启动时构建一次 */\nconst STATUS_COLOR_MAP: Map<string, string> = (() => {\n const map = new Map<string, string>();\n for (const color of Object.keys(statusToColor)) {\n statusToColor[color].forEach((item) => {\n if (item) {\n map.set(item.toLowerCase(), color);\n }\n });\n }\n return map;\n})();\n\n@Component({\n selector: \"hd-status\",\n templateUrl: \"./hd-status.component.html\",\n styleUrls: [\"./hd-status.component.less\"],\n})\nexport class HdStatusComponent implements OnInit, OnChanges {\n @Input() status: string;\n statusColor: string;\n\n constructor() {}\n\n ngOnInit() {\n this.setStatusColor();\n }\n\n ngOnChanges() {\n this.setStatusColor();\n }\n\n setStatusColor() {\n const statusLower = this.status && this.status.toLowerCase();\n this.statusColor =\n statusLower && STATUS_COLOR_MAP.has(statusLower)\n ? STATUS_COLOR_MAP.get(statusLower)\n : \"#9FA4A2\";\n }\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdStatusComponent } from \"./hd-status.component\";\n\n@NgModule({\n declarations: [\n HdStatusComponent,\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgZorroAntdModule,\n ],\n exports: [HdStatusComponent],\n providers: [],\n bootstrap: [HdStatusComponent]\n})\nexport class HdStatusModule {\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class CommonSessionService {\n putSession(session_key: string, session: any) {\n if (session) {\n window.sessionStorage.setItem(session_key, JSON.stringify(session));\n } else {\n window.sessionStorage.removeItem(session_key);\n }\n }\n\n getSession(session_key: string): any {\n return JSON.parse(window.sessionStorage.getItem(session_key));\n }\n\n removeSession(session_key: string) {\n window.sessionStorage.removeItem(session_key);\n }\n}\n","export const ColWidth = {\n tableImageColWidth: 25, // 表格小图标宽度\n tableTwoImageColWidth: 40, // 表格小图标宽度\n billNumberColWidth: 150, // 单据单号列宽度\n nameColWidth: 150, // 基本资料名称列宽度\n codeColWidth: 100, // 基本资料代码列宽度\n codeNameColWidth: 200, // 用于门店、货主、供应商以“[code]name“格式展示时固定宽度\n enumColWidth: 100, // 枚举列宽度\n dateColWidth: 100, // 单个日期\n dateTimeColWidth: 150, // 单个日期带时间\n dateRangeWidth: 200, // 日期范围\n operateColWidth: 150, // 操作列宽度\n numberColWidth: 100, // 数字列\n remarkColWidth: 250, // 备注列\n fixColWidth: 150, // 不属于以上内容的列统一使用该宽度,增加超长省略\n maxColWidth: 350 // 用于展示订单内容,需要缩略、展开显示的列\n};\n","import { Pipe, PipeTransform } from \"@angular/core\";\nimport { ColWidth } from \"../model/colWidth\";\nimport { HdTableColumn } from \"./hd-table.service\";\n\nexport interface HdTableCellView {\n display: string | number;\n title: string | null;\n isEmpty: boolean;\n overflow: boolean;\n}\n\n@Pipe({ name: \"hdTableCell\", pure: true })\nexport class HdTableCellPipe implements PipeTransform {\n transform(data: any, col: HdTableColumn): HdTableCellView {\n if (!data || !col) {\n return { display: \"<空>\", title: null, isEmpty: true, overflow: false };\n }\n const raw = getHdTableCellRaw(data, col);\n const isEmpty = !(raw || raw === 0);\n const display = isEmpty ? \"<空>\" : raw;\n const maxWidth = col.width || ColWidth.fixColWidth;\n let overflow = false;\n let title: string | null = null;\n if (!isEmpty) {\n const str = String(raw);\n overflow = estimateTextWidth(str) >= maxWidth;\n if (overflow) {\n title = str;\n }\n }\n return { display, title, isEmpty, overflow };\n }\n}\n\n/** 估算文本像素宽度(中文约 14px,英文约 8px) */\nfunction estimateTextWidth(str: string): number {\n let width = 15;\n for (let i = 0; i < str.length; i++) {\n width += str.charCodeAt(i) > 255 ? 14 : 8;\n }\n return width;\n}\n\nfunction getHdTableCellRaw(data: any, col: HdTableColumn): any {\n if (col.render) {\n return col.render(data);\n }\n const name = col.name;\n if (typeof name === \"function\") {\n return name(data);\n }\n if (typeof name === \"string\") {\n return data[name];\n }\n return undefined;\n}\n","\n// 表格行\nexport class HdTableColumn {\n title: string; // 列名\n name: string | Function = null; // 字段名\n render?: (value: any) => string; // 渲染函数\n width?: number; // 列宽\n color?: string; // 颜色\n align?: 'right' | 'left' | 'center' = 'left';\n click?: (value: any) => void;\n fixed?: 'left' | 'right' = null;\n fixedWidth?: number; // 固定列宽度\n btnList?: Array<OperateBtn> = [];\n isShow?: boolean = true;\n canSort?: boolean = false; // 是否可以排序\n canWarp?: boolean = false; // 用于某一列需要个性化的场景,当为true时,且表格选项showOperateColWarpButton为true时,通过按钮控制对应的列是否换行\n minWidth?: number; // 最小宽度,保证列名能正常显示\n stateField?: string; // 状态列取值字段,默认取 state\n isState?: boolean; // 是否按状态列渲染,取值字段为 name\n}\n\nexport class OperateBtn {\n name: string;\n showConfirm?: boolean | ((line: any) => boolean) = false;\n isRepeat?: boolean = false; // 是否和别的按钮有显示冲突,譬如:开启,关闭需要再关闭按钮加一个这个属性\n click?: (value: any) => void;\n permission?: (value: any) => boolean;\n}\n\nexport class HdTableTotalOption {\n columnNumber: number; // 总列数\n insertIndex: number; // 插入下标\n insertName: string; // 插入字段\n}\n\nexport class TableCacheOption {\n pageSize: number;\n colWidths: Map<string, number> = new Map<string, number>(); // name -> width\n cols: Array<string>; // ['title']\n}\n\n// 设置列 树组件对象\nexport class TreeGrid {\n title: string = '';\n key: string = '';\n disabled?: boolean = false;\n checked?: boolean = false;\n selectable?: boolean = false;\n isLeaf?: boolean = true;\n expanded?: boolean = false;\n}","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnInit,\n Output,\n SimpleChange,\n TemplateRef,\n ViewChild,\n} from \"@angular/core\";\nimport { NzTableComponent } from \"ng-zorro-antd/table\";\nimport * as localforage from \"localforage\";\nimport {\n InputBoolean,\n NzFormatBeforeDropEvent,\n NzFormatEmitEvent,\n} from \"ng-zorro-antd/core\";\nimport { NzResizeEvent } from \"ng-zorro-antd/resizable\";\nimport { Observable, of } from \"rxjs\";\nimport { delay } from \"rxjs/operators\";\nimport { ColWidth } from \"../model/colWidth\";\nimport { Page } from \"../model/common-type\";\nimport { CommonSessionService } from \"../service/common-session.service\";\nimport {\n HdTableColumn,\n HdTableTotalOption,\n OperateBtn,\n TableCacheOption,\n TreeGrid,\n} from \"./hd-table.service\";\n@Component({\n selector: \"hd-table\",\n templateUrl: \"./hd-table.component.html\",\n styleUrls: [\"./hd-table.component.less\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HdTableComponent implements OnInit {\n @Input() uuid: string;\n @Input() tableCols: Array<HdTableColumn> = [];\n @Input() tableData: Page<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() showOperateColWarpButton: boolean = false;\n @Input() @InputBoolean() virtualScroll: boolean = true;\n /** 手动指定行高;不传则在首屏渲染后自动测量 */\n @Input() virtualItemSize: number;\n @Input() selectField: string = \"billNumber\";\n // 合计区域\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<HdTableTotalOption>;\n @Output() sortEvent = new EventEmitter();\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n @Input() tableLoading: boolean = false;\n // 表格分页参数\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 100;\n @Input() isFirstEntrySearch: boolean;\n @Input() isCrossPageSelect: boolean;\n @Output() tablePageIndexChange = new EventEmitter<any>();\n @Output() tablePageSizeChange = new EventEmitter<any>();\n @Output() tablePageSizeChangeEvent = new EventEmitter<any>();\n @ContentChild(\"tableTotal\", { static: false }) tableTotal: TemplateRef<any>;\n @ContentChild(\"tableLeftButton\", { static: false })\n tableLeftButton: TemplateRef<any>;\n @ContentChild(\"tableRightButton\", { static: false })\n tableRightButton: TemplateRef<any>;\n scroll = null;\n\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n // 合计参数\n tableTotalOptionList = [];\n // 缓存信息\n tableCacheOption: TableCacheOption = new TableCacheOption();\n userSession: any;\n\n tableColsCache: Array<HdTableColumn> = [];\n showTable: boolean = false;\n selectColListNodes: Array<TreeGrid> = [];\n selectColListNodesCache: Array<TreeGrid> = [];\n showListNodes: boolean = false;\n\n isDropdownVisible: boolean = false;\n // 设置列的可见操作数组\n nowListNodes: Array<TreeGrid> = [];\n // 设置列的不可见操作数组\n hideListNodes: Array<TreeGrid> = [];\n\n // 点击时需要有临时数组存放两个tree,用于取消时候恢复调整前的状态\n cancelNowListNodes: Array<TreeGrid> = [];\n cancelHideListNodes: Array<TreeGrid> = [];\n showDetail: boolean = false;\n localforage: any = null;\n localtionTmp: string = \"\";\n isFirstEntrySearchLocal: boolean = true;\n isCrossPageSelectLocal: boolean = false;\n\n /** 自动测量前的兜底行高,测量完成后会更新 */\n measuredVirtualItemSize = 47;\n\n /** 记录当前是否处于虚拟滚动模式,用于切换 pageSize 时重建表格 */\n private virtualScrollActive: boolean | null = null;\n\n /** 可见列总宽,用于判断是否需要横向滚动 */\n private tableColWidthTotal = 0;\n\n @ViewChild(\"hdTable\", { static: false }) nzTableComponent: NzTableComponent;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private commonSessionService: CommonSessionService,\n ) {\n this.localforage = localforage.createInstance({\n driver: localforage.INDEXEDDB,\n name: \"hd-fscm\", // 设置存储库的名称\n version: 1.0, // 设置存储库的版本\n storeName: \"hd-fscm-store\", // 设置存储库的存储空间名称\n });\n }\n\n ngOnInit(): void {\n if (this.isFirstEntrySearch === false) {\n this.isFirstEntrySearchLocal = this.isFirstEntrySearch;\n }\n if (this.isCrossPageSelect === true) {\n this.isCrossPageSelectLocal = this.isCrossPageSelect;\n }\n this.localtionTmp = location.pathname;\n if (this.localtionTmp) {\n this.localtionTmp = this.localtionTmp.replace(/\\//g, \"_\");\n }\n this.userSession = this.commonSessionService.getSession(\n \"__jy_authorization_session__\",\n );\n // 用于开发环境调试\n if (!this.userSession) {\n this.userSession = {\n userCode: \"dev\",\n };\n }\n\n this.deleteHideItem();\n if (!this.tableCols || this.tableCols.length === 0) {\n return;\n }\n\n this.localforage\n .ready()\n .then(() => {\n this.getInitLocalforage();\n })\n .catch(function (e) {\n console.log(\"localforage加载异常step1\", e);\n throw \"localforage加载异常\";\n });\n }\n\n ngOnChanges(changes: SimpleChange) {\n if (\n changes &&\n changes[\"tableData\"] &&\n changes[\"tableData\"][\"currentValue\"] &&\n changes[\"tableData\"][\"previousValue\"]\n ) {\n if (\n changes[\"tableData\"][\"currentValue\"][\"pageSize\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageSize\"] ||\n changes[\"tableData\"][\"currentValue\"][\"pageNumber\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageNumber\"]\n ) {\n if (this.virtualScroll) {\n this.applyTableScrollMode(true);\n }\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n if (changes[\"tableData\"] && this.virtualScroll) {\n this.applyTableScrollMode(true);\n }\n\n if (\n changes[\"tableCols\"] &&\n JSON.stringify(changes[\"tableCols\"].currentValue) !==\n JSON.stringify(changes[\"tableCols\"].previousValue) &&\n changes[\"tableCols\"].previousValue !== undefined\n ) {\n this.deleteHideItem();\n if (!this.tableCols || this.tableCols.length === 0) {\n return;\n }\n this.localforage\n .ready()\n .then(() => {\n this.getInitLocalforage();\n })\n .catch(function (e) {\n console.log(\"localforage加载异常step2\", e);\n throw \"localforage加载异常\";\n });\n }\n }\n\n deleteHideItem() {\n // 首先把isShow为false数据剔除掉\n this.tableCols = this.tableCols.filter((item) => {\n // 如果对象没有 isShow 属性,则默认为 true,保留该对象\n if (!item.hasOwnProperty(\"isShow\")) {\n return true;\n }\n // 如果对象有 isShow 属性,则检查其值是否为 true\n return item.isShow === true;\n });\n }\n\n sort(sort: { key: string; value: string }) {\n this.sortEvent.emit(sort);\n }\n\n toggleShowDetail(): void {\n this.showDetail = !this.showDetail;\n this.cdr.markForCheck();\n this.refreshVirtualScrollViewport(true);\n }\n\n get effectiveVirtualItemSize(): number {\n if (this.virtualItemSize != null && this.virtualItemSize > 0) {\n return this.virtualItemSize;\n }\n return this.measuredVirtualItemSize;\n }\n\n /** 当前页数据能完整展示时不启用虚拟滚动,避免少量数据也出现滚动条 */\n get useVirtualScroll(): boolean {\n if (!this.virtualScroll) {\n return false;\n }\n const rowCount =\n this.tableData && this.tableData.content\n ? this.tableData.content.length\n : 0;\n if (rowCount <= 0) {\n return false;\n }\n const maxOffset = this.tableTotal ? 180 : 140;\n const estimatedHeight = rowCount * this.effectiveVirtualItemSize;\n if (typeof window !== \"undefined\") {\n return estimatedHeight > window.innerHeight - maxOffset;\n }\n return rowCount > 100;\n }\n\n trackByRow = (index: number, data: any): string => {\n const key = data && data[this.selectField];\n return key != null ? String(key) : `row-${index}`;\n };\n\n /** 虚拟滚动按数组下标追踪,避免业务主键 trackBy 导致 CDK 行复用错位 */\n virtualTrackByRow = (index: number): number => index;\n\n trackByCol = (_index: number, col: HdTableColumn): string => {\n return col.title;\n };\n\n getInitLocalforage() {\n // 首先获取当前hd-table存储的数据 如果没有,则初始化下当前的数据\n this.localforage\n .getItem(\n \"hd-table_\" +\n this.userSession.userCode +\n \"_\" +\n this.localtionTmp +\n \"_\" +\n this.uuid,\n )\n .then((value: TableCacheOption) => {\n if (value) {\n this.tableCacheOption = value;\n this.normalizeTableCacheOption();\n if (\n this.tableCacheOption.pageSize &&\n this.tableCacheOption.pageSize > 10\n ) {\n this.tablePageSize = this.tableCacheOption.pageSize;\n this.tablePageSizeChange.emit(this.tablePageSize);\n }\n } else {\n this.tableCacheOption = new TableCacheOption();\n this.tableCacheOption.pageSize = this.tablePageSize;\n }\n if (this.isFirstEntrySearchLocal) {\n this.tablePageSizeChangeEvent.emit(this.tablePageSize);\n } else {\n this.isFirstEntrySearchLocal = true;\n }\n this.initTable();\n })\n .catch((err) => {\n this.tableCacheOption = new TableCacheOption();\n this.tableCacheOption.pageSize = this.tablePageSize;\n this.initTable();\n });\n }\n\n initTable() {\n this.showTable = false;\n if (!this.uuid) {\n throw \"hd-table缺失uuid参数,请使用编辑器插件生成并给hd-table赋予uuid属性\";\n }\n if (this.judgeRepeatCols()) {\n this.dealCols();\n this.setCols();\n this.dealOperateBtn();\n this.virtualScrollActive = null;\n this.applyTableScrollMode(true);\n }\n }\n\n /** 虚拟/普通模式切换时重建表格,避免残留滚动容器 */\n applyTableScrollMode(forceRemount = false): void {\n const useVirtual = this.useVirtualScroll;\n const modeChanged =\n this.virtualScrollActive !== null &&\n this.virtualScrollActive !== useVirtual;\n this.virtualScrollActive = useVirtual;\n\n if (forceRemount || modeChanged) {\n this.showTable = false;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.showTable = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.dealScroll();\n this.cdr.markForCheck();\n this.afterTableRender(useVirtual);\n });\n });\n return;\n }\n\n this.dealScroll();\n this.cdr.markForCheck();\n this.afterTableRender(useVirtual);\n }\n\n private afterTableRender(useVirtual: boolean): void {\n if (useVirtual) {\n this.refreshVirtualScrollViewport(true);\n return;\n }\n if (this.virtualScroll) {\n this.measureVirtualItemSize(true);\n this.syncHorizontalScroll();\n }\n }\n\n refreshVirtualScrollViewport(forceMeasure = false): void {\n if (!this.useVirtualScroll) {\n if (forceMeasure) {\n this.measureVirtualItemSize(forceMeasure);\n this.dealScroll();\n this.cdr.markForCheck();\n }\n return;\n }\n setTimeout(() => {\n const viewport = this.nzTableComponent &&\n this.nzTableComponent.cdkVirtualScrollViewport;\n if (!viewport) {\n return;\n }\n const measured = this.measureVirtualItemSize(forceMeasure);\n if (measured) {\n this.dealScroll();\n this.cdr.markForCheck();\n viewport.checkViewportSize();\n setTimeout(() => {\n this.measureVirtualItemSize(forceMeasure);\n this.dealScroll();\n viewport.checkViewportSize();\n });\n } else {\n viewport.checkViewportSize();\n }\n });\n }\n\n /** 未手动传 virtualItemSize 时,从已渲染行测量真实高度 */\n measureVirtualItemSize(force = false): boolean {\n if (\n this.virtualItemSize != null &&\n this.virtualItemSize > 0 &&\n !force\n ) {\n return false;\n }\n const viewport = this.nzTableComponent &&\n this.nzTableComponent.cdkVirtualScrollViewport;\n const tableBody = this.nzTableComponent &&\n this.nzTableComponent.tableBodyNativeElement as HTMLElement;\n const row =\n (viewport &&\n ((viewport.elementRef.nativeElement as HTMLElement).querySelector(\n \"tr.hd-table-virtual-row\",\n ) as HTMLElement)) ||\n (tableBody && (tableBody.querySelector(\"tbody tr\") as HTMLElement));\n if (!row || row.offsetHeight <= 0) {\n return false;\n }\n const height = row.offsetHeight;\n if (height === this.measuredVirtualItemSize) {\n return false;\n }\n this.measuredVirtualItemSize = height;\n return true;\n }\n\n // 设置列点击取消\n cancelDropdown(): void {\n this.isDropdownVisible = false;\n this.hideListNodes = JSON.parse(JSON.stringify(this.cancelHideListNodes));\n this.nowListNodes = JSON.parse(JSON.stringify(this.cancelNowListNodes));\n this.cdr.markForCheck();\n }\n\n // 点击触发设置列\n confirmDropdown(): void {\n // 临时存放下,取消的时候恢复原来的状态 深拷贝下对象数组\n this.cancelHideListNodes = JSON.parse(JSON.stringify(this.hideListNodes));\n this.cancelNowListNodes = JSON.parse(JSON.stringify(this.nowListNodes));\n this.isDropdownVisible = true;\n this.cdr.markForCheck();\n }\n\n submitGrids() {\n this.tableCacheOption.cols = [];\n this.nowListNodes.forEach((item) => {\n this.tableCacheOption.cols.push(item.title);\n });\n this.saveTableCacheOption();\n this.initTable();\n this.isDropdownVisible = false;\n this.cdr.markForCheck();\n }\n\n // 从缓存设置列\n setCols() {\n this.showListNodes = false;\n this.nowListNodes = [];\n this.hideListNodes = [];\n if (this.hasColsCache()) {\n let { notIncols, incols } = this.tableColsCache.reduce(\n (acc, item) => {\n if (this.tableCacheOption.cols.includes(item.title)) {\n acc.incols.push(item);\n } else {\n acc.notIncols.push(item);\n }\n return acc;\n },\n { notIncols: [], incols: [] },\n );\n incols.sort((a, b) => {\n return (\n this.tableCacheOption.cols.indexOf(a.title) -\n this.tableCacheOption.cols.indexOf(b.title)\n );\n });\n this.tableCols = incols.concat(notIncols);\n }\n\n this.tableCols.forEach((element, index) => {\n if (this.hasColsCache()) {\n element.isShow = this.tableCacheOption.cols.includes(element.title)\n ? true\n : false;\n if (element.isShow) {\n this.nowListNodes.push({\n title: element.title,\n key: element.title,\n disabled: element.fixed ? true : false,\n // selectable: false,\n checked: this.tableCacheOption.cols.includes(element.title)\n ? true\n : false,\n });\n } else {\n this.hideListNodes.push({\n title: element.title,\n key: element.title,\n disabled: element.fixed ? true : false,\n // selectable: false,\n checked: this.tableCacheOption.cols.includes(element.title)\n ? true\n : false,\n });\n }\n } else {\n element.isShow = true;\n this.nowListNodes.push({\n title: element.title,\n key: element.title,\n checked: true,\n // selectable: false,\n disabled: element.fixed ? true : false,\n });\n }\n });\n\n // 调整列宽为缓存宽度\n if (\n this.tableCacheOption &&\n this.tableCacheOption.colWidths &&\n this.tableCacheOption.colWidths.size !== 0\n ) {\n this.tableCols.forEach((col) => {\n if (this.tableCacheOption.colWidths.has(col.title)) {\n col.width = this.tableCacheOption.colWidths.get(col.title);\n }\n });\n }\n\n this.dealCols();\n setTimeout(() => {\n this.showListNodes = true;\n }, 0);\n }\n\n // 拖拽操作\n beforeDrop = (arg: NzFormatBeforeDropEvent): Observable<boolean> => {\n if (\n arg.node.origin.disabled ||\n !arg.dragNode.origin.checked ||\n arg.pos === 0\n ) {\n return of(false);\n } else {\n let node: TreeGrid = new TreeGrid();\n node.checked = arg.dragNode.origin.checked;\n node.disabled = arg.dragNode.origin.disabled;\n node.expanded = arg.dragNode.origin.expanded;\n node.isLeaf = arg.dragNode.origin.isLeaf;\n node.key = arg.dragNode.origin.key;\n node.selectable = arg.dragNode.origin.selectable;\n node.title = arg.dragNode.origin.title;\n // 拖拽元素下标\n let dragNodeIndex = this.nowListNodes.findIndex((item) => {\n return item.title == arg.dragNode.origin.title;\n });\n // 目标位置的下标\n let nodeIndex =\n this.nowListNodes.findIndex((item) => {\n return item.title == arg.node.origin.title;\n }) + (arg.pos === -1 ? 0 : arg.pos);\n this.nowListNodes.splice(nodeIndex, 0, node);\n this.nowListNodes.splice(\n nodeIndex >= dragNodeIndex ? dragNodeIndex : dragNodeIndex + 1,\n 1,\n );\n return of(true).pipe(delay(100));\n }\n };\n\n moveElementNearby(arr, elementToMoveTitle, targetElementTitle, pos) {\n const tmpArray = JSON.parse(JSON.stringify(arr));\n const targetIndex = tmpArray.findIndex(\n (item) => item.title === targetElementTitle,\n );\n const elementIndex = tmpArray.findIndex(\n (item) => item.title === elementToMoveTitle,\n );\n const newIndex = pos < 0 ? targetIndex + pos : targetIndex;\n // 移除目标元素,并插入到新的位置\n const removedElement = tmpArray.splice(elementIndex, 1);\n tmpArray.splice(newIndex + 1, 0, removedElement[0]);\n return tmpArray;\n }\n\n // 勾选操作\n checkAction(event: NzFormatEmitEvent): void {\n // 勾选只有在hideListNodes,取消勾选只有在nowListNodes\n if (event.node.origin.checked) {\n let node: TreeGrid = new TreeGrid();\n node = this.hideListNodes.find((item) => {\n return item.title === event.node.origin.title;\n });\n node.checked = true;\n // 找到第一个fixed属性为right的title,找到插入元素的位置\n let title = null;\n for (let i = this.tableColsCache.length - 1; i >= 0; i--) {\n if (this.tableColsCache[i].fixed === \"right\") {\n title = this.tableColsCache[i].title;\n break;\n }\n }\n let temporaryNodeList = this.nowListNodes.slice(0);\n if (!title) {\n temporaryNodeList.push(node);\n } else {\n const index = this.nowListNodes.findIndex(\n (node) => node.title === title,\n );\n temporaryNodeList.splice(index, 0, node);\n }\n this.nowListNodes = temporaryNodeList;\n this.hideListNodes = this.hideListNodes.filter((item) => {\n return item.title !== event.node.origin.title;\n });\n } else {\n // if (this.hideListNodes.length === 0 && this.tableCacheOption && this.tableCacheOption.cols) {\n // this.hideListNodes = this.getHideListNodes();\n // }\n let temporaryNodeList = this.hideListNodes.slice(0);\n this.nowListNodes.forEach((item) => {\n if (item.title === event.node.origin.title) {\n const innerItem = JSON.parse(JSON.stringify(item));\n innerItem.checked = false;\n temporaryNodeList.push(innerItem);\n }\n });\n this.hideListNodes = temporaryNodeList;\n\n // 为了防止未选择的数组顺序因为push方法而改变,通过初始数据获取显示的字段列表\n this.nowListNodes = this.nowListNodes.filter((item) => {\n return item.title !== event.node.origin.title;\n });\n }\n this.cdr.markForCheck();\n }\n\n // 防止未选择的数组顺序因为push方法而改变,从初始数据获取隐藏未显示的字段列表\n getHideListNodes(): Array<TreeGrid> {\n let temporaryNodeList: Array<TreeGrid> = [];\n // 从tableColsCache里面找没有在storage里面出现的字段,组成hideList\n this.tableColsCache.forEach((item) => {\n if (!this.tableCacheOption.cols.includes(item.title)) {\n let nodeItem: TreeGrid = new TreeGrid();\n nodeItem.title = item.title;\n nodeItem.key = item.title;\n nodeItem.disabled = item.fixed ? true : false;\n nodeItem.checked = false;\n temporaryNodeList.push(nodeItem);\n }\n });\n return temporaryNodeList;\n }\n\n dealCols() {\n if (!this.tableCols[0].minWidth) {\n this.tableCols.forEach((item) => {\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = item.title;\n document.body.appendChild(span);\n item.minWidth = span.offsetWidth + 16;\n span.style.display = \"none\";\n document.body.removeChild(span);\n });\n }\n // 处理左右吸附的数据在数组中的位置\n const leftFixedCols = this.tableCols.filter((col) => col.fixed === \"left\");\n const rightFixedCols = this.tableCols.filter(\n (col) => col.fixed === \"right\",\n );\n const normalCols = this.tableCols.filter((col) => !col.fixed);\n const resultCols = leftFixedCols.concat(normalCols).concat(rightFixedCols);\n this.tableCols = resultCols;\n if (!this.tableColsCache || this.tableColsCache.length === 0) {\n // 缓存一下表格的数据\n this.tableColsCache = [...this.tableCols];\n }\n }\n\n normalizeTableCacheOption() {\n if (!this.tableCacheOption.colWidths) {\n this.tableCacheOption.colWidths = new Map<string, number>();\n } else if (!(this.tableCacheOption.colWidths instanceof Map)) {\n const colWidths = new Map<string, number>();\n Object.keys(this.tableCacheOption.colWidths).forEach((key) => {\n colWidths.set(key, (this.tableCacheOption.colWidths as any)[key]);\n });\n this.tableCacheOption.colWidths = colWidths;\n }\n }\n\n private hasColsCache(): boolean {\n return !!(this.tableCacheOption && this.tableCacheOption.cols && this.tableCacheOption.cols.length > 0);\n }\n\n saveTableCacheOption() {\n this.localforage.setItem(\n \"hd-table_\" +\n this.userSession.userCode +\n \"_\" +\n this.localtionTmp +\n \"_\" +\n this.uuid,\n this.tableCacheOption,\n );\n }\n\n judgeRepeatCols() {\n for (let i = 0; i < this.tableCols.length; i++) {\n for (let j = i + 1; j < this.tableCols.length; j++) {\n if (this.tableCols[i].title === this.tableCols[j].title) {\n throw `hd-table组件中列名 ${this.tableCols[i].title} 重复`;\n }\n }\n }\n return true;\n }\n\n onResize({ width }: NzResizeEvent, col: HdTableColumn): void {\n this.normalizeTableCacheOption();\n let tempWidth = 0;\n if (width > col.minWidth) {\n tempWidth = width;\n } else {\n tempWidth = col.minWidth;\n }\n this.tableCacheOption.colWidths.set(col.title, tempWidth);\n this.saveTableCacheOption();\n this.tableCols = this.tableCols.map((e) =>\n e.title === col.title ? { ...e, width: tempWidth } : e,\n );\n this.dealScroll();\n this.cdr.markForCheck();\n }\n\n dealOperateBtn() {\n let operateCol = this.tableCols.find((col) => col.title === \"操作\") || null;\n if (operateCol) {\n let textStr = \"\";\n operateCol.btnList.forEach((btn) => {\n if (!btn.isRepeat) {\n textStr += btn.name;\n }\n });\n\n const span = document.createElement(\"a\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = textStr;\n document.body.appendChild(span);\n operateCol.width =\n span.offsetWidth +\n (operateCol.btnList.filter((item) => !item.isRepeat).length - 1) * 4 +\n 16;\n span.style.display = \"none\";\n document.body.removeChild(span);\n }\n }\n\n triggerEvent(fn: any, event: any) {\n if (fn) {\n fn(event);\n }\n }\n\n needShowConfirm(btn: OperateBtn, data: any): boolean {\n if (typeof btn.showConfirm === \"function\") {\n return btn.showConfirm(data);\n }\n return !!btn.showConfirm;\n }\n\n /** 虚拟滚动开启时使用视口最大高度 */\n private getVirtualScrollY(maxOffset: number): string {\n return `calc(100vh - ${maxOffset}px)`;\n }\n\n private getTableViewportWidth(): number {\n if (!this.nzTableComponent || !this.nzTableComponent.tableMainElement) {\n return 0;\n }\n const tableMain = this.nzTableComponent.tableMainElement\n .nativeElement as HTMLElement;\n const wrapper = tableMain.closest(\".ant-table-wrapper\") as HTMLElement;\n if (wrapper && wrapper.clientWidth > 0) {\n return wrapper.clientWidth;\n }\n const host = tableMain.closest(\".hd-table-container\") as HTMLElement;\n if (host && host.clientWidth > 0) {\n return host.clientWidth;\n }\n return 0;\n }\n\n /** 列总宽超出外层容器才启用横向 scroll(不能用 table 自身宽度,会被 scroll.x 撑宽) */\n private resolveScrollX(colWidth: number, useVirtual: boolean): string | null {\n if (colWidth <= 0) {\n return useVirtual ? \"1px\" : null;\n }\n if (useVirtual) {\n return `${colWidth}px`;\n }\n const viewportWidth = this.getTableViewportWidth();\n if (viewportWidth > 0) {\n return colWidth > viewportWidth ? `${colWidth}px` : null;\n }\n if (typeof window !== \"undefined\" && colWidth > window.innerWidth - 32) {\n return `${colWidth}px`;\n }\n return null;\n }\n\n /** 表格渲染后按实际容器宽度校正横向 scroll */\n private syncHorizontalScroll(): void {\n if (!this.virtualScroll || this.useVirtualScroll) {\n return;\n }\n const scrollX = this.resolveScrollX(this.tableColWidthTotal, false);\n if (this.scroll && this.scroll.x === scrollX && this.scroll.y === null) {\n return;\n }\n this.scroll = { x: scrollX, y: null };\n this.cdr.markForCheck();\n }\n\n dealScroll() {\n let colWidth = 0;\n if (this.showSelected) {\n colWidth += 40;\n }\n this.tableCols.forEach((item) => {\n if (!item.width) {\n item.width = ColWidth.fixColWidth;\n }\n if (item.isShow) {\n item.fixedWidth = colWidth;\n colWidth += item.width;\n }\n });\n\n this.tableColWidthTotal = colWidth;\n const maxOffset = this.tableTotal ? 180 : 140;\n const useVirtual = this.useVirtualScroll;\n\n if (this.virtualScroll && !useVirtual) {\n this.scroll = {\n x: this.resolveScrollX(colWidth, false),\n y: null,\n };\n return;\n }\n\n if (!this.virtualScroll) {\n this.scroll = {\n x: \"1px\",\n y: `calc(100vh - ${maxOffset}px)`,\n };\n return;\n }\n\n this.scroll = {\n x: this.resolveScrollX(colWidth, true),\n y: this.getVirtualScrollY(maxOffset),\n };\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n this.cdr.markForCheck();\n }\n\n search(reset: boolean) {\n this.tableCacheOption.pageSize = this.tablePageSize;\n this.saveTableCacheOption();\n if (reset) {\n this.tablePageSizeChange.emit(this.tablePageSize);\n this.tablePageSizeChangeEvent.emit(this.tablePageSize);\n } else {\n this.tablePageIndexChange.emit(this.tablePageIndex);\n // 触发父组件查询事件\n this.tableSearchEvent.emit(reset);\n }\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n this.cdr.markForCheck();\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n const selectedList: Array<any> = Object.values(this.mapOfCheckList);\n this.selectEvent.emit(selectedList);\n }\n // 如果数据为空,则清空勾选标识\n if (this.tableData.content.length === 0) {\n this.isAllDisplayDataChecked = false;\n }\n this.cdr.markForCheck();\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n this.cdr.markForCheck();\n }\n\n judgeColEmpty(str: any) {\n if (str || str === 0) {\n return str;\n } else {\n return \"<空>\";\n }\n }\n\n getStateField(col: HdTableColumn): string {\n if (col.isState) {\n return col.name as string;\n }\n return col.stateField || 'state';\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\nimport { NzResizableModule } from 'ng-zorro-antd/resizable';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\nimport { NzTreeModule } from 'ng-zorro-antd/tree';\nimport { HdButtonGroupModule } from '../hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\nimport { HdStatusModule } from '../hd-status/hd-status.module';\nimport { CommonSessionService } from '../service/common-session.service';\nimport { HdTableCellPipe } from './hd-table-cell.pipe';\nimport { HdTableComponent } from './hd-table.component';\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n HdSpaceModule,\n HdStatusModule,\n HdButtonModule,\n HdButtonGroupModule,\n NzToolTipModule,\n NzPopconfirmModule,\n NzResizableModule,\n NzDropDownModule,\n NzTreeModule,\n NzIconModule\n ],\n declarations: [HdTableComponent, HdTableCellPipe],\n providers: [CommonSessionService],\n exports: [HdTableComponent],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class HdTableModule { }\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'hd-tip',\n templateUrl: './hd-tip.component.html',\n styleUrls: ['./hd-tip.component.less']\n})\nexport class HdTipComponent implements OnInit {\n @Input() showIcon: boolean = true;\n @Input() fontSize: number;\n @Input() title: string;\n constructor() { }\n\n ngOnInit() {\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdTipComponent } from './hd-tip.component';\nimport {NgZorroAntdModule} from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule\n ],\n exports: [HdTipComponent],\n declarations: [HdTipComponent]\n})\nexport class HdTipModule { }\n","import { Injectable, Optional } from \"@angular/core\";\nimport { NavigationStart, Router } from \"@angular/router\";\nimport { filter } from \"rxjs/operators\";\n\n/**\n * 全局清理 ng-zorro tooltip 残留 overlay。\n * 典型场景:hover 出 tooltip 后立刻点击跳转/打开详情,CDK overlay 未销毁,飘到下一页。\n *\n * 引入 FantasyNgzorroModule 后自动生效,也可手动注入调用 clearStuckTooltips()。\n */\n@Injectable({ providedIn: \"root\" })\nexport class HdOverlayCleanupService {\n private started = false;\n\n constructor(@Optional() private router: Router) {\n this.start();\n }\n\n /** 启动全局监听(幂等) */\n start(): void {\n if (this.started || typeof document === \"undefined\") {\n return;\n }\n this.started = true;\n\n // 任意按下即清:覆盖跳路由、开抽屉/弹窗等不走 Navigation 的场景\n document.addEventListener(\n \"mousedown\",\n () => this.clearStuckTooltips(),\n true,\n );\n\n if (this.router) {\n this.router.events\n .pipe(filter((e) => e instanceof NavigationStart))\n .subscribe(() => this.clearStuckTooltips());\n }\n }\n\n /** 清理残留在 body 上的 ant-tooltip overlay */\n clearStuckTooltips(): void {\n if (typeof document === \"undefined\") {\n return;\n }\n const tooltips = document.querySelectorAll(\n \".cdk-overlay-container .ant-tooltip\",\n );\n tooltips.forEach((el) => {\n const pane = el.closest(\".cdk-overlay-pane\") as HTMLElement | null;\n if (pane && pane.parentNode) {\n pane.parentNode.removeChild(pane);\n }\n });\n }\n}\n","import { HdButtonGroupModule } from './hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from './hd-button/hd-button.module';\n\nimport { HdDetailFormModule } from './hd-detail-form/hd-detail-form.module';\nimport { HdDetailLinesModule } from './hd-detail-lines/hd-detail-lines.module';\nimport { HdDetailLinesPageModule } from './hd-detail-lines-page/hd-detail-lines-page.module';\nimport { HdDetailTipModule } from './hd-detail-tip/hd-detail-tip.module';\n\nimport { HdFilterModule } from './hd-filter/hd-filter.module';\nimport { HdFormLinesModule } from './hd-form-lines/hd-form-lines.module';\nimport { HdFormModule } from './hd-form/hd-form.module';\n\nimport { NgModule } from '@angular/core';\nimport { HdCurrentTableModule } from './hd-current-table/hd-current-table.module';\nimport { HdLogModule } from './hd-log/hd-log.module';\nimport { HdPopconfirmModule } from './hd-popconfirm/hd-popconfirm.module';\nimport { HdSpaceModule } from './hd-space/hd-space.module';\nimport { HdStatusModule } from './hd-status/hd-status.module';\nimport { HdTableModule } from './hd-table/hd-table.module';\nimport { HdTipModule } from './hd-tip/hd-tip.module';\nimport { HdOverlayCleanupService } from './service/hd-overlay-cleanup.service';\n@NgModule({\n exports: [\n HdButtonModule,\n HdButtonGroupModule,\n\n HdDetailFormModule,\n HdDetailLinesModule,\n HdDetailLinesPageModule,\n HdDetailTipModule,\n\n HdFilterModule,\n HdFormModule,\n HdFormLinesModule,\n\n HdSpaceModule,\n HdStatusModule,\n HdCurrentTableModule,\n HdTableModule,\n HdTipModule,\n HdPopconfirmModule,\n HdLogModule\n ]\n})\n\nexport class HdComponentModule {\n // 单独引入 HdComponentModule 时也启动全局 tooltip 清理\n constructor(_overlayCleanup: HdOverlayCleanupService) {}\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdComponentModule } from \"./hd-component.module\";\nimport { HdLogComponent } from './hd-log/hd-log.component';\nimport { HdOverlayCleanupService } from './service/hd-overlay-cleanup.service';\n@NgModule({\n imports: [CommonModule],\n exports: [HdComponentModule],\n providers: [],\n entryComponents: [HdLogComponent]\n})\nexport class FantasyNgzorroModule {\n // 注入以启动全局 tooltip overlay 清理(providedIn: root,幂等)\n constructor(_overlayCleanup: HdOverlayCleanupService) {}\n}\n","import { HdOption } from \"../model/common-type\";\n\n// 表格行\nexport class TableColumn {\n label: string; // 文本\n name: string; // 字段名称\n value?: string | boolean | Array<string | Date> | null = null; // 值 不传默认为null\n selectList?: Array<HdOption>; // 控件为Select时,选项列表\n // 组件内部成员\n show?: boolean;\n}\n\n//\nexport class TableTotalOption {\n columnNumber: number; // 总列数\n insertIndex: number; // 插入下标\n insertName: string; // 插入字段\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdDetailFormService {\n\n constructor() { }\n\n}\n","export class TotalOption {\n insertIndex: number; // 插入下标\n insertValue: any; // 插入值\n align?: string; // 靠左还是靠右\n showDecimal?: boolean; // 是否显示小数位\n isHide?: boolean; // 是否隐藏, 这里只针对列会同步消失的场景\n}\n","import { Injectable } from '@angular/core';\nimport { SelectOption, CascaderOption, InputNumber } from '../model/common-type';\n\n// 控件列表\nexport class Filter {\n type: FilterListType;\n label: string; // 文本\n name: string; // 字段名称\n placeholder?: string; // 输入框提示文案\n value?: string | boolean | number | Array<string | Date> | null = null; // 值 不传默认为null\n // 组件内部成员\n show?: boolean;\n selectOption?: SelectOption; // 控件为Select时,选项列表\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onBlurEvent?: Function; // 控件失去焦点事件\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n showTime?: boolean = false; // 日期选择器是否包含时间\n require?: boolean = false; // 是否必填\n cascaderOption?: CascaderOption; // 级联选择器配置\n onChangeEventDebounceTime?: number; // change事件防抖\n onSearchEventEventDebounceTime?: number; // search事件防抖\n}\n\n\n// 控件类型\nexport enum FilterListType {\n Input, // 输入框\n Select, // 单项选择器\n Date, // 单个日期选择\n DateRange, // 日期范围选择\n MultipleSelect, // 多选\n Cascader, // 级联选择\n Month, // 月份选择\n InputNumber // 数字输入\n}\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdFilterService {\n\n constructor() {\n }\n\n}\n","import { FormItem } from './hd-form/hd-form.service';\nimport { round } from 'lodash';\n// 工具类\nexport const Utils = {\n /**\n * 填充select控件选项\n * @param formList 入参数组 Array<any>\n * @param name 需要填充options的属性名称\n * @param options 选项列表\n */\n fillSelectOption(formList: Array<any>, name: string, options: Array<any>) {\n const returnData = formList;\n if (!returnData || !returnData.length) {\n return returnData;\n }\n const length = formList.length;\n for (let i = 0; i < length; i++) {\n if (returnData[i].name === name) {\n returnData[i].selectOption.selectList = options;\n }\n }\n return returnData;\n },\n\n /**\n * 填充FormItem数组:针对入参list的每一个FormItem,判断obj中是否有对应的name字段,如果有,则填充value。\n * @param list 入参数组 Array<FormItem>\n * @param obj 需要填充到list的属性\n */\n fillArrayFormItem(list: Array<FormItem>, obj: Object) {\n const returnData = [];\n if (!list || !list.length) {\n return returnData;\n }\n const length = list.length;\n for (let i = 0; i < length; i++) {\n if (obj[list[i].name]) {\n list[i].value = obj[list[i].name];\n }\n }\n return list;\n },\n\n /**\n * 数组转换成选择器的选项数组\n * @param list 入参数组 字符串数组或对象数组\n * @param option 转换选项\n * 注:list为字符串数组,option不需要传,按照标准的label、value转换\n */\n arrayToSelectOptionList(list: Array<any>, option?: {\n value: string,\n label: string,\n valueTip?: string,\n labelTip?: string\n }) {\n const returnData = [];\n if (!list || !list.length) {\n return returnData;\n }\n if (option) {\n if (option.labelTip && option.valueTip) {\n list.forEach((item) => {\n const returnItem: any = item;\n returnItem.label = item[option.label];\n returnItem.value = item[option.value];\n if (option.valueTip) {\n returnItem[option.valueTip] = item[option.value];\n }\n if (option.labelTip) {\n returnItem[option.labelTip] = item[option.label];\n }\n returnData.push(returnItem);\n });\n } else {\n list.forEach((item) => {\n const returnItem: any = item;\n returnItem.label = item[option.label];\n returnItem.value = item[option.value];\n returnData.push(returnItem);\n });\n }\n } else {\n list.forEach((item) => {\n const returnItem: any = {};\n returnItem.label = item;\n returnItem.value = item;\n returnData.push(returnItem);\n });\n }\n return returnData;\n },\n\n /**\n * 求和\n * @param nums 数组\n * @param precision 精度\n */\n add(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n let result = 0;\n for (const num of nums) {\n result += num;\n }\n return round(result, precision);\n },\n\n /**\n * 减法\n * @param nums 数组\n * @param precision 精度\n */\n subtract(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n if (nums.length < 2) {\n throw new Error('减法入参数量至少要2个!');\n }\n let result = nums.shift();\n for (const num of nums) {\n result -= num;\n }\n return round(result, precision);\n },\n\n /**\n * 乘法\n * @param nums 数组\n * @param precision 精度\n */\n multiply(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n let result = 1;\n for (const num of nums) {\n result = result * num;\n }\n return round(result, precision);\n },\n\n /**\n * 除法\n * @param nums 数组\n * @param precision 精度\n */\n divide(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n if (nums.length < 2) {\n throw new Error('除法入参数量至少要2个!');\n }\n let result = nums.shift();\n for (const num of nums) {\n if (num === 0) {\n throw new Error('除数不能为0!');\n }\n result = result / num;\n }\n return round(result, precision);\n }\n};\n","export const StaticConst = {\n MaxPageSize: 99999999\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/tslib/tslib.es6.js","ng://fantasy-ngzorro/hd-button-group/hd-button-group.component.ts","ng://fantasy-ngzorro/hd-button-group/hd-button-group.module.ts","ng://fantasy-ngzorro/hd-button/hd-button.service.ts","ng://fantasy-ngzorro/hd-button/hd-button.component.ts","ng://fantasy-ngzorro/hd-button/hd-button.module.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.component.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.module.ts","ng://fantasy-ngzorro/hd-space/hd-space.service.ts","ng://fantasy-ngzorro/hd-space/hd-space.component.ts","ng://fantasy-ngzorro/hd-space/hd-space.module.ts","ng://fantasy-ngzorro/model/common-type.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.component.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.module.ts","ng://fantasy-ngzorro/hd-detail-lines-page/hd-detail-lines-page.component.ts","ng://fantasy-ngzorro/hd-detail-lines-page/hd-detail-lines-page.module.ts","ng://fantasy-ngzorro/hd-status/hd-status.service.ts","ng://fantasy-ngzorro/hd-detail-tip/hd-detail-tip.component.ts","ng://fantasy-ngzorro/hd-detail-tip/hd-detail-tip.module.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.component.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.module.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.service.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.component.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.module.ts","ng://fantasy-ngzorro/hd-form/hd-form.service.ts","ng://fantasy-ngzorro/hd-form/hd-form.component.ts","ng://fantasy-ngzorro/hd-form/hd-form.module.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.component.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.module.ts","ng://fantasy-ngzorro/hd-log/hd-log.component.ts","ng://fantasy-ngzorro/hd-log/hd-log.service.ts","ng://fantasy-ngzorro/hd-log/hd-log.module.ts","ng://fantasy-ngzorro/hd-popconfirm/hd-popconfirm.component.ts","ng://fantasy-ngzorro/hd-popconfirm/hd-popconfirm.module.ts","ng://fantasy-ngzorro/hd-status/hd-status.component.ts","ng://fantasy-ngzorro/hd-status/hd-status.module.ts","ng://fantasy-ngzorro/service/common-session.service.ts","ng://fantasy-ngzorro/model/colWidth.ts","ng://fantasy-ngzorro/hd-table/hd-table-cell.pipe.ts","ng://fantasy-ngzorro/hd-table/hd-table.service.ts","ng://fantasy-ngzorro/hd-table/hd-table.component.ts","ng://fantasy-ngzorro/hd-table/hd-table.module.ts","ng://fantasy-ngzorro/hd-tip/hd-tip.component.ts","ng://fantasy-ngzorro/hd-tip/hd-tip.module.ts","ng://fantasy-ngzorro/service/hd-overlay-cleanup.service.ts","ng://fantasy-ngzorro/hd-component.module.ts","ng://fantasy-ngzorro/fantasy-ngzorro.module.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.service.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.service.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.service.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.service.ts","ng://fantasy-ngzorro/utils.ts","ng://fantasy-ngzorro/model/staticConst.ts"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__decorate","decorators","target","key","desc","d","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__metadata","metadataKey","metadataValue","metadata","__values","o","Symbol","iterator","m","next","value","done","TypeError","__read","e","ar","push","error","__spread","concat","HdButtonGroupComponent","ngOnInit","Component","args","selector","template","ContentChild","static","HdButtonGroupModule","NgModule","imports","CommonModule","FormsModule","NgZorroAntdModule","declarations","exports","primary","dashed","danger","default","link","submit","reset","add","normal","small","HdButtonService","Injectable","providedIn","HdButtonComponent","type","ButtonType","size","ButtonSize","disabled","clickAction","EventEmitter","nzOnConfirm","loading","observers","innerClickAction","option","emit","Input","Output","tslib_1.__decorate","InputBoolean","HdButtonModule","HdDetailFormComponent","formCols","Array","nzColumn","xxl","xl","lg","md","sm","xs","filter","item","hide","ngOnChanges","changes","JSON","stringify","currentValue","previousValue","triggerEvent","fn","event","HdDetailFormModule","Style","HdSpaceService","HdSpaceComponent","SpaceType","background","style","HdSpaceModule","ReactiveFormsModule","totalPages","totalElements","pageNumber","pageSize","hasContent","hasNext","content","HdOption","SelectOption","showLabelAndValue","hdDropdownMatchSelectWidth","hdServerSearch","hdShowItemCode","hdShowSearch","hdAllowClear","RadioOption","CheckboxOption","SelectOptionTableColumn","SelectOptionTableColumnIcon","InputNumber","min","max","step","precision","CascaderOption","HdDetailLinesComponent","showSelected","allowDrop","showSearch","searchFields","scroll","x","selectField","selectEvent","showTotal","totalOption","columnsNumber","hdFrontPagination","totalOptionList","tableData","Page","tableLoading","tablePageIndex","tablePageSize","isAllDisplayDataChecked","isIndeterminate","listOfDisplayData","listOfAllData","mapOfCheckedId","mapOfCheckList","displayLines","isFilterData","storeFormLinesData","syncStoreFromLinesInput","applyDisplayFromStore","countSelected","calculateTotal","lines","source","data","parse","restoreFromStore","searchLines","_this","filterStr","trim","filterValue","toLowerCase","filteredData","_c","tslib_1.__values","keys","_d","toString","includes","_e","_f","selectedField","forEach","round","drop","moveItemInArray","previousIndex","currentIndex","Number","fill","insertIndex","insertValue","align","showDecimal","isHide","currentPageDataChange","$event","refreshStatus","resetStatus","every","some","values","checkAll","HdDetailLinesModule","NzTableModule","DragDropModule","schemas","NO_ERRORS_SCHEMA","HdDetailLinesPageComponent","tablePageIndexChange","tablePageSizeChange","pageChange","isCrossPageSelectLocal","isCrossPageSelect","getRowIndex","localIndex","onPageIndexChange","pageIndex","onPageSizeChange","HdDetailLinesPageModule","statusToColor","#FAB13B","#9FA4A2","#F5222D","#3B77E3","#20B95D","#F05B24","HdDetailTipComponent","HdStatusService","tip","setStatusColor","findKey","state","indexOf","toUpperCase","statusColor","HdDetailTipModule","HdFilterComponent","fb","searchEvent","resetEvent","isShowMore","filterListModular","searchSubject","Subject","debounceTimeout","searchSubscription","pipe","debounceTime","subscribe","_a","selectOption","init","checkList","filterList","formGroupList","index","name","control","show","validateFilterForm","group","onChangeEvent","onChangeEventDebounceTime","get","valueChanges","onSearchEvent","onSearchEventDebounceTime","unsubscribe","computeOffset","list","nameList","tslib_1.__spread","Set","submitForm","getRawValue","resetForm","resetFilterFormWithValue","resetValue","patchValue","getFilterData","showMore","inputClean","patchObject","FormBuilder","HdFilterModule","require","hideViewDomValue","inputNumber","hdShowToday","showTime","canSearch","ColorOption","ExplainOption","Select","Date","DateRange","TextArea","MultipleSelect","ViewDom","Switch","Time","HdFormLinesService","HdFormLinesComponent","cdr","showLineNumber","allowEmpty","deleteLastLineEvent","showKeyboardOperateTip","showCheckbox","operateButtons","changeEvent","addLineEvent","selectionChange","showDeleteConfirm","paginationPageIndex","paginationPageSize","showForm","filterStoreFormLinesData","filterIndexStore","formValid","selectedRowIds","openChangeSubject","openChangeDebounceTimeout","collectDomList","activeDomX","activeDomY","activeDom","activeSelectedComponentOpen","deleteLineEvent","textWidthCache","line","openChangeSubscription","formLinesData","ngAfterViewInit","collectDomData","formInputDomListSub","formInputDomList","ngOnDestroy","linesFormArray","controls","count","btn","Math","buttons","generateRowId","now","random","slice","getRowId","getCurrentPageLines","start","end","isLineChecked","id","has","isAllChecked","pageLines","checkedCount","onAllChecked","checked","delete","emitSelectionChange","onLineCheckedChange","getSelectedLines","markForCheck","removeLineFromSelection","applyValuesToLine","emitEvent","addControl","setValue","markAsPristine","onlySelf","markAsUntouched","updateValueAndValidity","formItem","formLines","find","detectChanges","getControlValidateStatus","empty","undefined","dirty","touched","hasError","limitInputLength","maxLength","input","getSelectedLinesData","result","mountedById","Map","set","_hdRowId","batchFillSelected","storeItem","clearSelection","clear","getSelectedCount","formLinesLeftButton","formLinesRightButton","setActiveSelectedComponentOpen","setTimeout","domList","document","querySelectorAll","dom","header","remove","oldIndex","getOldDomIndex","insertBefore","createDOMStructure","firstChild","getSelectTableColumnStyle","column","width","hdOptionHeader","createElement","className","paddingLeft","SELECT_TABLE_OPTION_HORIZONTAL_PADDING","paddingRight","tableColumns","selectOptionTableColumn","columnDiv","widthStyle","label","labelText","createTextNode","appendChild","pageDomList","toArray","startIndex","endIndex","pageLinesLength","formLinesLength","interval","splice","disableInputNumberKeyboardStep","j","this_1","NzInputNumberComponent","onKeyDown","keyCode","setValidateValue","jumpToNextInput","y","NzSelectComponent","console","log","focusDom","addNewLineAndFocus","ceil","addFormLine","jumpToPrevInput","jumpDirection","cleanFocusDom","dom_1","nzDisabled","nzSelectTopControlComponent","inputElement","nativeElement","scrollIntoView","behavior","block","inline","nzSelectService","mode","focus","inputDom_1","getElementById","nzId","select","ElementRef","NzDatePickerComponent","NzRangePickerComponent","NzTimePickerComponent","setActiveDom","blur","nzOpen","open","setActiveDomInFormLines","rowNumber","colNumber","getDomIndex","nowActiveDom_1","test","typeList","validateHdFormLines","getValid","debounceMs","onOpenChangeEvent","onOpenChangeEventDebounceTime","innerGetValid","tmpValidateHdFormLines","array","formLinesDataItem","formGroupObj","judgeValueIsNotEmpty","Validators","required","lineIndex","formGroupTmp","insert","valid","getLines","allLines","setStoreData","_b","getStyle","styleObj","min-width","colorOption","color","isEdit","createForm","addFormLineWithData","isTrulyEmptyAllowed","onHdFormValueChanged","newLine","newLineItem","delayJumpToNextInput","createLineFromValues","isEmptyLine","regenerateRowId","rowId","isHdFormLineSearchAdd","formGroupSubmit","handleChange","FormLineType","calculateLineNumber","afterLine","isFocus","insertAt","getInsertIndexAfter","floor","toPageLocalRowIndex","copyFormLine","sourceIndex","sourceValues","deleteFormLine","lineOrIndex","removeAt","removedLine","at","maxPage","idx","globalIndex","pageIndexChange","pageSizeChange","lines_1","getNowLines","addIndex","deletedIndex_1","filterIndex_1","pop","selectOptionCheckList","innerItem","selectValue","querySelector","isTextOverflow","text","maxWidth","cachedWidth","span","visibility","position","whiteSpace","fontSize","display","innerText","body","isOverflow","offsetWidth","removeChild","judgeColEmpty","str","ChangeDetectorRef","ViewChildren","HdFormLinesModule","totalWidth","isRowFirst","ValidatorKey","Cascader","Radio","Checkbox","HdFormService","HdFormComponent","inputNumberDefaultFormatter","inputNumberDefaultParser","formList","dealRow","year","month","day","newDateStr","toLocaleDateString","replace","validator","formItemDate","map","FormListType","checkboxOption","checkboxValue","isArray","validateHdForm","formListLength","columnItems","space","markAsDirty","isCheckboxChecked","current","onCheckboxItemChange","HdFormModule","HdCurrentTableComponent","showTableTotal","tableSearchEvent","tableTotalOptionList","search","selectedList","HdCurrentTableModule","HdLogComponent","HdLogService","modalService","showLogs","logs","create","nzTitle","nzContent","nzComponentParams","nzFooter","nzWidth","NzModalService","HdLogModule","entryComponents","providers","HdPopconfirmComponent","confirmOption","cancelOption","cancel","confirm","HdPopconfirmModule","bootstrap","STATUS_COLOR_MAP","HdStatusComponent","statusLower","status","HdStatusModule","CommonSessionService","putSession","session_key","session","window","sessionStorage","setItem","removeItem","getSession","getItem","removeSession","ColWidth","tableImageColWidth","tableTwoImageColWidth","billNumberColWidth","nameColWidth","codeColWidth","codeNameColWidth","enumColWidth","dateColWidth","dateTimeColWidth","dateRangeWidth","operateColWidth","numberColWidth","remarkColWidth","fixColWidth","maxColWidth","HdTableCellPipe","transform","col","title","isEmpty","overflow","raw","render","getHdTableCellRaw","String","charCodeAt","estimateTextWidth","Pipe","pure","fixed","btnList","isShow","canSort","canWarp","OperateBtn","showConfirm","isRepeat","HdTableTotalOption","TableCacheOption","colWidths","selectable","isLeaf","expanded","HdTableComponent","commonSessionService","tableCols","showOperateColWarpButton","virtualScroll","sortEvent","tablePageSizeChangeEvent","tableCacheOption","tableColsCache","showTable","selectColListNodes","selectColListNodesCache","showListNodes","isDropdownVisible","nowListNodes","hideListNodes","cancelNowListNodes","cancelHideListNodes","showDetail","localforage","localtionTmp","isFirstEntrySearchLocal","measuredVirtualItemSize","virtualScrollActive","tableColWidthTotal","trackByRow","virtualTrackByRow","trackByCol","_index","beforeDrop","arg","node","origin","dragNode","pos","of","TreeGrid","dragNodeIndex","findIndex","nodeIndex","delay","localforage.createInstance","driver","localforage.INDEXEDDB","version","storeName","isFirstEntrySearch","location","pathname","userSession","userCode","deleteHideItem","ready","then","getInitLocalforage","catch","applyTableScrollMode","sort","toggleShowDetail","refreshVirtualScrollViewport","virtualItemSize","rowCount","maxOffset","tableTotal","estimatedHeight","effectiveVirtualItemSize","innerHeight","uuid","normalizeTableCacheOption","initTable","err","judgeRepeatCols","dealCols","setCols","dealOperateBtn","forceRemount","useVirtual","useVirtualScroll","modeChanged","dealScroll","afterTableRender","measureVirtualItemSize","syncHorizontalScroll","forceMeasure","viewport","nzTableComponent","cdkVirtualScrollViewport","checkViewportSize","force","tableBody","row","elementRef","offsetHeight","height","cancelDropdown","confirmDropdown","submitGrids","cols","saveTableCacheOption","hasColsCache","reduce","notIncols","incols","a","b","element","moveElementNearby","arr","elementToMoveTitle","targetElementTitle","tmpArray","targetIndex","elementIndex","newIndex","removedElement","checkAction","title_1","temporaryNodeList","temporaryNodeList_1","getHideListNodes","nodeItem","minWidth","leftFixedCols","rightFixedCols","normalCols","resultCols","colWidths_1","onResize","tempWidth","operateCol","textStr_1","needShowConfirm","getVirtualScrollY","getTableViewportWidth","tableMainElement","tableMain","wrapper","closest","clientWidth","host","resolveScrollX","colWidth","viewportWidth","innerWidth","scrollX","fixedWidth","getStateField","isState","stateField","changeDetection","ChangeDetectionStrategy","OnPush","ViewChild","HdTableModule","NzToolTipModule","NzPopconfirmModule","NzResizableModule","NzDropDownModule","NzTreeModule","NzIconModule","HdTipComponent","showIcon","HdTipModule","HdOverlayCleanupService","router","started","addEventListener","clearStuckTooltips","events","NavigationStart","el","pane","parentNode","Router","Optional","HdComponentModule","_overlayCleanup","FantasyNgzorroModule","HdDetailFormService","TotalOption","Month","HdFilterService","Utils","fillSelectOption","options","returnData","selectList","fillArrayFormItem","obj","arrayToSelectOptionList","labelTip","valueTip","returnItem","nums","Error","num","nums_1","nums_1_1","subtract","shift","nums_2","nums_2_1","multiply","nums_3","nums_3_1","divide","nums_4","nums_4_1","MaxPageSize"],"mappings":";;;;;;;;;;;;;;oFA6BO,IAAIA,EAAW,WAQlB,OAPAA,EAAWC,OAAOC,QAAU,SAAkBC,GAC1C,IAAK,IAAIC,EAAGC,EAAI,EAAGC,EAAIC,UAAUC,OAAQH,EAAIC,EAAGD,IAE5C,IAAK,IAAII,KADTL,EAAIG,UAAUF,GACOJ,OAAOS,UAAUC,eAAeC,KAAKR,EAAGK,KAAIN,EAAEM,GAAKL,EAAEK,IAE9E,OAAON,IAEKU,MAAMC,KAAMP,YAezB,SAASQ,EAAWC,EAAYC,EAAQC,EAAKC,GAChD,IAA2HC,EAAvHC,EAAId,UAAUC,OAAQc,EAAID,EAAI,EAAIJ,EAAkB,OAATE,EAAgBA,EAAOlB,OAAOsB,yBAAyBN,EAAQC,GAAOC,EACrH,GAAuB,iBAAZK,SAAoD,mBAArBA,QAAQC,SAAyBH,EAAIE,QAAQC,SAAST,EAAYC,EAAQC,EAAKC,QACpH,IAAK,IAAId,EAAIW,EAAWR,OAAS,EAAGH,GAAK,EAAGA,KAASe,EAAIJ,EAAWX,MAAIiB,GAAKD,EAAI,EAAID,EAAEE,GAAKD,EAAI,EAAID,EAAEH,EAAQC,EAAKI,GAAKF,EAAEH,EAAQC,KAASI,GAChJ,OAAOD,EAAI,GAAKC,GAAKrB,OAAOyB,eAAeT,EAAQC,EAAKI,GAAIA,EAOzD,SAASK,EAAWC,EAAaC,GACpC,GAAuB,iBAAZL,SAAoD,mBAArBA,QAAQM,SAAyB,OAAON,QAAQM,SAASF,EAAaC,GAkD7G,SAASE,EAASC,GACrB,IAAI5B,EAAsB,mBAAX6B,QAAyBA,OAAOC,SAAUC,EAAI/B,GAAK4B,EAAE5B,GAAIC,EAAI,EAC5E,GAAI8B,EAAG,OAAOA,EAAEvB,KAAKoB,GACrB,GAAIA,GAAyB,iBAAbA,EAAExB,OAAqB,MAAO,CAC1C4B,KAAM,WAEF,OADIJ,GAAK3B,GAAK2B,EAAExB,SAAQwB,OAAI,GACrB,CAAEK,MAAOL,GAAKA,EAAE3B,KAAMiC,MAAON,KAG5C,MAAM,IAAIO,UAAUnC,EAAI,0BAA4B,mCAGjD,SAASoC,EAAOR,EAAG1B,GACtB,IAAI6B,EAAsB,mBAAXF,QAAyBD,EAAEC,OAAOC,UACjD,IAAKC,EAAG,OAAOH,EACf,IAAmBV,EAAYmB,EAA3BpC,EAAI8B,EAAEvB,KAAKoB,GAAOU,EAAK,GAC3B,IACI,WAAc,IAANpC,GAAgBA,KAAM,MAAQgB,EAAIjB,EAAE+B,QAAQE,MAAMI,EAAGC,KAAKrB,EAAEe,OAExE,MAAOO,GAASH,EAAI,CAAEG,MAAOA,GACjC,QACQ,IACQtB,IAAMA,EAAEgB,OAASH,EAAI9B,EAAU,SAAI8B,EAAEvB,KAAKP,GAE1D,QAAkB,GAAIoC,EAAG,MAAMA,EAAEG,OAE7B,OAAOF,EAGJ,SAASG,IACZ,IAAK,IAAIH,EAAK,GAAIrC,EAAI,EAAGA,EAAIE,UAAUC,OAAQH,IAC3CqC,EAAKA,EAAGI,OAAON,EAAOjC,UAAUF,KACpC,OAAOqC,EClJX,IAAAK,EAAA,WAWE,SAAAA,KAKF,OAHEA,EAAArC,UAAAsC,SAAA,iCAXDC,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,kBACVC,SAAA,68FAICC,EAAAA,aAAYH,KAAA,CAAC,kBAAmB,CAAEI,QAAQ,8BAC1CD,EAAAA,aAAYH,KAAA,CAAC,mBAAoB,CAAEI,QAAQ,OAO9CP,EAhBA,GCAA,IAAAQ,EAAA,WAMA,SAAAA,KASmC,2BATlCC,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAC,EAAAA,mBAEFC,aAAc,CAACd,GACfe,QAAS,CAACf,OAEuBQ,EAfnC,MCGEQ,QAAU,UACVC,OAAS,SACTC,OAAS,SACTC,QAAU,UACVC,KAAO,OACPC,OAAS,SAETC,MAAQ,QACRC,IAAM,UAINC,OAAS,SACTC,MAAQ,sBAQR,SAAAC,gCALDC,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,wKCHZ,SAAAC,IANS9D,KAAA+D,KAAmBC,EAAWZ,QAC9BpD,KAAAiE,KAAmBC,EAAWT,OAEdzD,KAAAmE,UAAoB,EACnCnE,KAAAoE,YAAc,IAAIC,EAAAA,aAClBrE,KAAAsE,YAAc,IAAID,EAAAA,aAwB9B,OArBEP,EAAAlE,UAAAsC,SAAA,WACE,KAAsB,IAAjBlC,KAAKuE,UAAsC,IAAjBvE,KAAKuE,UAA2D,IAAtCvE,KAAKoE,YAAYI,UAAU9E,QAAsD,IAAtCM,KAAKsE,YAAYE,UAAU9E,OAC7H,KAAM,2DAER,GAAkB,WAAdM,KAAK+D,KACP,KAAM,0CAKV5E,OAAAyB,eAAIkD,EAAAlE,UAAA,aAAU,KAAd,WACE,OAAOI,KAAKmE,UAAYnE,KAAKuE,yCAG/BT,EAAAlE,UAAA6E,iBAAA,SAAiBC,GAEX1E,KAAKuE,SAGTvE,KAAKoE,YAAYO,KAAKD,wBAnCzBvC,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,YACVC,SAAA,yuHAMCsC,EAAAA,oBACAA,EAAAA,uBACAA,EAAAA,wBACAA,EAAAA,2BACAC,EAAAA,4BACAA,EAAAA,UAHwBC,EAAAA,CAAfC,EAAAA,uEACeD,EAAAA,CAAfC,EAAAA,wEA0BZjB,KCxCA,IAAAkB,EAAA,WAMA,SAAAA,KAS8B,2BAT7BtC,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAC,EAAAA,mBAEFC,aAAc,CAACe,GACfd,QAAS,CAACc,OAEkBkB,EAf9B,GCAAC,EAAA,WAcE,SAAAA,IALSjF,KAAAkF,SAA4B,IAAIC,MAEhCnF,KAAAoF,SACP,CAAEC,IAAK,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,EAAGC,GAAI,GAyB9C,OArBET,EAAArF,UAAAsC,SAAA,WACMlC,KAAKkF,UAAYlF,KAAKkF,SAASxF,OAAS,IAE1CM,KAAKkF,SAAWlF,KAAKkF,SAASS,QAAM,SAACC,GAAQ,OAACA,EAAKC,UAIvDZ,EAAArF,UAAAkG,YAAA,SAAYC,GACNA,EAAkB,UAAKC,KAAKC,UAAUF,EAAkB,SAAEG,gBAAkBF,KAAKC,UAAUF,EAAkB,SAAEI,gBAC7GnG,KAAKkF,UAAYlF,KAAKkF,SAASxF,OAAS,IAE1CM,KAAKkF,SAAWlF,KAAKkF,SAASS,QAAM,SAACC,GAAQ,OAACA,EAAKC,UAKzDZ,EAAArF,UAAAwG,aAAA,SAAaC,GACPA,GACFA,EAAGC,4BA/BRnE,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,iBACVC,SAAA,2lIAICsC,EAAAA,wBAEAA,EAAAA,SA0BHK,EArCA,GCAA,IAAAsB,EAAA,WAKA,SAAAA,KAQkC,2BARjC7D,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAE,EAAAA,mBAEFE,QAAS,CAACiC,GACVlC,aAAc,CAACkC,OAEiBsB,EAblC,KCGQ,MAIRC,EAAA,cAMA,WAKE,SAAAC,yBALD7C,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,sJADd,GAAA,ICbA6C,EAAA,WAeE,SAAAA,IANS1G,KAAA+D,KAAkB4C,EAElB3G,KAAA4G,WAAqB,UAE9B5G,KAAA6G,MAAe,IAAIL,EAerB,OAXEE,EAAA9G,UAAAsC,SAAA,WACElC,KAAK6G,MAAkB,WAAI7G,KAAK4G,WAC7B5G,KAAK+D,OAAS4C,GACf3G,KAAK6G,MAAa,MAAI,OACtB7G,KAAK6G,MAAc,OAAI7G,KAAKiE,KAAO,OAEnCjE,KAAK6G,MAAc,OAAI,OACvB7G,KAAK6G,MAAa,MAAI7G,KAAKiE,KAAO,2BArBvC9B,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,WACVC,SAAA,qJAICsC,EAAAA,oBACAA,EAAAA,0BACAA,EAAAA,SAiBH8B,EA5BA,GCAA,IAAAI,EAAA,WAMA,SAAAA,KAU6B,2BAV5BpE,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAkE,EAAAA,oBACAjE,EAAAA,mBAEFC,aAAc,CAAC2D,GACf1D,QAAS,CAAC0D,OAEiBI,EAhB7B,KCAA,WACE9G,KAAAgH,WAAa,EACbhH,KAAAiH,cAAgB,EAChBjH,KAAAkH,WAAa,EACblH,KAAAmH,SAAW,GACXnH,KAAAoH,YAAa,EACbpH,KAAAqH,SAAU,EACVrH,KAAAsH,QAAoB,IAGtB,IAAAC,EAAA,aASA,IAAAC,EAAA,WAKExH,KAAAyH,mBAA8B,EAC9BzH,KAAA0H,4BAAuC,EACvC1H,KAAA2H,gBAA2B,EAC3B3H,KAAA4H,gBAA2B,EAE3B5H,KAAA6H,cAAyB,EACzB7H,KAAA8H,cAAyB,GAG3B,IAAAC,EAAA,WAIE/H,KAAAyH,mBAA8B,GAGhC,IAAAO,EAAA,WAIEhI,KAAAyH,mBAA8B,GAGhC,IAAAQ,EAAA,aAQA,IAAAC,EAAA,aAKA,IAAAC,EAAA,WACEnI,KAAAoI,IAAe,EACfpI,KAAAqI,IAAe,SACfrI,KAAAsI,KAAgB,EAChBtI,KAAAuI,UAAqB,GAKvB,IAAAC,EAAA,8BCLE,SAAAC,IAxCyBzI,KAAA0I,cAAwB,EACxB1I,KAAA2I,WAAqB,EACrB3I,KAAA4I,YAAsB,EAEtC5I,KAAA6I,aAAyB,GACzB7I,KAAA8I,OAAoC,CAAEC,EAAG,OACzC/I,KAAAgJ,YAAsB,aAErBhJ,KAAAiJ,YAAc,IAAI5E,EAAAA,aAMHrE,KAAAkJ,WAAqB,EACrClJ,KAAAmJ,YAAkC,GAClCnJ,KAAAoJ,cAAiC,EACjCpJ,KAAAqJ,mBAA6B,EACtCrJ,KAAAsJ,gBAAkB,GAElBtJ,KAAAuJ,UAAuB,IAAIC,EAC3BxJ,KAAAyJ,cAAwB,EAExBzJ,KAAA0J,eAAyB,EAChB1J,KAAA2J,cAAwB,IAEjC3J,KAAA4J,yBAA0B,EAC1B5J,KAAA6J,iBAAkB,EAClB7J,KAAA8J,kBAAoB,GACpB9J,KAAA+J,cAAgB,GAEhB/J,KAAAgK,eAA6C,GAC7ChK,KAAAiK,eAAyC,GAGzCjK,KAAAkK,aAA2B,GAE3BlK,KAAAmK,cAAe,EACfnK,KAAAoK,mBAA0B,GAoM5B,OAhME3B,EAAA7I,UAAAsC,SAAA,WACElC,KAAKqK,0BACLrK,KAAKsK,wBACLtK,KAAKuK,gBACLvK,KAAKwK,kBAGP/B,EAAA7I,UAAAkG,YAAA,SAAYC,GACNA,EAAe,QACZ/F,KAAKmK,aAIPnK,KAAKoK,oBAC6B,IAAnCpK,KAAKoK,mBAAmB1K,QAExBM,KAAKqK,2BANLrK,KAAKqK,0BACLrK,KAAKkK,aAAelK,KAAKyK,OAAS,KAQtCzK,KAAKuK,gBACLvK,KAAKwK,kBAGC/B,EAAA7I,UAAAyK,wBAAR,SAAgCK,OACxBC,EAAOD,GAAU1K,KAAKyK,MAC5BzK,KAAKoK,mBAAqBO,EAAO3E,KAAK4E,MAAM5E,KAAKC,UAAU0E,IAAS,IAI9DlC,EAAA7I,UAAA0K,sBAAR,WACMtK,KAAKyK,OAASzK,KAAKyK,MAAM/K,OAAS,EACpCM,KAAKkK,aAAelK,KAAKyK,MAG3BzK,KAAKkK,aAAelK,KAAKoK,mBACrBpE,KAAK4E,MAAM5E,KAAKC,UAAUjG,KAAKoK,qBAC/B,IAGE3B,EAAA7I,UAAAiL,iBAAR,WACE7K,KAAKmK,cAAe,EACpBnK,KAAKsK,wBACLtK,KAAKyJ,cAAe,EACpBzJ,KAAKuK,gBACLvK,KAAKwK,kBAIP/B,EAAA7I,UAAAkL,YAAA,WAAA,IAAAC,EAAA/K,KAEE,IAAKA,KAAKgL,YAAchL,KAAKgL,UAAUC,OAAQ,CAC7C,IAAKjL,KAAKoK,oBAAsBpK,KAAKoK,mBAAmB1K,OAAS,EAC/D,OAIF,OAFAM,KAAKyJ,cAAe,OACpBzJ,KAAK6K,mBAGP,GAAK7K,KAAKoK,sBAAsBpK,KAAKoK,mBAAmB1K,OAAS,GAAjE,CAGAM,KAAKyJ,cAAe,MACdyB,EAAclL,KAAKgL,UAAUC,OAAOE,cAC1CnL,KAAKmK,cAAe,MAEdiB,EAAepL,KAAKoK,mBAAmBzE,QAAM,SAAEgF,eACnD,IAAKI,EAAKlC,cAA6C,IAA7BkC,EAAKlC,aAAanJ,OAAc,KACxD,IAAmB,IAAA2L,EAAAC,EAAAnM,OAAOoM,KAAKZ,IAAKa,EAAAH,EAAA/J,QAAAkK,EAAAhK,KAAAgK,EAAAH,EAAA/J,OAAE,CACpC,GACEqJ,EAFO/E,EAAI4F,EAAAjK,QAGXoJ,EAAK/E,GAAM6F,WAAWN,cAAcO,SAASR,GAE7C,OAAO,oGAGX,OAAO,MAET,IAAmB,IAAAS,EAAAL,EAAAP,EAAKlC,cAAY+C,EAAAD,EAAArK,QAAAsK,EAAApK,KAAAoK,EAAAD,EAAArK,OAAE,CAAjC,IAAMsE,EACT,GACE+E,EAFO/E,EAAIgG,EAAArK,QAGXoJ,EAAK/E,GAAM6F,WAAWN,cAAcO,SAASR,GAE7C,OAAO,oGAGX,OAAO,KAETlL,KAAKkK,aAAelE,KAAK4E,MAAM5E,KAAKC,UAAUmF,IAC9CpL,KAAKyJ,cAAe,EACpBzJ,KAAKuK,gBACLvK,KAAKwK,mBAGC/B,EAAA7I,UAAA2K,cAAR,WAAA,IAAAQ,EAAA/K,KAEIA,KAAK0I,cACL1I,KAAK6L,eACL7L,KAAKkK,cACLlK,KAAKkK,aAAaxK,SAElBM,KAAKkK,aAAa4B,SAAO,SAAElG,IACQ,IAA7BA,EAAKmF,EAAKc,iBACZd,EAAKf,eAAepE,EAAKmF,EAAK/B,eAAgB,EAC9C+B,EAAKd,eAAerE,EAAKmF,EAAK/B,cAAgBpD,MAIhD5F,KAAKkK,aAAaxK,SAAWP,OAAOoM,KAAKvL,KAAKiK,gBAAgBvK,SAE9DM,KAAK4J,yBAA0B,EAC/B5J,KAAK6J,iBAAkB,KAK7B1K,OAAAyB,eAAI6H,EAAA7I,UAAA,cAAW,KAAf,WACE,OAAOmM,EAAAA,uCAGTtD,EAAA7I,UAAAoM,KAAA,SAAK1F,GACH2F,EAAAA,gBAAgBjM,KAAKkK,aAAc5D,EAAM4F,cAAe5F,EAAM6F,cAC9DnM,KAAKkK,aAAelE,KAAK4E,MAAM5E,KAAKC,UAAUjG,KAAKkK,eAC9ClK,KAAKmK,eACRnK,KAAKoK,mBAAqBpE,KAAK4E,MAAM5E,KAAKC,UAAUjG,KAAKkK,iBAI7DzB,EAAA7I,UAAA4K,eAAA,WAAA,IAAAO,EAAA/K,KAEMA,KAAKkJ,WAAalJ,KAAKkK,cAAgBlK,KAAKkK,aAAaxK,SAC3DM,KAAKsJ,gBAAkB,IAAInE,MAAMiH,OAAOpM,KAAKoJ,eAAiB,GAAGiD,KAAK,IACtErM,KAAKmJ,YAAY2C,SAAO,SAAElG,GACpBA,EAAK0G,cAAgB1G,EAAK2G,aAAoC,IAArB3G,EAAK2G,eAChDxB,EAAKzB,gBAAgB1D,EAAK0G,YAAc,GAAK,CAC3C/K,MAAOqE,EAAK2G,YACZC,MAAO5G,EAAK4G,OAAS,QACrBC,YAAa7G,EAAK6G,cAAe,EACjCC,OAAQ9G,EAAK8G,SAAU,SAQjCjE,EAAA7I,UAAA+M,sBAAA,SAAsBC,GACpB5M,KAAK8J,kBAAoB8C,EACzB5M,KAAK6M,iBAGPpE,EAAA7I,UAAAkN,YAAA,WACE9M,KAAK4J,yBAA0B,EAC/B5J,KAAK6J,iBAAkB,EACvB7J,KAAKgK,eAAiB,GACtBhK,KAAKiK,eAAiB,GACtBjK,KAAKiJ,YAAYtE,KAAK,KAGxB8D,EAAA7I,UAAAiN,cAAA,SAAcvG,EAAwBqE,GAAtC,IAAAI,EAAA/K,UAAc,IAAAsG,IAAAA,GAAA,QAAwB,IAAAqE,IAAAA,EAAA,MAChCrE,GAASqE,GACV3K,KAAKiK,eAAeU,EAAK3K,KAAKgJ,gBAC5BhJ,KAAKiK,eAAeU,EAAK3K,KAAKgJ,cAAgB2B,IACvCrE,GAASqE,GACnB3K,KAAKiK,eAAeU,EAAK3K,KAAKgJ,sBACrBhJ,KAAKiK,eAAeU,EAAK3K,KAAKgJ,cAEzChJ,KAAK4J,wBAA0B5J,KAAK8J,kBAAkBiD,OAAK,SACxDnH,GAAS,OAAAmF,EAAKf,eAAepE,EAAKmF,EAAK/B,iBAE1ChJ,KAAK6J,gBACH7J,KAAK8J,kBAAkBkD,MAAI,SACxBpH,GAAS,OAAAmF,EAAKf,eAAepE,EAAKmF,EAAK/B,mBACpChJ,KAAK4J,wBAET5J,KAAKiJ,aACPjJ,KAAKiJ,YAAYtE,KAAKxF,OAAO8N,OAAOjN,KAAKiK,kBAI7CxB,EAAA7I,UAAAsN,SAAA,SAAS3L,GAAT,IAAAwJ,EAAA/K,KACEA,KAAK8J,kBAAkBgC,SAAO,SAAElG,GAC1BrE,GACDwJ,EAAKd,eAAerE,EAAKmF,EAAK/B,gBAC5B+B,EAAKd,eAAerE,EAAKmF,EAAK/B,cAAgBpD,GAEjDmF,EAAKd,eAAerE,EAAKmF,EAAK/B,sBACrB+B,EAAKd,eAAerE,EAAKmF,EAAK/B,cAEzC+B,EAAKf,eAAepE,EAAKmF,EAAK/B,cAAgBzH,KAEhDvB,KAAK6M,qCA/OR1K,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,kBACVC,SAAA,25MAICsC,EAAAA,4BACAA,EAAAA,yBACAA,EAAAA,0BACAA,EAAAA,4BAEAA,EAAAA,sBACAA,EAAAA,2BACAA,EAAAA,6BACAA,EAAAA,2BACAC,EAAAA,+BACAtC,EAAAA,aAAYH,KAAA,CAAC,iBAAkB,CAAEI,QAAQ,4BAEzCD,EAAAA,aAAYH,KAAA,CAAC,iBAAkB,CAAEI,QAAQ,uBAGzCoC,EAAAA,2BACAA,EAAAA,6BACAA,EAAAA,iCACAA,EAAAA,6BAOAA,EAAAA,SAxBwBE,EAAAA,CAAfC,EAAAA,4EACeD,EAAAA,CAAfC,EAAAA,yEACeD,EAAAA,CAAfC,EAAAA,0EAYeD,EAAAA,CAAfC,EAAAA,yEA4NZ0D,KClQA,IAAA0E,EAAA,WAWA,SAAAA,KAekC,2BAfjCzK,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAwK,EAAAA,cACAC,EAAAA,eACAxK,EAAAA,YACAC,EAAAA,kBACAgE,EACA9B,EACAvC,GAEFM,aAAc,CAAC0F,GACfzF,QAAS,CAACyF,GACV6E,QAAS,CAACC,EAAAA,sBAEsBJ,EA1BlC,gBCuDE,SAAAK,IAhCSxN,KAAAyK,MAAoB,GAEpBzK,KAAAuJ,UAAuB,IAAIC,EACXxJ,KAAA0I,cAAwB,EACxB1I,KAAA2I,WAAqB,EACrC3I,KAAA8I,OAAoC,CAAEC,EAAG,OACzC/I,KAAAgJ,YAAsB,aAGrBhJ,KAAAiJ,YAAc,IAAI5E,EAAAA,aAKHrE,KAAAkJ,WAAqB,EACrClJ,KAAAmJ,YAAkC,GAClCnJ,KAAAoJ,cAAiC,EACjCpJ,KAAAyJ,cAAwB,EACxBzJ,KAAA0J,eAAyB,EACzB1J,KAAA2J,cAAwB,IACvB3J,KAAAyN,qBAAuB,IAAIpJ,EAAAA,aAC3BrE,KAAA0N,oBAAsB,IAAIrJ,EAAAA,aAC1BrE,KAAA2N,WAAa,IAAItJ,EAAAA,aAE3BrE,KAAAsJ,gBAAkB,GAClBtJ,KAAA4J,yBAA0B,EAC1B5J,KAAA6J,iBAAkB,EAClB7J,KAAA8J,kBAAoB,GACpB9J,KAAAgK,eAA6C,GAC7ChK,KAAAiK,eAAyC,GACzCjK,KAAA4N,wBAAkC,EAsKpC,OAlKEJ,EAAA5N,UAAAsC,SAAA,YACiC,IAA3BlC,KAAK6N,oBACP7N,KAAK4N,uBAAyB5N,KAAK6N,mBAErC7N,KAAKuK,gBACLvK,KAAKwK,kBAGPgD,EAAA5N,UAAAkG,YAAA,SAAYC,GACV,GACEA,GACAA,EAAmB,WACnBA,EAAmB,UAAgB,cACnCA,EAAmB,UAAiB,cACpC,CACA,GACEA,EAAmB,UAAgB,aAAY,WAC7CA,EAAmB,UAAiB,cAAY,UAClDA,EAAmB,UAAgB,aAAc,aAC/CA,EAAmB,UAAiB,cAAc,WAIpD,OAFA/F,KAAKuK,qBACLvK,KAAKwK,iBAGFxK,KAAK4N,wBACR5N,KAAK8M,cAGT9M,KAAKuK,gBACLvK,KAAKwK,kBAGPrL,OAAAyB,eAAI4M,EAAA5N,UAAA,eAAY,KAAhB,WACE,OAAII,KAAKyK,OAASzK,KAAKyK,MAAM/K,OACpBM,KAAKyK,MAENzK,KAAKuJ,WAAavJ,KAAKuJ,UAAUjC,SAAY,oCAGvDnI,OAAAyB,eAAI4M,EAAA5N,UAAA,aAAU,KAAd,WACE,OAAII,KAAKuJ,WAA6C,MAAhCvJ,KAAKuJ,UAAUtC,cAC5BjH,KAAKuJ,UAAUtC,cAEjBjH,KAAKkK,aAAaxK,wCAG3B8N,EAAA5N,UAAAkO,YAAA,SAAYC,GACV,OAAQ/N,KAAK0J,eAAiB,GAAK1J,KAAK2J,cAAgBoE,GAG1DP,EAAA5N,UAAAoO,kBAAA,SAAkBC,GAChBjO,KAAK0J,eAAiBuE,EACtBjO,KAAKyN,qBAAqB9I,KAAK3E,KAAK0J,gBACpC1J,KAAK2N,WAAWhJ,QAGlB6I,EAAA5N,UAAAsO,iBAAA,SAAiB/G,GACfnH,KAAK2J,cAAgBxC,EACrBnH,KAAK0J,eAAiB,EACtB1J,KAAK0N,oBAAoB/I,KAAK3E,KAAK2J,eACnC3J,KAAKyN,qBAAqB9I,KAAK3E,KAAK0J,gBACpC1J,KAAK2N,WAAWhJ,QAGV6I,EAAA5N,UAAA2K,cAAR,WAAA,IAAAQ,EAAA/K,KAEIA,KAAK0I,cACL1I,KAAK6L,eACL7L,KAAKkK,cACLlK,KAAKkK,aAAaxK,SAElBM,KAAKkK,aAAa4B,SAAO,SAAElG,IACQ,IAA7BA,EAAKmF,EAAKc,iBACZd,EAAKf,eAAepE,EAAKmF,EAAK/B,eAAgB,EAC9C+B,EAAKd,eAAerE,EAAKmF,EAAK/B,cAAgBpD,MAIhD5F,KAAKkK,aAAaxK,SAAWP,OAAOoM,KAAKvL,KAAKiK,gBAAgBvK,SAE9DM,KAAK4J,yBAA0B,EAC/B5J,KAAK6J,iBAAkB,KAK7B1K,OAAAyB,eAAI4M,EAAA5N,UAAA,cAAW,KAAf,WACE,OAAOmM,EAAAA,uCAGTyB,EAAA5N,UAAAoM,KAAA,SAAK1F,OACGmE,EAAK1I,EAAO/B,KAAKkK,cACvB+B,EAAAA,gBAAgBxB,EAAOnE,EAAM4F,cAAe5F,EAAM6F,cAClDnM,KAAKyK,MAAQA,GAGf+C,EAAA5N,UAAA4K,eAAA,WAAA,IAAAO,EAAA/K,KACMA,KAAKkJ,WAAalJ,KAAKkK,cAAgBlK,KAAKkK,aAAaxK,SAC3DM,KAAKsJ,gBAAkB,IAAInE,MAAMiH,OAAOpM,KAAKoJ,eAAiB,GAAGiD,KAAK,IACtErM,KAAKmJ,YAAY2C,SAAO,SAAElG,GACpBA,EAAK0G,cAAgB1G,EAAK2G,aAAoC,IAArB3G,EAAK2G,eAChDxB,EAAKzB,gBAAgB1D,EAAK0G,YAAc,GAAK,CAC3C/K,MAAOqE,EAAK2G,YACZC,MAAO5G,EAAK4G,OAAS,QACrBC,YAAa7G,EAAK6G,cAAe,EACjCC,OAAQ9G,EAAK8G,SAAU,SAOjCc,EAAA5N,UAAA+M,sBAAA,SAAsBC,GACpB5M,KAAK8J,kBAAoB8C,EACzB5M,KAAK6M,gBACA7M,KAAK4N,wBACR5N,KAAK8M,eAITU,EAAA5N,UAAAkN,YAAA,WACE9M,KAAK4J,yBAA0B,EAC/B5J,KAAK6J,iBAAkB,EACvB7J,KAAKgK,eAAiB,GACtBhK,KAAKiK,eAAiB,GACtBjK,KAAKiJ,YAAYtE,KAAK,KAGxB6I,EAAA5N,UAAAiN,cAAA,SAAcvG,EAAwBqE,GAAtC,IAAAI,EAAA/K,UAAc,IAAAsG,IAAAA,GAAA,QAAwB,IAAAqE,IAAAA,EAAA,MAChCrE,GAASqE,GACV3K,KAAKiK,eAAeU,EAAK3K,KAAKgJ,gBAC5BhJ,KAAKiK,eAAeU,EAAK3K,KAAKgJ,cAAgB2B,IACvCrE,GAASqE,GACnB3K,KAAKiK,eAAeU,EAAK3K,KAAKgJ,sBACrBhJ,KAAKiK,eAAeU,EAAK3K,KAAKgJ,cAEzChJ,KAAK4J,wBAA0B5J,KAAK8J,kBAAkBiD,OAAK,SACxDnH,GAAS,OAAAmF,EAAKf,eAAepE,EAAKmF,EAAK/B,iBAE1ChJ,KAAK6J,gBACH7J,KAAK8J,kBAAkBkD,MAAI,SACxBpH,GAAS,OAAAmF,EAAKf,eAAepE,EAAKmF,EAAK/B,mBACpChJ,KAAK4J,wBACT5J,KAAKiJ,aACPjJ,KAAKiJ,YAAYtE,KAAKxF,OAAO8N,OAAOjN,KAAKiK,kBAI7CuD,EAAA5N,UAAAsN,SAAA,SAAS3L,GAAT,IAAAwJ,EAAA/K,KACEA,KAAK8J,kBAAkBgC,SAAO,SAAElG,GAC1BrE,GACDwJ,EAAKd,eAAerE,EAAKmF,EAAK/B,gBAC5B+B,EAAKd,eAAerE,EAAKmF,EAAK/B,cAAgBpD,GAEjDmF,EAAKd,eAAerE,EAAKmF,EAAK/B,sBACrB+B,EAAKd,eAAerE,EAAKmF,EAAK/B,cAEzC+B,EAAKf,eAAepE,EAAKmF,EAAK/B,cAAgBzH,KAEhDvB,KAAK6M,qCAxMR1K,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,uBACVC,SAAA,68LAICsC,EAAAA,yBAEAA,EAAAA,4BACAA,EAAAA,yBACAA,EAAAA,sBACAA,EAAAA,2BACAA,EAAAA,6BACAA,EAAAA,iCACAA,EAAAA,2BACAC,EAAAA,+BACAtC,EAAAA,aAAYH,KAAA,CAAC,iBAAkB,CAAEI,QAAQ,4BAEzCD,EAAAA,aAAYH,KAAA,CAAC,iBAAkB,CAAEI,QAAQ,uBAEzCoC,EAAAA,2BACAA,EAAAA,6BACAA,EAAAA,4BACAA,EAAAA,8BACAA,EAAAA,6BACAA,EAAAA,oCACAC,EAAAA,oCACAA,EAAAA,2BACAA,EAAAA,UAnBwBC,EAAAA,CAAfC,EAAAA,4EACeD,EAAAA,CAAfC,EAAAA,yEAUeD,EAAAA,CAAfC,EAAAA,yEAsLZyI,KC3NA,IAAAW,EAAA,WAMA,SAAAA,KAMsC,2BANrCzL,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CAACC,EAAAA,aAAcwK,EAAAA,cAAeC,EAAAA,gBACvCtK,aAAc,CAACyK,GACfxK,QAAS,CAACwK,GACVF,QAAS,CAACC,EAAAA,sBAE0BY,EAZtC,GCSaC,EAAgB,CAE3BC,UAAW,CACT,cAAe,cAAe,YAAa,YAAa,YAAa,UAAW,UAChF,mBAAoB,mBAAoB,YAAa,WAAY,aAAc,YAC/E,YAAa,UAAW,YAAa,UAAW,UAAW,mBAAoB,YAC/E,cAAe,eAAgB,aAAc,mBAAoB,cAAe,SAChF,cAAe,SAAU,YAAa,eAAgB,kBAAmB,UACzE,YAAa,SAAU,YAAa,cAAe,WAAY,aAC/D,MAAO,QAAS,OAGlBC,UAAW,CACT,UAAW,UAAW,OAAQ,cAAe,WAAY,aAAc,YAAa,cACpF,YAAa,cAAe,cAAe,MAAO,WAAY,QAAS,QAAS,YAChF,WAAY,SAAU,OAAQ,SAAU,SAAU,eAAgB,aAAc,YAChF,YAAa,SAAU,SAAU,MAAO,MAAO,OAGjDC,UAAW,CACT,SAAU,UAAW,UAAW,QAAS,UAAW,UAAW,WAAY,WAC3E,KAAM,KAAM,MAAO,WAAY,eAAgB,UAAW,UAAW,WAAY,WACjF,GAAI,WAAY,YAAa,YAAa,oBAAqB,kBAC/D,sBAAuB,wBAAyB,wBAAyB,iBACzE,YAAa,UAAW,aAAc,eAAgB,YACtD,MAAO,MAAO,OAGhBC,UAAW,CACT,UAAW,WAAY,WAAY,WAAY,QAAS,YAAa,YAAa,WAClF,MAAO,MAAO,aAAc,gBAAiB,qBAAsB,qBACnE,WAAY,WAAY,UAAW,OAAQ,WAAY,UAAW,WAClE,MAAO,MAAO,MAAO,MAAO,UAG9BC,UAAW,CACT,UAAW,UAAW,WAAY,WAAY,UAAW,QAAS,QAAS,UAAW,QACtF,WAAY,UAAW,WAAY,WAAY,SAAU,SAAU,UAAW,KAAM,SACpF,YAAa,YAAa,UAAW,MAAO,OAAQ,OAAQ,MAAO,WACnE,UAAW,YAAa,YAAa,YAAa,MAAO,OAAQ,aAAc,OAC/E,SAAU,UAAW,UAAW,YAAa,SAAU,cACvD,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAG1DC,UAAW,CACT,kBAAmB,aAAc,SAAU,yBAA0B,OAAQ,OAC7E,gBAAiB,cAAe,eAAgB,kBAAmB,OAAQ,cAC3E,sBCxDJC,GD4DA,WAIE,SAAAC,yBAJDhL,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,sJADd,GC5DA,WASE,SAAA8K,IAIS3O,KAAA6O,IAAc,KA6BzB,OA1BEF,EAAA/O,UAAAsC,SAAA,WACElC,KAAK8O,kBAGPH,EAAA/O,UAAAkG,YAAA,WACE9F,KAAK8O,kBAGPH,EAAA/O,UAAAkP,eAAA,eACMC,EAAU,GACd,IAAK,IAAI3O,KAAOgO,GAEZpO,KAAKgP,QACwC,IAA5CZ,EAAchO,GAAK6O,QAAQjP,KAAKgP,SACyB,IAA1DZ,EAAchO,GAAK6O,QAAQjP,KAAKgP,MAAME,iBACoB,IAA1Dd,EAAchO,GAAK6O,QAAQjP,KAAKgP,MAAM7D,iBAEtC4D,EAAU3O,GAIZJ,KAAKmP,YADHJ,GAGiB,+BApCxB5M,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,gBACVC,SAAA,imGAKCsC,EAAAA,yBACAA,EAAAA,0BACAA,EAAAA,mBACAA,EAAAA,SA6BH+J,EA1CA,ICAA,IAAAS,GAAA,WAMA,SAAAA,KASiC,2BAThC1M,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAC,EAAAA,mBAEFC,aAAc,CAAC4L,GACf3L,QAAS,CAAC2L,OAEqBS,EAfjC,iBCyBE,SAAAC,EAAoBC,GAApB,IAAAvE,EAAA/K,KAAoBA,KAAAsP,GAAAA,EAXVtP,KAAAuP,YAAc,IAAIlL,EAAAA,aAClBrE,KAAAwP,WAAa,IAAInL,EAAAA,aAG3BrE,KAAAyP,YAAsB,EAEtBzP,KAAA0P,kBAA4B,EACpB1P,KAAA2P,cAAgB,IAAIC,EAAAA,QACpB5P,KAAA6P,gBAA0B,EAIhC7P,KAAK8P,mBAAqB9P,KAAK2P,cAAcI,KAC3CC,EAAAA,aAAahQ,KAAK6P,kBAClBI,WAAS,SAAEC,OAAE7J,EAAA6J,EAAA7J,GAAIC,EAAA4J,EAAA5J,MAAO6J,EAAAD,EAAAC,aAAmB,OAAApF,EAAK3E,aAAaC,EAAIC,EAAO6J,MAkJ9E,OA/IEd,EAAAzP,UAAAsC,SAAA,WACElC,KAAKoQ,QAGPf,EAAAzP,UAAAkG,YAAA,WACE9F,KAAKoQ,QAGCf,EAAAzP,UAAAwQ,KAAR,WAAA,IAAArF,EAAA/K,KAGE,GAFAA,KAAKyP,YAAa,GAEbzP,KAAKqQ,UAAUrQ,KAAKsQ,YACvB,KAAM,kBAERtQ,KAAK0P,kBAAoB1P,KAAKsQ,WAAW5Q,OAAS,MAE9C6Q,EAAgB,GACpBvQ,KAAKsQ,WAAWxE,SAAO,SAAElG,EAAM4K,GAC7BD,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QAAQ9K,EAAKrE,MAAO,IAEvDqE,EAAK+K,KAAOH,EAAQ,KAEtBxQ,KAAK4Q,mBAAqB5Q,KAAKsP,GAAGuB,MAAMN,GACxCvQ,KAAKsQ,WAAWxE,SAAO,SAAElG,GACnBA,EAAKkL,gBACHlL,EAAKmL,0BACPhG,EAAK6F,mBAAmBI,IAAIpL,EAAK6K,MAAMQ,aACpClB,KACCC,EAAAA,aAAapK,EAAKmL,4BAEnBd,WAAS,SAAC1O,GAAS,OAAAwJ,EAAK3E,aAAaR,EAAKkL,cAAevP,MAE5DwJ,EAAK6F,mBAAmBI,IAAIpL,EAAK6K,MAAMQ,aAAahB,WAAS,SAAC1O,GAAS,OAAAwJ,EAAK3E,aAAaR,EAAKkL,cAAevP,WAMrH8N,EAAAzP,UAAAsR,cAAA,SAAc7K,EAASC,EAAY6K,EAAgChB,GAAnE,IAAApF,EAAA/K,KACMmR,GAEFnR,KAAK6P,gBAAkBsB,EAGnBnR,KAAK8P,oBACP9P,KAAK8P,mBAAmBsB,cAI1BpR,KAAK8P,mBAAqB9P,KAAK2P,cAAcI,KAC3CC,EAAAA,aAAahQ,KAAK6P,kBAClBI,WAAS,SAAEC,OAAE7J,EAAA6J,EAAA7J,GAAIC,EAAA4J,EAAA5J,MAAO6J,EAAAD,EAAAC,aAAmB,OAAApF,EAAK3E,aAAaC,EAAIC,EAAO6J,MAG1EnQ,KAAK2P,cAAcrO,KAAK,CAAE+E,GAAEA,EAAEC,MAAKA,EAAE6J,aAAYA,KAEjDnQ,KAAKoG,aAAaC,EAAIC,EAAO6J,IAIjCd,EAAAzP,UAAAwG,aAAA,SAAaC,EAASC,EAAY6J,GAChC,GAAI9J,GAAM8J,EACR9J,EAAGC,EAAO6J,OACL,CAAA,IAAI9J,EAGT,OAFAA,EAAGC,KAMP+I,EAAAzP,UAAAyR,cAAA,WAEE,OAA+B,IAA3BrR,KAAKsQ,WAAW5Q,OACX,GAEFM,KAAKyP,WAA0C,IAA3BzP,KAAK0P,mBAA2B1P,KAAKsQ,WAAW5Q,OAAS,EAAK,EAAmC,GAA9B,EAAIM,KAAK0P,mBAAsD,IAA3B1P,KAAK0P,kBAA0B,GAAoC,GAA9B,EAAI1P,KAAK0P,oBAG1KL,EAAAzP,UAAAyQ,UAAR,SAAkBiB,GAChB,IAAKA,GAASA,GAAwB,IAAhBA,EAAK5R,OACzB,OAAO,MAEL6R,EAAW,GASf,GARAD,EAAKxF,SAAO,SAAElG,GAKZ2L,EAAS1P,KAAK+D,EAAK6K,SAGjBe,EAAI,IAAIC,IAAIF,IAAW7R,SAAW4R,EAAK5R,OACzC,KAAM,6BAGR,OAAO,GAGF2P,EAAAzP,UAAA8R,WAAP,WACE1R,KAAKuP,YAAY5K,KAAK3E,KAAK4Q,mBAAmBe,gBAGzCtC,EAAAzP,UAAAgS,UAAP,WACE5R,KAAK6R,2BAED7R,KAAKwP,WAAWhL,UAAU9E,OAAS,EAErCM,KAAKwP,WAAW7K,KAAK3E,KAAK4Q,mBAAmBe,eAG7C3R,KAAKuP,YAAY5K,KAAK3E,KAAK4Q,mBAAmBe,gBAO3CtC,EAAAzP,UAAAiS,yBAAP,eACQC,EAAqC,GAC3C9R,KAAKsQ,WAAWxE,SAAO,SAAElG,GACvBkM,EAAWlM,EAAK6K,MAAQ7K,EAAKrE,SAG/BvB,KAAK4Q,mBAAmBmB,WAAWD,IAG9BzC,EAAAzP,UAAAoS,cAAP,WACE,OAAOhS,KAAK4Q,mBAAmBe,eAG1BtC,EAAAzP,UAAAqS,SAAP,WAAA,IAAAlH,EAAA/K,KACEA,KAAKyP,YAAczP,KAAKyP,WACxBzP,KAAKsQ,WAAWxE,SAAO,SAAElG,EAAM4K,GAC7B5K,EAAK+K,MAAO5F,EAAK0E,YAAae,EAAQ,MAInCnB,EAAAzP,UAAAsS,WAAP,SAAkBvM,OACVwM,EAAc,GACpBA,EAAYxM,EAAO8K,MAAQ,KAE3BzQ,KAAK4Q,mBAAmBmB,WAAWI,wBAtKtChQ,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,YACVC,SAAA,01UAPO8P,EAAAA,mDAYNxN,EAAAA,2BACAC,EAAAA,2BACAA,EAAAA,UA+JHwK,KC9KA,IAAAgD,GAAA,WAMA,SAAAA,KAW8B,2BAX7B3P,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAkE,EAAAA,oBACAjE,EAAAA,kBACAkC,GAEFjC,aAAc,CAACsM,IACfrM,QAAS,CAACqM,QAEkBgD,EAjB9B,MCGA,WAKErS,KAAAsS,SAAoB,EACpBtS,KAAA6F,MAAiB,EACjB7F,KAAAuS,kBAA6B,EAE7BvS,KAAAuB,MAAyE,KASzEvB,KAAAwS,YAA4B,IAAIrK,EAMhCnI,KAAAyS,aAAwB,EAExBzS,KAAA0S,UAAqB,EAErB1S,KAAA2S,WAAsB,GAMxB,IAAAC,GAAA,aAKA,IAAAC,GAAA,qBAQEjO,MAAQ,QACRkO,OAAS,SACTC,KAAO,OACPC,UAAY,YACZC,SAAW,WACX9K,YAAc,cACd+K,eAAiB,iBACjBC,QAAU,UACVC,OAAS,SACTC,KAAO,sBAOP,SAAAC,gCAJD1P,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,2JC5Bd0P,GAAA,WAyFE,SAAAA,EACUjE,EACAkE,GAFV,IAAAzI,EAAA/K,KACUA,KAAAsP,GAAAA,EACAtP,KAAAwT,IAAAA,EAnFexT,KAAAyT,gBAA0B,EAC1BzT,KAAA0T,YAAsB,EACrC1T,KAAA2T,oBAAsB,IAAItP,EAAAA,aACXrE,KAAA4T,wBAAkC,EAClC5T,KAAAyJ,cAAwB,EACxBzJ,KAAA4I,YAAsB,EAEtB5I,KAAA6T,cAAwB,EAIxC7T,KAAA8T,eAAgC,CAAC,MAAO,UACxC9T,KAAA8I,OAAoC,CAAEC,EAAG,OACxC/I,KAAA+T,YAAc,IAAI1P,EAAAA,aAElBrE,KAAAgU,aAAe,IAAI3P,EAAAA,aAEnBrE,KAAAiU,gBAAkB,IAAI5P,EAAAA,aACPrE,KAAAkU,mBAA6B,EACtDlU,KAAAmU,oBAA8B,EAC9BnU,KAAAoU,mBAA6B,GAMJpU,KAAAkJ,WAAqB,EACrClJ,KAAAmJ,YAAkC,GAClCnJ,KAAAoJ,cAAiC,EAC1CpJ,KAAAsJ,gBAAkB,GAElBtJ,KAAAqU,UAAoB,EAEpBrU,KAAAoK,mBAA0B,GAC1BpK,KAAAsU,yBAAgC,GAChCtU,KAAAuU,iBAAkC,GAClCvU,KAAAmK,cAAwB,EACxBnK,KAAAwU,WAAqB,EAEbxU,KAAAyU,eAAiB,IAAIhD,IACrBzR,KAAA2P,cAAgB,IAAIC,EAAAA,QACpB5P,KAAA6P,gBAA0B,EAK1B7P,KAAA0U,kBAAoB,IAAI9E,EAAAA,QACxB5P,KAAA2U,0BAAoC,EAI5C3U,KAAA4U,eASI,GAEJ5U,KAAA6U,WAAqB,KACrB7U,KAAA8U,WAAqB,KACrB9U,KAAA+U,UAM4B,KAC5B/U,KAAAgV,6BAAuC,EAgzC7BhV,KAAAiV,gBAAkB,IAAI5Q,EAAAA,aAuPxBrE,KAAAkV,eAA4C,GAzhDlDlV,KAAK8P,mBAAqB9P,KAAK2P,cAC5BI,KAAKC,EAAAA,aAAahQ,KAAK6P,kBACvBI,WAAS,SAAEC,OAAE7J,EAAA6J,EAAA7J,GAAIC,EAAA4J,EAAA5J,MAAO6O,EAAAjF,EAAAiF,KAAW,OAAApK,EAAK3E,aAAaC,EAAIC,EAAO6O,MACnEnV,KAAKoV,uBAAyBpV,KAAK0U,kBAChC3E,KAAKC,EAAAA,aAAahQ,KAAK2U,4BACvB1E,WAAS,SAAEC,OAAE7J,EAAA6J,EAAA7J,GAAIC,EAAA4J,EAAA5J,MAAO6O,EAAAjF,EAAAiF,KACnB7O,GACFyE,EAAK3E,aAAaC,EAAIC,EAAO6O,MAwjDvC,OAnjDE5B,EAAA3T,UAAAsC,SAAA,WAEElC,KAAKoK,mBAAqBpK,KAAKqV,cAC/BrV,KAAKoQ,QAGPmD,EAAA3T,UAAA0V,gBAAA,WAAA,IAAAvK,EAAA/K,KACEA,KAAKuV,iBACLvV,KAAKwV,oBAAsBxV,KAAKyV,iBAAiB1P,QAAQkK,WAAS,WAChElF,EAAKwK,qBAIThC,EAAA3T,UAAA8V,YAAA,WACM1V,KAAK8P,oBACP9P,KAAK8P,mBAAmBsB,cAEtBpR,KAAKoV,wBACPpV,KAAKoV,uBAAuBhE,cAE1BpR,KAAKwV,qBACPxV,KAAKwV,oBAAoBpE,eAI7BjS,OAAAyB,eAAI2S,EAAA3T,UAAA,kBAAe,KAAnB,WACE,OAAOI,KAAK2V,eAAeC,SAASlW,wCAGtCP,OAAAyB,eAAI2S,EAAA3T,UAAA,kBAAe,KAAnB,eACQiW,GAAS7V,KAAK8T,gBAAkB,IAAInO,QAAM,SAAEmQ,GAChD,MAAA,CAAC,MAAO,OAAQ,UAAUpK,SAASoK,MACnCpW,OACF,OAAOqW,KAAK1N,IAAY,GAARwN,EAAY,qCAI9B1W,OAAAyB,eAAI2S,EAAA3T,UAAA,sBAAmB,KAAvB,eACQoW,GAAWhW,KAAK8T,gBAAkB,IAAInO,QAAM,SAAEmQ,GAClD,MAAA,CAAC,MAAO,OAAQ,UAAUpK,SAASoK,MAErC,OACE9V,KAAK0T,YACc,IAAnBsC,EAAQtW,QACO,WAAfsW,EAAQ,oCAKZ7W,OAAAyB,eAAI2S,EAAA3T,UAAA,iBAAc,KAAlB,WACE,OAAOI,KAAK6T,aAAe,OAAS,uCAG9BN,EAAA3T,UAAAqW,cAAR,WACE,MAAO,UAAUlD,KAAKmD,MAAK,IAAIH,KAAKI,SAAS1K,SAAS,IAAI2K,MAAM,EAAG,IAG7D7C,EAAA3T,UAAAyW,SAAR,SAAiBlB,GACf,OAAKA,GAASA,EAAKnE,IAAI,YAGhBmE,EAAKnE,IAAI,YAAYzP,MAFnB,MAMHgS,EAAA3T,UAAA0W,oBAAR,eACQC,GAASvW,KAAKmU,oBAAsB,GAAKnU,KAAKoU,mBAC9CoC,EAAMD,EAAQvW,KAAKoU,mBACzB,OAAQpU,KAAK2V,eAAuB,SAAiBS,MAAMG,EAAOC,IAGpEjD,EAAA3T,UAAA6W,cAAA,SAActB,OACNuB,EAAK1W,KAAKqW,SAASlB,GACzB,QAASuB,GAAM1W,KAAKyU,eAAekC,IAAID,IAGzCnD,EAAA3T,UAAAgX,aAAA,WAAA,IAAA7L,EAAA/K,KACQ6W,EAAY7W,KAAKsW,sBACvB,OACEO,EAAUnX,OAAS,GACnBmX,EAAU9J,OAAK,SAAEoI,GAAS,OAAApK,EAAK0L,cAActB,OAIjD5B,EAAA3T,UAAAiK,gBAAA,WAAA,IAAAkB,EAAA/K,KACQ6W,EAAY7W,KAAKsW,sBACjBQ,EAAeD,EAAUlR,QAAM,SAAEwP,GACrC,OAAApK,EAAK0L,cAActB,MACnBzV,OACF,OAAOoX,EAAe,GAAKA,EAAeD,EAAUnX,QAGtD6T,EAAA3T,UAAAmX,aAAA,SAAaC,GAAb,IAAAjM,EAAA/K,KACEA,KAAKsW,sBAAsBxK,SAAO,SAAEqJ,OAC5BuB,EAAK3L,EAAKsL,SAASlB,GACpBuB,IAGDM,EACFjM,EAAK0J,eAAejR,IAAIkT,GAExB3L,EAAK0J,eAAewC,OAAOP,OAG/B1W,KAAKkX,uBAGP3D,EAAA3T,UAAAuX,oBAAA,SAAoBhC,EAAiB6B,OAC7BN,EAAK1W,KAAKqW,SAASlB,GACpBuB,IAGDM,EACFhX,KAAKyU,eAAejR,IAAIkT,GAExB1W,KAAKyU,eAAewC,OAAOP,GAE7B1W,KAAKkX,wBAGC3D,EAAA3T,UAAAsX,oBAAR,WACElX,KAAKiU,gBAAgBtP,KAAK3E,KAAKoX,oBAC/BpX,KAAKwT,IAAI6D,gBAGH9D,EAAA3T,UAAA0X,wBAAR,SAAgCnC,OACxBuB,EAAK1W,KAAKqW,SAASlB,GACrBuB,GAAM1W,KAAKyU,eAAekC,IAAID,KAChC1W,KAAKyU,eAAewC,OAAOP,GAC3B1W,KAAKkX,wBAID3D,EAAA3T,UAAA2X,kBAAR,SACEpC,EACAlI,EACAuK,GAHF,IAAAzM,EAAA/K,KAKEb,OAAOoM,KAAK0B,GAAQnB,SAAO,SAAE1L,OACvBsQ,EAAUyE,EAAKnE,IAAI5Q,GAUvB,GATKsQ,IACHyE,EAAKsC,WAAWrX,EAAK2K,EAAKuE,GAAGoB,QAAQzD,EAAO7M,KAC5CsQ,EAAUyE,EAAKnE,IAAI5Q,IAGrBsQ,EAAQgH,SAASzK,EAAO7M,GAAM,CAAEoX,WAAW,IAC3C9G,EAAQiH,eAAe,CAAEC,UAAU,IACnClH,EAAQmH,gBAAgB,CAAED,UAAU,IACpClH,EAAQoH,uBAAuB,CAAEN,WAAW,IACxCA,EAAW,KACPO,EAAWhN,EAAKiN,UAAUC,MAAI,SAAErS,GAAS,OAAAA,EAAK6K,OAASrQ,KACzD2X,GAAYA,EAASjH,eACvB/F,EAAK3E,aAAa2R,EAASjH,cAAe7D,EAAO7M,GAAM+U,OAI7DnV,KAAKwT,IAAI0E,iBAOX3E,EAAA3T,UAAAuY,yBAAA,SAAyBhD,EAAiB4C,OAClCrH,EAAUyE,EAAKnE,IAAI+G,EAAStH,MAClC,IAAKC,GAAWA,EAAQvM,SACtB,MAAO,OAEHiU,EACc,OAAlB1H,EAAQnP,YACU8W,IAAlB3H,EAAQnP,OACU,KAAlBmP,EAAQnP,MACV,OACGmP,EAAQ4H,OAAS5H,EAAQ6H,UAC1BH,GACA1H,EAAQ8H,SAAS,YAEV,QAEF,IAITjF,EAAA3T,UAAA6Y,iBAAA,SAAiBnS,EAAc6O,EAAiB4C,GAC9C,GAAKA,GAAaA,EAASW,UAA3B,KAGMC,EAAQrS,EAAY,OAC1B,GAAIqS,GAASA,EAAMpX,OAASoX,EAAMpX,MAAM7B,OAASqY,EAASW,UAAW,KAC7DpX,EAAOqX,EAAMpX,MAAM6U,MAAM,EAAG2B,EAASW,WAC3CC,EAAMpX,MAAQD,MACRoP,EAAUyE,EAAKnE,IAAI+G,EAAStH,MAC9BC,GACFA,EAAQgH,SAASpW,MAMhBiS,EAAA3T,UAAAwX,iBAAP,WAAA,IAAArM,EAAA/K,KACE,OAAQA,KAAK2V,eAAuB,SAAiBhQ,QAAM,SAAEwP,GAC3D,OAAApK,EAAK0L,cAActB,QAOhB5B,EAAA3T,UAAAgZ,qBAAP,WAAA,IAAA7N,EAAA/K,KACQ6Y,EAAS,GACTC,EAAc,IAAIC,IAwBxB,OAvBC/Y,KAAK2V,eAAuB,SAAiB7J,SAAO,SAAEqJ,OAC/CuB,EAAK3L,EAAKsL,SAASlB,GACrBuB,GAAM3L,EAAK0J,eAAekC,IAAID,IAChCoC,EAAYE,IAAItC,EAAIvB,EAAKxD,mBAI5B3R,KAAKoK,oBAAsB,IAAI0B,SAAO,SAAEnB,OACjC+L,EAAK/L,GAAQA,EAAKsO,SACpBvC,GAAM3L,EAAK0J,eAAekC,IAAID,IAChCmC,EAAOhX,KAAKiX,EAAYnC,IAAID,GAAMoC,EAAY9H,IAAI0F,GAAGxX,EAAA,GAAQyL,OAKjE3K,KAAKyU,eAAe3I,SAAO,SAAE4K,IAExBmC,EAAO7L,MAAI,SAAEpH,GAAS,OAAAA,GAAQA,EAAKqT,WAAavC,MACjDoC,EAAYnC,IAAID,IAEhBmC,EAAOhX,KAAKiX,EAAY9H,IAAI0F,OAGzBmC,GASFtF,EAAA3T,UAAAsZ,kBAAP,SACEjM,EACAuK,GAFF,IAAAzM,EAAA/K,KAIE,QAFA,IAAAwX,IAAAA,GAAA,IAEKvK,GAAuC,IAA7BjN,KAAKyU,eAAexQ,KACjC,OAAO,MAEH6U,EAAc,IAAIC,IACvB/Y,KAAK2V,eAAuB,SAAiB7J,SAAO,SAAEqJ,OAC/CuB,EAAK3L,EAAKsL,SAASlB,GACrBuB,GACFoC,EAAYE,IAAItC,EAAIvB,UAIpBU,EAAQ,EAmBZ,OAlBA7V,KAAKyU,eAAe3I,SAAO,SAAE4K,OACrBvB,EAAO2D,EAAY9H,IAAI0F,GAC7B,GAAIvB,EAGF,OAFApK,EAAKwM,kBAAkBpC,EAAMlI,EAAQuK,QACrC3B,QAIIsD,GAAapO,EAAKX,oBAAsB,IAAI6N,MAAI,SACnDtN,GAAS,OAAAA,GAAQA,EAAKsO,WAAavC,KAElCyC,IACFha,OAAOoM,KAAK0B,GAAQnB,SAAO,SAAE1L,GAC3B+Y,EAAU/Y,GAAO6M,EAAO7M,MAE1ByV,QAGGA,GAIFtC,EAAA3T,UAAAwZ,eAAP,WACmC,IAA7BpZ,KAAKyU,eAAexQ,OAGxBjE,KAAKyU,eAAe4E,QACpBrZ,KAAKkX,wBAIA3D,EAAA3T,UAAA0Z,iBAAP,WACE,OAAOtZ,KAAKyU,eAAexQ,MAI7B9E,OAAAyB,eAAI2S,EAAA3T,UAAA,cAAW,KAAf,WACE,SACII,KAAK4I,YACL5I,KAAK6T,cACL7T,KAAKuZ,qBACLvZ,KAAKwZ,uDAIXjG,EAAA3T,UAAA6Z,+BAAA,SAA+BlY,GAA/B,IAAAwJ,EAAA/K,KACEA,KAAKgV,4BAA8BzT,GACrB,IAAVA,GACFmY,YAAU,eACFC,EAAUC,SAASC,iBACvB,wCAEF,GAAIF,EAAQja,OAAS,EAAG,KAChBoa,EAAMH,EAAQ,GACpBG,EACGD,iBAAiB,qBACjB/N,SAAO,SAAEiO,GAAW,OAAAA,EAAOC,gBACxBC,EAAWlP,EAAKmP,eAAenP,EAAK+J,WAAY/J,EAAKiN,WAC3D8B,EAAIK,aACFpP,EAAKqP,mBACHrP,EAAKiN,UAAUiC,GACflP,EAAK4K,eAAeC,SAASQ,OAC1BrL,EAAKoJ,oBAAsB,GAAKpJ,EAAKqJ,oBACrCrJ,EAAKoJ,oBAAsB,GAAKpJ,EAAKqJ,mBACpCrJ,EAAKqJ,oBACPrJ,EAAK8J,aAETiF,EAAIO,eAGP,IAIP9G,EAAA3T,UAAA0a,0BAAA,SAA0BC,GAGxB,OAAKA,GAAWA,EAAOC,MAGhB,CAAEA,MAAUD,EAAOC,MAAK,MAFtB,CAAEA,MAAO,UAKpBjH,EAAA3T,UAAAwa,mBAAA,SAAmBrC,EAAU5C,GAA7B,IAAApK,EAAA/K,KAEQya,EAAiBb,SAASc,cAAc,OAkC9C,OAjCAD,EAAeE,UAAY,mBAC3BF,EAAe5T,MAAM+T,YAAiBC,OACtCJ,EAAe5T,MAAMiU,aAAkBD,OASvC9C,EAAS5H,aAAa4K,aAAajP,SAAO,SAAEkP,OACpCC,EAAYrB,SAASc,cAAc,OACzCO,EAAUN,UAAY,8BAEhBO,EAAanQ,EAAKuP,0BACtBU,GAKF,GAHAC,EAAUpU,MAAM2T,MAAQU,EAAWV,MAG/BQ,EAAwBG,MAAO,KAC3BC,EAAYxB,SAASyB,eACzBL,EAAwBG,OAE1BF,EAAUK,YAAYF,GAIxBX,EAAea,YAAYL,MAItBR,GAGTlH,EAAA3T,UAAA2V,eAAA,WACEvV,KAAK4U,eAAiB,GAWtB,QAVM2G,EAAcvb,KAAKyV,iBAAiB+F,UAEpCC,GAAczb,KAAKmU,oBAAsB,GAAKnU,KAAKoU,mBACnDsH,EAAW1b,KAAKmU,oBAAsBnU,KAAKoU,mBAG3CuH,GADJD,EAAW1b,KAAK4b,gBAAkB5b,KAAK4b,gBAAkBF,GAChBD,EAErCI,EAAWN,EAAY7b,OAASic,EAE7Bpc,EAAI,EAAGA,EAAIoc,EAAiBpc,IACnCS,KAAK4U,eAAe/S,KAAK0Z,EAAYO,OAAO,EAAGD,IAEjD7b,KAAK+b,kCAOCxI,EAAA3T,UAAAmc,+BAAR,WACE,IAAK,IAAIxc,EAAI,EAAGA,EAAIS,KAAK4U,eAAelV,OAAQH,IAC9C,mBAASyc,OACDlC,EAAMmC,EAAKrH,eAAerV,GAAGyc,GAC/BlC,aAAeoC,EAAAA,yBACjBpC,EAAIqC,UAAS,SAAIxa,GACG,KAAdA,EAAEya,SAAgC,KAAdza,EAAEya,SAGR,KAAdza,EAAEya,SACJtC,EAAIuC,6BARHL,EAAI,EAAGA,EAAIhc,KAAK4U,eAAerV,GAAGG,OAAQsc,MAA1CA,IAiBbzI,EAAA3T,UAAA0c,gBAAA,SAAgBvT,EAAWwT,GAEjB,OAANxT,GACM,OAANwT,GACCvc,KAAK4U,gBACyB,IAA/B5U,KAAK4U,eAAelV,SAMlBM,KAAK+U,qBAAqByH,EAAAA,mBAC5BzT,IAAM/I,KAAK4U,eAAelV,OAAS,GACnC6c,IAAMvc,KAAK4U,eAAe,GAAGlV,OAAS,EAIlC6c,IAAMvc,KAAK4U,eAAe,GAAGlV,OAAS,GACxC+c,QAAQC,IAAI,SAEZ1c,KAAK2c,SAAS5T,EAAI,EAAG,EAAG,WAExB0T,QAAQC,IAAI,SAEZ1c,KAAK2c,SAAS5T,EAAGwT,EAAI,EAAG,UAT1Bvc,KAAK4c,uBAkBTrJ,EAAA3T,UAAAgd,mBAAA,WAAA,IAAA7R,EAAA/K,KAIMA,KAAK6U,aAAe7U,KAAKoU,mBAAqB,EAG9CpU,KAAKmU,oBACL4B,KAAK8G,KAAK7c,KAAK4b,gBAAkB5b,KAAKoU,qBAGtCpU,KAAKmU,sBACLuF,YAAU,WACR3O,EAAKwK,iBACLkH,QAAQC,IAAI,SACZ3R,EAAK4R,SAAS,EAAG,EAAG,WACnB,KAGH3c,KAAK8c,cACL9c,KAAKmU,sBACLuF,YAAU,WACR3O,EAAKwK,iBACLkH,QAAQC,IAAI,SACZ3R,EAAK4R,SAAS,EAAG,KAChB,IAGL3c,KAAK8c,eAKTvJ,EAAA3T,UAAAmd,gBAAA,SAAgBhU,EAAWwT,GAA3B,IAAAxR,EAAA/K,KAEU,OAAN+I,GACM,OAANwT,GACCvc,KAAK4U,gBACyB,IAA/B5U,KAAK4U,eAAelV,SAIZ,IAANqJ,GAAiB,IAANwT,EAgBH,IAANA,GACFE,QAAQC,IAAI,SAEZ1c,KAAK2c,SAAS5T,EAAI,EAAG/I,KAAK4U,eAAe,GAAGlV,OAAS,EAAG,UAExD+c,QAAQC,IAAI,SAEZ1c,KAAK2c,SAAS5T,EAAGwT,EAAI,EAAG,SArBtBvc,KAAKmU,oBAAsB,IAE7BnU,KAAKmU,sBACLuF,YAAU,WACR3O,EAAKwK,iBACLkH,QAAQC,IAAI,SACZ3R,EAAK4R,SACH5R,EAAK6J,eAAelV,OAAS,EAC7BqL,EAAK6J,eAAe,GAAGlV,OAAS,KAEjC,MAsBT6T,EAAA3T,UAAA+c,SAAA,SAAS5T,EAAWwT,EAAWS,GAC7B,QAD6B,IAAAA,IAAAA,EAAA,SAErB,OAANjU,GACM,OAANwT,GACCvc,KAAK4U,gBACyB,IAA/B5U,KAAK4U,eAAelV,SAKtBM,KAAKid,cAAcjd,KAAK6U,WAAY7U,KAAK8U,YACrC9U,KAAK4U,eAAe7L,IAAM/I,KAAK4U,eAAe7L,GAAGwT,IAAI,KACjDW,EAAMld,KAAK4U,eAAe7L,GAAGwT,GAEnC,GAAIW,aAAeV,EAAAA,kBAAmB,CACpC,GAAIU,EAAIC,WAMN,YALsB,UAAlBH,EACFhd,KAAKsc,gBAAgBvT,EAAGwT,GACG,SAAlBS,GACThd,KAAK+c,gBAAgBhU,EAAGwT,IAI5BW,EAAIE,4BAA4BC,aAAaC,cAAcC,eACzD,CAAEC,SAAU,SAAUC,MAAO,SAAUC,OAAQ,WAGhB,aAA7BR,EAAIS,gBAAgBC,KACtBlE,YAAU,WACRwD,EAAIW,UACH,GAEHX,EAAIW,aAED,GAAIX,aAAehB,EAAAA,uBAAwB,CAChD,GAAIgB,EAAIC,WAMN,YALsB,UAAlBH,EACFhd,KAAKsc,gBAAgBvT,EAAGwT,GACG,SAAlBS,GACThd,KAAK+c,gBAAgBhU,EAAGwT,QAItBuB,EAAgBlE,SAASmE,eAAeb,EAAIc,MAClDF,EAASD,QACTC,EAASP,eAAe,CACtBC,SAAU,SACVC,MAAO,SACPC,OAAQ,WAEVhE,YAAU,WACRoE,EAASG,WACR,QACE,GAAIf,aAAegB,EAAAA,WAAY,CACpC,GAAIhB,EAAII,cAAcnZ,SAMpB,YALsB,UAAlB6Y,EACFhd,KAAKsc,gBAAgBvT,EAAGwT,GACG,SAAlBS,GACThd,KAAK+c,gBAAgBhU,EAAGwT,IAI5BW,EAAII,cAAcO,QAClBX,EAAII,cAAcC,eAAe,CAC/BC,SAAU,SACVC,MAAO,SACPC,OAAQ,WAEVhE,YAAU,WACRwD,EAAII,cAAcW,WACjB,QACE,GACLf,aAAeiB,EAAAA,uBACfjB,aAAekB,EAAAA,wBACflB,aAAemB,EAAAA,sBAQf,YALsB,UAAlBrB,EACFhd,KAAKsc,gBAAgBvT,EAAGwT,GACG,SAAlBS,GACThd,KAAK+c,gBAAgBhU,EAAGwT,IAI5Bvc,KAAKse,aAAavV,EAAGwT,KAMzBhJ,EAAA3T,UAAAqd,cAAA,SAAclU,EAAWwT,GACvB,GACQ,OAANxT,GACM,OAANwT,GACCvc,KAAK4U,gBACyB,IAA/B5U,KAAK4U,eAAelV,QAIlBM,KAAK4U,eAAe7L,IAAM/I,KAAK4U,eAAe7L,GAAGwT,GAAI,KACjDzC,EAAM9Z,KAAK4U,eAAe7L,GAAGwT,GAC/BzC,aAAe0C,EAAAA,mBACjB1C,EAAIyE,OACJzE,EAAI0E,QAAS,GACJ1E,aAAeoC,EAAAA,uBACxBpC,EAAIyE,OACKzE,aAAeoE,EAAAA,YACxBpE,EAAIwD,cAAciB,SAMxBhL,EAAA3T,UAAA0e,aAAA,SAAavV,EAAWwT,GACtBvc,KAAK6U,WAAa9L,EAClB/I,KAAK8U,WAAayH,EAClBvc,KAAK+U,UAAY/U,KAAK4U,eAAe5U,KAAK6U,YAAY7U,KAAK8U,YACvD9U,KAAK+U,qBAAqByH,EAAAA,mBAC5Bxc,KAAKyZ,+BAA+BzZ,KAAK+U,UAAU0J,OASvDlL,EAAA3T,UAAA8e,wBAAA,SAAwBC,EAAmBC,GACzC5e,KAAK6U,WAAa8J,EAClB3e,KAAK8U,WAAa9U,KAAK6e,YAAYD,EAAW5e,KAAKgY,WACnDhY,KAAKse,aAAate,KAAK6U,WAAY7U,KAAK8U,aAQ1CvB,EAAA3T,UAAAuc,UAAA,SAAU7V,GAAV,IAAAyE,EAAA/K,KACE,GAAwB,OAApBA,KAAK6U,YAA2C,OAApB7U,KAAK8U,WAGrC,OAAQxO,EAAMlG,KACZ,IAAK,UACH,GACEJ,KAAK+U,qBAAqByH,EAAAA,mBAC1Bxc,KAAKgV,4BAEL,OAEsB,IAApBhV,KAAK6U,YACP7U,KAAK2c,SAAS3c,KAAK6U,WAAa,EAAG7U,KAAK8U,YAE1C,MACF,IAAK,YACH,GACE9U,KAAK+U,qBAAqByH,EAAAA,mBAC1Bxc,KAAKgV,4BAEL,OAGF,GAAIhV,KAAK6U,aAAe7U,KAAK4U,eAAelV,OAAS,EAAG,CACtDM,KAAKid,cAAcjd,KAAK6U,WAAY7U,KAAK8U,YACzC9U,KAAK4c,qBACL,MAEA5c,KAAK2c,SAAS3c,KAAK6U,WAAa,EAAG7U,KAAK8U,YAE1C,MACF,IAAK,YACH9U,KAAK+c,gBAAgB/c,KAAK6U,WAAY7U,KAAK8U,YAC3C,MACF,IAAK,aACH9U,KAAKsc,gBAAgBtc,KAAK6U,WAAY7U,KAAK8U,YAC3C,MACF,IAAK,QACC9U,KAAK+U,qBAAqByH,EAAAA,mBAC5Bxc,KAAKyZ,+BAA+BzZ,KAAK+U,UAAU0J,OACV,IAArCze,KAAKgV,6BACPhV,KAAK2c,SAAS3c,KAAK6U,WAAY7U,KAAK8U,aAE7B9U,KAAK6U,aAAe7U,KAAK4U,eAAelV,OAAS,GAC1DM,KAAK4c,qBAEP,MACF,IAAK,SACH,GAAI5c,KAAK+U,qBAAqByH,EAAAA,kBAAmB,KACzCsC,EAAe9e,KAAc,UACnC0Z,YAAU,WACR3O,EAAK0O,+BAA+BqF,EAAaL,OACR,IAArC1T,EAAKiK,8BACmC,aAAtC8J,EAAanB,gBAAgBC,KAC/BlE,YAAU,WACR3O,EAAK4R,SAAS5R,EAAK8J,WAAY9J,EAAK+J,cACnC,GAEH/J,EAAK4R,SAAS5R,EAAK8J,WAAY9J,EAAK+J,eAGvC,GAEL,MACF,QAEE,GACE9U,KAAK+U,qBAAqByH,EAAAA,oBACW,IAArCxc,KAAKgV,6BACL,gBAAgB+J,KAAKzY,EAAMlG,KAEfJ,KAAK+U,UACbyJ,QAAS,EACbxe,KAAKyZ,gCAA+B,KAqBpClG,EAAA3T,UAAAif,YAAR,SAAoBrO,EAAec,GAWjC,QAVM0N,EAAW,CACf,QACA,SACA,OACA,YACA,WACA,cACA,kBAEE1O,EAAa,GACR/Q,EAAI,EAAGA,EAAI+R,EAAK5R,OAAQH,IAAK,CACpC,GAAIA,IAAMiR,EACR,OAAOF,EAAW5Q,OAGhBsf,EAAStT,SAAS4F,EAAK/R,GAAGwE,QAAUuN,EAAK/R,GAAGsG,MAC9CyK,EAAWzO,KAAKyP,EAAK/R,IAGzB,OAAO,MASDgU,EAAA3T,UAAAsa,eAAR,SAAuB1J,EAAec,GACpCmL,QAAQC,IAAI,QAASlM,GACrBiM,QAAQC,IAAI,OAAQpL,GAWpB,QAVM0N,EAAW,CACf,QACA,SACA,OACA,YACA,WACA,cACA,kBAEE1O,EAAa,GACR/Q,EAAI,EAAGA,EAAI+R,EAAK5R,OAAQH,IAC/B,GAAIyf,EAAStT,SAAS4F,EAAK/R,GAAGwE,QAAUuN,EAAK/R,GAAGsG,OAC9CyK,EAAWzO,KAAKyP,EAAK/R,IACjB+Q,EAAW5Q,SAAW8Q,EAAQ,GAChC,OAAOjR,EAIb,OAAO,MAGTJ,OAAAyB,eAAI2S,EAAA3T,UAAA,iBAAc,KAAlB,WACE,OAAOI,KAAKif,oBAAoBjO,IAAI,0CAGtC7R,OAAAyB,eAAI2S,EAAA3T,UAAA,cAAW,KAAf,WACE,OAAOmM,EAAAA,uCAIFwH,EAAA3T,UAAAsf,SAAP,WACE,OAAOlf,KAAKwU,WAGdjB,EAAA3T,UAAAsR,cAAA,SACE7K,EACAC,EACA6O,EACAhE,GAJF,IAAApG,EAAA/K,KAME,GAAKqG,EAAL,KAGM8Y,EACyB,MAA7BhO,EAAoCA,EAA4B,EAE7DgO,GAGHnf,KAAK6P,gBAAkBsP,EACnBnf,KAAK8P,oBACP9P,KAAK8P,mBAAmBsB,cAE1BpR,KAAK8P,mBAAqB9P,KAAK2P,cAC5BI,KAAKC,EAAAA,aAAahQ,KAAK6P,kBACvBI,WAAS,SAAEC,OAAE7J,EAAA6J,EAAA7J,GAAIC,EAAA4J,EAAA5J,MAAO6O,EAAAjF,EAAAiF,KAAW,OAAApK,EAAK3E,aAAaC,EAAIC,EAAO6O,MACnEnV,KAAK2P,cAAcrO,KAAK,CAAE+E,GAAEA,EAAEC,MAAKA,EAAE6O,KAAIA,KATzCnV,KAAKoG,aAAaC,EAAIC,EAAO6O,GAW/BuE,YAAU,WACR3O,EAAK0O,gCAA+B,KACnC,KAGLlG,EAAA3T,UAAAwf,kBAAA,SACE/Y,EACAoY,EACAtJ,EACAkK,GAJF,IAAAtU,EAAA/K,KAME,GAAKqG,EAAL,KAGM8Y,EAC6B,MAAjCE,EACIA,EACA,EAEDF,GAMLnf,KAAK2U,0BAA4BwK,EAC7Bnf,KAAKoV,wBACPpV,KAAKoV,uBAAuBhE,cAE9BpR,KAAKoV,uBAAyBpV,KAAK0U,kBAChC3E,KAAKC,EAAAA,aAAahQ,KAAK2U,4BACvB1E,WAAS,SAAEC,OAAE7J,EAAA6J,EAAA7J,GAAIC,EAAA4J,EAAA5J,MAAO6O,EAAAjF,EAAAiF,KACnB7O,GACFyE,EAAK3E,aAAaC,EAAIC,EAAO6O,MAGnCnV,KAAK0U,kBAAkBpT,KAAK,CAAE+E,GAAEA,EAAEC,MAAOmY,EAAMtJ,KAAIA,KAhB7CsJ,GACFze,KAAKoG,aAAaC,EAAIoY,EAAMtJ,KAwBlC5B,EAAA3T,UAAAwG,aAAA,SAAaC,EAASC,EAAY6O,GAC5B9O,GACFA,EAAGC,EAAO6O,IAId5B,EAAA3T,UAAA0f,cAAA,WAAA,IAAAvU,EAAA/K,KACMuf,EAAyBvf,KAAKsP,GAAGuB,MAAM,CACzCpG,MAAOzK,KAAKsP,GAAGkQ,MAAM,MAqDvB,OAnDAxf,KAAKoK,mBAAmB0B,SAAO,SAAE2T,OAC3BC,EAAoB,GACxB3U,EAAKiN,UAAUlM,SAAO,SAAElG,GAEtB8Z,EAAa9Z,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QAChC,CACEnP,MAAOwJ,EAAK4U,qBAAqBF,EAAkB7Z,EAAK6K,OACpDgP,EAAkB7Z,EAAK6K,MACvB7K,EAAKrE,OAAS,KAClB4C,SAAUyB,EAAKzB,UAEjByB,EAAK0M,QAAU,CAACsN,EAAAA,WAAWC,UAAY,IAErCja,EAAKuK,cAAgBvK,EAAKuK,aAAagL,QACzCuE,EAAa9Z,EAAKuK,aAAagL,OAASpQ,EAAKuE,GAAGoB,QAC9C+O,EAAkB7Z,EAAKuK,aAAagL,QAAU,KAC9C,QAINuE,EAAaI,UAAY/U,EAAKuE,GAAGoB,QAC9B6O,EAAuBvO,IAAI,SAAuB4E,SAASlW,OAAS,EACrE,QAEEqgB,EAAehV,EAAKuE,GAAGuB,MAAM6O,GACjC3U,EAAKiN,UAAUlM,SAAO,SAAElG,GACtB,GAAIA,EAAKkL,cAAe,KAChBqO,EAC8B,MAAlCvZ,EAAKmL,0BACDnL,EAAKmL,0BACL,EACAL,EAAUqP,EAAa/O,IAAIpL,EAAK6K,MAElC0O,EAAa,EACfzO,EAAQO,aACLlB,KAAKC,EAAAA,aAAamP,IAClBlP,WAAS,SAAE1O,GACVwJ,EAAK3E,aAAaR,EAAKkL,cAAevP,EAAOwe,MAGjDrP,EAAQO,aAAahB,WAAS,SAAE1O,GAC9BwJ,EAAK3E,aAAaR,EAAKkL,cAAevP,EAAOwe,UAKpDR,EAAuBvO,IAAI,SAAuBgP,OAChDT,EAAuBvO,IAAI,SAAuB4E,SAASlW,OAC5DqgB,MAGGR,EAAuBU,OAIzB1M,EAAA3T,UAAAsgB,SAAP,WAAA,IAAAnV,EAAA/K,KACMmgB,EAAW,GAUf,OATAngB,KAAKoK,mBAAmB0B,SAAO,SAAE2T,OAC3BC,EAAoB,GACxB3U,EAAKiN,UAAUlM,SAAO,SAAElG,GAEtB8Z,EAAa9Z,EAAK6K,MAAQgP,EAAkB7Z,EAAK6K,SAEnDiP,EAAaI,UAAYL,EAAkBK,UAC3CK,EAASte,KAAK6d,MAETS,GAIT5M,EAAA3T,UAAAkL,YAAA,WAAA,IAAAC,EAAA/K,KACE,KAAIA,KAAKoK,mBAAmB1K,OAAS,GAArC,CAKA,GAFAM,KAAKyJ,cAAe,GAEfzJ,KAAKgL,UAGR,OAFAhL,KAAKmK,cAAe,OACpBnK,KAAKogB,mBAGDlV,EAAclL,KAAKgL,UAAUC,OAAOE,cAC1CnL,KAAKmK,cAAe,EACpBnK,KAAKuU,iBAAmB,OAGlBnJ,EAAepL,KAAKoK,mBAAmBzE,QAAM,SAChDgF,EAAW6F,eACV,IAAmB,IAAA6P,EAAA/U,EAAAP,EAAKiN,WAAS3M,EAAAgV,EAAA/e,QAAA+J,EAAA7J,KAAA6J,EAAAgV,EAAA/e,OAAE,CAA9B,IAAMsE,EAAIyF,EAAA9J,MACb,GACGqE,EAAKC,MAAQD,EAAK+M,YACjB/M,EAAKC,MAAsB,SAAdD,EAAK6K,KAMpB,GAJAgM,QAAQC,IAAI,OAAQ9W,EAAK6K,OACX9F,EAAK/E,EAAK6K,MACpB9F,EAAK/E,EAAK6K,MAAMhF,WAAWN,cAC3B,IACMO,SAASR,GAEjB,OADAH,EAAKwJ,iBAAiB1S,KAAK2O,IACpB,oGAIb,OAAO,KAIXxQ,KAAKsU,yBAA2BlJ,EAEhCpL,KAAKqV,cAAgBjK,EACrBpL,KAAKoQ,MAAK,KAGZmD,EAAA3T,UAAAwgB,aAAA,WACEpgB,KAAKqV,cAAgBrV,KAAKoK,mBAC1BpK,KAAKoQ,MAAK,IAGZmD,EAAA3T,UAAA0gB,SAAA,SAASnL,EAAiB4C,EAAeyC,OACnC+F,EAAW,CACbC,YAAahG,GAef,OAbIzC,EAASlR,QACX0Z,EAAQrhB,EAAA,GAAQqhB,EAAaxI,EAASlR,QAGtCkR,EAAS0I,aACT1I,EAAS0I,YAAYhQ,MACrB0E,EAAKnE,IAAI+G,EAAS0I,YAAYhQ,MAAMlP,QAEpCgf,EAAQrhB,EAAA,GACHqhB,EACA,CAAEG,MAAOvL,EAAKnE,IAAI+G,EAAS0I,YAAYhQ,MAAMlP,SAG7Cgf,GAGThN,EAAA3T,UAAAkG,YAAA,SAAYC,GAERA,EAAuB,eACvBC,KAAKC,UAAUF,EAAuB,cAAEG,gBACtCF,KAAKC,UAAUF,EAAuB,cAAEI,iBAEtCnG,KAAKoK,oBAAyD,IAAnCpK,KAAKoK,mBAAmB1K,SACrDM,KAAKoK,mBAAqBpK,KAAKqV,eAEjCrV,KAAKoQ,QAGLrK,EAAqB,aACrBC,KAAKC,UAAUF,EAAqB,YAAEG,gBACpCF,KAAKC,UAAUF,EAAqB,YAAEI,gBAExCnG,KAAKwK,kBAIT+I,EAAA3T,UAAA4K,eAAA,WAAA,IAAAO,EAAA/K,KAEMA,KAAKkJ,YACPlJ,KAAKsJ,gBAAkB,IAAInE,MAAMiH,OAAOpM,KAAKoJ,eAAiB,GAAGiD,KAAK,IACtErM,KAAKmJ,YAAY2C,SAAO,SAAElG,GACpBA,EAAK0G,cAAgB1G,EAAK2G,aAAoC,IAArB3G,EAAK2G,eAChDxB,EAAKzB,gBAAgB1D,EAAK0G,YAAc,GAAK,CAC3C/K,MAAOqE,EAAK2G,YACZC,MAAO5G,EAAK4G,OAAS,OACrBC,YAAa7G,EAAK6G,cAAe,SAOnC8G,EAAA3T,UAAAwQ,KAAR,SAAauQ,GAAb,IAAA5V,EAAA/K,UAAa,IAAA2gB,IAAAA,GAAA,GACX3gB,KAAKmU,oBAAsB,EAEtBnU,KAAKqQ,UAAUrQ,KAAKgY,YAIzBhY,KAAK4gB,aAGFD,GACC3gB,KAAKqV,iBACJrV,KAAKqV,eAA+C,IAA9BrV,KAAKqV,cAAc3V,QAU5CM,KAAK6gB,uBARL7gB,KAAKyJ,cAAe,EAEfzJ,KAAK8gB,qBACR9gB,KAAK8c,YAAY,MAAM,GAEzB9c,KAAKqU,UAAW,GAKlBrU,KAAKif,oBAAoBhO,aAAahB,WAAS,SAAEtF,GAC/C,OAAAI,EAAKgW,qBAAqBpW,MAE5B3K,KAAK+gB,wBAvBH/gB,KAAKyJ,cAAe,GA6BhB8J,EAAA3T,UAAAghB,WAAR,WACE5gB,KAAKif,oBAAsBjf,KAAKsP,GAAGuB,MAAM,CACvCpG,MAAOzK,KAAKsP,GAAGkQ,MAAM,MAEvBxf,KAAKghB,QAAUhhB,KAAKihB,eAGtB1N,EAAA3T,UAAAshB,qBAAA,WAAA,IAAAnW,EAAA/K,KACE0Z,YAAU,WACR3O,EAAKuR,gBAAgBvR,EAAK8J,WAAY9J,EAAK+J,cAC1C,IAMGvB,EAAA3T,UAAAqhB,YAAR,WACE,OAAOjhB,KAAKmhB,qBAAqB,MAAM,IASjC5N,EAAA3T,UAAAuhB,qBAAR,SACE1B,EACA2B,EACAC,GAHF,IAAAtW,EAAA/K,UAEE,IAAAohB,IAAAA,GAAA,QACA,IAAAC,IAAAA,GAAA,OAEI3B,EAAoB,GACxB1f,KAAKgY,UAAUlM,SAAO,SAAElG,GACtB8Z,EAAa9Z,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QAChC,CACEnP,MACuB,MAArBke,EACIA,EAAkB7Z,EAAK6K,MACvB7K,EAAKrE,MACX4C,SAAUyB,EAAKzB,UAEjBid,EACIxb,EAAK0M,UAAY1M,EAAKC,KACpB,CAAC+Z,EAAAA,WAAWC,UACZ,GACFja,EAAK0M,QACH,CAACsN,EAAAA,WAAWC,UACZ,IAEJja,EAAKuK,cAAgBvK,EAAKuK,aAAagL,QACzCuE,EAAa9Z,EAAKuK,aAAagL,OAASpQ,EAAKuE,GAAGoB,QACzB,MAArB+O,GACIA,EAAkB7Z,EAAKuK,aAAagL,QACpC,KACJ,YAMAmG,GACHD,GAAmB5B,GAAqBA,EAAkBxG,SACvDwG,EAAkBxG,SAClBjZ,KAAKiW,gBACXyJ,EAAazG,SAAWjZ,KAAKsP,GAAGoB,QAAQ4Q,GACpC7B,IAAsBA,EAAkBxG,WAC1CwG,EAAkBxG,SAAWqI,GAI3B7B,GACFtgB,OAAOoM,KAAKkU,GAAmB3T,SAAO,SAAE1L,GAE5B,cAARA,GACQ,0BAARA,GACQ,aAARA,IAIGsf,EAAatf,KAChBsf,EAAatf,GAAO2K,EAAKuE,GAAGoB,QAAQ+O,EAAkBrf,SAK5Dsf,EAAaI,UAAY9f,KAAKsP,GAAGoB,QAC/B1Q,KAAK2V,eAAeC,SAASlW,OAAS,EACtC,IAEFggB,EAAa6B,sBAAwBvhB,KAAKsP,GAAGoB,QAAQ1Q,KAAKmK,aAAc,QACpEqX,EAAkBxhB,KAAKsP,GAAGuB,MAAM6O,GAwBpC,OAvBA1f,KAAKgY,UAAUlM,SAAO,SAAElG,GACtB,GAAIA,EAAKkL,cAAe,KAChBqO,EAC8B,MAAlCvZ,EAAKmL,0BACDnL,EAAKmL,0BACL,EACAL,EAAU8Q,EAAgBxQ,IAAIpL,EAAK6K,MACnCgR,EAAY,SAAIlgB,GAChBqE,EAAK7B,OAAS2d,GAAa5O,QAAoB,OAAVvR,GACvCwJ,EAAKmW,uBAEPnW,EAAK3E,aAAaR,EAAKkL,cAAevP,EAAOigB,IAG3CrC,EAAa,EACfzO,EAAQO,aACLlB,KAAKC,EAAAA,aAAamP,IAClBlP,UAAUwR,GAEb/Q,EAAQO,aAAahB,UAAUwR,OAI9BD,GAGDjO,EAAA3T,UAAA+hB,oBAAR,WACE3hB,KAAK2V,eAAeC,SAAS9J,SAAO,SAAElG,EAAM4K,GAC1C5K,EAAKoL,IAAI,aAAa0G,SAASlH,EAAQ,EAAG,CAAEgH,WAAW,QAO3DjE,EAAA3T,UAAAihB,oBAAA,WAAA,IAAA9V,EAAA/K,KACEA,KAAKqV,cAAcvJ,SAAO,SAAE2T,GAC1B1U,EAAK4K,eAAeqK,OAClBjV,EAAK4K,eAAeC,SAASlW,OAC7BqL,EAAKoW,qBAAqB1B,OAG9Bzf,KAAK2hB,sBACL3hB,KAAKyJ,cAAe,EACpBzJ,KAAKqU,UAAW,GAOlBd,EAAA3T,UAAAkd,YAAA,SAAY8E,EAA8BC,GAA1C,IAAA9W,EAAA/K,UAA0C,IAAA6hB,IAAAA,GAAA,OAClCC,EAAW9hB,KAAK+hB,oBAAoBH,GACpCZ,EAAUhhB,KAAKihB,cACrBjhB,KAAK2V,eAAeqK,OAAO8B,EAAUd,GACrChhB,KAAKgU,aAAarP,KAAKqc,GACvBhhB,KAAK2hB,sBAEL3hB,KAAKmU,oBACH4B,KAAKiM,MAAMF,EAAW9hB,KAAKoU,oBAAsB,EACnDsF,YAAU,WACR3O,EAAKwK,iBACDsM,IACF9W,EAAK8J,WAAa9J,EAAKkX,oBAAoBH,GAC3C/W,EAAK+J,WAAa,EAClB2H,QAAQC,IAAI,UACZ3R,EAAK4R,SAAS5R,EAAK8J,WAAY9J,EAAK+J,eAErC,IAMLvB,EAAA3T,UAAAsiB,aAAA,SAAa/M,GAAb,IAAApK,EAAA/K,KACQmiB,EAAcniB,KAAK2V,eAAeC,SAAS3G,QAAQkG,GACzD,KAAIgN,EAAc,GAAlB,KAIMC,EAAejN,EAAKxD,cACpBmQ,EAAWK,EAAc,EAC/BniB,KAAK2V,eAAeqK,OAClB8B,EACA9hB,KAAKmhB,qBAAqBiB,GAAc,GAAO,IAEjDpiB,KAAK2hB,sBACLjI,YAAU,WACR3O,EAAKwK,iBACLxK,EAAK8J,WAAa9J,EAAKkX,oBAAoBH,GAC3C/W,EAAK+J,WAAa,EAClB/J,EAAK4R,SAAS5R,EAAK8J,WAAY9J,EAAK+J,cACnC,KASLvB,EAAA3T,UAAAyiB,eAAA,SAAeC,GAAf,IAAAvX,EAAA/K,KACMuiB,GAAY,EAUhB,GAT2B,iBAAhBD,EACTC,EAAWD,EAAc,EAChBA,IACTC,EAAWviB,KAAK2V,eAAeC,SAAS3G,QAAQqT,IAElD7F,QAAQC,IACN,QACuB,iBAAhB4F,EAA2BA,EAAcC,KAE9CA,EAAW,GAIf,GAA4C,IAAxCviB,KAAK2V,eAAeC,SAASlW,QAAiBM,KAAK0T,WAAvD,KAMM8O,EAAcxiB,KAAK2V,eAAe8M,GAAGF,GAG3C,GAFAviB,KAAK2V,eAAe4M,SAASA,GAC7BviB,KAAKsX,wBAAwBkL,GAE1BxiB,KAAKmK,eACNnK,KAAK2V,eAAeC,UACoB,IAAxC5V,KAAK2V,eAAeC,SAASlW,QAC5BM,KAAK8gB,oBAGD,KAEC4B,EAAU3M,KAAK1N,IACnB,EACA0N,KAAK8G,KACH7c,KAAK2V,eAAeC,SAASlW,OAASM,KAAKoU,qBAG3CpU,KAAKmU,oBAAsBuO,IAC7B1iB,KAAKmU,oBAAsBuO,GAE7B1iB,KAAK2hB,2BAZL3hB,KAAK8c,cAcPpD,YAAU,WACR3O,EAAKwK,mBACJ,QA9BGvV,KAAK2T,qBACP3T,KAAK2T,oBAAoBhP,QAiCvB4O,EAAA3T,UAAAmiB,oBAAR,SAA4BH,GAC1B,IAAKA,EACH,OAAO5hB,KAAK2V,eAAeC,SAASlW,WAEhCijB,EAAM3iB,KAAK2V,eAAeC,SAAS3G,QAAQ2S,GACjD,OAAOe,GAAO,EAAIA,EAAM,EAAI3iB,KAAK2V,eAAeC,SAASlW,QAInD6T,EAAA3T,UAAAqiB,oBAAR,SAA4BW,GAC1B,OACEA,GAAe5iB,KAAKmU,oBAAsB,GAAKnU,KAAKoU,oBAIjDb,EAAA3T,UAAAijB,gBAAP,SAAuBvc,GAAvB,IAAAyE,EAAA/K,KACEA,KAAKmU,oBAAsB7N,EAC3BoT,YAAU,WACR3O,EAAKwK,mBACJ,IAGEhC,EAAA3T,UAAAkjB,eAAP,SAAsBxc,GAAtB,IAAAyE,EAAA/K,KACEA,KAAKoU,mBAAqB9N,EAC1BoT,YAAU,WACR3O,EAAKwK,mBACJ,IAGGhC,EAAA3T,UAAAmhB,qBAAR,SAA6BpW,GAA7B,IAAAI,EAAA/K,KACE,GAAIA,KAAKmK,aACP,GAAIQ,GAAQA,EAAKF,OAA0C,IAAjCzK,KAAKuU,iBAAiB7U,OAAc,KACtDqjB,EAAQpY,EAAKF,MACnB,GAAIsY,EAAMrjB,SAAWM,KAAKuU,iBAAiB7U,OACzCM,KAAKuU,iBAAiBzI,SAAO,SAAElG,EAAM4K,GACnCzF,EAAKX,mBAAmBxE,GAAK1G,EAAA,GACxB6L,EAAKuJ,yBAAyB9D,GAC9BuS,EAAMvS,YAGR,GAAIuS,EAAMrjB,OAASM,KAAKuU,iBAAiB7U,OAAQ,CAKtD,QAFMsjB,EAAchjB,KAAKif,oBAAoBtN,cAAclH,MACvDwY,GAAY,EACP1jB,EAAI,EAAGA,EAAIyjB,EAAYtjB,OAAQH,IACtC,GAAIyjB,EAAYzjB,GAAGgiB,sBAAuB,CACxC0B,EAAW1jB,EACX,OAGc,IAAd0jB,GACFjjB,KAAKoK,mBAAmB0R,OACtB9b,KAAKuU,iBAAiB0O,EAAW,GAAK,EACtC,EACAD,EAAYC,IAGhBjjB,KAAKuU,iBAAiB1S,KAAK7B,KAAKuU,iBAAiB0O,EAAW,GAAK,OAC5D,KAGDC,GAAgB,EAChBrN,EAAQ,EACZ,GAAqB,IAAjBkN,EAAMrjB,OACRwjB,EAAe,OAEf,IAAS3jB,EAAI,EAAGA,EAAIwjB,EAAMrjB,OAAQH,IAAK,CACrC,GAAIwjB,EAAMxjB,GAAGugB,UAAYjK,EAAQ,EAAG,CAClCqN,EAAe3jB,EACf,MAEFsW,IAGJ,IAAsB,IAAlBqN,EAAqB,CAEvBljB,KAAKoK,mBAAqBpK,KAAKoK,mBAAmBzE,QAAM,SACrDC,EAAM4K,GACL,OAAOA,IAAUzF,EAAKwJ,iBAAiB2O,MAG3CljB,KAAKuU,iBAAiBuH,OAAOoH,EAAc,GAC3C,IAAS3jB,EAAI,EAAGA,EAAIS,KAAKuU,iBAAiB7U,OAAQH,IAC5CA,GAAK2jB,GACPljB,KAAKuU,iBAAiBhV,SAGrB,KAEC4jB,EACJnjB,KAAKuU,iBAAiBvU,KAAKuU,iBAAiB7U,OAAS,GACvDM,KAAKoK,mBAAqBpK,KAAKoK,mBAAmBzE,QAAM,SACrDC,EAAM4K,GACL,OAAOA,IAAU2S,KAGrBnjB,KAAKuU,iBAAiB6O,aAItBzY,GAAQA,EAAKF,QACfzK,KAAKoK,mBAAqBO,EAAKF,YAI/BE,GAAQA,EAAKF,QACfzK,KAAKoK,mBAAqBO,EAAKF,OAK9BzK,KAAKmK,aAGJnK,KAAKwU,UAEPxU,KAAKwU,UAAYxU,KAAKif,oBAAoBgB,MAGtCjgB,KAAKif,oBAAoBgB,MAC3BjgB,KAAKwU,UAAYxU,KAAKsf,gBAEtBtf,KAAKwU,UAAYxU,KAAKif,oBAAoBgB,MAV9CjgB,KAAKwU,UAAYxU,KAAKif,oBAAoBgB,MAe5CjgB,KAAK+T,YAAYpP,KAAK3E,KAAKif,sBAGrB1L,EAAA3T,UAAAyQ,UAAR,SAAkBiB,GAChB,IAAKA,GAASA,GAAwB,IAAhBA,EAAK5R,OACzB,OAAO,MAEL6R,EAAW,GACX8R,EAAwB,GAyB5B,GAxBA/R,EAAKxF,SAAO,SAAElG,GAQZ,GAHA2L,EAAS1P,KAAK+D,EAAK6K,MAGf7K,EAAKsL,eAAiBtL,EAAKuK,eAC7BkT,EAAwB,GACxB/R,EAAKxF,SAAO,SAAEwX,GAEVA,EAAU7S,OAAS7K,EAAKuK,aAAa5O,OACrC+hB,EAAU7S,OAAS7K,EAAKuK,aAAagL,OAErCkI,EAAsBxhB,KAAKyhB,EAAU7S,SAGrC4S,EAAsB3jB,OAAS,GACjC,KAAM,wBAAwBkG,EAAK6K,KAAI,qDAKzCe,EAAI,IAAIC,IAAIF,IAAW7R,SAAW4R,EAAK5R,OACzC,KAAM,gCAGR,OAAO,GAGF6T,EAAA3T,UAAA8R,WAAP,WACE1R,KAAK+T,YAAYpP,KAAK3E,KAAKif,oBAAoBtN,gBAG1C4B,EAAA3T,UAAAgS,UAAP,WAEE5R,KAAKoZ,iBACL,IAAK,IAAI7Z,EAAIS,KAAK2V,eAAeC,SAASlW,OAAQH,GAAK,EAAGA,IACxDS,KAAKqiB,eAAe9iB,GAEtBS,KAAKmU,oBAAsB,GAGtBZ,EAAA3T,UAAAsS,WAAP,SAAkB6F,EAAe5C,GAC/BA,EAAKnE,IAAI+G,EAAStH,MAAMiH,SAAS,OAG5BnE,EAAA3T,UAAA2jB,YAAP,SAAmB7M,EAAYiI,EAAmBC,GAC1BhF,SAAS4J,cAAc9M,GACpCuH,SACTje,KAAK0e,wBAAwBC,EAAWC,IAK1CrL,EAAA3T,UAAA6jB,eAAA,SAAeC,EAAcC,OACrBC,EAAc5jB,KAAKkV,eAAewO,GACxC,QAAoBrL,IAAhBuL,EACF,OAAOA,EAAc,IAAMD,MAGvBE,EAAOjK,SAASc,cAAc,QACpCmJ,EAAKhd,MAAMid,WAAa,SACxBD,EAAKhd,MAAMkd,SAAW,WACtBF,EAAKhd,MAAMmd,WAAa,SACxBH,EAAKhd,MAAMod,SAAW,OACtBJ,EAAKhd,MAAMqd,QAAU,eACrBL,EAAKM,UAAYT,EACjB9J,SAASwK,KAAK9I,YAAYuI,OACpBQ,EAAaR,EAAKS,YAAc,IAAMX,EAI5C,OAHA3jB,KAAKkV,eAAewO,GAAQG,EAAKS,YACjCT,EAAKhd,MAAMqd,QAAU,OACrBtK,SAASwK,KAAKG,YAAYV,GACnBQ,GAGT9Q,EAAA3T,UAAA4kB,cAAA,SAAcC,GACZ,OAAIA,GAAe,IAARA,EACFA,EAEA,OAIXlR,EAAA3T,UAAA+f,qBAAA,SAAqB8E,GACnB,OAAY,OAARA,QAAwBpM,IAARoM,uBAtpDvBtiB,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,gBACVC,SAAA,m9kCArBkB8P,EAAAA,mBAdlBsS,EAAAA,+DAuCCC,EAAAA,aAAYviB,KAAA,CAAC,wCAEbwC,EAAAA,0BACAA,EAAAA,mCACAC,EAAAA,uCACAD,EAAAA,4BACAA,EAAAA,0BACAA,EAAAA,4BAEAA,EAAAA,yBACAA,EAAAA,6BAEAA,EAAAA,8BACAA,EAAAA,sBACAA,EAAAA,2BACAC,EAAAA,6BAEAA,EAAAA,gCAEAA,EAAAA,kCACAD,EAAAA,yBAQAA,EAAAA,2BACAA,EAAAA,6BACAA,EAAAA,oCA4CArC,EAAAA,aAAYH,KAAA,CAAC,uBAAwB,CAAEI,QAAQ,iCAG/CD,EAAAA,aAAYH,KAAA,CAAC,sBAAuB,CAAEI,QAAQ,kCAG9CD,EAAAA,aAAYH,KAAA,CAAC,uBAAwB,CAAEI,QAAQ,6BAyyC/CqC,EAAAA,UAv3CwBC,EAAAA,CAAfC,EAAAA,8EACeD,EAAAA,CAAfC,EAAAA,0EAEeD,EAAAA,CAAfC,EAAAA,sFACeD,EAAAA,CAAfC,EAAAA,4EACeD,EAAAA,CAAfC,EAAAA,0EAEeD,EAAAA,CAAfC,EAAAA,4EAWeD,EAAAA,CAAfC,EAAAA,iFAQeD,EAAAA,CAAfC,EAAAA,yEA0nDZwO,EA5pDA,GCnCA,IAAAqR,GAAA,WAQA,SAAAA,KAaiC,2BAbhCliB,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAkE,EAAAA,oBACAjE,EAAAA,kBACAkC,EACA8B,EACArE,GAEFM,aAAc,CAACwQ,IACfvQ,QAAS,CAACuQ,QAEqBqR,EArBjC,MCWA,WAIE5kB,KAAAsS,SAAoB,EAEpBtS,KAAAwa,MAAiB,EACjBxa,KAAA6F,MAAiB,EACjB7F,KAAA6kB,WAAsB,EACtB7kB,KAAA8kB,WAAsB,EAEtB9kB,KAAAuB,MAMW,KAUXvB,KAAAwS,YAA4B,IAAIrK,EAMhCnI,KAAAyS,aAAwB,EAGxBzS,KAAA0S,UAAqB,GAWvB,IAAAqS,GAAA,qBAOEngB,MAAA,EACAkO,OAAA,EACAC,KAAA,EACAC,UAAA,EACAC,SAAA,EACA9K,YAAA,EACA+K,eAAA,EACAC,QAAA,EACAC,OAAA,EACAC,KAAA,EACA2R,SAAA,GACAC,MAAA,GACAC,SAAA,iVAGF,IAAAC,GAAA,WAIE,SAAAA,gCAJDvhB,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,wJADd,GCnEAuhB,GAAA,WAmBE,SAAAA,EAAoB9V,GAApB,IAAAvE,EAAA/K,KAAoBA,KAAAsP,GAAAA,EAZVtP,KAAA+T,YAAc,IAAI1P,EAAAA,aAIpBrE,KAAA2P,cAAgB,IAAIC,EAAAA,QACpB5P,KAAA6P,gBAA0B,EAG1B7P,KAAA0U,kBAAoB,IAAI9E,EAAAA,QACxB5P,KAAA2U,0BAAoC,EA+WnC3U,KAAAqlB,4BAA2B,SAAI9jB,GAAmB,OAAAA,GAClDvB,KAAAslB,yBAAwB,SAAI/jB,GAAkB,OAAAA,GA5WrDvB,KAAK8P,mBAAqB9P,KAAK2P,cAC5BI,KAAKC,EAAAA,aAAahQ,KAAK6P,kBACvBI,WAAS,SAAEC,OAAE7J,EAAA6J,EAAA7J,GAAIC,EAAA4J,EAAA5J,MAAY,OAAAyE,EAAK3E,aAAaC,EAAIC,MACtDtG,KAAKoV,uBAAyBpV,KAAK0U,kBAChC3E,KAAKC,EAAAA,aAAahQ,KAAK2U,4BACvB1E,WAAS,SAAEC,OAAE7J,EAAA6J,EAAA7J,GAAIC,EAAA4J,EAAA5J,MAEZA,GACFyE,EAAK3E,aAAaC,EAAIC,MAqWhC,OAhWE8e,EAAAxlB,UAAAsC,SAAA,WACOlC,KAAKulB,UAAqC,IAAzBvlB,KAAKulB,SAAS7lB,QAIpCM,KAAKoQ,QAGPgV,EAAAxlB,UAAAkG,YAAA,SAAYC,GACV,GACEA,EAAkB,UAClBC,KAAKC,UAAUF,EAAkB,SAAEG,gBACjCF,KAAKC,UAAUF,EAAkB,SAAEI,eACrC,CACA,IAAKnG,KAAKulB,UAAqC,IAAzBvlB,KAAKulB,SAAS7lB,OAClC,OAEFM,KAAKoQ,SAITgV,EAAAxlB,UAAAsR,cAAA,SAAc7K,EAASC,EAAY6K,GAAnC,IAAApG,EAAA/K,KACE,GAAKqG,EAAL,KAGM8Y,EACyB,MAA7BhO,EAAoCA,EAA4B,EAE7DgO,GAILnf,KAAK6P,gBAAkBsP,EACnBnf,KAAK8P,oBACP9P,KAAK8P,mBAAmBsB,cAE1BpR,KAAK8P,mBAAqB9P,KAAK2P,cAC5BI,KAAKC,EAAAA,aAAahQ,KAAK6P,kBACvBI,WAAS,SAAEC,OAAE7J,EAAA6J,EAAA7J,GAAIC,EAAA4J,EAAA5J,MAAY,OAAAyE,EAAK3E,aAAaC,EAAIC,MACtDtG,KAAK2P,cAAcrO,KAAK,CAAE+E,GAAEA,EAAEC,MAAKA,KAVjCtG,KAAKoG,aAAaC,EAAIC,KAa1B8e,EAAAxlB,UAAAwf,kBAAA,SACE/Y,EACAoY,EACAY,GAHF,IAAAtU,EAAA/K,KAKE,GAAKqG,EAAL,KAGM8Y,EAC6B,MAAjCE,EACIA,EACA,EAEDF,GAMLnf,KAAK2U,0BAA4BwK,EAC7Bnf,KAAKoV,wBACPpV,KAAKoV,uBAAuBhE,cAE9BpR,KAAKoV,uBAAyBpV,KAAK0U,kBAChC3E,KAAKC,EAAAA,aAAahQ,KAAK2U,4BACvB1E,WAAS,SAAEC,OAAE7J,EAAA6J,EAAA7J,GAAIC,EAAA4J,EAAA5J,MACZA,GACFyE,EAAK3E,aAAaC,EAAIC,MAG5BtG,KAAK0U,kBAAkBpT,KAAK,CAAE+E,GAAEA,EAAEC,MAAOmY,KAhBnCA,GACFze,KAAKoG,aAAaC,EAAIoY,KAkB5B2G,EAAAxlB,UAAAwG,aAAA,SAAaC,EAASC,GAChBD,GACFA,EAAGC,IAIC8e,EAAAxlB,UAAAwQ,KAAR,WAAA,IAAArF,EAAA/K,KAEE,IAAKA,KAAKqQ,UAAUrQ,KAAKulB,UACvB,KAAM,gBAGRvlB,KAAKwlB,cAEDjV,EAAgB,GACpBvQ,KAAKulB,SAASzZ,SAAO,SAAElG,EAAM4K,GAE3B,GAAkB,IAAd5K,EAAK7B,MAAc6B,EAAKrE,MAAO,CAC3B,IAAA2O,EAAAxO,EAAAkE,EAAArE,sEAACkkB,EAAAvV,EAAA,GAAMwV,EAAAxV,EAAA,GAAOyV,EAAAzV,EAAA,GAId0V,EAAa,IAAI7S,KAAK0S,EAAMC,EAAQ,EAAGC,GAC1CE,mBAAmB,aAAc,CAChCJ,KAAM,UACNC,MAAO,UACPC,IAAK,YAENG,QAAQ,MAAO,KACdlgB,EAAKmgB,UACPxV,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QACjC,CAAEnP,MAAO,IAAIwR,KAAK6S,GAAazhB,SAAUyB,EAAKzB,UAC9CyB,EAAK0M,UAAY1M,EAAKC,KAClB,CAAC+Z,EAAAA,WAAWC,SAAUja,EAAKmgB,WAC3B,IAGNxV,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QACjC,CAAEnP,MAAO,IAAIwR,KAAK6S,GAAazhB,SAAUyB,EAAKzB,UAC9CyB,EAAK0M,UAAY1M,EAAKC,KAAO,CAAC+Z,EAAAA,WAAWC,UAAY,SAGpD,GAAkB,IAAdja,EAAK7B,MAAc6B,EAAKrE,MAAO,KACpCykB,EAAehgB,KAAK4E,MAAM5E,KAAKC,UAAUL,EAAKrE,QAClD,KAAIykB,GAAgBA,aAAwB7gB,OA4B1C,KAAM,iEA3BN6gB,EAAeA,EAAaC,KAAG,SAAErgB,GACzB,IAAAsK,EAAAxO,EAAAkE,uDAAC6f,EAAAvV,EAAA,GAAMwV,EAAAxV,EAAA,GAAOyV,EAAAzV,EAAA,GAGd0V,EAAa,IAAI7S,KAAK0S,EAAMC,EAAQ,EAAGC,GAC1CE,mBAAmB,aAAc,CAChCJ,KAAM,UACNC,MAAO,UACPC,IAAK,YAENG,QAAQ,MAAO,KAClBlgB,EAAO,IAAImN,KAAK6S,MAEdhgB,EAAKmgB,UACPxV,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QACjC,CAAEnP,MAAOykB,EAAc7hB,SAAUyB,EAAKzB,UACtCyB,EAAK0M,UAAY1M,EAAKC,KAClB,CAAC+Z,EAAAA,WAAWC,SAAUja,EAAKmgB,WAC3B,IAGNxV,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QACjC,CAAEnP,MAAOykB,EAAc7hB,SAAUyB,EAAKzB,UACtCyB,EAAK0M,UAAY1M,EAAKC,KAAO,CAAC+Z,EAAAA,WAAWC,UAAY,SAMtD,GAAIja,EAAK7B,OAASmiB,GAAahB,UAAYtf,EAAKugB,eAAgB,KAC/DC,EAAgBjhB,MAAMkhB,QAAQzgB,EAAKrE,OAASqE,EAAKrE,MAAQ,GAC3DqE,EAAKmgB,UACPxV,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QACjC,CAAEnP,MAAO6kB,EAAejiB,SAAUyB,EAAKzB,UACvCyB,EAAK0M,UAAY1M,EAAKC,KAClB,CAAC+Z,EAAAA,WAAWC,SAAUja,EAAKmgB,WAC3B,IAGNxV,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QACjC,CAAEnP,MAAO6kB,EAAejiB,SAAUyB,EAAKzB,UACvCyB,EAAK0M,UAAY1M,EAAKC,KAAO,CAAC+Z,EAAAA,WAAWC,UAAY,SAGpD,GAAIja,EAAK7B,OAASmiB,GAAahB,SAAU,CACxCkB,EAA8B,MAAdxgB,EAAKrE,OAAgBqE,EAAKrE,MAC5CqE,EAAKmgB,UACPxV,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QACjC,CAAEnP,MAAO6kB,EAAejiB,SAAUyB,EAAKzB,UACvCyB,EAAK0M,UAAY1M,EAAKC,KAClB,CAAC+Z,EAAAA,WAAWC,SAAUja,EAAKmgB,WAC3B,IAGNxV,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QACjC,CAAEnP,MAAO6kB,EAAejiB,SAAUyB,EAAKzB,UACvCyB,EAAK0M,UAAY1M,EAAKC,KAAO,CAAC+Z,EAAAA,WAAWC,UAAY,SAIrDja,EAAKmgB,UACPxV,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QACjC,CAAEnP,MAAOqE,EAAKrE,MAAO4C,SAAUyB,EAAKzB,UACpCyB,EAAK0M,UAAY1M,EAAKC,KAClB,CAAC+Z,EAAAA,WAAWC,SAAUja,EAAKmgB,WAC3B,IAGNxV,EAAc3K,EAAK6K,MAAQ1F,EAAKuE,GAAGoB,QACjC,CAAEnP,MAAOqE,EAAKrE,MAAO4C,SAAUyB,EAAKzB,UACpCyB,EAAK0M,UAAY1M,EAAKC,KAAO,CAAC+Z,EAAAA,WAAWC,UAAY,OAM7D7f,KAAKsmB,eAAiBtmB,KAAKsP,GAAGuB,MAAMN,GAEpCvQ,KAAKulB,SAASzZ,SAAO,SAAElG,GACrB,GAAIA,EAAKkL,cAAe,KAChBqO,EAC8B,MAAlCvZ,EAAKmL,0BACDnL,EAAKmL,0BACL,EACAL,EAAU3F,EAAKub,eAAetV,IAAIpL,EAAK6K,MAEzC0O,EAAa,EACfzO,EAAQO,aACLlB,KAAKC,EAAAA,aAAamP,IAClBlP,WAAS,SAAE1O,GACV,OAAAwJ,EAAK3E,aAAaR,EAAKkL,cAAevP,MAG1CmP,EAAQO,aAAahB,WAAS,SAAE1O,GAC9B,OAAAwJ,EAAK3E,aAAaR,EAAKkL,cAAevP,UAK9CvB,KAAKsmB,eAAerV,aAAahB,WAAS,SAAEtF,GAC1C,OAAAI,EAAKgW,qBAAqBpW,MAE5B3K,KAAK+gB,wBAGCqE,EAAAxlB,UAAA4lB,QAAR,WAIE,QAFMe,EAAiBvmB,KAAKulB,SAAS7lB,OACjC4I,EAAO,EACF/I,EAAI,EAAGA,EAAIgnB,EAAgBhnB,IAClC,IAAKS,KAAKulB,SAAShmB,GAAGsG,KACpB,GAAU,IAANtG,EACFS,KAAKulB,SAAShmB,GAAGslB,WAAa7kB,KAAKulB,SAAShmB,GAAGib,OAAS,EACxDxa,KAAKulB,SAAShmB,GAAGulB,WAAa,EAC9Bxc,GAAc,OAGd,IAAK,IAAI0T,EAAIzc,EAAI,EAAGyc,GAAK,EAAGA,IAC1B,GAAIhc,KAAKulB,SAASvJ,GAAG6I,WAAY,CAC/B7kB,KAAKulB,SAAShmB,GAAGslB,WACf7kB,KAAKulB,SAASvJ,GAAG6I,YAAc7kB,KAAKulB,SAAShmB,GAAGib,OAAS,GAEzDxa,KAAKulB,SAASvJ,GAAG6I,YAAc7kB,KAAKulB,SAAShmB,GAAGib,OAAS,GACvDlS,GACFtI,KAAKulB,SAASvJ,GAAG6I,YAAcvc,GAE/BA,GAAc,EACdtI,KAAKulB,SAAShmB,GAAGulB,WAAa,GAE9B9kB,KAAKulB,SAAShmB,GAAGulB,WAAa,EAEhC,MAQV,IAAK,IAAIzjB,EAAI,EAAGA,EAAIklB,EAAgBllB,IAClC,GAAoC,IAAhCrB,KAAKulB,SAASlkB,GAAGyjB,WAAkB,CACrC9kB,KAAKulB,SAASlkB,GAAGmlB,YAAc,GAE/B,QADIC,EAAQ,EACHjnB,EAAI,EAAGA,EAAI+mB,EAAiBllB,IACrB,IAAVolB,GAAmD,IAApCzmB,KAAKulB,SAASlkB,EAAI7B,GAAGslB,YADFtlB,KAKnCQ,KAAKulB,SAASlkB,EAAI7B,GAAGqG,MACtB7F,KAAKulB,SAASlkB,EAAI7B,IACkB,IAApCQ,KAAKulB,SAASlkB,EAAI7B,GAAGslB,aAErB9kB,KAAKulB,SAASlkB,GAAGmlB,YAAY3kB,KAAK7B,KAAKulB,SAASlkB,EAAI7B,IACpDinB,OAOFrB,EAAAxlB,UAAAmhB,qBAAR,SAA6BpW,GAC3B3K,KAAK+T,YAAYpP,KAAK3E,KAAKsmB,iBAGrBlB,EAAAxlB,UAAAyQ,UAAR,SAAkBiB,GAChB,IAAKA,GAASA,GAAwB,IAAhBA,EAAK5R,OACzB,OAAO,MAEL6R,EAAW,GASf,GARAD,EAAKxF,SAAO,SAAElG,GAKZ2L,EAAS1P,KAAK+D,EAAK6K,SAGjBe,EAAI,IAAIC,IAAIF,IAAW7R,SAAW4R,EAAK5R,OACzC,KAAM,2BAGR,OAAO,GAGF0lB,EAAAxlB,UAAA8R,WAAP,WACEvS,OAAO8N,OAAOjN,KAAKsmB,eAAe1Q,UAAU9J,SAAO,SAAE4E,GACnDA,EAAQgW,cACRhW,EAAQoH,4BAEV9X,KAAK+T,YAAYpP,KAAK3E,KAAKsmB,eAAe3U,gBAGrCyT,EAAAxlB,UAAAgS,UAAP,WACE5R,KAAKsmB,eAAe/iB,QACpBpE,OAAO8N,OAAOjN,KAAKsmB,eAAe1Q,UAAU9J,SAAO,SAAE4E,GACnDA,EAAQgW,cACRhW,EAAQoH,4BAEV9X,KAAK+T,YAAYpP,KAAK3E,KAAKsmB,eAAe3U,gBAGrCyT,EAAAxlB,UAAAsS,WAAP,SAAkBvM,OACVwM,EAAc,GACpBA,EAAYxM,EAAO8K,MAAQ,KAC3BzQ,KAAKsmB,eAAevU,WAAWI,IAGjCiT,EAAAxlB,UAAA+mB,kBAAA,SAAkBlW,EAAclP,OACxBmP,EAAU1Q,KAAKsmB,eAAetV,IAAIP,GAClCmW,EAAUlW,EAAUA,EAAQnP,MAAQ,KAC1C,OAAO4D,MAAMkhB,QAAQO,KAAwC,IAA5BA,EAAQ3X,QAAQ1N,IAGnD6jB,EAAAxlB,UAAAinB,qBAAA,SAAqBpW,EAAclP,EAAYyV,OACvCtG,EAAU1Q,KAAKsmB,eAAetV,IAAIP,GACxC,GAAKC,EAAL,KAGMkW,EAAUzhB,MAAMkhB,QAAQ3V,EAAQnP,OAAMQ,EAAO2O,EAAQnP,OAAS,GAC9DiP,EAAQoW,EAAQ3X,QAAQ1N,GAC1ByV,IAAsB,IAAXxG,EACboW,EAAQ/kB,KAAKN,GACHyV,IAAsB,IAAXxG,GACrBoW,EAAQ9K,OAAOtL,EAAO,GAExBE,EAAQgH,SAASkP,GACjBlW,EAAQgW,cACRhW,EAAQoH,+CA5XX3V,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,UACVC,SAAA,ym7BAPO8P,EAAAA,iDAWNxN,EAAAA,2BACAC,EAAAA,UA0XHugB,EAjYA,GCbA,IAAA0B,GAAA,WAMA,SAAAA,KAW4B,2BAX3BpkB,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAkE,EAAAA,oBACAjE,EAAAA,kBACAkC,GAEFjC,aAAc,CAACqiB,IACfpiB,QAAS,CAACoiB,QAEgB0B,EAjB5B,iBCyCE,SAAAC,IA7BS/mB,KAAA8I,OAAoC,CAAEC,EAAG,OACzB/I,KAAA0I,cAAwB,EACxC1I,KAAAgJ,YAAsB,aAENhJ,KAAAgnB,gBAA0B,EAEzChnB,KAAAiJ,YAAc,IAAI5E,EAAAA,aAClBrE,KAAAinB,iBAAmB,IAAI5iB,EAAAA,aAKxBrE,KAAAyJ,cAAwB,EAExBzJ,KAAA0J,eAAyB,EACzB1J,KAAA2J,cAAwB,GACvB3J,KAAAyN,qBAAuB,IAAIpJ,EAAAA,aAC3BrE,KAAA0N,oBAAsB,IAAIrJ,EAAAA,aAEpCrE,KAAA4J,yBAA0B,EAC1B5J,KAAA6J,iBAAkB,EAClB7J,KAAA8J,kBAAoB,GACpB9J,KAAA+J,cAAgB,GAEhB/J,KAAAgK,eAA6C,GAC7ChK,KAAAiK,eAAyC,GAEzCjK,KAAAknB,qBAAuB,GA0EzB,OAtEEH,EAAAnnB,UAAAsC,SAAA,aAEA6kB,EAAAnnB,UAAAkG,YAAA,SAAYC,GAEV,GAAIA,GAAWA,EAAmB,WAAKA,EAAmB,UAAgB,cAAKA,EAAmB,UAAiB,cAAG,CACpH,GAAGA,EAAmB,UAAgB,aAAY,WAAMA,EAAmB,UAAiB,cAAY,UACrGA,EAAmB,UAAgB,aAAc,aAAMA,EAAmB,UAAiB,cAAc,WAC1G,OAEF/F,KAAK8M,gBAKTia,EAAAnnB,UAAA+M,sBAAA,SAAsBC,GACpB5M,KAAK8J,kBAAoB8C,EACzB5M,KAAK6M,gBACL7M,KAAK8M,eAGPia,EAAAnnB,UAAAunB,OAAA,SAAO5jB,GACFA,EACDvD,KAAK0N,oBAAoB/I,KAAK3E,KAAK2J,eAEnC3J,KAAKyN,qBAAqB9I,KAAK3E,KAAK0J,gBAGtC1J,KAAKinB,iBAAiBtiB,KAAKpB,IAG7BwjB,EAAAnnB,UAAAkN,YAAA,WACE9M,KAAK4J,yBAA0B,EAC/B5J,KAAK6J,iBAAkB,EACvB7J,KAAKgK,eAAiB,GACtBhK,KAAKiK,eAAiB,GACtBjK,KAAKiJ,YAAYtE,KAAK,KAGxBoiB,EAAAnnB,UAAAiN,cAAA,SAAcvG,EAAwBqE,GAAtC,IAAAI,EAAA/K,KAUE,QAVY,IAAAsG,IAAAA,GAAA,QAAwB,IAAAqE,IAAAA,EAAA,MAChCrE,GAASqE,GACV3K,KAAKiK,eAAeU,EAAK3K,KAAKgJ,gBAAkBhJ,KAAKiK,eAAeU,EAAK3K,KAAKgJ,cAAgB2B,IACrFrE,GAASqE,GACnB3K,KAAKiK,eAAeU,EAAK3K,KAAKgJ,sBAAwBhJ,KAAKiK,eAAeU,EAAK3K,KAAKgJ,cAEtFhJ,KAAK4J,wBAA0B5J,KAAK8J,kBAAkBiD,OAAK,SAACnH,GAAQ,OAAAmF,EAAKf,eAAepE,EAAKmF,EAAK/B,iBAClGhJ,KAAK6J,gBACH7J,KAAK8J,kBAAkBkD,MAAI,SAACpH,GAAQ,OAAAmF,EAAKf,eAAepE,EAAKmF,EAAK/B,mBAAmBhJ,KAAK4J,wBAExF5J,KAAKiJ,YAAa,KACdme,EAA2BjoB,OAAO8N,OAAOjN,KAAKiK,gBACpDjK,KAAKiJ,YAAYtE,KAAKyiB,GAGc,IAAlCpnB,KAAKuJ,UAAUjC,QAAQ5H,SACzBM,KAAK4J,yBAA0B,IAInCmd,EAAAnnB,UAAAsN,SAAA,SAAS3L,GAAT,IAAAwJ,EAAA/K,KACEA,KAAK8J,kBAAkBgC,SAAO,SAAClG,GACzBrE,GACDwJ,EAAKd,eAAerE,EAAKmF,EAAK/B,gBAAkB+B,EAAKd,eAAerE,EAAKmF,EAAK/B,cAAgBpD,GAE/FmF,EAAKd,eAAerE,EAAKmF,EAAK/B,sBAAwB+B,EAAKd,eAAerE,EAAKmF,EAAK/B,cAGtF+B,EAAKf,eAAepE,EAAKmF,EAAK/B,cAAgBzH,KAEhDvB,KAAK6M,qCA1GR1K,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,mBACVC,SAAA,spJAICsC,EAAAA,sBACAA,EAAAA,4BACAA,EAAAA,2BACAA,EAAAA,8BAEAA,EAAAA,gCACAA,EAAAA,2BACAC,EAAAA,iCACAA,EAAAA,0BACAtC,EAAAA,aAAYH,KAAA,CAAC,YAAa,CAAEI,QAAQ,uBACpCD,EAAAA,aAAYH,KAAA,CAAC,YAAa,CAAEI,QAAQ,wBACpCD,EAAAA,aAAYH,KAAA,CAAC,aAAc,CAAEI,QAAQ,0BAErCoC,EAAAA,8BAEAA,EAAAA,6BACAA,EAAAA,oCACAC,EAAAA,oCACAA,EAAAA,UAhBwBC,EAAAA,CAAfC,EAAAA,4EAGeD,EAAAA,CAAfC,EAAAA,8EAiGZgiB,KCjHA,IAAAM,GAAA,WAMA,SAAAA,KAUoC,2BAVnC3kB,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAwK,EAAAA,cACAtG,GAEF/D,aAAc,CAACgkB,IACf/jB,QAAS,CAAC+jB,IACVzZ,QAAS,CAACC,EAAAA,sBAEwB8Z,EAhBpC,GCAAC,GAAA,WAUE,SAAAA,KAKF,OAFEA,EAAA1nB,UAAAsC,SAAA,iCAXDC,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,SACVC,SAAA,m1BAICsC,EAAAA,SAOH0iB,EAfA,GCAA,IAAAC,GAAA,WAUE,SAAAA,EAAoBC,GAAAxnB,KAAAwnB,aAAAA,SAEpBD,EAAA3nB,UAAA6nB,SAAA,SAASC,GACP1nB,KAAKwnB,aAAaG,OAAO,CACvBC,QAAS,OACTC,UAAWP,GACXQ,kBAAmB,CAAEJ,KAAIA,GACzBK,SAAU,KACVC,QAAS,2BAddpkB,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,oDAJLokB,EAAAA,uJADT,GCAA,IAAAC,GAAA,WAMA,SAAAA,KAW2B,2BAX1BxlB,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAE,EAAAA,kBACAqK,GAEFgb,gBAAiB,CAACb,IAClBvkB,aAAc,CAACukB,IACftkB,QAAS,CAACskB,IACVc,UAAW,CAACb,QAEaW,EAjB3B,GCAAG,GAAA,WAYE,SAAAA,IAHUroB,KAAAsoB,cAAgB,IAAIjkB,EAAAA,aACpBrE,KAAAuoB,aAAe,IAAIlkB,EAAAA,aAgB/B,OAZEgkB,EAAAzoB,UAAAsC,SAAA,aAIAmmB,EAAAzoB,UAAA4oB,OAAA,SAAO7mB,GACL3B,KAAKuoB,aAAa5jB,QAGpB0jB,EAAAzoB,UAAA6oB,QAAA,SAAQ9mB,GACN3B,KAAKsoB,cAAc3jB,4BArBtBxC,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,gBACVC,SAAA,8+HAICsC,EAAAA,6BACAC,EAAAA,6BACAA,EAAAA,UAgBHwjB,EA1BA,GCAA,IAAAK,GAAA,WAMA,SAAAA,KAeA,2BAfChmB,EAAAA,SAAQN,KAAA,CAAC,CACRW,aAAc,CACZslB,IAEF1lB,QAAS,CACPE,EAAAA,YACAkE,EAAAA,oBACAnE,EAAAA,aACAE,EAAAA,mBAEFE,QAAS,CAACqlB,IACVD,UAAW,GACXO,UAAW,CAACN,QAGdK,EArBA,GCIME,GAAyC,mBACvC3C,EAAM,IAAIlN,eACL2H,GACTtS,EAAcsS,GAAO5U,SAAO,SAAElG,GACxBA,GACFqgB,EAAIjN,IAAIpT,EAAKuF,cAAeuV,WAHlC,IAAoB,IAAAL,EAAA/U,EAAAnM,OAAOoM,KAAK6C,IAAc/C,EAAAgV,EAAA/e,QAAA+J,EAAA7J,KAAA6J,EAAAgV,EAAA/e,OAAA,GAA9B+J,EAAA9J,yGAOhB,OAAO0kB,EATqC,GAY9C4C,GAAA,WASE,SAAAA,KAiBF,OAfEA,EAAAjpB,UAAAsC,SAAA,WACElC,KAAK8O,kBAGP+Z,EAAAjpB,UAAAkG,YAAA,WACE9F,KAAK8O,kBAGP+Z,EAAAjpB,UAAAkP,eAAA,eACQga,EAAc9oB,KAAK+oB,QAAU/oB,KAAK+oB,OAAO5d,cAC/CnL,KAAKmP,YACH2Z,GAAeF,GAAiBjS,IAAImS,GAChCF,GAAiB5X,IAAI8X,GACrB,+BAxBT3mB,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,YACVC,SAAA,6zFAICsC,EAAAA,SAoBHikB,EA1BA,GChBA,IAAAG,GAAA,WAMA,SAAAA,KAeA,2BAfCtmB,EAAAA,SAAQN,KAAA,CAAC,CACRW,aAAc,CACZ8lB,IAEFlmB,QAAS,CACPE,EAAAA,YACAkE,EAAAA,oBACAnE,EAAAA,aACAE,EAAAA,mBAEFE,QAAS,CAAC6lB,IACVT,UAAW,GACXO,UAAW,CAACE,QAGdG,EArBA,GCAAC,GAAA,WAEA,SAAAA,KAiBA,OAfEA,EAAArpB,UAAAspB,WAAA,SAAWC,EAAqBC,GAC1BA,EACFC,OAAOC,eAAeC,QAAQJ,EAAanjB,KAAKC,UAAUmjB,IAE1DC,OAAOC,eAAeE,WAAWL,IAIrCF,EAAArpB,UAAA6pB,WAAA,SAAWN,GACT,OAAOnjB,KAAK4E,MAAMye,OAAOC,eAAeI,QAAQP,KAGlDF,EAAArpB,UAAA+pB,cAAA,SAAcR,GACZE,OAAOC,eAAeE,WAAWL,wBAfpCvlB,EAAAA,aAiBDqlB,EAnBA,GCAaW,GAAW,CACtBC,mBAAoB,GACpBC,sBAAuB,GACvBC,mBAAoB,IACpBC,aAAc,IACdC,aAAc,IACdC,iBAAkB,IAClBC,aAAc,IACdC,aAAc,IACdC,iBAAkB,IAClBC,eAAgB,IAChBC,gBAAiB,IACjBC,eAAgB,IAChBC,eAAgB,IAChBC,YAAa,IACbC,YAAa,KCJf,IAAAC,GAAA,WAAA,SAAAA,KAqBA,OAnBEA,EAAAhrB,UAAAirB,UAAA,SAAUlgB,EAAWmgB,GACnB,IAAKngB,IAASmgB,EACZ,MAAO,CAAE5G,QAAS,MAAO6G,MAAO,KAAMC,SAAS,EAAMC,UAAU,OAE3DC,EA0BV,SAA2BvgB,EAAWmgB,GACpC,GAAIA,EAAIK,OACN,OAAOL,EAAIK,OAAOxgB,OAEd8F,EAAOqa,EAAIra,KACjB,GAAoB,mBAATA,EACT,OAAOA,EAAK9F,GAEd,GAAoB,iBAAT8F,EACT,OAAO9F,EAAK8F,GAEd,OArCc2a,CAAkBzgB,EAAMmgB,GAC9BE,IAAYE,GAAe,IAARA,GACnBhH,EAAU8G,EAAU,MAAQE,EAC5BvH,EAAWmH,EAAItQ,OAASoP,GAASc,YACnCO,GAAW,EACXF,EAAuB,KAC3B,IAAKC,EAAS,KACNvG,EAAM4G,OAAOH,IACnBD,EAUN,SAA2BxG,GAEzB,QADIjK,EAAQ,GACHjb,EAAI,EAAGA,EAAIklB,EAAI/kB,OAAQH,IAC9Bib,GAASiK,EAAI6G,WAAW/rB,GAAK,IAAM,GAAK,EAE1C,OAAOib,EAfQ+Q,CAAkB9G,IAAQd,KAEnCoH,EAAQtG,GAGZ,MAAO,CAAEP,QAAOA,EAAE6G,MAAKA,EAAEC,QAAOA,EAAEC,SAAQA,wBAnB7CO,EAAAA,KAAIppB,KAAA,CAAC,CAAEqO,KAAM,cAAegb,MAAM,MAqBnCb,EArBA,GCTA,OAAA,WAEE5qB,KAAAyQ,KAA0B,KAI1BzQ,KAAAwM,MAAsC,OAEtCxM,KAAA0rB,MAA2B,KAE3B1rB,KAAA2rB,QAA8B,GAC9B3rB,KAAA4rB,QAAmB,EACnB5rB,KAAA6rB,SAAoB,EACpB7rB,KAAA8rB,SAAoB,GAMtB,IAAAC,GAAA,WAEE/rB,KAAAgsB,aAAmD,EACnDhsB,KAAAisB,UAAqB,GAKvB,IAAAC,GAAA,aAMA,IAAAC,GAAA,WAEEnsB,KAAAosB,UAAiC,IAAIrT,KAKvC,OAAA,WACE/Y,KAAA+qB,MAAgB,GAChB/qB,KAAAI,IAAc,GACdJ,KAAAmE,UAAqB,EACrBnE,KAAAgX,SAAoB,EACpBhX,KAAAqsB,YAAuB,EACvBrsB,KAAAssB,QAAmB,EACnBtsB,KAAAusB,UAAqB,qBCoErB,SAAAC,EACUhZ,EACAiZ,GAFV,IAAA1hB,EAAA/K,KACUA,KAAAwT,IAAAA,EACAxT,KAAAysB,qBAAAA,EA9EDzsB,KAAA0sB,UAAkC,GAElB1sB,KAAA0I,cAAwB,EACxB1I,KAAA2sB,0BAAoC,EACpC3sB,KAAA4sB,eAAyB,EAGzC5sB,KAAAgJ,YAAsB,aAENhJ,KAAAgnB,gBAA0B,EAEzChnB,KAAA6sB,UAAY,IAAIxoB,EAAAA,aAChBrE,KAAAiJ,YAAc,IAAI5E,EAAAA,aAClBrE,KAAAinB,iBAAmB,IAAI5iB,EAAAA,aACxBrE,KAAAyJ,cAAwB,EAExBzJ,KAAA0J,eAAyB,EACzB1J,KAAA2J,cAAwB,IAGvB3J,KAAAyN,qBAAuB,IAAIpJ,EAAAA,aAC3BrE,KAAA0N,oBAAsB,IAAIrJ,EAAAA,aAC1BrE,KAAA8sB,yBAA2B,IAAIzoB,EAAAA,aAMzCrE,KAAA8I,OAAS,KAGT9I,KAAA4J,yBAA0B,EAC1B5J,KAAA6J,iBAAkB,EAClB7J,KAAA8J,kBAAoB,GACpB9J,KAAA+J,cAAgB,GAEhB/J,KAAAgK,eAA6C,GAC7ChK,KAAAiK,eAAyC,GAEzCjK,KAAAknB,qBAAuB,GAEvBlnB,KAAA+sB,iBAAqC,IAAIZ,GAGzCnsB,KAAAgtB,eAAuC,GACvChtB,KAAAitB,WAAqB,EACrBjtB,KAAAktB,mBAAsC,GACtCltB,KAAAmtB,wBAA2C,GAC3CntB,KAAAotB,eAAyB,EAEzBptB,KAAAqtB,mBAA6B,EAE7BrtB,KAAAstB,aAAgC,GAEhCttB,KAAAutB,cAAiC,GAGjCvtB,KAAAwtB,mBAAsC,GACtCxtB,KAAAytB,oBAAuC,GACvCztB,KAAA0tB,YAAsB,EACtB1tB,KAAA2tB,YAAmB,KACnB3tB,KAAA4tB,aAAuB,GACvB5tB,KAAA6tB,yBAAmC,EACnC7tB,KAAA4N,wBAAkC,EAGlC5N,KAAA8tB,wBAA0B,GAGlB9tB,KAAA+tB,oBAAsC,KAGtC/tB,KAAAguB,mBAAqB,EAuJ7BhuB,KAAAiuB,WAAU,SAAIzd,EAAe7F,OACrBvK,EAAMuK,GAAQA,EAAKI,EAAK/B,aAC9B,OAAc,MAAP5I,EAAcirB,OAAOjrB,GAAO,OAAOoQ,GAI5CxQ,KAAAkuB,kBAAiB,SAAI1d,GAA0B,OAAAA,GAE/CxQ,KAAAmuB,WAAU,SAAIC,EAAgBtD,GAC5B,OAAOA,EAAIC,OA6Qb/qB,KAAAquB,WAAU,SAAIC,GACZ,GACEA,EAAIC,KAAKC,OAAOrqB,WACfmqB,EAAIG,SAASD,OAAOxX,SACT,IAAZsX,EAAII,IAEJ,OAAOC,EAAAA,IAAG,OAENJ,EAAiB,IAAIK,GACzBL,EAAKvX,QAAUsX,EAAIG,SAASD,OAAOxX,QACnCuX,EAAKpqB,SAAWmqB,EAAIG,SAASD,OAAOrqB,SACpCoqB,EAAKhC,SAAW+B,EAAIG,SAASD,OAAOjC,SACpCgC,EAAKjC,OAASgC,EAAIG,SAASD,OAAOlC,OAClCiC,EAAKnuB,IAAMkuB,EAAIG,SAASD,OAAOpuB,IAC/BmuB,EAAKlC,WAAaiC,EAAIG,SAASD,OAAOnC,WACtCkC,EAAKxD,MAAQuD,EAAIG,SAASD,OAAOzD,UAE7B8D,EAAgB9jB,EAAKuiB,aAAawB,WAAS,SAAElpB,GAC/C,OAAOA,EAAKmlB,OAASuD,EAAIG,SAASD,OAAOzD,SAGvCgE,EACFhkB,EAAKuiB,aAAawB,WAAS,SAAElpB,GAC3B,OAAOA,EAAKmlB,OAASuD,EAAIC,KAAKC,OAAOzD,WACpB,IAAbuD,EAAII,IAAa,EAAIJ,EAAII,KAMjC,OALA3jB,EAAKuiB,aAAaxR,OAAOiT,EAAW,EAAGR,GACvCxjB,EAAKuiB,aAAaxR,OAChBiT,GAAaF,EAAgBA,EAAgBA,EAAgB,EAC7D,GAEKF,EAAAA,IAAG,GAAM5e,KAAKif,EAAAA,MAAM,OAnc7BhvB,KAAK2tB,YAAcsB,EAAAA,eAA2B,CAC5CC,OAAQC,EAAAA,UACR1e,KAAM,UACN2e,QAAS,EACTC,UAAW,kBA40BjB,OAx0BE7C,EAAA5sB,UAAAsC,SAAA,WAAA,IAAA6I,EAAA/K,MACkC,IAA5BA,KAAKsvB,qBACPtvB,KAAK6tB,wBAA0B7tB,KAAKsvB,qBAEP,IAA3BtvB,KAAK6N,oBACP7N,KAAK4N,uBAAyB5N,KAAK6N,mBAErC7N,KAAK4tB,aAAe2B,SAASC,SACzBxvB,KAAK4tB,eACP5tB,KAAK4tB,aAAe5tB,KAAK4tB,aAAa9H,QAAQ,MAAO,MAEvD9lB,KAAKyvB,YAAczvB,KAAKysB,qBAAqBhD,WAC3C,gCAGGzpB,KAAKyvB,cACRzvB,KAAKyvB,YAAc,CACjBC,SAAU,QAId1vB,KAAK2vB,iBACA3vB,KAAK0sB,WAAuC,IAA1B1sB,KAAK0sB,UAAUhtB,QAItCM,KAAK2tB,YACFiC,QACAC,MAAI,WACH9kB,EAAK+kB,wBAENC,OAAK,SAAWpuB,GAEf,MADA8a,QAAQC,IAAI,uBAAwB/a,GAC9B,sBAIZ6qB,EAAA5sB,UAAAkG,YAAA,SAAYC,GAAZ,IAAAgF,EAAA/K,KACE,GACE+F,GACAA,EAAmB,WACnBA,EAAmB,UAAgB,cACnCA,EAAmB,UAAiB,cACpC,CACA,GACEA,EAAmB,UAAgB,aAAY,WAC7CA,EAAmB,UAAiB,cAAY,UAClDA,EAAmB,UAAgB,aAAc,aAC/CA,EAAmB,UAAiB,cAAc,WAKpD,YAHI/F,KAAK4sB,eACP5sB,KAAKgwB,sBAAqB,IAIzBhwB,KAAK4N,wBACR5N,KAAK8M,cAQT,GAJI/G,EAAmB,WAAK/F,KAAK4sB,eAC/B5sB,KAAKgwB,sBAAqB,GAI1BjqB,EAAmB,WACnBC,KAAKC,UAAUF,EAAmB,UAAEG,gBAClCF,KAAKC,UAAUF,EAAmB,UAAEI,qBACCkS,IAAvCtS,EAAmB,UAAEI,cACrB,CAEA,GADAnG,KAAK2vB,kBACA3vB,KAAK0sB,WAAuC,IAA1B1sB,KAAK0sB,UAAUhtB,OACpC,OAEFM,KAAK2tB,YACFiC,QACAC,MAAI,WACH9kB,EAAK+kB,wBAENC,OAAK,SAAWpuB,GAEf,MADA8a,QAAQC,IAAI,uBAAwB/a,GAC9B,uBAKd6qB,EAAA5sB,UAAA+vB,eAAA,WAEE3vB,KAAK0sB,UAAY1sB,KAAK0sB,UAAU/mB,QAAM,SAAEC,GAEtC,OAAKA,EAAK/F,eAAe,YAIF,IAAhB+F,EAAKgmB,WAIhBY,EAAA5sB,UAAAqwB,KAAA,SAAKA,GACHjwB,KAAK6sB,UAAUloB,KAAKsrB,IAGtBzD,EAAA5sB,UAAAswB,iBAAA,WACElwB,KAAK0tB,YAAc1tB,KAAK0tB,WACxB1tB,KAAKwT,IAAI6D,eACTrX,KAAKmwB,8BAA6B,IAGpChxB,OAAAyB,eAAI4rB,EAAA5sB,UAAA,2BAAwB,KAA5B,WACE,OAA4B,MAAxBI,KAAKowB,iBAA2BpwB,KAAKowB,gBAAkB,EAClDpwB,KAAKowB,gBAEPpwB,KAAK8tB,yDAId3uB,OAAAyB,eAAI4rB,EAAA5sB,UAAA,mBAAgB,KAApB,WACE,IAAKI,KAAK4sB,cACR,OAAO,MAEHyD,EACJrwB,KAAKuJ,WAAavJ,KAAKuJ,UAAUjC,QAC7BtH,KAAKuJ,UAAUjC,QAAQ5H,OACvB,EACN,GAAI2wB,GAAY,EACd,OAAO,MAEHC,EAAYtwB,KAAKuwB,WAAa,IAAM,IACpCC,EAAkBH,EAAWrwB,KAAKywB,yBACxC,MAAsB,oBAAXpH,OACFmH,EAAkBnH,OAAOqH,YAAcJ,EAEzCD,EAAW,qCAepB7D,EAAA5sB,UAAAkwB,mBAAA,WAAA,IAAA/kB,EAAA/K,KAEEA,KAAK2tB,YACFjE,QACC,YACE1pB,KAAKyvB,YAAYC,SACjB,IACA1vB,KAAK4tB,aACL,IACA5tB,KAAK2wB,MAERd,MAAI,SAAEtuB,GACDA,GACFwJ,EAAKgiB,iBAAmBxrB,EACxBwJ,EAAK6lB,4BAEH7lB,EAAKgiB,iBAAiB5lB,UACtB4D,EAAKgiB,iBAAiB5lB,SAAW,KAEjC4D,EAAKpB,cAAgBoB,EAAKgiB,iBAAiB5lB,SAC3C4D,EAAK2C,oBAAoB/I,KAAKoG,EAAKpB,kBAGrCoB,EAAKgiB,iBAAmB,IAAIZ,GAC5BphB,EAAKgiB,iBAAiB5lB,SAAW4D,EAAKpB,eAEpCoB,EAAK8iB,wBACP9iB,EAAK+hB,yBAAyBnoB,KAAKoG,EAAKpB,eAExCoB,EAAK8iB,yBAA0B,EAEjC9iB,EAAK8lB,eAENd,OAAK,SAAEe,GACN/lB,EAAKgiB,iBAAmB,IAAIZ,GAC5BphB,EAAKgiB,iBAAiB5lB,SAAW4D,EAAKpB,cACtCoB,EAAK8lB,gBAIXrE,EAAA5sB,UAAAixB,UAAA,WAEE,GADA7wB,KAAKitB,WAAY,GACZjtB,KAAK2wB,KACR,KAAM,gDAEJ3wB,KAAK+wB,oBACP/wB,KAAKgxB,WACLhxB,KAAKixB,UACLjxB,KAAKkxB,iBACLlxB,KAAK+tB,oBAAsB,KAC3B/tB,KAAKgwB,sBAAqB,KAK9BxD,EAAA5sB,UAAAowB,qBAAA,SAAqBmB,GAArB,IAAApmB,EAAA/K,UAAqB,IAAAmxB,IAAAA,GAAA,OACbC,EAAapxB,KAAKqxB,iBAClBC,EACyB,OAA7BtxB,KAAK+tB,qBACL/tB,KAAK+tB,sBAAwBqD,EAG/B,GAFApxB,KAAK+tB,oBAAsBqD,EAEvBD,GAAgBG,EAYlB,OAXAtxB,KAAKitB,WAAY,EACjBjtB,KAAKwT,IAAI6D,oBACTqC,YAAU,WACR3O,EAAKkiB,WAAY,EACjBliB,EAAKyI,IAAI6D,eACTqC,YAAU,WACR3O,EAAKwmB,aACLxmB,EAAKyI,IAAI6D,eACTtM,EAAKymB,iBAAiBJ,SAM5BpxB,KAAKuxB,aACLvxB,KAAKwT,IAAI6D,eACTrX,KAAKwxB,iBAAiBJ,IAGhB5E,EAAA5sB,UAAA4xB,iBAAR,SAAyBJ,GACnBA,EACFpxB,KAAKmwB,8BAA6B,GAGhCnwB,KAAK4sB,gBACP5sB,KAAKyxB,wBAAuB,GAC5BzxB,KAAK0xB,yBAITlF,EAAA5sB,UAAAuwB,6BAAA,SAA6BwB,GAA7B,IAAA5mB,EAAA/K,UAA6B,IAAA2xB,IAAAA,GAAA,GACtB3xB,KAAKqxB,iBAQV3X,YAAU,eACFkY,EAAW7mB,EAAK8mB,kBACpB9mB,EAAK8mB,iBAAiBC,yBACnBF,IAGY7mB,EAAK0mB,uBAAuBE,IAE3C5mB,EAAKwmB,aACLxmB,EAAKyI,IAAI6D,eACTua,EAASG,oBACTrY,YAAU,WACR3O,EAAK0mB,uBAAuBE,GAC5B5mB,EAAKwmB,aACLK,EAASG,wBAGXH,EAASG,wBAxBPJ,IACF3xB,KAAKyxB,uBAAuBE,GAC5B3xB,KAAKuxB,aACLvxB,KAAKwT,IAAI6D,iBA2BfmV,EAAA5sB,UAAA6xB,uBAAA,SAAuBO,GACrB,QADqB,IAAAA,IAAAA,GAAA,GAEK,MAAxBhyB,KAAKowB,iBACLpwB,KAAKowB,gBAAkB,IACtB4B,EAED,OAAO,MAEHJ,EAAW5xB,KAAK6xB,kBACpB7xB,KAAK6xB,iBAAiBC,yBAClBG,EAAYjyB,KAAK6xB,kBACrB7xB,KAAK6xB,iBAAuC,uBACxCK,EACHN,GACGA,EAASO,WAAwB,cAAiB3O,cAClD,4BAEHyO,GAAcA,EAAUzO,cAAc,YACzC,IAAK0O,GAAOA,EAAIE,cAAgB,EAC9B,OAAO,MAEHC,EAASH,EAAIE,aACnB,OAAIC,IAAWryB,KAAK8tB,0BAGpB9tB,KAAK8tB,wBAA0BuE,GACxB,IAIT7F,EAAA5sB,UAAA0yB,eAAA,WACEtyB,KAAKqtB,mBAAoB,EACzBrtB,KAAKutB,cAAgBvnB,KAAK4E,MAAM5E,KAAKC,UAAUjG,KAAKytB,sBACpDztB,KAAKstB,aAAetnB,KAAK4E,MAAM5E,KAAKC,UAAUjG,KAAKwtB,qBACnDxtB,KAAKwT,IAAI6D,gBAIXmV,EAAA5sB,UAAA2yB,gBAAA,WAEEvyB,KAAKytB,oBAAsBznB,KAAK4E,MAAM5E,KAAKC,UAAUjG,KAAKutB,gBAC1DvtB,KAAKwtB,mBAAqBxnB,KAAK4E,MAAM5E,KAAKC,UAAUjG,KAAKstB,eACzDttB,KAAKqtB,mBAAoB,EACzBrtB,KAAKwT,IAAI6D,gBAGXmV,EAAA5sB,UAAA4yB,YAAA,WAAA,IAAAznB,EAAA/K,KACEA,KAAK+sB,iBAAiB0F,KAAO,GAC7BzyB,KAAKstB,aAAaxhB,SAAO,SAAElG,GACzBmF,EAAKgiB,iBAAiB0F,KAAK5wB,KAAK+D,EAAKmlB,UAEvC/qB,KAAK0yB,uBACL1yB,KAAK6wB,YACL7wB,KAAKqtB,mBAAoB,EACzBrtB,KAAKwT,IAAI6D,gBAIXmV,EAAA5sB,UAAAqxB,QAAA,WAAA,IAAAlmB,EAAA/K,KAIE,GAHAA,KAAKotB,eAAgB,EACrBptB,KAAKstB,aAAe,GACpBttB,KAAKutB,cAAgB,GACjBvtB,KAAK2yB,eAAgB,CACnB,IAAAziB,EAAAlQ,KAAAgtB,eAAA4F,QAAA,kIAAEC,EAAA3iB,EAAA2iB,UAAWC,EAAA5iB,EAAA4iB,OAWjBA,EAAO7C,MAAI,SAAE8C,EAAGC,GACd,OACEjoB,EAAKgiB,iBAAiB0F,KAAKxjB,QAAQ8jB,EAAEhI,OACrChgB,EAAKgiB,iBAAiB0F,KAAKxjB,QAAQ+jB,EAAEjI,UAGzC/qB,KAAK0sB,UAAYoG,EAAO9wB,OAAO6wB,GAGjC7yB,KAAK0sB,UAAU5gB,SAAO,SAAEmnB,EAASziB,GAC3BzF,EAAK4nB,gBACPM,EAAQrH,SAAS7gB,EAAKgiB,iBAAiB0F,KAAK/mB,SAASunB,EAAQlI,OAGzDkI,EAAQrH,OACV7gB,EAAKuiB,aAAazrB,KAAK,CACrBkpB,MAAOkI,EAAQlI,MACf3qB,IAAK6yB,EAAQlI,MACb5mB,WAAU8uB,EAAQvH,MAElB1U,UAASjM,EAAKgiB,iBAAiB0F,KAAK/mB,SAASunB,EAAQlI,SAKvDhgB,EAAKwiB,cAAc1rB,KAAK,CACtBkpB,MAAOkI,EAAQlI,MACf3qB,IAAK6yB,EAAQlI,MACb5mB,WAAU8uB,EAAQvH,MAElB1U,UAASjM,EAAKgiB,iBAAiB0F,KAAK/mB,SAASunB,EAAQlI,WAMzDkI,EAAQrH,QAAS,EACjB7gB,EAAKuiB,aAAazrB,KAAK,CACrBkpB,MAAOkI,EAAQlI,MACf3qB,IAAK6yB,EAAQlI,MACb/T,SAAS,EAET7S,WAAU8uB,EAAQvH,YAOtB1rB,KAAK+sB,kBACL/sB,KAAK+sB,iBAAiBX,WACmB,IAAzCpsB,KAAK+sB,iBAAiBX,UAAUnoB,MAEhCjE,KAAK0sB,UAAU5gB,SAAO,SAAEgf,GAClB/f,EAAKgiB,iBAAiBX,UAAUzV,IAAImU,EAAIC,SAC1CD,EAAItQ,MAAQzP,EAAKgiB,iBAAiBX,UAAUpb,IAAI8Z,EAAIC,WAK1D/qB,KAAKgxB,WACLtX,YAAU,WACR3O,EAAKqiB,eAAgB,IACpB,IAsCLZ,EAAA5sB,UAAAszB,kBAAA,SAAkBC,EAAKC,EAAoBC,EAAoB3E,OACvD4E,EAAWttB,KAAK4E,MAAM5E,KAAKC,UAAUktB,IACrCI,EAAcD,EAASxE,WAAS,SACnClpB,GAAS,OAAAA,EAAKmlB,QAAUsI,KAErBG,EAAeF,EAASxE,WAAS,SACpClpB,GAAS,OAAAA,EAAKmlB,QAAUqI,KAErBK,EAAW/E,EAAM,EAAI6E,EAAc7E,EAAM6E,EAEzCG,EAAiBJ,EAASxX,OAAO0X,EAAc,GAErD,OADAF,EAASxX,OAAO2X,EAAW,EAAG,EAAGC,EAAe,IACzCJ,GAIT9G,EAAA5sB,UAAA+zB,YAAA,SAAYrtB,GAEV,GAAIA,EAAMioB,KAAKC,OAAOxX,QAAS,KACzBuX,EAAiB,IAAIK,IACzBL,EAAOvuB,KAAKutB,cAActV,MAAI,SAAErS,GAC9B,OAAOA,EAAKmlB,QAAUzkB,EAAMioB,KAAKC,OAAOzD,UAErC/T,SAAU,EAGf,QADI4c,EAAQ,KACHr0B,EAAIS,KAAKgtB,eAAettB,OAAS,EAAGH,GAAK,EAAGA,IACnD,GAAqC,UAAjCS,KAAKgtB,eAAeztB,GAAGmsB,MAAmB,CAC5CkI,EAAQ5zB,KAAKgtB,eAAeztB,GAAGwrB,MAC/B,UAGA8I,EAAoB7zB,KAAKstB,aAAalX,MAAM,GAChD,GAAKwd,EAEE,KACCpjB,EAAQxQ,KAAKstB,aAAawB,WAAS,SACtCP,GAAS,OAAAA,EAAKxD,QAAU6I,KAE3BC,EAAkB/X,OAAOtL,EAAO,EAAG+d,QALnCsF,EAAkBhyB,KAAK0sB,GAOzBvuB,KAAKstB,aAAeuG,EACpB7zB,KAAKutB,cAAgBvtB,KAAKutB,cAAc5nB,QAAM,SAAEC,GAC9C,OAAOA,EAAKmlB,QAAUzkB,EAAMioB,KAAKC,OAAOzD,aAErC,KAID+I,EAAoB9zB,KAAKutB,cAAcnX,MAAM,GACjDpW,KAAKstB,aAAaxhB,SAAO,SAAElG,GACzB,GAAIA,EAAKmlB,QAAUzkB,EAAMioB,KAAKC,OAAOzD,MAAO,KACpCzH,EAAYtd,KAAK4E,MAAM5E,KAAKC,UAAUL,IAC5C0d,EAAUtM,SAAU,EACpB8c,EAAkBjyB,KAAKyhB,OAG3BtjB,KAAKutB,cAAgBuG,EAGrB9zB,KAAKstB,aAAettB,KAAKstB,aAAa3nB,QAAM,SAAEC,GAC5C,OAAOA,EAAKmlB,QAAUzkB,EAAMioB,KAAKC,OAAOzD,SAG5C/qB,KAAKwT,IAAI6D,gBAIXmV,EAAA5sB,UAAAm0B,iBAAA,WAAA,IAAAhpB,EAAA/K,KACM6zB,EAAqC,GAYzC,OAVA7zB,KAAKgtB,eAAelhB,SAAO,SAAElG,GAC3B,IAAKmF,EAAKgiB,iBAAiB0F,KAAK/mB,SAAS9F,EAAKmlB,OAAQ,KAChDiJ,EAAqB,IAAIpF,GAC7BoF,EAASjJ,MAAQnlB,EAAKmlB,MACtBiJ,EAAS5zB,IAAMwF,EAAKmlB,MACpBiJ,EAAS7vB,WAAWyB,EAAK8lB,MACzBsI,EAAShd,SAAU,EACnB6c,EAAkBhyB,KAAKmyB,OAGpBH,GAGTrH,EAAA5sB,UAAAoxB,SAAA,WACOhxB,KAAK0sB,UAAU,GAAGuH,UACrBj0B,KAAK0sB,UAAU5gB,SAAO,SAAElG,OAChBie,EAAOjK,SAASc,cAAc,QACpCmJ,EAAKhd,MAAMid,WAAa,SACxBD,EAAKhd,MAAMkd,SAAW,WACtBF,EAAKhd,MAAMmd,WAAa,SACxBH,EAAKhd,MAAMod,SAAW,OACtBJ,EAAKhd,MAAMqd,QAAU,eACrBL,EAAKM,UAAYve,EAAKmlB,MACtBnR,SAASwK,KAAK9I,YAAYuI,GAC1Bje,EAAKquB,SAAWpQ,EAAKS,YAAc,GACnCT,EAAKhd,MAAMqd,QAAU,OACrBtK,SAASwK,KAAKG,YAAYV,UAIxBqQ,EAAgBl0B,KAAK0sB,UAAU/mB,QAAM,SAAEmlB,GAAQ,MAAc,SAAdA,EAAIY,SACnDyI,EAAiBn0B,KAAK0sB,UAAU/mB,QAAM,SACzCmlB,GAAQ,MAAc,UAAdA,EAAIY,SAET0I,EAAap0B,KAAK0sB,UAAU/mB,QAAM,SAAEmlB,GAAQ,OAACA,EAAIY,SACjD2I,EAAaH,EAAclyB,OAAOoyB,GAAYpyB,OAAOmyB,GAC3Dn0B,KAAK0sB,UAAY2H,EACZr0B,KAAKgtB,gBAAiD,IAA/BhtB,KAAKgtB,eAAettB,SAE9CM,KAAKgtB,eAAcjrB,EAAO/B,KAAK0sB,aAInCF,EAAA5sB,UAAAgxB,0BAAA,WAAA,IAAA7lB,EAAA/K,KACE,GAAKA,KAAK+sB,iBAAiBX,WAEpB,KAAMpsB,KAAK+sB,iBAAiBX,qBAAqBrT,KAAM,KACtDub,EAAY,IAAIvb,IACtB5Z,OAAOoM,KAAKvL,KAAK+sB,iBAAiBX,WAAWtgB,SAAO,SAAE1L,GACpDk0B,EAAUtb,IAAI5Y,EAAM2K,EAAKgiB,iBAA0B,UAAS3sB,OAE9DJ,KAAK+sB,iBAAiBX,UAAYkI,QANlCt0B,KAAK+sB,iBAAiBX,UAAY,IAAIrT,KAUlCyT,EAAA5sB,UAAA+yB,aAAR,WACE,SAAU3yB,KAAK+sB,kBAAoB/sB,KAAK+sB,iBAAiB0F,MAAQzyB,KAAK+sB,iBAAiB0F,KAAK/yB,OAAS,IAGvG8sB,EAAA5sB,UAAA8yB,qBAAA,WACE1yB,KAAK2tB,YAAYpE,QACf,YACEvpB,KAAKyvB,YAAYC,SACjB,IACA1vB,KAAK4tB,aACL,IACA5tB,KAAK2wB,KACP3wB,KAAK+sB,mBAITP,EAAA5sB,UAAAmxB,gBAAA,WACE,IAAK,IAAIxxB,EAAI,EAAGA,EAAIS,KAAK0sB,UAAUhtB,OAAQH,IACzC,IAAK,IAAIyc,EAAIzc,EAAI,EAAGyc,EAAIhc,KAAK0sB,UAAUhtB,OAAQsc,IAC7C,GAAIhc,KAAK0sB,UAAUntB,GAAGwrB,QAAU/qB,KAAK0sB,UAAU1Q,GAAG+O,MAChD,KAAM,iBAAiB/qB,KAAK0sB,UAAUntB,GAAGwrB,MAAK,MAIpD,OAAO,GAGTyB,EAAA5sB,UAAA20B,SAAA,SAASrkB,EAA0B4a,OAAxBtQ,EAAAtK,EAAAsK,MACTxa,KAAK4wB,gCACD4D,EAAY,EAEdA,EADEha,EAAQsQ,EAAImJ,SACFzZ,EAEAsQ,EAAImJ,SAElBj0B,KAAK+sB,iBAAiBX,UAAUpT,IAAI8R,EAAIC,MAAOyJ,GAC/Cx0B,KAAK0yB,uBACL1yB,KAAK0sB,UAAY1sB,KAAK0sB,UAAUzG,KAAG,SAAEtkB,GACnC,OAAAA,EAAEopB,QAAUD,EAAIC,MAAK7rB,EAAA,GAAQyC,EAAC,CAAE6Y,MAAOga,IAAc7yB,KAEvD3B,KAAKuxB,aACLvxB,KAAKwT,IAAI6D,gBAGXmV,EAAA5sB,UAAAsxB,eAAA,eACMuD,EAAaz0B,KAAK0sB,UAAUzU,MAAI,SAAE6S,GAAQ,MAAc,OAAdA,EAAIC,UAAmB,KACrE,GAAI0J,EAAY,KACVC,EAAU,GACdD,EAAW9I,QAAQ7f,SAAO,SAAEgK,GACrBA,EAAImW,WACPyI,GAAW5e,EAAIrF,aAIboT,EAAOjK,SAASc,cAAc,KACpCmJ,EAAKhd,MAAMid,WAAa,SACxBD,EAAKhd,MAAMkd,SAAW,WACtBF,EAAKhd,MAAMmd,WAAa,SACxBH,EAAKhd,MAAMod,SAAW,OACtBJ,EAAKhd,MAAMqd,QAAU,eACrBL,EAAKM,UAAYuQ,EACjB9a,SAASwK,KAAK9I,YAAYuI,GAC1B4Q,EAAWja,MACTqJ,EAAKS,YAC8D,GAAlEmQ,EAAW9I,QAAQhmB,QAAM,SAAEC,GAAS,OAACA,EAAKqmB,YAAUvsB,OAAS,GAC9D,GACFmkB,EAAKhd,MAAMqd,QAAU,OACrBtK,SAASwK,KAAKG,YAAYV,KAI9B2I,EAAA5sB,UAAAwG,aAAA,SAAaC,EAASC,GAChBD,GACFA,EAAGC,IAIPkmB,EAAA5sB,UAAA+0B,gBAAA,SAAgB7e,EAAiBnL,GAC/B,MAA+B,mBAApBmL,EAAIkW,YACNlW,EAAIkW,YAAYrhB,KAEhBmL,EAAIkW,aAIPQ,EAAA5sB,UAAAg1B,kBAAR,SAA0BtE,GACxB,MAAO,gBAAgBA,EAAS,OAG1B9D,EAAA5sB,UAAAi1B,sBAAR,WACE,IAAK70B,KAAK6xB,mBAAqB7xB,KAAK6xB,iBAAiBiD,iBACnD,OAAO,MAEHC,EAAY/0B,KAAK6xB,iBAAiBiD,iBACxB,cACVE,EAAUD,EAAUE,QAAQ,sBAClC,GAAID,GAAWA,EAAQE,YAAc,EACnC,OAAOF,EAAQE,gBAEXC,EAAOJ,EAAUE,QAAQ,uBAC/B,OAAIE,GAAQA,EAAKD,YAAc,EACtBC,EAAKD,YAEP,GAID1I,EAAA5sB,UAAAw1B,eAAR,SAAuBC,EAAkBjE,GACvC,GAAIiE,GAAY,EACd,OAAOjE,EAAa,MAAQ,KAE9B,GAAIA,EACF,OAAUiE,EAAQ,SAEdC,EAAgBt1B,KAAK60B,wBAC3B,OAAIS,EAAgB,EACXD,EAAWC,EAAmBD,EAAQ,KAAO,KAEhC,oBAAXhM,QAA0BgM,EAAWhM,OAAOkM,WAAa,GACxDF,EAAQ,KAEb,MAID7I,EAAA5sB,UAAA8xB,qBAAR,WACE,GAAK1xB,KAAK4sB,gBAAiB5sB,KAAKqxB,iBAAhC,KAGMmE,EAAUx1B,KAAKo1B,eAAep1B,KAAKguB,oBAAoB,GACzDhuB,KAAK8I,QAAU9I,KAAK8I,OAAOC,IAAMysB,GAA6B,OAAlBx1B,KAAK8I,OAAOyT,IAG5Dvc,KAAK8I,OAAS,CAAEC,EAAGysB,EAASjZ,EAAG,MAC/Bvc,KAAKwT,IAAI6D,kBAGXmV,EAAA5sB,UAAA2xB,WAAA,eACM8D,EAAW,EACXr1B,KAAK0I,eACP2sB,GAAY,IAEdr1B,KAAK0sB,UAAU5gB,SAAO,SAAElG,GACjBA,EAAK4U,QACR5U,EAAK4U,MAAQoP,GAASc,aAEpB9kB,EAAKgmB,SACPhmB,EAAK6vB,WAAaJ,EAClBA,GAAYzvB,EAAK4U,UAIrBxa,KAAKguB,mBAAqBqH,MACpB/E,EAAYtwB,KAAKuwB,WAAa,IAAM,IACpCa,EAAapxB,KAAKqxB,kBAEpBrxB,KAAK4sB,eAAkBwE,EAQtBpxB,KAAK4sB,cAQV5sB,KAAK8I,OAAS,CACZC,EAAG/I,KAAKo1B,eAAeC,GAAU,GACjC9Y,EAAGvc,KAAK40B,kBAAkBtE,IAT1BtwB,KAAK8I,OAAS,CACZC,EAAG,MACHwT,EAAG,gBAAgB+T,EAAS,OAV9BtwB,KAAK8I,OAAS,CACZC,EAAG/I,KAAKo1B,eAAeC,GAAU,GACjC9Y,EAAG,OAoBTiQ,EAAA5sB,UAAA+M,sBAAA,SAAsBC,GACpB5M,KAAK8J,kBAAoB8C,EACzB5M,KAAK6M,gBACA7M,KAAK4N,wBACR5N,KAAK8M,cAEP9M,KAAKwT,IAAI6D,gBAGXmV,EAAA5sB,UAAAunB,OAAA,SAAO5jB,GACLvD,KAAK+sB,iBAAiB5lB,SAAWnH,KAAK2J,cACtC3J,KAAK0yB,uBACDnvB,GACFvD,KAAK0N,oBAAoB/I,KAAK3E,KAAK2J,eACnC3J,KAAK8sB,yBAAyBnoB,KAAK3E,KAAK2J,iBAExC3J,KAAKyN,qBAAqB9I,KAAK3E,KAAK0J,gBAEpC1J,KAAKinB,iBAAiBtiB,KAAKpB,KAI/BipB,EAAA5sB,UAAAkN,YAAA,WACE9M,KAAK4J,yBAA0B,EAC/B5J,KAAK6J,iBAAkB,EACvB7J,KAAKgK,eAAiB,GACtBhK,KAAKiK,eAAiB,GACtBjK,KAAKiJ,YAAYtE,KAAK,IACtB3E,KAAKwT,IAAI6D,gBAGXmV,EAAA5sB,UAAAiN,cAAA,SAAcvG,EAAwBqE,GAAtC,IAAAI,EAAA/K,KAgBE,QAhBY,IAAAsG,IAAAA,GAAA,QAAwB,IAAAqE,IAAAA,EAAA,MAChCrE,GAASqE,GACV3K,KAAKiK,eAAeU,EAAK3K,KAAKgJ,gBAC5BhJ,KAAKiK,eAAeU,EAAK3K,KAAKgJ,cAAgB2B,IACvCrE,GAASqE,GACnB3K,KAAKiK,eAAeU,EAAK3K,KAAKgJ,sBACrBhJ,KAAKiK,eAAeU,EAAK3K,KAAKgJ,cAEzChJ,KAAK4J,wBAA0B5J,KAAK8J,kBAAkBiD,OAAK,SACxDnH,GAAS,OAAAmF,EAAKf,eAAepE,EAAKmF,EAAK/B,iBAE1ChJ,KAAK6J,gBACH7J,KAAK8J,kBAAkBkD,MAAI,SACxBpH,GAAS,OAAAmF,EAAKf,eAAepE,EAAKmF,EAAK/B,mBACpChJ,KAAK4J,wBAET5J,KAAKiJ,YAAa,KACdme,EAA2BjoB,OAAO8N,OAAOjN,KAAKiK,gBACpDjK,KAAKiJ,YAAYtE,KAAKyiB,GAGc,IAAlCpnB,KAAKuJ,UAAUjC,QAAQ5H,SACzBM,KAAK4J,yBAA0B,GAEjC5J,KAAKwT,IAAI6D,gBAGXmV,EAAA5sB,UAAAsN,SAAA,SAAS3L,GAAT,IAAAwJ,EAAA/K,KACEA,KAAK8J,kBAAkBgC,SAAO,SAAElG,GAC1BrE,GACDwJ,EAAKd,eAAerE,EAAKmF,EAAK/B,gBAC5B+B,EAAKd,eAAerE,EAAKmF,EAAK/B,cAAgBpD,GAEjDmF,EAAKd,eAAerE,EAAKmF,EAAK/B,sBACrB+B,EAAKd,eAAerE,EAAKmF,EAAK/B,cAGzC+B,EAAKf,eAAepE,EAAKmF,EAAK/B,cAAgBzH,KAEhDvB,KAAK6M,gBACL7M,KAAKwT,IAAI6D,gBAGXmV,EAAA5sB,UAAA4kB,cAAA,SAAcC,GACZ,OAAIA,GAAe,IAARA,EACFA,EAEA,OAIX+H,EAAA5sB,UAAA81B,cAAA,SAAc5K,GACZ,OAAIA,EAAI6K,QACC7K,EAAQ,KAEVA,EAAI8K,YAAc,6BAt6B5BzzB,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,WACVC,SAAA,i7RAEAuzB,gBAAiBC,EAAAA,wBAAwBC,0lLAnCzCrR,EAAAA,yBAuBOuE,oCAeNrkB,EAAAA,yBACAA,EAAAA,yBACAA,EAAAA,4BACAA,EAAAA,wCACAA,EAAAA,6BACAA,EAAAA,+BAEAA,EAAAA,2BACAA,EAAAA,8BAEAA,EAAAA,gCACAA,EAAAA,yBACAC,EAAAA,4BACAA,EAAAA,iCACAA,EAAAA,6BACAD,EAAAA,8BAEAA,EAAAA,6BACAA,EAAAA,kCACAA,EAAAA,iCACAA,EAAAA,oCACAC,EAAAA,oCACAA,EAAAA,yCACAA,EAAAA,2BACAtC,EAAAA,aAAYH,KAAA,CAAC,aAAc,CAAEI,QAAQ,6BACrCD,EAAAA,aAAYH,KAAA,CAAC,kBAAmB,CAAEI,QAAQ,8BAE1CD,EAAAA,aAAYH,KAAA,CAAC,mBAAoB,CAAEI,QAAQ,8BAgD3CwzB,EAAAA,UAAS5zB,KAAA,CAAC,UAAW,CAAEI,QAAQ,OAxEPsC,EAAAA,CAAfC,EAAAA,4EACeD,EAAAA,CAAfC,EAAAA,wFACeD,EAAAA,CAAfC,EAAAA,6EAKeD,EAAAA,CAAfC,EAAAA,8EAu5BZynB,KCz8BA,IAAAyJ,GAAA,WAgBA,SAAAA,KAoB6B,2BApB5BvzB,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAwK,EAAAA,cACAtG,EACAkiB,GACAhkB,EACAvC,EACAyzB,EAAAA,gBACAC,EAAAA,mBACAC,EAAAA,kBACAC,EAAAA,iBACAC,EAAAA,aACAC,EAAAA,cAEFxzB,aAAc,CAACypB,GAAkB5B,IACjCxC,UAAW,CAACa,IACZjmB,QAAS,CAACwpB,IACVlf,QAAS,CAACC,EAAAA,sBAEiB0oB,EApC7B,GCAAO,GAAA,WAWE,SAAAA,IAHSx2B,KAAAy2B,UAAoB,EAQ/B,OAHED,EAAA52B,UAAAsC,SAAA,iCAXDC,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,SACVC,SAAA,qiGAICsC,EAAAA,wBACAA,EAAAA,qBACAA,EAAAA,SAMH4xB,EAhBA,GCAA,IAAAE,GAAA,WAKA,SAAAA,KAQ2B,2BAR1Bh0B,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAE,EAAAA,mBAEFE,QAAS,CAACwzB,IACVzzB,aAAc,CAACyzB,QAEUE,EAb3B,GCUAC,GAAA,WAIE,SAAAA,EAAgCC,GAAA52B,KAAA42B,OAAAA,EAFxB52B,KAAA62B,SAAU,EAGhB72B,KAAKuW,eAIPogB,EAAA/2B,UAAA2W,MAAA,WAAA,IAAAxL,EAAA/K,KACMA,KAAK62B,SAA+B,oBAAbjd,WAG3B5Z,KAAK62B,SAAU,EAGfjd,SAASkd,iBACP,aAAW,WACL,OAAA/rB,EAAKgsB,wBACX,GAGE/2B,KAAK42B,QACP52B,KAAK42B,OAAOI,OACTjnB,KAAKpK,EAAAA,QAAM,SAAEhE,GAAM,OAAAA,aAAas1B,EAAAA,oBAChChnB,WAAS,WAAO,OAAAlF,EAAKgsB,0BAK5BJ,EAAA/2B,UAAAm3B,mBAAA,WAC0B,oBAAbnd,UAGMA,SAASC,iBACxB,uCAEO/N,SAAO,SAAEorB,OACVC,EAAOD,EAAGjC,QAAQ,qBACpBkC,GAAQA,EAAKC,YACfD,EAAKC,WAAW7S,YAAY4S,2BAxCnCvzB,EAAAA,WAAUxB,KAAA,CAAC,CAAEyB,WAAY,oDATAwzB,EAAAA,OAAMn3B,WAAA,CAAA,CAAA6D,KAajBuzB,EAAAA,6IAJf,GCVA,IAAAC,GAAA,WA+CE,SAAAA,EAAYC,IACd,2BA3BC90B,EAAAA,SAAQN,KAAA,CAAC,CACRY,QAAS,CACPgC,EACAvC,EAEA8D,EACA4G,EACAgB,EACAiB,GAEAiD,GACAyU,GACAlC,GAEA9d,EACAkiB,GACA3B,GACA4O,GACAS,GACAhO,GACAR,iDArBKyO,MA4BTY,EAhDA,GCAAE,GAAA,WAaE,SAAAA,EAAYD,IACd,2BATC90B,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CAACC,EAAAA,cACVI,QAAS,CAACu0B,IACVnP,UAAW,GACXD,gBAAiB,CAACb,iDALXqP,MAUTc,EAdA,MCGA,WAGEz3B,KAAAuB,MAAyD,MAO3D,OAAA,aCbA,IAAAm2B,GAAA,WAOE,SAAAA,gCALD9zB,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,wJAHd,GCAA8zB,GAAA,aCIA,OAAA,WAKE33B,KAAAuB,MAAkE,KAIlEvB,KAAAwS,YAA4B,IAAIrK,EAKhCnI,KAAA0S,UAAqB,EACrB1S,KAAAsS,SAAoB,WASpB1N,MAAA,EACAkO,OAAA,EACAC,KAAA,EACAC,UAAA,EACAE,eAAA,EACA8R,SAAA,EACA4S,MAAA,EACAzvB,YAAA,uNAIF,IAAA0vB,GAAA,WAKE,SAAAA,gCALDj0B,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,wJADd,GCpCai0B,GAAQ,CAOnBC,iBAAA,SAAiBxS,EAAsB9U,EAAcunB,OAC7CC,EAAa1S,EACnB,IAAK0S,IAAeA,EAAWv4B,OAC7B,OAAOu4B,EAGT,QADMv4B,EAAS6lB,EAAS7lB,OACfH,EAAI,EAAGA,EAAIG,EAAQH,IACtB04B,EAAW14B,GAAGkR,OAASA,IACzBwnB,EAAW14B,GAAG4Q,aAAa+nB,WAAaF,GAG5C,OAAOC,GAQTE,kBAAA,SAAkB7mB,EAAuB8mB,GAEvC,IAAK9mB,IAASA,EAAK5R,OACjB,MAFiB,GAKnB,QADMA,EAAS4R,EAAK5R,OACXH,EAAI,EAAGA,EAAIG,EAAQH,IACtB64B,EAAI9mB,EAAK/R,GAAGkR,QACda,EAAK/R,GAAGgC,MAAQ62B,EAAI9mB,EAAK/R,GAAGkR,OAGhC,OAAOa,GAST+mB,wBAAA,SAAwB/mB,EAAkB5M,OAMlCuzB,EAAa,GACnB,OAAK3mB,GAASA,EAAK5R,QAGfgF,EACEA,EAAO4zB,UAAY5zB,EAAO6zB,SAC5BjnB,EAAKxF,SAAO,SAAElG,OACN4yB,EAAkB5yB,EACxB4yB,EAAWrd,MAAQvV,EAAKlB,EAAOyW,OAC/Bqd,EAAWj3B,MAAQqE,EAAKlB,EAAOnD,OAC3BmD,EAAO6zB,WACTC,EAAW9zB,EAAO6zB,UAAY3yB,EAAKlB,EAAOnD,QAExCmD,EAAO4zB,WACTE,EAAW9zB,EAAO4zB,UAAY1yB,EAAKlB,EAAOyW,QAE5C8c,EAAWp2B,KAAK22B,MAGlBlnB,EAAKxF,SAAO,SAAElG,OACN4yB,EAAkB5yB,EACxB4yB,EAAWrd,MAAQvV,EAAKlB,EAAOyW,OAC/Bqd,EAAWj3B,MAAQqE,EAAKlB,EAAOnD,OAC/B02B,EAAWp2B,KAAK22B,MAIpBlnB,EAAKxF,SAAO,SAAElG,OACN4yB,EAAkB,GACxBA,EAAWrd,MAAQvV,EACnB4yB,EAAWj3B,MAAQqE,EACnBqyB,EAAWp2B,KAAK22B,MAGbP,GAhCEA,GAwCXz0B,IAAA,SAAIi1B,EAAgBlwB,WAClB,QADkB,IAAAA,IAAAA,EAAA,IACbpD,MAAMkhB,QAAQoS,GACjB,MAAM,IAAIC,MAAM,WAElB,GAAID,EAAKzrB,MAAI,SAAC2rB,GAAO,MAAe,iBAARA,KAC1B,MAAM,IAAID,MAAM,iBAEd7f,EAAS,MACb,IAAkB,IAAA+f,EAAAttB,EAAAmtB,GAAII,EAAAD,EAAAt3B,QAAAu3B,EAAAr3B,KAAAq3B,EAAAD,EAAAt3B,OAAE,CACtBuX,GADYggB,EAAAt3B,wGAGd,OAAOwK,EAAAA,MAAM8M,EAAQtQ,IAQvBuwB,SAAA,SAASL,EAAgBlwB,WACvB,QADuB,IAAAA,IAAAA,EAAA,IAClBpD,MAAMkhB,QAAQoS,GACjB,MAAM,IAAIC,MAAM,WAElB,GAAID,EAAKzrB,MAAI,SAAC2rB,GAAO,MAAe,iBAARA,KAC1B,MAAM,IAAID,MAAM,aAElB,GAAID,EAAK/4B,OAAS,EAChB,MAAM,IAAIg5B,MAAM,oBAEd7f,EAAS4f,EAAKM,YAClB,IAAkB,IAAAC,EAAA1tB,EAAAmtB,GAAIQ,EAAAD,EAAA13B,QAAA23B,EAAAz3B,KAAAy3B,EAAAD,EAAA13B,OAAE,CACtBuX,GADYogB,EAAA13B,wGAGd,OAAOwK,EAAAA,MAAM8M,EAAQtQ,IAQvB2wB,SAAA,SAAST,EAAgBlwB,WACvB,QADuB,IAAAA,IAAAA,EAAA,IAClBpD,MAAMkhB,QAAQoS,GACjB,MAAM,IAAIC,MAAM,WAElB,GAAID,EAAKzrB,MAAI,SAAC2rB,GAAO,MAAe,iBAARA,KAC1B,MAAM,IAAID,MAAM,iBAEd7f,EAAS,MACb,IAAkB,IAAAsgB,EAAA7tB,EAAAmtB,GAAIW,EAAAD,EAAA73B,QAAA83B,EAAA53B,KAAA43B,EAAAD,EAAA73B,OAAE,CACtBuX,GADYugB,EAAA73B,wGAGd,OAAOwK,EAAAA,MAAM8M,EAAQtQ,IAQvB8wB,OAAA,SAAOZ,EAAgBlwB,WACrB,QADqB,IAAAA,IAAAA,EAAA,IAChBpD,MAAMkhB,QAAQoS,GACjB,MAAM,IAAIC,MAAM,WAElB,GAAID,EAAKzrB,MAAI,SAAC2rB,GAAO,MAAe,iBAARA,KAC1B,MAAM,IAAID,MAAM,aAElB,GAAID,EAAK/4B,OAAS,EAChB,MAAM,IAAIg5B,MAAM,oBAEd7f,EAAS4f,EAAKM,YAClB,IAAkB,IAAAO,EAAAhuB,EAAAmtB,GAAIc,EAAAD,EAAAh4B,QAAAi4B,EAAA/3B,KAAA+3B,EAAAD,EAAAh4B,OAAE,CAAnB,IAAMq3B,EAAGY,EAAAh4B,MACZ,GAAY,IAARo3B,EACF,MAAM,IAAID,MAAM,WAElB7f,GAAkB8f,oGAEpB,OAAO5sB,EAAAA,MAAM8M,EAAQtQ,8oBC9KE,CACvBixB,YAAa","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, ContentChild, Input, OnInit, TemplateRef } from '@angular/core';\n\n@Component({\n selector: 'hd-button-group',\n templateUrl: './hd-button-group.component.html',\n styleUrls: ['./hd-button-group.component.less']\n})\nexport class HdButtonGroupComponent implements OnInit {\n @ContentChild(\"buttonGroupLeft\", { static: false }) buttonGroupLeft: TemplateRef<any>;\n @ContentChild(\"buttonGroupRight\", { static: false }) buttonGroupRight: TemplateRef<any>;\n\n constructor() { }\n\n ngOnInit() {\n\n }\n}\n","import { HdButtonGroupComponent } from './hd-button-group.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdButtonGroupComponent],\n exports: [HdButtonGroupComponent]\n})\nexport class HdButtonGroupModule { }\n","import { Injectable } from '@angular/core';\n\nexport enum ButtonType {\n primary = 'primary',\n dashed = 'dashed',\n danger = 'danger',\n default = 'default',\n link = 'link',\n submit = 'submit',\n // 增加类型\n reset = 'reset',\n add = 'add'\n}\n\nexport enum ButtonSize {\n normal = 'normal',\n small = 'small'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdButtonService {\n\n constructor() { }\n\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { InputBoolean } from 'ng-zorro-antd';\nimport { ButtonSize, ButtonType } from './hd-button.service';\n@Component({\n selector: 'hd-button',\n templateUrl: './hd-button.component.html',\n styleUrls: ['./hd-button.component.less']\n})\nexport class HdButtonComponent implements OnInit {\n\n // 默认default\n @Input() type: ButtonType = ButtonType.default;\n @Input() size: ButtonSize = ButtonSize.normal;\n @Input() @InputBoolean() loading: boolean;\n @Input() @InputBoolean() disabled: boolean = false;\n @Output() clickAction = new EventEmitter<any>();\n @Output() nzOnConfirm = new EventEmitter<any>();\n constructor() { }\n\n ngOnInit() {\n if ((this.loading === false || this.loading === true) && this.clickAction.observers.length === 0 && this.nzOnConfirm.observers.length === 0) {\n throw '存在loading效果的hd-button组件禁止使用click绑定点击事件,请使用clickAction绑定!';\n }\n if (this.type === 'submit') {\n throw '禁止使用submit类型的按钮,请使用普通按钮+click事件触发表单提交!';\n }\n }\n\n /** loading 时一并禁用,避免与外部 [disabled] 绑定互相翻转状态 */\n get isDisabled(): boolean {\n return this.disabled || this.loading;\n }\n\n innerClickAction(option: any) {\n // loading 状态下,不允许触发点击事件\n if (this.loading) {\n return;\n }\n this.clickAction.emit(option);\n }\n}\n","import { HdButtonComponent } from './hd-button.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdButtonComponent],\n exports: [HdButtonComponent]\n})\nexport class HdButtonModule { }\n","import { Component, Input, OnInit, SimpleChange } from '@angular/core';\nimport { HdOption } from '../model/common-type';\n\n@Component({\n selector: 'hd-detail-form',\n templateUrl: './hd-detail-form.component.html',\n styleUrls: ['./hd-detail-form.component.less']\n})\nexport class HdDetailFormComponent implements OnInit {\n @Input() formCols: Array<HdOption> = new Array();\n /** 列数,支持数字或响应式配置,默认按屏幕宽度自适应 */\n @Input() nzColumn: number | { xxl?: number; xl?: number; lg?: number; md?: number; sm?: number; xs?: number } =\n { xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 };\n\n constructor() { }\n\n ngOnInit() {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n\n ngOnChanges(changes: SimpleChange) {\n if (changes['formCols'] && JSON.stringify(changes['formCols'].currentValue) !== JSON.stringify(changes['formCols'].previousValue)) {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n }\n\n triggerEvent(fn: any) {\n if (fn) {\n fn(event);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdDetailFormComponent } from './hd-detail-form.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule\n ],\n exports: [HdDetailFormComponent],\n declarations: [HdDetailFormComponent]\n})\nexport class HdDetailFormModule { }\n","import { Injectable } from '@angular/core';\n\nexport enum SpaceType {\n row = 'row',\n column = 'column'\n}\n\nexport class Style {\n background: string\n width: string\n height: string\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdSpaceService {\n\n constructor() { }\n\n}\n","import { Component, Input, OnInit, Output } from '@angular/core';\nimport { Style, SpaceType } from \"./hd-space.service\"; \n\n@Component({\n selector: 'hd-space',\n templateUrl: './hd-space.component.html',\n styleUrls: ['./hd-space.component.less']\n})\nexport class HdSpaceComponent implements OnInit {\n @Input() type: SpaceType = SpaceType.row; \n @Input() size: number; \n @Input() background: string = 'inherit'; \n\n style: Style = new Style();\n\n constructor() { }\n\n ngOnInit() {\n this.style['background'] = this.background;\n if(this.type === SpaceType.row){\n this.style['width'] = '100%';\n this.style['height'] = this.size + 'px';\n }else{\n this.style['height'] = '100%';\n this.style['width'] = this.size + 'px';\n }\n }\n\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdSpaceComponent } from './hd-space.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdSpaceComponent],\n exports: [HdSpaceComponent]\n})\nexport class HdSpaceModule { }\n","export class Page<T> {\n totalPages = 0;\n totalElements = 0;\n pageNumber = 0;\n pageSize = 10;\n hasContent = false;\n hasNext = false;\n content: Array<T> = [];\n}\n\nexport class HdOption {\n label: string;\n value: any;\n color?: string;\n hide?: boolean;\n clickText?: string;\n click?: (value: any) => void;\n}\n\nexport class SelectOption {\n label: string;\n value: string;\n selectList?: Array<any>;\n selectListName?: string;\n showLabelAndValue?: boolean = false;\n hdDropdownMatchSelectWidth?: boolean = false;\n hdServerSearch?: boolean = false;\n hdShowItemCode?: boolean = false; // 是否用[value]label显示选项列表\n tableColumns?: Array<SelectOptionTableColumn>;\n hdShowSearch?: boolean = true;\n hdAllowClear?: boolean = true;\n}\n\nexport class RadioOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class CheckboxOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class SelectOptionTableColumn {\n width: number;\n label: string; // 这里对应的是列名\n name: string; // 对应selectList里面的name值, 如果有render字段 则去render函数渲染\n icons?: Array<SelectOptionTableColumnIcon>; // 对应的图片名字\n render?: (value: any) => string;\n}\n\nexport class SelectOptionTableColumnIcon {\n iconName: string;\n fieldName: string;\n}\n\nexport class InputNumber {\n min?: number = 0;\n max?: number = 99999999;\n step?: number = 1;\n precision?: number = 4;\n nzFormatter?: Function;\n nzParser?: Function;\n}\n\nexport class CascaderOption {\n options: Array<any>;\n}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"./hd-detail-lines.service\";\n\n@Component({\n selector: \"hd-detail-lines\",\n templateUrl: \"./hd-detail-lines.component.html\",\n styleUrls: [\"./hd-detail-lines.component.less\"],\n})\nexport class HdDetailLinesComponent implements OnInit, OnChanges {\n @Input() lines: Array<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() allowDrop: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n // 不传递这个字段时默认为查询所有字段是否有匹配的\n @Input() searchFields: string[] = [];\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n @Output() selectEvent = new EventEmitter();\n @ContentChild(\"detailLineHead\", { static: false })\n detailLineHead: TemplateRef<any>;\n @ContentChild(\"detailLineBody\", { static: false })\n detailLineBody: TemplateRef<any>;\n // 合计区域\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n @Input() hdFrontPagination: boolean = false;\n totalOptionList = [];\n\n tableData: Page<any> = new Page();\n tableLoading: boolean = false;\n // 表格分页参数\n tablePageIndex: number = 1;\n @Input() tablePageSize: number = 100;\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n filterStr: string;\n /** 表格实际展示的数据(筛选结果或全量) */\n displayLines: Array<any> = [];\n /** 是否处于筛选状态 */\n isFilterData = false;\n storeFormLinesData: any = []; // 缓存的总的列表数据\n\n constructor() {}\n\n ngOnInit(): void {\n this.syncStoreFromLinesInput();\n this.applyDisplayFromStore();\n this.countSelected();\n this.calculateTotal();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes[\"lines\"]) {\n if (!this.isFilterData) {\n this.syncStoreFromLinesInput();\n this.displayLines = this.lines || [];\n } else if (\n !this.storeFormLinesData ||\n this.storeFormLinesData.length === 0\n ) {\n this.syncStoreFromLinesInput();\n }\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n private syncStoreFromLinesInput(source?: Array<any>): void {\n const data = source || this.lines;\n this.storeFormLinesData = data ? JSON.parse(JSON.stringify(data)) : [];\n }\n\n /** 未筛选时与父组件 lines 同源,避免模板内 ngModel 与父数据脱节 */\n private applyDisplayFromStore(): void {\n if (this.lines && this.lines.length > 0) {\n this.displayLines = this.lines;\n return;\n }\n this.displayLines = this.storeFormLinesData\n ? JSON.parse(JSON.stringify(this.storeFormLinesData))\n : [];\n }\n\n private restoreFromStore(): void {\n this.isFilterData = false;\n this.applyDisplayFromStore();\n this.tableLoading = false;\n this.countSelected();\n this.calculateTotal();\n }\n\n // 全局性的搜索(涵盖页面上所有的可视文字)\n searchLines() {\n // 清空搜索:即使当前展示为空也要能从缓存恢复(对齐 hd-form-lines)\n if (!this.filterStr || !this.filterStr.trim()) {\n if (!this.storeFormLinesData || this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n this.restoreFromStore();\n return;\n }\n if (!this.storeFormLinesData || this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n const filterValue = this.filterStr.trim().toLowerCase();\n this.isFilterData = true;\n\n const filteredData = this.storeFormLinesData.filter((data: any) => {\n if (!this.searchFields || this.searchFields.length === 0) {\n for (const item of Object.keys(data)) {\n if (\n data[item] &&\n data[item].toString().toLowerCase().includes(filterValue)\n ) {\n return true;\n }\n }\n return false;\n }\n for (const item of this.searchFields) {\n if (\n data[item] &&\n data[item].toString().toLowerCase().includes(filterValue)\n ) {\n return true;\n }\n }\n return false;\n });\n this.displayLines = JSON.parse(JSON.stringify(filteredData));\n this.tableLoading = false;\n this.countSelected();\n this.calculateTotal();\n }\n\n private countSelected(): void {\n if (\n this.showSelected &&\n this.selectedField &&\n this.displayLines &&\n this.displayLines.length\n ) {\n this.displayLines.forEach((item) => {\n if (item[this.selectedField] === true) {\n this.mapOfCheckedId[item[this.selectField]] = true;\n this.mapOfCheckList[item[this.selectField]] = item;\n }\n });\n if (\n this.displayLines.length === Object.keys(this.mapOfCheckList).length\n ) {\n this.isAllDisplayDataChecked = true;\n this.isIndeterminate = true;\n }\n }\n }\n\n get LodashRound() {\n return round;\n }\n\n drop(event: CdkDragDrop<string[]>): void {\n moveItemInArray(this.displayLines, event.previousIndex, event.currentIndex);\n this.displayLines = JSON.parse(JSON.stringify(this.displayLines));\n if (!this.isFilterData) {\n this.storeFormLinesData = JSON.parse(JSON.stringify(this.displayLines));\n }\n }\n\n calculateTotal() {\n // 这里处理合计数据\n if (this.showTotal && this.displayLines && this.displayLines.length) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"right\",\n showDecimal: item.showDecimal || false,\n isHide: item.isHide || false,\n };\n }\n });\n }\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n this.selectEvent.emit(Object.values(this.mapOfCheckList));\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n }\n}\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { HdButtonGroupModule } from \"../hd-button-group/hd-button-group.module\";\nimport { NgZorroAntdModule } from \"ng-zorro-antd\";\nimport { NzTableModule } from \"ng-zorro-antd/table\";\nimport { HdButtonModule } from \"../hd-button/hd-button.module\";\nimport { HdSpaceModule } from \"../hd-space/hd-space.module\";\nimport { HdDetailLinesComponent } from \"./hd-detail-lines.component\";\n\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n DragDropModule,\n FormsModule,\n NgZorroAntdModule,\n HdSpaceModule,\n HdButtonModule,\n HdButtonGroupModule,\n ],\n declarations: [HdDetailLinesComponent],\n exports: [HdDetailLinesComponent],\n schemas: [NO_ERRORS_SCHEMA],\n})\nexport class HdDetailLinesModule {}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\n\n@Component({\n selector: \"hd-detail-lines-page\",\n templateUrl: \"./hd-detail-lines-page.component.html\",\n styleUrls: [\"./hd-detail-lines-page.component.less\"],\n})\nexport class HdDetailLinesPageComponent implements OnInit, OnChanges {\n @Input() lines: Array<any> = [];\n /** 与 hd-table 一致,可传 Page 对象;未传 lines 时使用 tableData.content */\n @Input() tableData: Page<any> = new Page();\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() allowDrop: boolean = false;\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n @Input() isCrossPageSelect: boolean;\n @Output() selectEvent = new EventEmitter();\n @ContentChild(\"detailLineHead\", { static: false })\n detailLineHead: TemplateRef<any>;\n @ContentChild(\"detailLineBody\", { static: false })\n detailLineBody: TemplateRef<any>;\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n @Input() tableLoading: boolean = false;\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 100;\n @Output() tablePageIndexChange = new EventEmitter<number>();\n @Output() tablePageSizeChange = new EventEmitter<number>();\n @Output() pageChange = new EventEmitter<void>();\n\n totalOptionList = [];\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n isCrossPageSelectLocal: boolean = false;\n\n constructor() {}\n\n ngOnInit(): void {\n if (this.isCrossPageSelect === true) {\n this.isCrossPageSelectLocal = this.isCrossPageSelect;\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n changes &&\n changes[\"tableData\"] &&\n changes[\"tableData\"][\"currentValue\"] &&\n changes[\"tableData\"][\"previousValue\"]\n ) {\n if (\n changes[\"tableData\"][\"currentValue\"][\"pageSize\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageSize\"] ||\n changes[\"tableData\"][\"currentValue\"][\"pageNumber\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageNumber\"]\n ) {\n this.countSelected();\n this.calculateTotal();\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n get displayLines(): Array<any> {\n if (this.lines && this.lines.length) {\n return this.lines;\n }\n return (this.tableData && this.tableData.content) || [];\n }\n\n get totalCount(): number {\n if (this.tableData && this.tableData.totalElements != null) {\n return this.tableData.totalElements;\n }\n return this.displayLines.length;\n }\n\n getRowIndex(localIndex: number): number {\n return (this.tablePageIndex - 1) * this.tablePageSize + localIndex;\n }\n\n onPageIndexChange(pageIndex: number): void {\n this.tablePageIndex = pageIndex;\n this.tablePageIndexChange.emit(this.tablePageIndex);\n this.pageChange.emit();\n }\n\n onPageSizeChange(pageSize: number): void {\n this.tablePageSize = pageSize;\n this.tablePageIndex = 1;\n this.tablePageSizeChange.emit(this.tablePageSize);\n this.tablePageIndexChange.emit(this.tablePageIndex);\n this.pageChange.emit();\n }\n\n private countSelected(): void {\n if (\n this.showSelected &&\n this.selectedField &&\n this.displayLines &&\n this.displayLines.length\n ) {\n this.displayLines.forEach((item) => {\n if (item[this.selectedField] === true) {\n this.mapOfCheckedId[item[this.selectField]] = true;\n this.mapOfCheckList[item[this.selectField]] = item;\n }\n });\n if (\n this.displayLines.length === Object.keys(this.mapOfCheckList).length\n ) {\n this.isAllDisplayDataChecked = true;\n this.isIndeterminate = true;\n }\n }\n }\n\n get LodashRound() {\n return round;\n }\n\n drop(event: CdkDragDrop<string[]>): void {\n const lines = [...this.displayLines];\n moveItemInArray(lines, event.previousIndex, event.currentIndex);\n this.lines = lines;\n }\n\n calculateTotal() {\n if (this.showTotal && this.displayLines && this.displayLines.length) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"right\",\n showDecimal: item.showDecimal || false,\n isHide: item.isHide || false,\n };\n }\n });\n }\n }\n\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n if (this.selectEvent) {\n this.selectEvent.emit(Object.values(this.mapOfCheckList));\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n }\n}\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\nimport { NzTableModule } from \"ng-zorro-antd/table\";\nimport { HdDetailLinesPageComponent } from \"./hd-detail-lines-page.component\";\n\n@NgModule({\n imports: [CommonModule, NzTableModule, DragDropModule],\n declarations: [HdDetailLinesPageComponent],\n exports: [HdDetailLinesPageComponent],\n schemas: [NO_ERRORS_SCHEMA],\n})\nexport class HdDetailLinesPageModule {}\n","import { Injectable } from '@angular/core';\n\n/**\n * 状态码 → 颜色(来源:sunan-server 业务 *State/*Status 枚举全量去重)\n * 已排除:银行支付 / AGV / HTTP StatusCode\n * 颜色语义:\n * 黄-过程中/中间态;灰-初始未开始/线下停用类;红-作废拒绝失效;\n * 蓝-审核流转中;绿-完成启用生效;橙-部分完成/预警\n */\nexport const statusToColor = {\n // 黄色:过程中 / 中间态 / 待处理动作\n '#FAB13B': [\n 'partshipped', 'partShipped', 'committed', 'COMMITTED', 'partValid', 'confirm', 'picking',\n 'prepareSubmitted', 'prepareConfirmed', 'receiving', 'shipping', 'delivering', 'approving',\n 'tendering', 'forPick', 'forPickup', 'forMove', 'forLoss', 'forMachiningTask', 'forReturn',\n 'forTransfer', 'forWholesale', 'outTransit', 'unconfirmedPrice', 'reSubmitted', 'submit',\n 'firstReview', 'Locked', 'beingUsed', 'transferLock', 'agvTransferLock', 'suspend',\n 'collected', 'merged', 'planCared', 'toBeConfirm', 'toBePaid', 'UNRECEIVED',\n '开票中', '红冲开票中', '待生效',\n ],\n // 灰色:初始 / 未开始 / 未提交 / 线下停用 / 未读未打印\n '#9FA4A2': [\n 'initial', 'INITIAL', 'INIT', 'uncommitted', 'OFF_LINE', 'UN_PRINTED', 'unpublish', 'pastpublish',\n 'TO_COMMIT', 'unpublished', 'UNPUBLISHED', '未审核', 'returned', 'saved', 'SAVED', 'unaudited',\n 'UN_AUDIT', 'unlock', 'free', 'unKnow', 'noSign', 'NOT_INVOICED', 'notConfirm', 'unshipped',\n 'unPlanCar', 'UNREAD', 'UNSEND', '未提交', '未确认', '已保存',\n ],\n // 红色:删除 / 作废 / 拒绝 / 失效 / 禁用\n '#F5222D': [\n 'delete', 'deleted', 'DELETED', 'abort', 'ABORTED', 'aborted', 'rejected', 'REJECTED',\n '停用', '禁用', '已停用', 'unpicked', 'AUDIT_REJECT', 'invalid', 'INVALID', 'disabled', 'DISABLED',\n '', 'canceled', 'cancelled', 'BLANK_OUT', 'complaintRejected', 'prepareRejected',\n 'returnedBeforeAudit', 'RETURNED_BEFORE_AUDIT', 'returnedBeforeConfirm', 'handleReturned',\n 'TAKE_DOWN', 'expired', 'paidFailed', 'submitFailed', 'exception',\n '已作废', '已删除', '已失效',\n ],\n // 蓝色:已审核 / 提交后流转 / 处理中\n '#3B77E3': [\n 'audited', 'adjusted', 'invoiced', 'INVOICED', 'audit', 'submitted', 'SUBMITTED', 'TO_AUDIT',\n '已审核', '处理中', 'processing', 'firstReviewed', 'awaiting_effective', 'AWAITING_EFFECTIVE',\n 'checking', 'reviewed', 'running', 'SENT', 'uploaded', 'snapped', 'handling',\n '已提交', '已初审', '已复审', '已分配', '已生成费用单',\n ],\n // 绿色:完成 / 成功 / 启用 / 生效\n '#20B95D': [\n 'shipped', 'SHIPPED', 'received', 'RECEIVED', 'checked', 'using', 'USING', 'reverse', 'valid',\n 'approved', 'ON_LINE', 'finished', 'FINISHED', 'finish', 'opened', 'PRINTED', '启用', 'picked',\n 'published', 'PUBLISHED', 'AUDITED', '已收票', '付款完成', '收款完成', '已收款', 'accepted',\n 'offered', 'confirmed', 'effective', 'EFFECTIVE', '已发布', 'paid', 'successful', 'READ',\n 'signed', 'ON_SALE', 'enabled', 'entrucked', 'normal', 'statemented',\n '已付款', '已核销', '已开票', '已完成', '已确认', '已红冲', '已结束', '已发货', '已收货',\n ],\n // 橙色:部分完成 / 打印后修改 / 临期预警\n '#F05B24': [\n 'partialReceived', 'partDelete', 'tender', 'MODIFIED_AFTER_PRINTED', '部分付款', '部分收款',\n 'partPublished', 'partOffered', 'partInvoiced', 'partStatemented', '部分核销', 'willExpired',\n 'supplierConfirmed',\n ],\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdStatusService {\n constructor() {\n }\n}\n","import { Component, Input, OnInit, SimpleChange } from \"@angular/core\";\nimport { statusToColor } from \"../hd-status/hd-status.service\";\n\n@Component({\n selector: \"hd-detail-tip\",\n templateUrl: \"./hd-detail-tip.component.html\",\n styleUrls: [\"./hd-detail-tip.component.less\"],\n})\nexport class HdDetailTipComponent implements OnInit {\n constructor() {}\n @Input() state: string;\n @Input() stateText: string;\n @Input() billNumber: string;\n @Input() tip: string = \"详情\";\n statusColor: string;\n\n ngOnInit() {\n this.setStatusColor();\n }\n\n ngOnChanges() {\n this.setStatusColor();\n }\n\n setStatusColor() {\n let findKey = '';\n for (let key in statusToColor) {\n if (\n this.state &&\n (statusToColor[key].indexOf(this.state) !== -1 ||\n statusToColor[key].indexOf(this.state.toUpperCase()) !== -1 ||\n statusToColor[key].indexOf(this.state.toLowerCase()) !== -1)\n ) {\n findKey = key;\n }\n }\n if (findKey) {\n this.statusColor = findKey;\n } else {\n this.statusColor = '#9FA4A2';\n }\n }\n}\n","import { HdDetailTipComponent } from './hd-detail-tip.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdDetailTipComponent],\n exports: [HdDetailTipComponent]\n})\nexport class HdDetailTipModule { }\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { Filter } from './hd-filter.service';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n@Component({\n selector: 'hd-filter',\n templateUrl: './hd-filter.component.html',\n styleUrls: ['./hd-filter.component.less']\n})\nexport class HdFilterComponent implements OnInit {\n\n @Input() filterList: Array<Filter>;\n @Output() searchEvent = new EventEmitter();\n @Output() resetEvent = new EventEmitter();\n\n validateFilterForm: FormGroup;\n isShowMore: boolean = true;\n // 对filterList取模运算\n filterListModular: number = 0;\n private searchSubject = new Subject<{ fn: any, event: any, selectOption?: any; }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n\n private searchSubscription: Subscription | undefined;\n constructor(private fb: FormBuilder) {\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\n }\n\n ngOnInit() {\n this.init();\n }\n\n ngOnChanges() {\n this.init();\n }\n\n private init(): void {\n this.isShowMore = true;\n // 异常捕获\n if (!this.checkList(this.filterList)) {\n throw 'filter组件数据格式不规范';\n }\n this.filterListModular = this.filterList.length % 4;\n // 首先根据定义的组件数组 去初始化表单\n let formGroupList = {};\n this.filterList.forEach((item, index) => {\n formGroupList[item.name] = this.fb.control(item.value, []);\n // 初始化控件显影\n item.show = index < 7;\n });\n this.validateFilterForm = this.fb.group(formGroupList);\n this.filterList.forEach((item) => {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n this.validateFilterForm.get(item.name).valueChanges\n .pipe(\n debounceTime(item.onChangeEventDebounceTime)\n )\n .subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n } else {\n this.validateFilterForm.get(item.name).valueChanges.subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n }\n }\n });\n }\n\n onSearchEvent(fn: any, event: any, onSearchEventDebounceTime: any, selectOption?: any) {\n if (onSearchEventDebounceTime) {\n // 更新防抖时间\n this.debounceTimeout = onSearchEventDebounceTime;\n\n // 取消之前的订阅\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n\n // 创建新的订阅\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\n\n // 发送事件\n this.searchSubject.next({ fn, event, selectOption });\n } else {\n this.triggerEvent(fn, event, selectOption);\n }\n }\n\n triggerEvent(fn: any, event: any, selectOption?: any) {\n if (fn && selectOption) {\n fn(event, selectOption);\n } else if (fn) {\n fn(event);\n } else {\n return;\n }\n }\n\n computeOffset() {\n // 特殊处理下等于4个选项的情况\n if (this.filterList.length === 4) {\n return 18;\n }\n return this.isShowMore ? ((this.filterListModular === 0 || this.filterList.length > 7) ? 0 : (3 - this.filterListModular) * 6) : (this.filterListModular === 0 ? 18 : (3 - this.filterListModular) * 6);\n }\n\n private checkList(list: Array<Filter>): boolean {\n if (!list || (list && list.length === 0)) {\n return true;\n }\n let nameList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FilterListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {\n // throw 'filter组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw 'filter组件数据格式不规范,存在重复name值!';\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n this.searchEvent.emit(this.validateFilterForm.getRawValue());\n }\n\n public resetForm(): void {\n this.resetFilterFormWithValue();\n // this.validateFilterForm.reset();\n if (this.resetEvent.observers.length > 0) {\n // 如果有父组件绑定了 resetEvent 的处理器\n this.resetEvent.emit(this.validateFilterForm.getRawValue());\n } else {\n // 如果没有绑定处理器,则触发 searchEvent\n this.searchEvent.emit(this.validateFilterForm.getRawValue());\n }\n }\n\n /**\n * 带初始值重置表单\n */\n public resetFilterFormWithValue() {\n const resetValue: { [key: string]: any } = {};\n this.filterList.forEach((item) => {\n resetValue[item.name] = item.value;\n });\n // 重置表单值(会触发valueChanges事件)\n this.validateFilterForm.patchValue(resetValue);\n }\n\n public getFilterData() {\n return this.validateFilterForm.getRawValue();\n }\n\n public showMore(): void {\n this.isShowMore = !this.isShowMore;\n this.filterList.forEach((item, index) => {\n item.show = this.isShowMore ? index < 7 : true;\n });\n }\n\n public inputClean(filter: Filter): void {\n const patchObject = {};\n patchObject[filter.name] = null;\n\n this.validateFilterForm.patchValue(patchObject);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdFilterComponent } from './hd-filter.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule\n ],\n declarations: [HdFilterComponent],\n exports: [HdFilterComponent]\n})\nexport class HdFilterModule { }\n","import { Injectable } from \"@angular/core\";\nimport { InputNumber, SelectOption } from \"../model/common-type\";\n// 控件列表\nexport class FormLine {\n type: FormLineType; // 控件类型\n label: string; // 文本\n name: string; // 字段名称\n placeholder?: string; // 输入框的提示文件\n require?: boolean = false; // 是否必填\n hide?: boolean = false; // 是否为隐藏字段,仅用于填充表单的字段,不显示在页面上\n hideViewDomValue?: boolean = false; // type为ViewDom时,是否隐藏value值, 用于特殊场景,譬如列表中图片的显示\n align?: \"left\" | \"right\" | \"center\"; // 列对齐方式\n value?: string | boolean | number | Date | Array<string | Date> | null = null; // 值 不传默认为null\n isSelect?: boolean; // 输入框等是否允许点击之后全选内容\n selectOption?: SelectOption; // 控件为Select时,选项列表\n explainOptionRight?: ExplainOption; // 明细字段的说明(右侧)\n explainOption?: ExplainOption; // 明细字段的说明\n colorOption?: ColorOption; // 颜色字段的说明\n // 组件内部成员\n maxLength?: number; // input控件的输入长度\n preserveNumber?: number; // 需要保留小数的列的位数\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n onOpenChangeEvent?: Function; // select下拉展开/收起事件,回调参数 (open, line),可用于按当前行请求 selectList\n defaultLabel?: any; // select选择器不初始化的时候可以使用defaultLabel搭配value,设置默认值\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n hdShowToday?: boolean = true; // 对应 nzShowToday,是否显示「今天」按钮,默认 true\n disabled?: boolean; // 不可输入状态\n showTime?: boolean = false; // 日期选择器是否包含时间\n style?: object;\n canSearch?: boolean = false; // 指明hide 情况下的控件是否可以被搜索,默认false\n onChangeEventDebounceTime?: number; // change事件防抖,未配置或为0时同步触发(不防抖)\n onSearchEventEventDebounceTime?: number; // search事件防抖,未配置或为0时同步触发(不防抖)\n onOpenChangeEventDebounceTime?: number; // 下拉展开事件防抖,未配置或为0时同步触发(不防抖)\n}\n\nexport class ColorOption {\n name: string;\n color?: string;\n}\n\nexport class ExplainOption {\n show: boolean;\n name: string;\n color?: string;\n}\n\n// 控件类型\nexport enum FormLineType {\n Input = \"Input\", // 输入框\n Select = \"Select\", // 单项选择器\n Date = \"Date\", // 单个日期选择\n DateRange = \"DateRange\", // 日期范围选择\n TextArea = \"TextArea\", // 块级输入框\n InputNumber = \"InputNumber\", // 数字输入\n MultipleSelect = \"MultipleSelect\", // 多选\n ViewDom = \"ViewDom\", // 单纯的显示控件\n Switch = \"Switch\", // 开关\n Time = \"Time\", // 时间选择器\n}\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class HdFormLinesService {\n constructor() {}\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n SimpleChanges,\n TemplateRef,\n ViewChildren,\n} from \"@angular/core\";\nimport { FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\nimport { round } from \"lodash\";\nimport {\n InputBoolean,\n NzDatePickerComponent,\n NzInputNumberComponent,\n NzRangePickerComponent,\n NzSelectComponent,\n NzTimePickerComponent,\n} from \"ng-zorro-antd\";\nimport { Subject, Subscription } from \"rxjs\";\nimport { debounceTime } from \"rxjs/operators\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\nimport { SelectOptionTableColumn } from \"../model/common-type\";\nimport { FormLine, FormLineType } from \"./hd-form-lines.service\";\n\n/** 与 ant-select 选项项水平内边距一致,用于表头与选项行对齐 */\nconst SELECT_TABLE_OPTION_HORIZONTAL_PADDING = 12;\n\n@Component({\n selector: \"hd-form-lines\",\n templateUrl: \"./hd-form-lines.component.html\",\n styleUrls: [\"./hd-form-lines.component.less\"],\n})\nexport class HdFormLinesComponent implements OnInit, AfterViewInit, OnDestroy {\n @ViewChildren(\"formInputDom\") formInputDomList!: QueryList<ElementRef>;\n\n @Input() @InputBoolean() showLineNumber: boolean = true;\n @Input() @InputBoolean() allowEmpty: boolean = true;\n @Output() deleteLastLineEvent = new EventEmitter();\n @Input() @InputBoolean() showKeyboardOperateTip: boolean = false;\n @Input() @InputBoolean() tableLoading: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n /** 是否展示行勾选列,用于外部批量操作勾选行 */\n @Input() @InputBoolean() showCheckbox: boolean = false;\n @Input() formLines: Array<FormLine>;\n // 针对formLines里面所有的name,\n @Input() formLinesData: any;\n @Input() operateButtons: Array<string> = [\"add\", \"delete\"]; // 操作列按钮:add / delete / copy\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Output() changeEvent = new EventEmitter();\n /** 新增空行后抛出该行 FormGroup(手动添加、键盘跳行自动补行等) */\n @Output() addLineEvent = new EventEmitter<FormGroup>();\n /** 勾选变化时抛出当前勾选行 FormGroup 列表 */\n @Output() selectionChange = new EventEmitter<FormGroup[]>();\n @Input() @InputBoolean() showDeleteConfirm: boolean = false;\n paginationPageIndex: number = 1;\n paginationPageSize: number = 10;\n validateHdFormLines: FormGroup;\n newLine: any;\n inputValue: string;\n\n // 合计区域\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n totalOptionList = [];\n\n showForm: boolean = false;\n filterStr: string;\n storeFormLinesData: any = []; // 缓存的总的表单数据\n filterStoreFormLinesData: any = []; // 筛选出来的数据列表\n filterIndexStore: Array<number> = []; // 筛选出来的数据在原始列表中的下标\n isFilterData: boolean = false; // 是否是已经筛选过的数据\n formValid: boolean = false; // 表单当前的状态\n /** 勾选的行 id(跨页、搜索重建后仍保留) */\n private selectedRowIds = new Set<string>();\n private searchSubject = new Subject<{ fn: any; event: any; line: any }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n\n private searchSubscription: Subscription | undefined;\n private formInputDomListSub: Subscription | undefined;\n\n private openChangeSubject = new Subject<{ fn: any; event: any; line: any }>();\n private openChangeDebounceTimeout: number = 0;\n private openChangeSubscription: Subscription | undefined;\n\n // 当前页的dom二维数组\n collectDomList: Array<\n Array<\n | ElementRef\n | NzSelectComponent\n | NzInputNumberComponent\n | NzDatePickerComponent\n | NzRangePickerComponent\n | NzTimePickerComponent\n >\n > = [];\n // 当前聚焦的dom元素坐标\n activeDomX: number = null;\n activeDomY: number = null;\n activeDom:\n | ElementRef\n | NzSelectComponent\n | NzInputNumberComponent\n | NzDatePickerComponent\n | NzRangePickerComponent\n | NzTimePickerComponent = null;\n activeSelectedComponentOpen: boolean = false;\n @ContentChild(\"ViewDomRightTemplate\", { static: false })\n ViewDomRightTemplate: TemplateRef<any>;\n /** 工具栏左侧自定义按钮,用法同 hd-table 的 tableLeftButton */\n @ContentChild(\"formLinesLeftButton\", { static: false })\n formLinesLeftButton: TemplateRef<any>;\n /** 工具栏右侧自定义按钮,用法同 hd-table 的 tableRightButton */\n @ContentChild(\"formLinesRightButton\", { static: false })\n formLinesRightButton: TemplateRef<any>;\n\n constructor(\n private fb: FormBuilder,\n private cdr: ChangeDetectorRef,\n ) {\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event, line }) => this.triggerEvent(fn, event, line));\n this.openChangeSubscription = this.openChangeSubject\n .pipe(debounceTime(this.openChangeDebounceTimeout))\n .subscribe(({ fn, event, line }) => {\n if (event) {\n this.triggerEvent(fn, event, line);\n }\n });\n }\n\n ngOnInit() {\n // 缓存一下总的表单数据\n this.storeFormLinesData = this.formLinesData;\n this.init();\n }\n\n ngAfterViewInit() {\n this.collectDomData();\n this.formInputDomListSub = this.formInputDomList.changes.subscribe(() => {\n this.collectDomData();\n });\n }\n\n ngOnDestroy() {\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n if (this.openChangeSubscription) {\n this.openChangeSubscription.unsubscribe();\n }\n if (this.formInputDomListSub) {\n this.formInputDomListSub.unsubscribe();\n }\n }\n\n get formLinesLength() {\n return this.linesFormArray.controls.length;\n }\n\n get operateColWidth() {\n const count = (this.operateButtons || []).filter((btn) =>\n [\"add\", \"copy\", \"delete\"].includes(btn),\n ).length;\n return Math.max(count * 40, 80);\n }\n\n /** allowEmpty 且操作列仅有删除时:允许 0 行,初始化与删至空都不自动补空行 */\n get isTrulyEmptyAllowed(): boolean {\n const buttons = (this.operateButtons || []).filter((btn) =>\n [\"add\", \"copy\", \"delete\"].includes(btn),\n );\n return (\n this.allowEmpty &&\n buttons.length === 1 &&\n buttons[0] === \"delete\"\n );\n }\n\n /** 勾选列固定时,序号列的 left 偏移 */\n get lineNumberLeft() {\n return this.showCheckbox ? \"40px\" : \"0px\";\n }\n\n private generateRowId(): string {\n return `hd_row_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private getRowId(line: FormGroup): string {\n if (!line || !line.get(\"_hdRowId\")) {\n return null;\n }\n return line.get(\"_hdRowId\").value;\n }\n\n /** 当前页的行(用于表头全选,仅作用于当前页,跨页勾选仍保留) */\n private getCurrentPageLines(): FormGroup[] {\n const start = (this.paginationPageIndex - 1) * this.paginationPageSize;\n const end = start + this.paginationPageSize;\n return (this.linesFormArray.controls as FormGroup[]).slice(start, end);\n }\n\n isLineChecked(line: FormGroup): boolean {\n const id = this.getRowId(line);\n return !!id && this.selectedRowIds.has(id);\n }\n\n isAllChecked(): boolean {\n const pageLines = this.getCurrentPageLines();\n return (\n pageLines.length > 0 &&\n pageLines.every((line) => this.isLineChecked(line))\n );\n }\n\n isIndeterminate(): boolean {\n const pageLines = this.getCurrentPageLines();\n const checkedCount = pageLines.filter((line) =>\n this.isLineChecked(line),\n ).length;\n return checkedCount > 0 && checkedCount < pageLines.length;\n }\n\n onAllChecked(checked: boolean): void {\n this.getCurrentPageLines().forEach((line) => {\n const id = this.getRowId(line);\n if (!id) {\n return;\n }\n if (checked) {\n this.selectedRowIds.add(id);\n } else {\n this.selectedRowIds.delete(id);\n }\n });\n this.emitSelectionChange();\n }\n\n onLineCheckedChange(line: FormGroup, checked: boolean): void {\n const id = this.getRowId(line);\n if (!id) {\n return;\n }\n if (checked) {\n this.selectedRowIds.add(id);\n } else {\n this.selectedRowIds.delete(id);\n }\n this.emitSelectionChange();\n }\n\n private emitSelectionChange(): void {\n this.selectionChange.emit(this.getSelectedLines());\n this.cdr.markForCheck();\n }\n\n private removeLineFromSelection(line: FormGroup): void {\n const id = this.getRowId(line);\n if (id && this.selectedRowIds.has(id)) {\n this.selectedRowIds.delete(id);\n this.emitSelectionChange();\n }\n }\n\n private applyValuesToLine(\n line: FormGroup,\n values: { [field: string]: any },\n emitEvent: boolean,\n ): void {\n Object.keys(values).forEach((key) => {\n let control = line.get(key);\n if (!control) {\n line.addControl(key, this.fb.control(values[key]));\n control = line.get(key);\n }\n // 静默赋值,避免 valueChanges / DOM maxlength 回写把校验态打乱\n control.setValue(values[key], { emitEvent: false });\n control.markAsPristine({ onlySelf: true });\n control.markAsUntouched({ onlySelf: true });\n control.updateValueAndValidity({ emitEvent: false });\n if (emitEvent) {\n const formItem = this.formLines.find((item) => item.name === key);\n if (formItem && formItem.onChangeEvent) {\n this.triggerEvent(formItem.onChangeEvent, values[key], line);\n }\n }\n });\n this.cdr.detectChanges();\n }\n\n /**\n * 仅在用户交互后、且当前值确实为空的 required 错误时展示红框,\n * 避免批量赋值时 ng-zorro 残留「不能为空」提示\n */\n getControlValidateStatus(line: FormGroup, formItem: FormLine): string {\n const control = line.get(formItem.name);\n if (!control || control.disabled) {\n return \"\";\n }\n const empty =\n control.value === null ||\n control.value === undefined ||\n control.value === \"\";\n if (\n (control.dirty || control.touched) &&\n empty &&\n control.hasError(\"required\")\n ) {\n return \"error\";\n }\n return \"\";\n }\n\n /** 用户输入时按 maxLength 截断(不使用原生 maxlength,避免干扰程序化赋值) */\n limitInputLength(event: Event, line: FormGroup, formItem: FormLine): void {\n if (!formItem || !formItem.maxLength) {\n return;\n }\n const input = event.target as HTMLInputElement;\n if (input && input.value && input.value.length > formItem.maxLength) {\n const next = input.value.slice(0, formItem.maxLength);\n input.value = next;\n const control = line.get(formItem.name);\n if (control) {\n control.setValue(next);\n }\n }\n }\n\n /** 获取当前勾选且已挂载的行 FormGroup(当前筛选结果内) */\n public getSelectedLines(): FormGroup[] {\n return (this.linesFormArray.controls as FormGroup[]).filter((line) =>\n this.isLineChecked(line),\n );\n }\n\n /**\n * 获取全部勾选行数据(含跨页、搜索后未展示但仍勾选的行)\n */\n public getSelectedLinesData(): any[] {\n const result = [];\n const mountedById = new Map<string, any>();\n (this.linesFormArray.controls as FormGroup[]).forEach((line) => {\n const id = this.getRowId(line);\n if (id && this.selectedRowIds.has(id)) {\n mountedById.set(id, line.getRawValue());\n }\n });\n\n (this.storeFormLinesData || []).forEach((data) => {\n const id = data && data._hdRowId;\n if (id && this.selectedRowIds.has(id)) {\n result.push(mountedById.has(id) ? mountedById.get(id) : { ...data });\n }\n });\n\n // 兜底:刚新增、尚未进 store 的勾选行\n this.selectedRowIds.forEach((id) => {\n if (\n !result.some((item) => item && item._hdRowId === id) &&\n mountedById.has(id)\n ) {\n result.push(mountedById.get(id));\n }\n });\n return result;\n }\n\n /**\n * 批量填充勾选行字段(支持跨页、搜索后未展示但仍勾选的行)\n * @param values 要写入的字段,如 { remark: '批量备注', price: 10 }\n * @param emitEvent 是否触发 valueChanges / onChangeEvent,默认 true\n * @returns 实际填充的行数\n */\n public batchFillSelected(\n values: { [field: string]: any },\n emitEvent: boolean = true,\n ): number {\n if (!values || this.selectedRowIds.size === 0) {\n return 0;\n }\n const mountedById = new Map<string, FormGroup>();\n (this.linesFormArray.controls as FormGroup[]).forEach((line) => {\n const id = this.getRowId(line);\n if (id) {\n mountedById.set(id, line);\n }\n });\n\n let count = 0;\n this.selectedRowIds.forEach((id) => {\n const line = mountedById.get(id);\n if (line) {\n this.applyValuesToLine(line, values, emitEvent);\n count++;\n return;\n }\n // 当前筛选/页面未挂载:直接改总数据,退出搜索后可见\n const storeItem = (this.storeFormLinesData || []).find(\n (data) => data && data._hdRowId === id,\n );\n if (storeItem) {\n Object.keys(values).forEach((key) => {\n storeItem[key] = values[key];\n });\n count++;\n }\n });\n return count;\n }\n\n /** 清空勾选 */\n public clearSelection(): void {\n if (this.selectedRowIds.size === 0) {\n return;\n }\n this.selectedRowIds.clear();\n this.emitSelectionChange();\n }\n\n /** 当前勾选数量(含跨页、搜索保留) */\n public getSelectedCount(): number {\n return this.selectedRowIds.size;\n }\n\n /** 是否展示顶部工具栏 */\n get showToolbar(): boolean {\n return (\n !!this.showSearch ||\n !!this.showCheckbox ||\n !!this.formLinesLeftButton ||\n !!this.formLinesRightButton\n );\n }\n\n setActiveSelectedComponentOpen(value: boolean) {\n this.activeSelectedComponentOpen = value;\n if (value === true) {\n setTimeout(() => {\n const domList = document.querySelectorAll(\n \".ant-select-dropdown.hd-select-table\",\n );\n if (domList.length > 0) {\n const dom = domList[0];\n dom\n .querySelectorAll(\".hd-option-header\")\n .forEach((header) => header.remove());\n const oldIndex = this.getOldDomIndex(this.activeDomY, this.formLines);\n dom.insertBefore(\n this.createDOMStructure(\n this.formLines[oldIndex],\n this.linesFormArray.controls.slice(\n (this.paginationPageIndex - 1) * this.paginationPageSize,\n (this.paginationPageIndex - 1) * this.paginationPageSize +\n this.paginationPageSize,\n )[this.activeDomX],\n ),\n dom.firstChild,\n );\n }\n }, 0);\n }\n }\n\n getSelectTableColumnStyle(column: SelectOptionTableColumn): {\n [key: string]: string;\n } {\n if (!column || !column.width) {\n return { width: \"unset\" };\n }\n return { width: `${column.width}px` };\n }\n\n createDOMStructure(formItem, line) {\n // 创建外部 div\n const hdOptionHeader = document.createElement(\"div\");\n hdOptionHeader.className = \"hd-option-header\";\n hdOptionHeader.style.paddingLeft = `${SELECT_TABLE_OPTION_HORIZONTAL_PADDING}px`;\n hdOptionHeader.style.paddingRight = `${SELECT_TABLE_OPTION_HORIZONTAL_PADDING}px`;\n\n // 检查条件,确定是否要创建子元素\n // const selectListLength = (formItem && formItem.selectOption && formItem.selectOption.selectList && formItem.selectOption.selectList.length) || 0;\n // if\n // const lineValueLength = (line.get(formItem.selectOption.selectListName) && line.get(formItem.selectOption.selectListName).value && line.get(formItem.selectOption.selectListName).value.length) || 0;\n\n // if (selectListLength > 0 || lineValueLength > 0) {\n // 遍历 tableColumns 创建内部列 div\n formItem.selectOption.tableColumns.forEach((selectOptionTableColumn) => {\n const columnDiv = document.createElement(\"div\");\n columnDiv.className = \"hd-option-header-column\";\n\n const widthStyle = this.getSelectTableColumnStyle(\n selectOptionTableColumn,\n );\n columnDiv.style.width = widthStyle.width;\n\n // 添加列标签内容\n if (selectOptionTableColumn.label) {\n const labelText = document.createTextNode(\n selectOptionTableColumn.label,\n );\n columnDiv.appendChild(labelText);\n }\n\n // 添加列 div 到外部 div\n hdOptionHeader.appendChild(columnDiv);\n });\n // }\n\n return hdOptionHeader;\n }\n\n collectDomData() {\n this.collectDomList = [];\n const pageDomList = this.formInputDomList.toArray();\n // Step 1: 获取当前页的数据量\n const startIndex = (this.paginationPageIndex - 1) * this.paginationPageSize;\n const endIndex = this.paginationPageIndex * this.paginationPageSize;\n const adjustedEndIndex =\n endIndex > this.formLinesLength ? this.formLinesLength : endIndex;\n const pageLinesLength = adjustedEndIndex - startIndex;\n\n const interval = pageDomList.length / pageLinesLength;\n // Step 2: 拆分formInputDomList\n for (let i = 0; i < pageLinesLength; i++) {\n this.collectDomList.push(pageDomList.splice(0, interval));\n }\n this.disableInputNumberKeyboardStep();\n }\n\n /**\n * ng-zorro 8 在 input 的 onKeyDown 里用上下键调 up()/down() 改 step。\n * 只覆盖 onKeyDown(不动 up/down),键盘方向键交给表单跳转,+/- 按钮仍可用。\n */\n private disableInputNumberKeyboardStep(): void {\n for (let i = 0; i < this.collectDomList.length; i++) {\n for (let j = 0; j < this.collectDomList[i].length; j++) {\n const dom = this.collectDomList[i][j];\n if (dom instanceof NzInputNumberComponent) {\n dom.onKeyDown = (e: KeyboardEvent) => {\n if (e.keyCode === 38 || e.keyCode === 40) {\n return;\n }\n if (e.keyCode === 13) {\n dom.setValidateValue();\n }\n };\n }\n }\n }\n }\n\n // 聚焦下一个dom\n jumpToNextInput(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n // 如果是最后一个可输入元素,新增行\n if (\n !(this.activeDom instanceof NzSelectComponent) &&\n x === this.collectDomList.length - 1 &&\n y === this.collectDomList[0].length - 1\n ) {\n this.addNewLineAndFocus();\n } else {\n if (y === this.collectDomList[0].length - 1) {\n console.log(\"执行过程1\");\n // 如果是最后一列,则跳转到下一行第一个输入框\n this.focusDom(x + 1, 0, \"right\");\n } else {\n console.log(\"执行过程2\");\n // 如果不是最后一列,则跳转到当前行下一个输入框\n this.focusDom(x, y + 1, \"right\");\n }\n }\n }\n\n /**\n * 增加新行并且聚焦到第一个元素,\n * 这里要注意,如果存在翻页情况,需要处理\n */\n addNewLineAndFocus() {\n // 当前行为当前页最后一行的时候,判断下一页是否有数据\n // 1、如果有:翻页+聚焦第一行第一个元素\n // 2、如果没有:新增行+翻页+聚焦第一行第一个元素\n if (this.activeDomX === this.paginationPageSize - 1) {\n // 判断下一页是否有数据\n if (\n this.paginationPageIndex <\n Math.ceil(this.formLinesLength / this.paginationPageSize)\n ) {\n // 翻页+聚焦第一行第一个元素\n this.paginationPageIndex++;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程3\");\n this.focusDom(0, 0, \"right\");\n }, 0);\n } else {\n // 新增行+翻页+聚焦第一行第一个元素\n this.addFormLine();\n this.paginationPageIndex++;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程4\");\n this.focusDom(0, 0);\n }, 0);\n }\n } else {\n this.addFormLine();\n }\n }\n\n // 聚焦到上一个dom\n jumpToPrevInput(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n if (x === 0 && y === 0) {\n // 如果是第一个可输入元素, 判断是否有上一页, 如果有,则翻页+聚焦到上一页最后一个元素\n if (this.paginationPageIndex > 1) {\n // 翻页+聚焦到上一页最后一个元素\n this.paginationPageIndex--;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程5\");\n this.focusDom(\n this.collectDomList.length - 1,\n this.collectDomList[0].length - 1,\n );\n }, 0);\n }\n return;\n } else {\n if (y === 0) {\n console.log(\"执行过程6\");\n // 如果是第一列,则跳转到上一行最后一个输入框\n this.focusDom(x - 1, this.collectDomList[0].length - 1, \"left\");\n } else {\n console.log(\"执行过程7\");\n // 如果不是第一列,则跳转到当前行上一个输入框\n this.focusDom(x, y - 1, \"left\");\n }\n }\n }\n\n /**\n * 聚焦到某个dom\n * @param x 坐标x\n * @param y 坐标y\n * @param jumpDirection 跳转方向\n */\n focusDom(x: number, y: number, jumpDirection: string = \"right\") {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n // 先清除一下当前的焦点\n this.cleanFocusDom(this.activeDomX, this.activeDomY);\n if (this.collectDomList[x] && this.collectDomList[x][y]) {\n const dom = this.collectDomList[x][y];\n // 需要判断下一个focus的dom是否是禁用状态,如果是禁用状态需要跳过\n if (dom instanceof NzSelectComponent) {\n if (dom.nzDisabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n dom.nzSelectTopControlComponent.inputElement.nativeElement.scrollIntoView(\n { behavior: \"smooth\", block: \"center\", inline: \"center\" },\n );\n // 这里多选框需要额外处理下,因为向下的时候会触发内部Input的聚焦,把下一个dom的focus放到宏任务中,延迟处理。\n if (dom.nzSelectService.mode === \"multiple\") {\n setTimeout(() => {\n dom.focus();\n }, 0);\n } else {\n dom.focus();\n }\n } else if (dom instanceof NzInputNumberComponent) {\n if (dom.nzDisabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n const inputDom: any = document.getElementById(dom.nzId);\n inputDom.focus();\n inputDom.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\",\n });\n setTimeout(() => {\n inputDom.select();\n }, 0);\n } else if (dom instanceof ElementRef) {\n if (dom.nativeElement.disabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n dom.nativeElement.focus();\n dom.nativeElement.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\",\n });\n setTimeout(() => {\n dom.nativeElement.select();\n }, 0);\n } else if (\n dom instanceof NzDatePickerComponent ||\n dom instanceof NzRangePickerComponent ||\n dom instanceof NzTimePickerComponent\n ) {\n // TODO:在ngzorro8.5.x版本,时间相关的选择器没有暴露出open方法,暂时先不处理。(10.x及以上版本提供了open方法)\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n this.setActiveDom(x, y);\n } else {\n // 没有dom的场景下,需要判断是左还是右,\n }\n }\n\n cleanFocusDom(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n if (this.collectDomList[x] && this.collectDomList[x][y]) {\n const dom = this.collectDomList[x][y];\n if (dom instanceof NzSelectComponent) {\n dom.blur();\n dom.nzOpen = false;\n } else if (dom instanceof NzInputNumberComponent) {\n dom.blur();\n } else if (dom instanceof ElementRef) {\n dom.nativeElement.blur();\n } else {\n }\n }\n }\n\n setActiveDom(x: number, y: number) {\n this.activeDomX = x;\n this.activeDomY = y;\n this.activeDom = this.collectDomList[this.activeDomX][this.activeDomY];\n if (this.activeDom instanceof NzSelectComponent) {\n this.setActiveSelectedComponentOpen(this.activeDom.open);\n }\n }\n\n /**\n * 根据行号和列号名称获取当前聚焦的dom位置\n * @param rowNumber 行号\n * @param colNumber 列号\n */\n setActiveDomInFormLines(rowNumber: number, colNumber: number) {\n this.activeDomX = rowNumber;\n this.activeDomY = this.getDomIndex(colNumber, this.formLines);\n this.setActiveDom(this.activeDomX, this.activeDomY);\n }\n\n /**\n * 键盘点击事件\n * @param event 键盘事件\n * @returns\n */\n onKeyDown(event: KeyboardEvent) {\n if (this.activeDomX === null || this.activeDomY === null) {\n return;\n }\n switch (event.key) {\n case \"ArrowUp\":\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen\n ) {\n return;\n }\n if (this.activeDomX !== 0) {\n this.focusDom(this.activeDomX - 1, this.activeDomY);\n }\n break;\n case \"ArrowDown\":\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen\n ) {\n return;\n }\n // 判断是否在最后一行,加行\n if (this.activeDomX === this.collectDomList.length - 1) {\n this.cleanFocusDom(this.activeDomX, this.activeDomY);\n this.addNewLineAndFocus();\n break;\n } else {\n this.focusDom(this.activeDomX + 1, this.activeDomY);\n }\n break;\n case \"ArrowLeft\":\n this.jumpToPrevInput(this.activeDomX, this.activeDomY);\n break;\n case \"ArrowRight\":\n this.jumpToNextInput(this.activeDomX, this.activeDomY);\n break;\n case \"Enter\":\n if (this.activeDom instanceof NzSelectComponent) {\n this.setActiveSelectedComponentOpen(this.activeDom.open);\n if (this.activeSelectedComponentOpen === false) {\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n } else if (this.activeDomX === this.collectDomList.length - 1) {\n this.addNewLineAndFocus();\n }\n break;\n case \"Escape\":\n if (this.activeDom instanceof NzSelectComponent) {\n const nowActiveDom = this.activeDom as NzSelectComponent;\n setTimeout(() => {\n this.setActiveSelectedComponentOpen(nowActiveDom.open);\n if (this.activeSelectedComponentOpen === false) {\n if (nowActiveDom.nzSelectService.mode === \"multiple\") {\n setTimeout(() => {\n this.focusDom(this.activeDomX, this.activeDomY);\n }, 0);\n } else {\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n }\n }, 0);\n }\n break;\n default:\n // 如果当前聚焦的是选择框,且键入0-9a-zA-Z,则弹出\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen === false &&\n /^[0-9a-zA-Z]$/.test(event.key)\n ) {\n const dom = this.activeDom;\n dom.nzOpen = true;\n this.setActiveSelectedComponentOpen(true);\n // // TODO:这里暂时注释,不能直接带入键入值,这样会导致输入中文的时候带入英文字符,不符合预期\n // dom.nzSelectTopControlComponent.inputValue = event.key;\n // // 获取 input 元素\n // const inputElement = dom.nzSelectTopControlComponent.inputElement.nativeElement;\n // setTimeout(() => {\n // // 触发输入事件,以确保 Angular 检测到值的变化\n // const eventInput = new Event('input', { bubbles: true });\n // inputElement.dispatchEvent(eventInput);\n // }, 0);\n }\n break;\n }\n }\n\n /**\n * 根据在初始dom下标和数据集 获取在collectDomList中的下标\n * @param index 初始下标\n * @param list 老数据集\n * @returns\n */\n private getDomIndex(index: number, list: Array<FormLine>): number {\n const typeList = [\n \"Input\",\n \"Select\",\n \"Date\",\n \"DateRange\",\n \"TextArea\",\n \"InputNumber\",\n \"MultipleSelect\",\n ];\n let filterList = [];\n for (let i = 0; i < list.length; i++) {\n if (i === index) {\n return filterList.length;\n }\n // 与模板一致:hide 的列不渲染 #formInputDom,不计入 collectDomList 的列下标\n if (typeList.includes(list[i].type) && !list[i].hide) {\n filterList.push(list[i]);\n }\n }\n return null;\n }\n\n /**\n * 根据在collectDomList中的下标和数据集 获取初始dom下标\n * @param index 新下标\n * @param list 老数据集\n * @returns\n */\n private getOldDomIndex(index: number, list: Array<FormLine>): number {\n console.log(\"index\", index);\n console.log(\"list\", list);\n const typeList = [\n \"Input\",\n \"Select\",\n \"Date\",\n \"DateRange\",\n \"TextArea\",\n \"InputNumber\",\n \"MultipleSelect\",\n ];\n let filterList = [];\n for (let i = 0; i < list.length; i++) {\n if (typeList.includes(list[i].type) && !list[i].hide) {\n filterList.push(list[i]);\n if (filterList.length === index + 1) {\n return i;\n }\n }\n }\n return null;\n }\n\n get linesFormArray(): any {\n return this.validateHdFormLines.get(\"lines\") as FormArray;\n }\n\n get LodashRound() {\n return round;\n }\n\n // 暴露的方法,用于获取所有数据的valid状态\n public getValid() {\n return this.formValid;\n }\n\n onSearchEvent(\n fn: any,\n event: any,\n line: any,\n onSearchEventDebounceTime: any,\n ) {\n if (!fn) {\n return;\n }\n const debounceMs =\n onSearchEventDebounceTime != null ? onSearchEventDebounceTime : 0;\n // 未配置或为 0:同步触发,不走 debounceTime(避免异步)\n if (!debounceMs) {\n this.triggerEvent(fn, event, line);\n } else {\n this.debounceTimeout = debounceMs;\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event, line }) => this.triggerEvent(fn, event, line));\n this.searchSubject.next({ fn, event, line });\n }\n setTimeout(() => {\n this.setActiveSelectedComponentOpen(true);\n }, 0);\n }\n\n onOpenChangeEvent(\n fn: any,\n open: boolean,\n line: any,\n onOpenChangeEventDebounceTime: any,\n ) {\n if (!fn) {\n return;\n }\n const debounceMs =\n onOpenChangeEventDebounceTime != null\n ? onOpenChangeEventDebounceTime\n : 0;\n // 未配置或为 0:同步触发,不走 debounceTime(避免异步)\n if (!debounceMs) {\n if (open) {\n this.triggerEvent(fn, open, line);\n }\n return;\n }\n this.openChangeDebounceTimeout = debounceMs;\n if (this.openChangeSubscription) {\n this.openChangeSubscription.unsubscribe();\n }\n this.openChangeSubscription = this.openChangeSubject\n .pipe(debounceTime(this.openChangeDebounceTimeout))\n .subscribe(({ fn, event, line }) => {\n if (event) {\n this.triggerEvent(fn, event, line);\n }\n });\n this.openChangeSubject.next({ fn, event: open, line });\n }\n\n /**\n *\n * @param fn 父组件函数\n * @param event 事件值\n * @param line 触发的行\n */\n triggerEvent(fn: any, event: any, line: any) {\n if (fn) {\n fn(event, line);\n }\n }\n\n innerGetValid() {\n let tmpValidateHdFormLines = this.fb.group({\n lines: this.fb.array([]),\n });\n this.storeFormLinesData.forEach((formLinesDataItem) => {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = this.fb.control(\n {\n value: this.judgeValueIsNotEmpty(formLinesDataItem[item.name])\n ? formLinesDataItem[item.name]\n : item.value || null,\n disabled: item.disabled,\n },\n item.require ? [Validators.required] : [],\n );\n if (item.selectOption && item.selectOption.label) {\n formGroupObj[item.selectOption.label] = this.fb.control(\n formLinesDataItem[item.selectOption.label] || null,\n [],\n );\n }\n });\n formGroupObj.lineIndex = this.fb.control(\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).controls.length + 1,\n [],\n );\n let formGroupTmp = this.fb.group(formGroupObj);\n this.formLines.forEach((item) => {\n if (item.onChangeEvent) {\n const debounceMs =\n item.onChangeEventDebounceTime != null\n ? item.onChangeEventDebounceTime\n : 0;\n const control = formGroupTmp.get(item.name);\n // 未配置或为 0:同步订阅,不走 debounceTime\n if (debounceMs > 0) {\n control.valueChanges\n .pipe(debounceTime(debounceMs))\n .subscribe((value) => {\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n } else {\n control.valueChanges.subscribe((value) => {\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n }\n }\n });\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).insert(\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).controls.length,\n formGroupTmp,\n );\n });\n return tmpValidateHdFormLines.valid;\n }\n\n // 暴露的方法,用于获取所有数据\n public getLines() {\n let allLines = [];\n this.storeFormLinesData.forEach((formLinesDataItem) => {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = formLinesDataItem[item.name];\n });\n formGroupObj.lineIndex = formLinesDataItem.lineIndex;\n allLines.push(formGroupObj);\n });\n return allLines;\n }\n\n // 全局性的搜索(涵盖页面上所有的可视文字)\n searchLines() {\n if (this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n // 如果没有输入搜索字符串,则显示缓存内的所有数据\n if (!this.filterStr) {\n this.isFilterData = false;\n this.setStoreData();\n return;\n }\n const filterValue = this.filterStr.trim().toLowerCase();\n this.isFilterData = true;\n this.filterIndexStore = [];\n\n // 根据搜索字符串过滤数据\n const filteredData = this.storeFormLinesData.filter(\n (data: any, index: number) => {\n for (const item of this.formLines) {\n if (\n (item.hide && item.canSearch) ||\n (!item.hide && item.name !== \"uuid\")\n ) {\n console.log(\"item\", item.name);\n const value = data[item.name]\n ? data[item.name].toString().toLowerCase()\n : \"\";\n if (value.includes(filterValue)) {\n this.filterIndexStore.push(index);\n return true;\n }\n }\n }\n return false;\n },\n );\n // 缓存一下筛选后的表单数据\n this.filterStoreFormLinesData = filteredData;\n // 处理筛选好的数据 然后重新渲染\n this.formLinesData = filteredData;\n this.init(true);\n }\n\n setStoreData() {\n this.formLinesData = this.storeFormLinesData;\n this.init(true);\n }\n\n getStyle(line: FormGroup, formItem: any, width: string) {\n let styleObj = {\n \"min-width\": width,\n };\n if (formItem.style) {\n styleObj = { ...styleObj, ...formItem.style };\n }\n if (\n formItem.colorOption &&\n formItem.colorOption.name &&\n line.get(formItem.colorOption.name).value\n ) {\n styleObj = {\n ...styleObj,\n ...{ color: line.get(formItem.colorOption.name).value },\n };\n }\n return styleObj;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n changes[\"formLinesData\"] &&\n JSON.stringify(changes[\"formLinesData\"].currentValue) !==\n JSON.stringify(changes[\"formLinesData\"].previousValue)\n ) {\n if (this.storeFormLinesData && this.storeFormLinesData.length === 0) {\n this.storeFormLinesData = this.formLinesData;\n }\n this.init();\n }\n if (\n changes[\"totalOption\"] &&\n JSON.stringify(changes[\"totalOption\"].currentValue) !==\n JSON.stringify(changes[\"totalOption\"].previousValue)\n ) {\n this.calculateTotal();\n }\n }\n\n calculateTotal() {\n // 这里处理合计数据\n if (this.showTotal) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"left\",\n showDecimal: item.showDecimal || false,\n };\n }\n });\n }\n }\n\n private init(isEdit: boolean = false): void {\n this.paginationPageIndex = 1;\n // 异常捕获\n if (!this.checkList(this.formLines)) {\n this.tableLoading = false;\n return;\n }\n this.createForm();\n // 如果没有formLinesData,则认为是新增\n if (\n !isEdit &&\n (!this.formLinesData ||\n (this.formLinesData && this.formLinesData.length === 0))\n ) {\n this.tableLoading = false;\n // allowEmpty 且仅删除按钮:不自动补空行\n if (!this.isTrulyEmptyAllowed) {\n this.addFormLine(null, false);\n }\n this.showForm = true;\n } else {\n // 编辑逻辑\n this.addFormLineWithData();\n }\n this.validateHdFormLines.valueChanges.subscribe((data) =>\n this.onHdFormValueChanged(data),\n );\n this.onHdFormValueChanged();\n }\n\n /**\n * 创建表单\n */\n private createForm() {\n this.validateHdFormLines = this.fb.group({\n lines: this.fb.array([]),\n });\n this.newLine = this.newLineItem();\n }\n\n delayJumpToNextInput() {\n setTimeout(() => {\n this.jumpToNextInput(this.activeDomX, this.activeDomY);\n }, 0);\n }\n\n /**\n * 定义空的newLineItem 结构\n */\n private newLineItem(): FormGroup {\n return this.createLineFromValues(null, true);\n }\n\n /**\n * 根据行数据创建 FormGroup(含隐藏字段、select 的 label 等附属字段)\n * @param formLinesDataItem 行数据,空行传 null\n * @param isEmptyLine 是否空行(影响必填校验规则,与历史逻辑保持一致)\n * @param regenerateRowId 是否强制生成新行 id(复制行时使用)\n */\n private createLineFromValues(\n formLinesDataItem: any,\n isEmptyLine: boolean = false,\n regenerateRowId: boolean = false,\n ): FormGroup {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n formGroupObj[item.name] = this.fb.control(\n {\n value:\n formLinesDataItem != null\n ? formLinesDataItem[item.name]\n : item.value,\n disabled: item.disabled,\n },\n isEmptyLine\n ? item.require && !item.hide\n ? [Validators.required]\n : []\n : item.require\n ? [Validators.required]\n : [],\n );\n if (item.selectOption && item.selectOption.label) {\n formGroupObj[item.selectOption.label] = this.fb.control(\n formLinesDataItem != null\n ? formLinesDataItem[item.selectOption.label] || null\n : null,\n [],\n );\n }\n });\n\n // 稳定行 id:搜索重建表单后用于保留勾选\n const rowId =\n !regenerateRowId && formLinesDataItem && formLinesDataItem._hdRowId\n ? formLinesDataItem._hdRowId\n : this.generateRowId();\n formGroupObj._hdRowId = this.fb.control(rowId);\n if (formLinesDataItem && !formLinesDataItem._hdRowId) {\n formLinesDataItem._hdRowId = rowId;\n }\n\n // 复制源行上多余的字段(隐藏附属字段、selectListName 等)\n if (formLinesDataItem) {\n Object.keys(formLinesDataItem).forEach((key) => {\n if (\n key === \"lineIndex\" ||\n key === \"isHdFormLineSearchAdd\" ||\n key === \"_hdRowId\"\n ) {\n return;\n }\n if (!formGroupObj[key]) {\n formGroupObj[key] = this.fb.control(formLinesDataItem[key]);\n }\n });\n }\n\n formGroupObj.lineIndex = this.fb.control(\n this.linesFormArray.controls.length + 1,\n [],\n );\n formGroupObj.isHdFormLineSearchAdd = this.fb.control(this.isFilterData, []);\n let formGroupSubmit = this.fb.group(formGroupObj);\n this.formLines.forEach((item) => {\n if (item.onChangeEvent) {\n const debounceMs =\n item.onChangeEventDebounceTime != null\n ? item.onChangeEventDebounceTime\n : 0;\n const control = formGroupSubmit.get(item.name);\n const handleChange = (value: any) => {\n if (item.type === FormLineType.Select && value !== null) {\n this.delayJumpToNextInput();\n }\n this.triggerEvent(item.onChangeEvent, value, formGroupSubmit);\n };\n // 未配置或为 0:同步订阅,不走 debounceTime\n if (debounceMs > 0) {\n control.valueChanges\n .pipe(debounceTime(debounceMs))\n .subscribe(handleChange);\n } else {\n control.valueChanges.subscribe(handleChange);\n }\n }\n });\n return formGroupSubmit;\n }\n\n private calculateLineNumber() {\n this.linesFormArray.controls.forEach((item, index) => {\n item.get(\"lineIndex\").setValue(index + 1, { emitEvent: false });\n });\n }\n\n /**\n * 编辑的时候数据处理\n */\n addFormLineWithData() {\n this.formLinesData.forEach((formLinesDataItem) => {\n this.linesFormArray.insert(\n this.linesFormArray.controls.length,\n this.createLineFromValues(formLinesDataItem),\n );\n });\n this.calculateLineNumber();\n this.tableLoading = false;\n this.showForm = true;\n }\n\n /**\n * 在指定行下方新增空行;不传 afterLine 则追加到末尾\n * @param afterLine 当前行 FormGroup(不要传 lineIndex,避免序号偏移导致插错位置)\n */\n addFormLine(afterLine?: FormGroup | null, isFocus: boolean = true) {\n const insertAt = this.getInsertIndexAfter(afterLine);\n const newLine = this.newLineItem();\n this.linesFormArray.insert(insertAt, newLine);\n this.addLineEvent.emit(newLine);\n this.calculateLineNumber();\n // 跳到新增行所在页,避免页码异常时看不到数据\n this.paginationPageIndex =\n Math.floor(insertAt / this.paginationPageSize) + 1;\n setTimeout(() => {\n this.collectDomData();\n if (isFocus) {\n this.activeDomX = this.toPageLocalRowIndex(insertAt);\n this.activeDomY = 0;\n console.log(\"执行过程13\");\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n }, 0);\n }\n\n /**\n * 复制当前行:在当前行下方新增一行,复制所有字段值(含隐藏字段)\n */\n copyFormLine(line: FormGroup) {\n const sourceIndex = this.linesFormArray.controls.indexOf(line);\n if (sourceIndex < 0) {\n return;\n }\n // getRawValue 包含 disabled 字段;复制行使用新的 _hdRowId\n const sourceValues = line.getRawValue();\n const insertAt = sourceIndex + 1;\n this.linesFormArray.insert(\n insertAt,\n this.createLineFromValues(sourceValues, false, true),\n );\n this.calculateLineNumber();\n setTimeout(() => {\n this.collectDomData();\n this.activeDomX = this.toPageLocalRowIndex(insertAt);\n this.activeDomY = 0;\n this.focusDom(this.activeDomX, this.activeDomY);\n }, 0);\n }\n\n @Output() deleteLineEvent = new EventEmitter();\n\n /**\n * 删除行\n * @param lineOrIndex 行 FormGroup,或 1-based 的 lineIndex(兼容 resetForm)\n */\n deleteFormLine(lineOrIndex: FormGroup | number) {\n let removeAt = -1;\n if (typeof lineOrIndex === \"number\") {\n removeAt = lineOrIndex - 1;\n } else if (lineOrIndex) {\n removeAt = this.linesFormArray.controls.indexOf(lineOrIndex);\n }\n console.log(\n \"index\",\n typeof lineOrIndex === \"number\" ? lineOrIndex : removeAt,\n );\n if (removeAt < 0) {\n return;\n }\n // 最后一条数据的时候要判断一下\n if (this.linesFormArray.controls.length === 1 && !this.allowEmpty) {\n if (this.deleteLastLineEvent) {\n this.deleteLastLineEvent.emit();\n }\n return;\n }\n const removedLine = this.linesFormArray.at(removeAt) as FormGroup;\n this.linesFormArray.removeAt(removeAt);\n this.removeLineFromSelection(removedLine);\n if (\n !this.isFilterData &&\n this.linesFormArray.controls &&\n this.linesFormArray.controls.length === 0 &&\n !this.isTrulyEmptyAllowed\n ) {\n this.addFormLine();\n } else {\n // 当前页已无数据时回退页码,且页码最小为 1(避免删空后变成 0 导致再添加看不见)\n const maxPage = Math.max(\n 1,\n Math.ceil(\n this.linesFormArray.controls.length / this.paginationPageSize,\n ),\n );\n if (this.paginationPageIndex > maxPage) {\n this.paginationPageIndex = maxPage;\n }\n this.calculateLineNumber();\n }\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n /** 在指定行后方的插入下标;无行则追加到末尾 */\n private getInsertIndexAfter(afterLine?: FormGroup | null): number {\n if (!afterLine) {\n return this.linesFormArray.controls.length;\n }\n const idx = this.linesFormArray.controls.indexOf(afterLine);\n return idx >= 0 ? idx + 1 : this.linesFormArray.controls.length;\n }\n\n /** 全局行下标转当前页内的行下标(供聚焦用) */\n private toPageLocalRowIndex(globalIndex: number): number {\n return (\n globalIndex - (this.paginationPageIndex - 1) * this.paginationPageSize\n );\n }\n\n public pageIndexChange(event: number): void {\n this.paginationPageIndex = event;\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n public pageSizeChange(event: number): void {\n this.paginationPageSize = event;\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n private onHdFormValueChanged(data?: any) {\n if (this.isFilterData) {\n if (data && data.lines && this.filterIndexStore.length !== 0) {\n const lines = data.lines;\n if (lines.length === this.filterIndexStore.length) {\n this.filterIndexStore.forEach((item, index) => {\n this.storeFormLinesData[item] = {\n ...this.filterStoreFormLinesData[index],\n ...lines[index],\n };\n });\n } else if (lines.length > this.filterIndexStore.length) {\n // 有新增数据的情况\n // step 1: 先找新增的index下标\n const getNowLines = this.validateHdFormLines.getRawValue().lines;\n let addIndex = -1;\n for (let i = 0; i < getNowLines.length; i++) {\n if (getNowLines[i].isHdFormLineSearchAdd) {\n addIndex = i;\n break;\n }\n }\n if (addIndex !== -1) {\n this.storeFormLinesData.splice(\n this.filterIndexStore[addIndex - 1] + 1,\n 0,\n getNowLines[addIndex],\n );\n }\n this.filterIndexStore.push(this.filterIndexStore[addIndex - 1] + 1);\n } else {\n // 有删除数据的情况\n // step 1:先找到删除的index下标\n let deletedIndex = -1;\n let count = 0;\n if (lines.length === 0) {\n deletedIndex = 0;\n } else {\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].lineIndex - count > 1) {\n deletedIndex = i;\n break;\n }\n count++;\n }\n }\n if (deletedIndex !== -1) {\n // step 2: 删除总数据中的对应数据, 把下标数组和lines长度对齐,同时把下标数组在deletedIndex后面的值全都-1\n this.storeFormLinesData = this.storeFormLinesData.filter(\n (item, index) => {\n return index !== this.filterIndexStore[deletedIndex];\n },\n );\n this.filterIndexStore.splice(deletedIndex, 1);\n for (let i = 0; i < this.filterIndexStore.length; i++) {\n if (i >= deletedIndex) {\n this.filterIndexStore[i]--;\n }\n }\n } else {\n // step 2: 没有找到deletedIndex说明删除操作在最后一行\n const filterIndex =\n this.filterIndexStore[this.filterIndexStore.length - 1];\n this.storeFormLinesData = this.storeFormLinesData.filter(\n (item, index) => {\n return index !== filterIndex;\n },\n );\n this.filterIndexStore.pop();\n }\n }\n } else {\n if (data && data.lines) {\n this.storeFormLinesData = data.lines;\n }\n }\n } else {\n if (data && data.lines) {\n this.storeFormLinesData = data.lines;\n }\n }\n\n // 总表单\n if (!this.isFilterData) {\n this.formValid = this.validateHdFormLines.valid;\n } else {\n if (this.formValid) {\n // 如果整体表单是true,不管子表单是什么,都变成子表单的状态\n this.formValid = this.validateHdFormLines.valid;\n } else {\n // 如果整体表单是false:1、子表单为true,需要重算;2、子表单为false,用子表单状态\n if (this.validateHdFormLines.valid) {\n this.formValid = this.innerGetValid();\n } else {\n this.formValid = this.validateHdFormLines.valid;\n }\n }\n }\n // this.calculateLineNumber();\n this.changeEvent.emit(this.validateHdFormLines);\n }\n\n private checkList(list: Array<FormLine>): boolean {\n if (!list || (list && list.length === 0)) {\n return false;\n }\n let nameList = [];\n let selectOptionCheckList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FormLineType.Select && (!item.selectList || (item.selectList && item.selectList.length === 0))) {\n // throw 'formLines组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n\n // 校验有onSearch的字段的selectOption的value、label是否在formLine里面都定义了\n if (item.onSearchEvent && item.selectOption) {\n selectOptionCheckList = [];\n list.forEach((innerItem) => {\n if (\n innerItem.name === item.selectOption.value ||\n innerItem.name === item.selectOption.label\n ) {\n selectOptionCheckList.push(innerItem.name);\n }\n });\n if (selectOptionCheckList.length < 2) {\n throw `formLines组件数据格式不规范,字段${item.name}的selectOption的value、label字段未能在formLines中找到对应字段!`;\n }\n }\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw \"formLines组件数据格式不规范,存在重复name值!\";\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n this.changeEvent.emit(this.validateHdFormLines.getRawValue());\n }\n\n public resetForm(): void {\n // 删除\n this.clearSelection();\n for (let i = this.linesFormArray.controls.length; i >= 0; i--) {\n this.deleteFormLine(i);\n }\n this.paginationPageIndex = 1;\n }\n\n public inputClean(formItem: any, line: any): void {\n line.get(formItem.name).setValue(null);\n }\n\n public selectValue(id: string, rowNumber: number, colNumber: number): void {\n const inputDom: any = document.querySelector(id);\n inputDom.select();\n this.setActiveDomInFormLines(rowNumber, colNumber);\n }\n\n private textWidthCache: { [key: string]: number } = {};\n\n isTextOverflow(text: string, maxWidth: number): boolean {\n const cachedWidth = this.textWidthCache[text];\n if (cachedWidth !== undefined) {\n return cachedWidth + 15 >= maxWidth;\n }\n\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = text;\n document.body.appendChild(span);\n const isOverflow = span.offsetWidth + 15 >= maxWidth;\n this.textWidthCache[text] = span.offsetWidth;\n span.style.display = \"none\";\n document.body.removeChild(span);\n return isOverflow;\n }\n\n judgeColEmpty(str: any) {\n if (str || str === 0) {\n return str;\n } else {\n return \"<空>\";\n }\n }\n\n judgeValueIsNotEmpty(str: any) {\n if (str === null && str === undefined) {\n return false;\n } else {\n return true;\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonGroupModule } from '../hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\nimport { HdFormLinesComponent } from './hd-form-lines.component';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule,\n HdSpaceModule,\n HdButtonGroupModule\n ],\n declarations: [HdFormLinesComponent],\n exports: [HdFormLinesComponent]\n})\nexport class HdFormLinesModule { }\n","import { Injectable } from \"@angular/core\";\nimport { ValidatorFn } from \"@angular/forms\";\nimport {\n CascaderOption,\n CheckboxOption,\n InputNumber,\n RadioOption,\n SelectOption,\n} from \"../model/common-type\";\n\n// 控件列表\nexport class FormItem {\n type: FormListType;\n label: string; // 文本\n name: string; // 字段名称\n require?: boolean = false; // 是否必填\n placeholder?: string; // 输入框提示文案\n width?: number = 1; // 占据的列数。默认1\n hide?: boolean = false; // 是否为隐藏字段,仅用于填充表单的字段,不显示在页面上\n totalWidth?: number = 0;\n isRowFirst?: number = 0; // 是否是一行的第一个元素\n columnItems?: Array<any>; // 当前行的所有列的items\n value?:\n | string\n | boolean\n | number\n | Date\n | Array<string | number | boolean | Date>\n | null = null; // 值 不传默认为null\n disabled?: boolean;\n color?: string;\n // 组件内部成员\n maxLength?: number; // input控件的输入长度\n prefix?: string; // input前缀文字,对应 nz-input-group nzPrefix\n prefixIcon?: string; // input前缀图标,对应 nz-icon nzType\n selectOption?: SelectOption; // 控件为Select时,选项列表\n radioOption?: RadioOption; // 控件为Radio时,选项列表\n checkboxOption?: CheckboxOption; // 控件为Checkbox组时,选项列表\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n onOpenChangeEvent?: Function; // select下拉展开/收起事件,可用于按需请求 selectList\n defaultLabel?: string | Array<string>; // select选择器不初始化的时候可以使用defaultLabel搭配value,设置默认值\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n hdShowToday?: boolean = true; // 对应 nzShowToday,是否显示「今天」按钮,默认 true\n explain?: string; // label底部的介绍\n textAreaRows?: number; // textArea的行数\n showTime?: boolean = false; // 日期选择器是否包含时间\n labelColor?: string; // label的文字的颜色\n validatorKeys?: Array<ValidatorKey>;\n validator?: ValidatorFn;\n onChangeEventDebounceTime?: number; // change事件防抖,未配置或为0时同步触发(不防抖)\n onSearchEventEventDebounceTime?: number; // search事件防抖,未配置或为0时同步触发(不防抖)\n onOpenChangeEventDebounceTime?: number; // 下拉展开事件防抖,未配置或为0时同步触发(不防抖)\n cascaderOption?: CascaderOption; // 级联选择器配置\n format?: string; // 时间的格式化规则\n}\n\nexport class ValidatorKey {\n key: string;\n label: string;\n}\n\n// 控件类型\nexport enum FormListType {\n Input, // 输入框\n Select, // 单项选择器\n Date, // 单个日期选择\n DateRange, // 日期范围选择\n TextArea, // 块级输入框\n InputNumber, // 数字输入\n MultipleSelect, // 多选\n ViewDom, // 单纯的显示控件\n Switch, // 开关\n Time, // 时间选择器\n Cascader, // 级联选择器\n Radio, // 单选\n Checkbox, // 复选框\n}\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class HdFormService {\n constructor() {}\n}\n","import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n SimpleChanges,\n} from \"@angular/core\";\nimport { FormBuilder, FormGroup, Validators } from \"@angular/forms\";\nimport { Subject, Subscription } from \"rxjs\";\nimport { debounceTime } from \"rxjs/operators\";\nimport { FormItem, FormListType } from \"./hd-form.service\";\n// import * as moment from 'moment';\n@Component({\n selector: \"hd-form\",\n templateUrl: \"./hd-form.component.html\",\n styleUrls: [\"./hd-form.component.less\"],\n})\nexport class HdFormComponent implements OnInit {\n @Input() formList: Array<FormItem>;\n @Output() changeEvent = new EventEmitter();\n validateHdForm: FormGroup;\n inputValue: string;\n\n private searchSubject = new Subject<{ fn: any; event: any }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n private searchSubscription: Subscription | undefined;\n\n private openChangeSubject = new Subject<{ fn: any; event: any }>();\n private openChangeDebounceTimeout: number = 0;\n private openChangeSubscription: Subscription | undefined;\n\n constructor(private fb: FormBuilder) {\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event }) => this.triggerEvent(fn, event));\n this.openChangeSubscription = this.openChangeSubject\n .pipe(debounceTime(this.openChangeDebounceTimeout))\n .subscribe(({ fn, event }) => {\n // 防抖结束后仅展开态触发业务回调,避免频繁开关仍打接口\n if (event) {\n this.triggerEvent(fn, event);\n }\n });\n }\n\n ngOnInit() {\n if (!this.formList || this.formList.length === 0) {\n return;\n }\n\n this.init();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n changes[\"formList\"] &&\n JSON.stringify(changes[\"formList\"].currentValue) !==\n JSON.stringify(changes[\"formList\"].previousValue)\n ) {\n if (!this.formList || this.formList.length === 0) {\n return;\n }\n this.init();\n }\n }\n\n onSearchEvent(fn: any, event: any, onSearchEventDebounceTime: any) {\n if (!fn) {\n return;\n }\n const debounceMs =\n onSearchEventDebounceTime != null ? onSearchEventDebounceTime : 0;\n // 未配置或为 0:同步触发,不走 debounceTime(避免异步)\n if (!debounceMs) {\n this.triggerEvent(fn, event);\n return;\n }\n this.debounceTimeout = debounceMs;\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event }) => this.triggerEvent(fn, event));\n this.searchSubject.next({ fn, event });\n }\n\n onOpenChangeEvent(\n fn: any,\n open: boolean,\n onOpenChangeEventDebounceTime: any,\n ) {\n if (!fn) {\n return;\n }\n const debounceMs =\n onOpenChangeEventDebounceTime != null\n ? onOpenChangeEventDebounceTime\n : 0;\n // 未配置或为 0:同步触发,不走 debounceTime(避免异步)\n if (!debounceMs) {\n if (open) {\n this.triggerEvent(fn, open);\n }\n return;\n }\n this.openChangeDebounceTimeout = debounceMs;\n if (this.openChangeSubscription) {\n this.openChangeSubscription.unsubscribe();\n }\n this.openChangeSubscription = this.openChangeSubject\n .pipe(debounceTime(this.openChangeDebounceTimeout))\n .subscribe(({ fn, event }) => {\n if (event) {\n this.triggerEvent(fn, event);\n }\n });\n this.openChangeSubject.next({ fn, event: open });\n }\n\n triggerEvent(fn: any, event: any) {\n if (fn) {\n fn(event);\n }\n }\n\n private init(): void {\n // 异常捕获\n if (!this.checkList(this.formList)) {\n throw \"form组件数据格式不规范\";\n }\n // 对表单数据做初始化,用row隔离每行数据item\n this.dealRow();\n // 首先根据定义的组件数组 去初始化表单\n let formGroupList = {};\n this.formList.forEach((item, index) => {\n // 日期相关的控件做特殊处理\n if (item.type === 2 && item.value) {\n const [year, month, day] = item.value\n .toString()\n .split(\"-\")\n .map((str) => parseInt(str));\n const newDateStr = new Date(year, month - 1, day)\n .toLocaleDateString(\"zh-Hans-CN\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n })\n .replace(/\\//g, \"-\");\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: new Date(newDateStr), disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: new Date(newDateStr), disabled: item.disabled },\n item.require && !item.hide ? [Validators.required] : [],\n );\n }\n } else if (item.type === 3 && item.value) {\n let formItemDate = JSON.parse(JSON.stringify(item.value));\n if (formItemDate && formItemDate instanceof Array) {\n formItemDate = formItemDate.map((item) => {\n const [year, month, day] = item\n .split(\"-\")\n .map((str) => parseInt(str));\n const newDateStr = new Date(year, month - 1, day)\n .toLocaleDateString(\"zh-Hans-CN\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n })\n .replace(/\\//g, \"-\");\n item = new Date(newDateStr);\n });\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: formItemDate, disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: formItemDate, disabled: item.disabled },\n item.require && !item.hide ? [Validators.required] : [],\n );\n }\n } else {\n throw \"form组件中DateRange控件value值格式不规范,正确示例['2020-01-22', '2020-01-23']\";\n }\n } else if (item.type === FormListType.Checkbox && item.checkboxOption) {\n const checkboxValue = Array.isArray(item.value) ? item.value : [];\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: checkboxValue, disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: checkboxValue, disabled: item.disabled },\n item.require && !item.hide ? [Validators.required] : [],\n );\n }\n } else if (item.type === FormListType.Checkbox) {\n const checkboxValue = item.value != null ? item.value : false;\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: checkboxValue, disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: checkboxValue, disabled: item.disabled },\n item.require && !item.hide ? [Validators.required] : [],\n );\n }\n } else {\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: item.value, disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: item.value, disabled: item.disabled },\n item.require && !item.hide ? [Validators.required] : [],\n );\n }\n }\n });\n\n this.validateHdForm = this.fb.group(formGroupList);\n\n this.formList.forEach((item) => {\n if (item.onChangeEvent) {\n const debounceMs =\n item.onChangeEventDebounceTime != null\n ? item.onChangeEventDebounceTime\n : 0;\n const control = this.validateHdForm.get(item.name);\n // 未配置或为 0:同步订阅,不走 debounceTime(避免异步破坏 patchValue 联动回显)\n if (debounceMs > 0) {\n control.valueChanges\n .pipe(debounceTime(debounceMs))\n .subscribe((value) =>\n this.triggerEvent(item.onChangeEvent, value),\n );\n } else {\n control.valueChanges.subscribe((value) =>\n this.triggerEvent(item.onChangeEvent, value),\n );\n }\n }\n });\n this.validateHdForm.valueChanges.subscribe((data) =>\n this.onHdFormValueChanged(data),\n );\n this.onHdFormValueChanged();\n }\n\n private dealRow() {\n // 一阶段 遍历数据计算相关数据\n const formListLength = this.formList.length;\n let step = 0;\n for (let i = 0; i < formListLength; i++) {\n if (!this.formList[i].hide) {\n if (i === 0) {\n this.formList[i].totalWidth = this.formList[i].width || 1;\n this.formList[i].isRowFirst = 1;\n step = step + 4;\n } else {\n // 去找到前一个非hide的控件\n for (let j = i - 1; j >= 0; j--) {\n if (this.formList[j].totalWidth) {\n this.formList[i].totalWidth =\n this.formList[j].totalWidth + (this.formList[i].width || 1);\n if (\n this.formList[j].totalWidth + (this.formList[i].width || 1) >\n step &&\n this.formList[j].totalWidth <= step\n ) {\n step = step + 4;\n this.formList[i].isRowFirst = 1;\n } else {\n this.formList[i].isRowFirst = 0;\n }\n break;\n }\n }\n }\n }\n }\n\n // 二阶段 isRowFirst的数组项增加子节点\n for (let m = 0; m < formListLength; m++) {\n if (this.formList[m].isRowFirst === 1) {\n this.formList[m].columnItems = [];\n let space = 0;\n for (let n = 1; n < formListLength - m; n++) {\n if (space === 4 || this.formList[m + n].isRowFirst === 1) {\n break;\n }\n if (\n !this.formList[m + n].hide &&\n this.formList[m + n] &&\n this.formList[m + n].isRowFirst === 0\n ) {\n this.formList[m].columnItems.push(this.formList[m + n]);\n space++;\n }\n }\n }\n }\n }\n\n private onHdFormValueChanged(data?: any) {\n this.changeEvent.emit(this.validateHdForm);\n }\n\n private checkList(list: Array<FormItem>): boolean {\n if (!list || (list && list.length === 0)) {\n return false;\n }\n let nameList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FormListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {\n // throw 'form组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw \"form组件数据格式不规范,存在重复name值!\";\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n Object.values(this.validateHdForm.controls).forEach((control) => {\n control.markAsDirty();\n control.updateValueAndValidity();\n });\n this.changeEvent.emit(this.validateHdForm.getRawValue());\n }\n\n public resetForm(): void {\n this.validateHdForm.reset();\n Object.values(this.validateHdForm.controls).forEach((control) => {\n control.markAsDirty();\n control.updateValueAndValidity();\n });\n this.changeEvent.emit(this.validateHdForm.getRawValue());\n }\n\n public inputClean(filter: FormItem): void {\n const patchObject = {};\n patchObject[filter.name] = null;\n this.validateHdForm.patchValue(patchObject);\n }\n\n isCheckboxChecked(name: string, value: any): boolean {\n const control = this.validateHdForm.get(name);\n const current = control ? control.value : null;\n return Array.isArray(current) && current.indexOf(value) !== -1;\n }\n\n onCheckboxItemChange(name: string, value: any, checked: boolean): void {\n const control = this.validateHdForm.get(name);\n if (!control) {\n return;\n }\n const current = Array.isArray(control.value) ? [...control.value] : [];\n const index = current.indexOf(value);\n if (checked && index === -1) {\n current.push(value);\n } else if (!checked && index !== -1) {\n current.splice(index, 1);\n }\n control.setValue(current);\n control.markAsDirty();\n control.updateValueAndValidity();\n }\n\n readonly inputNumberDefaultFormatter = (value: unknown) => value;\n readonly inputNumberDefaultParser = (value: string) => value;\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdFormComponent } from './hd-form.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule\n ],\n declarations: [HdFormComponent],\n exports: [HdFormComponent]\n})\nexport class HdFormModule { }\n","import { Component, ContentChild, EventEmitter, Input, OnInit, Output, SimpleChange, SimpleChanges, TemplateRef } from '@angular/core';\nimport { TableTotalOption } from './hd-current-table.service';\nimport { InputBoolean } from 'ng-zorro-antd/core';\nimport { Page } from '../model/common-type';\n\n@Component({\n selector: 'hd-current-table',\n templateUrl: './hd-current-table.component.html',\n styleUrls: ['./hd-current-table.component.less']\n})\nexport class HdCurrentTableComponent implements OnInit {\n @Input() tableData: Page<any>;\n @Input() scroll: { [key: string]: string } = { x: '1px' };\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() selectField: string = 'billNumber';\n // 合计区域\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<TableTotalOption>;\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n @ContentChild(\"tableHead\", { static: false }) tableHead: TemplateRef<any>;\n @ContentChild(\"tableBody\", { static: false }) tableBody: TemplateRef<any>;\n @ContentChild(\"tableTotal\", { static: false }) tableTotal: TemplateRef<any>;\n\n @Input() tableLoading: boolean = false;\n // 表格分页参数\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 10;\n @Output() tablePageIndexChange = new EventEmitter<any>();\n @Output() tablePageSizeChange = new EventEmitter<any>();\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n\n tableTotalOptionList = [];\n\n constructor() { }\n\n ngOnInit(): void { }\n\n ngOnChanges(changes: SimpleChange) {\n // 数据改变时,重置勾选状态\n if (changes && changes['tableData'] && changes['tableData']['currentValue'] && changes['tableData']['previousValue']) {\n if(changes['tableData']['currentValue']['pageSize'] !== changes['tableData']['previousValue']['pageSize']\n || changes['tableData']['currentValue']['pageNumber'] !== changes['tableData']['previousValue']['pageNumber']){\n return;\n }\n this.resetStatus();\n }\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n this.resetStatus();\n }\n\n search(reset: boolean) {\n if(reset){\n this.tablePageSizeChange.emit(this.tablePageSize);\n }else{\n this.tablePageIndexChange.emit(this.tablePageIndex);\n }\n // 触发父组件查询事件\n this.tableSearchEvent.emit(reset);\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] && (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] && delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(item => this.mapOfCheckedId[item[this.selectField]]);\n this.isIndeterminate =\n this.listOfDisplayData.some(item => this.mapOfCheckedId[item[this.selectField]]) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n const selectedList: Array<any> = Object.values(this.mapOfCheckList);\n this.selectEvent.emit(selectedList);\n }\n // 如果数据为空,则清空勾选标识\n if (this.tableData.content.length === 0) {\n this.isAllDisplayDataChecked = false;\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach(item => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] && (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] && delete this.mapOfCheckList[item[this.selectField]];\n }\n\n this.mapOfCheckedId[item[this.selectField]] = value\n });\n this.refreshStatus();\n }\n}\n","import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdCurrentTableComponent } from './hd-current-table.component';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\n\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n HdSpaceModule\n ],\n declarations: [HdCurrentTableComponent],\n exports: [HdCurrentTableComponent],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class HdCurrentTableModule { }\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'hd-log',\n templateUrl: './hd-log.component.html',\n styleUrls: ['./hd-log.component.less']\n})\nexport class HdLogComponent implements OnInit {\n @Input() logs: any[];\n\n constructor() {\n }\n\n ngOnInit() {\n }\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport { NzModalService } from 'ng-zorro-antd';\nimport { HdLogComponent } from './hd-log.component';\n\n@Injectable({\n providedIn: 'root',\n})\n\nexport class HdLogService {\n\n constructor(private modalService: NzModalService) { }\n\n showLogs(logs: any[]) {\n this.modalService.create({\n nzTitle: '操作日志',\n nzContent: HdLogComponent,\n nzComponentParams: { logs },\n nzFooter: null,\n nzWidth: 1000\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdLogComponent } from './hd-log.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdDetailLinesModule } from '../hd-detail-lines/hd-detail-lines.module';\nimport { HdLogService } from './hd-log.service';\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule,\n HdDetailLinesModule\n ],\n entryComponents: [HdLogComponent],\n declarations: [HdLogComponent],\n exports: [HdLogComponent],\n providers: [HdLogService]\n})\nexport class HdLogModule { }\n","import { Component, OnInit, Output, Input, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'hd-popconfirm',\n templateUrl: './hd-popconfirm.component.html',\n styleUrls: ['./hd-popconfirm.component.less']\n})\nexport class HdPopconfirmComponent implements OnInit {\n @Input() message: string;\n @Output() confirmOption = new EventEmitter<any>();\n @Output() cancelOption = new EventEmitter<any>();\n\n constructor() { }\n\n ngOnInit() {\n }\n\n\n cancel(e: any): void{\n this.cancelOption.emit();\n }\n\n confirm(e: any): void{\n this.confirmOption.emit();\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdPopconfirmComponent } from \"./hd-popconfirm.component\";\n\n@NgModule({\n declarations: [\n HdPopconfirmComponent\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgZorroAntdModule,\n ],\n exports: [HdPopconfirmComponent],\n providers: [],\n bootstrap: [HdPopconfirmComponent]\n})\nexport class HdPopconfirmModule {\n}\n","import { Component, OnInit, Input, OnChanges } from \"@angular/core\";\nimport { statusToColor } from \"./hd-status.service\";\n\n/** status 值 → 颜色,启动时构建一次 */\nconst STATUS_COLOR_MAP: Map<string, string> = (() => {\n const map = new Map<string, string>();\n for (const color of Object.keys(statusToColor)) {\n statusToColor[color].forEach((item) => {\n if (item) {\n map.set(item.toLowerCase(), color);\n }\n });\n }\n return map;\n})();\n\n@Component({\n selector: \"hd-status\",\n templateUrl: \"./hd-status.component.html\",\n styleUrls: [\"./hd-status.component.less\"],\n})\nexport class HdStatusComponent implements OnInit, OnChanges {\n @Input() status: string;\n statusColor: string;\n\n constructor() {}\n\n ngOnInit() {\n this.setStatusColor();\n }\n\n ngOnChanges() {\n this.setStatusColor();\n }\n\n setStatusColor() {\n const statusLower = this.status && this.status.toLowerCase();\n this.statusColor =\n statusLower && STATUS_COLOR_MAP.has(statusLower)\n ? STATUS_COLOR_MAP.get(statusLower)\n : \"#9FA4A2\";\n }\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdStatusComponent } from \"./hd-status.component\";\n\n@NgModule({\n declarations: [\n HdStatusComponent,\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgZorroAntdModule,\n ],\n exports: [HdStatusComponent],\n providers: [],\n bootstrap: [HdStatusComponent]\n})\nexport class HdStatusModule {\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class CommonSessionService {\n putSession(session_key: string, session: any) {\n if (session) {\n window.sessionStorage.setItem(session_key, JSON.stringify(session));\n } else {\n window.sessionStorage.removeItem(session_key);\n }\n }\n\n getSession(session_key: string): any {\n return JSON.parse(window.sessionStorage.getItem(session_key));\n }\n\n removeSession(session_key: string) {\n window.sessionStorage.removeItem(session_key);\n }\n}\n","export const ColWidth = {\n tableImageColWidth: 25, // 表格小图标宽度\n tableTwoImageColWidth: 40, // 表格小图标宽度\n billNumberColWidth: 150, // 单据单号列宽度\n nameColWidth: 150, // 基本资料名称列宽度\n codeColWidth: 100, // 基本资料代码列宽度\n codeNameColWidth: 200, // 用于门店、货主、供应商以“[code]name“格式展示时固定宽度\n enumColWidth: 100, // 枚举列宽度\n dateColWidth: 100, // 单个日期\n dateTimeColWidth: 150, // 单个日期带时间\n dateRangeWidth: 200, // 日期范围\n operateColWidth: 150, // 操作列宽度\n numberColWidth: 100, // 数字列\n remarkColWidth: 250, // 备注列\n fixColWidth: 150, // 不属于以上内容的列统一使用该宽度,增加超长省略\n maxColWidth: 350 // 用于展示订单内容,需要缩略、展开显示的列\n};\n","import { Pipe, PipeTransform } from \"@angular/core\";\nimport { ColWidth } from \"../model/colWidth\";\nimport { HdTableColumn } from \"./hd-table.service\";\n\nexport interface HdTableCellView {\n display: string | number;\n title: string | null;\n isEmpty: boolean;\n overflow: boolean;\n}\n\n@Pipe({ name: \"hdTableCell\", pure: true })\nexport class HdTableCellPipe implements PipeTransform {\n transform(data: any, col: HdTableColumn): HdTableCellView {\n if (!data || !col) {\n return { display: \"<空>\", title: null, isEmpty: true, overflow: false };\n }\n const raw = getHdTableCellRaw(data, col);\n const isEmpty = !(raw || raw === 0);\n const display = isEmpty ? \"<空>\" : raw;\n const maxWidth = col.width || ColWidth.fixColWidth;\n let overflow = false;\n let title: string | null = null;\n if (!isEmpty) {\n const str = String(raw);\n overflow = estimateTextWidth(str) >= maxWidth;\n if (overflow) {\n title = str;\n }\n }\n return { display, title, isEmpty, overflow };\n }\n}\n\n/** 估算文本像素宽度(中文约 14px,英文约 8px) */\nfunction estimateTextWidth(str: string): number {\n let width = 15;\n for (let i = 0; i < str.length; i++) {\n width += str.charCodeAt(i) > 255 ? 14 : 8;\n }\n return width;\n}\n\nfunction getHdTableCellRaw(data: any, col: HdTableColumn): any {\n if (col.render) {\n return col.render(data);\n }\n const name = col.name;\n if (typeof name === \"function\") {\n return name(data);\n }\n if (typeof name === \"string\") {\n return data[name];\n }\n return undefined;\n}\n","\n// 表格行\nexport class HdTableColumn {\n title: string; // 列名\n name: string | Function = null; // 字段名\n render?: (value: any) => string; // 渲染函数\n width?: number; // 列宽\n color?: string; // 颜色\n align?: 'right' | 'left' | 'center' = 'left';\n click?: (value: any) => void;\n fixed?: 'left' | 'right' = null;\n fixedWidth?: number; // 固定列宽度\n btnList?: Array<OperateBtn> = [];\n isShow?: boolean = true;\n canSort?: boolean = false; // 是否可以排序\n canWarp?: boolean = false; // 用于某一列需要个性化的场景,当为true时,且表格选项showOperateColWarpButton为true时,通过按钮控制对应的列是否换行\n minWidth?: number; // 最小宽度,保证列名能正常显示\n stateField?: string; // 状态列取值字段,默认取 state\n isState?: boolean; // 是否按状态列渲染,取值字段为 name\n}\n\nexport class OperateBtn {\n name: string;\n showConfirm?: boolean | ((line: any) => boolean) = false;\n isRepeat?: boolean = false; // 是否和别的按钮有显示冲突,譬如:开启,关闭需要再关闭按钮加一个这个属性\n click?: (value: any) => void;\n permission?: (value: any) => boolean;\n}\n\nexport class HdTableTotalOption {\n columnNumber: number; // 总列数\n insertIndex: number; // 插入下标\n insertName: string; // 插入字段\n}\n\nexport class TableCacheOption {\n pageSize: number;\n colWidths: Map<string, number> = new Map<string, number>(); // name -> width\n cols: Array<string>; // ['title']\n}\n\n// 设置列 树组件对象\nexport class TreeGrid {\n title: string = '';\n key: string = '';\n disabled?: boolean = false;\n checked?: boolean = false;\n selectable?: boolean = false;\n isLeaf?: boolean = true;\n expanded?: boolean = false;\n}","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnInit,\n Output,\n SimpleChange,\n TemplateRef,\n ViewChild,\n} from \"@angular/core\";\nimport { NzTableComponent } from \"ng-zorro-antd/table\";\nimport * as localforage from \"localforage\";\nimport {\n InputBoolean,\n NzFormatBeforeDropEvent,\n NzFormatEmitEvent,\n} from \"ng-zorro-antd/core\";\nimport { NzResizeEvent } from \"ng-zorro-antd/resizable\";\nimport { Observable, of } from \"rxjs\";\nimport { delay } from \"rxjs/operators\";\nimport { ColWidth } from \"../model/colWidth\";\nimport { Page } from \"../model/common-type\";\nimport { CommonSessionService } from \"../service/common-session.service\";\nimport {\n HdTableColumn,\n HdTableTotalOption,\n OperateBtn,\n TableCacheOption,\n TreeGrid,\n} from \"./hd-table.service\";\n@Component({\n selector: \"hd-table\",\n templateUrl: \"./hd-table.component.html\",\n styleUrls: [\"./hd-table.component.less\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HdTableComponent implements OnInit {\n @Input() uuid: string;\n @Input() tableCols: Array<HdTableColumn> = [];\n @Input() tableData: Page<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() showOperateColWarpButton: boolean = false;\n @Input() @InputBoolean() virtualScroll: boolean = true;\n /** 手动指定行高;不传则在首屏渲染后自动测量 */\n @Input() virtualItemSize: number;\n @Input() selectField: string = \"billNumber\";\n // 合计区域\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<HdTableTotalOption>;\n @Output() sortEvent = new EventEmitter();\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n @Input() tableLoading: boolean = false;\n // 表格分页参数\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 100;\n @Input() isFirstEntrySearch: boolean;\n @Input() isCrossPageSelect: boolean;\n @Output() tablePageIndexChange = new EventEmitter<any>();\n @Output() tablePageSizeChange = new EventEmitter<any>();\n @Output() tablePageSizeChangeEvent = new EventEmitter<any>();\n @ContentChild(\"tableTotal\", { static: false }) tableTotal: TemplateRef<any>;\n @ContentChild(\"tableLeftButton\", { static: false })\n tableLeftButton: TemplateRef<any>;\n @ContentChild(\"tableRightButton\", { static: false })\n tableRightButton: TemplateRef<any>;\n scroll = null;\n\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n // 合计参数\n tableTotalOptionList = [];\n // 缓存信息\n tableCacheOption: TableCacheOption = new TableCacheOption();\n userSession: any;\n\n tableColsCache: Array<HdTableColumn> = [];\n showTable: boolean = false;\n selectColListNodes: Array<TreeGrid> = [];\n selectColListNodesCache: Array<TreeGrid> = [];\n showListNodes: boolean = false;\n\n isDropdownVisible: boolean = false;\n // 设置列的可见操作数组\n nowListNodes: Array<TreeGrid> = [];\n // 设置列的不可见操作数组\n hideListNodes: Array<TreeGrid> = [];\n\n // 点击时需要有临时数组存放两个tree,用于取消时候恢复调整前的状态\n cancelNowListNodes: Array<TreeGrid> = [];\n cancelHideListNodes: Array<TreeGrid> = [];\n showDetail: boolean = false;\n localforage: any = null;\n localtionTmp: string = \"\";\n isFirstEntrySearchLocal: boolean = true;\n isCrossPageSelectLocal: boolean = false;\n\n /** 自动测量前的兜底行高,测量完成后会更新 */\n measuredVirtualItemSize = 47;\n\n /** 记录当前是否处于虚拟滚动模式,用于切换 pageSize 时重建表格 */\n private virtualScrollActive: boolean | null = null;\n\n /** 可见列总宽,用于判断是否需要横向滚动 */\n private tableColWidthTotal = 0;\n\n @ViewChild(\"hdTable\", { static: false }) nzTableComponent: NzTableComponent;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private commonSessionService: CommonSessionService,\n ) {\n this.localforage = localforage.createInstance({\n driver: localforage.INDEXEDDB,\n name: \"hd-fscm\", // 设置存储库的名称\n version: 1.0, // 设置存储库的版本\n storeName: \"hd-fscm-store\", // 设置存储库的存储空间名称\n });\n }\n\n ngOnInit(): void {\n if (this.isFirstEntrySearch === false) {\n this.isFirstEntrySearchLocal = this.isFirstEntrySearch;\n }\n if (this.isCrossPageSelect === true) {\n this.isCrossPageSelectLocal = this.isCrossPageSelect;\n }\n this.localtionTmp = location.pathname;\n if (this.localtionTmp) {\n this.localtionTmp = this.localtionTmp.replace(/\\//g, \"_\");\n }\n this.userSession = this.commonSessionService.getSession(\n \"__jy_authorization_session__\",\n );\n // 用于开发环境调试\n if (!this.userSession) {\n this.userSession = {\n userCode: \"dev\",\n };\n }\n\n this.deleteHideItem();\n if (!this.tableCols || this.tableCols.length === 0) {\n return;\n }\n\n this.localforage\n .ready()\n .then(() => {\n this.getInitLocalforage();\n })\n .catch(function (e) {\n console.log(\"localforage加载异常step1\", e);\n throw \"localforage加载异常\";\n });\n }\n\n ngOnChanges(changes: SimpleChange) {\n if (\n changes &&\n changes[\"tableData\"] &&\n changes[\"tableData\"][\"currentValue\"] &&\n changes[\"tableData\"][\"previousValue\"]\n ) {\n if (\n changes[\"tableData\"][\"currentValue\"][\"pageSize\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageSize\"] ||\n changes[\"tableData\"][\"currentValue\"][\"pageNumber\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageNumber\"]\n ) {\n if (this.virtualScroll) {\n this.applyTableScrollMode(true);\n }\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n if (changes[\"tableData\"] && this.virtualScroll) {\n this.applyTableScrollMode(true);\n }\n\n if (\n changes[\"tableCols\"] &&\n JSON.stringify(changes[\"tableCols\"].currentValue) !==\n JSON.stringify(changes[\"tableCols\"].previousValue) &&\n changes[\"tableCols\"].previousValue !== undefined\n ) {\n this.deleteHideItem();\n if (!this.tableCols || this.tableCols.length === 0) {\n return;\n }\n this.localforage\n .ready()\n .then(() => {\n this.getInitLocalforage();\n })\n .catch(function (e) {\n console.log(\"localforage加载异常step2\", e);\n throw \"localforage加载异常\";\n });\n }\n }\n\n deleteHideItem() {\n // 首先把isShow为false数据剔除掉\n this.tableCols = this.tableCols.filter((item) => {\n // 如果对象没有 isShow 属性,则默认为 true,保留该对象\n if (!item.hasOwnProperty(\"isShow\")) {\n return true;\n }\n // 如果对象有 isShow 属性,则检查其值是否为 true\n return item.isShow === true;\n });\n }\n\n sort(sort: { key: string; value: string }) {\n this.sortEvent.emit(sort);\n }\n\n toggleShowDetail(): void {\n this.showDetail = !this.showDetail;\n this.cdr.markForCheck();\n this.refreshVirtualScrollViewport(true);\n }\n\n get effectiveVirtualItemSize(): number {\n if (this.virtualItemSize != null && this.virtualItemSize > 0) {\n return this.virtualItemSize;\n }\n return this.measuredVirtualItemSize;\n }\n\n /** 当前页数据能完整展示时不启用虚拟滚动,避免少量数据也出现滚动条 */\n get useVirtualScroll(): boolean {\n if (!this.virtualScroll) {\n return false;\n }\n const rowCount =\n this.tableData && this.tableData.content\n ? this.tableData.content.length\n : 0;\n if (rowCount <= 0) {\n return false;\n }\n const maxOffset = this.tableTotal ? 180 : 140;\n const estimatedHeight = rowCount * this.effectiveVirtualItemSize;\n if (typeof window !== \"undefined\") {\n return estimatedHeight > window.innerHeight - maxOffset;\n }\n return rowCount > 100;\n }\n\n trackByRow = (index: number, data: any): string => {\n const key = data && data[this.selectField];\n return key != null ? String(key) : `row-${index}`;\n };\n\n /** 虚拟滚动按数组下标追踪,避免业务主键 trackBy 导致 CDK 行复用错位 */\n virtualTrackByRow = (index: number): number => index;\n\n trackByCol = (_index: number, col: HdTableColumn): string => {\n return col.title;\n };\n\n getInitLocalforage() {\n // 首先获取当前hd-table存储的数据 如果没有,则初始化下当前的数据\n this.localforage\n .getItem(\n \"hd-table_\" +\n this.userSession.userCode +\n \"_\" +\n this.localtionTmp +\n \"_\" +\n this.uuid,\n )\n .then((value: TableCacheOption) => {\n if (value) {\n this.tableCacheOption = value;\n this.normalizeTableCacheOption();\n if (\n this.tableCacheOption.pageSize &&\n this.tableCacheOption.pageSize > 10\n ) {\n this.tablePageSize = this.tableCacheOption.pageSize;\n this.tablePageSizeChange.emit(this.tablePageSize);\n }\n } else {\n this.tableCacheOption = new TableCacheOption();\n this.tableCacheOption.pageSize = this.tablePageSize;\n }\n if (this.isFirstEntrySearchLocal) {\n this.tablePageSizeChangeEvent.emit(this.tablePageSize);\n } else {\n this.isFirstEntrySearchLocal = true;\n }\n this.initTable();\n })\n .catch((err) => {\n this.tableCacheOption = new TableCacheOption();\n this.tableCacheOption.pageSize = this.tablePageSize;\n this.initTable();\n });\n }\n\n initTable() {\n this.showTable = false;\n if (!this.uuid) {\n throw \"hd-table缺失uuid参数,请使用编辑器插件生成并给hd-table赋予uuid属性\";\n }\n if (this.judgeRepeatCols()) {\n this.dealCols();\n this.setCols();\n this.dealOperateBtn();\n this.virtualScrollActive = null;\n this.applyTableScrollMode(true);\n }\n }\n\n /** 虚拟/普通模式切换时重建表格,避免残留滚动容器 */\n applyTableScrollMode(forceRemount = false): void {\n const useVirtual = this.useVirtualScroll;\n const modeChanged =\n this.virtualScrollActive !== null &&\n this.virtualScrollActive !== useVirtual;\n this.virtualScrollActive = useVirtual;\n\n if (forceRemount || modeChanged) {\n this.showTable = false;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.showTable = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.dealScroll();\n this.cdr.markForCheck();\n this.afterTableRender(useVirtual);\n });\n });\n return;\n }\n\n this.dealScroll();\n this.cdr.markForCheck();\n this.afterTableRender(useVirtual);\n }\n\n private afterTableRender(useVirtual: boolean): void {\n if (useVirtual) {\n this.refreshVirtualScrollViewport(true);\n return;\n }\n if (this.virtualScroll) {\n this.measureVirtualItemSize(true);\n this.syncHorizontalScroll();\n }\n }\n\n refreshVirtualScrollViewport(forceMeasure = false): void {\n if (!this.useVirtualScroll) {\n if (forceMeasure) {\n this.measureVirtualItemSize(forceMeasure);\n this.dealScroll();\n this.cdr.markForCheck();\n }\n return;\n }\n setTimeout(() => {\n const viewport = this.nzTableComponent &&\n this.nzTableComponent.cdkVirtualScrollViewport;\n if (!viewport) {\n return;\n }\n const measured = this.measureVirtualItemSize(forceMeasure);\n if (measured) {\n this.dealScroll();\n this.cdr.markForCheck();\n viewport.checkViewportSize();\n setTimeout(() => {\n this.measureVirtualItemSize(forceMeasure);\n this.dealScroll();\n viewport.checkViewportSize();\n });\n } else {\n viewport.checkViewportSize();\n }\n });\n }\n\n /** 未手动传 virtualItemSize 时,从已渲染行测量真实高度 */\n measureVirtualItemSize(force = false): boolean {\n if (\n this.virtualItemSize != null &&\n this.virtualItemSize > 0 &&\n !force\n ) {\n return false;\n }\n const viewport = this.nzTableComponent &&\n this.nzTableComponent.cdkVirtualScrollViewport;\n const tableBody = this.nzTableComponent &&\n this.nzTableComponent.tableBodyNativeElement as HTMLElement;\n const row =\n (viewport &&\n ((viewport.elementRef.nativeElement as HTMLElement).querySelector(\n \"tr.hd-table-virtual-row\",\n ) as HTMLElement)) ||\n (tableBody && (tableBody.querySelector(\"tbody tr\") as HTMLElement));\n if (!row || row.offsetHeight <= 0) {\n return false;\n }\n const height = row.offsetHeight;\n if (height === this.measuredVirtualItemSize) {\n return false;\n }\n this.measuredVirtualItemSize = height;\n return true;\n }\n\n // 设置列点击取消\n cancelDropdown(): void {\n this.isDropdownVisible = false;\n this.hideListNodes = JSON.parse(JSON.stringify(this.cancelHideListNodes));\n this.nowListNodes = JSON.parse(JSON.stringify(this.cancelNowListNodes));\n this.cdr.markForCheck();\n }\n\n // 点击触发设置列\n confirmDropdown(): void {\n // 临时存放下,取消的时候恢复原来的状态 深拷贝下对象数组\n this.cancelHideListNodes = JSON.parse(JSON.stringify(this.hideListNodes));\n this.cancelNowListNodes = JSON.parse(JSON.stringify(this.nowListNodes));\n this.isDropdownVisible = true;\n this.cdr.markForCheck();\n }\n\n submitGrids() {\n this.tableCacheOption.cols = [];\n this.nowListNodes.forEach((item) => {\n this.tableCacheOption.cols.push(item.title);\n });\n this.saveTableCacheOption();\n this.initTable();\n this.isDropdownVisible = false;\n this.cdr.markForCheck();\n }\n\n // 从缓存设置列\n setCols() {\n this.showListNodes = false;\n this.nowListNodes = [];\n this.hideListNodes = [];\n if (this.hasColsCache()) {\n let { notIncols, incols } = this.tableColsCache.reduce(\n (acc, item) => {\n if (this.tableCacheOption.cols.includes(item.title)) {\n acc.incols.push(item);\n } else {\n acc.notIncols.push(item);\n }\n return acc;\n },\n { notIncols: [], incols: [] },\n );\n incols.sort((a, b) => {\n return (\n this.tableCacheOption.cols.indexOf(a.title) -\n this.tableCacheOption.cols.indexOf(b.title)\n );\n });\n this.tableCols = incols.concat(notIncols);\n }\n\n this.tableCols.forEach((element, index) => {\n if (this.hasColsCache()) {\n element.isShow = this.tableCacheOption.cols.includes(element.title)\n ? true\n : false;\n if (element.isShow) {\n this.nowListNodes.push({\n title: element.title,\n key: element.title,\n disabled: element.fixed ? true : false,\n // selectable: false,\n checked: this.tableCacheOption.cols.includes(element.title)\n ? true\n : false,\n });\n } else {\n this.hideListNodes.push({\n title: element.title,\n key: element.title,\n disabled: element.fixed ? true : false,\n // selectable: false,\n checked: this.tableCacheOption.cols.includes(element.title)\n ? true\n : false,\n });\n }\n } else {\n element.isShow = true;\n this.nowListNodes.push({\n title: element.title,\n key: element.title,\n checked: true,\n // selectable: false,\n disabled: element.fixed ? true : false,\n });\n }\n });\n\n // 调整列宽为缓存宽度\n if (\n this.tableCacheOption &&\n this.tableCacheOption.colWidths &&\n this.tableCacheOption.colWidths.size !== 0\n ) {\n this.tableCols.forEach((col) => {\n if (this.tableCacheOption.colWidths.has(col.title)) {\n col.width = this.tableCacheOption.colWidths.get(col.title);\n }\n });\n }\n\n this.dealCols();\n setTimeout(() => {\n this.showListNodes = true;\n }, 0);\n }\n\n // 拖拽操作\n beforeDrop = (arg: NzFormatBeforeDropEvent): Observable<boolean> => {\n if (\n arg.node.origin.disabled ||\n !arg.dragNode.origin.checked ||\n arg.pos === 0\n ) {\n return of(false);\n } else {\n let node: TreeGrid = new TreeGrid();\n node.checked = arg.dragNode.origin.checked;\n node.disabled = arg.dragNode.origin.disabled;\n node.expanded = arg.dragNode.origin.expanded;\n node.isLeaf = arg.dragNode.origin.isLeaf;\n node.key = arg.dragNode.origin.key;\n node.selectable = arg.dragNode.origin.selectable;\n node.title = arg.dragNode.origin.title;\n // 拖拽元素下标\n let dragNodeIndex = this.nowListNodes.findIndex((item) => {\n return item.title == arg.dragNode.origin.title;\n });\n // 目标位置的下标\n let nodeIndex =\n this.nowListNodes.findIndex((item) => {\n return item.title == arg.node.origin.title;\n }) + (arg.pos === -1 ? 0 : arg.pos);\n this.nowListNodes.splice(nodeIndex, 0, node);\n this.nowListNodes.splice(\n nodeIndex >= dragNodeIndex ? dragNodeIndex : dragNodeIndex + 1,\n 1,\n );\n return of(true).pipe(delay(100));\n }\n };\n\n moveElementNearby(arr, elementToMoveTitle, targetElementTitle, pos) {\n const tmpArray = JSON.parse(JSON.stringify(arr));\n const targetIndex = tmpArray.findIndex(\n (item) => item.title === targetElementTitle,\n );\n const elementIndex = tmpArray.findIndex(\n (item) => item.title === elementToMoveTitle,\n );\n const newIndex = pos < 0 ? targetIndex + pos : targetIndex;\n // 移除目标元素,并插入到新的位置\n const removedElement = tmpArray.splice(elementIndex, 1);\n tmpArray.splice(newIndex + 1, 0, removedElement[0]);\n return tmpArray;\n }\n\n // 勾选操作\n checkAction(event: NzFormatEmitEvent): void {\n // 勾选只有在hideListNodes,取消勾选只有在nowListNodes\n if (event.node.origin.checked) {\n let node: TreeGrid = new TreeGrid();\n node = this.hideListNodes.find((item) => {\n return item.title === event.node.origin.title;\n });\n node.checked = true;\n // 找到第一个fixed属性为right的title,找到插入元素的位置\n let title = null;\n for (let i = this.tableColsCache.length - 1; i >= 0; i--) {\n if (this.tableColsCache[i].fixed === \"right\") {\n title = this.tableColsCache[i].title;\n break;\n }\n }\n let temporaryNodeList = this.nowListNodes.slice(0);\n if (!title) {\n temporaryNodeList.push(node);\n } else {\n const index = this.nowListNodes.findIndex(\n (node) => node.title === title,\n );\n temporaryNodeList.splice(index, 0, node);\n }\n this.nowListNodes = temporaryNodeList;\n this.hideListNodes = this.hideListNodes.filter((item) => {\n return item.title !== event.node.origin.title;\n });\n } else {\n // if (this.hideListNodes.length === 0 && this.tableCacheOption && this.tableCacheOption.cols) {\n // this.hideListNodes = this.getHideListNodes();\n // }\n let temporaryNodeList = this.hideListNodes.slice(0);\n this.nowListNodes.forEach((item) => {\n if (item.title === event.node.origin.title) {\n const innerItem = JSON.parse(JSON.stringify(item));\n innerItem.checked = false;\n temporaryNodeList.push(innerItem);\n }\n });\n this.hideListNodes = temporaryNodeList;\n\n // 为了防止未选择的数组顺序因为push方法而改变,通过初始数据获取显示的字段列表\n this.nowListNodes = this.nowListNodes.filter((item) => {\n return item.title !== event.node.origin.title;\n });\n }\n this.cdr.markForCheck();\n }\n\n // 防止未选择的数组顺序因为push方法而改变,从初始数据获取隐藏未显示的字段列表\n getHideListNodes(): Array<TreeGrid> {\n let temporaryNodeList: Array<TreeGrid> = [];\n // 从tableColsCache里面找没有在storage里面出现的字段,组成hideList\n this.tableColsCache.forEach((item) => {\n if (!this.tableCacheOption.cols.includes(item.title)) {\n let nodeItem: TreeGrid = new TreeGrid();\n nodeItem.title = item.title;\n nodeItem.key = item.title;\n nodeItem.disabled = item.fixed ? true : false;\n nodeItem.checked = false;\n temporaryNodeList.push(nodeItem);\n }\n });\n return temporaryNodeList;\n }\n\n dealCols() {\n if (!this.tableCols[0].minWidth) {\n this.tableCols.forEach((item) => {\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = item.title;\n document.body.appendChild(span);\n item.minWidth = span.offsetWidth + 16;\n span.style.display = \"none\";\n document.body.removeChild(span);\n });\n }\n // 处理左右吸附的数据在数组中的位置\n const leftFixedCols = this.tableCols.filter((col) => col.fixed === \"left\");\n const rightFixedCols = this.tableCols.filter(\n (col) => col.fixed === \"right\",\n );\n const normalCols = this.tableCols.filter((col) => !col.fixed);\n const resultCols = leftFixedCols.concat(normalCols).concat(rightFixedCols);\n this.tableCols = resultCols;\n if (!this.tableColsCache || this.tableColsCache.length === 0) {\n // 缓存一下表格的数据\n this.tableColsCache = [...this.tableCols];\n }\n }\n\n normalizeTableCacheOption() {\n if (!this.tableCacheOption.colWidths) {\n this.tableCacheOption.colWidths = new Map<string, number>();\n } else if (!(this.tableCacheOption.colWidths instanceof Map)) {\n const colWidths = new Map<string, number>();\n Object.keys(this.tableCacheOption.colWidths).forEach((key) => {\n colWidths.set(key, (this.tableCacheOption.colWidths as any)[key]);\n });\n this.tableCacheOption.colWidths = colWidths;\n }\n }\n\n private hasColsCache(): boolean {\n return !!(this.tableCacheOption && this.tableCacheOption.cols && this.tableCacheOption.cols.length > 0);\n }\n\n saveTableCacheOption() {\n this.localforage.setItem(\n \"hd-table_\" +\n this.userSession.userCode +\n \"_\" +\n this.localtionTmp +\n \"_\" +\n this.uuid,\n this.tableCacheOption,\n );\n }\n\n judgeRepeatCols() {\n for (let i = 0; i < this.tableCols.length; i++) {\n for (let j = i + 1; j < this.tableCols.length; j++) {\n if (this.tableCols[i].title === this.tableCols[j].title) {\n throw `hd-table组件中列名 ${this.tableCols[i].title} 重复`;\n }\n }\n }\n return true;\n }\n\n onResize({ width }: NzResizeEvent, col: HdTableColumn): void {\n this.normalizeTableCacheOption();\n let tempWidth = 0;\n if (width > col.minWidth) {\n tempWidth = width;\n } else {\n tempWidth = col.minWidth;\n }\n this.tableCacheOption.colWidths.set(col.title, tempWidth);\n this.saveTableCacheOption();\n this.tableCols = this.tableCols.map((e) =>\n e.title === col.title ? { ...e, width: tempWidth } : e,\n );\n this.dealScroll();\n this.cdr.markForCheck();\n }\n\n dealOperateBtn() {\n let operateCol = this.tableCols.find((col) => col.title === \"操作\") || null;\n if (operateCol) {\n let textStr = \"\";\n operateCol.btnList.forEach((btn) => {\n if (!btn.isRepeat) {\n textStr += btn.name;\n }\n });\n\n const span = document.createElement(\"a\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = textStr;\n document.body.appendChild(span);\n operateCol.width =\n span.offsetWidth +\n (operateCol.btnList.filter((item) => !item.isRepeat).length - 1) * 4 +\n 16;\n span.style.display = \"none\";\n document.body.removeChild(span);\n }\n }\n\n triggerEvent(fn: any, event: any) {\n if (fn) {\n fn(event);\n }\n }\n\n needShowConfirm(btn: OperateBtn, data: any): boolean {\n if (typeof btn.showConfirm === \"function\") {\n return btn.showConfirm(data);\n }\n return !!btn.showConfirm;\n }\n\n /** 虚拟滚动开启时使用视口最大高度 */\n private getVirtualScrollY(maxOffset: number): string {\n return `calc(100vh - ${maxOffset}px)`;\n }\n\n private getTableViewportWidth(): number {\n if (!this.nzTableComponent || !this.nzTableComponent.tableMainElement) {\n return 0;\n }\n const tableMain = this.nzTableComponent.tableMainElement\n .nativeElement as HTMLElement;\n const wrapper = tableMain.closest(\".ant-table-wrapper\") as HTMLElement;\n if (wrapper && wrapper.clientWidth > 0) {\n return wrapper.clientWidth;\n }\n const host = tableMain.closest(\".hd-table-container\") as HTMLElement;\n if (host && host.clientWidth > 0) {\n return host.clientWidth;\n }\n return 0;\n }\n\n /** 列总宽超出外层容器才启用横向 scroll(不能用 table 自身宽度,会被 scroll.x 撑宽) */\n private resolveScrollX(colWidth: number, useVirtual: boolean): string | null {\n if (colWidth <= 0) {\n return useVirtual ? \"1px\" : null;\n }\n if (useVirtual) {\n return `${colWidth}px`;\n }\n const viewportWidth = this.getTableViewportWidth();\n if (viewportWidth > 0) {\n return colWidth > viewportWidth ? `${colWidth}px` : null;\n }\n if (typeof window !== \"undefined\" && colWidth > window.innerWidth - 32) {\n return `${colWidth}px`;\n }\n return null;\n }\n\n /** 表格渲染后按实际容器宽度校正横向 scroll */\n private syncHorizontalScroll(): void {\n if (!this.virtualScroll || this.useVirtualScroll) {\n return;\n }\n const scrollX = this.resolveScrollX(this.tableColWidthTotal, false);\n if (this.scroll && this.scroll.x === scrollX && this.scroll.y === null) {\n return;\n }\n this.scroll = { x: scrollX, y: null };\n this.cdr.markForCheck();\n }\n\n dealScroll() {\n let colWidth = 0;\n if (this.showSelected) {\n colWidth += 40;\n }\n this.tableCols.forEach((item) => {\n if (!item.width) {\n item.width = ColWidth.fixColWidth;\n }\n if (item.isShow) {\n item.fixedWidth = colWidth;\n colWidth += item.width;\n }\n });\n\n this.tableColWidthTotal = colWidth;\n const maxOffset = this.tableTotal ? 180 : 140;\n const useVirtual = this.useVirtualScroll;\n\n if (this.virtualScroll && !useVirtual) {\n this.scroll = {\n x: this.resolveScrollX(colWidth, false),\n y: null,\n };\n return;\n }\n\n if (!this.virtualScroll) {\n this.scroll = {\n x: \"1px\",\n y: `calc(100vh - ${maxOffset}px)`,\n };\n return;\n }\n\n this.scroll = {\n x: this.resolveScrollX(colWidth, true),\n y: this.getVirtualScrollY(maxOffset),\n };\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n this.cdr.markForCheck();\n }\n\n search(reset: boolean) {\n this.tableCacheOption.pageSize = this.tablePageSize;\n this.saveTableCacheOption();\n if (reset) {\n this.tablePageSizeChange.emit(this.tablePageSize);\n this.tablePageSizeChangeEvent.emit(this.tablePageSize);\n } else {\n this.tablePageIndexChange.emit(this.tablePageIndex);\n // 触发父组件查询事件\n this.tableSearchEvent.emit(reset);\n }\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n this.cdr.markForCheck();\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n const selectedList: Array<any> = Object.values(this.mapOfCheckList);\n this.selectEvent.emit(selectedList);\n }\n // 如果数据为空,则清空勾选标识\n if (this.tableData.content.length === 0) {\n this.isAllDisplayDataChecked = false;\n }\n this.cdr.markForCheck();\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n this.cdr.markForCheck();\n }\n\n judgeColEmpty(str: any) {\n if (str || str === 0) {\n return str;\n } else {\n return \"<空>\";\n }\n }\n\n getStateField(col: HdTableColumn): string {\n if (col.isState) {\n return col.name as string;\n }\n return col.stateField || 'state';\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\nimport { NzResizableModule } from 'ng-zorro-antd/resizable';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\nimport { NzTreeModule } from 'ng-zorro-antd/tree';\nimport { HdButtonGroupModule } from '../hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\nimport { HdStatusModule } from '../hd-status/hd-status.module';\nimport { CommonSessionService } from '../service/common-session.service';\nimport { HdTableCellPipe } from './hd-table-cell.pipe';\nimport { HdTableComponent } from './hd-table.component';\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n HdSpaceModule,\n HdStatusModule,\n HdButtonModule,\n HdButtonGroupModule,\n NzToolTipModule,\n NzPopconfirmModule,\n NzResizableModule,\n NzDropDownModule,\n NzTreeModule,\n NzIconModule\n ],\n declarations: [HdTableComponent, HdTableCellPipe],\n providers: [CommonSessionService],\n exports: [HdTableComponent],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class HdTableModule { }\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'hd-tip',\n templateUrl: './hd-tip.component.html',\n styleUrls: ['./hd-tip.component.less']\n})\nexport class HdTipComponent implements OnInit {\n @Input() showIcon: boolean = true;\n @Input() fontSize: number;\n @Input() title: string;\n constructor() { }\n\n ngOnInit() {\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdTipComponent } from './hd-tip.component';\nimport {NgZorroAntdModule} from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule\n ],\n exports: [HdTipComponent],\n declarations: [HdTipComponent]\n})\nexport class HdTipModule { }\n","import { Injectable, Optional } from \"@angular/core\";\nimport { NavigationStart, Router } from \"@angular/router\";\nimport { filter } from \"rxjs/operators\";\n\n/**\n * 全局清理 ng-zorro tooltip 残留 overlay。\n * 典型场景:hover 出 tooltip 后立刻点击跳转/打开详情,CDK overlay 未销毁,飘到下一页。\n *\n * 引入 FantasyNgzorroModule 后自动生效,也可手动注入调用 clearStuckTooltips()。\n */\n@Injectable({ providedIn: \"root\" })\nexport class HdOverlayCleanupService {\n private started = false;\n\n constructor(@Optional() private router: Router) {\n this.start();\n }\n\n /** 启动全局监听(幂等) */\n start(): void {\n if (this.started || typeof document === \"undefined\") {\n return;\n }\n this.started = true;\n\n // 任意按下即清:覆盖跳路由、开抽屉/弹窗等不走 Navigation 的场景\n document.addEventListener(\n \"mousedown\",\n () => this.clearStuckTooltips(),\n true,\n );\n\n if (this.router) {\n this.router.events\n .pipe(filter((e) => e instanceof NavigationStart))\n .subscribe(() => this.clearStuckTooltips());\n }\n }\n\n /** 清理残留在 body 上的 ant-tooltip overlay */\n clearStuckTooltips(): void {\n if (typeof document === \"undefined\") {\n return;\n }\n const tooltips = document.querySelectorAll(\n \".cdk-overlay-container .ant-tooltip\",\n );\n tooltips.forEach((el) => {\n const pane = el.closest(\".cdk-overlay-pane\") as HTMLElement | null;\n if (pane && pane.parentNode) {\n pane.parentNode.removeChild(pane);\n }\n });\n }\n}\n","import { HdButtonGroupModule } from './hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from './hd-button/hd-button.module';\n\nimport { HdDetailFormModule } from './hd-detail-form/hd-detail-form.module';\nimport { HdDetailLinesModule } from './hd-detail-lines/hd-detail-lines.module';\nimport { HdDetailLinesPageModule } from './hd-detail-lines-page/hd-detail-lines-page.module';\nimport { HdDetailTipModule } from './hd-detail-tip/hd-detail-tip.module';\n\nimport { HdFilterModule } from './hd-filter/hd-filter.module';\nimport { HdFormLinesModule } from './hd-form-lines/hd-form-lines.module';\nimport { HdFormModule } from './hd-form/hd-form.module';\n\nimport { NgModule } from '@angular/core';\nimport { HdCurrentTableModule } from './hd-current-table/hd-current-table.module';\nimport { HdLogModule } from './hd-log/hd-log.module';\nimport { HdPopconfirmModule } from './hd-popconfirm/hd-popconfirm.module';\nimport { HdSpaceModule } from './hd-space/hd-space.module';\nimport { HdStatusModule } from './hd-status/hd-status.module';\nimport { HdTableModule } from './hd-table/hd-table.module';\nimport { HdTipModule } from './hd-tip/hd-tip.module';\nimport { HdOverlayCleanupService } from './service/hd-overlay-cleanup.service';\n@NgModule({\n exports: [\n HdButtonModule,\n HdButtonGroupModule,\n\n HdDetailFormModule,\n HdDetailLinesModule,\n HdDetailLinesPageModule,\n HdDetailTipModule,\n\n HdFilterModule,\n HdFormModule,\n HdFormLinesModule,\n\n HdSpaceModule,\n HdStatusModule,\n HdCurrentTableModule,\n HdTableModule,\n HdTipModule,\n HdPopconfirmModule,\n HdLogModule\n ]\n})\n\nexport class HdComponentModule {\n // 单独引入 HdComponentModule 时也启动全局 tooltip 清理\n constructor(_overlayCleanup: HdOverlayCleanupService) {}\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdComponentModule } from \"./hd-component.module\";\nimport { HdLogComponent } from './hd-log/hd-log.component';\nimport { HdOverlayCleanupService } from './service/hd-overlay-cleanup.service';\n@NgModule({\n imports: [CommonModule],\n exports: [HdComponentModule],\n providers: [],\n entryComponents: [HdLogComponent]\n})\nexport class FantasyNgzorroModule {\n // 注入以启动全局 tooltip overlay 清理(providedIn: root,幂等)\n constructor(_overlayCleanup: HdOverlayCleanupService) {}\n}\n","import { HdOption } from \"../model/common-type\";\n\n// 表格行\nexport class TableColumn {\n label: string; // 文本\n name: string; // 字段名称\n value?: string | boolean | Array<string | Date> | null = null; // 值 不传默认为null\n selectList?: Array<HdOption>; // 控件为Select时,选项列表\n // 组件内部成员\n show?: boolean;\n}\n\n//\nexport class TableTotalOption {\n columnNumber: number; // 总列数\n insertIndex: number; // 插入下标\n insertName: string; // 插入字段\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdDetailFormService {\n\n constructor() { }\n\n}\n","export class TotalOption {\n insertIndex: number; // 插入下标\n insertValue: any; // 插入值\n align?: string; // 靠左还是靠右\n showDecimal?: boolean; // 是否显示小数位\n isHide?: boolean; // 是否隐藏, 这里只针对列会同步消失的场景\n}\n","import { Injectable } from '@angular/core';\nimport { SelectOption, CascaderOption, InputNumber } from '../model/common-type';\n\n// 控件列表\nexport class Filter {\n type: FilterListType;\n label: string; // 文本\n name: string; // 字段名称\n placeholder?: string; // 输入框提示文案\n value?: string | boolean | number | Array<string | Date> | null = null; // 值 不传默认为null\n // 组件内部成员\n show?: boolean;\n selectOption?: SelectOption; // 控件为Select时,选项列表\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onBlurEvent?: Function; // 控件失去焦点事件\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n showTime?: boolean = false; // 日期选择器是否包含时间\n require?: boolean = false; // 是否必填\n cascaderOption?: CascaderOption; // 级联选择器配置\n onChangeEventDebounceTime?: number; // change事件防抖\n onSearchEventEventDebounceTime?: number; // search事件防抖\n}\n\n\n// 控件类型\nexport enum FilterListType {\n Input, // 输入框\n Select, // 单项选择器\n Date, // 单个日期选择\n DateRange, // 日期范围选择\n MultipleSelect, // 多选\n Cascader, // 级联选择\n Month, // 月份选择\n InputNumber // 数字输入\n}\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdFilterService {\n\n constructor() {\n }\n\n}\n","import { FormItem } from './hd-form/hd-form.service';\nimport { round } from 'lodash';\n// 工具类\nexport const Utils = {\n /**\n * 填充select控件选项\n * @param formList 入参数组 Array<any>\n * @param name 需要填充options的属性名称\n * @param options 选项列表\n */\n fillSelectOption(formList: Array<any>, name: string, options: Array<any>) {\n const returnData = formList;\n if (!returnData || !returnData.length) {\n return returnData;\n }\n const length = formList.length;\n for (let i = 0; i < length; i++) {\n if (returnData[i].name === name) {\n returnData[i].selectOption.selectList = options;\n }\n }\n return returnData;\n },\n\n /**\n * 填充FormItem数组:针对入参list的每一个FormItem,判断obj中是否有对应的name字段,如果有,则填充value。\n * @param list 入参数组 Array<FormItem>\n * @param obj 需要填充到list的属性\n */\n fillArrayFormItem(list: Array<FormItem>, obj: Object) {\n const returnData = [];\n if (!list || !list.length) {\n return returnData;\n }\n const length = list.length;\n for (let i = 0; i < length; i++) {\n if (obj[list[i].name]) {\n list[i].value = obj[list[i].name];\n }\n }\n return list;\n },\n\n /**\n * 数组转换成选择器的选项数组\n * @param list 入参数组 字符串数组或对象数组\n * @param option 转换选项\n * 注:list为字符串数组,option不需要传,按照标准的label、value转换\n */\n arrayToSelectOptionList(list: Array<any>, option?: {\n value: string,\n label: string,\n valueTip?: string,\n labelTip?: string\n }) {\n const returnData = [];\n if (!list || !list.length) {\n return returnData;\n }\n if (option) {\n if (option.labelTip && option.valueTip) {\n list.forEach((item) => {\n const returnItem: any = item;\n returnItem.label = item[option.label];\n returnItem.value = item[option.value];\n if (option.valueTip) {\n returnItem[option.valueTip] = item[option.value];\n }\n if (option.labelTip) {\n returnItem[option.labelTip] = item[option.label];\n }\n returnData.push(returnItem);\n });\n } else {\n list.forEach((item) => {\n const returnItem: any = item;\n returnItem.label = item[option.label];\n returnItem.value = item[option.value];\n returnData.push(returnItem);\n });\n }\n } else {\n list.forEach((item) => {\n const returnItem: any = {};\n returnItem.label = item;\n returnItem.value = item;\n returnData.push(returnItem);\n });\n }\n return returnData;\n },\n\n /**\n * 求和\n * @param nums 数组\n * @param precision 精度\n */\n add(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n let result = 0;\n for (const num of nums) {\n result += num;\n }\n return round(result, precision);\n },\n\n /**\n * 减法\n * @param nums 数组\n * @param precision 精度\n */\n subtract(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n if (nums.length < 2) {\n throw new Error('减法入参数量至少要2个!');\n }\n let result = nums.shift();\n for (const num of nums) {\n result -= num;\n }\n return round(result, precision);\n },\n\n /**\n * 乘法\n * @param nums 数组\n * @param precision 精度\n */\n multiply(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n let result = 1;\n for (const num of nums) {\n result = result * num;\n }\n return round(result, precision);\n },\n\n /**\n * 除法\n * @param nums 数组\n * @param precision 精度\n */\n divide(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n if (nums.length < 2) {\n throw new Error('除法入参数量至少要2个!');\n }\n let result = nums.shift();\n for (const num of nums) {\n if (num === 0) {\n throw new Error('除数不能为0!');\n }\n result = result / num;\n }\n return round(result, precision);\n }\n};\n","export const StaticConst = {\n MaxPageSize: 99999999\n};\n"]}
|