fantasy-ngzorro 2.2.38 → 2.2.39
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/README.md +1 -0
- package/bundles/fantasy-ngzorro.umd.js +128 -48
- package/bundles/fantasy-ngzorro.umd.js.map +1 -1
- package/bundles/fantasy-ngzorro.umd.min.js +1 -1
- package/bundles/fantasy-ngzorro.umd.min.js.map +1 -1
- package/esm2015/hd-table/hd-table.component.js +107 -39
- package/esm5/hd-table/hd-table.component.js +129 -49
- package/fantasy-ngzorro.metadata.json +1 -1
- package/fesm2015/fantasy-ngzorro.js +106 -38
- package/fesm2015/fantasy-ngzorro.js.map +1 -1
- package/fesm5/fantasy-ngzorro.js +128 -48
- package/fesm5/fantasy-ngzorro.js.map +1 -1
- package/hd-table/hd-table.component.d.ts +12 -7
- package/package.json +2 -2
|
@@ -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.service.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/utils/hd-table-scroll.util.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.service.ts","ng://fantasy-ngzorro/hd-form/hd-form.service.ts","ng://fantasy-ngzorro/utils/cascader.util.ts","ng://fantasy-ngzorro/hd-filter/hd-filter-scheme.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.component.ts","ng://fantasy-ngzorro/hd-form/hd-form.component.ts","ng://fantasy-ngzorro/hd-form/hd-form.module.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.module.ts","ng://fantasy-ngzorro/service/common-session.service.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-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/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/hd-accessory-list/hd-accessory-list.component.ts","ng://fantasy-ngzorro/hd-accessory-list/hd-accessory-list.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-accessory-list/hd-accessory-list.service.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.service.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.service.ts","ng://fantasy-ngzorro/model/staticConst.ts","ng://fantasy-ngzorro/utils.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","Text","Accessory","HdDetailFormService","HdDetailFormComponent","formCols","Array","nzColumn","imageClick","HdDetailFormFieldType","previewVisible","previewImagePath","previewTitle","previewImages","previewIndex","imageListCache","Map","displayListCache","filter","item","hide","refreshImageCache","ngOnChanges","changes","JSON","stringify","currentValue","previousValue","isAccessory","col","_this","clear","forEach","set","parseImageList","list","isArray","result","path","url","address","name","fileName","String","getImageList","has","get","hasImages","getDisplayImages","display","slice","getMoreCount","total","getImagePath","image","trackByImage","index","onImageClick","event","preventDefault","stopPropagation","applyPreviewImage","setTimeout","previewPrev","canPreviewPrev","previewNext","canPreviewNext","closePreview","getColSpan","width","Number","isNaN","Math","floor","triggerEvent","fn","onEditClick","edit","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","getTableViewportWidth","nzTable","hostClass","tableMainElement","tableMain","scrollBody","querySelector","clientWidth","wrapper","closest","host","measureElementNaturalWidth","element","clone","cloneNode","position","left","top","visibility","tableLayout","document","body","appendChild","scrollWidth","removeChild","measureHeaderDeclaredColWidth","ths","from","querySelectorAll","sum","hasFluidCol","th","declared","parsed","parseInt","replace","parsePx","offsetWidth","measureTableColWidth","reduce","table","viewportWidth","headerTable","bodyTable","getTableScrollXViewportWidth","resolveAutoTableScroll","hasData","colWidth","x","ceil","window","innerWidth","getNzTableScrollElements","header","nz","main","bindNzTableHeaderBodyScrollSync","els","onScroll","scrollLeft","addEventListener","removeEventListener","HdDetailLinesComponent","cdr","showSelected","allowDrop","showSearch","searchFields","scroll","tableScroll","selectField","selectEvent","showTotal","totalOption","columnsNumber","hdFrontPagination","totalOptionList","tableData","Page","tableLoading","tablePageIndex","tablePageSize","isAllDisplayDataChecked","isIndeterminate","listOfDisplayData","listOfAllData","mapOfCheckedId","mapOfCheckList","displayLines","isFilterData","storeFormLinesData","showTable","unbindBodyScroll","syncStoreFromLinesInput","applyDisplayFromStore","countSelected","calculateTotal","ngAfterViewInit","scheduleSyncHorizontalScroll","ngOnDestroy","unbindHeaderBodyScrollSync","lines","retry","syncHorizontalScroll","bindHeaderBodyScrollSync","afterX","effectiveScroll","nzTableComponent","nextScroll","nextX","y","prevHasY","remountTable","markForCheck","unbind","source","data","parse","restoreFromStore","searchLines","filterStr","trim","filterValue","toLowerCase","filteredData","_c","tslib_1.__values","keys","_d","toString","includes","_e","_f","selectedField","isSelectDisabled","round","drop","moveItemInArray","previousIndex","currentIndex","fill","insertIndex","insertValue","align","showDecimal","preserveNumber","isHide","currentPageDataChange","$event","refreshStatus","resetStatus","selectableList","every","some","values","checkAll","selectDisabledField","isInvalidRow","rowInvalidField","ChangeDetectorRef","ViewChild","HdDetailLinesModule","NzTableModule","DragDropModule","schemas","NO_ERRORS_SCHEMA","HdDetailLinesPageComponent","virtualScroll","tablePageIndexChange","tablePageSizeChange","pageChange","isCrossPageSelectLocal","measuredVirtualItemSize","virtualScrollActive","virtualTrackByRow","virtualItemSize","rowCount","base","estimatedHeight","effectiveVirtualItemSize","innerHeight","needsVerticalScroll","useVirtualScroll","getAutoScrollY","isCrossPageSelect","applyTableScrollMode","forceRemount","useVirtual","modeChanged","afterTableRender","refreshVirtualScrollViewport","forceMeasure","measureVirtualItemSize","viewport","cdkVirtualScrollViewport","checkViewportSize","force","elementRef","nativeElement","row","offsetHeight","resolvedScroll","nextY","nextHasY","getRowIndex","localIndex","onPageIndexChange","pageIndex","onPageSizeChange","HdDetailLinesPageModule","statusToColor","#FAB13B","#9FA4A2","#F5222D","#3B77E3","#20B95D","#F05B24","HdDetailTipComponent","HdStatusService","tip","setStatusColor","findKey","state","indexOf","toUpperCase","statusColor","HdDetailTipModule","inputNumber","showTime","require","Select","Date","DateRange","MultipleSelect","Cascader","Month","HdFilterService","totalWidth","isRowFirst","hdShowToday","ValidatorKey","TextArea","ViewDom","Switch","Time","Radio","Checkbox","RegionAddress","HdFormService","cascaderPinyinFilter","inputValue","pinyinField","keyword","label","pinyin","getCascaderShowSearch","cascaderOption","getCascaderMenuClassName","custom","menuClassName","HD_CASCADER_MENU_CLASS","getCascaderMenuStyle","menuStyle","dropdownMinWidth","minWidthCss","HD_FILTER_SCHEME_STORE","InjectionToken","HdFilterComponent","fb","schemeStore","enableFilterScheme","hidePadding","searchEvent","resetEvent","isShowMore","filterListModular","searchSubject","Subject","debounceTimeout","openChangeSubject","openChangeDebounceTimeout","defaultFilterValues","defaultValuesCaptured","schemeList","currentScheme","currentSchemeName","schemeLoading","schemeSaving","switchModalVisible","switchFormList","saveAsModalVisible","saveAsFormList","defaultSchemeName","switchDefaultKey","searchSubscription","pipe","debounceTime","subscribe","_a","selectOption","openChangeSubscription","init","tryLoadSchemes","enableLater","firstChange","keyLater","unsubscribe","schemeLoadSub","schemeActionSub","filterSchemeKey","checkList","filterList","formGroupList","control","normalizeFilterControlValue","show","validateFilterForm","group","clonePlain","getFilterData","onChangeEvent","onChangeEventDebounceTime","valueChanges","onSearchEvent","onSearchEventDebounceTime","onOpenChangeEvent","open","onOpenChangeEventDebounceTime","clearSelectOptionsOnOpen","debounceMs","opt","selectList","getVisibleFilterCount","getFilterColSpan","computeOffset","visibleCount","modular","nameList","tslib_1.__spread","Set","submitForm","getRawValue","resetForm","resetFilterFormWithValue","resetValue","patchValue","showMore","inputClean","patchObject","isAllowClear","applyDefault","canUseScheme","queryByFilterKey","applySchemeByName","uuid","found","find","templateName","err","showError","getDisplaySchemeList","fromDb","filterKey","openSwitchModal","current","buildSwitchFormList","getSwitchOptionKey","closeSwitchModal","switchFormChangeEvent","form","switchValidateForm","selectedKey","map","FormListType","placeholder","confirmSwitch","valid","schemeKey","applyScheme","isDefaultScheme","canDeleteCurrent","saveCurrentScheme","serializeFilterValue","save","saved","showSuccess","refreshSchemeListKeepCurrent","openSaveAsModal","buildSaveAsFormList","closeSaveAsModal","saveAsFormChangeEvent","saveAsValidateForm","maxLength","confirmSaveAs","deleteCurrentScheme","delete","emitSearch","scheme","patchFilterValues","patch","reviveFilterValue","FilterListType","v","parseDateLike","test","getTime","obj","msg","hdMessageService","success","console","FormBuilder","HdFilterSchemeStore","Optional","Inject","HdFormComponent","changeEvent","inputNumberDefaultFormatter","inputNumberDefaultParser","formList","validateHdForm","formItem","dealRow","year","month","day","newDateStr","toLocaleDateString","validator","Validators","required","formItemDate","checkboxOption","checkboxValue","regionValue","addressValue","requireValidators","addressName","onHdFormValueChanged","formListLength","j","columnItems","space","options","getRegionAddressValidateStatus","region","invalidDirty","dirty","invalid","getRegionAddressErrorTip","hasError","validatorKeys","controls","markAsDirty","updateValueAndValidity","isCheckboxChecked","onCheckboxItemChange","checked","splice","setValue","HdFormModule","HdFilterModule","CommonSessionService","putSession","session_key","session","sessionStorage","setItem","removeItem","getSession","getItem","removeSession","hideViewDomValue","isShow","canSearch","ColorOption","ExplainOption","cols","HdFormLinesService","HdFormLinesComponent","commonSessionService","showLineNumber","allowEmpty","deleteLastLineEvent","showKeyboardOperateTip","enableKeyboardOperate","showCheckbox","showColSettings","operateButtons","addLineEvent","selectionChange","showDeleteConfirm","paginationPageIndex","paginationPageSize","showForm","filterStoreFormLinesData","filterIndexStore","formValid","selectedRowIds","collectDomList","activeDomX","activeDomY","activeDom","activeSelectedComponentOpen","isDropdownVisible","showListNodes","nowListNodes","hideListNodes","cancelNowListNodes","cancelHideListNodes","formLinesCacheOption","FormLinesCacheOption","localforage","localtionTmp","colsCacheLoaded","deleteLineEvent","textWidthCache","localforage.createInstance","driver","localforage.INDEXEDDB","version","storeName","line","location","pathname","userSession","userCode","formLinesData","initColSettings","collectDomData","formInputDomListSub","formInputDomList","linesFormArray","count","btn","buttons","generateRowId","now","random","getRowId","getCurrentPageLines","start","end","isLineChecked","id","isAllChecked","pageLines","checkedCount","onAllChecked","emitSelectionChange","onLineCheckedChange","getSelectedLines","removeLineFromSelection","applyValuesToLine","emitEvent","addControl","markAsPristine","onlySelf","markAsUntouched","formLines","detectChanges","getControlValidateStatus","empty","undefined","touched","limitInputLength","input","getSelectedLinesData","mountedById","_hdRowId","batchFillSelected","storeItem","clearSelection","getSelectedCount","formLinesLeftButton","formLinesRightButton","showColSettingsButton","getConfigurableFormLines","isColumnVisible","FormLineType","getCacheKey","ready","then","setCols","catch","log","hasColsCache","saveFormLinesCacheOption","sortNodesByFormLinesOrder","nodes","order","f","sort","a","b","configurable","hasCache","node","title","cancelDropdown","confirmDropdown","submitGrids","visibleNames","checkAction","origin","temporaryNodeList_1","innerItem","setActiveSelectedComponentOpen","domList","dom","remove","oldIndex","getOldDomIndex","insertBefore","createDOMStructure","firstChild","getSelectTableColumnStyle","column","hdOptionHeader","createElement","className","paddingLeft","SELECT_TABLE_OPTION_HORIZONTAL_PADDING","paddingRight","tableColumns","selectOptionTableColumn","columnDiv","widthStyle","labelText","createTextNode","pageDomList","toArray","startIndex","endIndex","pageLinesLength","formLinesLength","interval","disableInputNumberKeyboardStep","this_1","NzInputNumberComponent","onKeyDown","keyCode","setValidateValue","jumpToNextInput","NzSelectComponent","focusDom","addNewLineAndFocus","addFormLine","jumpToPrevInput","jumpDirection","cleanFocusDom","dom_1","nzDisabled","nzSelectTopControlComponent","inputElement","scrollIntoView","behavior","block","inline","nzSelectService","mode","focus","inputDom_1","getElementById","nzId","select","ElementRef","NzDatePickerComponent","NzRangePickerComponent","NzTimePickerComponent","setActiveDom","blur","nzOpen","setActiveDomInFormLines","rowNumber","colNumber","getDomIndex","nowActiveDom_1","typeList","validateHdFormLines","getValid","selectListName","innerGetValid","tmpValidateHdFormLines","array","formLinesDataItem","formGroupObj","judgeValueIsNotEmpty","lineIndex","formGroupTmp","insert","getLines","allLines","setStoreData","_b","getStyle","styleObj","min-width","colorOption","color","isEdit","createForm","addFormLineWithData","isTrulyEmptyAllowed","newLine","newLineItem","delayJumpToNextInput","createLineFromValues","isEmptyLine","regenerateRowId","rowId","isHdFormLineSearchAdd","formGroupSubmit","handleChange","calculateLineNumber","afterLine","isFocus","insertAt","getInsertIndexAfter","markSearchAddedLine","toPageLocalRowIndex","copyFormLine","sourceIndex","sourceValues","copiedLine","deleteFormLine","lineOrIndex","removeAt","removedLine","at","maxPage","flag","idx","globalIndex","pageIndexChange","pageSizeChange","lines_1","getNowLines","addIndex","addedLine","flagCtrl","deletedIndex_1","filterIndex_1","pop","selectOptionCheckList","selectValue","isTextOverflow","text","maxWidth","cachedWidth","span","whiteSpace","fontSize","innerText","isOverflow","judgeColEmpty","str","ViewChildren","HdFormLinesModule","providers","HdCurrentTableComponent","showTableTotal","tableSearchEvent","tableTotalOptionList","search","selectedList","HdCurrentTableModule","HdLogComponent","HdLogService","modalService","showLogs","logs","create","nzTitle","nzContent","nzComponentParams","nzFooter","nzWidth","NzModalService","HdLogModule","entryComponents","HdPopconfirmComponent","confirmOption","cancelOption","cancel","confirm","HdPopconfirmModule","bootstrap","STATUS_COLOR_MAP","HdStatusComponent","statusLower","status","HdStatusModule","ColWidth","tableImageColWidth","tableTwoImageColWidth","billNumberColWidth","nameColWidth","codeColWidth","codeNameColWidth","enumColWidth","dateColWidth","dateTimeColWidth","dateRangeWidth","operateColWidth","numberColWidth","remarkColWidth","fixColWidth","maxColWidth","HdTableCellPipe","transform","isEmpty","overflow","raw","render","getHdTableCellRaw","charCodeAt","estimateTextWidth","Pipe","pure","fixed","btnList","canSort","canWarp","OperateBtn","showConfirm","isRepeat","TableCacheOption","colWidths","selectable","isLeaf","expanded","fixedLayout","declaredWidth","scrollX","fluidExtra","displayTotal","isFluid","HdTableComponent","hostEl","tableCols","selectType","showOperateColWarpButton","sortEvent","cellChange","pagination","frontPagination","tablePageSizeChangeEvent","tableCacheOption","tableColsCache","selectColListNodes","selectColListNodesCache","showDetail","isFirstEntrySearchLocal","tableColWidthTotal","fluidExtraWidth","fluidHorizontal","fluidExtraTargetCol","pendingResetScrollTop","currentSortKey","currentSortValue","totalFooterScrollBoundBody","totalFooterScrollHandler","totalFooterSyncRetry","totalFooterNeedYGutter","viewportResizeTimer","boundOnViewportResize","hostResizeObserver","selectOpenChangeSubject","selectSearchSubject","lineNumberColWidth","trackByRow","trackByCol","_index","beforeDrop","arg","dragNode","pos","of","TreeGrid","dragNodeIndex","findIndex","nodeIndex","delay","unbindTotalFooterScrollSync","unbindViewportResizeSync","selectOpenChangeSubscription","selectSearchSubscription","selectLoaderSubscription","isFirstEntrySearch","bindViewportResizeSync","deleteHideItem","getInitLocalforage","calculateTableTotal","scheduleResetTableBodyScrollTop","getColSort","toggleShowDetail","getScrollYMaxOffset","tableTotal","getVisibleRowCount","useFrontPagination","maxOffset","getRightSticky","fixedRightWidth","getLeftSticky","fixedWidth","isColVisible","getColDeclaredWidth","getDeclaredColWidthTotal","getColDisplayWidth","findFluidExtraTargetCol","lastVisible","applyHorizontalLayout","layout","isTotalFooterFluid","getLineNumber","normalizeTableCacheOption","initTable","judgeRepeatCols","dealCols","dealOperateBtn","presetScrollBeforeRemount","prevHasX","dealScroll","nextHasX","flushResetTableBodyScrollTop","resetTableBodyScrollTop","scrollToOffset","scrollToIndex","viewportEl","scrollTop","mixTableBodyNativeElement","tableBodyNativeElement","tableBodyElement","el","delays","ms","tableBody","height","saveTableCacheOption","notIncols","incols","moveElementNearby","arr","elementToMoveTitle","targetElementTitle","tmpArray","targetIndex","elementIndex","newIndex","removedElement","title_1","temporaryNodeList","getHideListNodes","nodeItem","minWidth","leftFixedCols","rightFixedCols","normalCols","resultCols","colWidths_1","onResize","tempWidth","syncTotalFooterWithBody","operateCol","textStr_1","needShowConfirm","getBtnName","isDangerBtn","getVirtualScrollY","resolveHorizontalLayout","declaredColWidth","compareWidth","fillWidth","containerWidth","fluidLayout","syncHeaderBodyScrollLeft","getTableBodyScrollEl","mix","getTotalFooterScrollEl","bodyHasVerticalScrollbar","scrollHeight","clientHeight","footer","needYGutter","syncTotalFooterScrollLeft","bindTotalFooterScrollSync","passive","scheduleViewportScrollSync","RO","ResizeObserver","observe","disconnect","clearTimeout","leftOffset","rightOffset","tableTotalOption","visibleCols","configured","columnNumber","field_1","sum_1","hasValue_1","num","colAtIndex","getTableTotalCellMeta","colIndex","visibleIndex","meta","getTableTotalCellValue","preserve","factor","pow","toFixed","getTableTotalCellAlign","getTableTotalCount","onRadioSelect","resolveCellColor","getLinkCellColor","getPlainCellColor","getStateField","isState","stateField","hasRowNo","rowNo","getRowNoText","page","rowIndex","getTitleParts","split","join","isEditable","hasInlineEdit","editable","editType","warn","isEditDisabled","editDisabled","getSelectList","getSelectOptionLabel","getInputNumberProp","fallback","val","isDateShowTime","dateOption","isDateShowToday","showToday","getDateFormat","isRange","format","getDisabledDate","disabledDate","getRangePlaceholder","rangePlaceholder","onCellChange","onSelectOpenChange","cb","handleSelectLoaderResult","onSelectSearch","onSearchEventEventDebounceTime","kw","applySelectOptions","onSelectChange","labelField","previousLabel","previousOption","changeDetection","ChangeDetectionStrategy","OnPush","HdTableModule","NzToolTipModule","NzPopconfirmModule","NzResizableModule","NzDropDownModule","NzTreeModule","NzIconModule","HdTipComponent","showIcon","showCollapse","expandedChange","expand","setExpanded","collapse","toggle","HdTipModule","HdAccessoryListComponent","groups","labelColon","autoOpen","fileClick","trackByGroup","trackByFile","file","getFilePath","getFileName","getFileSizeText","bytes","getLabelText","onFileClick","HdAccessoryListModule","HdOverlayCleanupService","router","started","clearStuckTooltips","events","NavigationStart","pane","parentNode","Router","HdComponentModule","_overlayCleanup","FantasyNgzorroModule","accessoryList","TotalOption","Utils","fillSelectOption","returnData","fillArrayFormItem","arrayToSelectOptionList","labelTip","valueTip","returnItem","nums","Error","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,+wKAICC,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,82LAMCsC,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,MCKEC,KAAO,OAEPC,UAAY,aAUd,IAAAC,EAAA,WAIE,SAAAA,gCAJDvB,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,wJADd,GCAAuB,EAAA,WAwCE,SAAAA,IAlCSpF,KAAAqF,SAA4B,IAAIC,MAEhCtF,KAAAuF,SASD,EAGEvF,KAAAwF,WAAa,IAAInB,EAAAA,aAM3BrE,KAAAyF,sBAAwBA,EAGxBzF,KAAA0F,gBAAiB,EACjB1F,KAAA2F,iBAAmB,GACnB3F,KAAA4F,aAAe,OAEf5F,KAAA6F,cAA0C,GAC1C7F,KAAA8F,aAAe,EAGP9F,KAAA+F,eAAiB,IAAIC,IACrBhG,KAAAiG,iBAAmB,IAAID,IA2MjC,OAvME7G,OAAAyB,eAAIwE,EAAAxF,UAAA,iBAAc,KAAlB,WACE,OAAOI,KAAK8F,aAAe,mCAG7B3G,OAAAyB,eAAIwE,EAAAxF,UAAA,iBAAc,KAAlB,WACE,OAAOI,KAAK8F,aAAe9F,KAAK6F,cAAcnG,OAAS,mCAGzD0F,EAAAxF,UAAAsC,SAAA,WACMlC,KAAKqF,UAAYrF,KAAKqF,SAAS3F,OAAS,IAC1CM,KAAKqF,SAAWrF,KAAKqF,SAASa,QAAM,SAAEC,GAAS,OAACA,EAAKC,SAEvDpG,KAAKqG,qBAGPjB,EAAAxF,UAAA0G,YAAA,SAAYC,GAERA,EAAkB,UAClBC,KAAKC,UAAUF,EAAkB,SAAEG,gBACjCF,KAAKC,UAAUF,EAAkB,SAAEI,iBAEjC3G,KAAKqF,UAAYrF,KAAKqF,SAAS3F,OAAS,IAC1CM,KAAKqF,SAAWrF,KAAKqF,SAASa,QAAM,SAAEC,GAAS,OAACA,EAAKC,SAEvDpG,KAAKqG,sBAITjB,EAAAxF,UAAAgH,YAAA,SAAYC,GACV,SACEA,GACCA,EAAI9C,OAAS0B,EAAsBP,WAA0B,cAAb2B,EAAI9C,OAIjDqB,EAAAxF,UAAAyG,kBAAR,WAAA,IAAAS,EAAA9G,KACEA,KAAK+F,eAAegB,QACpB/G,KAAKiG,iBAAiBc,SACrB/G,KAAKqF,UAAY,IAAI2B,SAAO,SAAEH,GACzBC,EAAKF,YAAYC,IACnBC,EAAKf,eAAekB,IAAIJ,EAAKC,EAAKI,eAAeL,QAU/CzB,EAAAxF,UAAAsH,eAAR,SAAuBL,OACftF,EAAQsF,GAAOA,EAAItF,MACzB,GAAa,MAATA,GAA2B,KAAVA,EACnB,MAAO,OAEH4F,EAAO7B,MAAM8B,QAAQ7F,GAASA,EAAQ,CAACA,GACvC8F,EAAmC,GAkBzC,OAjBAF,EAAKH,SAAO,SAAEb,GACZ,GAAY,MAARA,GAAyB,KAATA,EAGpB,GAAoB,iBAATA,EAAX,KAIMmB,EAAOnB,EAAKmB,MAAQnB,EAAKoB,KAAOpB,EAAKqB,SAAW,GACjDF,GAGLD,EAAOxF,KAAK,CACV4F,KAAMtB,EAAKsB,MAAQtB,EAAKuB,SACxBJ,KAAMK,OAAOL,UATbD,EAAOxF,KAAK,CAAEyF,KAAMnB,OAYjBkB,GAGTjC,EAAAxF,UAAAgI,aAAA,SAAaf,GAIX,OAHK7G,KAAK+F,eAAe8B,IAAIhB,IAC3B7G,KAAK+F,eAAekB,IAAIJ,EAAK7G,KAAKkH,eAAeL,IAE5C7G,KAAK+F,eAAe+B,IAAIjB,IAAQ,IAGzCzB,EAAAxF,UAAAmI,UAAA,SAAUlB,GACR,OAAO7G,KAAK4H,aAAaf,GAAKnH,OAAS,GAIzC0F,EAAAxF,UAAAoI,iBAAA,SAAiBnB,GACf,GAAI7G,KAAKiG,iBAAiB4B,IAAIhB,GAC5B,OAAO7G,KAAKiG,iBAAiB6B,IAAIjB,OAE7BoB,EAAUjI,KAAK4H,aAAaf,GAAKqB,MAAM,EAzItB,GA2IvB,OADAlI,KAAKiG,iBAAiBgB,IAAIJ,EAAKoB,GACxBA,GAIT7C,EAAAxF,UAAAuI,aAAA,SAAatB,OACLuB,EAAQpI,KAAK4H,aAAaf,GAAKnH,OACrC,OAAO0I,EAjJgB,EAiJaA,EAjJb,EAiJ0C,GAGnEhD,EAAAxF,UAAAyI,aAAA,SAAaC,GACX,OAAQA,IAAUA,EAAMhB,MAAQgB,EAAMf,MAAS,IAGjDnC,EAAAxF,UAAA2I,aAAA,SAAaC,EAAeF,GAC1B,OAAQA,IAAUA,EAAMhB,MAAQgB,EAAMf,MAASI,OAAOa,IAGxDpD,EAAAxF,UAAA6I,aAAA,SACE5B,EACAyB,EACAE,EACAE,GAJF,IAAA5B,EAAA9G,KAMM0I,IACFA,EAAMC,iBACND,EAAME,uBAEFtB,EAAOtH,KAAKqI,aAAaC,GAC/BtI,KAAKwF,WAAWb,KAAK,CAAE2D,MAAKA,EAAEhB,KAAIA,EAAEkB,MAAKA,IACpClB,IAGLtH,KAAK6F,cAAgB7F,KAAK4H,aAAaf,GAAKqB,QAC5ClI,KAAK8F,aAAe0C,GAAS,EAAIA,EAAQ,EACzCxI,KAAK6I,oBACLC,YAAU,WACRhC,EAAKpB,gBAAiB,OAI1BN,EAAAxF,UAAAmJ,YAAA,SAAYL,GACNA,IACFA,EAAMC,iBACND,EAAME,mBAEH5I,KAAKgJ,iBAGVhJ,KAAK8F,cAAgB,EACrB9F,KAAK6I,sBAGPzD,EAAAxF,UAAAqJ,YAAA,SAAYP,GACNA,IACFA,EAAMC,iBACND,EAAME,mBAEH5I,KAAKkJ,iBAGVlJ,KAAK8F,cAAgB,EACrB9F,KAAK6I,sBAGCzD,EAAAxF,UAAAiJ,kBAAR,eACQP,EAAQtI,KAAK6F,cAAc7F,KAAK8F,cAChCwB,EAAOtH,KAAKqI,aAAaC,GAC/BtI,KAAK2F,iBAAmB2B,EACxBtH,KAAK4F,aACF0C,GAASA,EAAMb,MAAS,MAAQzH,KAAK8F,aAAe,IAGzDV,EAAAxF,UAAAuJ,aAAA,WACEnJ,KAAK0F,gBAAiB,EACtB1F,KAAK6F,cAAgB,GACrB7F,KAAK8F,aAAe,EACpB9F,KAAK2F,iBAAmB,IAI1BP,EAAAxF,UAAAwJ,WAAA,SAAWvC,OACHwC,EAAQxC,GAAoB,MAAbA,EAAIwC,MAAgBC,OAAOzC,EAAIwC,OAAS,EAC7D,OAAKA,GAASA,EAAQ,GAAKE,MAAMF,GACxB,EAEFA,EAAQ,EAAI,EAAIG,KAAKC,MAAMJ,IAGpCjE,EAAAxF,UAAA8J,aAAA,SAAaC,GACPA,GACFA,EAAGjB,QAKPtD,EAAAxF,UAAAgK,YAAA,SAAYlB,EAAc7B,GACpB6B,IACFA,EAAMC,iBACND,EAAME,mBAEJ/B,GAAOA,EAAIgD,MACbhD,EAAIgD,KAAKhD,wBA9Od1E,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,iBACVC,SAAA,+2ZAICsC,EAAAA,wBAEAA,EAAAA,0BAYAC,EAAAA,UA6NHO,EAjPA,GCjBA,IAAA0E,EAAA,WAKA,SAAAA,KAKiC,2BALhCpH,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CAACC,EAAAA,aAAcE,EAAAA,mBACxBE,QAAS,CAACoC,GACVrC,aAAc,CAACqC,OAEgB0E,EAVjC,KCGQ,MAIRC,EAAA,cAMA,WAKE,SAAAC,yBALDpG,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,sJADd,GAAA,ICbAoG,EAAA,WAeE,SAAAA,IANSjK,KAAA+D,KAAkBmG,EAElBlK,KAAAmK,WAAqB,UAE9BnK,KAAAoK,MAAe,IAAIL,EAerB,OAXEE,EAAArK,UAAAsC,SAAA,WACElC,KAAKoK,MAAkB,WAAIpK,KAAKmK,WAC7BnK,KAAK+D,OAASmG,GACflK,KAAKoK,MAAa,MAAI,OACtBpK,KAAKoK,MAAc,OAAIpK,KAAKiE,KAAO,OAEnCjE,KAAKoK,MAAc,OAAI,OACvBpK,KAAKoK,MAAa,MAAIpK,KAAKiE,KAAO,2BArBvC9B,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,WACVC,SAAA,qJAICsC,EAAAA,oBACAA,EAAAA,0BACAA,EAAAA,SAiBHqF,EA5BA,GCAA,IAAAI,EAAA,WAMA,SAAAA,KAU6B,2BAV5B3H,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAyH,EAAAA,oBACAxH,EAAAA,mBAEFC,aAAc,CAACkH,GACfjH,QAAS,CAACiH,OAEiBI,EAhB7B,KCAA,WACErK,KAAAuK,WAAa,EACbvK,KAAAwK,cAAgB,EAChBxK,KAAAyK,WAAa,EACbzK,KAAA0K,SAAW,GACX1K,KAAA2K,YAAa,EACb3K,KAAA4K,SAAU,EACV5K,KAAA6K,QAAoB,IAGtB,IAAAC,EAAA,aAwBA,IAAAC,EAAA,WAKE/K,KAAAgL,mBAA8B,EAC9BhL,KAAAiL,4BAAuC,EACvCjL,KAAAkL,gBAA2B,EAC3BlL,KAAAmL,gBAA2B,EAE3BnL,KAAAoL,cAAyB,EACzBpL,KAAAqL,cAAyB,GAG3B,IAAAC,EAAA,WAIEtL,KAAAgL,mBAA8B,GAGhC,IAAAO,EAAA,WAIEvL,KAAAgL,mBAA8B,GAGhC,IAAAQ,EAAA,aAQA,IAAAC,EAAA,aAKA,IAAAC,EAAA,WACE1L,KAAA2L,IAAe,EACf3L,KAAA4L,IAAe,SACf5L,KAAA6L,KAAgB,EAChB7L,KAAA8L,UAAqB,GAUvB,IAAAC,EAAA,aChFA,SAAgBC,EACdC,EACAC,GAEA,QAFA,IAAAA,IAAAA,EAAA,uBAEKD,IAAYA,EAAQE,iBACvB,OAAO,MAEHC,EAAYH,EAAQE,iBAA8B,cAClDE,EAAaD,EAAUE,cAC3B,mBAEF,GAAID,GAAcA,EAAWE,YAAc,EACzC,OAAOF,EAAWE,gBAEdC,EAAUJ,EAAUK,QAAQ,sBAClC,GAAID,GAAWA,EAAQD,YAAc,EACnC,OAAOC,EAAQD,gBAEXG,EAAON,EAAUK,QAAQ,IAAIP,GACnC,OAAIQ,GAAQA,EAAKH,YAAc,EACtBG,EAAKH,YAEP,EAYT,SAASI,EAA2BC,OAC5BC,EAAQD,EAAQE,WAAU,GAChCD,EAAMzC,MAAM2C,SAAW,WACvBF,EAAMzC,MAAM4C,KAAO,WACnBH,EAAMzC,MAAM6C,IAAM,IAClBJ,EAAMzC,MAAM8C,WAAa,SACzBL,EAAMzC,MAAMf,MAAQ,cACpBwD,EAAMzC,MAAM+C,YAAc,OAC1BC,SAASC,KAAKC,YAAYT,OACpBxD,EAAQwD,EAAMU,YAEpB,OADAH,SAASC,KAAKG,YAAYX,GACnBxD,EAIT,SAASoE,EAA8BrB,OAC/BsB,EAAMpI,MAAMqI,KAChBvB,EAAUwB,iBAAiB,+BAE7B,IAAKF,EAAIhO,OACP,OAAO,MAELmO,EAAM,EACNC,GAAc,EAUlB,OATAJ,EAAI1G,SAAO,SAAE+G,OACLC,EAlCV,SAAiBzM,GACf,IAAKA,EACH,OAAO,MAEH0M,EAASC,SAASvG,OAAOpG,GAAO4M,QAAQ,MAAO,IAAK,IAC1D,OAAO7E,OAAOC,MAAM0E,GAAU,EAAIA,EA6BfG,CAAQL,EAAG3D,MAAMf,OAC9B2E,EAAW,EACbH,GAAOG,GAGTF,GAAc,EACdD,GAAOE,EAAGR,aAAeQ,EAAGM,aAnEA,QAqEvBP,EAAc,EAAID,EAG3B,SAAgBS,EAAqBrC,GACnC,IAAKA,IAAYA,EAAQE,iBACvB,OAAO,MAEHC,EAAYH,EAAQE,iBAA8B,cAOpDP,EANWtG,MAAMqI,KACnBvB,EAAUwB,iBACR,8FAIaW,QAAM,SACpBlF,EAAOmF,GAAU,OAAAhF,KAAKoC,IAAIvC,EAAOmF,EAAMjB,aAAe,KACvD,GAGIkB,EAAgBzC,EAAsBC,GAE5C,GAAIwC,GAAiB,GAAK7C,GAAO6C,EAAe,KACxCC,EAActC,EAAUE,cAC5B,2BAEIqC,EAAYvC,EAAUE,cAC1B,yBAEEoC,IACF9C,EAAMpC,KAAKoC,IAAIA,EAAKe,EAA2B+B,KAE7CC,IACF/C,EAAMpC,KAAKoC,IAAIA,EAAKe,EAA2BgC,KAEjD/C,EAAMpC,KAAKoC,IAAIA,EAAK6B,EAA8BrB,IAGpD,OAAOR,EAQT,SAAgBgD,GACd3C,EACAC,GAEA,QAFA,IAAAA,IAAAA,EAAA,uBAEKD,IAAYA,EAAQE,iBACvB,OAAO,MAEHC,EAAYH,EAAQE,iBAA8B,cAClDE,EACHD,EAAUE,cACT,+CAEDF,EAAUE,cAAc,mBAC3B,OAAID,GAAcA,EAAWgC,YAAc,EAClChC,EAAWgC,YAEbrC,EAAsBC,EAASC,GAOxC,SAAgB2C,GACd5C,EACA6C,EACAC,GAEA,IAAKD,EACH,OAAO,SAEHzF,EACQ,MAAZ0F,GAAoBA,EAAW,EAC3BA,EACAT,EAAqBrC,GAC3B,GAAI5C,GAAS,EACX,OAAO,SAEHoF,EAAgBG,GAA6B3C,GACnD,OAAIwC,EAAgB,EAEXpF,EAAQoF,EAAgB,EAAI,CAAEO,EAAMxF,KAAKyF,KAAK5F,GAAM,MAAS,KAEhD,oBAAX6F,QAA0B7F,EAAQ6F,OAAOC,WAAa,GACxD,CAAEH,EAAMxF,KAAKyF,KAAK5F,GAAM,MAE1B,KAIT,SAAgB+F,GACdnD,GAEA,IAAKA,EACH,MAAO,CAAEoD,OAAQ,KAAMhC,KAAM,UAEzBiC,EAAE,EACJD,EAAUC,EAA2B,0BAAoB,KACzDjC,EACDiC,EAA4B,2BAC5BA,EAAyB,wBAC1B,KACIC,EACJD,EAAGnD,kBACFmD,EAAGnD,iBAA8B,cAapC,OAZIoD,IACGF,IACHA,EAASE,EAAKjD,cAAc,sBAEzBe,IACHA,EACGkC,EAAKjD,cACJ,+CAEDiD,EAAKjD,cAAc,qBAGnB,CAAE+C,OAAMA,EAAEhC,KAAIA,GAoBvB,SAAgBmC,GACdvD,OAEMwD,EAAML,GAAyBnD,GACrC,IAAKwD,EAAIJ,SAAWI,EAAIpC,KACtB,OAAO,SAEHgC,EAASI,EAAIJ,OACbhC,EAAOoC,EAAIpC,KACXqC,EAAQ,WACRL,EAAOM,aAAetC,EAAKsC,aAC7BN,EAAOM,WAAatC,EAAKsC,aAK7B,OAFAtC,EAAKuC,iBAAiB,SAAUF,GAChCA,IACA,WACErC,EAAKwC,oBAAoB,SAAUH,sBCjJrC,SAAAI,EAAoBC,GAAA/P,KAAA+P,IAAAA,EA1DK/P,KAAAgQ,cAAwB,EACxBhQ,KAAAiQ,WAAqB,EACrBjQ,KAAAkQ,YAAsB,EAEtClQ,KAAAmQ,aAAyB,GAKzBnQ,KAAAoQ,OAAoC,CAAEpB,EAAG,OAClDhP,KAAAqQ,YAA0C,KACjCrQ,KAAAsQ,YAAsB,aAYrBtQ,KAAAuQ,YAAc,IAAIlM,EAAAA,aAMHrE,KAAAwQ,WAAqB,EACrCxQ,KAAAyQ,YAAkC,GAClCzQ,KAAA0Q,cAAiC,EACjC1Q,KAAA2Q,mBAA6B,EACtC3Q,KAAA4Q,gBAAkB,GAElB5Q,KAAA6Q,UAAuB,IAAIC,EAC3B9Q,KAAA+Q,cAAwB,EAExB/Q,KAAAgR,eAAyB,EAChBhR,KAAAiR,cAAwB,IAEjCjR,KAAAkR,yBAA0B,EAC1BlR,KAAAmR,iBAAkB,EAClBnR,KAAAoR,kBAAoB,GACpBpR,KAAAqR,cAAgB,GAEhBrR,KAAAsR,eAA6C,GAC7CtR,KAAAuR,eAAyC,GAGzCvR,KAAAwR,aAA2B,GAE3BxR,KAAAyR,cAAe,EACfzR,KAAA0R,mBAA0B,GAE1B1R,KAAA2R,WAAY,EACJ3R,KAAA4R,iBAAwC,KA4UlD,OAxUEzS,OAAAyB,eAAIkP,EAAAlQ,UAAA,kBAAe,KAAnB,WAIE,OAAsB,MAAfI,KAAKoQ,OAAiBpQ,KAAKoQ,OAASpQ,KAAKqQ,6CAGlDP,EAAAlQ,UAAAsC,SAAA,WACElC,KAAK6R,0BACL7R,KAAK8R,wBACL9R,KAAK+R,gBACL/R,KAAKgS,kBAGPlC,EAAAlQ,UAAAqS,gBAAA,WACEjS,KAAKkS,gCAGPpC,EAAAlQ,UAAAuS,YAAA,WACEnS,KAAKoS,8BAGPtC,EAAAlQ,UAAA0G,YAAA,SAAYC,GACNA,EAAe,QACZvG,KAAKyR,aAIPzR,KAAK0R,oBAC6B,IAAnC1R,KAAK0R,mBAAmBhS,QAExBM,KAAK6R,2BANL7R,KAAK6R,0BACL7R,KAAKwR,aAAexR,KAAKqS,OAAS,KAQtCrS,KAAK+R,gBACL/R,KAAKgS,kBACDzL,EAAe,OAAKA,EAAsB,eAC5CvG,KAAKkS,gCAIDpC,EAAAlQ,UAAAsS,6BAAR,SAAqCI,GAArC,IAAAxL,EAAA9G,UAAqC,IAAAsS,IAAAA,EAAA,GAEnCxJ,YAAU,WACW,MAAfhC,EAAKsJ,QACPtJ,EAAKyL,uBAEPzL,EAAK0L,yBAAyB,OACxBC,EACH3L,EAAK4L,iBAAmB5L,EAAK4L,gBAAgB1D,GAC7ClI,EAAKuJ,aAAevJ,EAAKuJ,YAAYrB,EAEvB,MAAflI,EAAKsJ,QACLkC,EAAQ,GACRxL,EAAK0K,cACL1K,EAAK0K,aAAa9R,OAAS,IAC1B+S,GAC+C,IAAhDnE,EAAqBxH,EAAK6L,mBAE1B7L,EAAKoL,6BAA6BI,EAAQ,KAjBtB,IAAVA,EAAc,EAAI,KAsB1BxC,EAAAlQ,UAAA2S,qBAAR,WACE,GAAmB,MAAfvS,KAAKoQ,OAAT,KAGMtB,KAAa9O,KAAKwR,eAAgBxR,KAAKwR,aAAa9R,QACpDkT,EAAa/D,GACjB7O,KAAK2S,iBACL7D,GAEI+D,EAAQD,EAAaA,EAAW5D,EAAI,KAE1C,IAAIhP,KAAKqQ,aAAerQ,KAAKqQ,YAAYrB,IAAM6D,GAAU7S,KAAKqQ,YAAYyC,EAA1E,KAGMC,KAAc/S,KAAKqQ,cAAerQ,KAAKqQ,YAAYyC,GACzD9S,KAAKqQ,YAAcwC,EAAQ,CAAE7D,EAAG6D,GAAU,KACtCE,EACF/S,KAAKgT,gBAGPhT,KAAK+P,IAAIkD,eACTjT,KAAKwS,yBAAyB,OAIxB1C,EAAAlQ,UAAAoT,aAAR,WAAA,IAAAlM,EAAA9G,KACEA,KAAKoS,6BACLtJ,YAAU,WACRhC,EAAK6K,WAAY,EACjB7K,EAAKiJ,IAAIkD,eACTnK,YAAU,WACRhC,EAAK6K,WAAY,EACjB7K,EAAKiJ,IAAIkD,eACTnK,YAAU,WAAO,OAAAhC,EAAK0L,yBAAyB,aAM7C1C,EAAAlQ,UAAA4S,yBAAR,SAAiCF,GAAjC,IAAAxL,EAAA9G,KAEE,QAF+B,IAAAsS,IAAAA,EAAA,GAC/BtS,KAAKoS,6BACApS,KAAK2S,kBAAsB3S,KAAK0S,iBAAmB1S,KAAK0S,gBAAgB1D,EAA7E,KAGMkE,EAAS1D,GAAgCxP,KAAK2S,kBAChDO,EACFlT,KAAK4R,iBAAmBsB,EAGtBZ,EAAQ,GACVxJ,YAAU,WAAO,OAAAhC,EAAK0L,yBAAyBF,EAAQ,KAAI,MAIvDxC,EAAAlQ,UAAAwS,2BAAR,WACMpS,KAAK4R,mBACP5R,KAAK4R,mBACL5R,KAAK4R,iBAAmB,OAIpB9B,EAAAlQ,UAAAiS,wBAAR,SAAgCsB,OACxBC,EAAOD,GAAUnT,KAAKqS,MAC5BrS,KAAK0R,mBAAqB0B,EAAO5M,KAAK6M,MAAM7M,KAAKC,UAAU2M,IAAS,IAI9DtD,EAAAlQ,UAAAkS,sBAAR,WACM9R,KAAKqS,OAASrS,KAAKqS,MAAM3S,OAAS,EACpCM,KAAKwR,aAAexR,KAAKqS,MAG3BrS,KAAKwR,aAAexR,KAAK0R,mBACrBlL,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAK0R,qBAC/B,IAGE5B,EAAAlQ,UAAA0T,iBAAR,WACEtT,KAAKyR,cAAe,EACpBzR,KAAK8R,wBACL9R,KAAK+Q,cAAe,EACpB/Q,KAAK+R,gBACL/R,KAAKgS,iBACLhS,KAAKkS,gCAIPpC,EAAAlQ,UAAA2T,YAAA,WAAA,IAAAzM,EAAA9G,KAEE,IAAKA,KAAKwT,YAAcxT,KAAKwT,UAAUC,OAAQ,CAC7C,IAAKzT,KAAK0R,oBAAsB1R,KAAK0R,mBAAmBhS,OAAS,EAC/D,OAIF,OAFAM,KAAK+Q,cAAe,OACpB/Q,KAAKsT,mBAGP,GAAKtT,KAAK0R,sBAAsB1R,KAAK0R,mBAAmBhS,OAAS,GAAjE,CAGAM,KAAK+Q,cAAe,MACd2C,EAAc1T,KAAKwT,UAAUC,OAAOE,cAC1C3T,KAAKyR,cAAe,MAEdmC,EAAe5T,KAAK0R,mBAAmBxL,QAAM,SAAEkN,eACnD,IAAKtM,EAAKqJ,cAA6C,IAA7BrJ,EAAKqJ,aAAazQ,OAAc,KACxD,IAAmB,IAAAmU,EAAAC,EAAA3U,OAAO4U,KAAKX,IAAKY,EAAAH,EAAAvS,QAAA0S,EAAAxS,KAAAwS,EAAAH,EAAAvS,OAAE,CACpC,GACE8R,EAFOjN,EAAI6N,EAAAzS,QAGX6R,EAAKjN,GAAM8N,WAAWN,cAAcO,SAASR,GAE7C,OAAO,oGAGX,OAAO,MAET,IAAmB,IAAAS,EAAAL,EAAAhN,EAAKqJ,cAAYiE,EAAAD,EAAA7S,QAAA8S,EAAA5S,KAAA4S,EAAAD,EAAA7S,OAAE,CAAjC,IAAM6E,EACT,GACEiN,EAFOjN,EAAIiO,EAAA7S,QAGX6R,EAAKjN,GAAM8N,WAAWN,cAAcO,SAASR,GAE7C,OAAO,oGAGX,OAAO,KAET1T,KAAKwR,aAAehL,KAAK6M,MAAM7M,KAAKC,UAAUmN,IAC9C5T,KAAK+Q,cAAe,EACpB/Q,KAAK+R,gBACL/R,KAAKgS,iBACLhS,KAAKkS,iCAGCpC,EAAAlQ,UAAAmS,cAAR,WAAA,IAAAjL,EAAA9G,KAEIA,KAAKgQ,cACLhQ,KAAKqU,eACLrU,KAAKwR,cACLxR,KAAKwR,aAAa9R,SAElBM,KAAKwR,aAAaxK,SAAO,SAAEb,IACQ,IAA7BA,EAAKW,EAAKuN,gBAA4BvN,EAAKwN,iBAAiBnO,KAC9DW,EAAKwK,eAAenL,EAAKW,EAAKwJ,eAAgB,EAC9CxJ,EAAKyK,eAAepL,EAAKW,EAAKwJ,cAAgBnK,MAIhDnG,KAAKwR,aAAa9R,SAAWP,OAAO4U,KAAK/T,KAAKuR,gBAAgB7R,SAE9DM,KAAKkR,yBAA0B,EAC/BlR,KAAKmR,iBAAkB,KAK7BhS,OAAAyB,eAAIkP,EAAAlQ,UAAA,cAAW,KAAf,WACE,OAAO2U,EAAAA,uCAGTzE,EAAAlQ,UAAA4U,KAAA,SAAK9L,GACH+L,EAAAA,gBAAgBzU,KAAKwR,aAAc9I,EAAMgM,cAAehM,EAAMiM,cAC9D3U,KAAKwR,aAAehL,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAKwR,eAC9CxR,KAAKyR,eACRzR,KAAK0R,mBAAqBlL,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAKwR,iBAI7D1B,EAAAlQ,UAAAoS,eAAA,WAAA,IAAAlL,EAAA9G,KAEMA,KAAKwQ,WAAaxQ,KAAKwR,cAAgBxR,KAAKwR,aAAa9R,SAC3DM,KAAK4Q,gBAAkB,IAAItL,MAAMgE,OAAOtJ,KAAK0Q,eAAiB,GAAGkE,KAAK,IACtE5U,KAAKyQ,YAAYzJ,SAAO,SAAEb,GACpBA,EAAK0O,cAAgB1O,EAAK2O,aAAoC,IAArB3O,EAAK2O,eAChDhO,EAAK8J,gBAAgBzK,EAAK0O,YAAc,GAAK,CAC3CtT,MAAO4E,EAAK2O,YACZC,MAAO5O,EAAK4O,OAAS,QACrBC,YAAa7O,EAAK6O,cAAe,EACjCC,eAAuC,MAAvB9O,EAAK8O,eAAyB9O,EAAK8O,eAAiB,EACpEC,OAAQ/O,EAAK+O,SAAU,SAQjCpF,EAAAlQ,UAAAuV,sBAAA,SAAsBC,GACpBpV,KAAKoR,kBAAoBgE,EACzBpV,KAAKqV,gBACLrV,KAAKkS,gCAGPpC,EAAAlQ,UAAA0V,YAAA,WACEtV,KAAKkR,yBAA0B,EAC/BlR,KAAKmR,iBAAkB,EACvBnR,KAAKsR,eAAiB,GACtBtR,KAAKuR,eAAiB,GACtBvR,KAAKuQ,YAAY5L,KAAK,KAGxBmL,EAAAlQ,UAAAyV,cAAA,SAAc3M,EAAwB0K,GAAtC,IAAAtM,EAAA9G,KACE,QADY,IAAA0I,IAAAA,GAAA,QAAwB,IAAA0K,IAAAA,EAAA,MAChCA,EAAM,CACR,GAAI1K,GAAS1I,KAAKsU,iBAAiBlB,GACjC,OAEFpT,KAAKsR,eAAe8B,EAAKpT,KAAKsQ,cAAgB5H,EAC1CA,GACD1I,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,gBAC5BtQ,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,cAAgB8C,GAEjDpT,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,sBACrBtQ,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,kBAGrCiF,EAAiBvV,KAAKoR,kBAAkBlL,QAAM,SACjDC,GAAS,OAACW,EAAKwN,iBAAiBnO,MAEnCnG,KAAKkR,wBACHqE,EAAe7V,OAAS,GACxB6V,EAAeC,OAAK,SAAErP,GAAS,OAAAW,EAAKwK,eAAenL,EAAKW,EAAKwJ,iBAC/DtQ,KAAKmR,gBACHoE,EAAeE,MAAI,SAChBtP,GAAS,OAAAW,EAAKwK,eAAenL,EAAKW,EAAKwJ,mBACpCtQ,KAAKkR,wBAETlR,KAAKuQ,aACPvQ,KAAKuQ,YAAY5L,KAAKxF,OAAOuW,OAAO1V,KAAKuR,kBAI7CzB,EAAAlQ,UAAA+V,SAAA,SAASpU,GAAT,IAAAuF,EAAA9G,KACEA,KAAKoR,kBAAkBpK,SAAO,SAAEb,GAC1BW,EAAKwN,iBAAiBnO,KAGtB5E,GACDuF,EAAKyK,eAAepL,EAAKW,EAAKwJ,gBAC5BxJ,EAAKyK,eAAepL,EAAKW,EAAKwJ,cAAgBnK,GAEjDW,EAAKyK,eAAepL,EAAKW,EAAKwJ,sBACrBxJ,EAAKyK,eAAepL,EAAKW,EAAKwJ,cAEzCxJ,EAAKwK,eAAenL,EAAKW,EAAKwJ,cAAgB/O,MAEhDvB,KAAKqV,iBAIPvF,EAAAlQ,UAAA0U,iBAAA,SAAiBlB,GACf,SACEpT,KAAK4V,sBACLxC,IACmC,IAAnCA,EAAKpT,KAAK4V,uBAKd9F,EAAAlQ,UAAAiW,aAAA,SAAazC,GACX,SACEpT,KAAK8V,kBACL1C,IAC+B,IAA/BA,EAAKpT,KAAK8V,uCA1Yf3T,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,kBACVC,SAAA,8iYAtBAyT,EAAAA,+DA2BCC,EAAAA,UAAS5T,KAAA,CAAC,UAAW,CAAEI,QAAQ,mBAC/BoC,EAAAA,4BACAA,EAAAA,yBACAA,EAAAA,0BACAA,EAAAA,4BAEAA,EAAAA,sBAKAA,EAAAA,2BAEAA,EAAAA,6BACAA,EAAAA,mCAKAA,EAAAA,+BAKAA,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,SAvCwBE,EAAAA,CAAfC,EAAAA,4EACeD,EAAAA,CAAfC,EAAAA,yEACeD,EAAAA,CAAfC,EAAAA,0EA2BeD,EAAAA,CAAfC,EAAAA,yEAuWZ+K,KCpaA,IAAAmG,GAAA,WAWA,SAAAA,KAekC,2BAfjCvT,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAsT,EAAAA,cACAC,EAAAA,eACAtT,EAAAA,YACAC,EAAAA,kBACAuH,EACArF,EACAvC,GAEFM,aAAc,CAAC+M,IACf9M,QAAS,CAAC8M,IACVsG,QAAS,CAACC,EAAAA,sBAEsBJ,EA1BlC,iBC6FE,SAAAK,EAAoBvG,GAAA/P,KAAA+P,IAAAA,EAzDX/P,KAAAqS,MAAoB,GAEpBrS,KAAA6Q,UAAuB,IAAIC,EACX9Q,KAAAgQ,cAAwB,EACxBhQ,KAAAiQ,WAAqB,EAErBjQ,KAAAuW,eAAyB,EAOzCvW,KAAAoQ,OAAoC,CAAEpB,EAAG,OAClDhP,KAAAqQ,YAA0C,KACjCrQ,KAAAsQ,YAAsB,aAarBtQ,KAAAuQ,YAAc,IAAIlM,EAAAA,aAKHrE,KAAAwQ,WAAqB,EACrCxQ,KAAAyQ,YAAkC,GAClCzQ,KAAA0Q,cAAiC,EACjC1Q,KAAA+Q,cAAwB,EACxB/Q,KAAAgR,eAAyB,EACzBhR,KAAAiR,cAAwB,IACvBjR,KAAAwW,qBAAuB,IAAInS,EAAAA,aAC3BrE,KAAAyW,oBAAsB,IAAIpS,EAAAA,aAC1BrE,KAAA0W,WAAa,IAAIrS,EAAAA,aAE3BrE,KAAA4Q,gBAAkB,GAClB5Q,KAAAkR,yBAA0B,EAC1BlR,KAAAmR,iBAAkB,EAClBnR,KAAAoR,kBAAoB,GACpBpR,KAAAsR,eAA6C,GAC7CtR,KAAAuR,eAAyC,GACzCvR,KAAA2W,wBAAkC,EAElC3W,KAAA2R,WAAY,EAEZ3R,KAAA4W,wBAA0B,GAClB5W,KAAA6W,oBAAsC,KACtC7W,KAAA4R,iBAAwC,KAmDhD5R,KAAA8W,kBAAiB,SAAItO,GAA0B,OAAAA,GAiYjD,OAhbErJ,OAAAyB,eAAI0V,EAAA1W,UAAA,kBAAe,KAAnB,WACE,OAAsB,MAAfI,KAAKoQ,OAAiBpQ,KAAKoQ,OAASpQ,KAAKqQ,6CAGlDlR,OAAAyB,eAAI0V,EAAA1W,UAAA,2BAAwB,KAA5B,WACE,OAA4B,MAAxBI,KAAK+W,iBAA2B/W,KAAK+W,gBAAkB,EAClD/W,KAAK+W,gBAEP/W,KAAK4W,yDAIdzX,OAAAyB,eAAI0V,EAAA1W,UAAA,sBAAmB,KAAvB,eACQoX,EAAWhX,KAAKwR,aAAexR,KAAKwR,aAAa9R,OAAS,EAChE,GAAIsX,GAAY,EACd,OAAO,MAEHC,EAAOjX,KAAK0S,gBAClB,GAAIuE,GAAQA,EAAKnE,EAEf,OAAOkE,EAAW,OAGdE,EAAkBF,EAAWhX,KAAKmX,yBACxC,MAAsB,oBAAXjI,OACFgI,EAAkBhI,OAAOkI,YAHhB,IAKXJ,EAAW,qCAGpB7X,OAAAyB,eAAI0V,EAAA1W,UAAA,mBAAgB,KAApB,WACE,SAAKI,KAAKuW,eAAiBvW,KAAKiQ,YAGzBjQ,KAAKqX,qDAIdlY,OAAAyB,eAAI0V,EAAA1W,UAAA,iBAAc,KAAlB,eACQqX,EAAOjX,KAAK0S,gBAAexT,EAAA,GAAQc,KAAK0S,iBAAoB,GAIlE,OAHI1S,KAAKsX,mBAAqBL,EAAKnE,IACjCmE,EAAKnE,EAAI9S,KAAKuX,kBAETN,mCAMTX,EAAA1W,UAAAsC,SAAA,YACiC,IAA3BlC,KAAKwX,oBACPxX,KAAK2W,uBAAyB3W,KAAKwX,mBAErCxX,KAAK+R,gBACL/R,KAAKgS,kBAGPsE,EAAA1W,UAAAqS,gBAAA,WACEjS,KAAKkS,+BACLlS,KAAKyX,sBAAqB,IAG5BnB,EAAA1W,UAAAuS,YAAA,WACEnS,KAAKoS,8BAGPkE,EAAA1W,UAAA0G,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,WAKpD,OAHAvG,KAAK+R,gBACL/R,KAAKgS,sBACLhS,KAAKyX,sBAAqB,GAGvBzX,KAAK2W,wBACR3W,KAAKsV,cAGTtV,KAAK+R,gBACL/R,KAAKgS,kBAEHzL,EAAe,OACfA,EAAmB,WACnBA,EAAsB,cACtBA,EAAgB,QAChBA,EAAuB,eACvBA,EAAmB,aAEnBvG,KAAKkS,+BACLlS,KAAKyX,sBAAqB,KAK9BnB,EAAA1W,UAAA6X,qBAAA,SAAqBC,GAArB,IAAA5Q,EAAA9G,UAAqB,IAAA0X,IAAAA,GAAA,OACbC,EAAa3X,KAAKsX,iBAClBM,EACyB,OAA7B5X,KAAK6W,qBACL7W,KAAK6W,sBAAwBc,EAG/B,GAFA3X,KAAK6W,oBAAsBc,EAEvBD,GAAgBE,EAclB,OAbA5X,KAAKoS,kCAELtJ,YAAU,WACRhC,EAAK6K,WAAY,EACjB7K,EAAKiJ,IAAIkD,eACTnK,YAAU,WACRhC,EAAK6K,WAAY,EACjB7K,EAAKiJ,IAAIkD,eACTnK,YAAU,WACRhC,EAAK+Q,iBAAiBF,YAO9B3X,KAAK+P,IAAIkD,eACTjT,KAAK6X,iBAAiBF,IAGhBrB,EAAA1W,UAAAiY,iBAAR,SAAyBF,GACvB3X,KAAKkS,+BACLlS,KAAKwS,yBAAyB,GAC1BmF,GACF3X,KAAK8X,8BAA6B,IAItCxB,EAAA1W,UAAAkY,6BAAA,SAA6BC,GAA7B,IAAAjR,EAAA9G,UAA6B,IAAA+X,IAAAA,GAAA,GACtB/X,KAAKsX,iBAIVxO,YAAU,WACRhC,EAAKkR,uBAAuBD,OACtBE,EACJnR,EAAK6L,kBAAoB7L,EAAK6L,iBAAiBuF,yBAC7CD,GACFA,EAASE,oBAEXrR,EAAK0L,yBAAyB,GAC9B1L,EAAKiJ,IAAIkD,kBAXTjT,KAAKwS,yBAAyB,IAe1B8D,EAAA1W,UAAAoY,uBAAR,SAA+BI,GAC7B,QAD6B,IAAAA,IAAAA,GAAA,KACD,MAAxBpY,KAAK+W,iBAA2B/W,KAAK+W,gBAAkB,IAAMqB,EAAjE,KAGMH,EACJjY,KAAK2S,kBAAoB3S,KAAK2S,iBAAiBuF,yBACjD,GAAKD,GAAaA,EAASI,YAAeJ,EAASI,WAAWC,cAA9D,KAGMC,EAAMN,EAASI,WAAWC,cAAchM,cAC5C,uCAEEiM,GAAOA,EAAIC,aAAe,IAC5BxY,KAAK4W,wBAA0B2B,EAAIC,iBAI/BlC,EAAA1W,UAAAsS,6BAAR,SAAqCI,GAArC,IAAAxL,EAAA9G,UAAqC,IAAAsS,IAAAA,EAAA,GAEnCxJ,YAAU,WACW,MAAfhC,EAAKsJ,QACPtJ,EAAKyL,uBAEPzL,EAAK0L,yBAAyB,OACxBC,EACH3L,EAAK2R,gBAAkB3R,EAAK2R,eAAezJ,GAC3ClI,EAAKuJ,aAAevJ,EAAKuJ,YAAYrB,EAEvB,MAAflI,EAAKsJ,QACLkC,EAAQ,GACRxL,EAAK0K,cACL1K,EAAK0K,aAAa9R,OAAS,IAC1B+S,GAC+C,IAAhDnE,EAAqBxH,EAAK6L,mBAE1B7L,EAAKoL,6BAA6BI,EAAQ,KAjBtB,IAAVA,EAAc,EAAI,KAsB1BgE,EAAA1W,UAAA2X,eAAR,WACE,MAAO,uBAGDjB,EAAA1W,UAAA2S,qBAAR,WACE,GAAmB,MAAfvS,KAAKoQ,OAAT,KAGMtB,KAAa9O,KAAKwR,eAAgBxR,KAAKwR,aAAa9R,QACpDkT,EAAa/D,GACjB7O,KAAK2S,iBACL7D,GAEI+D,EAAQD,EAAaA,EAAW5D,EAAI,KAEpC0J,EAAQ1Y,KAAKsX,iBAAmBtX,KAAKuX,iBAAmB,KACxDxE,KAAc/S,KAAKqQ,cAAerQ,KAAKqQ,YAAYyC,GACnD6F,IAAaD,EAEjB1Y,KAAKqQ,aACLrQ,KAAKqQ,YAAYrB,IAAM6D,GACvB7S,KAAKqQ,YAAYyC,IAAM4F,IAIzB1Y,KAAKqQ,YACHwC,GAAS6F,EACLA,EACE,CAAE1J,EAAG6D,EAAOC,EAAG4F,GACf,CAAE1J,EAAG6D,GACP,KACFE,IAAa4F,GAIjB3Y,KAAK+P,IAAIkD,eACTjT,KAAKwS,yBAAyB,IAJ5BxS,KAAKyX,sBAAqB,MAQtBnB,EAAA1W,UAAA4S,yBAAR,SAAiCF,GAAjC,IAAAxL,EAAA9G,KAEE,QAF+B,IAAAsS,IAAAA,EAAA,GAC/BtS,KAAKoS,6BACApS,KAAK2S,kBAAsB3S,KAAKyY,gBAAkBzY,KAAKyY,eAAezJ,EAA3E,KAGMkE,EAAS1D,GAAgCxP,KAAK2S,kBAChDO,EACFlT,KAAK4R,iBAAmBsB,EAGtBZ,EAAQ,GACVxJ,YAAU,WAAO,OAAAhC,EAAK0L,yBAAyBF,EAAQ,KAAI,MAIvDgE,EAAA1W,UAAAwS,2BAAR,WACMpS,KAAK4R,mBACP5R,KAAK4R,mBACL5R,KAAK4R,iBAAmB,OAI5BzS,OAAAyB,eAAI0V,EAAA1W,UAAA,eAAY,KAAhB,WACE,OAAII,KAAKqS,OAASrS,KAAKqS,MAAM3S,OACpBM,KAAKqS,MAENrS,KAAK6Q,WAAa7Q,KAAK6Q,UAAUhG,SAAY,oCAGvD1L,OAAAyB,eAAI0V,EAAA1W,UAAA,aAAU,KAAd,WACE,OAAII,KAAK6Q,WAA6C,MAAhC7Q,KAAK6Q,UAAUrG,cAC5BxK,KAAK6Q,UAAUrG,cAEjBxK,KAAKwR,aAAa9R,wCAG3B4W,EAAA1W,UAAAgZ,YAAA,SAAYC,GACV,OAAQ7Y,KAAKgR,eAAiB,GAAKhR,KAAKiR,cAAgB4H,GAG1DvC,EAAA1W,UAAAkZ,kBAAA,SAAkBC,GAChB/Y,KAAKgR,eAAiB+H,EACtB/Y,KAAKwW,qBAAqB7R,KAAK3E,KAAKgR,gBACpChR,KAAK0W,WAAW/R,OAChB3E,KAAKkS,+BACLlS,KAAKyX,sBAAqB,IAG5BnB,EAAA1W,UAAAoZ,iBAAA,SAAiBtO,GACf1K,KAAKiR,cAAgBvG,EACrB1K,KAAKgR,eAAiB,EACtBhR,KAAKyW,oBAAoB9R,KAAK3E,KAAKiR,eACnCjR,KAAKwW,qBAAqB7R,KAAK3E,KAAKgR,gBACpChR,KAAK0W,WAAW/R,OAChB3E,KAAKkS,+BACLlS,KAAKyX,sBAAqB,IAGpBnB,EAAA1W,UAAAmS,cAAR,WAAA,IAAAjL,EAAA9G,KAEIA,KAAKgQ,cACLhQ,KAAKqU,eACLrU,KAAKwR,cACLxR,KAAKwR,aAAa9R,SAElBM,KAAKwR,aAAaxK,SAAO,SAAEb,IACQ,IAA7BA,EAAKW,EAAKuN,gBAA4BvN,EAAKwN,iBAAiBnO,KAC9DW,EAAKwK,eAAenL,EAAKW,EAAKwJ,eAAgB,EAC9CxJ,EAAKyK,eAAepL,EAAKW,EAAKwJ,cAAgBnK,MAIhDnG,KAAKwR,aAAa9R,SAAWP,OAAO4U,KAAK/T,KAAKuR,gBAAgB7R,SAE9DM,KAAKkR,yBAA0B,EAC/BlR,KAAKmR,iBAAkB,KAK7BhS,OAAAyB,eAAI0V,EAAA1W,UAAA,cAAW,KAAf,WACE,OAAO2U,EAAAA,uCAGT+B,EAAA1W,UAAA4U,KAAA,SAAK9L,OACG2J,EAAKtQ,EAAO/B,KAAKwR,cACvBiD,EAAAA,gBAAgBpC,EAAO3J,EAAMgM,cAAehM,EAAMiM,cAClD3U,KAAKqS,MAAQA,GAGfiE,EAAA1W,UAAAoS,eAAA,WAAA,IAAAlL,EAAA9G,KACMA,KAAKwQ,WAAaxQ,KAAKwR,cAAgBxR,KAAKwR,aAAa9R,SAC3DM,KAAK4Q,gBAAkB,IAAItL,MAAMgE,OAAOtJ,KAAK0Q,eAAiB,GAAGkE,KAAK,IACtE5U,KAAKyQ,YAAYzJ,SAAO,SAAEb,GACpBA,EAAK0O,cAAgB1O,EAAK2O,aAAoC,IAArB3O,EAAK2O,eAChDhO,EAAK8J,gBAAgBzK,EAAK0O,YAAc,GAAK,CAC3CtT,MAAO4E,EAAK2O,YACZC,MAAO5O,EAAK4O,OAAS,QACrBC,YAAa7O,EAAK6O,cAAe,EACjCC,eAAuC,MAAvB9O,EAAK8O,eAAyB9O,EAAK8O,eAAiB,EACpEC,OAAQ/O,EAAK+O,SAAU,SAOjCoB,EAAA1W,UAAAuV,sBAAA,SAAsBC,GACpBpV,KAAKoR,kBAAoBgE,EACzBpV,KAAKqV,gBACArV,KAAK2W,wBACR3W,KAAKsV,cAEPtV,KAAKkS,gCAGPoE,EAAA1W,UAAA0V,YAAA,WACEtV,KAAKkR,yBAA0B,EAC/BlR,KAAKmR,iBAAkB,EACvBnR,KAAKsR,eAAiB,GACtBtR,KAAKuR,eAAiB,GACtBvR,KAAKuQ,YAAY5L,KAAK,KAGxB2R,EAAA1W,UAAAyV,cAAA,SAAc3M,EAAwB0K,GAAtC,IAAAtM,EAAA9G,KACE,QADY,IAAA0I,IAAAA,GAAA,QAAwB,IAAA0K,IAAAA,EAAA,MAChCA,EAAM,CACR,GAAI1K,GAAS1I,KAAKsU,iBAAiBlB,GACjC,OAEFpT,KAAKsR,eAAe8B,EAAKpT,KAAKsQ,cAAgB5H,EAC1CA,GACD1I,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,gBAC5BtQ,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,cAAgB8C,GAEjDpT,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,sBACrBtQ,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,kBAOrCiF,IAHJvV,KAAKoR,mBAAqBpR,KAAKoR,kBAAkB1R,OAC7CM,KAAKoR,kBACLpR,KAAKwR,eAC2B,IAAItL,QAAM,SAC7CC,GAAS,OAACW,EAAKwN,iBAAiBnO,MAEnCnG,KAAKkR,wBACHqE,EAAe7V,OAAS,GACxB6V,EAAeC,OAAK,SAAErP,GAAS,OAAAW,EAAKwK,eAAenL,EAAKW,EAAKwJ,iBAC/DtQ,KAAKmR,gBACHoE,EAAeE,MAAI,SAChBtP,GAAS,OAAAW,EAAKwK,eAAenL,EAAKW,EAAKwJ,mBACpCtQ,KAAKkR,wBACTlR,KAAKuQ,aACPvQ,KAAKuQ,YAAY5L,KAAKxF,OAAOuW,OAAO1V,KAAKuR,kBAI7C+E,EAAA1W,UAAA+V,SAAA,SAASpU,GAAT,IAAAuF,EAAA9G,OAEIA,KAAKoR,mBAAqBpR,KAAKoR,kBAAkB1R,OAC7CM,KAAKoR,kBACLpR,KAAKwR,eACI,IAAIxK,SAAO,SAAEb,GACtBW,EAAKwN,iBAAiBnO,KAGtB5E,GACDuF,EAAKyK,eAAepL,EAAKW,EAAKwJ,gBAC5BxJ,EAAKyK,eAAepL,EAAKW,EAAKwJ,cAAgBnK,GAEjDW,EAAKyK,eAAepL,EAAKW,EAAKwJ,sBACrBxJ,EAAKyK,eAAepL,EAAKW,EAAKwJ,cAEzCxJ,EAAKwK,eAAenL,EAAKW,EAAKwJ,cAAgB/O,MAEhDvB,KAAKqV,iBAIPiB,EAAA1W,UAAA0U,iBAAA,SAAiBlB,GACf,SACEpT,KAAK4V,sBACLxC,IACmC,IAAnCA,EAAKpT,KAAK4V,uBAKdU,EAAA1W,UAAAiW,aAAA,SAAazC,GACX,SACEpT,KAAK8V,kBACL1C,IAC+B,IAA/BA,EAAKpT,KAAK8V,uCAjff3T,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,uBACVC,SAAA,spaA1BAyT,EAAAA,+DAgCCC,EAAAA,UAAS5T,KAAA,CAAC,UAAW,CAAEI,QAAQ,mBAC/BoC,EAAAA,yBAEAA,EAAAA,4BACAA,EAAAA,yBACAA,EAAAA,6BAEAA,EAAAA,+BAEAA,EAAAA,sBAKAA,EAAAA,2BAEAA,EAAAA,6BACAA,EAAAA,mCAKAA,EAAAA,+BAKAA,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,UAtCwBC,EAAAA,CAAfC,EAAAA,4EACeD,EAAAA,CAAfC,EAAAA,yEAEeD,EAAAA,CAAfC,EAAAA,6EA2BeD,EAAAA,CAAfC,EAAAA,yEA0cZuR,KC/gBA,IAAA2C,GAAA,WAMA,SAAAA,KAMsC,2BANrCvW,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CAACC,EAAAA,aAAcsT,EAAAA,cAAeC,EAAAA,gBACvCpT,aAAc,CAACuT,IACftT,QAAS,CAACsT,IACVF,QAAS,CAACC,EAAAA,sBAE0B4C,EAZtC,GCSaC,GAAgB,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,MAAO,MAAO,OAGhCC,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,MAAO,MAAO,MAAO,MAAO,MAAO,OAGpFC,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,MAAO,QAGvBC,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,MAAO,MAC/D,MAAO,MAAO,OAGhBC,UAAW,CACT,kBAAmB,aAAc,SAAU,yBAA0B,OAAQ,OAC7E,gBAAiB,cAAe,eAAgB,kBAAmB,OAAQ,cAC3E,oBAAqB,QCzDzBC,ID6DA,WAIE,SAAAC,yBAJD9V,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,sJADd,GC7DA,WASE,SAAA4V,IAISzZ,KAAA2Z,IAAc,KA6BzB,OA1BEF,EAAA7Z,UAAAsC,SAAA,WACElC,KAAK4Z,kBAGPH,EAAA7Z,UAAA0G,YAAA,WACEtG,KAAK4Z,kBAGPH,EAAA7Z,UAAAga,eAAA,eACMC,EAAU,GACd,IAAK,IAAIzZ,KAAO8Y,IAEZlZ,KAAK8Z,QACwC,IAA5CZ,GAAc9Y,GAAK2Z,QAAQ/Z,KAAK8Z,SACyB,IAA1DZ,GAAc9Y,GAAK2Z,QAAQ/Z,KAAK8Z,MAAME,iBACoB,IAA1Dd,GAAc9Y,GAAK2Z,QAAQ/Z,KAAK8Z,MAAMnG,iBAEtCkG,EAAUzZ,GAIZJ,KAAKia,YADHJ,GAGiB,+BApCxB1X,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,gBACVC,SAAA,suKAKCsC,EAAAA,yBACAA,EAAAA,0BACAA,EAAAA,mBACAA,EAAAA,SA6BH6U,EA1CA,ICAA,IAAAS,GAAA,WAMA,SAAAA,KASiC,2BAThCxX,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAC,EAAAA,mBAEFC,aAAc,CAAC0W,IACfzW,QAAS,CAACyW,QAEqBS,EAfjC,MCIA,WAKEla,KAAAuB,MAAkE,KAIlEvB,KAAAma,YAA4B,IAAIzO,EAMhC1L,KAAAoa,UAAqB,EACrBpa,KAAAqa,SAAoB,WAepBzV,MAAA,EACA0V,OAAA,EACAC,KAAA,EACAC,UAAA,EACAC,eAAA,EACAC,SAAA,EACAC,MAAA,EACAjP,YAAA,uNAIF,IAAAkP,GAAA,WAKE,SAAAA,gCALDhX,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,wJADd,MCnCA,WAIE7D,KAAAqa,SAAoB,EAEpBra,KAAAqJ,MAAiB,EACjBrJ,KAAAoG,MAAiB,EAMjBpG,KAAA6a,WAAsB,EACtB7a,KAAA8a,WAAsB,EAEtB9a,KAAAuB,MAMW,KAUXvB,KAAAma,YAA4B,IAAIzO,EAMhC1L,KAAA+a,aAAwB,EAGxB/a,KAAAoa,UAAqB,GAmBvB,IAAAY,GAAA,qBAOEpW,MAAA,EACA0V,OAAA,EACAC,KAAA,EACAC,UAAA,EACAS,SAAA,EACAvP,YAAA,EACA+O,eAAA,EACAS,QAAA,EACAC,OAAA,EACAC,KAAA,EACAV,SAAA,GACAW,MAAA,GACAC,SAAA,GACAC,cAAA,sXAGF,IAAAC,GAAA,WAIE,SAAAA,gCAJD5X,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,wJADd,GC1FA,SAAgB4X,GACdC,EACApU,EACAqU,GAEA,QAFA,IAAAA,IAAAA,EAAA,WAEKD,EACH,OAAO,MAEHE,EAAUF,EAAWjI,OAAOE,cAClC,OAAOrM,EAAKmO,MAAI,SAAE/Q,OACVmX,EACY,MAAhBnX,EAAOmX,MAAgBlU,OAAOjD,EAAOmX,OAAOlI,cAAgB,GACxDpS,EACY,MAAhBmD,EAAOnD,MAAgBoG,OAAOjD,EAAOnD,OAAOoS,cAAgB,GACxDmI,EACmB,MAAvBpX,EAAOiX,GACHhU,OAAOjD,EAAOiX,IAAchI,cAC5B,GACN,OACGkI,IAAqC,IAA5BA,EAAM9B,QAAQ6B,IACvBra,IAAqC,IAA5BA,EAAMwY,QAAQ6B,IACvBE,IAAuC,IAA7BA,EAAO/B,QAAQ6B,MAKhC,SAAgBG,GACdC,GAEA,IAAKA,EACH,OAAO,EAET,IAAkC,IAA9BA,EAAe9L,WACjB,OAAO,EAET,GACE8L,EAAe9L,YACsB,iBAA9B8L,EAAe9L,WAEtB,OAAO8L,EAAe9L,eAElByL,EAAcK,EAAeL,aAAe,SAClD,MAAO,CACLzV,OAAM,SAAGwV,EAAoBpU,GAC3B,OAAAmU,GAAqBC,EAAYpU,EAAMqU,KAK7C,SAAgBM,GACdD,OAEME,EACJF,GAAkBA,EAAeG,cAC7BxU,OAAOqU,EAAeG,eAAe1I,OACrC,GACN,OAAKyI,GAG2C,IAA5CA,EAAOnC,QA7DyB,qBA8D3BmC,EAEFE,qBAA+BF,EAhEF,oBAuEtC,SAAgBG,GACdL,GAEA,IAAKA,EACH,OAAO,SAEH5R,EAAmC,GAMzC,GALI4R,EAAeM,WACjBnd,OAAO4U,KAAKiI,EAAeM,WAAWtV,SAAO,SAAE5G,GAC7CgK,EAAMhK,GAAO4b,EAAeM,UAAUlc,MAGH,MAAnC4b,EAAeO,iBAA0B,KACrCC,EACuC,iBAApCR,EAAeO,iBAClBP,EAAeO,iBAAmB,KAClC5U,OAAOqU,EAAeO,kBACiB,MAAzCnS,EAAM,kCACRA,EAAM,gCAAkCoS,GAG5C,OAAOrd,OAAO4U,KAAK3J,GAAO1K,OAAS0K,EAAQ,KC1F7C,OAAA,aASA,OAMA,aAMA,IAAaqS,GAAyB,IAAIC,EAAAA,eAAoC,wCCyD5E,SAAAC,EACUC,EAC4CC,GAFtD,IAAA/V,EAAA9G,KACUA,KAAA4c,GAAAA,EAC4C5c,KAAA6c,YAAAA,EA7C7B7c,KAAA8c,oBAAqB,EAIrB9c,KAAA+c,aAAc,EAE7B/c,KAAAgd,YAAc,IAAI3Y,EAAAA,aAClBrE,KAAAid,WAAa,IAAI5Y,EAAAA,aAG3BrE,KAAAkd,YAAsB,EACtBld,KAAAmd,kBAA4B,EACpBnd,KAAAod,cAAgB,IAAIC,EAAAA,QACpBrd,KAAAsd,gBAA0B,EAC1Btd,KAAAud,kBAAoB,IAAIF,EAAAA,QACxBrd,KAAAwd,0BAAoC,EAQpCxd,KAAAyd,oBAA8C,GAC9Czd,KAAA0d,uBAAwB,EAEhC1d,KAAA2d,WAAoC,GACpC3d,KAAA4d,cAAgC,KAChC5d,KAAA6d,kBDtD2C,OCuD3C7d,KAAA8d,eAAgB,EAChB9d,KAAA+d,cAAe,EAEf/d,KAAAge,oBAAqB,EACrBhe,KAAAie,eAAkC,GAGlCje,KAAAke,oBAAqB,EACrBle,KAAAme,eAAkC,GAGzBne,KAAAoe,kBDlEkC,OCmE1Bpe,KAAAqe,iBAAmB,cAorBpCre,KAAA+b,sBAAwBA,GACxB/b,KAAAic,yBAA2BA,GAC3Bjc,KAAAqc,qBAAuBA,GAhrBrBrc,KAAKse,mBAAqBte,KAAKod,cAAcmB,KAC3CC,EAAAA,aAAaxe,KAAKsd,kBAClBmB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MAAOiW,EAAAD,EAAAC,aAAmB,OAAA7X,EAAK4C,aAAaC,EAAIjB,EAAOiW,MAC1E3e,KAAK4e,uBAAyB5e,KAAKud,kBAChCgB,KAAKC,EAAAA,aAAaxe,KAAKwd,4BACvBiB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MACZA,GACF5B,EAAK4C,aAAaC,EAAIjB,MA0qBhC,OArqBEiU,EAAA/c,UAAAsC,SAAA,WACElC,KAAK6e,OAEL7e,KAAK8e,gBAAe,IAGtBnC,EAAA/c,UAAA0G,YAAA,SAAYC,GAIV,GAHIA,EAAoB,YACtBvG,KAAK6e,OAEHtY,EAA4B,oBAAKA,EAAyB,gBAAG,KAEzDwY,EAAcxY,EAA4B,qBAAMA,EAA4B,mBAAEyY,YAC9EC,EAAW1Y,EAAyB,kBAAMA,EAAyB,gBAAEyY,aACvED,GAAeE,IACjBjf,KAAK8e,gBAAe,KAK1BnC,EAAA/c,UAAAuS,YAAA,WACMnS,KAAKse,oBACPte,KAAKse,mBAAmBY,cAEtBlf,KAAK4e,wBACP5e,KAAK4e,uBAAuBM,cAE1Blf,KAAKmf,eACPnf,KAAKmf,cAAcD,cAEjBlf,KAAKof,iBACPpf,KAAKof,gBAAgBF,eAIzB/f,OAAAyB,eAAI+b,EAAA/c,UAAA,eAAY,KAAhB,WACE,SAAUI,KAAK8c,oBAAsB9c,KAAKqf,iBAAmBrf,KAAK6c,8CAG5DF,EAAA/c,UAAAif,KAAR,WAAA,IAAA/X,EAAA9G,KAEE,GADAA,KAAKkd,YAAa,GACbld,KAAKsf,UAAUtf,KAAKuf,YACvB,KAAM,kBAEHvf,KAAKuf,aACRvf,KAAKuf,WAAa,IAEpBvf,KAAKmd,kBAAoBnd,KAAKuf,WAAW7f,OAAS,MAC5C8f,EAAgB,GACtBxf,KAAKuf,WAAWvY,SAAO,SAAEb,EAAMqC,GAC7BgX,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC3Y,EAAK4Y,4BAA4BvZ,EAAMA,EAAK5E,OAC5C,IAEF4E,EAAKwZ,KAAOnX,EAAQ,KAEtBxI,KAAK4f,mBAAqB5f,KAAK4c,GAAGiD,MAAML,GACnCxf,KAAK0d,wBACR1d,KAAKyd,oBAAsBzd,KAAK8f,WAAW9f,KAAK+f,iBAChD/f,KAAK0d,uBAAwB,GAE/B1d,KAAKuf,WAAWvY,SAAO,SAAEb,GACnBA,EAAK6Z,gBACH7Z,EAAK8Z,0BACPnZ,EAAK8Y,mBAAmB9X,IAAI3B,EAAKsB,MAAMyY,aACpC3B,KACCC,EAAAA,aAAarY,EAAK8Z,4BAEnBxB,WAAS,SAACld,GAAS,OAAAuF,EAAK4C,aAAavD,EAAK6Z,cAAeze,MAE5DuF,EAAK8Y,mBAAmB9X,IAAI3B,EAAKsB,MAAMyY,aAAazB,WAAS,SAACld,GAAS,OAAAuF,EAAK4C,aAAavD,EAAK6Z,cAAeze,WAMrHob,EAAA/c,UAAAugB,cAAA,SAAcxW,EAASjB,EAAY0X,EAAgCzB,GAAnE,IAAA7X,EAAA9G,KACMogB,GACFpgB,KAAKsd,gBAAkB8C,EACnBpgB,KAAKse,oBACPte,KAAKse,mBAAmBY,cAE1Blf,KAAKse,mBAAqBte,KAAKod,cAAcmB,KAC3CC,EAAAA,aAAaxe,KAAKsd,kBAClBmB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MAAOiW,EAAAD,EAAAC,aAAmB,OAAA7X,EAAK4C,aAAaC,EAAIjB,EAAOiW,MAC1E3e,KAAKod,cAAc9b,KAAK,CAAEqI,GAAEA,EAAEjB,MAAKA,EAAEiW,aAAYA,KAEjD3e,KAAK0J,aAAaC,EAAIjB,EAAOiW,IAIjChC,EAAA/c,UAAAygB,kBAAA,SACE1W,EACA2W,EACAC,EACAra,GAJF,IAAAY,EAAA9G,KAME,GAAK2J,EAAL,CAII2W,GACFtgB,KAAKwgB,yBAAyBta,OAE1Bua,EAC6B,MAAjCF,EACIA,EACA,EAEDE,GAMLzgB,KAAKwd,0BAA4BiD,EAC7BzgB,KAAK4e,wBACP5e,KAAK4e,uBAAuBM,cAE9Blf,KAAK4e,uBAAyB5e,KAAKud,kBAChCgB,KAAKC,EAAAA,aAAaxe,KAAKwd,4BACvBiB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MACZA,GACF5B,EAAK4C,aAAaC,EAAIjB,MAG5B1I,KAAKud,kBAAkBjc,KAAK,CAAEqI,GAAEA,EAAEjB,MAAO4X,KAhBnCA,GACFtgB,KAAK0J,aAAaC,EAAI2W,KAmBpB3D,EAAA/c,UAAA4gB,yBAAR,SAAiCta,GAC/B,GAAKA,GAAWA,EAAOyY,aAAvB,KAGM+B,EAAMxa,EAAOyY,aACG,MAAlB+B,EAAIC,aACND,EAAIC,WAAa,MAIrBhE,EAAA/c,UAAA8J,aAAA,SAAaC,EAASjB,EAAYiW,GAChC,GAAIhV,GAAMgV,EACRhV,EAAGjB,EAAOiW,OACL,CAAA,IAAIhV,EAGT,OAFAA,EAAGjB,KAOPiU,EAAA/c,UAAAghB,sBAAA,WACE,OAAQ5gB,KAAKuf,YAAc,IAAIrZ,QAAM,SAAEC,GAAS,OAAc,IAAdA,EAAKwZ,QAAgBjgB,QAIvEid,EAAA/c,UAAAihB,iBAAA,eACQrhB,EAAIQ,KAAK4gB,wBACf,OAAU,IAANphB,EACK,GAEC,IAANA,EACK,EAEF,GAGTmd,EAAA/c,UAAAkhB,cAAA,eACQC,EAAe/gB,KAAK4gB,wBAE1B,GAAIG,GAAgB,EAClB,OAAO,MAEHC,EAAUD,EAAe,EAC/B,OAAqB,IAAjBA,EACK,GAGF/gB,KAAKkd,WACM,IAAZ8D,GAAiBD,EAAe,EAAK,EAAoB,GAAf,EAAIC,GACnC,IAAZA,EAAgB,GAAqB,GAAf,EAAIA,IAGzBrE,EAAA/c,UAAA0f,UAAR,SAAkBnY,GAChB,IAAKA,GAASA,GAAwB,IAAhBA,EAAKzH,OACzB,OAAO,MAEHuhB,EAAW,GAIjB,GAHA9Z,EAAKH,SAAO,SAAEb,GACZ8a,EAASpf,KAAKsE,EAAKsB,SAEjByZ,EAAI,IAAIC,IAAIF,IAAWvhB,SAAWyH,EAAKzH,OACzC,KAAM,6BAER,OAAO,GAGFid,EAAA/c,UAAAwhB,WAAP,WACEphB,KAAKgd,YAAYrY,KAAK3E,KAAK4f,mBAAmByB,gBAGzC1E,EAAA/c,UAAA0hB,UAAP,WACEthB,KAAKuhB,2BACDvhB,KAAKid,WAAWzY,UAAU9E,OAAS,EACrCM,KAAKid,WAAWtY,KAAK3E,KAAK4f,mBAAmByB,eAE7CrhB,KAAKgd,YAAYrY,KAAK3E,KAAK4f,mBAAmByB,gBAI3C1E,EAAA/c,UAAA2hB,yBAAP,WAAA,IAAAza,EAAA9G,KACQwhB,EAAqC,GAC3CxhB,KAAKuf,WAAWvY,SAAO,SAAEb,GACvBqb,EAAWrb,EAAKsB,MAAQX,EAAK4Y,4BAA4BvZ,EAAMA,EAAK5E,UAEtEvB,KAAK4f,mBAAmB6B,WAAWD,IAG9B7E,EAAA/c,UAAAmgB,cAAP,WACE,OAAO/f,KAAK4f,mBAAmByB,eAG1B1E,EAAA/c,UAAA8hB,SAAP,WAAA,IAAA5a,EAAA9G,KACEA,KAAKkd,YAAcld,KAAKkd,WACxBld,KAAKuf,WAAWvY,SAAO,SAAEb,EAAMqC,GAC7BrC,EAAKwZ,MAAO7Y,EAAKoW,YAAa1U,EAAQ,MAInCmU,EAAA/c,UAAA+hB,WAAP,SAAkBzb,OACV0b,EAAc,GACpBA,EAAY1b,EAAOuB,MAAQ,KAC3BzH,KAAK4f,mBAAmB6B,WAAWG,IAGrCjF,EAAA/c,UAAAiiB,aAAA,SAAa1b,GACX,OAAKA,IAGoB,MAArBA,EAAKkF,eACElF,EAAKkF,cAEZlF,EAAKwY,cAAkD,MAAlCxY,EAAKwY,aAAatT,gBAChClF,EAAKwY,aAAatT,eAOvBsR,EAAA/c,UAAAkf,eAAR,SAAuBgD,GAAvB,IAAAhb,EAAA9G,KACE,IAAKA,KAAK+hB,aAIR,OAHA/hB,KAAK2d,WAAa,GAClB3d,KAAK4d,cAAgB,UACrB5d,KAAK6d,kBDnVkC,QCsVzC7d,KAAK8d,eAAgB,EACjB9d,KAAKmf,eACPnf,KAAKmf,cAAcD,cAErBlf,KAAKmf,cAAgBnf,KAAK6c,YAAYmF,iBAAiBhiB,KAAKqf,iBAAiBZ,WAAS,SACnFtX,GAGC,GAFAL,EAAKgX,eAAgB,EACrBhX,EAAK6W,WAAaxW,GAAQ,GACtB2a,EACFhb,EAAKmb,kBD/V8B,QC+VmB,QACjD,GAAInb,EAAK8W,eAAiB9W,EAAK8W,cAAcsE,KAAM,KAClDC,EAAQrb,EAAK6W,WAAWyE,MAAI,SAAC9iB,GAAK,OAAAA,EAAE4iB,OAASpb,EAAK8W,cAAcsE,QACtEpb,EAAK8W,cAAgBuE,GAAS,KAC9Brb,EAAK+W,kBAAoBsE,EAAQA,EAAME,aDnWJ,WCqWtC,SACAC,GACCxb,EAAKgX,eAAgB,EACrBhX,EAAKyb,UAAU,aAAeD,GAAO,KACjCR,GACFhb,EAAKmb,kBD1W8B,QC0WmB,OAO9DtF,EAAA/c,UAAA4iB,qBAAA,eACQnb,EAAgC,GAChCob,EAASziB,KAAK2d,WAAWyE,MAAI,SAAC9iB,GAAK,MDnXA,SCmXAA,EAAE+iB,gBAe3C,OAdII,EACFpb,EAAOxF,KAAK4gB,GAEZpb,EAAOxF,KAAK,CACV6gB,UAAW1iB,KAAKqf,gBAChBgD,aDzXqC,OC0XrC3O,YAAalN,KAAKC,UAAUzG,KAAKyd,qBAAuB,OAG3Dzd,KAAK2d,YAAc,IAAI3W,SAAO,SAAC1H,GD7XS,SC8XnCA,EAAE+iB,cACJhb,EAAOxF,KAAKvC,MAGT+H,GAGTsV,EAAA/c,UAAA+iB,gBAAA,WACE,GAAK3iB,KAAK+hB,aAAV,KAGMa,EAAU5iB,KAAK4d,eAChB,CACD8E,UAAW1iB,KAAKqf,gBAChBgD,aAAcriB,KAAK6d,mBD5YkB,OC6YrCnK,YAAa,IAEjB1T,KAAK6iB,oBAAoB7iB,KAAK8iB,mBAAmBF,IACjD5iB,KAAKge,oBAAqB,IAG5BrB,EAAA/c,UAAAmjB,iBAAA,WACE/iB,KAAKge,oBAAqB,GAG5BrB,EAAA/c,UAAAojB,sBAAA,SAAsBC,GACpBjjB,KAAKkjB,mBAAqBD,GAG5BtG,EAAA/c,UAAAkjB,mBAAA,SAAmB3c,GACjB,OAAKA,GAGDA,EAAK+b,KACA/b,EAAK+b,KAHLliB,KAAKqe,kBAQR1B,EAAA/c,UAAAijB,oBAAR,SAA4BM,GAA5B,IAAArc,EAAA9G,KACQ2gB,EAAa3gB,KAAKwiB,uBAAuBY,KAAG,SAACjd,GACjD,MAAO,CACL5E,MAAOuF,EAAKgc,mBAAmB3c,GAC/B0V,MAAO1V,EAAKkc,iBAGhBriB,KAAKie,eAAiB,CACpB,CACEla,KAAMsf,GAAa/I,OACnBuB,MAAO,MACPpU,KAAM,YACN4S,SAAS,EACThR,MAAO,EACP9H,MAAO4hB,EACPG,YAAa,SACb3E,aAAc,CACZpd,MAAO,QACPsa,MAAO,QACPzQ,cAAc,EACduV,WAAYA,MAMpBhE,EAAA/c,UAAA2jB,cAAA,WACE,IAAKvjB,KAAKkjB,qBAAuBljB,KAAKkjB,mBAAmBM,MAEvD,OADAxjB,KAAKuiB,UAAU,WACR,MAEHkB,EAAYzjB,KAAKkjB,mBAAmB7B,cAAcoC,UACxD,GAAiB,MAAbA,GAAmC,KAAdA,EAEvB,OADAzjB,KAAKuiB,UAAU,WACR,MAEHpb,EAAOnH,KAAKwiB,uBACdriB,EAAyB,KAO7B,OALEA,EADEsjB,IAAczjB,KAAKqe,iBACZlX,EAAKib,MAAI,SAAC9iB,GAAK,MD5ce,SC4cfA,EAAE+iB,eAAmD/iB,EAAE4iB,SAC1E/a,EAAKib,MAAI,SAAC9iB,GAAK,MD7cmB,SC6cnBA,EAAE+iB,gBAEblb,EAAKib,MAAI,SAAC9iB,GAAK,OAAAA,EAAE4iB,OAASuB,OAMrCzjB,KAAK0jB,YAAYvjB,GAAQ,GACzBH,KAAKge,oBAAqB,GACnB,IALLhe,KAAKuiB,UAAU,WACR,IAOX5F,EAAA/c,UAAA+jB,gBAAA,SAAgBxd,GACd,SAAUA,GD3d+B,SC2dvBA,EAAKkc,eAGzB1F,EAAA/c,UAAAgkB,iBAAA,WACE,SAAU5jB,KAAK4d,gBAAiB5d,KAAK4d,cAAcsE,MD/dV,SCgepCliB,KAAK4d,cAAcyE,eAG1B1F,EAAA/c,UAAAikB,kBAAA,WAAA,IAAA/c,EAAA9G,KACE,GAAKA,KAAK+hB,aAAV,KAGMta,EAAOzH,KAAK6d,mBDveuB,OCwenCxQ,EAAuB,CAC3B6U,KAAMliB,KAAK4d,eAAiB5d,KAAK4d,cAAcsE,KAAOliB,KAAK4d,cAAcsE,KAAO,KAChFQ,UAAW1iB,KAAKqf,gBAChBgD,aAAc5a,EACdiM,YAAa1T,KAAK8jB,wBAEpB9jB,KAAK+d,cAAe,EAChB/d,KAAKof,iBACPpf,KAAKof,gBAAgBF,cAEvBlf,KAAKof,gBAAkBpf,KAAK6c,YAAYkH,KAAK1W,GAAMoR,WAAS,SACzDuF,GACCld,EAAKiX,cAAe,EACpBjX,EAAKmd,YAAY,QACjBnd,EAAK8W,cAAgBoG,EACrBld,EAAK+W,kBAAoBmG,EAAM3B,aAC/Bvb,EAAKod,kCACN,SACA5B,GACCxb,EAAKiX,cAAe,EACpBjX,EAAKyb,UAAU,SAAWD,GAAO,UAKvC3F,EAAA/c,UAAAukB,gBAAA,WACEnkB,KAAKokB,sBACLpkB,KAAKke,oBAAqB,GAG5BvB,EAAA/c,UAAAykB,iBAAA,WACErkB,KAAKke,oBAAqB,GAG5BvB,EAAA/c,UAAA0kB,sBAAA,SAAsBrB,GACpBjjB,KAAKukB,mBAAqBtB,GAGpBtG,EAAA/c,UAAAwkB,oBAAR,WACEpkB,KAAKme,eAAiB,CACpB,CACEpa,KAAMsf,GAAaze,MACnBiX,MAAO,QACPpU,KAAM,eACN4S,SAAS,EACThR,MAAO,EACPmb,UAAW,GACXjjB,MAAO,KACP+hB,YAAa,cAKnB3G,EAAA/c,UAAA6kB,cAAA,WAAA,IAAA3d,EAAA9G,KACE,IAAKA,KAAKukB,qBAAuBvkB,KAAKukB,mBAAmBf,MAEvD,OADAxjB,KAAKuiB,UAAU,aACR,MAEH9a,GAASzH,KAAKukB,mBAAmBlD,cAA0B,cAAK,IAAI5N,OAC1E,IAAKhM,EAEH,OADAzH,KAAKuiB,UAAU,aACR,EAET,GDviByC,SCuiBrC9a,EAEF,OADAzH,KAAKuiB,UAAU,uCACR,EAGT,IADgBviB,KAAK2d,YAAc,IAAIlI,MAAI,SAACnW,GAAK,OAAAA,EAAE+iB,eAAiB5a,KAGlE,OADAzH,KAAKuiB,UAAU,aACR,MAEHlV,EAAuB,CAC3BqV,UAAW1iB,KAAKqf,gBAChBgD,aAAc5a,EACdiM,YAAa1T,KAAK8jB,wBAoBpB,OAlBA9jB,KAAK+d,cAAe,EAChB/d,KAAKof,iBACPpf,KAAKof,gBAAgBF,cAEvBlf,KAAKof,gBAAkBpf,KAAK6c,YAAYkH,KAAK1W,GAAMoR,WAAS,SACzDuF,GACCld,EAAKiX,cAAe,EACpBjX,EAAKoX,oBAAqB,EAC1BpX,EAAKmd,YAAY,SACjBnd,EAAK8W,cAAgBoG,EACrBld,EAAK+W,kBAAoBmG,EAAM3B,aAC/Bvb,EAAKod,kCACN,SACA5B,GACCxb,EAAKiX,cAAe,EACpBjX,EAAKyb,UAAU,UAAYD,GAAO,SAG/B,GAGT3F,EAAA/c,UAAA8kB,oBAAA,WAAA,IAAA5d,EAAA9G,KACE,GAAKA,KAAK4jB,mBAAV,KAGM1B,EAAOliB,KAAK4d,cAAcsE,KAChCliB,KAAK+d,cAAe,EAChB/d,KAAKof,iBACPpf,KAAKof,gBAAgBF,cAEvBlf,KAAKof,gBAAkBpf,KAAK6c,YAAY8H,OAAOzC,GAAMzD,WAAS,WAE1D3X,EAAKiX,cAAe,EACpBjX,EAAKmd,YAAY,QACjBnd,EAAK6W,YAAc7W,EAAK6W,YAAc,IAAIzX,QAAM,SAAC5G,GAAK,OAAAA,EAAE4iB,OAASA,KACjEpb,EAAKmb,kBDxlBgC,QCwlBiB,MACvD,SACAK,GACCxb,EAAKiX,cAAe,EACpBjX,EAAKyb,UAAU,SAAWD,GAAO,UAK/B3F,EAAA/c,UAAAskB,6BAAR,WAAA,IAAApd,EAAA9G,KACOA,KAAK+hB,cAGV/hB,KAAK6c,YAAYmF,iBAAiBhiB,KAAKqf,iBAAiBZ,WAAS,SAC9DtX,GAEC,GADAL,EAAK6W,WAAaxW,GAAQ,GACtBL,EAAK8W,eAAiB9W,EAAK8W,cAAcsE,KAAM,KAC3CC,EAAQrb,EAAK6W,WAAWyE,MAAI,SAAC9iB,GAAK,OAAAA,EAAE4iB,OAASpb,EAAK8W,cAAcsE,QAClEC,IACFrb,EAAK8W,cAAgBuE,EACrBrb,EAAK+W,kBAAoBsE,EAAME,kBAGpC,gBAKG1F,EAAA/c,UAAAqiB,kBAAR,SAA0Bxa,EAAcmd,OAEhCzkB,EADOH,KAAKwiB,uBACEJ,MAAI,SAAC9iB,GAAK,OAAAA,EAAE+iB,eAAiB5a,KAC7CtH,GACFH,KAAK0jB,YAAYvjB,EAAQykB,IAIrBjI,EAAA/c,UAAA8jB,YAAR,SAAoBmB,EAAwBD,GAC1C5kB,KAAK4d,cAAgBiH,GAAUA,EAAO3C,KAAO2C,EAAS,CACpDnC,UAAW1iB,KAAKqf,gBAChBgD,aAAcwC,EAASA,EAAOxC,aD/nBS,OCgoBvC3O,YAAamR,EAASA,EAAOnR,YAAclN,KAAKC,UAAUzG,KAAKyd,qBAAuB,KAExFzd,KAAK6d,kBAAoB7d,KAAK4d,cAAcyE,cDloBH,WCooBrC3M,EAAc,GAClB,GDroByC,SCqoBrC1V,KAAK6d,mBAAyDgH,GAAUA,EAAO3C,KAE5E,CACL,IACExM,EAASlP,KAAK6M,MAAMwR,EAAOnR,aAAe,MAC1C,MAAO/R,GACP+T,EAAS,GD3oB4B,SC6oBnC1V,KAAK6d,oBAEPnI,EAASvW,OAAOC,OAAO,GAAIY,KAAKyd,qBAAuB,GAAI/H,GAAU,UATvEA,EAAS1V,KAAK8f,WAAW9f,KAAKyd,qBAAuB,IAYvDzd,KAAK8kB,kBAAkBpP,GACnBkP,GACF5kB,KAAKohB,cAIDzE,EAAA/c,UAAAkkB,qBAAR,WACE,OAAOtd,KAAKC,UAAUzG,KAAK+f,iBAAmB,KAGxCpD,EAAA/c,UAAAklB,kBAAR,SAA0BpP,GAA1B,IAAA5O,EAAA9G,KACE,GAAKA,KAAK4f,oBAAuB5f,KAAKuf,WAAtC,KAGMwF,EAAgC,GACtC/kB,KAAKuf,WAAWvY,SAAO,SAACb,GAClBuP,GAAUvW,OAAOS,UAAUC,eAAeC,KAAK4V,EAAQvP,EAAKsB,QAC9Dsd,EAAM5e,EAAKsB,MAAQX,EAAKke,kBAAkB7e,EAAMuP,EAAOvP,EAAKsB,WAGhEzH,KAAK4f,mBAAmB6B,WAAWsD,KAQ7BpI,EAAA/c,UAAA8f,4BAAR,SAAoCxZ,EAAgB3E,GAClD,OAAK2E,EAGDA,EAAOnC,OAASkhB,GAAexK,gBAA2B,MAATlZ,EAC5C,GAGP2E,EAAOnC,OAASkhB,GAAezK,YACrB,MAATjZ,GAAkB+D,MAAM8B,QAAQ7F,IAA2B,IAAjBA,EAAM7B,QAE1C,KAEF6B,EAXEA,GAcHob,EAAA/c,UAAAolB,kBAAR,SAA0B9e,EAAgB3E,GAA1C,IAAAuF,EAAA9G,KACE,OAAa,MAATuB,EACKvB,KAAK0f,4BAA4BxZ,EAAQ3E,GAE9C2E,EAAOnC,OAASkhB,GAAezK,UAC7BlV,MAAM8B,QAAQ7F,GACK,IAAjBA,EAAM7B,OACD,KAEF6B,EAAM6hB,KAAG,SAAC8B,GAAK,OAAApe,EAAKqe,cAAcD,MAEpC3jB,EAEL2E,EAAOnC,OAASkhB,GAAe1K,MAAQrU,EAAOnC,OAASkhB,GAAetK,MACjE3a,KAAKmlB,cAAc5jB,GAErBA,GAGDob,EAAA/c,UAAAulB,cAAR,SAAsB5jB,GACpB,GAAa,MAATA,GAAiBA,aAAiBgZ,KACpC,OAAOhZ,EAET,GAAqB,iBAAVA,GAAsB,qBAAqB6jB,KAAK7jB,GAAQ,KAC3DjB,EAAI,IAAIia,KAAKhZ,GACnB,OAAOgI,MAAMjJ,EAAE+kB,WAAa9jB,EAAQjB,EAEtC,GAAqB,iBAAViB,EAAoB,CACvBjB,EAAI,IAAIia,KAAKhZ,GACnB,OAAOgI,MAAMjJ,EAAE+kB,WAAa9jB,EAAQjB,EAEtC,OAAOiB,GAGDob,EAAA/c,UAAAkgB,WAAR,SAAmBwF,GACjB,IACE,OAAO9e,KAAK6M,MAAM7M,KAAKC,UAAiB,MAAP6e,EAAc,GAAKA,IACpD,MAAO3jB,GACP,MAAO,KAIHgb,EAAA/c,UAAAqkB,YAAR,SAAoBsB,GACI,oBAAXrW,QAA0B,OAAgBsW,kBACnD,OAAgBA,iBAAiB5lB,UAAU6lB,QAAQF,IAI/C5I,EAAA/c,UAAA2iB,UAAR,SAAkBgD,GACM,oBAAXrW,QAA0B,OAAgBsW,iBACnD,OAAgBA,iBAAiB5lB,UAAUkC,MAAMyjB,GAGjDG,QAAQ5jB,MAAMyjB,wBAluBnBpjB,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,YACVC,SAAA,80gBApBOqjB,EAAAA,mBAePC,GAAmB1lB,WAAA,CAAA,CAAA6D,KAyDhB8hB,EAAAA,UAAQ,CAAA9hB,KAAI+hB,EAAAA,OAAM1jB,KAAA,CAACqa,6CA/CrB7X,EAAAA,kCAEAA,EAAAA,+BAEAA,EAAAA,2BAEAA,EAAAA,2BAEAC,EAAAA,2BACAA,EAAAA,UAPwBC,EAAAA,CAAfC,EAAAA,iFAIeD,EAAAA,CAAfC,EAAAA,0EA4tBZ4X,KCrvBA,IAAAoJ,GAAA,WAmBE,SAAAA,EAAoBnJ,GAApB,IAAA9V,EAAA9G,KAAoBA,KAAA4c,GAAAA,EAZV5c,KAAAgmB,YAAc,IAAI3hB,EAAAA,aAIpBrE,KAAAod,cAAgB,IAAIC,EAAAA,QACpBrd,KAAAsd,gBAA0B,EAG1Btd,KAAAud,kBAAoB,IAAIF,EAAAA,QACxBrd,KAAAwd,0BAAoC,EAqenCxd,KAAAimB,4BAA2B,SAAI1kB,GAAmB,OAAAA,GAClDvB,KAAAkmB,yBAAwB,SAAI3kB,GAAkB,OAAAA,GAEvDvB,KAAA+b,sBAAwBA,GACxB/b,KAAAic,yBAA2BA,GAC3Bjc,KAAAqc,qBAAuBA,GAterBrc,KAAKse,mBAAqBte,KAAKod,cAC5BmB,KAAKC,EAAAA,aAAaxe,KAAKsd,kBACvBmB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MAAY,OAAA5B,EAAK4C,aAAaC,EAAIjB,MACtD1I,KAAK4e,uBAAyB5e,KAAKud,kBAChCgB,KAAKC,EAAAA,aAAaxe,KAAKwd,4BACvBiB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MAEZA,GACF5B,EAAK4C,aAAaC,EAAIjB,MA+dhC,OA1dEqd,EAAAnmB,UAAAsC,SAAA,WACOlC,KAAKmmB,UAAqC,IAAzBnmB,KAAKmmB,SAASzmB,OAMpCM,KAAK6e,OAJH7e,KAAKomB,eAAiBpmB,KAAK4c,GAAGiD,MAAM,KAOxCkG,EAAAnmB,UAAA0G,YAAA,SAAYC,GACV,GACEA,EAAkB,UAClBC,KAAKC,UAAUF,EAAkB,SAAEG,gBACjCF,KAAKC,UAAUF,EAAkB,SAAEI,eACrC,CACA,IAAK3G,KAAKmmB,UAAqC,IAAzBnmB,KAAKmmB,SAASzmB,OAElC,YADAM,KAAKomB,eAAiBpmB,KAAK4c,GAAGiD,MAAM,KAGtC7f,KAAK6e,SAITkH,EAAAnmB,UAAAugB,cAAA,SAAcxW,EAASjB,EAAY0X,GAAnC,IAAAtZ,EAAA9G,KACE,GAAK2J,EAAL,KAGM8W,EACyB,MAA7BL,EAAoCA,EAA4B,EAE7DK,GAILzgB,KAAKsd,gBAAkBmD,EACnBzgB,KAAKse,oBACPte,KAAKse,mBAAmBY,cAE1Blf,KAAKse,mBAAqBte,KAAKod,cAC5BmB,KAAKC,EAAAA,aAAaxe,KAAKsd,kBACvBmB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MAAY,OAAA5B,EAAK4C,aAAaC,EAAIjB,MACtD1I,KAAKod,cAAc9b,KAAK,CAAEqI,GAAEA,EAAEjB,MAAKA,KAVjC1I,KAAK0J,aAAaC,EAAIjB,KAa1Bqd,EAAAnmB,UAAAygB,kBAAA,SACE1W,EACA2W,EACAC,EACA8F,GAJF,IAAAvf,EAAA9G,KAME,GAAK2J,EAAL,CAII2W,GACFtgB,KAAKwgB,yBAAyB6F,OAE1B5F,EAC6B,MAAjCF,EACIA,EACA,EAEDE,GAMLzgB,KAAKwd,0BAA4BiD,EAC7BzgB,KAAK4e,wBACP5e,KAAK4e,uBAAuBM,cAE9Blf,KAAK4e,uBAAyB5e,KAAKud,kBAChCgB,KAAKC,EAAAA,aAAaxe,KAAKwd,4BACvBiB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MACZA,GACF5B,EAAK4C,aAAaC,EAAIjB,MAG5B1I,KAAKud,kBAAkBjc,KAAK,CAAEqI,GAAEA,EAAEjB,MAAO4X,KAhBnCA,GACFtgB,KAAK0J,aAAaC,EAAI2W,KAmBpByF,EAAAnmB,UAAA4gB,yBAAR,SAAiC6F,GAC/B,GAAKA,GAAaA,EAAS1H,aAA3B,KAGM+B,EAAM2F,EAAS1H,aACC,MAAlB+B,EAAIC,aACND,EAAIC,WAAa,MAIrBoF,EAAAnmB,UAAA8J,aAAA,SAAaC,EAASjB,GAChBiB,GACFA,EAAGjB,IAICqd,EAAAnmB,UAAAif,KAAR,WAAA,IAAA/X,EAAA9G,KAEE,IAAKA,KAAKsf,UAAUtf,KAAKmmB,UACvB,KAAM,gBAGRnmB,KAAKmmB,SAASnf,SAAO,SAAEb,GACjBA,EAAKpC,OAASsf,GAAa9H,gBAC7BpV,EAAKkD,MAAQ,MAIjBrJ,KAAKsmB,cAED9G,EAAgB,GACpBxf,KAAKmmB,SAASnf,SAAO,SAAEb,EAAMqC,GAE3B,GAAkB,IAAdrC,EAAKpC,MAAcoC,EAAK5E,MAAO,CAC3B,IAAAmd,EAAAhd,EAAAyE,EAAA5E,sEAACglB,EAAA7H,EAAA,GAAM8H,EAAA9H,EAAA,GAAO+H,EAAA/H,EAAA,GAIdgI,EAAa,IAAInM,KAAKgM,EAAMC,EAAQ,EAAGC,GAC1CE,mBAAmB,aAAc,CAChCJ,KAAM,UACNC,MAAO,UACPC,IAAK,YAENtY,QAAQ,MAAO,KACdhI,EAAKygB,UACPpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAO,IAAIgZ,KAAKmM,GAAaviB,SAAUgC,EAAKhC,UAC9CgC,EAAKkU,UAAYlU,EAAKC,KAClB,CAACygB,EAAAA,WAAWC,SAAU3gB,EAAKygB,WAC3B,IAGNpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAO,IAAIgZ,KAAKmM,GAAaviB,SAAUgC,EAAKhC,UAC9CgC,EAAKkU,UAAYlU,EAAKC,KAAO,CAACygB,EAAAA,WAAWC,UAAY,SAGpD,GAAkB,IAAd3gB,EAAKpC,MAAcoC,EAAK5E,MAAO,KACpCwlB,EAAevgB,KAAK6M,MAAM7M,KAAKC,UAAUN,EAAK5E,QAClD,KAAIwlB,GAAgBA,aAAwBzhB,OA4B1C,KAAM,iEA3BNyhB,EAAeA,EAAa3D,KAAG,SAAEjd,GACzB,IAAAuY,EAAAhd,EAAAyE,uDAACogB,EAAA7H,EAAA,GAAM8H,EAAA9H,EAAA,GAAO+H,EAAA/H,EAAA,GAGdgI,EAAa,IAAInM,KAAKgM,EAAMC,EAAQ,EAAGC,GAC1CE,mBAAmB,aAAc,CAChCJ,KAAM,UACNC,MAAO,UACPC,IAAK,YAENtY,QAAQ,MAAO,KAClBhI,EAAO,IAAIoU,KAAKmM,MAEdvgB,EAAKygB,UACPpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAOwlB,EAAc5iB,SAAUgC,EAAKhC,UACtCgC,EAAKkU,UAAYlU,EAAKC,KAClB,CAACygB,EAAAA,WAAWC,SAAU3gB,EAAKygB,WAC3B,IAGNpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAOwlB,EAAc5iB,SAAUgC,EAAKhC,UACtCgC,EAAKkU,UAAYlU,EAAKC,KAAO,CAACygB,EAAAA,WAAWC,UAAY,SAMtD,GAAI3gB,EAAKpC,OAASsf,GAAa/H,UAAYnV,EAAK6gB,eAAgB,KAC/DC,EAAgB3hB,MAAM8B,QAAQjB,EAAK5E,OAAS4E,EAAK5E,MAAQ,GAC3D4E,EAAKygB,UACPpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAO0lB,EAAe9iB,SAAUgC,EAAKhC,UACvCgC,EAAKkU,UAAYlU,EAAKC,KAClB,CAACygB,EAAAA,WAAWC,SAAU3gB,EAAKygB,WAC3B,IAGNpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAO0lB,EAAe9iB,SAAUgC,EAAKhC,UACvCgC,EAAKkU,UAAYlU,EAAKC,KAAO,CAACygB,EAAAA,WAAWC,UAAY,SAGpD,GAAI3gB,EAAKpC,OAASsf,GAAa/H,SAAU,CACxC2L,EAA8B,MAAd9gB,EAAK5E,OAAgB4E,EAAK5E,MAC5C4E,EAAKygB,UACPpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAO0lB,EAAe9iB,SAAUgC,EAAKhC,UACvCgC,EAAKkU,UAAYlU,EAAKC,KAClB,CAACygB,EAAAA,WAAWC,SAAU3gB,EAAKygB,WAC3B,IAGNpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAO0lB,EAAe9iB,SAAUgC,EAAKhC,UACvCgC,EAAKkU,UAAYlU,EAAKC,KAAO,CAACygB,EAAAA,WAAWC,UAAY,SAGpD,GAAI3gB,EAAKpC,OAASsf,GAAa9H,cAAe,KAC7C2L,EAAc5hB,MAAM8B,QAAQjB,EAAK5E,OAAS4E,EAAK5E,MAAQ,KACvD4lB,EACiB,MAArBhhB,EAAKghB,aAAuBhhB,EAAKghB,aAAe,KAC5CC,EACJjhB,EAAKkU,UAAYlU,EAAKC,KAAO,CAACygB,EAAAA,WAAWC,UAAY,GACnD3gB,EAAKygB,UACPpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAO2lB,EAAa/iB,SAAUgC,EAAKhC,UACrCgC,EAAKkU,UAAYlU,EAAKC,KAClB,CAACygB,EAAAA,WAAWC,SAAU3gB,EAAKygB,WAC3B,CAACzgB,EAAKygB,YAGZpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAO2lB,EAAa/iB,SAAUgC,EAAKhC,UACrCijB,GAGJ5H,EAAcrZ,EAAKkhB,aAAevgB,EAAK8V,GAAG6C,QACxC,CAAEle,MAAO4lB,EAAchjB,SAAUgC,EAAKhC,UACtCijB,QAGEjhB,EAAKygB,UACPpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAO4E,EAAK5E,MAAO4C,SAAUgC,EAAKhC,UACpCgC,EAAKkU,UAAYlU,EAAKC,KAClB,CAACygB,EAAAA,WAAWC,SAAU3gB,EAAKygB,WAC3B,IAGNpH,EAAcrZ,EAAKsB,MAAQX,EAAK8V,GAAG6C,QACjC,CAAEle,MAAO4E,EAAK5E,MAAO4C,SAAUgC,EAAKhC,UACpCgC,EAAKkU,UAAYlU,EAAKC,KAAO,CAACygB,EAAAA,WAAWC,UAAY,OAM7D9mB,KAAKomB,eAAiBpmB,KAAK4c,GAAGiD,MAAML,GAEpCxf,KAAKmmB,SAASnf,SAAO,SAAEb,GACrB,GAAIA,EAAK6Z,cAAe,KAChBS,EAC8B,MAAlCta,EAAK8Z,0BACD9Z,EAAK8Z,0BACL,EACAR,EAAU3Y,EAAKsf,eAAete,IAAI3B,EAAKsB,MAEzCgZ,EAAa,EACfhB,EAAQS,aACL3B,KAAKC,EAAAA,aAAaiC,IAClBhC,WAAS,SAAEld,GACV,OAAAuF,EAAK4C,aAAavD,EAAK6Z,cAAeze,MAG1Cke,EAAQS,aAAazB,WAAS,SAAEld,GAC9B,OAAAuF,EAAK4C,aAAavD,EAAK6Z,cAAeze,UAK9CvB,KAAKomB,eAAelG,aAAazB,WAAS,SAAErL,GAC1C,OAAAtM,EAAKwgB,qBAAqBlU,MAE5BpT,KAAKsnB,wBAGCvB,EAAAnmB,UAAA0mB,QAAR,WAIE,QAFMiB,EAAiBvnB,KAAKmmB,SAASzmB,OACjCmM,EAAO,EACFtM,EAAI,EAAGA,EAAIgoB,EAAgBhoB,IAClC,IAAKS,KAAKmmB,SAAS5mB,GAAG6G,KACpB,GAAU,IAAN7G,EACFS,KAAKmmB,SAAS5mB,GAAGsb,WAAa7a,KAAKmmB,SAAS5mB,GAAG8J,OAAS,EACxDrJ,KAAKmmB,SAAS5mB,GAAGub,WAAa,EAC9BjP,GAAc,OAGd,IAAK,IAAI2b,EAAIjoB,EAAI,EAAGioB,GAAK,EAAGA,IAC1B,GAAIxnB,KAAKmmB,SAASqB,GAAG3M,WAAY,CAC/B7a,KAAKmmB,SAAS5mB,GAAGsb,WACf7a,KAAKmmB,SAASqB,GAAG3M,YAAc7a,KAAKmmB,SAAS5mB,GAAG8J,OAAS,GAEzDrJ,KAAKmmB,SAASqB,GAAG3M,YAAc7a,KAAKmmB,SAAS5mB,GAAG8J,OAAS,GACvDwC,GACF7L,KAAKmmB,SAASqB,GAAG3M,YAAchP,GAE/BA,GAAc,EACd7L,KAAKmmB,SAAS5mB,GAAGub,WAAa,GAE9B9a,KAAKmmB,SAAS5mB,GAAGub,WAAa,EAEhC,MAQV,IAAK,IAAIzZ,EAAI,EAAGA,EAAIkmB,EAAgBlmB,IAClC,GAAoC,IAAhCrB,KAAKmmB,SAAS9kB,GAAGyZ,WAAkB,CACrC9a,KAAKmmB,SAAS9kB,GAAGomB,YAAc,GAE/B,QADIC,EAAQ,EACHloB,EAAI,EAAGA,EAAI+nB,EAAiBlmB,IACrB,IAAVqmB,GAAmD,IAApC1nB,KAAKmmB,SAAS9kB,EAAI7B,GAAGsb,YADFtb,KAKnCQ,KAAKmmB,SAAS9kB,EAAI7B,GAAG4G,MACtBpG,KAAKmmB,SAAS9kB,EAAI7B,IACkB,IAApCQ,KAAKmmB,SAAS9kB,EAAI7B,GAAGsb,aAErB9a,KAAKmmB,SAAS9kB,GAAGomB,YAAY5lB,KAAK7B,KAAKmmB,SAAS9kB,EAAI7B,IACpDkoB,OAOF3B,EAAAnmB,UAAA0nB,qBAAR,SAA6BlU,GAC3BpT,KAAKgmB,YAAYrhB,KAAK3E,KAAKomB,iBAGrBL,EAAAnmB,UAAA0f,UAAR,SAAkBnY,GAChB,IAAKA,GAASA,GAAwB,IAAhBA,EAAKzH,OACzB,OAAO,MAELuhB,EAAW,GAqBf,GApBA9Z,EAAKH,SAAO,SAAEb,GAKZ,GAAIA,EAAKpC,OAASsf,GAAa9H,gBAAkBpV,EAAKkhB,YACpD,KAAM,wCAER,KACElhB,EAAKpC,OAASsf,GAAa9H,eACzBpV,EAAK6V,gBAAmB7V,EAAK6V,eAAe2L,SAE9C,KAAM,mDAER1G,EAASpf,KAAKsE,EAAKsB,MACftB,EAAKpC,OAASsf,GAAa9H,eAC7B0F,EAASpf,KAAKsE,EAAKkhB,gBAInBnG,EAAI,IAAIC,IAAIF,IAAWvhB,SAAWuhB,EAASvhB,OAC7C,KAAM,2BAGR,OAAO,GAITqmB,EAAAnmB,UAAAgoB,+BAAA,SAA+BzhB,GAC7B,IAAKnG,KAAKomB,eACR,MAAO,OAEHyB,EAAS7nB,KAAKomB,eAAete,IAAI3B,EAAKsB,MACtCD,EAAUrB,EAAKkhB,YACjBrnB,KAAKomB,eAAete,IAAI3B,EAAKkhB,aAC7B,KACES,EAAY,SAAIrI,GACpB,OAAAA,GAAWA,EAAQsI,OAAStI,EAAQuI,SACtC,OAAIF,EAAaD,IAAWC,EAAatgB,GAChC,QAEF,IAGTue,EAAAnmB,UAAAqoB,yBAAA,SAAyB9hB,GACvB,IAAKnG,KAAKomB,eACR,MAAO,OAEHyB,EAAS7nB,KAAKomB,eAAete,IAAI3B,EAAKsB,MACtCD,EAAUrB,EAAKkhB,YACjBrnB,KAAKomB,eAAete,IAAI3B,EAAKkhB,aAC7B,KACJ,GAAIQ,GAAUA,EAAOE,OAASF,EAAOK,SAAS,YAC5C,OAAO/hB,EAAK0V,MAAQ,OAEtB,GAAIrU,GAAWA,EAAQugB,OAASvgB,EAAQ0gB,SAAS,YAC/C,MAAO,WAET,GAAI/hB,EAAKgiB,eAAiBN,EACxB,IAAK,IAAItoB,EAAI,EAAGA,EAAI4G,EAAKgiB,cAAczoB,OAAQH,IAAK,KAC5Ca,EAAM+F,EAAKgiB,cAAc5oB,GAC/B,GAAIsoB,EAAOK,SAAS9nB,EAAIA,KACtB,OAAOA,EAAIyb,MAIjB,OAAO1V,EAAK0V,MAAQ,QAGfkK,EAAAnmB,UAAAwhB,WAAP,WACEjiB,OAAOuW,OAAO1V,KAAKomB,eAAegC,UAAUphB,SAAO,SAAEyY,GACnDA,EAAQ4I,cACR5I,EAAQ6I,4BAEVtoB,KAAKgmB,YAAYrhB,KAAK3E,KAAKomB,eAAe/E,gBAGrC0E,EAAAnmB,UAAA0hB,UAAP,WACEthB,KAAKomB,eAAe7iB,QACpBpE,OAAOuW,OAAO1V,KAAKomB,eAAegC,UAAUphB,SAAO,SAAEyY,GACnDA,EAAQ4I,cACR5I,EAAQ6I,4BAEVtoB,KAAKgmB,YAAYrhB,KAAK3E,KAAKomB,eAAe/E,gBAGrC0E,EAAAnmB,UAAA+hB,WAAP,SAAkBzb,OACV0b,EAAc,GACpBA,EAAY1b,EAAOuB,MAAQ,KAC3BzH,KAAKomB,eAAe3E,WAAWG,IAMjCmE,EAAAnmB,UAAAiiB,aAAA,SAAa1b,GACX,OAAKA,IAGoB,MAArBA,EAAKkF,eACElF,EAAKkF,cAEZlF,EAAKwY,cAAkD,MAAlCxY,EAAKwY,aAAatT,gBAChClF,EAAKwY,aAAatT,eAK/B0a,EAAAnmB,UAAA2oB,kBAAA,SAAkB9gB,EAAclG,OACxBke,EAAUzf,KAAKomB,eAAete,IAAIL,GAClCmb,EAAUnD,EAAUA,EAAQle,MAAQ,KAC1C,OAAO+D,MAAM8B,QAAQwb,KAAwC,IAA5BA,EAAQ7I,QAAQxY,IAGnDwkB,EAAAnmB,UAAA4oB,qBAAA,SAAqB/gB,EAAclG,EAAYknB,OACvChJ,EAAUzf,KAAKomB,eAAete,IAAIL,GACxC,GAAKgY,EAAL,KAGMmD,EAAUtd,MAAM8B,QAAQqY,EAAQle,OAAMQ,EAAO0d,EAAQle,OAAS,GAC9DiH,EAAQoa,EAAQ7I,QAAQxY,GAC1BknB,IAAsB,IAAXjgB,EACboa,EAAQ/gB,KAAKN,GACHknB,IAAsB,IAAXjgB,GACrBoa,EAAQ8F,OAAOlgB,EAAO,GAExBiX,EAAQkJ,SAAS/F,GACjBnD,EAAQ4I,cACR5I,EAAQ6I,+CAlfXnmB,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,UACVC,SAAA,g9pCAZOqjB,EAAAA,iDAgBN/gB,EAAAA,2BACAC,EAAAA,UAofHkhB,EA3fA,GClBA,IAAA6C,GAAA,WAMA,SAAAA,KAW4B,2BAX3BlmB,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAyH,EAAAA,oBACAxH,EAAAA,kBACAkC,GAEFjC,aAAc,CAACgjB,IACf/iB,QAAS,CAAC+iB,QAEgB6C,EAjB5B,GCAAC,GAAA,WAOA,SAAAA,KAY8B,2BAZ7BnmB,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAyH,EAAAA,oBACAxH,EAAAA,kBACAkC,EACA4jB,IAEF7lB,aAAc,CAAC4Z,IACf3Z,QAAS,CAAC2Z,QAEkBkM,EAnB9B,GCAAC,GAAA,WAEA,SAAAA,KAiBA,OAfEA,EAAAlpB,UAAAmpB,WAAA,SAAWC,EAAqBC,GAC1BA,EACF/Z,OAAOga,eAAeC,QAAQH,EAAaxiB,KAAKC,UAAUwiB,IAE1D/Z,OAAOga,eAAeE,WAAWJ,IAIrCF,EAAAlpB,UAAAypB,WAAA,SAAWL,GACT,OAAOxiB,KAAK6M,MAAMnE,OAAOga,eAAeI,QAAQN,KAGlDF,EAAAlpB,UAAA2pB,cAAA,SAAcP,GACZ9Z,OAAOga,eAAeE,WAAWJ,wBAfpCplB,EAAAA,aAiBDklB,EAnBA,MCGA,WAKE9oB,KAAAqa,SAAoB,EACpBra,KAAAoG,MAAiB,EACjBpG,KAAAwpB,kBAA6B,EAE7BxpB,KAAAypB,QAAmB,EAEnBzpB,KAAAuB,MAAyE,KASzEvB,KAAAma,YAA4B,IAAIzO,EAMhC1L,KAAA+a,aAAwB,EAExB/a,KAAAoa,UAAqB,EAErBpa,KAAA0pB,WAAsB,GAMxB,IAAAC,GAAA,aAKA,IAAAC,GAAA,qBAQEhlB,MAAQ,QACR0V,OAAS,SACTC,KAAO,OACPC,UAAY,YACZS,SAAW,WACXvP,YAAc,cACd+O,eAAiB,iBACjBS,QAAU,UACVC,OAAS,SACTC,KAAO,WAIT,WACEpb,KAAA6pB,KAAsB,IAGxB,IAAAC,GAAA,WAIE,SAAAA,gCAJDlmB,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,wJADd,GC9BAkmB,GAAA,WAgHE,SAAAA,EACUnN,EACA7M,EACAia,GAHV,IAAAljB,EAAA9G,KACUA,KAAA4c,GAAAA,EACA5c,KAAA+P,IAAAA,EACA/P,KAAAgqB,qBAAAA,EA3GehqB,KAAAiqB,gBAA0B,EAC1BjqB,KAAAkqB,YAAsB,EACrClqB,KAAAmqB,oBAAsB,IAAI9lB,EAAAA,aACXrE,KAAAoqB,wBAAkC,EAElCpqB,KAAAqqB,uBAAiC,EACjCrqB,KAAA+Q,cAAwB,EACxB/Q,KAAAkQ,YAAsB,EAEtBlQ,KAAAsqB,cAAwB,EAExBtqB,KAAAuqB,iBAA2B,EAM3CvqB,KAAAwqB,eAAgC,CAAC,MAAO,UACxCxqB,KAAAoQ,OAAoC,CAAEpB,EAAG,OACxChP,KAAAgmB,YAAc,IAAI3hB,EAAAA,aAElBrE,KAAAyqB,aAAe,IAAIpmB,EAAAA,aAEnBrE,KAAA0qB,gBAAkB,IAAIrmB,EAAAA,aACPrE,KAAA2qB,mBAA6B,EACtD3qB,KAAA4qB,oBAA8B,EAC9B5qB,KAAA6qB,mBAA6B,GAMJ7qB,KAAAwQ,WAAqB,EACrCxQ,KAAAyQ,YAAkC,GAClCzQ,KAAA0Q,cAAiC,EAC1C1Q,KAAA4Q,gBAAkB,GAElB5Q,KAAA8qB,UAAoB,EAEpB9qB,KAAA0R,mBAA0B,GAC1B1R,KAAA+qB,yBAAgC,GAChC/qB,KAAAgrB,iBAAkC,GAClChrB,KAAAyR,cAAwB,EACxBzR,KAAAirB,WAAqB,EAEbjrB,KAAAkrB,eAAiB,IAAI/J,IACrBnhB,KAAAod,cAAgB,IAAIC,EAAAA,QACpBrd,KAAAsd,gBAA0B,EAK1Btd,KAAAud,kBAAoB,IAAIF,EAAAA,QACxBrd,KAAAwd,0BAAoC,EAI5Cxd,KAAAmrB,eASI,GAEJnrB,KAAAorB,WAAqB,KACrBprB,KAAAqrB,WAAqB,KACrBrrB,KAAAsrB,UAM4B,KAC5BtrB,KAAAurB,6BAAuC,EAcvCvrB,KAAAwrB,mBAA6B,EAC7BxrB,KAAAyrB,eAAyB,EACzBzrB,KAAA0rB,aAAgC,GAChC1rB,KAAA2rB,cAAiC,GACjC3rB,KAAA4rB,mBAAsC,GACtC5rB,KAAA6rB,oBAAuC,GACvC7rB,KAAA8rB,qBAA6C,IAAIC,GACzC/rB,KAAAgsB,YAAmB,KACnBhsB,KAAAisB,aAAuB,GAGvBjsB,KAAAksB,iBAA2B,EA8iDzBlsB,KAAAmsB,gBAAkB,IAAI9nB,EAAAA,aAmRxBrE,KAAAosB,eAA4C,GA1zDlDpsB,KAAKgsB,YAAcK,EAAAA,eAA2B,CAC5CC,OAAQC,EAAAA,UACR9kB,KAAM,UACN+kB,QAAS,EACTC,UAAW,kBAEbzsB,KAAKse,mBAAqBte,KAAKod,cAC5BmB,KAAKC,EAAAA,aAAaxe,KAAKsd,kBACvBmB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MAAOgkB,EAAAhO,EAAAgO,KAAW,OAAA5lB,EAAK4C,aAAaC,EAAIjB,EAAOgkB,MACnE1sB,KAAK4e,uBAAyB5e,KAAKud,kBAChCgB,KAAKC,EAAAA,aAAaxe,KAAKwd,4BACvBiB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MAAOgkB,EAAAhO,EAAAgO,KACnBhkB,GACF5B,EAAK4C,aAAaC,EAAIjB,EAAOgkB,MAm1DvC,OA90DE3C,EAAAnqB,UAAAsC,SAAA,WACElC,KAAKisB,aAAeU,SAASC,SACzB5sB,KAAKisB,eACPjsB,KAAKisB,aAAejsB,KAAKisB,aAAa9d,QAAQ,MAAO,MAEvDnO,KAAK6sB,YAAc7sB,KAAKgqB,qBAAqBX,WAC3C,gCAEGrpB,KAAK6sB,cACR7sB,KAAK6sB,YAAc,CAAEC,SAAU,QAGjC9sB,KAAK0R,mBAAqB1R,KAAK+sB,cAC/B/sB,KAAKgtB,kBACLhtB,KAAK6e,QAGPkL,EAAAnqB,UAAAqS,gBAAA,WAAA,IAAAnL,EAAA9G,KACEA,KAAKitB,iBACLjtB,KAAKktB,oBAAsBltB,KAAKmtB,iBAAiB5mB,QAAQkY,WAAS,WAChE3X,EAAKmmB,qBAITlD,EAAAnqB,UAAAuS,YAAA,WACMnS,KAAKse,oBACPte,KAAKse,mBAAmBY,cAEtBlf,KAAK4e,wBACP5e,KAAK4e,uBAAuBM,cAE1Blf,KAAKktB,qBACPltB,KAAKktB,oBAAoBhO,eAI7B/f,OAAAyB,eAAImpB,EAAAnqB,UAAA,kBAAe,KAAnB,WACE,OAAOI,KAAKotB,eAAehF,SAAS1oB,wCAGtCP,OAAAyB,eAAImpB,EAAAnqB,UAAA,kBAAe,KAAnB,eACQytB,GAASrtB,KAAKwqB,gBAAkB,IAAItkB,QAAM,SAAEonB,GAChD,MAAA,CAAC,MAAO,OAAQ,UAAUpZ,SAASoZ,MACnC5tB,OACF,OAAO8J,KAAKoC,IAAY,GAARyhB,EAAY,qCAI9BluB,OAAAyB,eAAImpB,EAAAnqB,UAAA,sBAAmB,KAAvB,eACQ2tB,GAAWvtB,KAAKwqB,gBAAkB,IAAItkB,QAAM,SAAEonB,GAClD,MAAA,CAAC,MAAO,OAAQ,UAAUpZ,SAASoZ,MAErC,OACEttB,KAAKkqB,YACc,IAAnBqD,EAAQ7tB,QACO,WAAf6tB,EAAQ,oCAKZpuB,OAAAyB,eAAImpB,EAAAnqB,UAAA,iBAAc,KAAlB,WACE,OAAOI,KAAKsqB,aAAe,OAAS,uCAG9BP,EAAAnqB,UAAA4tB,cAAR,WACE,MAAO,UAAUjT,KAAKkT,MAAK,IAAIjkB,KAAKkkB,SAASzZ,SAAS,IAAI/L,MAAM,EAAG,IAG7D6hB,EAAAnqB,UAAA+tB,SAAR,SAAiBjB,GACf,OAAKA,GAASA,EAAK5kB,IAAI,YAGhB4kB,EAAK5kB,IAAI,YAAYvG,MAFnB,MAMHwoB,EAAAnqB,UAAAguB,oBAAR,eACQC,GAAS7tB,KAAK4qB,oBAAsB,GAAK5qB,KAAK6qB,mBAC9CiD,EAAMD,EAAQ7tB,KAAK6qB,mBACzB,OAAQ7qB,KAAKotB,eAAuB,SAAiBllB,MAAM2lB,EAAOC,IAGpE/D,EAAAnqB,UAAAmuB,cAAA,SAAcrB,OACNsB,EAAKhuB,KAAK2tB,SAASjB,GACzB,QAASsB,GAAMhuB,KAAKkrB,eAAerjB,IAAImmB,IAGzCjE,EAAAnqB,UAAAquB,aAAA,WAAA,IAAAnnB,EAAA9G,KACQkuB,EAAYluB,KAAK4tB,sBACvB,OACEM,EAAUxuB,OAAS,GACnBwuB,EAAU1Y,OAAK,SAAEkX,GAAS,OAAA5lB,EAAKinB,cAAcrB,OAIjD3C,EAAAnqB,UAAAuR,gBAAA,WAAA,IAAArK,EAAA9G,KACQkuB,EAAYluB,KAAK4tB,sBACjBO,EAAeD,EAAUhoB,QAAM,SAAEwmB,GACrC,OAAA5lB,EAAKinB,cAAcrB,MACnBhtB,OACF,OAAOyuB,EAAe,GAAKA,EAAeD,EAAUxuB,QAGtDqqB,EAAAnqB,UAAAwuB,aAAA,SAAa3F,GAAb,IAAA3hB,EAAA9G,KACEA,KAAK4tB,sBAAsB5mB,SAAO,SAAE0lB,OAC5BsB,EAAKlnB,EAAK6mB,SAASjB,GACpBsB,IAGDvF,EACF3hB,EAAKokB,eAAe1nB,IAAIwqB,GAExBlnB,EAAKokB,eAAevG,OAAOqJ,OAG/BhuB,KAAKquB,uBAGPtE,EAAAnqB,UAAA0uB,oBAAA,SAAoB5B,EAAiBjE,OAC7BuF,EAAKhuB,KAAK2tB,SAASjB,GACpBsB,IAGDvF,EACFzoB,KAAKkrB,eAAe1nB,IAAIwqB,GAExBhuB,KAAKkrB,eAAevG,OAAOqJ,GAE7BhuB,KAAKquB,wBAGCtE,EAAAnqB,UAAAyuB,oBAAR,WACEruB,KAAK0qB,gBAAgB/lB,KAAK3E,KAAKuuB,oBAC/BvuB,KAAK+P,IAAIkD,gBAGH8W,EAAAnqB,UAAA4uB,wBAAR,SAAgC9B,OACxBsB,EAAKhuB,KAAK2tB,SAASjB,GACrBsB,GAAMhuB,KAAKkrB,eAAerjB,IAAImmB,KAChChuB,KAAKkrB,eAAevG,OAAOqJ,GAC3BhuB,KAAKquB,wBAIDtE,EAAAnqB,UAAA6uB,kBAAR,SACE/B,EACAhX,EACAgZ,GAHF,IAAA5nB,EAAA9G,KAKEb,OAAO4U,KAAK2B,GAAQ1O,SAAO,SAAE5G,OACvBqf,EAAUiN,EAAK5kB,IAAI1H,GAUvB,GATKqf,IACHiN,EAAKiC,WAAWvuB,EAAK0G,EAAK8V,GAAG6C,QAAQ/J,EAAOtV,KAC5Cqf,EAAUiN,EAAK5kB,IAAI1H,IAGrBqf,EAAQkJ,SAASjT,EAAOtV,GAAM,CAAEsuB,WAAW,IAC3CjP,EAAQmP,eAAe,CAAEC,UAAU,IACnCpP,EAAQqP,gBAAgB,CAAED,UAAU,IACpCpP,EAAQ6I,uBAAuB,CAAEoG,WAAW,IACxCA,EAAW,KACPrI,EAAWvf,EAAKioB,UAAU3M,MAAI,SAAEjc,GAAS,OAAAA,EAAKsB,OAASrH,KACzDimB,GAAYA,EAASrG,eACvBlZ,EAAK4C,aAAa2c,EAASrG,cAAetK,EAAOtV,GAAMssB,OAI7D1sB,KAAK+P,IAAIif,iBAOXjF,EAAAnqB,UAAAqvB,yBAAA,SAAyBvC,EAAiBrG,OAClC5G,EAAUiN,EAAK5kB,IAAIue,EAAS5e,MAClC,IAAKgY,GAAWA,EAAQtb,SACtB,MAAO,OAEH+qB,EACc,OAAlBzP,EAAQle,YACU4tB,IAAlB1P,EAAQle,OACU,KAAlBke,EAAQle,MACV,OACGke,EAAQsI,OAAStI,EAAQ2P,UAC1BF,GACAzP,EAAQyI,SAAS,YAEV,QAEF,IAIT6B,EAAAnqB,UAAAyvB,iBAAA,SAAiB3mB,EAAcgkB,EAAiBrG,GAC9C,GAAKA,GAAaA,EAAS7B,UAA3B,KAGM8K,EAAQ5mB,EAAY,OAC1B,GAAI4mB,GAASA,EAAM/tB,OAAS+tB,EAAM/tB,MAAM7B,OAAS2mB,EAAS7B,UAAW,KAC7DljB,EAAOguB,EAAM/tB,MAAM2G,MAAM,EAAGme,EAAS7B,WAC3C8K,EAAM/tB,MAAQD,MACRme,EAAUiN,EAAK5kB,IAAIue,EAAS5e,MAC9BgY,GACFA,EAAQkJ,SAASrnB,MAMhByoB,EAAAnqB,UAAA2uB,iBAAP,WAAA,IAAAznB,EAAA9G,KACE,OAAQA,KAAKotB,eAAuB,SAAiBlnB,QAAM,SAAEwmB,GAC3D,OAAA5lB,EAAKinB,cAAcrB,QAOhB3C,EAAAnqB,UAAA2vB,qBAAP,WAAA,IAAAzoB,EAAA9G,KACQqH,EAAS,GACTmoB,EAAc,IAAIxpB,IAwBxB,OAvBChG,KAAKotB,eAAuB,SAAiBpmB,SAAO,SAAE0lB,OAC/CsB,EAAKlnB,EAAK6mB,SAASjB,GACrBsB,GAAMlnB,EAAKokB,eAAerjB,IAAImmB,IAChCwB,EAAYvoB,IAAI+mB,EAAItB,EAAKrL,mBAI5BrhB,KAAK0R,oBAAsB,IAAI1K,SAAO,SAAEoM,OACjC4a,EAAK5a,GAAQA,EAAKqc,SACpBzB,GAAMlnB,EAAKokB,eAAerjB,IAAImmB,IAChC3mB,EAAOxF,KAAK2tB,EAAY3nB,IAAImmB,GAAMwB,EAAY1nB,IAAIkmB,GAAG9uB,EAAA,GAAQkU,OAKjEpT,KAAKkrB,eAAelkB,SAAO,SAAEgnB,IAExB3mB,EAAOoO,MAAI,SAAEtP,GAAS,OAAAA,GAAQA,EAAKspB,WAAazB,MACjDwB,EAAY3nB,IAAImmB,IAEhB3mB,EAAOxF,KAAK2tB,EAAY1nB,IAAIkmB,OAGzB3mB,GASF0iB,EAAAnqB,UAAA8vB,kBAAP,SACEha,EACAgZ,GAFF,IAAA5nB,EAAA9G,KAIE,QAFA,IAAA0uB,IAAAA,GAAA,IAEKhZ,GAAuC,IAA7B1V,KAAKkrB,eAAejnB,KACjC,OAAO,MAEHurB,EAAc,IAAIxpB,IACvBhG,KAAKotB,eAAuB,SAAiBpmB,SAAO,SAAE0lB,OAC/CsB,EAAKlnB,EAAK6mB,SAASjB,GACrBsB,GACFwB,EAAYvoB,IAAI+mB,EAAItB,UAIpBW,EAAQ,EAmBZ,OAlBArtB,KAAKkrB,eAAelkB,SAAO,SAAEgnB,OACrBtB,EAAO8C,EAAY1nB,IAAIkmB,GAC7B,GAAItB,EAGF,OAFA5lB,EAAK2nB,kBAAkB/B,EAAMhX,EAAQgZ,QACrCrB,QAIIsC,GAAa7oB,EAAK4K,oBAAsB,IAAI0Q,MAAI,SACnDhP,GAAS,OAAAA,GAAQA,EAAKqc,WAAazB,KAElC2B,IACFxwB,OAAO4U,KAAK2B,GAAQ1O,SAAO,SAAE5G,GAC3BuvB,EAAUvvB,GAAOsV,EAAOtV,MAE1BitB,QAGGA,GAIFtD,EAAAnqB,UAAAgwB,eAAP,WACmC,IAA7B5vB,KAAKkrB,eAAejnB,OAGxBjE,KAAKkrB,eAAenkB,QACpB/G,KAAKquB,wBAIAtE,EAAAnqB,UAAAiwB,iBAAP,WACE,OAAO7vB,KAAKkrB,eAAejnB,MAI7B9E,OAAAyB,eAAImpB,EAAAnqB,UAAA,cAAW,KAAf,WACE,QACII,KAAKkQ,cACLlQ,KAAKsqB,gBACLtqB,KAAK8vB,uBACL9vB,KAAK+vB,sBACP/vB,KAAKgwB,uDAKT7wB,OAAAyB,eAAImpB,EAAAnqB,UAAA,wBAAqB,KAAzB,WACE,QACII,KAAKuqB,iBAAmBvqB,KAAKiwB,2BAA2BvwB,OAAS,mCAKvEqqB,EAAAnqB,UAAAswB,gBAAA,SAAgB/pB,GACd,SAAKA,GAAQA,EAAKC,QAGdD,EAAKpC,OAASosB,GAAajV,UACN,IAAhB/U,EAAKsjB,SAMhBM,EAAAnqB,UAAAqwB,yBAAA,WACE,OAAKjwB,KAAK+uB,WAAc/uB,KAAK+uB,UAAUrvB,OAGhCM,KAAK+uB,UAAU7oB,QAAM,SACzBC,GAAS,OAAAA,EAAKpC,OAASosB,GAAajV,UAAY/U,EAAKC,QAH/C,IAOH2jB,EAAAnqB,UAAAwwB,YAAR,WAGE,MACE,kBAFCpwB,KAAK6sB,aAAe7sB,KAAK6sB,YAAYC,UAAa,OAInD,IACA9sB,KAAKisB,aACL,IACAjsB,KAAKkiB,MAID6H,EAAAnqB,UAAAotB,gBAAR,WAAA,IAAAlmB,EAAA9G,KACEA,KAAKksB,iBAAkB,EAClBlsB,KAAKuqB,iBAAoBvqB,KAAK+uB,WAAc/uB,KAAK+uB,UAAUrvB,QAI3DM,KAAKkiB,KAIVliB,KAAKgsB,YACFqE,QACAC,MAAI,WACHxpB,EAAKklB,YACF1C,QAAQxiB,EAAKspB,eACbE,MAAI,SAAE/uB,GACDA,GAAS+D,MAAM8B,QAAQ7F,EAAMsoB,OAC/B/iB,EAAKglB,qBAAuBvqB,EAC5BuF,EAAKolB,iBAAkB,IAEvBplB,EAAKglB,qBAAuB,IAAIC,GAChCjlB,EAAKolB,iBAAkB,GAEzBplB,EAAKypB,aAENC,OAAK,WACJ1pB,EAAKglB,qBAAuB,IAAIC,GAChCjlB,EAAKolB,iBAAkB,EACvBplB,EAAKypB,gBAGVC,OAAK,SAAE7uB,GACN+jB,QAAQ+K,IAAI,kBAAmB9uB,GAC/BmF,EAAKglB,qBAAuB,IAAIC,GAChCjlB,EAAKolB,iBAAkB,EACvBplB,EAAKypB,aAhCPvwB,KAAKuwB,WAoCDxG,EAAAnqB,UAAA8wB,aAAR,WACE,OAAO1wB,KAAKksB,iBAAmB5mB,MAAM8B,QAAQpH,KAAK8rB,qBAAqBjC,OAGjEE,EAAAnqB,UAAA+wB,yBAAR,WACO3wB,KAAKkiB,MAGVliB,KAAKgsB,YAAY7C,QAAQnpB,KAAKowB,cAAepwB,KAAK8rB,uBAI5C/B,EAAAnqB,UAAAgxB,0BAAR,SAAkCC,OAC1BC,EAAQ9wB,KAAKiwB,2BAA2B7M,KAAG,SAAE2N,GAAM,OAAAA,EAAEtpB,QAC3D,OAAOopB,EAAM3oB,QAAQ8oB,MAAI,SAAEC,EAAGC,GAC5B,OAAOJ,EAAM/W,QAAQkX,EAAE7wB,KAAO0wB,EAAM/W,QAAQmX,EAAE9wB,SAIlD2pB,EAAAnqB,UAAA2wB,QAAA,WAAA,IAAAzpB,EAAA9G,KACEA,KAAKyrB,eAAgB,EACrBzrB,KAAK0rB,aAAe,GACpB1rB,KAAK2rB,cAAgB,OACfwF,EAAenxB,KAAKiwB,2BACpBmB,EAAWpxB,KAAK0wB,eACtBS,EAAanqB,SAAO,SAAE4F,GAChBwkB,EACFxkB,EAAQ6c,OAAS3iB,EAAKglB,qBAAqBjC,KAAK3V,SAAStH,EAAQnF,WACrC0nB,IAAnBviB,EAAQ6c,QAA2C,OAAnB7c,EAAQ6c,SACjD7c,EAAQ6c,QAAS,OAEb4H,EAAiB,CACrBC,MAAO1kB,EAAQiP,MACfzb,IAAKwM,EAAQnF,KACbghB,SAA4B,IAAnB7b,EAAQ6c,OACjBtlB,UAAU,IAEW,IAAnByI,EAAQ6c,OACV3iB,EAAK4kB,aAAa7pB,KAAKwvB,GAEvBvqB,EAAK6kB,cAAc9pB,KAAKwvB,MAG5BrxB,KAAK0rB,aAAe1rB,KAAK4wB,0BAA0B5wB,KAAK0rB,cACxD1rB,KAAK2rB,cAAgB3rB,KAAK4wB,0BAA0B5wB,KAAK2rB,eACzD7iB,YAAU,WACRhC,EAAK2kB,eAAgB,EACrB3kB,EAAKiJ,IAAIkD,iBACR,IAGL8W,EAAAnqB,UAAA2xB,eAAA,WACEvxB,KAAKwrB,mBAAoB,EACzBxrB,KAAK2rB,cAAgBnlB,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAK6rB,sBACpD7rB,KAAK0rB,aAAellB,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAK4rB,qBACnD5rB,KAAK+P,IAAIkD,gBAGX8W,EAAAnqB,UAAA4xB,gBAAA,WACExxB,KAAK6rB,oBAAsBrlB,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAK2rB,gBAC1D3rB,KAAK4rB,mBAAqBplB,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAK0rB,eACzD1rB,KAAKwrB,mBAAoB,EACzBxrB,KAAK+P,IAAIkD,gBAGX8W,EAAAnqB,UAAA6xB,YAAA,eACQC,EAAe1xB,KAAK0rB,aAAatI,KAAG,SAAEjd,GAAS,OAAAA,EAAK/F,OAC1DJ,KAAKiwB,2BAA2BjpB,SAAO,SAAE0lB,GACvCA,EAAKjD,OAASiI,EAAaxd,SAASwY,EAAKjlB,SAE3CzH,KAAK8rB,qBAAqBjC,KAAO6H,EACjC1xB,KAAKksB,iBAAkB,EACvBlsB,KAAK2wB,2BACL3wB,KAAKwrB,mBAAoB,EACzBxrB,KAAK+P,IAAIkD,gBAIX8W,EAAAnqB,UAAA+xB,YAAA,SAAYjpB,GACV,GAAIA,EAAM2oB,KAAKO,OAAOnJ,QAAS,KACvB4I,EAAOrxB,KAAK2rB,cAAcvJ,MAAI,SAAEjc,GACpC,OAAOA,EAAK/F,MAAQsI,EAAM2oB,KAAKO,OAAOxxB,OAExC,IAAKixB,EACH,OAEFA,EAAK5I,SAAU,EACfzoB,KAAK2rB,cAAgB3rB,KAAK2rB,cAAczlB,QAAM,SAAEC,GAC9C,OAAOA,EAAK/F,MAAQsI,EAAM2oB,KAAKO,OAAOxxB,OAExCJ,KAAK0rB,aAAe1rB,KAAK4wB,0BACvB5wB,KAAK0rB,aAAa1pB,OAAO,CAACqvB,SAEvB,KACCQ,EAAoB7xB,KAAK2rB,cAAczjB,MAAM,GACnDlI,KAAK0rB,aAAa1kB,SAAO,SAAEb,GACzB,GAAIA,EAAK/F,MAAQsI,EAAM2oB,KAAKO,OAAOxxB,IAAK,KAChC0xB,EAAYtrB,KAAK6M,MAAM7M,KAAKC,UAAUN,IAC5C2rB,EAAUrJ,SAAU,EACpBoJ,EAAkBhwB,KAAKiwB,OAG3B9xB,KAAK2rB,cAAgB3rB,KAAK4wB,0BAA0BiB,GACpD7xB,KAAK0rB,aAAe1rB,KAAK0rB,aAAaxlB,QAAM,SAAEC,GAC5C,OAAOA,EAAK/F,MAAQsI,EAAM2oB,KAAKO,OAAOxxB,OAG1CJ,KAAK+P,IAAIkD,gBAGX8W,EAAAnqB,UAAAmyB,+BAAA,SAA+BxwB,GAA/B,IAAAuF,EAAA9G,KACEA,KAAKurB,4BAA8BhqB,GACrB,IAAVA,GACFuH,YAAU,eACFkpB,EAAU5kB,SAASQ,iBACvB,wCAEF,GAAIokB,EAAQtyB,OAAS,EAAG,KAChBuyB,EAAMD,EAAQ,GACpBC,EACGrkB,iBAAiB,qBACjB5G,SAAO,SAAEqI,GAAW,OAAAA,EAAO6iB,gBACxBC,EAAWrrB,EAAKsrB,eAAetrB,EAAKukB,WAAYvkB,EAAKioB,WAC3DkD,EAAII,aACFvrB,EAAKwrB,mBACHxrB,EAAKioB,UAAUoD,GACfrrB,EAAKsmB,eAAehF,SAASlgB,OAC1BpB,EAAK8jB,oBAAsB,GAAK9jB,EAAK+jB,oBACrC/jB,EAAK8jB,oBAAsB,GAAK9jB,EAAK+jB,mBACpC/jB,EAAK+jB,oBACP/jB,EAAKskB,aAET6G,EAAIM,eAGP,IAIPxI,EAAAnqB,UAAA4yB,0BAAA,SAA0BC,GAGxB,OAAKA,GAAWA,EAAOppB,MAGhB,CAAEA,MAAUopB,EAAOppB,MAAK,MAFtB,CAAEA,MAAO,UAKpB0gB,EAAAnqB,UAAA0yB,mBAAA,SAAmBjM,EAAUqG,GAA7B,IAAA5lB,EAAA9G,KAEQ0yB,EAAiBtlB,SAASulB,cAAc,OAkC9C,OAjCAD,EAAeE,UAAY,mBAC3BF,EAAetoB,MAAMyoB,YAAiBC,OACtCJ,EAAetoB,MAAM2oB,aAAkBD,OASvCzM,EAAS1H,aAAaqU,aAAahsB,SAAO,SAAEisB,OACpCC,EAAY9lB,SAASulB,cAAc,OACzCO,EAAUN,UAAY,8BAEhBO,EAAarsB,EAAK0rB,0BACtBS,GAKF,GAHAC,EAAU9oB,MAAMf,MAAQ8pB,EAAW9pB,MAG/B4pB,EAAwBpX,MAAO,KAC3BuX,EAAYhmB,SAASimB,eACzBJ,EAAwBpX,OAE1BqX,EAAU5lB,YAAY8lB,GAIxBV,EAAeplB,YAAY4lB,MAItBR,GAGT3I,EAAAnqB,UAAAqtB,eAAA,WACEjtB,KAAKmrB,eAAiB,GAWtB,QAVMmI,EAActzB,KAAKmtB,iBAAiBoG,UAEpCC,GAAcxzB,KAAK4qB,oBAAsB,GAAK5qB,KAAK6qB,mBACnD4I,EAAWzzB,KAAK4qB,oBAAsB5qB,KAAK6qB,mBAG3C6I,GADJD,EAAWzzB,KAAK2zB,gBAAkB3zB,KAAK2zB,gBAAkBF,GAChBD,EAErCI,EAAWN,EAAY5zB,OAASg0B,EAE7Bn0B,EAAI,EAAGA,EAAIm0B,EAAiBn0B,IACnCS,KAAKmrB,eAAetpB,KAAKyxB,EAAY5K,OAAO,EAAGkL,IAEjD5zB,KAAK6zB,kCAOC9J,EAAAnqB,UAAAi0B,+BAAR,WACE,GAAK7zB,KAAKqqB,sBAGV,IAAK,IAAI9qB,EAAI,EAAGA,EAAIS,KAAKmrB,eAAezrB,OAAQH,IAC9C,mBAASioB,OACDyK,EAAM6B,EAAK3I,eAAe5rB,GAAGioB,GAC/ByK,aAAe8B,EAAAA,yBACjB9B,EAAI+B,UAAS,SAAIryB,GACG,KAAdA,EAAEsyB,SAAgC,KAAdtyB,EAAEsyB,SAGR,KAAdtyB,EAAEsyB,SACJhC,EAAIiC,6BARH1M,EAAI,EAAGA,EAAIxnB,KAAKmrB,eAAe5rB,GAAGG,OAAQ8nB,MAA1CA,IAiBbuC,EAAAnqB,UAAAu0B,gBAAA,SAAgBnlB,EAAW8D,GAEjB,OAAN9D,GACM,OAAN8D,GACC9S,KAAKmrB,gBACyB,IAA/BnrB,KAAKmrB,eAAezrB,SAMlBM,KAAKsrB,qBAAqB8I,EAAAA,mBAC5BplB,IAAMhP,KAAKmrB,eAAezrB,OAAS,GACnCoT,IAAM9S,KAAKmrB,eAAe,GAAGzrB,OAAS,EAIlCoT,IAAM9S,KAAKmrB,eAAe,GAAGzrB,OAAS,GACxCgmB,QAAQ+K,IAAI,SAEZzwB,KAAKq0B,SAASrlB,EAAI,EAAG,EAAG,WAExB0W,QAAQ+K,IAAI,SAEZzwB,KAAKq0B,SAASrlB,EAAG8D,EAAI,EAAG,UAT1B9S,KAAKs0B,uBAkBTvK,EAAAnqB,UAAA00B,mBAAA,WAAA,IAAAxtB,EAAA9G,KAIMA,KAAKorB,aAAeprB,KAAK6qB,mBAAqB,EAG9C7qB,KAAK4qB,oBACLphB,KAAKyF,KAAKjP,KAAK2zB,gBAAkB3zB,KAAK6qB,qBAGtC7qB,KAAK4qB,sBACL9hB,YAAU,WACRhC,EAAKmmB,iBACLvH,QAAQ+K,IAAI,SACZ3pB,EAAKutB,SAAS,EAAG,EAAG,WACnB,KAGHr0B,KAAKu0B,cACLv0B,KAAK4qB,sBACL9hB,YAAU,WACRhC,EAAKmmB,iBACLvH,QAAQ+K,IAAI,SACZ3pB,EAAKutB,SAAS,EAAG,KAChB,IAGLr0B,KAAKu0B,eAKTxK,EAAAnqB,UAAA40B,gBAAA,SAAgBxlB,EAAW8D,GAA3B,IAAAhM,EAAA9G,KAEU,OAANgP,GACM,OAAN8D,GACC9S,KAAKmrB,gBACyB,IAA/BnrB,KAAKmrB,eAAezrB,SAIZ,IAANsP,GAAiB,IAAN8D,EAgBH,IAANA,GACF4S,QAAQ+K,IAAI,SAEZzwB,KAAKq0B,SAASrlB,EAAI,EAAGhP,KAAKmrB,eAAe,GAAGzrB,OAAS,EAAG,UAExDgmB,QAAQ+K,IAAI,SAEZzwB,KAAKq0B,SAASrlB,EAAG8D,EAAI,EAAG,SArBtB9S,KAAK4qB,oBAAsB,IAE7B5qB,KAAK4qB,sBACL9hB,YAAU,WACRhC,EAAKmmB,iBACLvH,QAAQ+K,IAAI,SACZ3pB,EAAKutB,SACHvtB,EAAKqkB,eAAezrB,OAAS,EAC7BoH,EAAKqkB,eAAe,GAAGzrB,OAAS,KAEjC,MAsBTqqB,EAAAnqB,UAAAy0B,SAAA,SAASrlB,EAAW8D,EAAW2hB,GAC7B,QAD6B,IAAAA,IAAAA,EAAA,SAErB,OAANzlB,GACM,OAAN8D,GACC9S,KAAKmrB,gBACyB,IAA/BnrB,KAAKmrB,eAAezrB,SAKtBM,KAAK00B,cAAc10B,KAAKorB,WAAYprB,KAAKqrB,YACrCrrB,KAAKmrB,eAAenc,IAAMhP,KAAKmrB,eAAenc,GAAG8D,IAAI,KACjD6hB,EAAM30B,KAAKmrB,eAAenc,GAAG8D,GAEnC,GAAI6hB,aAAeP,EAAAA,kBAAmB,CACpC,GAAIO,EAAIC,WAMN,YALsB,UAAlBH,EACFz0B,KAAKm0B,gBAAgBnlB,EAAG8D,GACG,SAAlB2hB,GACTz0B,KAAKw0B,gBAAgBxlB,EAAG8D,IAI5B6hB,EAAIE,4BAA4BC,aAAaxc,cAAcyc,eACzD,CAAEC,SAAU,SAAUC,MAAO,SAAUC,OAAQ,WAGhB,aAA7BP,EAAIQ,gBAAgBC,KACtBtsB,YAAU,WACR6rB,EAAIU,UACH,GAEHV,EAAIU,aAED,GAAIV,aAAeZ,EAAAA,uBAAwB,CAChD,GAAIY,EAAIC,WAMN,YALsB,UAAlBH,EACFz0B,KAAKm0B,gBAAgBnlB,EAAG8D,GACG,SAAlB2hB,GACTz0B,KAAKw0B,gBAAgBxlB,EAAG8D,QAItBwiB,EAAgBloB,SAASmoB,eAAeZ,EAAIa,MAClDF,EAASD,QACTC,EAASP,eAAe,CACtBC,SAAU,SACVC,MAAO,SACPC,OAAQ,WAEVpsB,YAAU,WACRwsB,EAASG,WACR,QACE,GAAId,aAAee,EAAAA,WAAY,CACpC,GAAIf,EAAIrc,cAAcnU,SAMpB,YALsB,UAAlBswB,EACFz0B,KAAKm0B,gBAAgBnlB,EAAG8D,GACG,SAAlB2hB,GACTz0B,KAAKw0B,gBAAgBxlB,EAAG8D,IAI5B6hB,EAAIrc,cAAc+c,QAClBV,EAAIrc,cAAcyc,eAAe,CAC/BC,SAAU,SACVC,MAAO,SACPC,OAAQ,WAEVpsB,YAAU,WACR6rB,EAAIrc,cAAcmd,WACjB,QACE,GACLd,aAAegB,EAAAA,uBACfhB,aAAeiB,EAAAA,wBACfjB,aAAekB,EAAAA,sBAQf,YALsB,UAAlBpB,EACFz0B,KAAKm0B,gBAAgBnlB,EAAG8D,GACG,SAAlB2hB,GACTz0B,KAAKw0B,gBAAgBxlB,EAAG8D,IAI5B9S,KAAK81B,aAAa9mB,EAAG8D,KAMzBiX,EAAAnqB,UAAA80B,cAAA,SAAc1lB,EAAW8D,GACvB,GACQ,OAAN9D,GACM,OAAN8D,GACC9S,KAAKmrB,gBACyB,IAA/BnrB,KAAKmrB,eAAezrB,QAIlBM,KAAKmrB,eAAenc,IAAMhP,KAAKmrB,eAAenc,GAAG8D,GAAI,KACjDmf,EAAMjyB,KAAKmrB,eAAenc,GAAG8D,GAC/Bmf,aAAemC,EAAAA,mBACjBnC,EAAI8D,OACJ9D,EAAI+D,QAAS,GACJ/D,aAAe8B,EAAAA,uBACxB9B,EAAI8D,OACK9D,aAAeyD,EAAAA,YACxBzD,EAAI3Z,cAAcyd,SAMxBhM,EAAAnqB,UAAAk2B,aAAA,SAAa9mB,EAAW8D,GACtB9S,KAAKorB,WAAapc,EAClBhP,KAAKqrB,WAAavY,EAClB9S,KAAKsrB,UAAYtrB,KAAKmrB,eAAenrB,KAAKorB,YAAYprB,KAAKqrB,YACvDrrB,KAAKsrB,qBAAqB8I,EAAAA,mBAC5Bp0B,KAAK+xB,+BAA+B/xB,KAAKsrB,UAAUhL,OASvDyJ,EAAAnqB,UAAAq2B,wBAAA,SAAwBC,EAAmBC,GACzCn2B,KAAKorB,WAAa8K,EAClBl2B,KAAKqrB,WAAarrB,KAAKo2B,YAAYD,EAAWn2B,KAAK+uB,WACnD/uB,KAAK81B,aAAa91B,KAAKorB,WAAYprB,KAAKqrB,aAQ1CtB,EAAAnqB,UAAAo0B,UAAA,SAAUtrB,GAAV,IAAA5B,EAAA9G,KACE,GAAKA,KAAKqqB,uBAGc,OAApBrqB,KAAKorB,YAA2C,OAApBprB,KAAKqrB,WAGrC,OAAQ3iB,EAAMtI,KACZ,IAAK,UACH,GACEJ,KAAKsrB,qBAAqB8I,EAAAA,mBAC1Bp0B,KAAKurB,4BAEL,OAEsB,IAApBvrB,KAAKorB,YACPprB,KAAKq0B,SAASr0B,KAAKorB,WAAa,EAAGprB,KAAKqrB,YAE1C,MACF,IAAK,YACH,GACErrB,KAAKsrB,qBAAqB8I,EAAAA,mBAC1Bp0B,KAAKurB,4BAEL,OAGF,GAAIvrB,KAAKorB,aAAeprB,KAAKmrB,eAAezrB,OAAS,EAAG,CACtDM,KAAK00B,cAAc10B,KAAKorB,WAAYprB,KAAKqrB,YACzCrrB,KAAKs0B,qBACL,MAEAt0B,KAAKq0B,SAASr0B,KAAKorB,WAAa,EAAGprB,KAAKqrB,YAE1C,MACF,IAAK,YACHrrB,KAAKw0B,gBAAgBx0B,KAAKorB,WAAYprB,KAAKqrB,YAC3C,MACF,IAAK,aACHrrB,KAAKm0B,gBAAgBn0B,KAAKorB,WAAYprB,KAAKqrB,YAC3C,MACF,IAAK,QACCrrB,KAAKsrB,qBAAqB8I,EAAAA,mBAC5Bp0B,KAAK+xB,+BAA+B/xB,KAAKsrB,UAAUhL,OACV,IAArCtgB,KAAKurB,6BACPvrB,KAAKq0B,SAASr0B,KAAKorB,WAAYprB,KAAKqrB,aAE7BrrB,KAAKorB,aAAeprB,KAAKmrB,eAAezrB,OAAS,GAC1DM,KAAKs0B,qBAEP,MACF,IAAK,SACH,GAAIt0B,KAAKsrB,qBAAqB8I,EAAAA,kBAAmB,KACzCiC,EAAer2B,KAAc,UACnC8I,YAAU,WACRhC,EAAKirB,+BAA+BsE,EAAa/V,OACR,IAArCxZ,EAAKykB,8BACmC,aAAtC8K,EAAalB,gBAAgBC,KAC/BtsB,YAAU,WACRhC,EAAKutB,SAASvtB,EAAKskB,WAAYtkB,EAAKukB,cACnC,GAEHvkB,EAAKutB,SAASvtB,EAAKskB,WAAYtkB,EAAKukB,eAGvC,GAEL,MACF,QAEE,GACErrB,KAAKsrB,qBAAqB8I,EAAAA,oBACW,IAArCp0B,KAAKurB,6BACL,gBAAgBnG,KAAK1c,EAAMtI,KAEfJ,KAAKsrB,UACb0K,QAAS,EACbh2B,KAAK+xB,gCAA+B,KAqBpChI,EAAAnqB,UAAAw2B,YAAR,SAAoB5tB,EAAerB,GAWjC,QAVMmvB,EAAW,CACf,QACA,SACA,OACA,YACA,WACA,cACA,kBAEE/W,EAAa,GACRhgB,EAAI,EAAGA,EAAI4H,EAAKzH,OAAQH,IAAK,CACpC,GAAIA,IAAMiJ,EACR,OAAO+W,EAAW7f,OAIlB42B,EAASpiB,SAAS/M,EAAK5H,GAAGwE,QACzBoD,EAAK5H,GAAG6G,OACU,IAAnBe,EAAK5H,GAAGkqB,QAERlK,EAAW1d,KAAKsF,EAAK5H,IAGzB,OAAO,MASDwqB,EAAAnqB,UAAAwyB,eAAR,SAAuB5pB,EAAerB,GACpCue,QAAQ+K,IAAI,QAASjoB,GACrBkd,QAAQ+K,IAAI,OAAQtpB,GAWpB,QAVMmvB,EAAW,CACf,QACA,SACA,OACA,YACA,WACA,cACA,kBAEE/W,EAAa,GACRhgB,EAAI,EAAGA,EAAI4H,EAAKzH,OAAQH,IAC/B,GACE+2B,EAASpiB,SAAS/M,EAAK5H,GAAGwE,QACzBoD,EAAK5H,GAAG6G,OACU,IAAnBe,EAAK5H,GAAGkqB,SAERlK,EAAW1d,KAAKsF,EAAK5H,IACjBggB,EAAW7f,SAAW8I,EAAQ,GAChC,OAAOjJ,EAIb,OAAO,MAGTJ,OAAAyB,eAAImpB,EAAAnqB,UAAA,iBAAc,KAAlB,WACE,OAAOI,KAAKu2B,oBAAoBzuB,IAAI,0CAGtC3I,OAAAyB,eAAImpB,EAAAnqB,UAAA,cAAW,KAAf,WACE,OAAO2U,EAAAA,uCAIFwV,EAAAnqB,UAAA42B,SAAP,WACE,OAAOx2B,KAAKirB,WAGdlB,EAAAnqB,UAAAugB,cAAA,SACExW,EACAjB,EACAgkB,EACAtM,GAJF,IAAAtZ,EAAA9G,KAME,GAAK2J,EAAL,KAGM8W,EACyB,MAA7BL,EAAoCA,EAA4B,EAE7DK,GAGHzgB,KAAKsd,gBAAkBmD,EACnBzgB,KAAKse,oBACPte,KAAKse,mBAAmBY,cAE1Blf,KAAKse,mBAAqBte,KAAKod,cAC5BmB,KAAKC,EAAAA,aAAaxe,KAAKsd,kBACvBmB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MAAOgkB,EAAAhO,EAAAgO,KAAW,OAAA5lB,EAAK4C,aAAaC,EAAIjB,EAAOgkB,MACnE1sB,KAAKod,cAAc9b,KAAK,CAAEqI,GAAEA,EAAEjB,MAAKA,EAAEgkB,KAAIA,KATzC1sB,KAAK0J,aAAaC,EAAIjB,EAAOgkB,GAW/B5jB,YAAU,WACRhC,EAAKirB,gCAA+B,KACnC,KAGLhI,EAAAnqB,UAAAygB,kBAAA,SACE1W,EACA2W,EACAoM,EACAnM,EACA8F,GALF,IAAAvf,EAAA9G,KAOE,GAAK2J,EAAL,CAII2W,GACFtgB,KAAKwgB,yBAAyB6F,EAAUqG,OAEpCjM,EAC6B,MAAjCF,EACIA,EACA,EAEDE,GAMLzgB,KAAKwd,0BAA4BiD,EAC7BzgB,KAAK4e,wBACP5e,KAAK4e,uBAAuBM,cAE9Blf,KAAK4e,uBAAyB5e,KAAKud,kBAChCgB,KAAKC,EAAAA,aAAaxe,KAAKwd,4BACvBiB,WAAS,SAAEC,OAAE/U,EAAA+U,EAAA/U,GAAIjB,EAAAgW,EAAAhW,MAAOgkB,EAAAhO,EAAAgO,KACnBhkB,GACF5B,EAAK4C,aAAaC,EAAIjB,EAAOgkB,MAGnC1sB,KAAKud,kBAAkBjc,KAAK,CAAEqI,GAAEA,EAAEjB,MAAO4X,EAAMoM,KAAIA,KAhB7CpM,GACFtgB,KAAK0J,aAAaC,EAAI2W,EAAMoM,KAmB1B3C,EAAAnqB,UAAA4gB,yBAAR,SAAiC6F,EAAeqG,GAC9C,GAAKrG,GAAaA,EAAS1H,aAA3B,KAGM+B,EAAM2F,EAAS1H,aACC,MAAlB+B,EAAIC,aACND,EAAIC,WAAa,IAGjBD,EAAI+V,gBACJ/J,GACAA,EAAK5kB,KACL4kB,EAAK5kB,IAAI4Y,EAAI+V,iBAEb/J,EAAK5kB,IAAI4Y,EAAI+V,gBAAgB9N,SAAS,GAAI,CAAE+F,WAAW,MAU3D3E,EAAAnqB,UAAA8J,aAAA,SAAaC,EAASjB,EAAYgkB,GAC5B/iB,GACFA,EAAGjB,EAAOgkB,IAId3C,EAAAnqB,UAAA82B,cAAA,WAAA,IAAA5vB,EAAA9G,KACM22B,EAAyB32B,KAAK4c,GAAGiD,MAAM,CACzCxN,MAAOrS,KAAK4c,GAAGga,MAAM,MAqDvB,OAnDA52B,KAAK0R,mBAAmB1K,SAAO,SAAE6vB,OAC3BC,EAAoB,GACxBhwB,EAAKioB,UAAU/nB,SAAO,SAAEb,GAEtB2wB,EAAa3wB,EAAKsB,MAAQX,EAAK8V,GAAG6C,QAChC,CACEle,MAAOuF,EAAKiwB,qBAAqBF,EAAkB1wB,EAAKsB,OACpDovB,EAAkB1wB,EAAKsB,MACvBtB,EAAK5E,OAAS,KAClB4C,SAAUgC,EAAKhC,UAEjBgC,EAAKkU,QAAU,CAACwM,EAAAA,WAAWC,UAAY,IAErC3gB,EAAKwY,cAAgBxY,EAAKwY,aAAa9C,QACzCib,EAAa3wB,EAAKwY,aAAa9C,OAAS/U,EAAK8V,GAAG6C,QAC9CoX,EAAkB1wB,EAAKwY,aAAa9C,QAAU,KAC9C,QAINib,EAAaE,UAAYlwB,EAAK8V,GAAG6C,QAC9BkX,EAAuB7uB,IAAI,SAAuBsgB,SAAS1oB,OAAS,EACrE,QAEEu3B,EAAenwB,EAAK8V,GAAGiD,MAAMiX,GACjChwB,EAAKioB,UAAU/nB,SAAO,SAAEb,GACtB,GAAIA,EAAK6Z,cAAe,KAChBS,EAC8B,MAAlCta,EAAK8Z,0BACD9Z,EAAK8Z,0BACL,EACAR,EAAUwX,EAAanvB,IAAI3B,EAAKsB,MAElCgZ,EAAa,EACfhB,EAAQS,aACL3B,KAAKC,EAAAA,aAAaiC,IAClBhC,WAAS,SAAEld,GACVuF,EAAK4C,aAAavD,EAAK6Z,cAAeze,EAAO01B,MAGjDxX,EAAQS,aAAazB,WAAS,SAAEld,GAC9BuF,EAAK4C,aAAavD,EAAK6Z,cAAeze,EAAO01B,UAKpDN,EAAuB7uB,IAAI,SAAuBovB,OAChDP,EAAuB7uB,IAAI,SAAuBsgB,SAAS1oB,OAC5Du3B,MAGGN,EAAuBnT,OAIzBuG,EAAAnqB,UAAAu3B,SAAP,WAAA,IAAArwB,EAAA9G,KACMo3B,EAAW,GAUf,OATAp3B,KAAK0R,mBAAmB1K,SAAO,SAAE6vB,OAC3BC,EAAoB,GACxBhwB,EAAKioB,UAAU/nB,SAAO,SAAEb,GAEtB2wB,EAAa3wB,EAAKsB,MAAQovB,EAAkB1wB,EAAKsB,SAEnDqvB,EAAaE,UAAYH,EAAkBG,UAC3CI,EAASv1B,KAAKi1B,MAETM,GAITrN,EAAAnqB,UAAA2T,YAAA,WAAA,IAAAzM,EAAA9G,KACE,KAAIA,KAAK0R,mBAAmBhS,OAAS,GAArC,CAKA,GAFAM,KAAK+Q,cAAe,GAEf/Q,KAAKwT,UAGR,OAFAxT,KAAKyR,cAAe,OACpBzR,KAAKq3B,mBAGD3jB,EAAc1T,KAAKwT,UAAUC,OAAOE,cAC1C3T,KAAKyR,cAAe,EACpBzR,KAAKgrB,iBAAmB,OAGlBpX,EAAe5T,KAAK0R,mBAAmBxL,QAAM,SAChDkN,EAAW5K,eACV,IAAmB,IAAA8uB,EAAAxjB,EAAAhN,EAAKioB,WAASlb,EAAAyjB,EAAAh2B,QAAAuS,EAAArS,KAAAqS,EAAAyjB,EAAAh2B,OAAE,CAA9B,IAAM6E,EAAI0N,EAAAtS,MACb,GACG4E,EAAKC,MAAQD,EAAKujB,YACjBvjB,EAAKC,MAAsB,SAAdD,EAAKsB,KAMpB,GAJAie,QAAQ+K,IAAI,OAAQtqB,EAAKsB,OACX2L,EAAKjN,EAAKsB,MACpB2L,EAAKjN,EAAKsB,MAAMwM,WAAWN,cAC3B,IACMO,SAASR,GAEjB,OADA5M,EAAKkkB,iBAAiBnpB,KAAK2G,IACpB,oGAIb,OAAO,KAIXxI,KAAK+qB,yBAA2BnX,EAEhC5T,KAAK+sB,cAAgBnZ,EACrB5T,KAAK6e,MAAK,KAGZkL,EAAAnqB,UAAAy3B,aAAA,WACEr3B,KAAK+sB,cAAgB/sB,KAAK0R,mBAC1B1R,KAAK6e,MAAK,IAGZkL,EAAAnqB,UAAA23B,SAAA,SAAS7K,EAAiBrG,EAAehd,OACnCmuB,EAAW,CACbC,YAAapuB,GAef,OAbIgd,EAASjc,QACXotB,EAAQt4B,EAAA,GAAQs4B,EAAanR,EAASjc,QAGtCic,EAASqR,aACTrR,EAASqR,YAAYjwB,MACrBilB,EAAK5kB,IAAIue,EAASqR,YAAYjwB,MAAMlG,QAEpCi2B,EAAQt4B,EAAA,GACHs4B,EACA,CAAEG,MAAOjL,EAAK5kB,IAAIue,EAASqR,YAAYjwB,MAAMlG,SAG7Ci2B,GAGTzN,EAAAnqB,UAAA0G,YAAA,SAAYC,GAERA,EAAuB,eACvBC,KAAKC,UAAUF,EAAuB,cAAEG,gBACtCF,KAAKC,UAAUF,EAAuB,cAAEI,iBAEtC3G,KAAK0R,oBAAyD,IAAnC1R,KAAK0R,mBAAmBhS,SACrDM,KAAK0R,mBAAqB1R,KAAK+sB,eAEjC/sB,KAAK6e,QAGLtY,EAAmB,gBACoB4oB,IAAvC5oB,EAAmB,UAAEI,eACrBH,KAAKC,UAAUF,EAAmB,UAAEG,gBAClCF,KAAKC,UAAUF,EAAmB,UAAEI,gBAEtC3G,KAAKgtB,kBAGLzmB,EAAqB,aACrBC,KAAKC,UAAUF,EAAqB,YAAEG,gBACpCF,KAAKC,UAAUF,EAAqB,YAAEI,gBAExC3G,KAAKgS,kBAIT+X,EAAAnqB,UAAAoS,eAAA,WAAA,IAAAlL,EAAA9G,KAEMA,KAAKwQ,YACPxQ,KAAK4Q,gBAAkB,IAAItL,MAAMgE,OAAOtJ,KAAK0Q,eAAiB,GAAGkE,KAAK,IACtE5U,KAAKyQ,YAAYzJ,SAAO,SAAEb,GACpBA,EAAK0O,cAAgB1O,EAAK2O,aAAoC,IAArB3O,EAAK2O,eAChDhO,EAAK8J,gBAAgBzK,EAAK0O,YAAc,GAAK,CAC3CtT,MAAO4E,EAAK2O,YACZC,MAAO5O,EAAK4O,OAAS,OACrBC,YAAa7O,EAAK6O,cAAe,EACjCC,eAAuC,MAAvB9O,EAAK8O,eAAyB9O,EAAK8O,eAAiB,SAOtE8U,EAAAnqB,UAAAif,KAAR,SAAa+Y,GAAb,IAAA9wB,EAAA9G,UAAa,IAAA43B,IAAAA,GAAA,GACX53B,KAAK4qB,oBAAsB,EAEtB5qB,KAAKsf,UAAUtf,KAAK+uB,YAIzB/uB,KAAK63B,aAGFD,GACC53B,KAAK+sB,iBACJ/sB,KAAK+sB,eAA+C,IAA9B/sB,KAAK+sB,cAAcrtB,QAU5CM,KAAK83B,uBARL93B,KAAK+Q,cAAe,EAEf/Q,KAAK+3B,qBACR/3B,KAAKu0B,YAAY,MAAM,GAEzBv0B,KAAK8qB,UAAW,GAKlB9qB,KAAKu2B,oBAAoBrW,aAAazB,WAAS,SAAErL,GAC/C,OAAAtM,EAAKwgB,qBAAqBlU,MAE5BpT,KAAKsnB,wBAvBHtnB,KAAK+Q,cAAe,GA6BhBgZ,EAAAnqB,UAAAi4B,WAAR,WACE73B,KAAKu2B,oBAAsBv2B,KAAK4c,GAAGiD,MAAM,CACvCxN,MAAOrS,KAAK4c,GAAGga,MAAM,MAEvB52B,KAAKg4B,QAAUh4B,KAAKi4B,eAGtBlO,EAAAnqB,UAAAs4B,qBAAA,WAAA,IAAApxB,EAAA9G,KAEOA,KAAKqqB,uBAGVvhB,YAAU,WACRhC,EAAKqtB,gBAAgBrtB,EAAKskB,WAAYtkB,EAAKukB,cAC1C,IAMGtB,EAAAnqB,UAAAq4B,YAAR,WACE,OAAOj4B,KAAKm4B,qBAAqB,MAAM,IASjCpO,EAAAnqB,UAAAu4B,qBAAR,SACEtB,EACAuB,EACAC,GAHF,IAAAvxB,EAAA9G,UAEE,IAAAo4B,IAAAA,GAAA,QACA,IAAAC,IAAAA,GAAA,OAEIvB,EAAoB,GACxB92B,KAAK+uB,UAAU/nB,SAAO,SAAEb,GACtB2wB,EAAa3wB,EAAKsB,MAAQX,EAAK8V,GAAG6C,QAChC,CACEle,MACuB,MAArBs1B,EACIA,EAAkB1wB,EAAKsB,MACvBtB,EAAK5E,MACX4C,SAAUgC,EAAKhC,UAEjBi0B,EACIjyB,EAAKkU,UAAYlU,EAAKC,KACpB,CAACygB,EAAAA,WAAWC,UACZ,GACF3gB,EAAKkU,QACH,CAACwM,EAAAA,WAAWC,UACZ,IAEJ3gB,EAAKwY,cAAgBxY,EAAKwY,aAAa9C,QACzCib,EAAa3wB,EAAKwY,aAAa9C,OAAS/U,EAAK8V,GAAG6C,QACzB,MAArBoX,GACIA,EAAkB1wB,EAAKwY,aAAa9C,QACpC,KACJ,YAMAyc,GACHD,GAAmBxB,GAAqBA,EAAkBpH,SACvDoH,EAAkBpH,SAClBzvB,KAAKwtB,gBACXsJ,EAAarH,SAAWzvB,KAAK4c,GAAG6C,QAAQ6Y,GACpCzB,IAAsBA,EAAkBpH,WAC1CoH,EAAkBpH,SAAW6I,GAI3BzB,GACF13B,OAAO4U,KAAK8iB,GAAmB7vB,SAAO,SAAE5G,GAE5B,cAARA,GACQ,0BAARA,GACQ,aAARA,IAIG02B,EAAa12B,KAChB02B,EAAa12B,GAAO0G,EAAK8V,GAAG6C,QAAQoX,EAAkBz2B,SAK5D02B,EAAaE,UAAYh3B,KAAK4c,GAAG6C,QAC/Bzf,KAAKotB,eAAehF,SAAS1oB,OAAS,EACtC,IAIFo3B,EAAayB,sBAAwBv4B,KAAK4c,GAAG6C,SAAQ,EAAO,QACxD+Y,EAAkBx4B,KAAK4c,GAAGiD,MAAMiX,GAwBpC,OAvBA92B,KAAK+uB,UAAU/nB,SAAO,SAAEb,GACtB,GAAIA,EAAK6Z,cAAe,KAChBS,EAC8B,MAAlCta,EAAK8Z,0BACD9Z,EAAK8Z,0BACL,EACAR,EAAU+Y,EAAgB1wB,IAAI3B,EAAKsB,MACnCgxB,EAAY,SAAIl3B,GAChB4E,EAAKpC,OAASosB,GAAa7V,QAAoB,OAAV/Y,GACvCuF,EAAKoxB,uBAEPpxB,EAAK4C,aAAavD,EAAK6Z,cAAeze,EAAOi3B,IAG3C/X,EAAa,EACfhB,EAAQS,aACL3B,KAAKC,EAAAA,aAAaiC,IAClBhC,UAAUga,GAEbhZ,EAAQS,aAAazB,UAAUga,OAI9BD,GAGDzO,EAAAnqB,UAAA84B,oBAAR,WACE14B,KAAKotB,eAAehF,SAASphB,SAAO,SAAEb,EAAMqC,GAC1CrC,EAAK2B,IAAI,aAAa6gB,SAASngB,EAAQ,EAAG,CAAEkmB,WAAW,QAO3D3E,EAAAnqB,UAAAk4B,oBAAA,WAAA,IAAAhxB,EAAA9G,KACEA,KAAK+sB,cAAc/lB,SAAO,SAAE6vB,GAC1B/vB,EAAKsmB,eAAe8J,OAClBpwB,EAAKsmB,eAAehF,SAAS1oB,OAC7BoH,EAAKqxB,qBAAqBtB,OAG9B72B,KAAK04B,sBACL14B,KAAK+Q,cAAe,EACpB/Q,KAAK8qB,UAAW,GAOlBf,EAAAnqB,UAAA20B,YAAA,SAAYoE,EAA8BC,GAA1C,IAAA9xB,EAAA9G,UAA0C,IAAA44B,IAAAA,GAAA,OAClCC,EAAW74B,KAAK84B,oBAAoBH,GACpCX,EAAUh4B,KAAKi4B,cACrBj4B,KAAK+4B,oBAAoBf,GACzBh4B,KAAKotB,eAAe8J,OAAO2B,EAAUb,GACrCh4B,KAAK04B,sBACL14B,KAAKyqB,aAAa9lB,KAAKqzB,GAEvBh4B,KAAK4qB,oBACHphB,KAAKC,MAAMovB,EAAW74B,KAAK6qB,oBAAsB,EACnD/hB,YAAU,WACRhC,EAAKmmB,iBACD2L,IACF9xB,EAAKskB,WAAatkB,EAAKkyB,oBAAoBH,GAC3C/xB,EAAKukB,WAAa,EAClB3F,QAAQ+K,IAAI,UACZ3pB,EAAKutB,SAASvtB,EAAKskB,WAAYtkB,EAAKukB,eAErC,IAMLtB,EAAAnqB,UAAAq5B,aAAA,SAAavM,GAAb,IAAA5lB,EAAA9G,KACQk5B,EAAcl5B,KAAKotB,eAAehF,SAASrO,QAAQ2S,GACzD,KAAIwM,EAAc,GAAlB,KAIMC,EAAezM,EAAKrL,cACpBwX,EAAWK,EAAc,EACzBE,EAAap5B,KAAKm4B,qBAAqBgB,GAAc,GAAO,GAClEn5B,KAAK+4B,oBAAoBK,GACzBp5B,KAAKotB,eAAe8J,OAAO2B,EAAUO,GACrCp5B,KAAK04B,sBACL5vB,YAAU,WACRhC,EAAKmmB,iBACLnmB,EAAKskB,WAAatkB,EAAKkyB,oBAAoBH,GAC3C/xB,EAAKukB,WAAa,EAClBvkB,EAAKutB,SAASvtB,EAAKskB,WAAYtkB,EAAKukB,cACnC,KASLtB,EAAAnqB,UAAAy5B,eAAA,SAAeC,GAAf,IAAAxyB,EAAA9G,KACMu5B,GAAY,EAUhB,GAT2B,iBAAhBD,EACTC,EAAWD,EAAc,EAChBA,IACTC,EAAWv5B,KAAKotB,eAAehF,SAASrO,QAAQuf,IAElD5T,QAAQ+K,IACN,QACuB,iBAAhB6I,EAA2BA,EAAcC,KAE9CA,EAAW,GAIf,GAA4C,IAAxCv5B,KAAKotB,eAAehF,SAAS1oB,QAAiBM,KAAKkqB,WAAvD,KAMMsP,EAAcx5B,KAAKotB,eAAeqM,GAAGF,GAG3C,GAFAv5B,KAAKotB,eAAemM,SAASA,GAC7Bv5B,KAAKwuB,wBAAwBgL,GAE1Bx5B,KAAKyR,eACNzR,KAAKotB,eAAehF,UACoB,IAAxCpoB,KAAKotB,eAAehF,SAAS1oB,QAC5BM,KAAK+3B,oBAGD,KAEC2B,EAAUlwB,KAAKoC,IACnB,EACApC,KAAKyF,KACHjP,KAAKotB,eAAehF,SAAS1oB,OAASM,KAAK6qB,qBAG3C7qB,KAAK4qB,oBAAsB8O,IAC7B15B,KAAK4qB,oBAAsB8O,GAE7B15B,KAAK04B,2BAZL14B,KAAKu0B,cAcPzrB,YAAU,WACRhC,EAAKmmB,mBACJ,QA9BGjtB,KAAKmqB,qBACPnqB,KAAKmqB,oBAAoBxlB,QAiCvBolB,EAAAnqB,UAAAm5B,oBAAR,SAA4BrM,GAC1B,GAAK1sB,KAAKyR,cAAiBib,EAA3B,KAGMiN,EAAOjN,EAAK5kB,IAAI,yBAClB6xB,GACFA,EAAKhR,UAAS,EAAM,CAAE+F,WAAW,MAK7B3E,EAAAnqB,UAAAk5B,oBAAR,SAA4BH,GAC1B,IAAKA,EACH,OAAO34B,KAAKotB,eAAehF,SAAS1oB,WAEhCk6B,EAAM55B,KAAKotB,eAAehF,SAASrO,QAAQ4e,GACjD,OAAOiB,GAAO,EAAIA,EAAM,EAAI55B,KAAKotB,eAAehF,SAAS1oB,QAInDqqB,EAAAnqB,UAAAo5B,oBAAR,SAA4Ba,GAC1B,OACEA,GAAe75B,KAAK4qB,oBAAsB,GAAK5qB,KAAK6qB,oBAIjDd,EAAAnqB,UAAAk6B,gBAAP,SAAuBpxB,GAAvB,IAAA5B,EAAA9G,KACEA,KAAK4qB,oBAAsBliB,EAC3BI,YAAU,WACRhC,EAAKmmB,mBACJ,IAGElD,EAAAnqB,UAAAm6B,eAAP,SAAsBrxB,GAAtB,IAAA5B,EAAA9G,KACEA,KAAK6qB,mBAAqBniB,EAC1BI,YAAU,WACRhC,EAAKmmB,mBACJ,IAGGlD,EAAAnqB,UAAA0nB,qBAAR,SAA6BlU,GAA7B,IAAAtM,EAAA9G,KACE,GAAIA,KAAKyR,aACP,GAAI2B,GAAQA,EAAKf,OAA0C,IAAjCrS,KAAKgrB,iBAAiBtrB,OAAc,KACtDs6B,EAAQ5mB,EAAKf,MACnB,GAAI2nB,EAAMt6B,SAAWM,KAAKgrB,iBAAiBtrB,OACzCM,KAAKgrB,iBAAiBhkB,SAAO,SAAEb,EAAMqC,GACnC1B,EAAK4K,mBAAmBvL,GAAKjH,EAAA,GACxB4H,EAAKikB,yBAAyBviB,GAC9BwxB,EAAMxxB,YAGR,GAAIwxB,EAAMt6B,OAASM,KAAKgrB,iBAAiBtrB,OAAQ,CAItD,QAFMu6B,EAAcj6B,KAAKu2B,oBAAoBlV,cAAchP,MACvD6nB,GAAY,EACP36B,EAAI,EAAGA,EAAI06B,EAAYv6B,OAAQH,IACtC,GAAI06B,EAAY16B,GAAGg5B,sBAAuB,CACxC2B,EAAW36B,EACX,MAGJ,IAAkB,IAAd26B,GAAmBl6B,KAAKgrB,iBAAiBtrB,OAAS,EAAG,KACjDm5B,EACJqB,GAAY,EACRl6B,KAAKgrB,iBAAiB,GACtBhrB,KAAKgrB,iBAAiBkP,EAAW,GAAK,EACtCC,EAASj7B,EAAA,GACV+6B,EAAYC,GAAS,CACxB3B,uBAAuB,IAEzBv4B,KAAK0R,mBAAmBgX,OAAOmQ,EAAU,EAAGsB,GAC5C,IAAS56B,EAAI,EAAGA,EAAIS,KAAKgrB,iBAAiBtrB,OAAQH,IAC5CS,KAAKgrB,iBAAiBzrB,IAAMs5B,GAC9B74B,KAAKgrB,iBAAiBzrB,KAG1BS,KAAKgrB,iBAAiBtC,OAAOwR,EAAU,EAAGrB,GACtC74B,KAAK+qB,0BACP/qB,KAAK+qB,yBAAyBrC,OAAOwR,EAAU,EAAGC,OAE9CC,EAAYp6B,KAAKotB,eAAeqM,GAAGS,GAAwBpyB,IAC/D,yBAEEsyB,GACFA,EAASzR,UAAS,EAAO,CAAE+F,WAAW,SAGrC,KAGD2L,GAAgB,EAChBhN,EAAQ,EACZ,GAAqB,IAAjB2M,EAAMt6B,OACR26B,EAAe,OAEf,IAAS96B,EAAI,EAAGA,EAAIy6B,EAAMt6B,OAAQH,IAAK,CACrC,GAAIy6B,EAAMz6B,GAAGy3B,UAAY3J,EAAQ,EAAG,CAClCgN,EAAe96B,EACf,MAEF8tB,IAGJ,IAAsB,IAAlBgN,EAAqB,CAEvBr6B,KAAK0R,mBAAqB1R,KAAK0R,mBAAmBxL,QAAM,SACrDC,EAAMqC,GACL,OAAOA,IAAU1B,EAAKkkB,iBAAiBqP,MAG3Cr6B,KAAKgrB,iBAAiBtC,OAAO2R,EAAc,GAC3C,IAAS96B,EAAI,EAAGA,EAAIS,KAAKgrB,iBAAiBtrB,OAAQH,IAC5CA,GAAK86B,GACPr6B,KAAKgrB,iBAAiBzrB,SAGrB,KAEC+6B,EACJt6B,KAAKgrB,iBAAiBhrB,KAAKgrB,iBAAiBtrB,OAAS,GACvDM,KAAK0R,mBAAqB1R,KAAK0R,mBAAmBxL,QAAM,SACrDC,EAAMqC,GACL,OAAOA,IAAU8xB,KAGrBt6B,KAAKgrB,iBAAiBuP,aAItBnnB,GAAQA,EAAKf,QACfrS,KAAK0R,mBAAqB0B,EAAKf,YAI/Be,GAAQA,EAAKf,QACfrS,KAAK0R,mBAAqB0B,EAAKf,OAK9BrS,KAAKyR,aAGJzR,KAAKirB,UAEPjrB,KAAKirB,UAAYjrB,KAAKu2B,oBAAoB/S,MAGtCxjB,KAAKu2B,oBAAoB/S,MAC3BxjB,KAAKirB,UAAYjrB,KAAK02B,gBAEtB12B,KAAKirB,UAAYjrB,KAAKu2B,oBAAoB/S,MAV9CxjB,KAAKirB,UAAYjrB,KAAKu2B,oBAAoB/S,MAe5CxjB,KAAKgmB,YAAYrhB,KAAK3E,KAAKu2B,sBAGrBxM,EAAAnqB,UAAA0f,UAAR,SAAkBnY,GAChB,IAAKA,GAASA,GAAwB,IAAhBA,EAAKzH,OACzB,OAAO,MAELuhB,EAAW,GACXuZ,EAAwB,GAyB5B,GAxBArzB,EAAKH,SAAO,SAAEb,GAQZ,GAHA8a,EAASpf,KAAKsE,EAAKsB,MAGftB,EAAKga,eAAiBha,EAAKwY,eAC7B6b,EAAwB,GACxBrzB,EAAKH,SAAO,SAAE8qB,GAEVA,EAAUrqB,OAAStB,EAAKwY,aAAapd,OACrCuwB,EAAUrqB,OAAStB,EAAKwY,aAAa9C,OAErC2e,EAAsB34B,KAAKiwB,EAAUrqB,SAGrC+yB,EAAsB96B,OAAS,GACjC,KAAM,wBAAwByG,EAAKsB,KAAI,qDAKzCyZ,EAAI,IAAIC,IAAIF,IAAWvhB,SAAWyH,EAAKzH,OACzC,KAAM,gCAGR,OAAO,GAGFqqB,EAAAnqB,UAAAwhB,WAAP,WACEphB,KAAKgmB,YAAYrhB,KAAK3E,KAAKu2B,oBAAoBlV,gBAG1C0I,EAAAnqB,UAAA0hB,UAAP,WAEEthB,KAAK4vB,iBACL,IAAK,IAAIrwB,EAAIS,KAAKotB,eAAehF,SAAS1oB,OAAQH,GAAK,EAAGA,IACxDS,KAAKq5B,eAAe95B,GAEtBS,KAAK4qB,oBAAsB,GAGtBb,EAAAnqB,UAAA+hB,WAAP,SAAkB0E,EAAeqG,GAC/BA,EAAK5kB,IAAIue,EAAS5e,MAAMkhB,SAAS,OAG5BoB,EAAAnqB,UAAA66B,YAAP,SAAmBzM,EAAYkI,EAAmBC,GAC1B/oB,SAASd,cAAc0hB,GACpCyH,SACTz1B,KAAKi2B,wBAAwBC,EAAWC,IAK1CpM,EAAAnqB,UAAA86B,eAAA,SAAeC,EAAcC,OACrBC,EAAc76B,KAAKosB,eAAeuO,GACxC,QAAoBxL,IAAhB0L,EACF,OAAOA,EAAc,IAAMD,MAGvBE,EAAO1tB,SAASulB,cAAc,QACpCmI,EAAK1wB,MAAM8C,WAAa,SACxB4tB,EAAK1wB,MAAM2C,SAAW,WACtB+tB,EAAK1wB,MAAM2wB,WAAa,SACxBD,EAAK1wB,MAAM4wB,SAAW,OACtBF,EAAK1wB,MAAMnC,QAAU,eACrB6yB,EAAKG,UAAYN,EACjBvtB,SAASC,KAAKC,YAAYwtB,OACpBI,EAAaJ,EAAKzsB,YAAc,IAAMusB,EAI5C,OAHA56B,KAAKosB,eAAeuO,GAAQG,EAAKzsB,YACjCysB,EAAK1wB,MAAMnC,QAAU,OACrBmF,SAASC,KAAKG,YAAYstB,GACnBI,GAGTnR,EAAAnqB,UAAAu7B,cAAA,SAAcC,GACZ,OAAIA,GAAe,IAARA,EACFA,EAEA,OAIXrR,EAAAnqB,UAAAm3B,qBAAA,SAAqBqE,GACnB,OAAY,OAARA,QAAwBjM,IAARiM,uBA/8DvBj5B,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,gBACVC,SAAA,yuwCAzBkBqjB,EAAAA,mBAdlB5P,EAAAA,yBA+BO+S,gDAYNuS,EAAAA,aAAYj5B,KAAA,CAAC,wCAEbwC,EAAAA,0BACAA,EAAAA,mCACAC,EAAAA,uCACAD,EAAAA,qCAEAA,EAAAA,4BACAA,EAAAA,0BACAA,EAAAA,4BAEAA,EAAAA,+BAEAA,EAAAA,oBAEAA,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,wBAG/CD,EAAAA,aAAYH,KAAA,CAAC,aAAc,CAAEI,QAAQ,6BA6jDrCqC,EAAAA,UAppDwBC,EAAAA,CAAfC,EAAAA,8EACeD,EAAAA,CAAfC,EAAAA,0EAEeD,EAAAA,CAAfC,EAAAA,sFAEeD,EAAAA,CAAfC,EAAAA,qFACeD,EAAAA,CAAfC,EAAAA,4EACeD,EAAAA,CAAfC,EAAAA,0EAEeD,EAAAA,CAAfC,EAAAA,4EAEeD,EAAAA,CAAfC,EAAAA,+EAaeD,EAAAA,CAAfC,EAAAA,iFAQeD,EAAAA,CAAfC,EAAAA,yEA66DZglB,EAr9DA,GCvCA,IAAAuR,GAAA,WASA,SAAAA,KAciC,2BAdhC54B,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAyH,EAAAA,oBACAxH,EAAAA,kBACAkC,EACAqF,EACA5H,GAEFM,aAAc,CAACgnB,IACf/mB,QAAS,CAAC+mB,IACVwR,UAAW,CAACzS,QAEmBwS,EAvBjC,iBCyCE,SAAAE,IA7BSx7B,KAAAoQ,OAAoC,CAAEpB,EAAG,OACzBhP,KAAAgQ,cAAwB,EACxChQ,KAAAsQ,YAAsB,aAENtQ,KAAAy7B,gBAA0B,EAEzCz7B,KAAAuQ,YAAc,IAAIlM,EAAAA,aAClBrE,KAAA07B,iBAAmB,IAAIr3B,EAAAA,aAKxBrE,KAAA+Q,cAAwB,EAExB/Q,KAAAgR,eAAyB,EACzBhR,KAAAiR,cAAwB,GACvBjR,KAAAwW,qBAAuB,IAAInS,EAAAA,aAC3BrE,KAAAyW,oBAAsB,IAAIpS,EAAAA,aAEpCrE,KAAAkR,yBAA0B,EAC1BlR,KAAAmR,iBAAkB,EAClBnR,KAAAoR,kBAAoB,GACpBpR,KAAAqR,cAAgB,GAEhBrR,KAAAsR,eAA6C,GAC7CtR,KAAAuR,eAAyC,GAEzCvR,KAAA27B,qBAAuB,GA0EzB,OAtEEH,EAAA57B,UAAAsC,SAAA,aAEAs5B,EAAA57B,UAAA0G,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,OAEFvG,KAAKsV,gBAKTkmB,EAAA57B,UAAAuV,sBAAA,SAAsBC,GACpBpV,KAAKoR,kBAAoBgE,EACzBpV,KAAKqV,gBACLrV,KAAKsV,eAGPkmB,EAAA57B,UAAAg8B,OAAA,SAAOr4B,GACFA,EACDvD,KAAKyW,oBAAoB9R,KAAK3E,KAAKiR,eAEnCjR,KAAKwW,qBAAqB7R,KAAK3E,KAAKgR,gBAGtChR,KAAK07B,iBAAiB/2B,KAAKpB,IAG7Bi4B,EAAA57B,UAAA0V,YAAA,WACEtV,KAAKkR,yBAA0B,EAC/BlR,KAAKmR,iBAAkB,EACvBnR,KAAKsR,eAAiB,GACtBtR,KAAKuR,eAAiB,GACtBvR,KAAKuQ,YAAY5L,KAAK,KAGxB62B,EAAA57B,UAAAyV,cAAA,SAAc3M,EAAwB0K,GAAtC,IAAAtM,EAAA9G,KAUE,QAVY,IAAA0I,IAAAA,GAAA,QAAwB,IAAA0K,IAAAA,EAAA,MAChC1K,GAAS0K,GACVpT,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,gBAAkBtQ,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,cAAgB8C,IACrF1K,GAAS0K,GACnBpT,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,sBAAwBtQ,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,cAEtFtQ,KAAKkR,wBAA0BlR,KAAKoR,kBAAkBoE,OAAK,SAACrP,GAAQ,OAAAW,EAAKwK,eAAenL,EAAKW,EAAKwJ,iBAClGtQ,KAAKmR,gBACHnR,KAAKoR,kBAAkBqE,MAAI,SAACtP,GAAQ,OAAAW,EAAKwK,eAAenL,EAAKW,EAAKwJ,mBAAmBtQ,KAAKkR,wBAExFlR,KAAKuQ,YAAa,KACdsrB,EAA2B18B,OAAOuW,OAAO1V,KAAKuR,gBACpDvR,KAAKuQ,YAAY5L,KAAKk3B,GAGc,IAAlC77B,KAAK6Q,UAAUhG,QAAQnL,SACzBM,KAAKkR,yBAA0B,IAInCsqB,EAAA57B,UAAA+V,SAAA,SAASpU,GAAT,IAAAuF,EAAA9G,KACEA,KAAKoR,kBAAkBpK,SAAO,SAACb,GACzB5E,GACDuF,EAAKyK,eAAepL,EAAKW,EAAKwJ,gBAAkBxJ,EAAKyK,eAAepL,EAAKW,EAAKwJ,cAAgBnK,GAE/FW,EAAKyK,eAAepL,EAAKW,EAAKwJ,sBAAwBxJ,EAAKyK,eAAepL,EAAKW,EAAKwJ,cAGtFxJ,EAAKwK,eAAenL,EAAKW,EAAKwJ,cAAgB/O,KAEhDvB,KAAKqV,qCA1GRlT,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,mBACVC,SAAA,2xNAICsC,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,8EAiGZy2B,KCjHA,IAAAM,GAAA,WAMA,SAAAA,KAUoC,2BAVnCp5B,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAsT,EAAAA,cACA7L,GAEFtH,aAAc,CAACy4B,IACfx4B,QAAS,CAACw4B,IACVplB,QAAS,CAACC,EAAAA,sBAEwBylB,EAhBpC,GCAAC,GAAA,WAUE,SAAAA,KAKF,OAFEA,EAAAn8B,UAAAsC,SAAA,iCAXDC,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,SACVC,SAAA,m1BAICsC,EAAAA,SAOHm3B,EAfA,GCAA,IAAAC,GAAA,WAUE,SAAAA,EAAoBC,GAAAj8B,KAAAi8B,aAAAA,SAEpBD,EAAAp8B,UAAAs8B,SAAA,SAASC,GACPn8B,KAAKi8B,aAAaG,OAAO,CACvBC,QAAS,OACTC,UAAWP,GACXQ,kBAAmB,CAAEJ,KAAIA,GACzBK,SAAU,KACVC,QAAS,2BAdd74B,EAAAA,WAAUxB,KAAA,CAAC,CACVyB,WAAY,oDAJL64B,EAAAA,uJADT,GCAA,IAAAC,GAAA,WAMA,SAAAA,KAW2B,2BAX1Bj6B,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAE,EAAAA,kBACAmT,IAEF2mB,gBAAiB,CAACb,IAClBh5B,aAAc,CAACg5B,IACf/4B,QAAS,CAAC+4B,IACVR,UAAW,CAACS,QAEaW,EAjB3B,GCAAE,GAAA,WAYE,SAAAA,IAHU78B,KAAA88B,cAAgB,IAAIz4B,EAAAA,aACpBrE,KAAA+8B,aAAe,IAAI14B,EAAAA,aAgB/B,OAZEw4B,EAAAj9B,UAAAsC,SAAA,aAIA26B,EAAAj9B,UAAAo9B,OAAA,SAAOr7B,GACL3B,KAAK+8B,aAAap4B,QAGpBk4B,EAAAj9B,UAAAq9B,QAAA,SAAQt7B,GACN3B,KAAK88B,cAAcn4B,4BArBtBxC,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,gBACVC,SAAA,mnMAICsC,EAAAA,6BACAC,EAAAA,6BACAA,EAAAA,UAgBHg4B,EA1BA,GCAA,IAAAK,GAAA,WAMA,SAAAA,KAeA,2BAfCx6B,EAAAA,SAAQN,KAAA,CAAC,CACRW,aAAc,CACZ85B,IAEFl6B,QAAS,CACPE,EAAAA,YACAyH,EAAAA,oBACA1H,EAAAA,aACAE,EAAAA,mBAEFE,QAAS,CAAC65B,IACVtB,UAAW,GACX4B,UAAW,CAACN,QAGdK,EArBA,GCIME,GAAyC,mBACvCha,EAAM,IAAIpd,eACL2xB,GACTze,GAAcye,GAAO3wB,SAAO,SAAEb,GACxBA,GACFid,EAAInc,IAAId,EAAKwN,cAAegkB,WAHlC,IAAoB,IAAAL,EAAAxjB,EAAA3U,OAAO4U,KAAKmF,KAAcrF,EAAAyjB,EAAAh2B,QAAAuS,EAAArS,KAAAqS,EAAAyjB,EAAAh2B,OAAA,GAA9BuS,EAAAtS,yGAOhB,OAAO6hB,EATqC,GAY9Cia,GAAA,WASE,SAAAA,KAiBF,OAfEA,EAAAz9B,UAAAsC,SAAA,WACElC,KAAK4Z,kBAGPyjB,EAAAz9B,UAAA0G,YAAA,WACEtG,KAAK4Z,kBAGPyjB,EAAAz9B,UAAAga,eAAA,eACQ0jB,EAAct9B,KAAKu9B,QAAUv9B,KAAKu9B,OAAO5pB,cAC/C3T,KAAKia,YACHqjB,GAAeF,GAAiBv1B,IAAIy1B,GAChCF,GAAiBt1B,IAAIw1B,GACrB,+BAxBTn7B,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,YACVC,SAAA,k8JAICsC,EAAAA,SAoBHy4B,EA1BA,GChBA,IAAAG,GAAA,WAMA,SAAAA,KAeA,2BAfC96B,EAAAA,SAAQN,KAAA,CAAC,CACRW,aAAc,CACZs6B,IAEF16B,QAAS,CACPE,EAAAA,YACAyH,EAAAA,oBACA1H,EAAAA,aACAE,EAAAA,mBAEFE,QAAS,CAACq6B,IACV9B,UAAW,GACX4B,UAAW,CAACE,QAGdG,EArBA,GCQaC,GAAQ,CAEnBC,mBAAoB,GAEpBC,sBAAuB,GAEvBC,mBAAoB,IAEpBC,aAAc,IAEdC,aAAc,IAEdC,iBAAkB,IAElBC,aAAc,IAEdC,aAAc,IAEdC,iBAAkB,IAElBC,eAAgB,IAEhBC,gBAAiB,IAEjBC,eAAgB,IAEhBC,eAAgB,IAEhBC,YAAa,IAEbC,YAAa,KC3Bf,IAAAC,GAAA,WAAA,SAAAA,KAqBA,OAnBEA,EAAA7+B,UAAA8+B,UAAA,SAAUtrB,EAAWvM,GACnB,IAAKuM,IAASvM,EACZ,MAAO,CAAEoB,QAAS,MAAOqpB,MAAO,KAAMqN,SAAS,EAAMC,UAAU,OAE3DC,EA0BV,SAA2BzrB,EAAWvM,GACpC,GAAIA,EAAIi4B,OACN,OAAOj4B,EAAIi4B,OAAO1rB,OAEd3L,EAAOZ,EAAIY,KACjB,GAAoB,mBAATA,EACT,OAAOA,EAAK2L,GAEd,GAAoB,iBAAT3L,EACT,OAAO2L,EAAK3L,GAEd,OArCcs3B,CAAkB3rB,EAAMvM,GAC9B83B,IAAYE,GAAe,IAARA,GACnB52B,EAAU02B,EAAU,MAAQE,EAC5BjE,EAAW/zB,EAAIwC,OAASo0B,GAASc,YACnCK,GAAW,EACXtN,EAAuB,KAC3B,IAAKqN,EAAS,KACNvD,EAAMzzB,OAAOk3B,IACnBD,EAUN,SAA2BxD,GAEzB,QADI/xB,EAAQ,GACH9J,EAAI,EAAGA,EAAI67B,EAAI17B,OAAQH,IAC9B8J,GAAS+xB,EAAI4D,WAAWz/B,GAAK,IAAM,GAAK,EAE1C,OAAO8J,EAfQ41B,CAAkB7D,IAAQR,KAEnCtJ,EAAQ8J,GAGZ,MAAO,CAAEnzB,QAAOA,EAAEqpB,MAAKA,EAAEqN,QAAOA,EAAEC,SAAQA,wBAnB7CM,EAAAA,KAAI98B,KAAA,CAAC,CAAEqF,KAAM,cAAe03B,MAAM,MAqBnCV,EArBA,GCRA,OAAA,WAEEz+B,KAAAyH,KAA0B,KAS1BzH,KAAA+U,MAAsC,OAItC/U,KAAAo/B,MAA2B,KAG3Bp/B,KAAAq/B,QAA8B,GAC9Br/B,KAAAypB,QAAmB,EACnBzpB,KAAAs/B,SAAoB,EACpBt/B,KAAAu/B,SAAoB,GAyDtB,OAAA,aAYA,IAAAC,GAAA,WAGEx/B,KAAAy/B,aAAmD,EACnDz/B,KAAA0/B,UAAqB,GAKvB,IAAAC,GAAA,WAEE3/B,KAAA4/B,UAAiC,IAAI55B,KAKvC,OAAA,WACEhG,KAAAsxB,MAAgB,GAChBtxB,KAAAI,IAAc,GACdJ,KAAAmE,UAAqB,EACrBnE,KAAAyoB,SAAoB,EACpBzoB,KAAA6/B,YAAuB,EACvB7/B,KAAA8/B,QAAmB,EACnB9/B,KAAA+/B,UAAqB,GAIvB,OAAA,aC/DA,SAASC,GAAYC,GACnB,MAAO,CACLC,QAAY12B,KAAKyF,KAAKgxB,GAAc,KACpCE,WAAY,EACZC,aAAcH,EACdI,SAAS,GAkBb,IAAAC,GAAA,WAkKE,SAAAA,EACUC,EACAxwB,EACAia,GAHV,IAAAljB,EAAA9G,KACUA,KAAAugC,OAAAA,EACAvgC,KAAA+P,IAAAA,EACA/P,KAAAgqB,qBAAAA,EA7JDhqB,KAAAwgC,UAAkC,GAElBxgC,KAAAgQ,cAAwB,EAIxChQ,KAAAygC,WAAmC,WACnBzgC,KAAA0gC,0BAAoC,EAEpC1gC,KAAAuqB,iBAA2B,EAC3BvqB,KAAAuW,eAAyB,EAGzCvW,KAAAsQ,YAAsB,aAYNtQ,KAAAy7B,gBAA0B,EAOzCz7B,KAAA2gC,UAAY,IAAIt8B,EAAAA,aAChBrE,KAAAuQ,YAAc,IAAIlM,EAAAA,aAClBrE,KAAA07B,iBAAmB,IAAIr3B,EAAAA,aAEvBrE,KAAA4gC,WAAa,IAAIv8B,EAAAA,aAClBrE,KAAA+Q,cAAwB,EAER/Q,KAAA6gC,YAAsB,EAOtB7gC,KAAA8gC,iBAA2B,EAE3C9gC,KAAAgR,eAAyB,EACzBhR,KAAAiR,cAAwB,IAGvBjR,KAAAwW,qBAAuB,IAAInS,EAAAA,aAC3BrE,KAAAyW,oBAAsB,IAAIpS,EAAAA,aAC1BrE,KAAA+gC,yBAA2B,IAAI18B,EAAAA,aAMzCrE,KAAAoQ,OAAS,KAGTpQ,KAAAkR,yBAA0B,EAC1BlR,KAAAmR,iBAAkB,EAClBnR,KAAAoR,kBAAoB,GACpBpR,KAAAqR,cAAgB,GAEhBrR,KAAAsR,eAA6C,GAC7CtR,KAAAuR,eAAyC,GAEzCvR,KAAA27B,qBAAuB,GAEvB37B,KAAAghC,iBAAqC,IAAIrB,GAGzC3/B,KAAAihC,eAAuC,GACvCjhC,KAAA2R,WAAqB,EACrB3R,KAAAkhC,mBAAsC,GACtClhC,KAAAmhC,wBAA2C,GAC3CnhC,KAAAyrB,eAAyB,EAEzBzrB,KAAAwrB,mBAA6B,EAE7BxrB,KAAA0rB,aAAgC,GAEhC1rB,KAAA2rB,cAAiC,GAGjC3rB,KAAA4rB,mBAAsC,GACtC5rB,KAAA6rB,oBAAuC,GACvC7rB,KAAAohC,YAAsB,EACtBphC,KAAAgsB,YAAmB,KACnBhsB,KAAAisB,aAAuB,GACvBjsB,KAAAqhC,yBAAmC,EACnCrhC,KAAA2W,wBAAkC,EAGlC3W,KAAA4W,wBAA0B,GAGlB5W,KAAA6W,oBAAsC,KAG9C7W,KAAAshC,mBAAqB,EAGrBthC,KAAAuhC,gBAAkB,EAGlBvhC,KAAAwhC,iBAAkB,EAGVxhC,KAAAyhC,oBAAqC,KAGrCzhC,KAAA0hC,uBAAwB,EAGxB1hC,KAAA2hC,eAAyB,KACzB3hC,KAAA4hC,iBAA2B,KAI3B5hC,KAAA6hC,2BAA0C,KAC1C7hC,KAAA8hC,yBAAuC,KACvC9hC,KAAA+hC,qBAAuB,EAG/B/hC,KAAAgiC,wBAAyB,EAGjBhiC,KAAAiiC,oBAA2B,KAC3BjiC,KAAAkiC,sBAAoC,KACpCliC,KAAAmiC,mBAA0B,KAG1BniC,KAAAoiC,wBAA0B,IAAI/kB,EAAAA,QAO9Brd,KAAAqiC,oBAAsB,IAAIhlB,EAAAA,QAkRzBrd,KAAAsiC,mBAAqB,GA2G9BtiC,KAAAuiC,WAAU,SAAI/5B,EAAe4K,OACrBhT,EAAMgT,GAAQA,EAAKtM,EAAKwJ,aAC9B,OAAc,MAAPlQ,EAAcuH,OAAOvH,GAAO,OAAOoI,GAI5CxI,KAAA8W,kBAAiB,SAAItO,GAA0B,OAAAA,GAE/CxI,KAAAwiC,WAAU,SAAIC,EAAgB57B,GAC5B,OAAOA,EAAIyqB,OAsYbtxB,KAAA0iC,WAAU,SAAIC,GACZ,GACEA,EAAItR,KAAKO,OAAOztB,WACfw+B,EAAIC,SAAShR,OAAOnJ,SACT,IAAZka,EAAIE,IAEJ,OAAOC,EAAAA,IAAG,OAENzR,EAAiB,IAAI0R,GACzB1R,EAAK5I,QAAUka,EAAIC,SAAShR,OAAOnJ,QACnC4I,EAAKltB,SAAWw+B,EAAIC,SAAShR,OAAOztB,SACpCktB,EAAK0O,SAAW4C,EAAIC,SAAShR,OAAOmO,SACpC1O,EAAKyO,OAAS6C,EAAIC,SAAShR,OAAOkO,OAClCzO,EAAKjxB,IAAMuiC,EAAIC,SAAShR,OAAOxxB,IAC/BixB,EAAKwO,WAAa8C,EAAIC,SAAShR,OAAOiO,WACtCxO,EAAKC,MAAQqR,EAAIC,SAAShR,OAAON,UAE7B0R,EAAgBl8B,EAAK4kB,aAAauX,WAAS,SAAE98B,GAC/C,OAAOA,EAAKmrB,OAASqR,EAAIC,SAAShR,OAAON,SAGvC4R,EACFp8B,EAAK4kB,aAAauX,WAAS,SAAE98B,GAC3B,OAAOA,EAAKmrB,OAASqR,EAAItR,KAAKO,OAAON,WACpB,IAAbqR,EAAIE,IAAa,EAAIF,EAAIE,KAMjC,OALA/7B,EAAK4kB,aAAahD,OAAOwa,EAAW,EAAG7R,GACvCvqB,EAAK4kB,aAAahD,OAChBwa,GAAaF,EAAgBA,EAAgBA,EAAgB,EAC7D,GAEKF,EAAAA,IAAG,GAAMvkB,KAAK4kB,EAAAA,MAAM,OA3xB7BnjC,KAAKgsB,YAAcK,EAAAA,eAA2B,CAC5CC,OAAQC,EAAAA,UACR9kB,KAAM,UACN+kB,QAAS,EACTC,UAAW,kBA6gEjB,OAzgEE6T,EAAA1gC,UAAAuS,YAAA,WACEnS,KAAKojC,8BACLpjC,KAAKqjC,2BACDrjC,KAAKsjC,8BACPtjC,KAAKsjC,6BAA6BpkB,cAEhClf,KAAKujC,0BACPvjC,KAAKujC,yBAAyBrkB,cAE5Blf,KAAKwjC,0BACPxjC,KAAKwjC,yBAAyBtkB,eAKlCohB,EAAA1gC,UAAAqT,aAAA,WACEjT,KAAK+P,IAAIkD,gBAGXqtB,EAAA1gC,UAAAsC,SAAA,WAAA,IAAA4E,EAAA9G,MACkC,IAA5BA,KAAKyjC,qBACPzjC,KAAKqhC,wBAA0BrhC,KAAKyjC,qBAEP,IAA3BzjC,KAAKwX,oBACPxX,KAAK2W,uBAAyB3W,KAAKwX,mBAErCxX,KAAKisB,aAAeU,SAASC,SACzB5sB,KAAKisB,eACPjsB,KAAKisB,aAAejsB,KAAKisB,aAAa9d,QAAQ,MAAO,MAEvDnO,KAAK6sB,YAAc7sB,KAAKgqB,qBAAqBX,WAC3C,gCAGGrpB,KAAK6sB,cACR7sB,KAAK6sB,YAAc,CACjBC,SAAU,QAId9sB,KAAK0jC,yBACL1jC,KAAK2jC,iBACA3jC,KAAKwgC,WAAuC,IAA1BxgC,KAAKwgC,UAAU9gC,QAItCM,KAAKgsB,YACFqE,QACAC,MAAI,WACHxpB,EAAK88B,wBAENpT,OAAK,SAAW7uB,GAEf,MADA+jB,QAAQ+K,IAAI,uBAAwB9uB,GAC9B,sBAIZ2+B,EAAA1gC,UAAA0G,YAAA,SAAYC,GAAZ,IAAAO,EAAA9G,KAmBE,GAjBEuG,EAAoB,YACsB,MAA1CA,EAAoB,WAAiB,eACrCA,EAAoB,WAAgB,eAClCA,EAAoB,WAAiB,eAEvCvG,KAAKsV,eAGL/O,EAAmB,WACnBA,EAA0B,kBAC1BA,EAAwB,gBACxBA,EAAuB,eACvBA,EAAmB,YAEnBvG,KAAK6jC,sBAILt9B,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,WAQpD,OANAvG,KAAK0hC,uBAAwB,EAG7B1hC,KAAKyX,sBAAqB,QAE1BzX,KAAK8jC,kCAGF9jC,KAAK2W,wBACR3W,KAAKsV,cAYT,GARI/O,EAAmB,YACrBvG,KAAK0hC,uBAAwB,EAE7B1hC,KAAKyX,sBAAqB,GAE1BzX,KAAK8jC,mCAILv9B,EAAmB,WACnBC,KAAKC,UAAUF,EAAmB,UAAEG,gBAClCF,KAAKC,UAAUF,EAAmB,UAAEI,qBACCwoB,IAAvC5oB,EAAmB,UAAEI,cACrB,CAEA,GADA3G,KAAK2jC,kBACA3jC,KAAKwgC,WAAuC,IAA1BxgC,KAAKwgC,UAAU9gC,OACpC,OAEFM,KAAKgsB,YACFqE,QACAC,MAAI,WACHxpB,EAAK88B,wBAENpT,OAAK,SAAW7uB,GAEf,MADA+jB,QAAQ+K,IAAI,uBAAwB9uB,GAC9B,sBAKT4E,EAAoB,aAAMA,EAAoB,WAAEyY,aAChDzY,EAAyB,kBAAMA,EAAyB,gBAAEyY,eAG3Dhf,KAAKgR,eAAiB,EACtBhR,KAAKyX,sBAAqB,GAC1BzX,KAAK+P,IAAIkD,iBAKb9T,OAAAyB,eAAI0/B,EAAA1gC,UAAA,qBAAkB,KAAtB,WACE,QAASI,KAAK6gC,cAAgB7gC,KAAK8gC,iDAGrCR,EAAA1gC,UAAA+jC,eAAA,WAEE3jC,KAAKwgC,UAAYxgC,KAAKwgC,UAAUt6B,QAAM,SAAEC,GAEtC,OAAKA,EAAKtG,eAAe,YAIF,IAAhBsG,EAAKsjB,WAIhB6W,EAAA1gC,UAAAoxB,KAAA,SAAKA,GACHhxB,KAAK2hC,eAAiB3Q,GAAQA,EAAK5wB,IACnCJ,KAAK4hC,iBAAmB5Q,GAAQA,EAAKzvB,MACrCvB,KAAK2gC,UAAUh8B,KAAKqsB,IAGtBsP,EAAA1gC,UAAAmkC,WAAA,SAAWl9B,GACT,OAAKA,GAAQA,EAAIy4B,SAAYt/B,KAAK2hC,gBAG3B96B,EAAIY,OAASzH,KAAK2hC,eAAiB3hC,KAAK4hC,iBAFtC,MAKXtB,EAAA1gC,UAAAokC,iBAAA,WACEhkC,KAAKohC,YAAcphC,KAAKohC,WACxBphC,KAAK+P,IAAIkD,eACTjT,KAAK8X,8BAA6B,IAGpC3Y,OAAAyB,eAAI0/B,EAAA1gC,UAAA,2BAAwB,KAA5B,WACE,OAA4B,MAAxBI,KAAK+W,iBAA2B/W,KAAK+W,gBAAkB,EAClD/W,KAAK+W,gBAEP/W,KAAK4W,yDAON0pB,EAAA1gC,UAAAqkC,oBAAR,WACE,OAAuC,KAA/BjkC,KAAKkkC,WAAa,IAAM,MAO1B5D,EAAA1gC,UAAAukC,mBAAR,eAGQ/7B,GADJpI,KAAK6Q,WAAa7Q,KAAK6Q,UAAUhG,QAAU7K,KAAK6Q,UAAUhG,QAAU,IAChDnL,OACtB,IAAKM,KAAKokC,mBACR,OAAOh8B,EAET,GAAIA,GAAS,EACX,OAAO,MAEHsC,EACJpB,OAAOtJ,KAAKiR,eAAiB,EAAI3H,OAAOtJ,KAAKiR,eAAiB,GAG1D4c,IADJvkB,OAAOtJ,KAAKgR,gBAAkB,EAAI1H,OAAOtJ,KAAKgR,gBAAkB,GACvC,GAAKtG,EAChC,OAAImjB,GAASzlB,EACJ,EAEFoB,KAAKmC,IAAIjB,EAAUtC,EAAQylB,IAIpC1uB,OAAAyB,eAAI0/B,EAAA1gC,UAAA,sBAAmB,KAAvB,eACQoX,EAAWhX,KAAKmkC,qBACtB,GAAIntB,GAAY,EACd,OAAO,MAEHqtB,EAAYrkC,KAAKikC,sBACjB/sB,EAAkBF,EAAWhX,KAAKmX,yBACxC,MAAsB,oBAAXjI,OACFgI,EAAkBhI,OAAOkI,YAAcitB,EAEzCrtB,EAAW,qCAIpB7X,OAAAyB,eAAI0/B,EAAA1gC,UAAA,mBAAgB,KAApB,WACE,QAAKI,KAAKuW,eAGHvW,KAAKqX,qDAGdipB,EAAA1gC,UAAA0kC,eAAA,SAAez9B,GACb,MAAqB,UAAdA,EAAIu4B,OAAuBv4B,EAAI09B,iBAAmB,GAAC,KAAO,MAGnEjE,EAAA1gC,UAAA4kC,cAAA,SAAc39B,GACZ,MAAqB,SAAdA,EAAIu4B,OAAsBv4B,EAAI49B,YAAc,GAAC,KAAO,MAU7DtlC,OAAAyB,eAAI0/B,EAAA1gC,UAAA,iBAAc,KAAlB,WACE,OAAQI,KAAKgQ,aApdQ,GAod0B,GAAK,sCAGtD7Q,OAAAyB,eAAI0/B,EAAA1gC,UAAA,uBAAoB,KAAxB,WACE,OAAOI,KAAKsiC,mBAAqB,sCAOnCnjC,OAAAyB,eAAI0/B,EAAA1gC,UAAA,qBAAkB,KAAtB,WACE,QAASI,KAAKoQ,QAAUpQ,KAAKoQ,OAAOpB,oCAG9BsxB,EAAA1gC,UAAA8kC,aAAR,SAAqB79B,GACnB,QAASA,IAAsB,IAAfA,EAAI4iB,QAId6W,EAAA1gC,UAAA+kC,oBAAR,SAA4B99B,GAC1B,OAAOA,GAAOA,EAAIwC,MAAQ,EAAIxC,EAAIwC,MAAQo0B,GAASc,aAI7C+B,EAAA1gC,UAAAglC,yBAAR,WAAA,IAAA99B,EAAA9G,KACMoI,EAAQ,EAYZ,OAXIpI,KAAKgQ,eACP5H,GAhfmB,IAkfjBpI,KAAKy7B,iBACPrzB,GAASpI,KAAKsiC,qBAEftiC,KAAKwgC,WAAa,IAAIx5B,SAAO,SAAEH,GAC1BC,EAAK49B,aAAa79B,KACpBuB,GAAStB,EAAK69B,oBAAoB99B,OAG/BuB,GAITk4B,EAAA1gC,UAAAilC,mBAAA,SAAmBh+B,OACXmH,EAAWhO,KAAK2kC,oBAAoB99B,GAC1C,OAAI7G,KAAKuhC,gBAAkB,GAAK16B,GAAOA,IAAQ7G,KAAKyhC,oBAC3CzzB,EAAWhO,KAAKuhC,gBAElBvzB,GAODsyB,EAAA1gC,UAAAklC,wBAAR,WAGE,QAFMjb,EAAO7pB,KAAKwgC,WAAa,GAC3BuE,EAA6B,KACxBxlC,EAAIsqB,EAAKnqB,OAAS,EAAGH,GAAK,EAAGA,IAAK,KACnCsH,EAAMgjB,EAAKtqB,GACjB,GAAKS,KAAK0kC,aAAa79B,GAAvB,CAGA,GAAkB,UAAdA,EAAIu4B,MACN,OAAOv4B,EAEJk+B,IACHA,EAAcl+B,IAGlB,OAAOk+B,GAIDzE,EAAA1gC,UAAAolC,sBAAR,SAA8BC,GAC5BjlC,KAAKuhC,gBAAkB0D,EAAO9E,WAC9BngC,KAAKwhC,gBAAkByD,EAAO5E,QAC9BrgC,KAAKyhC,oBACHwD,EAAO9E,WAAa,EAAIngC,KAAK8kC,0BAA4B,KAC3D9kC,KAAKshC,mBAAqB2D,EAAO7E,cAInCjhC,OAAAyB,eAAI0/B,EAAA1gC,UAAA,wBAAqB,KAAzB,WACE,OAAII,KAAKklC,mBACA,OAEFllC,KAAKoQ,QAAUpQ,KAAKoQ,OAAOpB,EAC9BrH,OAAO3H,KAAKoQ,OAAOpB,GACnBhP,KAAKshC,mBAAqB,EACxBthC,KAAKshC,mBAAqB,KAC1B,wCAIRhB,EAAA1gC,UAAAulC,cAAA,SAAc38B,GAMZ,QAJEc,OAAOtJ,KAAKgR,gBAAkB,EAAI1H,OAAOtJ,KAAKgR,gBAAkB,GAInD,IAFb1H,OAAOtJ,KAAKiR,eAAiB,EAAI3H,OAAOtJ,KAAKiR,eAAiB,IAC/C3H,OAAOd,IAAU,EAAIc,OAAOd,GAAS,GAChB,GAexC83B,EAAA1gC,UAAAgkC,mBAAA,WAAA,IAAA98B,EAAA9G,KAEEA,KAAKgsB,YACF1C,QACC,YACEtpB,KAAK6sB,YAAYC,SACjB,IACA9sB,KAAKisB,aACL,IACAjsB,KAAKkiB,MAERoO,MAAI,SAAE/uB,GACDA,GACFuF,EAAKk6B,iBAAmBz/B,EACxBuF,EAAKs+B,4BAEHt+B,EAAK+5B,YACL/5B,EAAKk6B,iBAAiBt2B,UACtB5D,EAAKk6B,iBAAiBt2B,SAAW,KAEjC5D,EAAKmK,cAAgBnK,EAAKk6B,iBAAiBt2B,SAC3C5D,EAAK2P,oBAAoB9R,KAAKmC,EAAKmK,kBAGrCnK,EAAKk6B,iBAAmB,IAAIrB,GAC5B74B,EAAKk6B,iBAAiBt2B,SAAW5D,EAAKmK,eAItCnK,EAAK+5B,aACJ/5B,EAAKg6B,iBACNh6B,EAAKu6B,wBAELv6B,EAAKi6B,yBAAyBp8B,KAAKmC,EAAKmK,eAExCnK,EAAKu6B,yBAA0B,EAEjCv6B,EAAKu+B,eAEN7U,OAAK,SAAElO,GACNxb,EAAKk6B,iBAAmB,IAAIrB,GAC5B74B,EAAKk6B,iBAAiBt2B,SAAW5D,EAAKmK,cACtCnK,EAAKu+B,gBAIX/E,EAAA1gC,UAAAylC,UAAA,WAEE,GADArlC,KAAK2R,WAAY,GACZ3R,KAAKkiB,KACR,KAAM,gDAEJliB,KAAKslC,oBACPtlC,KAAKulC,WACLvlC,KAAKuwB,UACLvwB,KAAKwlC,iBACLxlC,KAAK6W,oBAAsB,KAC3B7W,KAAKyX,sBAAqB,KAK9B6oB,EAAA1gC,UAAA6X,qBAAA,SAAqBC,QAAA,IAAAA,IAAAA,GAAA,OACbC,EAAa3X,KAAKsX,iBAClBM,EACyB,OAA7B5X,KAAK6W,qBACL7W,KAAK6W,sBAAwBc,EAG/B,GAFA3X,KAAK6W,oBAAsBc,EAEvBD,GAAgBE,EAMlB,OAFA5X,KAAKylC,0BAA0B9tB,QAC/B3X,KAAKgT,aAAa2E,OAId+tB,KAAc1lC,KAAKoQ,SAAUpQ,KAAKoQ,OAAOpB,GACzC+D,KAAc/S,KAAKoQ,SAAUpQ,KAAKoQ,OAAO0C,GAC/C9S,KAAK2lC,iBACCC,KAAc5lC,KAAKoQ,SAAUpQ,KAAKoQ,OAAOpB,GAK3C+D,OAJgB/S,KAAKoQ,SAAUpQ,KAAKoQ,OAAO0C,IAIlB4yB,IAAaE,GAK1C5lC,KAAK+P,IAAIkD,eACTjT,KAAK6X,iBAAiBF,IALpB3X,KAAKgT,aAAa2E,IASd2oB,EAAA1gC,UAAAoT,aAAR,SAAqB2E,GAArB,IAAA7Q,EAAA9G,KACEA,KAAK2R,WAAY,EACjB3R,KAAK+P,IAAIkD,eACTnK,YAAU,WACRhC,EAAK6K,WAAY,EACjB7K,EAAKiJ,IAAIkD,eACTnK,YAAU,WACRhC,EAAK6+B,aACL7+B,EAAKiJ,IAAIkD,eACTnM,EAAK+Q,iBAAiBF,UAMpB2oB,EAAA1gC,UAAA6lC,0BAAR,SAAkC9tB,OAC1B0sB,EAAYrkC,KAAKikC,sBACjBj1B,EAAIhP,KAAKoQ,OAASpQ,KAAKoQ,OAAOpB,EAAI,MACpChP,KAAKuW,eAAkBoB,EAI3B3X,KAAKoQ,OAAS,CACZpB,EAACA,EACD8D,EAAG,gBAAgBuxB,EAAS,OAL5BrkC,KAAKoQ,OAAS,CAAEpB,EAACA,EAAE8D,EAAG,OASlBwtB,EAAA1gC,UAAAiY,iBAAR,SAAyBF,GAAzB,IAAA7Q,EAAA9G,KACM2X,EACF3X,KAAK8X,8BAA6B,GAGhC9X,KAAKuW,gBACPvW,KAAKgY,wBAAuB,GAExBhY,KAAKsX,kBACPtX,KAAKyX,sBAAqB,GAI9B3O,YAAU,WACRhC,EAAKyL,uBACLzL,EAAK++B,mCAITvF,EAAA1gC,UAAAkY,6BAAA,SAA6BC,GAA7B,IAAAjR,EAAA9G,KACE,QAD2B,IAAA+X,IAAAA,GAAA,IACtB/X,KAAKsX,iBAOR,OANIS,IACF/X,KAAKgY,uBAAuBD,GAC5B/X,KAAK2lC,aACL3lC,KAAK+P,IAAIkD,qBAEXjT,KAAK6lC,+BAGP/8B,YAAU,eACFmP,EACJnR,EAAK6L,kBAAoB7L,EAAK6L,iBAAiBuF,yBACjD,IAAKD,EAGH,OAFAnR,EAAKyL,4BACLzL,EAAK++B,+BAGU/+B,EAAKkR,uBAAuBD,IAE3CjR,EAAK6+B,aACL7+B,EAAKiJ,IAAIkD,eACTgF,EAASE,oBACTrP,YAAU,WACRhC,EAAKkR,uBAAuBD,GAC5BjR,EAAKyL,uBACL0F,EAASE,oBACTrR,EAAK++B,oCAGP5tB,EAASE,oBACTrR,EAAKyL,uBACLzL,EAAK++B,oCAMHvF,EAAA1gC,UAAAkmC,wBAAR,WACE,GAAK9lC,KAAK2S,iBAAV,KAGM1G,EAAUjM,KAAqB,iBAC/BiY,EAAWjY,KAAK2S,iBAAiBuF,yBACvC,GAAID,EAAU,CACoC,mBAArC,EAAkB8tB,gBAC3B,EAAkBA,eAAe,GAEY,mBAApC,EAAkBC,eAC3B,EAAkBA,cAAc,OAE5BC,EACJhuB,EAASI,YACRJ,EAASI,WAAwB,cAChC4tB,IACFA,EAAWC,UAAY,GAGJ,CACrBj6B,EAAQk6B,0BACRl6B,EAAQm6B,uBACRn6B,EAAQo6B,kBAAoBp6B,EAAQo6B,iBAAiB/tB,eAExCtR,SAAO,SAAEs/B,GAClBA,IACFA,EAAGJ,UAAY,UAGb95B,EACJH,EAAQE,kBACPF,EAAQE,iBAA8B,cACzC,GAAKC,EAAL,KAGMykB,EAAQzkB,EAAUwB,iBACtB,gDAEFtI,MAAM1F,UAAUoH,QAAQlH,KAAK+wB,GAAK,SAAGyV,GACnCA,EAAGJ,UAAY,QAQX5F,EAAA1gC,UAAAkkC,gCAAR,WAAA,IAAAh9B,EAAA9G,KAEQumC,EAAS,CAAC,EAAG,GAAI,KACvBA,EAAOv/B,SAAO,SAAEw/B,EAAIh+B,GAClBM,YAAU,WACRhC,EAAKg/B,0BACDt9B,IAAU+9B,EAAO7mC,OAAS,IAC5BoH,EAAK46B,uBAAwB,KAE9B8E,OAIClG,EAAA1gC,UAAAimC,6BAAR,WACO7lC,KAAK0hC,uBAGV1hC,KAAK8lC,2BAIPxF,EAAA1gC,UAAAoY,uBAAA,SAAuBI,GACrB,QADqB,IAAAA,IAAAA,GAAA,GACO,MAAxBpY,KAAK+W,iBAA2B/W,KAAK+W,gBAAkB,IAAMqB,EAC/D,OAAO,MAEHH,EACJjY,KAAK2S,kBAAoB3S,KAAK2S,iBAAiBuF,yBAC3CuuB,EACJzmC,KAAK2S,kBACJ3S,KAAK2S,iBAAuC,uBACzC4F,EACHN,GACGA,EAASI,WAAwB,cAAiB/L,cAClD,4BAEHm6B,GAAcA,EAAUn6B,cAAc,YACzC,IAAKiM,GAAOA,EAAIC,cAAgB,EAC9B,OAAO,MAEHkuB,EAASnuB,EAAIC,aACnB,OAAIkuB,IAAW1mC,KAAK4W,0BAGpB5W,KAAK4W,wBAA0B8vB,GACxB,IAITpG,EAAA1gC,UAAA2xB,eAAA,WACEvxB,KAAKwrB,mBAAoB,EACzBxrB,KAAK2rB,cAAgBnlB,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAK6rB,sBACpD7rB,KAAK0rB,aAAellB,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAK4rB,qBACnD5rB,KAAK+P,IAAIkD,gBAIXqtB,EAAA1gC,UAAA4xB,gBAAA,WAEExxB,KAAK6rB,oBAAsBrlB,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAK2rB,gBAC1D3rB,KAAK4rB,mBAAqBplB,KAAK6M,MAAM7M,KAAKC,UAAUzG,KAAK0rB,eACzD1rB,KAAKwrB,mBAAoB,EACzBxrB,KAAK+P,IAAIkD,gBAGXqtB,EAAA1gC,UAAA6xB,YAAA,WAAA,IAAA3qB,EAAA9G,KACEA,KAAKghC,iBAAiBnX,KAAO,GAC7B7pB,KAAK0rB,aAAa1kB,SAAO,SAAEb,GACzBW,EAAKk6B,iBAAiBnX,KAAKhoB,KAAKsE,EAAKmrB,UAEvCtxB,KAAK2mC,uBACL3mC,KAAKqlC,YACLrlC,KAAKwrB,mBAAoB,EACzBxrB,KAAK+P,IAAIkD,gBAIXqtB,EAAA1gC,UAAA2wB,QAAA,WAAA,IAAAzpB,EAAA9G,KAIE,GAHAA,KAAKyrB,eAAgB,EACrBzrB,KAAK0rB,aAAe,GACpB1rB,KAAK2rB,cAAgB,GACjB3rB,KAAK0wB,eAAgB,CACnB,IAAAhS,EAAA1e,KAAAihC,eAAA1yB,QAAA,kIAAEq4B,EAAAloB,EAAAkoB,UAAWC,EAAAnoB,EAAAmoB,OAWjBA,EAAO7V,MAAI,SAAEC,EAAGC,GACd,OACEpqB,EAAKk6B,iBAAiBnX,KAAK9P,QAAQkX,EAAEK,OACrCxqB,EAAKk6B,iBAAiBnX,KAAK9P,QAAQmX,EAAEI,UAGzCtxB,KAAKwgC,UAAYqG,EAAO7kC,OAAO4kC,GAGjC5mC,KAAKwgC,UAAUx5B,SAAO,SAAE4F,EAASpE,GAC3B1B,EAAK4pB,gBACP9jB,EAAQ6c,SAAS3iB,EAAKk6B,iBAAiBnX,KAAK3V,SAAStH,EAAQ0kB,OAGzD1kB,EAAQ6c,OACV3iB,EAAK4kB,aAAa7pB,KAAK,CACrByvB,MAAO1kB,EAAQ0kB,MACflxB,IAAKwM,EAAQ0kB,MACbntB,WAAUyI,EAAQwyB,MAElB3W,UAAS3hB,EAAKk6B,iBAAiBnX,KAAK3V,SAAStH,EAAQ0kB,SAKvDxqB,EAAK6kB,cAAc9pB,KAAK,CACtByvB,MAAO1kB,EAAQ0kB,MACflxB,IAAKwM,EAAQ0kB,MACbntB,WAAUyI,EAAQwyB,MAElB3W,UAAS3hB,EAAKk6B,iBAAiBnX,KAAK3V,SAAStH,EAAQ0kB,WAMzD1kB,EAAQ6c,QAAS,EACjB3iB,EAAK4kB,aAAa7pB,KAAK,CACrByvB,MAAO1kB,EAAQ0kB,MACflxB,IAAKwM,EAAQ0kB,MACb7I,SAAS,EAETtkB,WAAUyI,EAAQwyB,YAOtBp/B,KAAKghC,kBACLhhC,KAAKghC,iBAAiBpB,WACmB,IAAzC5/B,KAAKghC,iBAAiBpB,UAAU37B,MAEhCjE,KAAKwgC,UAAUx5B,SAAO,SAAEH,GAClBC,EAAKk6B,iBAAiBpB,UAAU/3B,IAAIhB,EAAIyqB,SAC1CzqB,EAAIwC,MAAQvC,EAAKk6B,iBAAiBpB,UAAU93B,IAAIjB,EAAIyqB,WAK1DtxB,KAAKulC,WACLz8B,YAAU,WACRhC,EAAK2kB,eAAgB,IACpB,IAsCL6U,EAAA1gC,UAAAknC,kBAAA,SAAkBC,EAAKC,EAAoBC,EAAoBpE,OACvDqE,EAAW1gC,KAAK6M,MAAM7M,KAAKC,UAAUsgC,IACrCI,EAAcD,EAASjE,WAAS,SACnC98B,GAAS,OAAAA,EAAKmrB,QAAU2V,KAErBG,EAAeF,EAASjE,WAAS,SACpC98B,GAAS,OAAAA,EAAKmrB,QAAU0V,KAErBK,EAAWxE,EAAM,EAAIsE,EAActE,EAAMsE,EAEzCG,EAAiBJ,EAASxe,OAAO0e,EAAc,GAErD,OADAF,EAASxe,OAAO2e,EAAW,EAAG,EAAGC,EAAe,IACzCJ,GAIT5G,EAAA1gC,UAAA+xB,YAAA,SAAYjpB,GAEV,GAAIA,EAAM2oB,KAAKO,OAAOnJ,QAAS,KACzB4I,EAAiB,IAAI0R,IACzB1R,EAAOrxB,KAAK2rB,cAAcvJ,MAAI,SAAEjc,GAC9B,OAAOA,EAAKmrB,QAAU5oB,EAAM2oB,KAAKO,OAAON,UAErC7I,SAAU,EAGf,QADI8e,EAAQ,KACHhoC,EAAIS,KAAKihC,eAAevhC,OAAS,EAAGH,GAAK,EAAGA,IACnD,GAAqC,UAAjCS,KAAKihC,eAAe1hC,GAAG6/B,MAAmB,CAC5CmI,EAAQvnC,KAAKihC,eAAe1hC,GAAG+xB,MAC/B,UAGAkW,EAAoBxnC,KAAK0rB,aAAaxjB,MAAM,GAChD,GAAKq/B,EAEE,KACC/+B,EAAQxI,KAAK0rB,aAAauX,WAAS,SACtC5R,GAAS,OAAAA,EAAKC,QAAUiW,KAE3BC,EAAkB9e,OAAOlgB,EAAO,EAAG6oB,QALnCmW,EAAkB3lC,KAAKwvB,GAOzBrxB,KAAK0rB,aAAe8b,EACpBxnC,KAAK2rB,cAAgB3rB,KAAK2rB,cAAczlB,QAAM,SAAEC,GAC9C,OAAOA,EAAKmrB,QAAU5oB,EAAM2oB,KAAKO,OAAON,aAErC,KAIDO,EAAoB7xB,KAAK2rB,cAAczjB,MAAM,GACjDlI,KAAK0rB,aAAa1kB,SAAO,SAAEb,GACzB,GAAIA,EAAKmrB,QAAU5oB,EAAM2oB,KAAKO,OAAON,MAAO,KACpCQ,EAAYtrB,KAAK6M,MAAM7M,KAAKC,UAAUN,IAC5C2rB,EAAUrJ,SAAU,EACpBoJ,EAAkBhwB,KAAKiwB,OAG3B9xB,KAAK2rB,cAAgBkG,EAGrB7xB,KAAK0rB,aAAe1rB,KAAK0rB,aAAaxlB,QAAM,SAAEC,GAC5C,OAAOA,EAAKmrB,QAAU5oB,EAAM2oB,KAAKO,OAAON,SAG5CtxB,KAAK+P,IAAIkD,gBAIXqtB,EAAA1gC,UAAA6nC,iBAAA,WAAA,IAAA3gC,EAAA9G,KACMwnC,EAAqC,GAYzC,OAVAxnC,KAAKihC,eAAej6B,SAAO,SAAEb,GAC3B,IAAKW,EAAKk6B,iBAAiBnX,KAAK3V,SAAS/N,EAAKmrB,OAAQ,KAChDoW,EAAqB,IAAI3E,GAC7B2E,EAASpW,MAAQnrB,EAAKmrB,MACtBoW,EAAStnC,IAAM+F,EAAKmrB,MACpBoW,EAASvjC,WAAWgC,EAAKi5B,MACzBsI,EAASjf,SAAU,EACnB+e,EAAkB3lC,KAAK6lC,OAGpBF,GAGTlH,EAAA1gC,UAAA2lC,SAAA,WACOvlC,KAAKwgC,UAAU,GAAGmH,UACrB3nC,KAAKwgC,UAAUx5B,SAAO,SAAEb,OAChB20B,EAAO1tB,SAASulB,cAAc,QACpCmI,EAAK1wB,MAAM8C,WAAa,SACxB4tB,EAAK1wB,MAAM2C,SAAW,WACtB+tB,EAAK1wB,MAAM2wB,WAAa,SACxBD,EAAK1wB,MAAM4wB,SAAW,OACtBF,EAAK1wB,MAAMnC,QAAU,eACrB6yB,EAAKG,UAAY90B,EAAKmrB,MACtBlkB,SAASC,KAAKC,YAAYwtB,GAC1B30B,EAAKwhC,SAAW7M,EAAKzsB,YAAc,GACnCysB,EAAK1wB,MAAMnC,QAAU,OACrBmF,SAASC,KAAKG,YAAYstB,UAIxB8M,EAAgB5nC,KAAKwgC,UAAUt6B,QAAM,SAAEW,GAAQ,MAAc,SAAdA,EAAIu4B,SACnDyI,EAAiB7nC,KAAKwgC,UAAUt6B,QAAM,SACzCW,GAAQ,MAAc,UAAdA,EAAIu4B,SAET0I,EAAa9nC,KAAKwgC,UAAUt6B,QAAM,SAAEW,GAAQ,OAACA,EAAIu4B,SACjD2I,EAAaH,EAAc5lC,OAAO8lC,GAAY9lC,OAAO6lC,GAC3D7nC,KAAKwgC,UAAYuH,EACZ/nC,KAAKihC,gBAAiD,IAA/BjhC,KAAKihC,eAAevhC,SAE9CM,KAAKihC,eAAcl/B,EAAO/B,KAAKwgC,aAInCF,EAAA1gC,UAAAwlC,0BAAA,WAAA,IAAAt+B,EAAA9G,KACE,GAAKA,KAAKghC,iBAAiBpB,WAEpB,KAAM5/B,KAAKghC,iBAAiBpB,qBAAqB55B,KAAM,KACtDgiC,EAAY,IAAIhiC,IACtB7G,OAAO4U,KAAK/T,KAAKghC,iBAAiBpB,WAAW54B,SAAO,SAAE5G,GACpD4nC,EAAU/gC,IAAI7G,EAAM0G,EAAKk6B,iBAA0B,UAAS5gC,OAE9DJ,KAAKghC,iBAAiBpB,UAAYoI,QANlChoC,KAAKghC,iBAAiBpB,UAAY,IAAI55B,KAUlCs6B,EAAA1gC,UAAA8wB,aAAR,WACE,SACE1wB,KAAKghC,kBACLhhC,KAAKghC,iBAAiBnX,MACtB7pB,KAAKghC,iBAAiBnX,KAAKnqB,OAAS,IAIxC4gC,EAAA1gC,UAAA+mC,qBAAA,WACE3mC,KAAKgsB,YAAY7C,QACf,YACEnpB,KAAK6sB,YAAYC,SACjB,IACA9sB,KAAKisB,aACL,IACAjsB,KAAKkiB,KACPliB,KAAKghC,mBAITV,EAAA1gC,UAAA0lC,gBAAA,WACE,IAAK,IAAI/lC,EAAI,EAAGA,EAAIS,KAAKwgC,UAAU9gC,OAAQH,IACzC,IAAK,IAAIioB,EAAIjoB,EAAI,EAAGioB,EAAIxnB,KAAKwgC,UAAU9gC,OAAQ8nB,IAC7C,GAAIxnB,KAAKwgC,UAAUjhC,GAAG+xB,QAAUtxB,KAAKwgC,UAAUhZ,GAAG8J,MAChD,KAAM,iBAAiBtxB,KAAKwgC,UAAUjhC,GAAG+xB,MAAK,MAIpD,OAAO,GAGTgP,EAAA1gC,UAAAqoC,SAAA,SAASvpB,EAA0B7X,GAAnC,IAAAC,EAAA9G,KAAWqJ,EAAAqV,EAAArV,MACTrJ,KAAKolC,gCACD8C,EAAY,EAEdA,EADE7+B,EAAQxC,EAAI8gC,SACFt+B,EAEAxC,EAAI8gC,SAElB3nC,KAAKghC,iBAAiBpB,UAAU34B,IAAIJ,EAAIyqB,MAAO4W,GAC/CloC,KAAK2mC,uBACL3mC,KAAKwgC,UAAYxgC,KAAKwgC,UAAUpd,KAAG,SAAEzhB,GACnC,OAAAA,EAAE2vB,QAAUzqB,EAAIyqB,MAAKpyB,EAAA,GAAQyC,EAAC,CAAE0H,MAAO6+B,IAAcvmC,KAEvD3B,KAAK2lC,aACL3lC,KAAK+P,IAAIkD,eACTnK,YAAU,WAAO,OAAAhC,EAAKqhC,8BAGxB7H,EAAA1gC,UAAA4lC,eAAA,eACM4C,EAAapoC,KAAKwgC,UAAUpe,MAAI,SAAEvb,GAAQ,MAAc,OAAdA,EAAIyqB,UAAmB,KACrE,GAAI8W,EAAY,KACVC,EAAU,GACdD,EAAW/I,QAAQr4B,SAAO,SAAEsmB,GACrBA,EAAIoS,WACP2I,GAA+B,mBAAb/a,EAAI7lB,KAAsB,KAAO6lB,EAAI7lB,aAIrDqzB,EAAO1tB,SAASulB,cAAc,KACpCmI,EAAK1wB,MAAM8C,WAAa,SACxB4tB,EAAK1wB,MAAM2C,SAAW,WACtB+tB,EAAK1wB,MAAM2wB,WAAa,SACxBD,EAAK1wB,MAAM4wB,SAAW,OACtBF,EAAK1wB,MAAMnC,QAAU,eACrB6yB,EAAKG,UAAYoN,EACjBj7B,SAASC,KAAKC,YAAYwtB,GAC1BsN,EAAW/+B,MACTyxB,EAAKzsB,YAC8D,GAAlE+5B,EAAW/I,QAAQn5B,QAAM,SAAEC,GAAS,OAACA,EAAKu5B,YAAUhgC,OAAS,GAC9D,GACFo7B,EAAK1wB,MAAMnC,QAAU,OACrBmF,SAASC,KAAKG,YAAYstB,KAI9BwF,EAAA1gC,UAAA8J,aAAA,SAAaC,EAASjB,GAChBiB,GACFA,EAAGjB,IAIP43B,EAAA1gC,UAAA0oC,gBAAA,SAAgBhb,EAAiBla,GAC/B,MAA+B,mBAApBka,EAAImS,YACNnS,EAAImS,YAAYrsB,KAEhBka,EAAImS,aAGfa,EAAA1gC,UAAA2oC,WAAA,SAAWjb,EAAiBla,GAC1B,MAAwB,mBAAbka,EAAI7lB,KACN6lB,EAAI7lB,KAAK2L,IAAS,GAER,MAAZka,EAAI7lB,KAAeE,OAAO2lB,EAAI7lB,MAAQ,IAG/C64B,EAAA1gC,UAAA4oC,YAAA,SAAYlb,EAAiBla,GAC3B,MAAsC,OAA/BpT,KAAKuoC,WAAWjb,EAAKla,IAItBktB,EAAA1gC,UAAA6oC,kBAAR,SAA0BpE,GACxB,MAAO,gBAAgBA,EAAS,OAoB1B/D,EAAA1gC,UAAA8oC,wBAAR,SACEC,GAEA,GAAIA,GAAoB,EACtB,MAAO,CACLzI,QAAS,KACTC,WAAY,EACZC,aAAcuI,EACdtI,SAAS,OAGTuI,EAAe5oC,KAAK2S,iBACpB/D,GAA6B5O,KAAK2S,kBAClC,EAMJ,GAJIi2B,GAAgB,GAAK5oC,KAAKugC,QAAUvgC,KAAKugC,OAAOjoB,gBAClDswB,EAAgB5oC,KAAKugC,OAAoB,cAAiBlyB,aAGxDu6B,GAAgB,EAClB,OAAO5I,GAAY2I,GAGrB,GAAIA,EAAmBC,EAAe,EACpC,OAAO5I,GAAY2I,OAEfE,EAAY7oC,KAAK2S,iBACnB3G,EAAsBhM,KAAK2S,kBAC3B,EAEJ,OAzuCJ,SACEm2B,EACA7I,OAEME,EAAa32B,KAAKoC,IAAI,EAAGk9B,EAAiB7I,GAChD,MAAO,CACLC,QAAY4I,EAAc,KAC1B3I,WAAUA,EACVC,aAAcH,EAAgBE,EAC9BE,SAAS,GAguCF0I,CADgBv/B,KAAKC,MAAMo/B,EAAY,EAAIA,EAAYD,GAC3BD,IAI7BrI,EAAA1gC,UAAA2S,qBAAR,WAAA,IAAAzL,EAAA9G,KACQ0lC,KAAc1lC,KAAKoQ,SAAUpQ,KAAKoQ,OAAOpB,GACzCi2B,EAASjlC,KAAK0oC,wBAClB1oC,KAAK4kC,4BAGL5kC,KAAKoQ,QACLpQ,KAAKoQ,OAAOpB,IAAMi2B,EAAO/E,SACzBlgC,KAAKuhC,kBAAoB0D,EAAO9E,YAChCngC,KAAKwhC,kBAAoByD,EAAO5E,QAEhCv3B,YAAU,WAAO,OAAAhC,EAAKqhC,8BAGxBnoC,KAAKglC,sBAAsBC,GAC3BjlC,KAAKoQ,OAAS,CAAEpB,EAAGi2B,EAAO/E,QAASptB,EAAG9S,KAAKoQ,OAASpQ,KAAKoQ,OAAO0C,EAAI,MACpE9S,KAAK+P,IAAIkD,eAELyyB,MAAeT,EAAO/E,QAI1Bp3B,YAAU,WAAO,OAAAhC,EAAKkiC,8BAHpBhpC,KAAKyX,sBAAqB,KAOtB6oB,EAAA1gC,UAAAopC,yBAAR,WACE,GAAKhpC,KAAK2S,iBAAV,KAGMtD,EAAUrP,KAAqB,iBACV,yBACrBqN,EAAOrN,KAAKipC,uBACdjpC,KAAKoQ,QAAUpQ,KAAKoQ,OAAOpB,GAAKK,GAAUhC,GACxCgC,EAAOM,aAAetC,EAAKsC,aAC7BN,EAAOM,WAAatC,EAAKsC,YAG7B3P,KAAKmoC,4BAIC7H,EAAA1gC,UAAAqpC,qBAAR,WACE,IAAKjpC,KAAK2S,iBACR,OAAO,SAEHu2B,EAAOlpC,KAAqB,iBACN,0BAC5B,GAAIkpC,EACF,OAAOA,MAEHx8B,EAAO1M,KAAKugC,QAAWvgC,KAAKugC,OAAoB,cACtD,OAAK7zB,IAIFA,EAAKJ,cACJ,+CAEDI,EAAKJ,cAAc,qBANb,MAWHg0B,EAAA1gC,UAAAupC,uBAAR,eACQz8B,EAAO1M,KAAKugC,QAAWvgC,KAAKugC,OAAoB,cACtD,OAAO7zB,EACFA,EAAKJ,cAAc,0BACpB,MAIEg0B,EAAA1gC,UAAAwpC,yBAAR,SAAiC/7B,GAC/B,QAAKA,IAIHA,EAAKg8B,aAAeh8B,EAAKi8B,aAAe,GACxCj8B,EAAKgB,YAAchB,EAAKd,YAAc,IAUlC+zB,EAAA1gC,UAAAuoC,wBAAR,WAAA,IAAArhC,EAAA9G,KACE,IAAKA,KAAKy7B,eAMR,OALAz7B,KAAKojC,mCACDpjC,KAAKgiC,yBACPhiC,KAAKgiC,wBAAyB,EAC9BhiC,KAAK+P,IAAIkD,qBAIPs2B,EAASvpC,KAAKmpC,yBACd97B,EAAOrN,KAAKipC,uBAClB,GAAKM,EAAL,CAOAvpC,KAAK+hC,qBAAuB,MACtByH,KAAiBn8B,IAAQrN,KAAKopC,yBAAyB/7B,IAK7D,GAJIrN,KAAKgiC,yBAA2BwH,IAClCxpC,KAAKgiC,uBAAyBwH,EAC9BxpC,KAAK+P,IAAIkD,gBAEPjT,KAAKklC,mBAGP,OAFAllC,KAAKojC,mCACLmG,EAAO55B,WAAa,GAGlBtC,IACFrN,KAAKypC,0BAA0Bp8B,EAAKsC,YACpC3P,KAAK0pC,0BAA0Br8B,SAnB3BrN,KAAK+hC,qBAAuB,KAC9B/hC,KAAK+hC,uBACLj5B,YAAU,WAAO,OAAAhC,EAAKqhC,4BAA2B,MAqB/C7H,EAAA1gC,UAAA6pC,0BAAR,SAAkC95B,OAC1B45B,EAASvpC,KAAKmpC,yBAChBI,GAAUA,EAAO55B,aAAeA,IAClC45B,EAAO55B,WAAaA,IAIhB2wB,EAAA1gC,UAAA8pC,0BAAR,SAAkCr8B,GAAlC,IAAAvG,EAAA9G,KACOA,KAAKy7B,gBAAmBpuB,IAAQrN,KAAKklC,qBAIxCllC,KAAK6hC,6BAA+Bx0B,GACpCrN,KAAK8hC,2BAIP9hC,KAAKojC,8BACLpjC,KAAK6hC,2BAA6Bx0B,EAClCrN,KAAK8hC,yBAAwB,WAC3Bh7B,EAAK2iC,0BAA0Bp8B,EAAKsC,aAEtCtC,EAAKuC,iBAAiB,SAAU5P,KAAK8hC,yBAAwB,CAC3D6H,SAAS,OAILrJ,EAAA1gC,UAAAwjC,4BAAR,WACMpjC,KAAK6hC,4BAA8B7hC,KAAK8hC,0BAC1C9hC,KAAK6hC,2BAA2BhyB,oBAC9B,SACA7P,KAAK8hC,0BAGT9hC,KAAK6hC,2BAA6B,KAClC7hC,KAAK8hC,yBAA2B,MAO1BxB,EAAA1gC,UAAA8jC,uBAAR,WAAA,IAAA58B,EAAA9G,KACEA,KAAKkiC,sBAAqB,WAAS,OAAAp7B,EAAK8iC,8BAClB,oBAAX16B,QACTA,OAAOU,iBAAiB,SAAU5P,KAAKkiC,2BAEnC2H,EACc,oBAAX36B,OAAyB,OAAgB46B,eAAiB,KAC/DD,GAAM7pC,KAAKugC,QAAUvgC,KAAKugC,OAAOjoB,gBACnCtY,KAAKmiC,mBAAqB,IAAI0H,GAAE,WAAO,OAAA/iC,EAAK8iC,gCAC5C5pC,KAAKmiC,mBAAmB4H,QAAQ/pC,KAAKugC,OAAOjoB,iBAIxCgoB,EAAA1gC,UAAAyjC,yBAAR,WACMrjC,KAAKkiC,uBAA2C,oBAAXhzB,QACvCA,OAAOW,oBAAoB,SAAU7P,KAAKkiC,uBAE5CliC,KAAKkiC,sBAAwB,KACzBliC,KAAKmiC,qBACPniC,KAAKmiC,mBAAmB6H,aACxBhqC,KAAKmiC,mBAAqB,MAEI,MAA5BniC,KAAKiiC,sBACPgI,aAAajqC,KAAKiiC,qBAClBjiC,KAAKiiC,oBAAsB,OAIvB3B,EAAA1gC,UAAAgqC,2BAAR,WAAA,IAAA9iC,EAAA9G,KACkC,MAA5BA,KAAKiiC,qBACPgI,aAAajqC,KAAKiiC,qBAEpBjiC,KAAKiiC,oBAAsBn5B,YAAU,WACnChC,EAAKm7B,oBAAsB,KACtBn7B,EAAK05B,WAAc15B,EAAK05B,UAAU9gC,SAGvCoH,EAAKyL,uBAELzJ,YAAU,WAAO,OAAAhC,EAAKqhC,4BAA2B,OAChD,MAGL7H,EAAA1gC,UAAA+lC,WAAA,WAAA,IAAA7+B,EAAA9G,KAEMkqC,EAAa,EACblqC,KAAKgQ,eACPk6B,GA19CmB,IA49CjBlqC,KAAKy7B,iBACPyO,GAAclqC,KAAKsiC,oBAErBtiC,KAAKwgC,UAAUx5B,SAAO,SAAEb,GACjBA,EAAKkD,QACRlD,EAAKkD,MAAQo0B,GAASc,aAEpBz3B,EAAK49B,aAAav+B,KACpBA,EAAKs+B,WAAayF,EAClBA,GAAc/jC,EAAKkD,UAMvB,QADI8gC,EAAc,EACT5qC,EAAIS,KAAKwgC,UAAU9gC,OAAS,EAAGH,GAAK,EAAGA,IAAK,KAC7C4G,EAAOnG,KAAKwgC,UAAUjhC,GACvBS,KAAK0kC,aAAav+B,KAGJ,UAAfA,EAAKi5B,OACPj5B,EAAKo+B,gBAAkB4F,EACvBA,GAAehkC,EAAKkD,OAEpBlD,EAAKo+B,gBAAkB,OAIrBU,EAASjlC,KAAK0oC,wBAClB1oC,KAAK4kC,4BAEP5kC,KAAKglC,sBAAsBC,OACrBZ,EAAYrkC,KAAKikC,sBACjBtsB,EAAa3X,KAAKsX,iBAClB4oB,EAAU+E,EAAO/E,SAEnBlgC,KAAKuW,eAAkBoB,EAQtB3X,KAAKuW,cAQVvW,KAAKoQ,OAAS,CACZpB,EAAGkxB,EACHptB,EAAG9S,KAAKyoC,kBAAkBpE,IAT1BrkC,KAAKoQ,OAAS,CACZpB,EAAGkxB,EACHptB,EAAG,gBAAgBuxB,EAAS,OAV9BrkC,KAAKoQ,OAAS,CACZpB,EAAGkxB,EACHptB,EAAG,OAoBTwtB,EAAA1gC,UAAAuV,sBAAA,SAAsBC,GACpBpV,KAAKoR,kBAAoBgE,EACzBpV,KAAKqV,gBACArV,KAAK2W,wBACR3W,KAAKsV,cAEPtV,KAAK+P,IAAIkD,gBAGXqtB,EAAA1gC,UAAAg8B,OAAA,SAAOr4B,GACL,GAAKvD,KAAK6gC,WAAV,CAIA,GAAI7gC,KAAK8gC,gBAcP,OAbIv9B,GACFvD,KAAKgR,eAAiB,EACtBhR,KAAKyW,oBAAoB9R,KAAK3E,KAAKiR,gBAEnCjR,KAAKwW,qBAAqB7R,KAAK3E,KAAKgR,gBAEtChR,KAAKghC,iBAAiBt2B,SAAW1K,KAAKiR,cACtCjR,KAAK2mC,uBAEL3mC,KAAK0hC,uBAAwB,EAC7B1hC,KAAKyX,sBAAqB,GAC1BzX,KAAK8jC,uCACL9jC,KAAK+P,IAAIkD,eAGXjT,KAAKghC,iBAAiBt2B,SAAW1K,KAAKiR,cACtCjR,KAAK2mC,uBACDpjC,GACFvD,KAAKyW,oBAAoB9R,KAAK3E,KAAKiR,eACnCjR,KAAK+gC,yBAAyBp8B,KAAK3E,KAAKiR,iBAExCjR,KAAKwW,qBAAqB7R,KAAK3E,KAAKgR,gBAEpChR,KAAK07B,iBAAiB/2B,KAAKpB,MAS/B+8B,EAAA1gC,UAAAikC,oBAAA,WAAA,IAAA/8B,EAAA9G,KACE,GACGA,KAAKy7B,gBACLz7B,KAAKoqC,kBACLpqC,KAAKoqC,iBAAiB1qC,OAHzB,KAQM2qC,GAAerqC,KAAKwgC,WAAa,IAAIt6B,QAAM,SAC9C3F,GAAM,OAAAA,IAAkB,IAAbA,EAAEkpB,UAGV6gB,EAAahhC,OAAOtJ,KAAK0Q,eACzB65B,EACJD,EAAa,EACTA,EAAa,EACE,IAAfA,EACE,EACAD,EAAY3qC,OACpB,IAAK6qC,GAAgBA,EAAe,EAClCvqC,KAAK27B,qBAAuB,OAD9B,CAIA37B,KAAK27B,qBAAuB,IAAIr2B,MAAMilC,GAAc31B,KAAK,QACnD/J,EACJ7K,KAAK6Q,WAAa7Q,KAAK6Q,UAAUhG,QAAU7K,KAAK6Q,UAAUhG,QAAU,GACtE7K,KAAKoqC,iBAAiBpjC,SAAO,SAAEb,GAC7B,GAAY,MAARA,GAAiBA,EAAK0O,eAAe1O,EAAK0O,YAAc,GAA5D,KAGItT,EAAa4E,EAAK2O,YAEtB,GAAa,MAATvT,GAA2B,KAAVA,EAAc,KAC3BsF,EAAMwjC,EAAYlkC,EAAK0O,YAAc,GACrC21B,EAAQ3jC,GAA2B,iBAAbA,EAAIY,KAAoBZ,EAAIY,KAAO,KAC/D,IAAK+iC,EACH,WAEEC,EAAM,EACNC,GAAW,EAYf,GAXA7/B,EAAQ7D,SAAO,SAAEuR,OACTsmB,EAAMtmB,EAAMA,EAAIiyB,GAAS,KAC/B,GAAW,MAAP3L,GAAuB,KAARA,EAAnB,KAGM8L,EAAMrhC,OAAOu1B,GACdt1B,MAAMohC,KACTF,GAAOE,EACPD,GAAW,QAGVA,EACH,OAEFnpC,EAAQkpC,MAEJG,EAAaP,EAAYlkC,EAAK0O,YAAc,GAClD/N,EAAK60B,qBAAqBx1B,EAAK0O,YAAc,GAAK,CAChDtT,MAAKA,EACLwT,MAAO5O,EAAK4O,OAAU61B,GAAcA,EAAW71B,OAAU,OACzDC,YAAa7O,EAAK6O,cAAe,EACjCC,eAAuC,MAAvB9O,EAAK8O,eAAyB9O,EAAK8O,eAAiB,EACpEC,OAAQ/O,EAAK+O,SAAU,aAzDzBlV,KAAK27B,qBAAuB,IA8DxB2E,EAAA1gC,UAAAirC,sBAAR,SAA8BhkC,EAAoBikC,GAChD,IACGjkC,IACA7G,KAAK27B,uBACL37B,KAAK27B,qBAAqBj8B,OAE3B,OAAO,KAGT,QADIqrC,GAAgB,EACXxrC,EAAI,EAAGA,GAAKurC,EAAUvrC,IAAK,KAC5BgB,EAAIP,KAAKwgC,UAAUjhC,GACrBgB,IAAkB,IAAbA,EAAEkpB,QACTshB,IAGJ,GAAIA,EAAe,GAAKA,GAAgB/qC,KAAK27B,qBAAqBj8B,OAChE,OAAO,SAEHsrC,EAAOhrC,KAAK27B,qBAAqBoP,GACvC,OAAOC,GAAwB,iBAATA,EAAoBA,EAAO,MAInD1K,EAAA1gC,UAAAqrC,uBAAA,SAAuBpkC,EAAoBikC,OACnCE,EAAOhrC,KAAK6qC,sBAAsBhkC,EAAKikC,GAC7C,IAAKE,GAAQA,EAAK91B,OAChB,MAAO,OAEH3T,EAAQypC,EAAKzpC,MACnB,IAAMA,GAAmB,IAAVA,EACb,MAAO,OAEH2pC,EACmB,MAAvBF,EAAK/1B,eAAyB3L,OAAO0hC,EAAK/1B,gBAAkB,EAC9D,GAAI1T,EAAQ,GAAM,IAAMypC,EAAKh2B,YAC3B,OAAOzT,MAEH4pC,EAAS3hC,KAAK4hC,IAAI,GAAIF,GAC5B,OAAQ1hC,KAAK+K,MAAMjL,OAAO/H,GAAS4pC,GAAUA,GAAQE,QAAQH,IAG/D5K,EAAA1gC,UAAA0rC,uBAAA,SAAuBzkC,EAAoBikC,OACnCE,EAAOhrC,KAAK6qC,sBAAsBhkC,EAAKikC,GACvC/1B,EAASi2B,GAAQA,EAAKj2B,OAAWlO,GAAOA,EAAIkO,OAAU,OAC5D,MAAc,UAAVA,GAA+B,WAAVA,GAAgC,SAAVA,EACtCA,EAEF,QAITurB,EAAA1gC,UAAA2rC,mBAAA,WACE,OAAKvrC,KAAK6Q,WAGL7Q,KAAK6gC,YAAc7gC,KAAK8gC,gBACpB9gC,KAAK6Q,UAAUhG,QAAU7K,KAAK6Q,UAAUhG,QAAQnL,OAAS,EAE3B,MAAhCM,KAAK6Q,UAAUrG,cAClBxK,KAAK6Q,UAAUrG,cACf,EAPK,GAUX81B,EAAA1gC,UAAA0V,YAAA,WAAA,IAAAxO,EAAA9G,KACEA,KAAKkR,yBAA0B,EAC/BlR,KAAKmR,iBAAkB,EAEvBhS,OAAO4U,KAAK/T,KAAKuR,gBAAgBvK,SAAO,SAAE5G,GACxC0G,EAAKwK,eAAelR,IAAO,KAE7BJ,KAAKoR,kBAAkBpK,SAAO,SAAEb,OACxB/F,EAAM+F,EAAKW,EAAKwJ,aACX,MAAPlQ,IACF0G,EAAKwK,eAAelR,IAAO,MAG/BJ,KAAKsR,eAAiB,GACtBtR,KAAKuR,eAAiB,GACtBvR,KAAKuQ,YAAY5L,KAAK,IACtB3E,KAAK+P,IAAIkD,gBAIXqtB,EAAA1gC,UAAA4rC,cAAA,SAAc/iB,EAAkBrV,GAC9B,GAAKqV,GAAYrV,EAIjB,GAAIpT,KAAKsU,iBAAiBlB,GACxBpT,KAAK+P,IAAIkD,mBADX,KAIM7S,EAAMgT,EAAKpT,KAAKsQ,aACtBtQ,KAAKsR,eAAiB,GACtBtR,KAAKuR,eAAiB,GACX,MAAPnR,IACFJ,KAAKsR,eAAelR,IAAO,EAC3BJ,KAAKuR,eAAenR,GAAOgT,GAE7BpT,KAAKkR,yBAA0B,EAC/BlR,KAAKmR,iBAAkB,EACnBnR,KAAKuQ,aACPvQ,KAAKuQ,YAAY5L,KAAY,MAAPvE,EAAc,CAACgT,GAAQ,IAE/CpT,KAAK+P,IAAIkD,oBAnBPjT,KAAK+P,IAAIkD,gBAsBbqtB,EAAA1gC,UAAAyV,cAAA,SAAc3M,EAAwB0K,GAAtC,IAAAtM,EAAA9G,KACE,QADY,IAAA0I,IAAAA,GAAA,QAAwB,IAAA0K,IAAAA,EAAA,MACZ,UAApBpT,KAAKygC,WAAT,CAMA,GAAIrtB,EAAM,CAER,GAAI1K,GAAS1I,KAAKsU,iBAAiBlB,GAEjC,YADApT,KAAK+P,IAAIkD,eAGXjT,KAAKsR,eAAe8B,EAAKpT,KAAKsQ,cAAgB5H,EAC1CA,GACD1I,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,gBAC5BtQ,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,cAAgB8C,GAEjDpT,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,sBACrBtQ,KAAKuR,eAAe6B,EAAKpT,KAAKsQ,kBAGrCiF,EAAiBvV,KAAKoR,kBAAkBlL,QAAM,SACjDC,GAAS,OAACW,EAAKwN,iBAAiBnO,MAYnC,GAVAnG,KAAKkR,wBACHqE,EAAe7V,OAAS,GACxB6V,EAAeC,OAAK,SACjBrP,GAAS,OAAAW,EAAKwK,eAAenL,EAAKW,EAAKwJ,iBAE5CtQ,KAAKmR,gBACHoE,EAAeE,MAAI,SAChBtP,GAAS,OAAAW,EAAKwK,eAAenL,EAAKW,EAAKwJ,mBACpCtQ,KAAKkR,wBAETlR,KAAKuQ,YAAa,KACdsrB,EAA2B18B,OAAOuW,OAAO1V,KAAKuR,gBACpDvR,KAAKuQ,YAAY5L,KAAKk3B,GAGc,IAAlC77B,KAAK6Q,UAAUhG,QAAQnL,SACzBM,KAAKkR,yBAA0B,GAEjClR,KAAK+P,IAAIkD,oBAzCHG,GACFpT,KAAKwrC,cAAc9iC,EAAO0K,IA2ChCktB,EAAA1gC,UAAA+V,SAAA,SAASpU,GAAT,IAAAuF,EAAA9G,KACEA,KAAKoR,kBAAkBpK,SAAO,SAAEb,GAE1BW,EAAKwN,iBAAiBnO,KAGtB5E,GACDuF,EAAKyK,eAAepL,EAAKW,EAAKwJ,gBAC5BxJ,EAAKyK,eAAepL,EAAKW,EAAKwJ,cAAgBnK,GAEjDW,EAAKyK,eAAepL,EAAKW,EAAKwJ,sBACrBxJ,EAAKyK,eAAepL,EAAKW,EAAKwJ,cAGzCxJ,EAAKwK,eAAenL,EAAKW,EAAKwJ,cAAgB/O,MAEhDvB,KAAKqV,gBACLrV,KAAK+P,IAAIkD,gBAIXqtB,EAAA1gC,UAAA0U,iBAAA,SAAiBlB,GACf,SACEpT,KAAK4V,sBACLxC,IACmC,IAAnCA,EAAKpT,KAAK4V,uBAKd0qB,EAAA1gC,UAAAiW,aAAA,SAAazC,GACX,SACEpT,KAAK8V,kBACL1C,IAC+B,IAA/BA,EAAKpT,KAAK8V,mBAOdwqB,EAAA1gC,UAAA6rC,iBAAA,SAAiB5kC,EAAoBuM,GACnC,OAAKvM,GAAoB,MAAbA,EAAI8wB,OAA+B,KAAd9wB,EAAI8wB,MAGZ,mBAAd9wB,EAAI8wB,MACC9wB,EAAI8wB,MAAMvkB,IACR,KAEXvM,EAAI8wB,MANF,MAUX2I,EAAA1gC,UAAA8rC,iBAAA,SAAiB7kC,EAAoBuM,EAAWurB,GAC9C,OAAIA,EACK,UAEF3+B,KAAKyrC,iBAAiB5kC,EAAKuM,IAIpCktB,EAAA1gC,UAAA+rC,kBAAA,SAAkB9kC,EAAoBuM,GACpC,OAAIpT,KAAK6V,aAAazC,GACb,UAEFpT,KAAKyrC,iBAAiB5kC,EAAKuM,IAGpCktB,EAAA1gC,UAAAu7B,cAAA,SAAcC,GACZ,OAAIA,GAAe,IAARA,EACFA,EAEA,OAIXkF,EAAA1gC,UAAAgsC,cAAA,SAAc/kC,GACZ,OAAIA,EAAIglC,QACChlC,EAAQ,KAEVA,EAAIilC,YAAc,SAI3BxL,EAAA1gC,UAAAmsC,SAAA,SAASllC,GACP,SACEA,MACe,IAAdA,EAAImlC,OAAwC,iBAAdnlC,EAAImlC,OAAsBnlC,EAAImlC,SAOjE1L,EAAA1gC,UAAAqsC,aAAA,SAAaplC,EAAoBuM,EAAW5K,GAC1C,IAAKxI,KAAK+rC,SAASllC,GACjB,MAAO,GAET,GAAyB,iBAAdA,EAAImlC,MAAoB,KAC3BzqC,EAAQ6R,EAAOA,EAAKvM,EAAImlC,OAAS,KACvC,OAAa,MAATzqC,GAA2B,KAAVA,EACZ,GAEFoG,OAAOpG,OAEV2qC,EACJ5iC,OAAOtJ,KAAKgR,gBAAkB,EAAI1H,OAAOtJ,KAAKgR,gBAAkB,EAC5D/M,EACJqF,OAAOtJ,KAAKiR,eAAiB,EAAI3H,OAAOtJ,KAAKiR,eAAiB,EAC1Dk7B,EAAW7iC,OAAOd,IAAU,EAAIc,OAAOd,GAAS,EACtD,OAAOb,QAAQukC,EAAO,GAAKjoC,EAAOkoC,EAAW,IAI/C7L,EAAA1gC,UAAAwsC,cAAA,SAAcvlC,GACZ,IACG7G,KAAK+rC,SAASllC,KACdA,IACAA,EAAIyqB,OACL3pB,OAAOd,EAAIyqB,OAAOvX,QAAQ,KAAO,EAEjC,OAAO,SAEH8kB,EAAMl3B,OAAOd,EAAIyqB,OAAO+a,MAAM,KACpC,OAAIxN,EAAIn/B,OAAS,EACR,KAEF,CAACm/B,EAAI,GAAGprB,OAAQorB,EAAI32B,MAAM,GAAGokC,KAAK,KAAK74B,SAIhD6sB,EAAA1gC,UAAA2sC,WAAA,SAAW1lC,EAAoBuM,GAC7B,SAAKvM,GAAO7G,KAAKwsC,cAAc3lC,MAGX,MAAhBA,EAAI4lC,WAAqC,IAAjB5lC,EAAI4lC,WAGJ,mBAAjB5lC,EAAI4lC,WACJ5lC,EAAI4lC,SAASr5B,KAEfvM,EAAI4lC,YAIfnM,EAAA1gC,UAAAgK,YAAA,SAAYlB,EAAc7B,EAAoBuM,GACxC1K,IACFA,EAAMC,iBACND,EAAME,mBAER5I,KAAK0J,aAAa7C,EAAIgD,MAAQ,KAAMuJ,IAItCktB,EAAA1gC,UAAA4sC,cAAA,SAAc3lC,GACZ,SAAKA,IAAQA,EAAI6lC,cAGO,iBAAb7lC,EAAIY,OAAsBZ,EAAIY,QACvCie,QAAQinB,KACN,2CACG9lC,EAAIyqB,OAAS,IACd,WAEG,KAKXgP,EAAA1gC,UAAAgtC,eAAA,SAAe/lC,EAAoBuM,GACjC,SAAKvM,GAA2B,MAApBA,EAAIgmC,eAA6C,IAArBhmC,EAAIgmC,gBAGZ,mBAArBhmC,EAAIgmC,eACJhmC,EAAIgmC,aAAaz5B,KAEnBvM,EAAIgmC,eAGfvM,EAAA1gC,UAAAktC,cAAA,SAAcjmC,EAAoBuM,GAChC,IAAKvM,IAAQA,EAAI8X,aACf,MAAO,OAEH+B,EAAM7Z,EAAI8X,aAChB,GAAI+B,EAAI+V,gBAAkBrjB,EAAM,KACxBjM,EAAOiM,EAAKsN,EAAI+V,gBACtB,OAAOnxB,MAAM8B,QAAQD,GAAQA,EAAO,GAEtC,OAAO7B,MAAM8B,QAAQsZ,EAAIC,YAAcD,EAAIC,WAAa,IAG1D2f,EAAA1gC,UAAAmtC,qBAAA,SAAqBlmC,EAAoBV,GACvC,IAAKU,IAAQA,EAAI8X,eAAiBxY,EAChC,MAAO,OAEHua,EAAM7Z,EAAI8X,aACVpd,EAAQ4E,EAAKua,EAAInf,OACjBsa,EAAQ1V,EAAKua,EAAI7E,OACvB,OAAI6E,EAAI1V,mBAAqB0V,EAAIvV,eACxB,KAAa,MAAT5J,EAAgB,GAAKA,GAAK,KAAa,MAATsa,EAAgB,GAAKA,GAEhD,MAATA,EAAgB,GAAKlU,OAAOkU,IAGrCykB,EAAA1gC,UAAAotC,mBAAA,SACEnmC,EACAzG,EACA6sC,GAEA,IAAKpmC,IAAQA,EAAIsT,YACf,OAAO8yB,MAEHC,EAAMrmC,EAAIsT,YAAY/Z,GAC5B,OAAc,MAAP8sC,EAAc5jC,OAAO4jC,GAAOD,GAGrC3M,EAAA1gC,UAAAutC,eAAA,SAAetmC,GACb,SAAUA,GAAOA,EAAIumC,YAAcvmC,EAAIumC,WAAWhzB,WAGpDkmB,EAAA1gC,UAAAytC,gBAAA,SAAgBxmC,GACd,OAAKA,IAAQA,EAAIumC,YAA0C,MAA5BvmC,EAAIumC,WAAWE,YAGV,IAA7BzmC,EAAIumC,WAAWE,WAGxBhN,EAAA1gC,UAAA2tC,cAAA,SAAc1mC,EAAoB2mC,GAChC,OAAI3mC,GAAOA,EAAIumC,YAAcvmC,EAAIumC,WAAWK,OACnC5mC,EAAIumC,WAAWK,QAEnBD,GAAWxtC,KAAKmtC,eAAetmC,GAC3B,sBAEF,cAGTy5B,EAAA1gC,UAAA8tC,gBAAA,SAAgB7mC,GACd,OAAIA,GAAOA,EAAIumC,YAAcvmC,EAAIumC,WAAWO,aACnC9mC,EAAIumC,WAAWO,aAExB,WACE,OAAO,IAIXrN,EAAA1gC,UAAAguC,oBAAA,SAAoB/mC,OACZyc,EACJzc,GAAOA,EAAIumC,WAAavmC,EAAIumC,WAAWS,iBAAmB,KAC5D,OAAIvqB,GAAeA,EAAY5jB,QAAU,EAChC,CAAC4jB,EAAY,GAAIA,EAAY,IAE/B,CAAC,OAAQ,SAIlBgd,EAAA1gC,UAAAkuC,aAAA,SAAajnC,EAAoBuM,EAAW7R,GAC1C,GAAKvB,KAAKwsC,cAAc3lC,IAASuM,EAAjC,KAGM3L,EAAOZ,EAAQ,KACfF,EAAgByM,EAAK3L,GAC3B2L,EAAK3L,GAAQlG,EACbvB,KAAK4gC,WAAWj8B,KAAK,CACnB+nB,KAAMtZ,EACNvM,IAAGA,EACHY,KAAIA,EACJlG,MAAKA,EACLoF,cAAaA,IAEf3G,KAAK+P,IAAIkD,iBAOXqtB,EAAA1gC,UAAAmuC,mBAAA,SAAmBlnC,EAAoBuM,EAAWkN,GAAlD,IAAAxZ,EAAA9G,KACE,GAAK6G,GAAQA,EAAIwZ,kBAAjB,CAGIC,IACFtgB,KAAKwgB,yBAAyB3Z,EAAKuM,GACnCpT,KAAK+P,IAAIkD,oBAELtJ,EAAK9C,EAAIwZ,kBACTI,EACiC,MAArC5Z,EAAI0Z,8BACA1Z,EAAI0Z,8BACJ,EACDE,GAMDzgB,KAAKsjC,8BACPtjC,KAAKsjC,6BAA6BpkB,cAEpClf,KAAKsjC,6BAA+BtjC,KAAKoiC,wBACtC7jB,KAAKC,EAAAA,aAAaiC,IAClBhC,WAAS,SAAEC,OAAEsvB,EAAAtvB,EAAA/U,GAAQzI,EAAAwd,EAAA4B,KAASoM,EAAAhO,EAAAgO,KAAMnsB,EAAAme,EAAA7X,IAC/B3F,GACF4F,EAAKmnC,yBAAyB1tC,EAAGmsB,EAAMshB,EAAG9sC,EAAGwrB,OAGnD1sB,KAAKoiC,wBAAwB9gC,KAAK,CAAEqI,GAAEA,EAAE2W,KAAIA,EAAEoM,KAAMtZ,EAAMvM,IAAGA,KAfvDyZ,GACFtgB,KAAKiuC,yBAAyBpnC,EAAKuM,EAAMzJ,EAAG2W,EAAMlN,MAqBxDktB,EAAA1gC,UAAAsuC,eAAA,SAAernC,EAAoBuM,EAAWwI,GAA9C,IAAA9U,EAAA9G,KACE,GAAK6G,GAAQA,EAAIsZ,cAAjB,KAGMxW,EAAK9C,EAAIsZ,cACTM,EACkC,MAAtC5Z,EAAIsnC,+BACAtnC,EAAIsnC,+BACJ,EACD1tB,GAIDzgB,KAAKujC,0BACPvjC,KAAKujC,yBAAyBrkB,cAEhClf,KAAKujC,yBAA2BvjC,KAAKqiC,oBAClC9jB,KAAKC,EAAAA,aAAaiC,IAClBhC,WAAS,SAAEC,OAAEsvB,EAAAtvB,EAAA/U,GAAQykC,EAAA1vB,EAAA9C,QAAa8Q,EAAAhO,EAAAgO,KAAMnsB,EAAAme,EAAA7X,IACvCC,EAAKmnC,yBAAyB1tC,EAAGmsB,EAAMshB,EAAGI,EAAI1hB,OAElD1sB,KAAKqiC,oBAAoB/gC,KAAK,CAAEqI,GAAEA,EAAEiS,QAAOA,EAAE8Q,KAAMtZ,EAAMvM,IAAGA,KAX1D7G,KAAKiuC,yBAAyBpnC,EAAKuM,EAAMzJ,EAAGiS,EAASxI,MAejDktB,EAAA1gC,UAAA4gB,yBAAR,SAAiC3Z,EAAoBuM,GACnD,GAAKvM,GAAQA,EAAI8X,aAAjB,KAGM+B,EAAM7Z,EAAI8X,aACM,MAAlB+B,EAAIC,aACND,EAAIC,WAAa,IAEfD,EAAI+V,gBAAkBrjB,IACxBA,EAAKsN,EAAI+V,gBAAkB,MAQvB6J,EAAA1gC,UAAAquC,yBAAR,SACEpnC,EACAuM,EACA/L,GAHF,IAAAP,EAAA9G,KAKE,GAAc,MAAVqH,EAIJ,GAAI/B,MAAM8B,QAAQC,GAChBrH,KAAKquC,mBAAmBxnC,EAAKuM,EAAM/L,OADrC,CAIA,GAA2B,mBAAhBA,EAAOipB,KAOlB,MAAgC,mBAArBjpB,EAAOoX,WACZze,KAAKwjC,0BACPxjC,KAAKwjC,yBAAyBtkB,mBAEhClf,KAAKwjC,yBAA2Bn8B,EAAOoX,WAAS,SAC7CtX,GAAc,OAAAL,EAAKunC,mBAAmBxnC,EAAKuM,EAAMjM,MAAK,WACjD,OAAAL,EAAKiJ,IAAIkD,yBAInBjT,KAAK+P,IAAIkD,eAhBP5L,EAAOipB,MAAI,SACRnpB,GAAc,OAAAL,EAAKunC,mBAAmBxnC,EAAKuM,EAAMjM,MAAK,WACjD,OAAAL,EAAKiJ,IAAIkD,uBAVjBjT,KAAK+P,IAAIkD,gBA2BLqtB,EAAA1gC,UAAAyuC,mBAAR,SAA2BxnC,EAAoBuM,EAAWjM,GACxD,GAAKN,GAAQA,EAAI8X,cAAiBrZ,MAAM8B,QAAQD,GAAhD,KAIMuZ,EAAM7Z,EAAI8X,aACZ+B,EAAI+V,gBAAkBrjB,EACxBA,EAAKsN,EAAI+V,gBAAkBtvB,EAE3BuZ,EAAIC,WAAaxZ,EAEnBnH,KAAK+P,IAAIkD,oBATPjT,KAAK+P,IAAIkD,gBAabqtB,EAAA1gC,UAAA0uC,eAAA,SAAeznC,EAAoBuM,EAAW7R,GAC5C,GAAKvB,KAAKwsC,cAAc3lC,IAASuM,EAAjC,KAGM3L,EAAOZ,EAAQ,KACf6Z,EAAM7Z,EAAI8X,aACV4vB,EAAa7tB,GAAOA,EAAI7E,MAAQ6E,EAAI7E,MAAQ,KAC5ClV,EAAgByM,EAAK3L,GACrB+mC,EAAgBD,EAAan7B,EAAKm7B,QAAcpf,EAChDhoB,EAAOnH,KAAK8sC,cAAcjmC,EAAKuM,GAC/Bq7B,EACa,MAAjB9nC,GAA0B+Z,GAEtBvZ,EAAKib,MAAI,SAAEjc,GAAS,OAAAA,GAAQA,EAAKua,EAAInf,SAAWoF,MADhD,KAGAjC,EACK,MAATnD,GAAkBmf,GAEdvZ,EAAKib,MAAI,SAAEjc,GAAS,OAAAA,GAAQA,EAAKua,EAAInf,SAAWA,MADhD,KAGN6R,EAAK3L,GAAQlG,MACTsa,OAAasT,EACbof,IACF1yB,EAAQnX,EAASA,EAAOgc,EAAI7E,OAAS,KACrCzI,EAAKm7B,GAAc1yB,GAGrB7b,KAAK4gC,WAAWj8B,KAAK,CACnB+nB,KAAMtZ,EACNvM,IAAGA,EACHY,KAAIA,EACJlG,MAAKA,EACLoF,cAAaA,EACbkV,MAAKA,EACL2yB,cAAaA,EACb9pC,OAAMA,EACN+pC,eAAcA,IAEhBzuC,KAAK+P,IAAIkD,qCAtrEZ9Q,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,WACVC,SAAA,2yqBAEAosC,gBAAiBC,EAAAA,wBAAwBC,y+eA/EzClZ,EAAAA,kBAHA3f,EAAAA,yBA0BO+S,oCA2DNlkB,EAAAA,yBACAA,EAAAA,yBACAA,EAAAA,4BACAA,EAAAA,0BAIAA,EAAAA,wCACAA,EAAAA,+BAEAA,EAAAA,6BACAA,EAAAA,+BAEAA,EAAAA,2BACAA,EAAAA,mCAKAA,EAAAA,+BAKAA,EAAAA,8BAEAA,EAAAA,gCACAA,EAAAA,6BAKAA,EAAAA,yBACAC,EAAAA,4BACAA,EAAAA,iCACAA,EAAAA,2BAEAA,EAAAA,6BACAD,EAAAA,0BAEAA,EAAAA,+BAOAA,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,8BAgE3CwT,EAAAA,UAAS5T,KAAA,CAAC,UAAW,CAAEI,QAAQ,OAxHPsC,EAAAA,CAAfC,EAAAA,4EAKeD,EAAAA,CAAfC,EAAAA,wFAEeD,EAAAA,CAAfC,EAAAA,+EACeD,EAAAA,CAAfC,EAAAA,6EAeeD,EAAAA,CAAfC,EAAAA,8EAceD,EAAAA,CAAfC,EAAAA,0EAOeD,EAAAA,CAAfC,EAAAA,+EAkoEZu7B,EAxrEA,GChFA,IAAAuO,GAAA,WAkBA,SAAAA,KAsB6B,2BAtB5BnsC,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAC,EAAAA,YACAC,EAAAA,kBACAoT,EAAAA,cACA7L,EACAmzB,GACAx4B,EACAvC,EACAqsC,EAAAA,gBACAC,EAAAA,mBACAC,EAAAA,kBACAC,EAAAA,iBACAC,EAAAA,aACAC,EAAAA,cAEFpsC,aAAc,CAACu9B,GAAkB7B,IACjClD,UAAW,CAACzS,IACZ9lB,QAAS,CAACs9B,IACVlqB,QAAS,CAACC,EAAAA,sBAEiBw4B,EAxC7B,iBCGA,SAAAO,IAMWpvC,KAAAqvC,UAAoB,EAIJrvC,KAAAsvC,cAAwB,EAExBtvC,KAAA+/B,UAAoB,EACnC//B,KAAAuvC,eAAiB,IAAIlrC,EAAAA,aAwBjC,OArBE+qC,EAAAxvC,UAAA4vC,OAAA,WACExvC,KAAKyvC,aAAY,IAInBL,EAAAxvC,UAAA8vC,SAAA,WACE1vC,KAAKyvC,aAAY,IAInBL,EAAAxvC,UAAA+vC,OAAA,WACE3vC,KAAKyvC,aAAazvC,KAAK+/B,WAGjBqP,EAAAxvC,UAAA6vC,YAAR,SAAoBluC,GACdvB,KAAK+/B,WAAax+B,IAGtBvB,KAAK+/B,SAAWx+B,EAChBvB,KAAKuvC,eAAe5qC,KAAK3E,KAAK+/B,gCAnCjC59B,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,SACVC,SAAA,m6LAICsC,EAAAA,wBACAA,EAAAA,qBACAA,EAAAA,4BAEAA,EAAAA,wBAEAA,EAAAA,8BACAC,EAAAA,UAHwBC,EAAAA,CAAfC,EAAAA,4EAEeD,EAAAA,CAAfC,EAAAA,wEAyBZqqC,KCxCA,IAAAQ,GAAA,WAKA,SAAAA,KAQ2B,2BAR1BltC,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CACPC,EAAAA,aACAE,EAAAA,mBAEFE,QAAS,CAACosC,IACVrsC,aAAc,CAACqsC,QAEUQ,EAb3B,GCAAC,GAAA,WA6BE,SAAAA,IAAA,IAAA/oC,EAAA9G,KAbSA,KAAA8vC,OAAkC,GAElC9vC,KAAA+vC,YAAsB,EAEtB/vC,KAAAgwC,UAAoB,EAGnBhwC,KAAAiwC,UAAY,IAAI5rC,EAAAA,aA6E1BrE,KAAAkwC,aAAY,SAAI1nC,EAAeqX,GAC7B,OAAQA,GAASA,EAAMpY,MAASe,GAGlCxI,KAAAmwC,YAAW,SAAI3nC,EAAe4nC,GAC5B,OAAOtpC,EAAKupC,YAAYD,IAAStpC,EAAKwpC,YAAYF,IAAS5nC,GAE/D,OA5EEqnC,EAAAjwC,UAAAsC,SAAA,aAEA2tC,EAAAjwC,UAAA0wC,YAAA,SAAYF,GACV,OAAKA,GAAqB,MAAbA,EAAK3oC,KAGXE,OAAOyoC,EAAK3oC,MAFV,IAKXooC,EAAAjwC,UAAAywC,YAAA,SAAYD,GACV,OAAKA,GAAqB,MAAbA,EAAK9oC,KAGXK,OAAOyoC,EAAK9oC,MAFV,IAKXuoC,EAAAjwC,UAAA2wC,gBAAA,SAAgBH,GACd,IAAKA,EACH,MAAO,OAEHvR,EAAMuR,EAAKnsC,KACjB,GAAW,MAAP46B,GAAuB,KAARA,EACjB,MAAO,GAET,GAAmB,iBAARA,EACT,OAAOA,MAEH2R,EAAQlnC,OAAOu1B,GACrB,OAAIt1B,MAAMinC,IAAUA,EAAQ,EACnB,GAELA,EAAQ,KACHA,EAAQ,KAEbA,EAAQ,SACFA,EAAQ,MAAMnF,QAAQmF,EAAQ,MAAY,EAAI,GAAK,OAG1DA,EAAK,SAAkBnF,QAAQmF,EAAQ,SAAmB,EAAI,GAAK,OAIxEX,EAAAjwC,UAAA6wC,aAAA,SAAa5wB,OACLpY,EAAOoY,GAAuB,MAAdA,EAAMpY,KAAeE,OAAOkY,EAAMpY,MAAQ,GAChE,OAAKA,EAGAzH,KAAK+vC,WAGH,QAAQ3qB,KAAK3d,GAAQA,EAAOA,EAAO,IAFjCA,EAHA,IAQXooC,EAAAjwC,UAAA8wC,YAAA,SACE7wB,EACAuwB,EACA1nC,GAEIA,GACFA,EAAMC,qBAEFrB,EAAOtH,KAAKqwC,YAAYD,GAC9BpwC,KAAKiwC,UAAUtrC,KAAK,CAAEkb,MAAKA,EAAEuwB,KAAIA,EAAE9oC,KAAIA,IACnCtH,KAAKgwC,UAAY1oC,GACnB4H,OAAOoR,KAAKhZ,EAAM,+BAtFvBnF,EAAAA,UAASC,KAAA,CAAC,CACTC,SAAU,oBACVC,SAAA,63NAKCsC,EAAAA,0BAEAA,EAAAA,wBAEAA,EAAAA,yBAGAC,EAAAA,UAoFHgrC,EA3GA,GCAA,IAAAc,GAAA,WAKA,SAAAA,KAKoC,2BALnCjuC,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CAACC,EAAAA,aAAcE,EAAAA,mBACxBC,aAAc,CAAC8sC,IACf7sC,QAAS,CAAC6sC,QAEwBc,EAVpC,GCUAC,GAAA,WAIE,SAAAA,EAAgCC,GAAA7wC,KAAA6wC,OAAAA,EAFxB7wC,KAAA8wC,SAAU,EAGhB9wC,KAAK6tB,eAIP+iB,EAAAhxC,UAAAiuB,MAAA,WAAA,IAAA/mB,EAAA9G,KACMA,KAAK8wC,SAA+B,oBAAb1jC,WAG3BpN,KAAK8wC,SAAU,EAGf1jC,SAASwC,iBACP,aAAW,WACL,OAAA9I,EAAKiqC,wBACX,GAGE/wC,KAAK6wC,QACP7wC,KAAK6wC,OAAOG,OACTzyB,KAAKrY,EAAAA,QAAM,SAAEvE,GAAM,OAAAA,aAAasvC,EAAAA,oBAChCxyB,WAAS,WAAO,OAAA3X,EAAKiqC,0BAK5BH,EAAAhxC,UAAAmxC,mBAAA,WAC0B,oBAAb3jC,UAGMA,SAASQ,iBACxB,uCAEO5G,SAAO,SAAEs/B,OACV4K,EAAO5K,EAAG75B,QAAQ,qBACpBykC,GAAQA,EAAKC,YACfD,EAAKC,WAAW3jC,YAAY0jC,2BAxCnCttC,EAAAA,WAAUxB,KAAA,CAAC,CAAEyB,WAAY,oDATAutC,EAAAA,OAAMlxC,WAAA,CAAA,CAAA6D,KAajB8hB,EAAAA,6IAJf,GCVA,IAAAwrB,GAAA,WAiDE,SAAAA,EAAYC,IACd,2BA5BC5uC,EAAAA,SAAQN,KAAA,CAAC,CACRY,QAAS,CACPgC,EACAvC,EAEAqH,EACAmM,GACAgD,GACAiB,GAEA2O,GACAD,GACA0S,GAEAjxB,EACAmzB,GACA1B,GACA+S,GACAe,GACAe,GACAzT,GACAP,iDAtBKiU,MA6BTS,EAlDA,GCAAE,GAAA,WAaE,SAAAA,EAAYD,IACd,2BATC5uC,EAAAA,SAAQN,KAAA,CAAC,CACRO,QAAS,CAACC,EAAAA,cACVI,QAAS,CAACquC,IACV9V,UAAW,GACXqB,gBAAiB,CAACb,iDALX6U,MAUTW,EAdA,MCCA,aAUA,OAAA,WAIEvxC,KAAAwxC,cAAwC,ICZ1C,OAAA,WAGExxC,KAAAuB,MAAyD,MAO3D,OAAA,aCbA,IAAAkwC,GAAA,aCAA,ICGaC,GAAQ,CAOnBC,iBAAA,SAAiBxrB,EAAsB1e,EAAckgB,OAC7CiqB,EAAazrB,EACnB,IAAKyrB,IAAeA,EAAWlyC,OAC7B,OAAOkyC,EAGT,QADMlyC,EAASymB,EAASzmB,OACfH,EAAI,EAAGA,EAAIG,EAAQH,IACtBqyC,EAAWryC,GAAGkI,OAASA,IACzBmqC,EAAWryC,GAAGof,aAAagC,WAAagH,GAG5C,OAAOiqB,GAQTC,kBAAA,SAAkB1qC,EAAuBme,GAEvC,IAAKne,IAASA,EAAKzH,OACjB,MAFiB,GAKnB,QADMA,EAASyH,EAAKzH,OACXH,EAAI,EAAGA,EAAIG,EAAQH,IACtB+lB,EAAIne,EAAK5H,GAAGkI,QACdN,EAAK5H,GAAGgC,MAAQ+jB,EAAIne,EAAK5H,GAAGkI,OAGhC,OAAON,GAST2qC,wBAAA,SAAwB3qC,EAAkBzC,OAMlCktC,EAAa,GACnB,OAAKzqC,GAASA,EAAKzH,QAGfgF,EACEA,EAAOqtC,UAAYrtC,EAAOstC,SAC5B7qC,EAAKH,SAAO,SAAEb,OACN8rC,EAAkB9rC,EACxB8rC,EAAWp2B,MAAQ1V,EAAKzB,EAAOmX,OAC/Bo2B,EAAW1wC,MAAQ4E,EAAKzB,EAAOnD,OAC3BmD,EAAOstC,WACTC,EAAWvtC,EAAOstC,UAAY7rC,EAAKzB,EAAOnD,QAExCmD,EAAOqtC,WACTE,EAAWvtC,EAAOqtC,UAAY5rC,EAAKzB,EAAOmX,QAE5C+1B,EAAW/vC,KAAKowC,MAGlB9qC,EAAKH,SAAO,SAAEb,OACN8rC,EAAkB9rC,EACxB8rC,EAAWp2B,MAAQ1V,EAAKzB,EAAOmX,OAC/Bo2B,EAAW1wC,MAAQ4E,EAAKzB,EAAOnD,OAC/BqwC,EAAW/vC,KAAKowC,MAIpB9qC,EAAKH,SAAO,SAAEb,OACN8rC,EAAkB,GACxBA,EAAWp2B,MAAQ1V,EACnB8rC,EAAW1wC,MAAQ4E,EACnByrC,EAAW/vC,KAAKowC,MAGbL,GAhCEA,GAwCXpuC,IAAA,SAAI0uC,EAAgBpmC,WAClB,QADkB,IAAAA,IAAAA,EAAA,IACbxG,MAAM8B,QAAQ8qC,GACjB,MAAM,IAAIC,MAAM,WAElB,GAAID,EAAKz8B,MAAI,SAACk1B,GAAO,MAAe,iBAARA,KAC1B,MAAM,IAAIwH,MAAM,iBAEd9qC,EAAS,MACb,IAAkB,IAAA+qC,EAAAt+B,EAAAo+B,GAAIG,EAAAD,EAAA9wC,QAAA+wC,EAAA7wC,KAAA6wC,EAAAD,EAAA9wC,OAAE,CACtB+F,GADYgrC,EAAA9wC,wGAGd,OAAOgT,EAAAA,MAAMlN,EAAQyE,IAQvBwmC,SAAA,SAASJ,EAAgBpmC,WACvB,QADuB,IAAAA,IAAAA,EAAA,IAClBxG,MAAM8B,QAAQ8qC,GACjB,MAAM,IAAIC,MAAM,WAElB,GAAID,EAAKz8B,MAAI,SAACk1B,GAAO,MAAe,iBAARA,KAC1B,MAAM,IAAIwH,MAAM,aAElB,GAAID,EAAKxyC,OAAS,EAChB,MAAM,IAAIyyC,MAAM,oBAEd9qC,EAAS6qC,EAAKK,YAClB,IAAkB,IAAAC,EAAA1+B,EAAAo+B,GAAIO,EAAAD,EAAAlxC,QAAAmxC,EAAAjxC,KAAAixC,EAAAD,EAAAlxC,OAAE,CACtB+F,GADYorC,EAAAlxC,wGAGd,OAAOgT,EAAAA,MAAMlN,EAAQyE,IAQvB4mC,SAAA,SAASR,EAAgBpmC,WACvB,QADuB,IAAAA,IAAAA,EAAA,IAClBxG,MAAM8B,QAAQ8qC,GACjB,MAAM,IAAIC,MAAM,WAElB,GAAID,EAAKz8B,MAAI,SAACk1B,GAAO,MAAe,iBAARA,KAC1B,MAAM,IAAIwH,MAAM,iBAEd9qC,EAAS,MACb,IAAkB,IAAAsrC,EAAA7+B,EAAAo+B,GAAIU,EAAAD,EAAArxC,QAAAsxC,EAAApxC,KAAAoxC,EAAAD,EAAArxC,OAAE,CACtB+F,GADYurC,EAAArxC,wGAGd,OAAOgT,EAAAA,MAAMlN,EAAQyE,IAQvB+mC,OAAA,SAAOX,EAAgBpmC,WACrB,QADqB,IAAAA,IAAAA,EAAA,IAChBxG,MAAM8B,QAAQ8qC,GACjB,MAAM,IAAIC,MAAM,WAElB,GAAID,EAAKz8B,MAAI,SAACk1B,GAAO,MAAe,iBAARA,KAC1B,MAAM,IAAIwH,MAAM,aAElB,GAAID,EAAKxyC,OAAS,EAChB,MAAM,IAAIyyC,MAAM,oBAEd9qC,EAAS6qC,EAAKK,YAClB,IAAkB,IAAAO,EAAAh/B,EAAAo+B,GAAIa,EAAAD,EAAAxxC,QAAAyxC,EAAAvxC,KAAAuxC,EAAAD,EAAAxxC,OAAE,CAAnB,IAAMqpC,EAAGoI,EAAAxxC,MACZ,GAAY,IAARopC,EACF,MAAM,IAAIwH,MAAM,WAElB9qC,GAAkBsjC,oGAEpB,OAAOp2B,EAAAA,MAAMlN,EAAQyE,wSnC5Ka,oDCWO,imBiCblB,CACvBknC,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 { Injectable } from \"@angular/core\";\n\n/** hd-detail-form 字段展示类型 */\nexport enum HdDetailFormFieldType {\n /** 普通文本(默认) */\n Text = \"text\",\n /** 附件图片(描述项内横排缩略图) */\n Accessory = \"accessory\",\n}\n\n/** 附件图片项(path 为图片地址) */\nexport interface HdDetailFormImage {\n name?: string;\n path?: string;\n url?: string;\n}\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class HdDetailFormService {\n constructor() {}\n}\n","import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n SimpleChange,\n} from \"@angular/core\";\nimport { HdOption } from \"../model/common-type\";\nimport {\n HdDetailFormFieldType,\n HdDetailFormImage,\n} from \"./hd-detail-form.service\";\n\n/** 附件缩略图最多直接展示张数,超出末张蒙版 +n */\nconst MAX_VISIBLE_IMAGES = 4;\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 /** 一行列数,默认固定 4 列(不再按屏幕宽度自适应) */\n @Input() nzColumn:\n | number\n | {\n xxl?: number;\n xl?: number;\n lg?: number;\n md?: number;\n sm?: number;\n xs?: number;\n } = 4;\n\n /** 附件图片点击回调 */\n @Output() imageClick = new EventEmitter<{\n image: HdDetailFormImage;\n path: string;\n index: number;\n }>();\n\n HdDetailFormFieldType = HdDetailFormFieldType;\n\n /** 大图预览 */\n previewVisible = false;\n previewImagePath = \"\";\n previewTitle = \"图片预览\";\n /** 当前预览所属字段的图片列表(用于翻页) */\n previewImages: Array<HdDetailFormImage> = [];\n previewIndex = 0;\n\n /** 附件字段图片缓存(避免模板里反复 getImageList 导致 *ngFor 重建、点击丢失) */\n private imageListCache = new Map<HdOption, Array<HdDetailFormImage>>();\n private displayListCache = new Map<HdOption, Array<HdDetailFormImage>>();\n\n constructor() {}\n\n get canPreviewPrev(): boolean {\n return this.previewIndex > 0;\n }\n\n get canPreviewNext(): boolean {\n return this.previewIndex < this.previewImages.length - 1;\n }\n\n ngOnInit() {\n if (this.formCols && this.formCols.length > 0) {\n this.formCols = this.formCols.filter((item) => !item.hide);\n }\n this.refreshImageCache();\n }\n\n ngOnChanges(changes: SimpleChange) {\n if (\n changes[\"formCols\"] &&\n JSON.stringify(changes[\"formCols\"].currentValue) !==\n JSON.stringify(changes[\"formCols\"].previousValue)\n ) {\n if (this.formCols && this.formCols.length > 0) {\n this.formCols = this.formCols.filter((item) => !item.hide);\n }\n this.refreshImageCache();\n }\n }\n\n isAccessory(col: HdOption): boolean {\n return !!(\n col &&\n (col.type === HdDetailFormFieldType.Accessory || col.type === \"accessory\")\n );\n }\n\n private refreshImageCache(): void {\n this.imageListCache.clear();\n this.displayListCache.clear();\n (this.formCols || []).forEach((col) => {\n if (this.isAccessory(col)) {\n this.imageListCache.set(col, this.parseImageList(col));\n }\n });\n }\n\n /**\n * 解析附件图片列表。value 支持:\n * - string / string[](图片地址)\n * - { name?, path? / url? }[]\n */\n private parseImageList(col: HdOption): Array<HdDetailFormImage> {\n const value = col && col.value;\n if (value == null || value === \"\") {\n return [];\n }\n const list = Array.isArray(value) ? value : [value];\n const result: Array<HdDetailFormImage> = [];\n list.forEach((item) => {\n if (item == null || item === \"\") {\n return;\n }\n if (typeof item === \"string\") {\n result.push({ path: item });\n return;\n }\n const path = item.path || item.url || item.address || \"\";\n if (!path) {\n return;\n }\n result.push({\n name: item.name || item.fileName,\n path: String(path),\n });\n });\n return result;\n }\n\n getImageList(col: HdOption): Array<HdDetailFormImage> {\n if (!this.imageListCache.has(col)) {\n this.imageListCache.set(col, this.parseImageList(col));\n }\n return this.imageListCache.get(col) || [];\n }\n\n hasImages(col: HdOption): boolean {\n return this.getImageList(col).length > 0;\n }\n\n /** 实际渲染的缩略图(最多 4 张) */\n getDisplayImages(col: HdOption): Array<HdDetailFormImage> {\n if (this.displayListCache.has(col)) {\n return this.displayListCache.get(col);\n }\n const display = this.getImageList(col).slice(0, MAX_VISIBLE_IMAGES);\n this.displayListCache.set(col, display);\n return display;\n }\n\n /** 未展示张数(末张蒙版 +n) */\n getMoreCount(col: HdOption): number {\n const total = this.getImageList(col).length;\n return total > MAX_VISIBLE_IMAGES ? total - MAX_VISIBLE_IMAGES : 0;\n }\n\n getImagePath(image: HdDetailFormImage): string {\n return (image && (image.path || image.url)) || \"\";\n }\n\n trackByImage(index: number, image: HdDetailFormImage): string {\n return (image && (image.path || image.url)) || String(index);\n }\n\n onImageClick(\n col: HdOption,\n image: HdDetailFormImage,\n index: number,\n event?: Event\n ): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n const path = this.getImagePath(image);\n this.imageClick.emit({ image, path, index });\n if (!path) {\n return;\n }\n this.previewImages = this.getImageList(col).slice();\n this.previewIndex = index >= 0 ? index : 0;\n this.applyPreviewImage();\n setTimeout(() => {\n this.previewVisible = true;\n });\n }\n\n previewPrev(event?: Event): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (!this.canPreviewPrev) {\n return;\n }\n this.previewIndex -= 1;\n this.applyPreviewImage();\n }\n\n previewNext(event?: Event): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (!this.canPreviewNext) {\n return;\n }\n this.previewIndex += 1;\n this.applyPreviewImage();\n }\n\n private applyPreviewImage(): void {\n const image = this.previewImages[this.previewIndex];\n const path = this.getImagePath(image);\n this.previewImagePath = path;\n this.previewTitle =\n (image && image.name) || \"图片\" + (this.previewIndex + 1);\n }\n\n closePreview(): void {\n this.previewVisible = false;\n this.previewImages = [];\n this.previewIndex = 0;\n this.previewImagePath = \"\";\n }\n\n /** HdOption.width:默认 1,最大 4 */\n getColSpan(col: HdOption): number {\n const width = col && col.width != null ? Number(col.width) : 1;\n if (!width || width < 1 || isNaN(width)) {\n return 1;\n }\n return width > 4 ? 4 : Math.floor(width);\n }\n\n triggerEvent(fn: any) {\n if (fn) {\n fn(event);\n }\n }\n\n /** 点击编辑笔,回调父组件传入的 edit */\n onEditClick(event: Event, col: HdOption): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (col && col.edit) {\n col.edit(col);\n }\n }\n}\n","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgZorroAntdModule } from \"ng-zorro-antd\";\nimport { HdDetailFormComponent } from \"./hd-detail-form.component\";\n\n@NgModule({\n imports: [CommonModule, NgZorroAntdModule],\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 /** 占据列数,默认 1,最大 4(一行共 4 列);历史未传按 1 */\n width?: number;\n /**\n * 字段类型,默认文本。\n * `accessory`:附件图片,value 为图片地址 string / string[] 或 { name?, path?/url? }[]\n */\n type?: string;\n clickText?: string;\n click?: (value: any) => void;\n clickText1?: string;\n click1?: (value: any) => void;\n /**\n * 值后显示编辑笔图标(Figma edit/edit,14px)。\n */\n editable?: boolean;\n /** 点击编辑笔回调,供父组件处理(如弹窗改值) */\n edit?: (col?: HdOption) => 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 interface CascaderShowSearchOptions {\n filter?: (inputValue: string, path: any[]) => boolean;\n sorter?: (a: any[], b: any[], inputValue: string) => number;\n}\n\nexport class CascaderOption {\n options: Array<any>;\n /** 是否开启搜索,默认 true;传 false 关闭;传对象可自定义 filter/sorter */\n showSearch?: boolean | CascaderShowSearchOptions;\n /** 选项中拼音字段名,默认 pinyin */\n pinyinField?: string;\n /** 下拉菜单额外 class,默认 hd-cascader-menus */\n menuClassName?: string;\n /** 下拉菜单样式(对应 nzMenuStyle) */\n menuStyle?: { [key: string]: string };\n /**\n * 搜索结果下拉最小宽度(可选)。\n * number 按 px;string 可传 '360px' 等;不传则按文案自适应,不强制宽度\n */\n dropdownMinWidth?: number | string;\n}\n","import { NzTableComponent } from \"ng-zorro-antd/table\";\n\nexport interface HdTableScrollConfig {\n x?: string;\n y?: string;\n}\n\nconst DEFAULT_FLUID_COL_WIDTH = 150;\n\nexport function getTableViewportWidth(\n nzTable: NzTableComponent,\n hostClass = \"hd-table-container\",\n): number {\n if (!nzTable || !nzTable.tableMainElement) {\n return 0;\n }\n const tableMain = nzTable.tableMainElement.nativeElement as HTMLElement;\n const scrollBody = tableMain.querySelector(\n \".ant-table-body\",\n ) as HTMLElement;\n if (scrollBody && scrollBody.clientWidth > 0) {\n return scrollBody.clientWidth;\n }\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(`.${hostClass}`) as HTMLElement;\n if (host && host.clientWidth > 0) {\n return host.clientWidth;\n }\n return 0;\n}\n\nfunction parsePx(value: string): number {\n if (!value) {\n return 0;\n }\n const parsed = parseInt(String(value).replace(/px/i, \"\"), 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\n/** 克隆表头/表体测量未被 scroll 压缩前的自然列宽 */\nfunction measureElementNaturalWidth(element: HTMLElement): number {\n const clone = element.cloneNode(true) as HTMLElement;\n clone.style.position = \"absolute\";\n clone.style.left = \"-99999px\";\n clone.style.top = \"0\";\n clone.style.visibility = \"hidden\";\n clone.style.width = \"max-content\";\n clone.style.tableLayout = \"auto\";\n document.body.appendChild(clone);\n const width = clone.scrollWidth;\n document.body.removeChild(clone);\n return width;\n}\n\n/** 汇总表头 th 上声明的列宽(style.width / nzWidth) */\nfunction measureHeaderDeclaredColWidth(tableMain: HTMLElement): number {\n const ths = Array.from(\n tableMain.querySelectorAll(\".ant-table-thead > tr > th\"),\n ) as HTMLElement[];\n if (!ths.length) {\n return 0;\n }\n let sum = 0;\n let hasFluidCol = false;\n ths.forEach((th) => {\n const declared = parsePx(th.style.width);\n if (declared > 0) {\n sum += declared;\n return;\n }\n hasFluidCol = true;\n sum += th.scrollWidth || th.offsetWidth || DEFAULT_FLUID_COL_WIDTH;\n });\n return hasFluidCol ? 0 : sum;\n}\n\nexport function measureTableColWidth(nzTable: NzTableComponent): number {\n if (!nzTable || !nzTable.tableMainElement) {\n return 0;\n }\n const tableMain = nzTable.tableMainElement.nativeElement as HTMLElement;\n const tables = Array.from(\n tableMain.querySelectorAll(\n \".ant-table-header table, .ant-table-body table, .cdk-virtual-scroll-content-wrapper table\",\n ),\n ) as HTMLElement[];\n\n let max = tables.reduce(\n (width, table) => Math.max(width, table.scrollWidth || 0),\n 0,\n );\n\n const viewportWidth = getTableViewportWidth(nzTable);\n // 未开启 scroll.x 时表格会被压进容器,scrollWidth 不可靠,需测自然列宽\n if (viewportWidth <= 0 || max <= viewportWidth) {\n const headerTable = tableMain.querySelector(\n \".ant-table-header table\",\n ) as HTMLElement;\n const bodyTable = tableMain.querySelector(\n \".ant-table-body table\",\n ) as HTMLElement;\n if (headerTable) {\n max = Math.max(max, measureElementNaturalWidth(headerTable));\n }\n if (bodyTable) {\n max = Math.max(max, measureElementNaturalWidth(bodyTable));\n }\n max = Math.max(max, measureHeaderDeclaredColWidth(tableMain));\n }\n\n return max;\n}\n\n/**\n * 用于判断是否需要 scroll.x 的视口宽。\n * 有纵向滚动条时 clientWidth 会少一截,若直接拿去比列宽,会「竖滚条导致误开横滚」;\n * 这里用 offsetWidth(含滚动条槽)作为屏幕可展示宽度。\n */\nexport function getTableScrollXViewportWidth(\n nzTable: NzTableComponent,\n hostClass = \"hd-table-container\",\n): number {\n if (!nzTable || !nzTable.tableMainElement) {\n return 0;\n }\n const tableMain = nzTable.tableMainElement.nativeElement as HTMLElement;\n const scrollBody =\n (tableMain.querySelector(\n \"cdk-virtual-scroll-viewport.ant-table-body\",\n ) as HTMLElement) ||\n (tableMain.querySelector(\".ant-table-body\") as HTMLElement);\n if (scrollBody && scrollBody.offsetWidth > 0) {\n return scrollBody.offsetWidth;\n }\n return getTableViewportWidth(nzTable, hostClass);\n}\n\n/**\n * 无数据或列宽未超出容器时不启用横向 scroll(表宽 100%、table-layout: auto)。\n * auto 布局下单元格 max-width 不生效,固定宽列会被均摊撑开;需要锁宽的场景见 hd-table 的横向布局。\n */\nexport function resolveAutoTableScroll(\n nzTable: NzTableComponent,\n hasData: boolean,\n colWidth?: number,\n): HdTableScrollConfig | null {\n if (!hasData) {\n return null;\n }\n const width =\n colWidth != null && colWidth > 0\n ? colWidth\n : measureTableColWidth(nzTable);\n if (width <= 0) {\n return null;\n }\n const viewportWidth = getTableScrollXViewportWidth(nzTable);\n if (viewportWidth > 0) {\n // 允许 1px 误差,避免亚像素导致误开横滚\n return width > viewportWidth + 1 ? { x: `${Math.ceil(width)}px` } : null;\n }\n if (typeof window !== \"undefined\" && width > window.innerWidth - 32) {\n return { x: `${Math.ceil(width)}px` };\n }\n return null;\n}\n\n/** 取 ng-zorro 分体表头 / 表体滚动容器(含虚拟滚动) */\nexport function getNzTableScrollElements(\n nzTable: NzTableComponent,\n): { header: HTMLElement | null; body: HTMLElement | null } {\n if (!nzTable) {\n return { header: null, body: null };\n }\n const nz = nzTable as any;\n let header = (nz.tableHeaderNativeElement as HTMLElement) || null;\n let body =\n (nz.mixTableBodyNativeElement as HTMLElement) ||\n (nz.tableBodyNativeElement as HTMLElement) ||\n null;\n const main =\n nz.tableMainElement &&\n (nz.tableMainElement.nativeElement as HTMLElement);\n if (main) {\n if (!header) {\n header = main.querySelector(\".ant-table-header\") as HTMLElement;\n }\n if (!body) {\n body =\n (main.querySelector(\n \"cdk-virtual-scroll-viewport.ant-table-body\",\n ) as HTMLElement) ||\n (main.querySelector(\".ant-table-body\") as HTMLElement);\n }\n }\n return { header, body };\n}\n\n/** 一次性把表体 scrollLeft 同步到表头 */\nexport function syncNzTableHeaderBodyScrollLeft(\n nzTable: NzTableComponent,\n): void {\n const els = getNzTableScrollElements(nzTable);\n if (!els.header || !els.body) {\n return;\n }\n if (els.header.scrollLeft !== els.body.scrollLeft) {\n els.header.scrollLeft = els.body.scrollLeft;\n }\n}\n\n/**\n * 监听表体横向滚动并同步表头。\n * 返回 unbind;DOM 未就绪时返回 null(调用方可重试)。\n */\nexport function bindNzTableHeaderBodyScrollSync(\n nzTable: NzTableComponent,\n): (() => void) | null {\n const els = getNzTableScrollElements(nzTable);\n if (!els.header || !els.body) {\n return null;\n }\n const header = els.header;\n const body = els.body;\n const onScroll = () => {\n if (header.scrollLeft !== body.scrollLeft) {\n header.scrollLeft = body.scrollLeft;\n }\n };\n body.addEventListener(\"scroll\", onScroll);\n onScroll();\n return () => {\n body.removeEventListener(\"scroll\", onScroll);\n };\n}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { NzTableComponent } from \"ng-zorro-antd/table\";\nimport { Page } from \"../model/common-type\";\nimport { measureTableColWidth, resolveAutoTableScroll, bindNzTableHeaderBodyScrollSync } from \"../utils/hd-table-scroll.util\";\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\n implements OnInit, OnChanges, AfterViewInit, OnDestroy {\n @ViewChild(\"hdTable\", { static: false }) nzTableComponent: NzTableComponent;\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 /**\n * 横向滚动。历史默认 `{ x: '1px' }`(2.1.28 前一直如此):开启横滚但不锁死列宽,\n * 业务页可不写 th/td width,由内容自适应。传 null 则按容器自动测算。\n */\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n tableScroll: { x?: string; y?: string } = null;\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n /**\n * 行勾选禁用字段名。定义后取当前行该字段:\n * 为 true 时禁用该行勾选(全选也会跳过)。\n */\n @Input() selectDisabledField: string;\n /**\n * 行失效字段名。定义后取当前行该字段:\n * 为 true 时整行背景色为 #F7F8FA、文字 #868A9C。\n */\n @Input() rowInvalidField: 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 /** 控制 nz-table 重建:scroll.y 从无到有时必须重建,否则表头不跟横滚 */\n showTable = true;\n private unbindBodyScroll: (() => void) | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n get effectiveScroll(): { x?: string; y?: string } {\n // 不自动补 nzScroll.y:有 y 会拆表头/表体,无列宽时列错位。\n // 仅有 x 时的纵滚由 less(max-height + overflow-y)承担,表头 sticky。\n // 仅当父组件显式传了 scroll.y 时才走 nz-table 分体纵滚。\n return this.scroll != null ? this.scroll : this.tableScroll;\n }\n\n ngOnInit(): void {\n this.syncStoreFromLinesInput();\n this.applyDisplayFromStore();\n this.countSelected();\n this.calculateTotal();\n }\n\n ngAfterViewInit(): void {\n this.scheduleSyncHorizontalScroll();\n }\n\n ngOnDestroy(): void {\n this.unbindHeaderBodyScrollSync();\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 if (changes[\"lines\"] || changes[\"showSelected\"]) {\n this.scheduleSyncHorizontalScroll();\n }\n }\n\n private scheduleSyncHorizontalScroll(retry = 0): void {\n const delay = retry === 0 ? 0 : 50;\n setTimeout(() => {\n if (this.scroll == null) {\n this.syncHorizontalScroll();\n }\n this.bindHeaderBodyScrollSync(0);\n const afterX =\n (this.effectiveScroll && this.effectiveScroll.x) ||\n (this.tableScroll && this.tableScroll.x);\n if (\n this.scroll == null &&\n retry < 5 &&\n this.displayLines &&\n this.displayLines.length > 0 &&\n !afterX &&\n measureTableColWidth(this.nzTableComponent) === 0\n ) {\n this.scheduleSyncHorizontalScroll(retry + 1);\n }\n }, delay);\n }\n\n private syncHorizontalScroll(): void {\n if (this.scroll != null) {\n return;\n }\n const hasData = !!(this.displayLines && this.displayLines.length);\n const nextScroll = resolveAutoTableScroll(\n this.nzTableComponent,\n hasData,\n );\n const nextX = nextScroll ? nextScroll.x : null;\n // 自动测算只设 x,不设 y(与 2.1.64 前一致,避免无列宽时表头/表体错位)\n if (this.tableScroll && this.tableScroll.x === nextX && !this.tableScroll.y) {\n return;\n }\n const prevHasY = !!(this.tableScroll && this.tableScroll.y);\n this.tableScroll = nextX ? { x: nextX } : null;\n if (prevHasY) {\n this.remountTable();\n return;\n }\n this.cdr.markForCheck();\n this.bindHeaderBodyScrollSync(0);\n }\n\n /** 重建 nz-table,让 header/body 滚动同步在 AfterViewInit 重新绑定 */\n private remountTable(): void {\n this.unbindHeaderBodyScrollSync();\n setTimeout(() => {\n this.showTable = false;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.showTable = true;\n this.cdr.markForCheck();\n setTimeout(() => this.bindHeaderBodyScrollSync(0));\n });\n });\n }\n\n /** 表体横滚时同步表头(兜底 ng-zorro 监听丢失);DOM 未就绪时重试 */\n private bindHeaderBodyScrollSync(retry = 0): void {\n this.unbindHeaderBodyScrollSync();\n if (!this.nzTableComponent || !(this.effectiveScroll && this.effectiveScroll.x)) {\n return;\n }\n const unbind = bindNzTableHeaderBodyScrollSync(this.nzTableComponent);\n if (unbind) {\n this.unbindBodyScroll = unbind;\n return;\n }\n if (retry < 8) {\n setTimeout(() => this.bindHeaderBodyScrollSync(retry + 1), 50);\n }\n }\n\n private unbindHeaderBodyScrollSync(): void {\n if (this.unbindBodyScroll) {\n this.unbindBodyScroll();\n this.unbindBodyScroll = null;\n }\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 this.scheduleSyncHorizontalScroll();\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 this.scheduleSyncHorizontalScroll();\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 && !this.isSelectDisabled(item)) {\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 preserveNumber: item.preserveNumber != null ? item.preserveNumber : 2,\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 this.scheduleSyncHorizontalScroll();\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 (data) {\n if (event && this.isSelectDisabled(data)) {\n return;\n }\n this.mapOfCheckedId[data[this.selectField]] = event;\n if (event) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n }\n const selectableList = this.listOfDisplayData.filter(\n (item) => !this.isSelectDisabled(item),\n );\n this.isAllDisplayDataChecked =\n selectableList.length > 0 &&\n selectableList.every((item) => this.mapOfCheckedId[item[this.selectField]]);\n this.isIndeterminate =\n selectableList.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 (this.isSelectDisabled(item)) {\n return;\n }\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 /** 当前行是否禁用勾选 */\n isSelectDisabled(data: any): boolean {\n return !!(\n this.selectDisabledField &&\n data &&\n data[this.selectDisabledField] === true\n );\n }\n\n /** 当前行是否失效 */\n isInvalidRow(data: any): boolean {\n return !!(\n this.rowInvalidField &&\n data &&\n data[this.rowInvalidField] === true\n );\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 AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { NzTableComponent } from \"ng-zorro-antd/table\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\nimport {\n measureTableColWidth,\n resolveAutoTableScroll,\n bindNzTableHeaderBodyScrollSync,\n} from \"../utils/hd-table-scroll.util\";\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\n implements OnInit, OnChanges, AfterViewInit, OnDestroy\n{\n @ViewChild(\"hdTable\", { static: false }) nzTableComponent: NzTableComponent;\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 /** 与 hd-table 一致:行数多时自动虚拟滚动;拖拽排序开启时强制关闭 */\n @Input() @InputBoolean() virtualScroll: boolean = true;\n /** 手动指定行高;不传则用默认/测量值 */\n @Input() virtualItemSize: number;\n /**\n * 横向滚动。历史默认 `{ x: '1px' }`(2.1.28 前一直如此):开启横滚但不锁死列宽,\n * 业务页可不写 th/td width。传 null 则按容器自动测算。\n */\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n tableScroll: { x?: string; y?: string } = null;\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n /**\n * 行勾选禁用字段名。定义后取当前行该字段:\n * 为 true 时禁用该行勾选(全选也会跳过)。\n */\n @Input() selectDisabledField: string;\n /**\n * 行失效字段名。定义后取当前行该字段:\n * 为 true 时整行背景色为 #F7F8FA、文字 #868A9C。\n */\n @Input() rowInvalidField: 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 showTable = true;\n /** 自动测量前的兜底行高 */\n measuredVirtualItemSize = 47;\n private virtualScrollActive: boolean | null = null;\n private unbindBodyScroll: (() => void) | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n get effectiveScroll(): { x?: string; y?: string } {\n return this.scroll != null ? this.scroll : this.tableScroll;\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 /** 当前页内容高度是否超出视口 / 已指定 scroll.y */\n get needsVerticalScroll(): boolean {\n const rowCount = this.displayLines ? this.displayLines.length : 0;\n if (rowCount <= 0) {\n return false;\n }\n const base = this.effectiveScroll;\n if (base && base.y) {\n // 父级已定高(如弹窗),行稍多就开虚拟,避免千行 DOM\n return rowCount > 20;\n }\n const maxOffset = 200;\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 get useVirtualScroll(): boolean {\n if (!this.virtualScroll || this.allowDrop) {\n return false;\n }\n return this.needsVerticalScroll;\n }\n\n /** 虚拟滚动必须有 y;业务自适应列宽场景不自动给仅有 x 的表补 y */\n get resolvedScroll(): { x?: string; y?: string } {\n const base = this.effectiveScroll ? { ...this.effectiveScroll } : {};\n if (this.useVirtualScroll && !base.y) {\n base.y = this.getAutoScrollY();\n }\n return base;\n }\n\n /** 虚拟滚动按数组下标追踪,避免业务主键 trackBy 导致 CDK 行复用错位 */\n virtualTrackByRow = (index: number): number => index;\n\n ngOnInit(): void {\n if (this.isCrossPageSelect === true) {\n this.isCrossPageSelectLocal = this.isCrossPageSelect;\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n ngAfterViewInit(): void {\n this.scheduleSyncHorizontalScroll();\n this.applyTableScrollMode(true);\n }\n\n ngOnDestroy(): void {\n this.unbindHeaderBodyScrollSync();\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 this.applyTableScrollMode(false);\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n this.countSelected();\n this.calculateTotal();\n if (\n changes[\"lines\"] ||\n changes[\"tableData\"] ||\n changes[\"showSelected\"] ||\n changes[\"scroll\"] ||\n changes[\"virtualScroll\"] ||\n changes[\"allowDrop\"]\n ) {\n this.scheduleSyncHorizontalScroll();\n this.applyTableScrollMode(false);\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.unbindHeaderBodyScrollSync();\n // 延后销毁/重建,避免当前 CD 周期内 ngIf 变更触发 ExpressionChanged\n setTimeout(() => {\n this.showTable = false;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.showTable = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.afterTableRender(useVirtual);\n });\n });\n });\n return;\n }\n\n this.cdr.markForCheck();\n this.afterTableRender(useVirtual);\n }\n\n private afterTableRender(useVirtual: boolean): void {\n this.scheduleSyncHorizontalScroll();\n this.bindHeaderBodyScrollSync(0);\n if (useVirtual) {\n this.refreshVirtualScrollViewport(true);\n }\n }\n\n refreshVirtualScrollViewport(forceMeasure = false): void {\n if (!this.useVirtualScroll) {\n this.bindHeaderBodyScrollSync(0);\n return;\n }\n setTimeout(() => {\n this.measureVirtualItemSize(forceMeasure);\n const viewport =\n this.nzTableComponent && this.nzTableComponent.cdkVirtualScrollViewport;\n if (viewport) {\n viewport.checkViewportSize();\n }\n this.bindHeaderBodyScrollSync(0);\n this.cdr.markForCheck();\n });\n }\n\n private measureVirtualItemSize(force = false): void {\n if (this.virtualItemSize != null && this.virtualItemSize > 0 && !force) {\n return;\n }\n const viewport =\n this.nzTableComponent && this.nzTableComponent.cdkVirtualScrollViewport;\n if (!viewport || !viewport.elementRef || !viewport.elementRef.nativeElement) {\n return;\n }\n const row = viewport.elementRef.nativeElement.querySelector(\n \"tr.hd-detail-lines-page-virtual-row\",\n ) as HTMLElement;\n if (row && row.offsetHeight > 0) {\n this.measuredVirtualItemSize = row.offsetHeight;\n }\n }\n\n private scheduleSyncHorizontalScroll(retry = 0): void {\n const delay = retry === 0 ? 0 : 50;\n setTimeout(() => {\n if (this.scroll == null) {\n this.syncHorizontalScroll();\n }\n this.bindHeaderBodyScrollSync(0);\n const afterX =\n (this.resolvedScroll && this.resolvedScroll.x) ||\n (this.tableScroll && this.tableScroll.x);\n if (\n this.scroll == null &&\n retry < 5 &&\n this.displayLines &&\n this.displayLines.length > 0 &&\n !afterX &&\n measureTableColWidth(this.nzTableComponent) === 0\n ) {\n this.scheduleSyncHorizontalScroll(retry + 1);\n }\n }, delay);\n }\n\n private getAutoScrollY(): string {\n return \"calc(100vh - 280px)\";\n }\n\n private syncHorizontalScroll(): void {\n if (this.scroll != null) {\n return;\n }\n const hasData = !!(this.displayLines && this.displayLines.length);\n const nextScroll = resolveAutoTableScroll(\n this.nzTableComponent,\n hasData,\n );\n const nextX = nextScroll ? nextScroll.x : null;\n // 自动测算只设 x;虚拟滚动才需要 y\n const nextY = this.useVirtualScroll ? this.getAutoScrollY() : null;\n const prevHasY = !!(this.tableScroll && this.tableScroll.y);\n const nextHasY = !!nextY;\n if (\n this.tableScroll &&\n this.tableScroll.x === nextX &&\n this.tableScroll.y === nextY\n ) {\n return;\n }\n this.tableScroll =\n nextX || nextY\n ? nextY\n ? { x: nextX, y: nextY }\n : { x: nextX }\n : null;\n if (prevHasY !== nextHasY) {\n this.applyTableScrollMode(true);\n return;\n }\n this.cdr.markForCheck();\n this.bindHeaderBodyScrollSync(0);\n }\n\n /** 表体横滚时同步表头;DOM 未就绪时重试 */\n private bindHeaderBodyScrollSync(retry = 0): void {\n this.unbindHeaderBodyScrollSync();\n if (!this.nzTableComponent || !(this.resolvedScroll && this.resolvedScroll.x)) {\n return;\n }\n const unbind = bindNzTableHeaderBodyScrollSync(this.nzTableComponent);\n if (unbind) {\n this.unbindBodyScroll = unbind;\n return;\n }\n if (retry < 8) {\n setTimeout(() => this.bindHeaderBodyScrollSync(retry + 1), 50);\n }\n }\n\n private unbindHeaderBodyScrollSync(): void {\n if (this.unbindBodyScroll) {\n this.unbindBodyScroll();\n this.unbindBodyScroll = null;\n }\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 this.scheduleSyncHorizontalScroll();\n this.applyTableScrollMode(false);\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 this.scheduleSyncHorizontalScroll();\n this.applyTableScrollMode(true);\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 && !this.isSelectDisabled(item)) {\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 preserveNumber: item.preserveNumber != null ? item.preserveNumber : 2,\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 this.scheduleSyncHorizontalScroll();\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 (data) {\n if (event && this.isSelectDisabled(data)) {\n return;\n }\n this.mapOfCheckedId[data[this.selectField]] = event;\n if (event) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n }\n const sourceList =\n this.listOfDisplayData && this.listOfDisplayData.length\n ? this.listOfDisplayData\n : this.displayLines;\n const selectableList = (sourceList || []).filter(\n (item) => !this.isSelectDisabled(item),\n );\n this.isAllDisplayDataChecked =\n selectableList.length > 0 &&\n selectableList.every((item) => this.mapOfCheckedId[item[this.selectField]]);\n this.isIndeterminate =\n selectableList.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 const sourceList =\n this.listOfDisplayData && this.listOfDisplayData.length\n ? this.listOfDisplayData\n : this.displayLines;\n (sourceList || []).forEach((item) => {\n if (this.isSelectDisabled(item)) {\n return;\n }\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 /** 当前行是否禁用勾选 */\n isSelectDisabled(data: any): boolean {\n return !!(\n this.selectDisabledField &&\n data &&\n data[this.selectDisabledField] === true\n );\n }\n\n /** 当前行是否失效 */\n isInvalidRow(data: any): boolean {\n return !!(\n this.rowInvalidField &&\n data &&\n data[this.rowInvalidField] === true\n );\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 // 橙色:部分完成 / 打印后修改 / 临期预警\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 { 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 onOpenChangeEvent?: Function; // select下拉展开/收起;展开时组件先清空 selectList 再回调,可用于按需请求\n onBlurEvent?: Function; // 控件失去焦点事件\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n showTime?: boolean = false; // 日期选择器是否包含时间\n require?: boolean = false; // 是否必填\n /**\n * 是否允许清空当前筛选项(Input 清空按钮、Select/Date/Cascader 等清空图标)。\n * 不传默认 true;Select 未配此项时仍可回退到 selectOption.hdAllowClear\n */\n hdAllowClear?: boolean;\n cascaderOption?: CascaderOption; // 级联选择器配置\n onChangeEventDebounceTime?: number; // change事件防抖\n onSearchEventEventDebounceTime?: number; // search事件防抖\n onOpenChangeEventDebounceTime?: number; // 下拉展开事件防抖,未配置或为0时同步触发(不防抖)\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 { 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 /**\n * 是否允许清空当前控件(Input 清空按钮、Select/Date/Cascader 等清空图标)。\n * 不传默认 true;Select 未配此项时仍可回退到 selectOption.hdAllowClear\n */\n hdAllowClear?: boolean;\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 /** RegionAddress:详细地址字段名(与 name 组成两个 FormControl) */\n addressName?: string;\n /** RegionAddress:详细地址初始值 */\n addressValue?: string;\n /** RegionAddress:详细地址占位符,默认「请输入详细地址」 */\n addressPlaceholder?: string;\n /** RegionAddress:详细地址最大长度 */\n addressMaxLength?: number;\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 RegionAddress, // 省市区级联 + 详细地址(占 2 列,注册两个 FormControl)\n}\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class HdFormService {\n constructor() {}\n}\n","import { CascaderOption } from '../model/common-type';\n\nexport const HD_CASCADER_MENU_CLASS = 'hd-cascader-menus';\n\nexport function cascaderPinyinFilter(\n inputValue: string,\n path: any[],\n pinyinField: string = 'pinyin'\n): boolean {\n if (!inputValue) {\n return true;\n }\n const keyword = inputValue.trim().toLowerCase();\n return path.some((option) => {\n const label =\n option.label != null ? String(option.label).toLowerCase() : '';\n const value =\n option.value != null ? String(option.value).toLowerCase() : '';\n const pinyin =\n option[pinyinField] != null\n ? String(option[pinyinField]).toLowerCase()\n : '';\n return (\n (label && label.indexOf(keyword) !== -1) ||\n (value && value.indexOf(keyword) !== -1) ||\n (pinyin && pinyin.indexOf(keyword) !== -1)\n );\n });\n}\n\nexport function getCascaderShowSearch(\n cascaderOption?: CascaderOption\n): boolean | { filter?: Function; sorter?: Function } {\n if (!cascaderOption) {\n return true;\n }\n if (cascaderOption.showSearch === false) {\n return false;\n }\n if (\n cascaderOption.showSearch &&\n typeof cascaderOption.showSearch === 'object'\n ) {\n return cascaderOption.showSearch;\n }\n const pinyinField = cascaderOption.pinyinField || 'pinyin';\n return {\n filter: (inputValue: string, path: any[]) =>\n cascaderPinyinFilter(inputValue, path, pinyinField),\n };\n}\n\n/** 下拉菜单 class:默认带 hd-cascader-menus,便于搜索结果按内容撑开 */\nexport function getCascaderMenuClassName(\n cascaderOption?: CascaderOption\n): string {\n const custom =\n cascaderOption && cascaderOption.menuClassName\n ? String(cascaderOption.menuClassName).trim()\n : '';\n if (!custom) {\n return HD_CASCADER_MENU_CLASS;\n }\n if (custom.indexOf(HD_CASCADER_MENU_CLASS) !== -1) {\n return custom;\n }\n return HD_CASCADER_MENU_CLASS + ' ' + custom;\n}\n\n/**\n * 合并 menuStyle。\n * 默认不强制宽度;仅当配置了 dropdownMinWidth / menuStyle 时才写入。\n */\nexport function getCascaderMenuStyle(\n cascaderOption?: CascaderOption\n): { [key: string]: string } | null {\n if (!cascaderOption) {\n return null;\n }\n const style: { [key: string]: string } = {};\n if (cascaderOption.menuStyle) {\n Object.keys(cascaderOption.menuStyle).forEach((key) => {\n style[key] = cascaderOption.menuStyle[key];\n });\n }\n if (cascaderOption.dropdownMinWidth != null) {\n const minWidthCss =\n typeof cascaderOption.dropdownMinWidth === 'number'\n ? cascaderOption.dropdownMinWidth + 'px'\n : String(cascaderOption.dropdownMinWidth);\n if (style['--hd-cascader-menu-min-width'] == null) {\n style['--hd-cascader-menu-min-width'] = minWidthCss;\n }\n }\n return Object.keys(style).length ? style : null;\n}\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n/** 用户筛选条件模版(与 auth UserFilterScheme 对齐) */\r\nexport class HdFilterScheme {\r\n uuid?: string;\r\n userCode?: string;\r\n filterKey: string;\r\n templateName: string;\r\n filterValue: string;\r\n}\r\n\r\n/** 内置默认模版名 */\r\nexport const HD_FILTER_DEFAULT_SCHEME_NAME = '默认条件';\r\n\r\n/**\r\n * 业务仓实现并 provide,hd-filter 在 enableFilterScheme 时注入使用。\r\n * 不提供则开启开关也不会调接口。\r\n */\r\nexport abstract class HdFilterSchemeStore {\r\n abstract queryByFilterKey(filterKey: string): Observable<Array<HdFilterScheme>>;\r\n abstract save(scheme: HdFilterScheme): Observable<HdFilterScheme>;\r\n abstract delete(uuid: string): Observable<void>;\r\n}\r\n\r\nexport const HD_FILTER_SCHEME_STORE = new InjectionToken<HdFilterSchemeStore>('HD_FILTER_SCHEME_STORE');\r\n","import {\n Component,\n EventEmitter,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n SimpleChanges\n} from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { Filter, FilterListType } from './hd-filter.service';\nimport { FormItem, FormListType } from '../hd-form/hd-form.service';\nimport {\n getCascaderMenuClassName,\n getCascaderMenuStyle,\n getCascaderShowSearch,\n} from '../utils/cascader.util';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { InputBoolean } from 'ng-zorro-antd';\nimport {\n HD_FILTER_DEFAULT_SCHEME_NAME,\n HD_FILTER_SCHEME_STORE,\n HdFilterScheme,\n HdFilterSchemeStore\n} from './hd-filter-scheme';\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, OnChanges, OnDestroy {\n\n @Input() filterList: Array<Filter>;\n /** 是否启用筛选组(默认关闭) */\n @Input() @InputBoolean() enableFilterScheme = false;\n /** 筛选器标识,开启筛选组时必传 */\n @Input() filterSchemeKey: string;\n /** 是否去掉 hd-filter-container 的 padding,默认 false */\n @Input() @InputBoolean() hidePadding = false;\n\n @Output() searchEvent = new EventEmitter();\n @Output() resetEvent = new EventEmitter();\n\n validateFilterForm: FormGroup;\n isShowMore: boolean = true;\n filterListModular: number = 0;\n private searchSubject = new Subject<{ fn: any, event: any, selectOption?: any; }>();\n private debounceTimeout: number = 0;\n private openChangeSubject = new Subject<{ fn: any; event: any }>();\n private openChangeDebounceTimeout: number = 0;\n\n private searchSubscription: Subscription | undefined;\n private openChangeSubscription: Subscription | undefined;\n private schemeLoadSub: Subscription | undefined;\n private schemeActionSub: Subscription | undefined;\n\n /** 页面配置的初始值(虚拟「默认条件」) */\n private defaultFilterValues: { [key: string]: any } = {};\n private defaultValuesCaptured = false;\n\n schemeList: Array<HdFilterScheme> = [];\n currentScheme: HdFilterScheme = null;\n currentSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;\n schemeLoading = false;\n schemeSaving = false;\n\n switchModalVisible = false;\n switchFormList: Array<FormItem> = [];\n switchValidateForm: FormGroup;\n\n saveAsModalVisible = false;\n saveAsFormList: Array<FormItem> = [];\n saveAsValidateForm: FormGroup;\n\n readonly defaultSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;\n private readonly switchDefaultKey = '__DEFAULT__';\n\n constructor(\n private fb: FormBuilder,\n @Optional() @Inject(HD_FILTER_SCHEME_STORE) private schemeStore: HdFilterSchemeStore\n ) {\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\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 }\n\n ngOnInit() {\n this.init();\n // 首次加载只在这里请求一次;ngOnChanges 首次也会带上 enableFilterScheme/filterSchemeKey,避免重复调接口\n this.tryLoadSchemes(true);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['filterList']) {\n this.init();\n }\n if (changes['enableFilterScheme'] || changes['filterSchemeKey']) {\n // 首次变更与 ngOnInit 重复(第二次会 unsubscribe 第一次,表现为请求无返回);仅后续切换再加载\n const enableLater = changes['enableFilterScheme'] && !changes['enableFilterScheme'].firstChange;\n const keyLater = changes['filterSchemeKey'] && !changes['filterSchemeKey'].firstChange;\n if (enableLater || keyLater) {\n this.tryLoadSchemes(true);\n }\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.schemeLoadSub) {\n this.schemeLoadSub.unsubscribe();\n }\n if (this.schemeActionSub) {\n this.schemeActionSub.unsubscribe();\n }\n }\n\n get canUseScheme(): boolean {\n return !!(this.enableFilterScheme && this.filterSchemeKey && this.schemeStore);\n }\n\n private init(): void {\n this.isShowMore = true;\n if (!this.checkList(this.filterList)) {\n throw 'filter组件数据格式不规范';\n }\n if (!this.filterList) {\n this.filterList = [];\n }\n this.filterListModular = this.filterList.length % 4;\n const formGroupList = {};\n this.filterList.forEach((item, index) => {\n formGroupList[item.name] = this.fb.control(\n this.normalizeFilterControlValue(item, item.value),\n [],\n );\n item.show = index < 7;\n });\n this.validateFilterForm = this.fb.group(formGroupList);\n if (!this.defaultValuesCaptured) {\n this.defaultFilterValues = this.clonePlain(this.getFilterData());\n this.defaultValuesCaptured = true;\n }\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 this.debounceTimeout = onSearchEventDebounceTime;\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\n this.searchSubject.next({ fn, event, selectOption });\n } else {\n this.triggerEvent(fn, event, selectOption);\n }\n }\n\n onOpenChangeEvent(\n fn: any,\n open: boolean,\n onOpenChangeEventDebounceTime: any,\n filter?: Filter,\n ) {\n if (!fn) {\n return;\n }\n // 展开时先清空旧 options,避免条件变化后请求返回前仍展示上一批下拉数据\n if (open) {\n this.clearSelectOptionsOnOpen(filter);\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 /** 有 onOpenChangeEvent 时展开下拉先清空选项,由业务回调再写入新数据 */\n private clearSelectOptionsOnOpen(filter: Filter): void {\n if (!filter || !filter.selectOption) {\n return;\n }\n const opt = filter.selectOption;\n if (opt.selectList != null) {\n opt.selectList = [];\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 /** 当前展示的筛选项数量(尊重 item.show,与展开/收起一致) */\n getVisibleFilterCount(): number {\n return (this.filterList || []).filter((item) => item.show !== false).length;\n }\n\n /** 少条件时加宽字段列:1→18、2→9、≥3→6 */\n getFilterColSpan(): number {\n const n = this.getVisibleFilterCount();\n if (n === 1) {\n return 18;\n }\n if (n === 2) {\n return 9;\n }\n return 6;\n }\n\n computeOffset() {\n const visibleCount = this.getVisibleFilterCount();\n // ≤2 个可见条件时字段已加宽占满一行剩余,按钮不再 offset\n if (visibleCount <= 2) {\n return 0;\n }\n const modular = visibleCount % 4;\n if (visibleCount === 4) {\n return 18;\n }\n // ≥3:沿用原 %4 逻辑,按可见数计算(避免收起后错位)\n return this.isShowMore\n ? ((modular === 0 || visibleCount > 7) ? 0 : (3 - modular) * 6)\n : (modular === 0 ? 18 : (3 - modular) * 6);\n }\n\n private checkList(list: Array<Filter>): boolean {\n if (!list || (list && list.length === 0)) {\n return true;\n }\n const nameList = [];\n list.forEach((item) => {\n nameList.push(item.name);\n });\n if ([...new Set(nameList)].length !== list.length) {\n throw 'filter组件数据格式不规范,存在重复name值!';\n }\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 if (this.resetEvent.observers.length > 0) {\n this.resetEvent.emit(this.validateFilterForm.getRawValue());\n } else {\n this.searchEvent.emit(this.validateFilterForm.getRawValue());\n }\n }\n\n public resetFilterFormWithValue() {\n const resetValue: { [key: string]: any } = {};\n this.filterList.forEach((item) => {\n resetValue[item.name] = this.normalizeFilterControlValue(item, item.value);\n });\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 this.validateFilterForm.patchValue(patchObject);\n }\n\n isAllowClear(item: Filter): boolean {\n if (!item) {\n return true;\n }\n if (item.hdAllowClear != null) {\n return !!item.hdAllowClear;\n }\n if (item.selectOption && item.selectOption.hdAllowClear != null) {\n return !!item.selectOption.hdAllowClear;\n }\n return true;\n }\n\n // ---------- 筛选组 ----------\n\n private tryLoadSchemes(applyDefault: boolean) {\n if (!this.canUseScheme) {\n this.schemeList = [];\n this.currentScheme = null;\n this.currentSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;\n return;\n }\n this.schemeLoading = true;\n if (this.schemeLoadSub) {\n this.schemeLoadSub.unsubscribe();\n }\n this.schemeLoadSub = this.schemeStore.queryByFilterKey(this.filterSchemeKey).subscribe(\n (list) => {\n this.schemeLoading = false;\n this.schemeList = list || [];\n if (applyDefault) {\n this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);\n } else if (this.currentScheme && this.currentScheme.uuid) {\n const found = this.schemeList.find(s => s.uuid === this.currentScheme.uuid);\n this.currentScheme = found || null;\n this.currentSchemeName = found ? found.templateName : HD_FILTER_DEFAULT_SCHEME_NAME;\n }\n },\n (err) => {\n this.schemeLoading = false;\n this.showError('加载筛选模版失败:' + (err || ''));\n if (applyDefault) {\n this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);\n }\n }\n );\n }\n\n /** 展示用列表:保证有「默认条件」 */\n getDisplaySchemeList(): Array<HdFilterScheme> {\n const result: Array<HdFilterScheme> = [];\n const fromDb = this.schemeList.find(s => s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME);\n if (fromDb) {\n result.push(fromDb);\n } else {\n result.push({\n filterKey: this.filterSchemeKey,\n templateName: HD_FILTER_DEFAULT_SCHEME_NAME,\n filterValue: JSON.stringify(this.defaultFilterValues || {})\n });\n }\n (this.schemeList || []).forEach(s => {\n if (s.templateName !== HD_FILTER_DEFAULT_SCHEME_NAME) {\n result.push(s);\n }\n });\n return result;\n }\n\n openSwitchModal() {\n if (!this.canUseScheme) {\n return;\n }\n const current = this.currentScheme\n || {\n filterKey: this.filterSchemeKey,\n templateName: this.currentSchemeName || HD_FILTER_DEFAULT_SCHEME_NAME,\n filterValue: ''\n };\n this.buildSwitchFormList(this.getSwitchOptionKey(current));\n this.switchModalVisible = true;\n }\n\n closeSwitchModal() {\n this.switchModalVisible = false;\n }\n\n switchFormChangeEvent(form: FormGroup) {\n this.switchValidateForm = form;\n }\n\n getSwitchOptionKey(item: HdFilterScheme): string {\n if (!item) {\n return this.switchDefaultKey;\n }\n if (item.uuid) {\n return item.uuid;\n }\n return this.switchDefaultKey;\n }\n\n private buildSwitchFormList(selectedKey: string) {\n const selectList = this.getDisplaySchemeList().map(item => {\n return {\n value: this.getSwitchOptionKey(item),\n label: item.templateName\n };\n });\n this.switchFormList = [\n {\n type: FormListType.Select,\n label: '筛选组',\n name: 'schemeKey',\n require: true,\n width: 4,\n value: selectedKey,\n placeholder: '请选择筛选组',\n selectOption: {\n value: 'value',\n label: 'label',\n hdShowSearch: true,\n selectList: selectList\n }\n }\n ];\n }\n\n confirmSwitch(): boolean {\n if (!this.switchValidateForm || !this.switchValidateForm.valid) {\n this.showError('请选择筛选组');\n return false;\n }\n const schemeKey = this.switchValidateForm.getRawValue().schemeKey;\n if (schemeKey == null || schemeKey === '') {\n this.showError('请选择筛选组');\n return false;\n }\n const list = this.getDisplaySchemeList();\n let target: HdFilterScheme = null;\n if (schemeKey === this.switchDefaultKey) {\n target = list.find(s => s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME && !s.uuid)\n || list.find(s => s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME);\n } else {\n target = list.find(s => s.uuid === schemeKey);\n }\n if (!target) {\n this.showError('请选择筛选组');\n return false;\n }\n this.applyScheme(target, true);\n this.switchModalVisible = false;\n return true;\n }\n\n isDefaultScheme(item: HdFilterScheme): boolean {\n return !!(item && item.templateName === HD_FILTER_DEFAULT_SCHEME_NAME);\n }\n\n canDeleteCurrent(): boolean {\n return !!(this.currentScheme && this.currentScheme.uuid\n && this.currentScheme.templateName !== HD_FILTER_DEFAULT_SCHEME_NAME);\n }\n\n saveCurrentScheme() {\n if (!this.canUseScheme) {\n return;\n }\n const name = this.currentSchemeName || HD_FILTER_DEFAULT_SCHEME_NAME;\n const body: HdFilterScheme = {\n uuid: this.currentScheme && this.currentScheme.uuid ? this.currentScheme.uuid : null,\n filterKey: this.filterSchemeKey,\n templateName: name,\n filterValue: this.serializeFilterValue()\n };\n this.schemeSaving = true;\n if (this.schemeActionSub) {\n this.schemeActionSub.unsubscribe();\n }\n this.schemeActionSub = this.schemeStore.save(body).subscribe(\n (saved) => {\n this.schemeSaving = false;\n this.showSuccess('保存成功');\n this.currentScheme = saved;\n this.currentSchemeName = saved.templateName;\n this.refreshSchemeListKeepCurrent();\n },\n (err) => {\n this.schemeSaving = false;\n this.showError('保存失败:' + (err || ''));\n }\n );\n }\n\n openSaveAsModal() {\n this.buildSaveAsFormList();\n this.saveAsModalVisible = true;\n }\n\n closeSaveAsModal() {\n this.saveAsModalVisible = false;\n }\n\n saveAsFormChangeEvent(form: FormGroup) {\n this.saveAsValidateForm = form;\n }\n\n private buildSaveAsFormList() {\n this.saveAsFormList = [\n {\n type: FormListType.Input,\n label: '筛选组名称',\n name: 'templateName',\n require: true,\n width: 4,\n maxLength: 50,\n value: null,\n placeholder: '请输入筛选组名称'\n }\n ];\n }\n\n confirmSaveAs(): boolean {\n if (!this.saveAsValidateForm || !this.saveAsValidateForm.valid) {\n this.showError('请输入筛选组名称');\n return false;\n }\n const name = ((this.saveAsValidateForm.getRawValue().templateName) || '').trim();\n if (!name) {\n this.showError('请输入筛选组名称');\n return false;\n }\n if (name === HD_FILTER_DEFAULT_SCHEME_NAME) {\n this.showError('不能使用「默认条件」作为筛选组名称,请使用「保存为当前」覆盖默认条件');\n return false;\n }\n const exists = (this.schemeList || []).some(s => s.templateName === name);\n if (exists) {\n this.showError('筛选组名称已存在');\n return false;\n }\n const body: HdFilterScheme = {\n filterKey: this.filterSchemeKey,\n templateName: name,\n filterValue: this.serializeFilterValue()\n };\n this.schemeSaving = true;\n if (this.schemeActionSub) {\n this.schemeActionSub.unsubscribe();\n }\n this.schemeActionSub = this.schemeStore.save(body).subscribe(\n (saved) => {\n this.schemeSaving = false;\n this.saveAsModalVisible = false;\n this.showSuccess('另存为成功');\n this.currentScheme = saved;\n this.currentSchemeName = saved.templateName;\n this.refreshSchemeListKeepCurrent();\n },\n (err) => {\n this.schemeSaving = false;\n this.showError('另存为失败:' + (err || ''));\n }\n );\n return false;\n }\n\n deleteCurrentScheme() {\n if (!this.canDeleteCurrent()) {\n return;\n }\n const uuid = this.currentScheme.uuid;\n this.schemeSaving = true;\n if (this.schemeActionSub) {\n this.schemeActionSub.unsubscribe();\n }\n this.schemeActionSub = this.schemeStore.delete(uuid).subscribe(\n () => {\n this.schemeSaving = false;\n this.showSuccess('删除成功');\n this.schemeList = (this.schemeList || []).filter(s => s.uuid !== uuid);\n this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);\n },\n (err) => {\n this.schemeSaving = false;\n this.showError('删除失败:' + (err || ''));\n }\n );\n }\n\n private refreshSchemeListKeepCurrent() {\n if (!this.canUseScheme) {\n return;\n }\n this.schemeStore.queryByFilterKey(this.filterSchemeKey).subscribe(\n (list) => {\n this.schemeList = list || [];\n if (this.currentScheme && this.currentScheme.uuid) {\n const found = this.schemeList.find(s => s.uuid === this.currentScheme.uuid);\n if (found) {\n this.currentScheme = found;\n this.currentSchemeName = found.templateName;\n }\n }\n },\n () => { /* ignore */ }\n );\n }\n\n private applySchemeByName(name: string, emitSearch: boolean) {\n const list = this.getDisplaySchemeList();\n const target = list.find(s => s.templateName === name);\n if (target) {\n this.applyScheme(target, emitSearch);\n }\n }\n\n private applyScheme(scheme: HdFilterScheme, emitSearch: boolean) {\n this.currentScheme = scheme && scheme.uuid ? scheme : {\n filterKey: this.filterSchemeKey,\n templateName: scheme ? scheme.templateName : HD_FILTER_DEFAULT_SCHEME_NAME,\n filterValue: scheme ? scheme.filterValue : JSON.stringify(this.defaultFilterValues || {})\n };\n this.currentSchemeName = this.currentScheme.templateName || HD_FILTER_DEFAULT_SCHEME_NAME;\n\n let values: any = {};\n if (this.currentSchemeName === HD_FILTER_DEFAULT_SCHEME_NAME && !(scheme && scheme.uuid)) {\n values = this.clonePlain(this.defaultFilterValues || {});\n } else {\n try {\n values = JSON.parse(scheme.filterValue || '{}');\n } catch (e) {\n values = {};\n }\n if (this.currentSchemeName === HD_FILTER_DEFAULT_SCHEME_NAME) {\n // 库中默认条件覆盖初始值:以默认值为底,再叠加库值\n values = Object.assign({}, this.defaultFilterValues || {}, values || {});\n }\n }\n this.patchFilterValues(values);\n if (emitSearch) {\n this.submitForm();\n }\n }\n\n private serializeFilterValue(): string {\n return JSON.stringify(this.getFilterData() || {});\n }\n\n private patchFilterValues(values: { [key: string]: any }) {\n if (!this.validateFilterForm || !this.filterList) {\n return;\n }\n const patch: { [key: string]: any } = {};\n this.filterList.forEach(item => {\n if (values && Object.prototype.hasOwnProperty.call(values, item.name)) {\n patch[item.name] = this.reviveFilterValue(item, values[item.name]);\n }\n });\n this.validateFilterForm.patchValue(patch);\n }\n\n /**\n * 多选空态用 [],避免 FormControl 为 null 时 nz-select multiple 不显示 placeholder。\n * DateRange 必须保持 null(或把历史空数组归一为 null):业务侧大量用 !value 判断,\n * 若规范成 [] 会因 truthy 走进 moment(value[0]),被解析成「今天」。\n */\n private normalizeFilterControlValue(filter: Filter, value: any): any {\n if (!filter) {\n return value;\n }\n if (filter.type === FilterListType.MultipleSelect && value == null) {\n return [];\n }\n if (\n filter.type === FilterListType.DateRange &&\n (value == null || (Array.isArray(value) && value.length === 0))\n ) {\n return null;\n }\n return value;\n }\n\n private reviveFilterValue(filter: Filter, value: any): any {\n if (value == null) {\n return this.normalizeFilterControlValue(filter, value);\n }\n if (filter.type === FilterListType.DateRange) {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return null;\n }\n return value.map(v => this.parseDateLike(v));\n }\n return value;\n }\n if (filter.type === FilterListType.Date || filter.type === FilterListType.Month) {\n return this.parseDateLike(value);\n }\n return value;\n }\n\n private parseDateLike(value: any): any {\n if (value == null || value instanceof Date) {\n return value;\n }\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n const d = new Date(value);\n return isNaN(d.getTime()) ? value : d;\n }\n if (typeof value === 'number') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? value : d;\n }\n return value;\n }\n\n private clonePlain(obj: any): any {\n try {\n return JSON.parse(JSON.stringify(obj == null ? {} : obj));\n } catch (e) {\n return {};\n }\n }\n\n private showSuccess(msg: string) {\n if (typeof window !== 'undefined' && (window as any).hdMessageService) {\n (window as any).hdMessageService.prototype.success(msg);\n }\n }\n\n private showError(msg: string) {\n if (typeof window !== 'undefined' && (window as any).hdMessageService) {\n (window as any).hdMessageService.prototype.error(msg);\n } else {\n // eslint-disable-next-line no-console\n console.error(msg);\n }\n }\n\n getCascaderShowSearch = getCascaderShowSearch;\n getCascaderMenuClassName = getCascaderMenuClassName;\n getCascaderMenuStyle = getCascaderMenuStyle;\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\";\nimport {\n getCascaderMenuClassName,\n getCascaderMenuStyle,\n getCascaderShowSearch,\n} from \"../utils/cascader.util\";\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 // 模板始终绑定 [formGroup],空列表时也必须有 FormGroup 实例\n this.validateHdForm = this.fb.group({});\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 this.validateHdForm = this.fb.group({});\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 formItem?: any,\n ) {\n if (!fn) {\n return;\n }\n // 展开时先清空旧 options,避免条件变化后请求返回前仍展示上一批下拉数据\n if (open) {\n this.clearSelectOptionsOnOpen(formItem);\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 /** 有 onOpenChangeEvent 时展开下拉先清空选项,由业务回调再写入新数据 */\n private clearSelectOptionsOnOpen(formItem: any): void {\n if (!formItem || !formItem.selectOption) {\n return;\n }\n const opt = formItem.selectOption;\n if (opt.selectList != null) {\n opt.selectList = [];\n }\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 // RegionAddress 固定占两列,保证级联宽与单列控件对齐\n this.formList.forEach((item) => {\n if (item.type === FormListType.RegionAddress) {\n item.width = 2;\n }\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 if (item.type === FormListType.RegionAddress) {\n const regionValue = Array.isArray(item.value) ? item.value : null;\n const addressValue =\n item.addressValue != null ? item.addressValue : null;\n const requireValidators =\n item.require && !item.hide ? [Validators.required] : [];\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: regionValue, disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [item.validator],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: regionValue, disabled: item.disabled },\n requireValidators,\n );\n }\n formGroupList[item.addressName] = this.fb.control(\n { value: addressValue, disabled: item.disabled },\n requireValidators,\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 if (item.type === FormListType.RegionAddress && !item.addressName) {\n throw \"form组件 RegionAddress 必须配置 addressName\";\n }\n if (\n item.type === FormListType.RegionAddress &&\n (!item.cascaderOption || !item.cascaderOption.options)\n ) {\n throw \"form组件 RegionAddress 必须配置 cascaderOption.options\";\n }\n nameList.push(item.name);\n if (item.type === FormListType.RegionAddress) {\n nameList.push(item.addressName);\n }\n });\n // 校验 name / addressName 是否重复\n if ([...new Set(nameList)].length !== nameList.length) {\n throw \"form组件数据格式不规范,存在重复name值!\";\n }\n // ...more check\n return true;\n }\n\n /** RegionAddress 双控件任一脏且无效时显示 error */\n getRegionAddressValidateStatus(item: FormItem): string {\n if (!this.validateHdForm) {\n return \"\";\n }\n const region = this.validateHdForm.get(item.name);\n const address = item.addressName\n ? this.validateHdForm.get(item.addressName)\n : null;\n const invalidDirty = (control) =>\n control && control.dirty && control.invalid;\n if (invalidDirty(region) || invalidDirty(address)) {\n return \"error\";\n }\n return \"\";\n }\n\n getRegionAddressErrorTip(item: FormItem): string {\n if (!this.validateHdForm) {\n return \"\";\n }\n const region = this.validateHdForm.get(item.name);\n const address = item.addressName\n ? this.validateHdForm.get(item.addressName)\n : null;\n if (region && region.dirty && region.hasError(\"required\")) {\n return item.label + \"不能为空\";\n }\n if (address && address.dirty && address.hasError(\"required\")) {\n return \"详细地址不能为空\";\n }\n if (item.validatorKeys && region) {\n for (let i = 0; i < item.validatorKeys.length; i++) {\n const key = item.validatorKeys[i];\n if (region.hasError(key.key)) {\n return key.label;\n }\n }\n }\n return item.label + \"不能为空\";\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 /**\n * 是否允许清空:优先 FormItem.hdAllowClear,其次 selectOption.hdAllowClear,默认 true\n */\n isAllowClear(item: FormItem): boolean {\n if (!item) {\n return true;\n }\n if (item.hdAllowClear != null) {\n return !!item.hdAllowClear;\n }\n if (item.selectOption && item.selectOption.hdAllowClear != null) {\n return !!item.selectOption.hdAllowClear;\n }\n return true;\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 getCascaderShowSearch = getCascaderShowSearch;\n getCascaderMenuClassName = getCascaderMenuClassName;\n getCascaderMenuStyle = getCascaderMenuStyle;\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 { 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';\nimport { HdFormModule } from '../hd-form/hd-form.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule,\n HdFormModule\n ],\n declarations: [HdFilterComponent],\n exports: [HdFilterComponent]\n})\nexport class HdFilterModule { }\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","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 /** 列设置可见性(仅非 hide 的 ViewDom 可由设置列切换;默认 true) */\n isShow?: boolean = true;\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/selectListName 再回调\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/** 列设置缓存(IndexedDB),仅存可见 ViewDom 的 name 列表 */\nexport class FormLinesCacheOption {\n cols: Array<string> = [];\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 * as localforage from \"localforage\";\nimport {\n InputBoolean,\n NzDatePickerComponent,\n NzInputNumberComponent,\n NzRangePickerComponent,\n NzSelectComponent,\n NzTimePickerComponent,\n} from \"ng-zorro-antd\";\nimport { NzFormatEmitEvent } from \"ng-zorro-antd/core\";\nimport { Subject, Subscription } from \"rxjs\";\nimport { debounceTime } from \"rxjs/operators\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\nimport { TreeGrid } from \"../hd-table/hd-table.service\";\nimport { SelectOptionTableColumn } from \"../model/common-type\";\nimport { CommonSessionService } from \"../service/common-session.service\";\nimport { FormLine, FormLineType, FormLinesCacheOption } 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 /** 是否启用键盘方向键/Enter 在单元格间跳转,默认开启 */\n @Input() @InputBoolean() enableKeyboardOperate: boolean = true;\n @Input() @InputBoolean() tableLoading: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n /** 是否展示行勾选列,用于外部批量操作勾选行 */\n @Input() @InputBoolean() showCheckbox: boolean = false;\n /** 是否展示列设置(齿轮),默认关闭;需要时页面手工 `[showColSettings]=\"true\"`;仅非 hide 的 ViewDom 可配置,禁止拖拽调序 */\n @Input() @InputBoolean() showColSettings: boolean = false;\n /** 列设置缓存 key 片段;有值时持久化到 IndexedDB,无则仅当前会话生效 */\n @Input() uuid: string;\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 /** 表格上方自定义区域(如勾选提示),用法同 hd-table 的 tableTotal */\n @ContentChild(\"tableTotal\", { static: false })\n tableTotal: TemplateRef<any>;\n\n // 列设置\n isDropdownVisible: boolean = false;\n showListNodes: boolean = false;\n nowListNodes: Array<TreeGrid> = [];\n hideListNodes: Array<TreeGrid> = [];\n cancelNowListNodes: Array<TreeGrid> = [];\n cancelHideListNodes: Array<TreeGrid> = [];\n formLinesCacheOption: FormLinesCacheOption = new FormLinesCacheOption();\n private localforage: any = null;\n private localtionTmp: string = \"\";\n private userSession: any;\n /** 是否已从 IndexedDB 读到过列设置缓存(含 cols 为空) */\n private colsCacheLoaded: boolean = false;\n\n constructor(\n private fb: FormBuilder,\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 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 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 if (!this.userSession) {\n this.userSession = { userCode: \"dev\" };\n }\n // 缓存一下总的表单数据\n this.storeFormLinesData = this.formLinesData;\n this.initColSettings();\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 this.showColSettingsButton\n );\n }\n\n /** 是否展示列设置齿轮(有可配置 ViewDom 时) */\n get showColSettingsButton(): boolean {\n return (\n !!this.showColSettings && this.getConfigurableFormLines().length > 0\n );\n }\n\n /** 列是否渲染:hide 永不展示;ViewDom 受 isShow 控制 */\n isColumnVisible(item: FormLine): boolean {\n if (!item || item.hide) {\n return false;\n }\n if (item.type === FormLineType.ViewDom) {\n return item.isShow !== false;\n }\n return true;\n }\n\n /** 可进入列设置的字段:非 hide 的 ViewDom */\n getConfigurableFormLines(): FormLine[] {\n if (!this.formLines || !this.formLines.length) {\n return [];\n }\n return this.formLines.filter(\n (item) => item.type === FormLineType.ViewDom && !item.hide,\n );\n }\n\n private getCacheKey(): string {\n const userCode =\n (this.userSession && this.userSession.userCode) || \"dev\";\n return (\n \"hd-form-lines_\" +\n userCode +\n \"_\" +\n this.localtionTmp +\n \"_\" +\n this.uuid\n );\n }\n\n private initColSettings(): void {\n this.colsCacheLoaded = false;\n if (!this.showColSettings || !this.formLines || !this.formLines.length) {\n this.setCols();\n return;\n }\n if (!this.uuid) {\n this.setCols();\n return;\n }\n this.localforage\n .ready()\n .then(() => {\n this.localforage\n .getItem(this.getCacheKey())\n .then((value: FormLinesCacheOption) => {\n if (value && Array.isArray(value.cols)) {\n this.formLinesCacheOption = value;\n this.colsCacheLoaded = true;\n } else {\n this.formLinesCacheOption = new FormLinesCacheOption();\n this.colsCacheLoaded = false;\n }\n this.setCols();\n })\n .catch(() => {\n this.formLinesCacheOption = new FormLinesCacheOption();\n this.colsCacheLoaded = false;\n this.setCols();\n });\n })\n .catch((e) => {\n console.log(\"localforage加载异常\", e);\n this.formLinesCacheOption = new FormLinesCacheOption();\n this.colsCacheLoaded = false;\n this.setCols();\n });\n }\n\n private hasColsCache(): boolean {\n return this.colsCacheLoaded && Array.isArray(this.formLinesCacheOption.cols);\n }\n\n private saveFormLinesCacheOption(): void {\n if (!this.uuid) {\n return;\n }\n this.localforage.setItem(this.getCacheKey(), this.formLinesCacheOption);\n }\n\n /** 按 formLines 原始顺序排列节点(禁止调序时保持源顺序) */\n private sortNodesByFormLinesOrder(nodes: TreeGrid[]): TreeGrid[] {\n const order = this.getConfigurableFormLines().map((f) => f.name);\n return nodes.slice().sort((a, b) => {\n return order.indexOf(a.key) - order.indexOf(b.key);\n });\n }\n\n setCols(): void {\n this.showListNodes = false;\n this.nowListNodes = [];\n this.hideListNodes = [];\n const configurable = this.getConfigurableFormLines();\n const hasCache = this.hasColsCache();\n configurable.forEach((element) => {\n if (hasCache) {\n element.isShow = this.formLinesCacheOption.cols.includes(element.name);\n } else if (element.isShow === undefined || element.isShow === null) {\n element.isShow = true;\n }\n const node: TreeGrid = {\n title: element.label,\n key: element.name,\n checked: element.isShow !== false,\n disabled: false,\n };\n if (element.isShow !== false) {\n this.nowListNodes.push(node);\n } else {\n this.hideListNodes.push(node);\n }\n });\n this.nowListNodes = this.sortNodesByFormLinesOrder(this.nowListNodes);\n this.hideListNodes = this.sortNodesByFormLinesOrder(this.hideListNodes);\n setTimeout(() => {\n this.showListNodes = true;\n this.cdr.markForCheck();\n }, 0);\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 confirmDropdown(): void {\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(): void {\n const visibleNames = this.nowListNodes.map((item) => item.key);\n this.getConfigurableFormLines().forEach((line) => {\n line.isShow = visibleNames.includes(line.name);\n });\n this.formLinesCacheOption.cols = visibleNames;\n this.colsCacheLoaded = true;\n this.saveFormLinesCacheOption();\n this.isDropdownVisible = false;\n this.cdr.markForCheck();\n }\n\n /** 勾选/取消:仅在显示/隐藏两组间移动,不改变 formLines 顺序 */\n checkAction(event: NzFormatEmitEvent): void {\n if (event.node.origin.checked) {\n const node = this.hideListNodes.find((item) => {\n return item.key === event.node.origin.key;\n });\n if (!node) {\n return;\n }\n node.checked = true;\n this.hideListNodes = this.hideListNodes.filter((item) => {\n return item.key !== event.node.origin.key;\n });\n this.nowListNodes = this.sortNodesByFormLinesOrder(\n this.nowListNodes.concat([node]),\n );\n } else {\n const temporaryNodeList = this.hideListNodes.slice(0);\n this.nowListNodes.forEach((item) => {\n if (item.key === event.node.origin.key) {\n const innerItem = JSON.parse(JSON.stringify(item));\n innerItem.checked = false;\n temporaryNodeList.push(innerItem);\n }\n });\n this.hideListNodes = this.sortNodesByFormLinesOrder(temporaryNodeList);\n this.nowListNodes = this.nowListNodes.filter((item) => {\n return item.key !== event.node.origin.key;\n });\n }\n this.cdr.markForCheck();\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 if (!this.enableKeyboardOperate) {\n return;\n }\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.enableKeyboardOperate) {\n return;\n }\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 / isShow=false 的列不渲染 #formInputDom,不计入 collectDomList 的列下标\n if (\n typeList.includes(list[i].type) &&\n !list[i].hide &&\n list[i].isShow !== false\n ) {\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 (\n typeList.includes(list[i].type) &&\n !list[i].hide &&\n list[i].isShow !== false\n ) {\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 formItem?: any,\n ) {\n if (!fn) {\n return;\n }\n // 展开时先清空旧 options,避免条件变化后请求返回前仍展示上一批下拉数据\n if (open) {\n this.clearSelectOptionsOnOpen(formItem, line);\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 /** 有 onOpenChangeEvent 时展开下拉先清空选项,由业务回调再写入新数据 */\n private clearSelectOptionsOnOpen(formItem: any, line: any): void {\n if (!formItem || !formItem.selectOption) {\n return;\n }\n const opt = formItem.selectOption;\n if (opt.selectList != null) {\n opt.selectList = [];\n }\n if (\n opt.selectListName &&\n line &&\n line.get &&\n line.get(opt.selectListName)\n ) {\n line.get(opt.selectListName).setValue([], { emitEvent: false });\n }\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[\"formLines\"] &&\n changes[\"formLines\"].previousValue !== undefined &&\n JSON.stringify(changes[\"formLines\"].currentValue) !==\n JSON.stringify(changes[\"formLines\"].previousValue)\n ) {\n this.initColSettings();\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 preserveNumber: item.preserveNumber != null ? item.preserveNumber : 2,\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 // 关闭键盘操作时,选择框选中后不自动跳转到下一个输入控件\n if (!this.enableKeyboardOperate) {\n return;\n }\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 // 仅真正新增/复制的行在插入前单独置 true;搜索重建已有行必须为 false,\n // 否则筛选态下点「添加」会把第一行可见数据再插入一份\n formGroupObj.isHdFormLineSearchAdd = this.fb.control(false, []);\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.markSearchAddedLine(newLine);\n this.linesFormArray.insert(insertAt, newLine);\n this.calculateLineNumber();\n this.addLineEvent.emit(newLine);\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 const copiedLine = this.createLineFromValues(sourceValues, false, true);\n this.markSearchAddedLine(copiedLine);\n this.linesFormArray.insert(insertAt, copiedLine);\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 markSearchAddedLine(line: FormGroup): void {\n if (!this.isFilterData || !line) {\n return;\n }\n const flag = line.get(\"isHdFormLineSearchAdd\");\n if (flag) {\n flag.setValue(true, { emitEvent: false });\n }\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 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 && this.filterIndexStore.length > 0) {\n const insertAt =\n addIndex <= 0\n ? this.filterIndexStore[0]\n : this.filterIndexStore[addIndex - 1] + 1;\n const addedLine = {\n ...getNowLines[addIndex],\n isHdFormLineSearchAdd: false,\n };\n this.storeFormLinesData.splice(insertAt, 0, addedLine);\n for (let i = 0; i < this.filterIndexStore.length; i++) {\n if (this.filterIndexStore[i] >= insertAt) {\n this.filterIndexStore[i]++;\n }\n }\n this.filterIndexStore.splice(addIndex, 0, insertAt);\n if (this.filterStoreFormLinesData) {\n this.filterStoreFormLinesData.splice(addIndex, 0, addedLine);\n }\n const flagCtrl = (this.linesFormArray.at(addIndex) as FormGroup).get(\n \"isHdFormLineSearchAdd\",\n );\n if (flagCtrl) {\n flagCtrl.setValue(false, { emitEvent: false });\n }\n }\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 { CommonSessionService } from '../service/common-session.service';\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 providers: [CommonSessionService]\n})\nexport class HdFormLinesModule { }\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","/**\n * 表格 / 表单列宽常量(px)。\n * 使用 `as const`,发布后的 `.d.ts` 仍保留具体数值,IDE 悬停可直接看到。\n *\n * @example\n * import { ColWidth } from 'fantasy-ngzorro';\n * { width: ColWidth.enumColWidth } // 100\n */\nexport const ColWidth = {\n /** 表格小图标宽度 — 25 */\n tableImageColWidth: 25,\n /** 表格双小图标宽度 — 40 */\n tableTwoImageColWidth: 40,\n /** 单据单号列宽度 — 150 */\n billNumberColWidth: 150,\n /** 基本资料名称列宽度 — 150 */\n nameColWidth: 150,\n /** 基本资料代码列宽度 — 100 */\n codeColWidth: 100,\n /** 门店/货主/供应商 `[code]name` 展示固定宽度 — 200 */\n codeNameColWidth: 200,\n /** 枚举列宽度 — 100 */\n enumColWidth: 100,\n /** 单个日期 — 100 */\n dateColWidth: 100,\n /** 单个日期带时间 — 150 */\n dateTimeColWidth: 150,\n /** 日期范围 — 200 */\n dateRangeWidth: 200,\n /** 操作列宽度 — 150 */\n operateColWidth: 150,\n /** 数字列 — 100 */\n numberColWidth: 100,\n /** 备注列 — 250 */\n remarkColWidth: 250,\n /** 通用固定宽(超长省略)— 150 */\n fixColWidth: 150,\n /** 订单等内容缩略/展开列 — 350 */\n maxColWidth: 350,\n} as const;\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","import { InputNumber, SelectOption } from \"../model/common-type\";\n\n// 表格行\nexport class HdTableColumn {\n title: string; // 列名\n name: string | Function = null; // 字段名\n render?: (value: any) => string; // 渲染函数\n width?: number; // 列宽\n /**\n * 文字颜色。\n * 字符串:整列同色;\n * 函数:按行返回颜色(如标红返回 '#F5222D',不标色返回空)。\n */\n color?: string | ((line: any) => string);\n align?: \"right\" | \"left\" | \"center\" = \"left\";\n click?: (value: any) => void;\n /** 按行控制是否渲染为可点击超链接;未配置时只要有 click 则整列可点 */\n canClick?: (value: any) => boolean;\n fixed?: \"left\" | \"right\" = null;\n fixedWidth?: number; // 左侧固定列偏移(其左侧已固定列宽之和)\n fixedRightWidth?: number; // 右侧固定列偏移(其右侧已固定列宽之和)\n btnList?: Array<OperateBtn> = []; // title 为「操作」时整列按钮;其他列时作为单元格文案后的操作按钮\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 * 字段值后用竖线追加行号。前面的字段仍可配 click 作为超链接,行号本身不可点。\n * true:按分页连续序号(从 1 开始);\n * string:取当前行该字段作为行号。\n */\n rowNo?: boolean | string;\n /**\n * 值后显示编辑笔图标(Figma edit/edit,14px)。\n * true:整列可编辑;函数:按行控制。\n * 与 editType 互斥:配置了 editType 时走单元格内控件,不再显示编辑笔。\n */\n editable?: boolean | ((line: any) => boolean);\n /** 点击编辑笔回调,供父组件处理(如弹窗改值) */\n edit?: (line: any) => void;\n /**\n * 行内编辑类型;配置后该列常显控件。\n * name 须为 string(函数型 name 不支持行内编辑)。\n */\n editType?: \"input\" | \"inputNumber\" | \"select\" | \"date\" | \"dateRange\";\n /**\n * 行内编辑列是否必填。\n * 仅配置了 editType 时生效,列名前显示红色星号。\n */\n require?: boolean;\n /** 是否禁用行内编辑:true / 按行函数 */\n editDisabled?: boolean | ((line: any) => boolean);\n /** Select 配置(复用 SelectOption 子集) */\n selectOption?: SelectOption;\n /**\n * select 下拉展开;展开时组件先清空 selectList / 行上 selectListName,再回调 (open, line)。\n * 关闭不回调业务。用于按行按需加载选项。\n * 可 return 选项数组 / Promise / Observable,由 hd-table 写回并刷新(OnPush 下业务不必再改 tableData 引用)。\n */\n onOpenChangeEvent?: (open: boolean, line: any) => any;\n /** 下拉展开防抖(ms);未配或 0 同步触发 */\n onOpenChangeEventDebounceTime?: number;\n /**\n * select 输入搜索;回调 (keyword, line),不清空 options。\n * 远程搜索时建议同时设 selectOption.hdServerSearch = true。\n * 同样可 return 数组 / Promise / Observable,由组件写回并刷新。\n */\n onSearchEvent?: (keyword: string, line: any) => any;\n /** 搜索防抖(ms);命名对齐 form-lines;未配或 0 同步触发 */\n onSearchEventEventDebounceTime?: number;\n /** InputNumber 配置 */\n inputNumber?: InputNumber;\n /** editType 为 date / dateRange 时的日期配置 */\n dateOption?: HdTableDateOption;\n /** 输入框 / 下拉 / 日期 placeholder;日期范围占位用 dateOption.rangePlaceholder */\n placeholder?: string;\n}\n\n/** hd-table 行内编辑变更事件(乐观更新后抛出,previous* 供接口失败回滚) */\nexport class HdTableCellChange {\n line: any;\n col: HdTableColumn;\n name: string;\n value: any;\n previousValue: any;\n label?: any;\n previousLabel?: any;\n option?: any;\n previousOption?: any;\n}\n\nexport class OperateBtn {\n /** 按钮文案;支持按行动态,如 (line) => line.enabled ? '解除' : '设置' */\n name: string | ((line: any) => 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 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}\n\n/** hd-table 行内日期 / 日期范围 */\nexport class HdTableDateOption {\n /** 日期选择是否带时间;日期范围不使用 */\n showTime?: boolean;\n /** 是否显示「今天」,默认 true;仅日期选择 */\n showToday?: boolean;\n /** 不可选日期,对齐 nzDisabledDate */\n disabledDate?: (current: Date) => boolean;\n /** 显示格式。日期默认 yyyy-MM-dd,带时间默认 yyyy-MM-dd HH:mm:ss;范围默认 yyyy-MM-dd */\n format?: string;\n /** 日期范围占位,默认 ['开始日期', '结束日期'] */\n rangePlaceholder?: Array<string>;\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n SimpleChange,\n TemplateRef,\n ViewChild,\n} from \"@angular/core\";\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 { NzTableComponent } from \"ng-zorro-antd/table\";\nimport { Observable, of, Subject, Subscription } from \"rxjs\";\nimport { debounceTime, delay } from \"rxjs/operators\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\nimport { ColWidth } from \"../model/colWidth\";\nimport { Page } from \"../model/common-type\";\nimport { CommonSessionService } from \"../service/common-session.service\";\nimport {\n getTableScrollXViewportWidth,\n getTableViewportWidth,\n} from \"../utils/hd-table-scroll.util\";\nimport {\n HdTableCellChange,\n HdTableColumn,\n OperateBtn,\n TableCacheOption,\n TreeGrid,\n} from \"./hd-table.service\";\n\n/** 勾选列宽(px),与模板 nzWidth、less 兜底保持一致 */\nconst SELECT_COL_WIDTH = 40;\n\n/** 横向布局计算结果 */\ninterface HdTableHorizontalLayout {\n /** 传给 nzScroll.x;只有列宽总和 <= 0 时为 null */\n scrollX: string | null;\n /** 补到最后一列业务列上的宽度,列多时为 0 */\n fluidExtra: number;\n /** 实际渲染总宽 = 声明总宽 + fluidExtra */\n displayTotal: number;\n /** 列少、靠补宽吃满容器,不需要真正横滚 */\n isFluid: boolean;\n}\n\n/** 列多(或量不到容器宽):scroll.x = 声明总宽,正常横滚 */\nfunction fixedLayout(declaredWidth: number): HdTableHorizontalLayout {\n return {\n scrollX: `${Math.ceil(declaredWidth)}px`,\n fluidExtra: 0,\n displayTotal: declaredWidth,\n isFluid: false,\n };\n}\n\n/** 列少:scroll.x = 容器宽,差额补到最后一列业务列 */\nfunction fluidLayout(\n containerWidth: number,\n declaredWidth: number,\n): HdTableHorizontalLayout {\n const fluidExtra = Math.max(0, containerWidth - declaredWidth);\n return {\n scrollX: `${containerWidth}px`,\n fluidExtra,\n displayTotal: declaredWidth + fluidExtra,\n isFluid: true,\n };\n}\n\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, OnDestroy {\n @Input() uuid: string;\n @Input() tableCols: Array<HdTableColumn> = [];\n @Input() tableData: Page<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n /**\n * 勾选列形态。checkbox:多选(默认);radio:单选,无表头全选,selectEvent 仍回传数组(0 或 1 条)。\n */\n @Input() selectType: \"checkbox\" | \"radio\" = \"checkbox\";\n @Input() @InputBoolean() showOperateColWarpButton: boolean = false;\n /** 是否展示列设置(齿轮),默认开启;弹窗等场景可传 false 关闭 */\n @Input() @InputBoolean() showColSettings: boolean = true;\n @Input() @InputBoolean() virtualScroll: boolean = true;\n /** 手动指定行高;不传则在首屏渲染后自动测量 */\n @Input() virtualItemSize: number;\n @Input() selectField: string = \"billNumber\";\n /**\n * 行勾选禁用字段名。定义后取当前行该字段:\n * 为 true 时禁用该行勾选(全选也会跳过)。\n */\n @Input() selectDisabledField: string;\n /**\n * 行失效字段名。定义后取当前行该字段:\n * 为 true 时整行背景色为 #F7F8FA。\n */\n @Input() rowInvalidField: string;\n // 合计区域(类型与 hd-detail-lines 的 TotalOption 一致)\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<TotalOption>;\n /**\n * 合计列总数(含序号列,与 hd-detail-lines 一致);\n * 不传则按当前可见数据列数 + 1(序号)推算。\n */\n @Input() columnsNumber: number | string;\n @Output() sortEvent = new EventEmitter();\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n /** 行内编辑变更(已写回行对象;previous* 供接口失败回滚) */\n @Output() cellChange = new EventEmitter<HdTableCellChange>();\n @Input() tableLoading: boolean = false;\n /** 是否显示分页;false 时一次展示 tableData.content 全部行 */\n @Input() @InputBoolean() pagination: boolean = true;\n /**\n * 是否前端分页(对 content 全量切片)。\n * true:翻页不触发 tableSearchEvent,适合详情全量数据;\n * false(默认):服务端分页,翻页触发查询(现有列表行为)。\n * 与 pagination=false 同时用时以不分页为准。\n */\n @Input() @InputBoolean() frontPagination: 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 /** 实际渲染列宽合计(含勾选/序号 + 补宽),合计 footer 表宽用 */\n tableColWidthTotal = 0;\n\n /** 补到 fluidExtraTargetCol 上的宽度;只影响展示,不写回 col.width(列宽缓存、拖拽仍用声明宽) */\n fluidExtraWidth = 0;\n\n /** 列少、靠补宽吃满容器:模板据此加 hd-table--fluid-x,隐藏 fixed-header 常驻的横滚槽 */\n fluidHorizontal = false;\n\n /** 接收补宽的列,缓存起来避免模板每个单元格都扫一遍 tableCols */\n private fluidExtraTargetCol: HdTableColumn = null;\n\n /** 数据更新后待复位纵向滚动位置 */\n private pendingResetScrollTop = false;\n\n /** 当前排序,表格重建后用于恢复表头排序态 */\n private currentSortKey: string = null;\n private currentSortValue: string = null;\n\n @ViewChild(\"hdTable\", { static: false }) nzTableComponent: NzTableComponent;\n\n private totalFooterScrollBoundBody: HTMLElement = null;\n private totalFooterScrollHandler: () => void = null;\n private totalFooterSyncRetry = 0;\n\n /** 表体有竖滚条时合计 footer 才预留右侧滚动条槽 */\n totalFooterNeedYGutter = false;\n\n /** 视口/容器尺寸变化时重算 scroll.x 与合计对齐 */\n private viewportResizeTimer: any = null;\n private boundOnViewportResize: () => void = null;\n private hostResizeObserver: any = null;\n\n /** select 展开 / 搜索防抖(对齐 form-lines) */\n private selectOpenChangeSubject = new Subject<{\n fn: (open: boolean, line: any) => any;\n open: boolean;\n line: any;\n col: HdTableColumn;\n }>();\n private selectOpenChangeSubscription: Subscription | undefined;\n private selectSearchSubject = new Subject<{\n fn: (keyword: string, line: any) => any;\n keyword: string;\n line: any;\n col: HdTableColumn;\n }>();\n private selectSearchSubscription: Subscription | undefined;\n /** 异步回写 options 的订阅,避免连点搜索泄漏 */\n private selectLoaderSubscription: Subscription | undefined;\n\n constructor(\n private hostEl: ElementRef,\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 ngOnDestroy(): void {\n this.unbindTotalFooterScrollSync();\n this.unbindViewportResizeSync();\n if (this.selectOpenChangeSubscription) {\n this.selectOpenChangeSubscription.unsubscribe();\n }\n if (this.selectSearchSubscription) {\n this.selectSearchSubscription.unsubscribe();\n }\n if (this.selectLoaderSubscription) {\n this.selectLoaderSubscription.unsubscribe();\n }\n }\n\n /** 供业务在自行写回 options 后触发 OnPush 刷新(优先 return Observable/Promise 由组件处理) */\n markForCheck(): void {\n this.cdr.markForCheck();\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.bindViewportResizeSync();\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[\"selectType\"] &&\n changes[\"selectType\"][\"previousValue\"] != null &&\n changes[\"selectType\"][\"currentValue\"] !==\n changes[\"selectType\"][\"previousValue\"]\n ) {\n this.resetStatus();\n }\n if (\n changes[\"tableData\"] ||\n changes[\"tableTotalOption\"] ||\n changes[\"showTableTotal\"] ||\n changes[\"columnsNumber\"] ||\n changes[\"tableCols\"]\n ) {\n this.calculateTableTotal();\n }\n\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.pendingResetScrollTop = true;\n // 业务可能把 Page.pageSize 写成 content.length,换数据时就会走到这里,\n // 必须重算横向布局。滚动模式不变时不会重建,排序态不会被清掉。\n this.applyTableScrollMode(false);\n // 翻页/改 pageSize:主动多次复位,覆盖 CDK 异步渲染时序\n this.scheduleResetTableBodyScrollTop();\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n if (changes[\"tableData\"]) {\n this.pendingResetScrollTop = true;\n // 不论是否虚拟滚动,数据变化后都要重算横向布局\n this.applyTableScrollMode(false);\n // 数据更新后复位纵向滚动(含虚拟滚动场景)\n this.scheduleResetTableBodyScrollTop();\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 if (\n (changes[\"pagination\"] && !changes[\"pagination\"].firstChange) ||\n (changes[\"frontPagination\"] && !changes[\"frontPagination\"].firstChange)\n ) {\n // 分页模式切换需重建 nz-table(front / server / none)\n this.tablePageIndex = 1;\n this.applyTableScrollMode(true);\n this.cdr.markForCheck();\n }\n }\n\n /** 是否走前端分页(对 content 切片,不请求后端) */\n get useFrontPagination(): boolean {\n return !!this.pagination && !!this.frontPagination;\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.currentSortKey = sort && sort.key;\n this.currentSortValue = sort && sort.value;\n this.sortEvent.emit(sort);\n }\n\n getColSort(col: HdTableColumn): string | null {\n if (!col || !col.canSort || !this.currentSortKey) {\n return null;\n }\n return col.name === this.currentSortKey ? this.currentSortValue : null;\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 * 纵向可用高度扣减:按钮区/合计/分页等固定占位。\n * 必须与 dealScroll / presetScrollBeforeRemount 使用同一套,否则会误判「能放下」而不设 scroll.y。\n */\n private getScrollYMaxOffset(): number {\n return (this.tableTotal ? 180 : 140) + 216;\n }\n\n /**\n * 当前视口实际展示的行数。\n * 前端分页按 pageIndex/pageSize 切片估算,避免用全量 length 误判需要纵向滚动。\n */\n private getVisibleRowCount(): number {\n const content =\n this.tableData && this.tableData.content ? this.tableData.content : [];\n const total = content.length;\n if (!this.useFrontPagination) {\n return total;\n }\n if (total <= 0) {\n return 0;\n }\n const pageSize =\n Number(this.tablePageSize) > 0 ? Number(this.tablePageSize) : 10;\n const pageIndex =\n Number(this.tablePageIndex) > 0 ? Number(this.tablePageIndex) : 1;\n const start = (pageIndex - 1) * pageSize;\n if (start >= total) {\n return 0;\n }\n return Math.min(pageSize, total - start);\n }\n\n /** 当前页内容高度是否超出视口(需要表内纵向滚动) */\n get needsVerticalScroll(): boolean {\n const rowCount = this.getVisibleRowCount();\n if (rowCount <= 0) {\n return false;\n }\n const maxOffset = this.getScrollYMaxOffset();\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 /** 当前页数据能完整展示时不启用虚拟滚动,避免少量数据也出现滚动条 */\n get useVirtualScroll(): boolean {\n if (!this.virtualScroll) {\n return false;\n }\n return this.needsVerticalScroll;\n }\n\n getRightSticky(col: HdTableColumn): string | null {\n return col.fixed === \"right\" ? `${col.fixedRightWidth || 0}px` : null;\n }\n\n getLeftSticky(col: HdTableColumn): string | null {\n return col.fixed === \"left\" ? `${col.fixedWidth || 0}px` : null;\n }\n\n /**\n * 序号列固定宽(含 padding,可容纳 6 位如 199995)。\n * 不锁死时表体会随位数变宽(1→~64px,199995→~67px),合计行对不齐。\n */\n readonly lineNumberColWidth = 72;\n\n /** 开启合计时序号列的 left(跟在勾选列后面) */\n get lineNumberLeft(): string {\n return (this.showSelected ? SELECT_COL_WIDTH : 0) + \"px\";\n }\n\n get lineNumberColWidthPx(): string {\n return this.lineNumberColWidth + \"px\";\n }\n\n /**\n * 无 scroll.x 时合计走 fluid(width:100%)。\n * 列少时也会设 scroll.x(补宽吃满),合计走固定表宽。\n */\n get isTotalFooterFluid(): boolean {\n return !(this.scroll && this.scroll.x);\n }\n\n private isColVisible(col: HdTableColumn): boolean {\n return !!col && col.isShow !== false;\n }\n\n /** 业务列声明宽:未配置时按 fixColWidth */\n private getColDeclaredWidth(col: HdTableColumn): number {\n return col && col.width > 0 ? col.width : ColWidth.fixColWidth;\n }\n\n /** 声明列宽合计:勾选列 + 序号列 + 可见业务列,不含补宽 */\n private getDeclaredColWidthTotal(): number {\n let total = 0;\n if (this.showSelected) {\n total += SELECT_COL_WIDTH;\n }\n if (this.showTableTotal) {\n total += this.lineNumberColWidth;\n }\n (this.tableCols || []).forEach((col) => {\n if (this.isColVisible(col)) {\n total += this.getColDeclaredWidth(col);\n }\n });\n return total;\n }\n\n /** 模板里 th / td / 合计 col 用的列宽:补宽目标列 = 声明宽 + fluidExtraWidth */\n getColDisplayWidth(col: HdTableColumn): number {\n const declared = this.getColDeclaredWidth(col);\n if (this.fluidExtraWidth > 0 && col && col === this.fluidExtraTargetCol) {\n return declared + this.fluidExtraWidth;\n }\n return declared;\n }\n\n /**\n * 选出接收补宽的列:优先最后一列「非右侧固定」的可见列,\n * 避免把操作列等右固定列拉宽;全是右固定列时退回最后一列可见列。\n */\n private findFluidExtraTargetCol(): HdTableColumn {\n const cols = this.tableCols || [];\n let lastVisible: HdTableColumn = null;\n for (let i = cols.length - 1; i >= 0; i--) {\n const col = cols[i];\n if (!this.isColVisible(col)) {\n continue;\n }\n if (col.fixed !== \"right\") {\n return col;\n }\n if (!lastVisible) {\n lastVisible = col;\n }\n }\n return lastVisible;\n }\n\n /** 把横向布局结果写回组件状态(dealScroll / syncHorizontalScroll 共用) */\n private applyHorizontalLayout(layout: HdTableHorizontalLayout): void {\n this.fluidExtraWidth = layout.fluidExtra;\n this.fluidHorizontal = layout.isFluid;\n this.fluidExtraTargetCol =\n layout.fluidExtra > 0 ? this.findFluidExtraTargetCol() : null;\n this.tableColWidthTotal = layout.displayTotal;\n }\n\n /** fluid → 100%;固定 → scroll.x(与表体同一套横向宽度) */\n get totalFooterTableWidth(): string {\n if (this.isTotalFooterFluid) {\n return \"100%\";\n }\n return this.scroll && this.scroll.x\n ? String(this.scroll.x)\n : this.tableColWidthTotal > 0\n ? this.tableColWidthTotal + \"px\"\n : \"100%\";\n }\n\n /** 当前页行号(跨页连续,从 1 开始) */\n getLineNumber(index: number): number {\n const page =\n Number(this.tablePageIndex) > 0 ? Number(this.tablePageIndex) : 1;\n const size =\n Number(this.tablePageSize) > 0 ? Number(this.tablePageSize) : 0;\n const rowIndex = Number(index) >= 0 ? Number(index) : 0;\n return (page - 1) * size + rowIndex + 1;\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.pagination &&\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 // 服务端分页才在初始化时抛 pageSizeChangeEvent 触发父查询;前端分页不抛\n if (\n this.pagination &&\n !this.frontPagination &&\n this.isFirstEntrySearchLocal\n ) {\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 // 必须先写好 scroll.y,再创建 nz-table。\n // ng-zorro 只在 AfterViewInit 绑一次 header/body 的 scroll 同步;\n // 若先以 y=null 创建再改成有 y,表头监听会丢,表现为列头不跟着横滚。\n this.presetScrollBeforeRemount(useVirtual);\n this.remountTable(useVirtual);\n return;\n }\n\n const prevHasX = !!(this.scroll && this.scroll.x);\n const prevHasY = !!(this.scroll && this.scroll.y);\n this.dealScroll();\n const nextHasX = !!(this.scroll && this.scroll.x);\n const nextHasY = !!(this.scroll && this.scroll.y);\n // scroll.x / scroll.y 从无到有(或反过来)时必须重建,原地改值不生效:\n // - y:ng-zorro 8 只在 AfterViewInit 绑一次表头/表体滚动同步,且决定表头是否拆成独立 table\n // - x:决定是否带 ant-table-fixed(table-layout: fixed),勾选列锁宽依赖它\n if (prevHasY !== nextHasY || prevHasX !== nextHasX) {\n this.remountTable(useVirtual);\n return;\n }\n\n this.cdr.markForCheck();\n this.afterTableRender(useVirtual);\n }\n\n /** 销毁并重建 nz-table:等 DOM 出来后再按真实容器宽重算一次横向布局 */\n private remountTable(useVirtual: boolean): void {\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 }\n\n /** 重建前预设 scroll,保证 AfterViewInit 时 header/body 结构已正确 */\n private presetScrollBeforeRemount(useVirtual: boolean): void {\n const maxOffset = this.getScrollYMaxOffset();\n const x = this.scroll ? this.scroll.x : null;\n if (this.virtualScroll && !useVirtual) {\n this.scroll = { x, y: null };\n return;\n }\n this.scroll = {\n x,\n y: `calc(100vh - ${maxOffset}px)`,\n };\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 // 实测行高后可能从「能放下」变为「超出」,需切换滚动模式\n if (this.useVirtualScroll) {\n this.applyTableScrollMode(false);\n return;\n }\n }\n setTimeout(() => {\n this.syncHorizontalScroll();\n this.flushResetTableBodyScrollTop();\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 this.flushResetTableBodyScrollTop();\n return;\n }\n setTimeout(() => {\n const viewport =\n this.nzTableComponent && this.nzTableComponent.cdkVirtualScrollViewport;\n if (!viewport) {\n this.syncHorizontalScroll();\n this.flushResetTableBodyScrollTop();\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.syncHorizontalScroll();\n viewport.checkViewportSize();\n this.flushResetTableBodyScrollTop();\n });\n } else {\n viewport.checkViewportSize();\n this.syncHorizontalScroll();\n this.flushResetTableBodyScrollTop();\n }\n });\n }\n\n /** 数据刷新后将表体纵向滚动复位到顶部 */\n private resetTableBodyScrollTop(): void {\n if (!this.nzTableComponent) {\n return;\n }\n const nzTable = this.nzTableComponent as any;\n const viewport = this.nzTableComponent.cdkVirtualScrollViewport;\n if (viewport) {\n if (typeof (viewport as any).scrollToOffset === \"function\") {\n (viewport as any).scrollToOffset(0);\n }\n if (typeof (viewport as any).scrollToIndex === \"function\") {\n (viewport as any).scrollToIndex(0);\n }\n const viewportEl =\n viewport.elementRef &&\n (viewport.elementRef.nativeElement as HTMLElement);\n if (viewportEl) {\n viewportEl.scrollTop = 0;\n }\n }\n const bodyCandidates = [\n nzTable.mixTableBodyNativeElement,\n nzTable.tableBodyNativeElement,\n nzTable.tableBodyElement && nzTable.tableBodyElement.nativeElement,\n ];\n bodyCandidates.forEach((el: HTMLElement) => {\n if (el) {\n el.scrollTop = 0;\n }\n });\n const tableMain =\n nzTable.tableMainElement &&\n (nzTable.tableMainElement.nativeElement as HTMLElement);\n if (!tableMain) {\n return;\n }\n const nodes = tableMain.querySelectorAll(\n \".ant-table-body, cdk-virtual-scroll-viewport\",\n );\n Array.prototype.forEach.call(nodes, (el: HTMLElement) => {\n el.scrollTop = 0;\n });\n }\n\n /**\n * 数据更新后多次尝试复位。\n * ng-zorro 8 + CDK 虚拟滚动会在数据刷新后异步改写 scrollTop,单次复位经常被覆盖。\n */\n private scheduleResetTableBodyScrollTop(): void {\n // 多次尝试:覆盖 nz-table / CDK 虚拟滚动异步改写 scrollTop\n const delays = [0, 50, 100];\n delays.forEach((ms, index) => {\n setTimeout(() => {\n this.resetTableBodyScrollTop();\n if (index === delays.length - 1) {\n this.pendingResetScrollTop = false;\n }\n }, ms);\n });\n }\n\n private flushResetTableBodyScrollTop(): void {\n if (!this.pendingResetScrollTop) {\n return;\n }\n this.resetTableBodyScrollTop();\n }\n\n /** 未手动传 virtualItemSize 时,从已渲染行测量真实高度 */\n measureVirtualItemSize(force = false): boolean {\n if (this.virtualItemSize != null && this.virtualItemSize > 0 && !force) {\n return false;\n }\n const viewport =\n this.nzTableComponent && this.nzTableComponent.cdkVirtualScrollViewport;\n const tableBody =\n 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 !!(\n this.tableCacheOption &&\n this.tableCacheOption.cols &&\n this.tableCacheOption.cols.length > 0\n );\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 setTimeout(() => this.syncTotalFooterWithBody());\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 += typeof btn.name === \"function\" ? \"操作\" : 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 getBtnName(btn: OperateBtn, data: any): string {\n if (typeof btn.name === \"function\") {\n return btn.name(data) || \"\";\n }\n return btn.name != null ? String(btn.name) : \"\";\n }\n\n isDangerBtn(btn: OperateBtn, data: any): boolean {\n return this.getBtnName(btn, data) === \"删除\";\n }\n\n /** 虚拟滚动开启时使用视口最大高度 */\n private getVirtualScrollY(maxOffset: number): string {\n return `calc(100vh - ${maxOffset}px)`;\n }\n\n /*\n * 横向布局(勾选列锁 40px 的关键)\n *\n * 勾选列只有在 table-layout: fixed 下才锁得住:ng-zorro 8 仅在 nzScroll.x 有值时\n * 给 table 加 ant-table-fixed;auto 布局下 table 宽 100%、每列都有 nzWidth,\n * 剩余空间会按比例摊到所有列(含勾选列),单元格上的 max-width 也不生效。\n * 所以只要有列(无论有没有数据)就一定设置 scroll.x:\n * - 列少:scroll.x = 容器宽,差额补到最后一列业务列(fluid,不出真横滚)\n * - 列多:scroll.x = 声明总宽,正常横滚\n * less 里勾选列的 40px 只是 fixed 布局下的兜底。\n */\n\n /**\n * 按声明列宽合计 + 容器宽算出横向布局。\n * 判断「是否超宽」用 offsetWidth(含竖滚条槽),避免只因竖滚条就误开横滚;\n * 补宽目标用 clientWidth 并向下取整,避免表宽多 1px 逼出横滚条。\n */\n private resolveHorizontalLayout(\n declaredColWidth: number,\n ): HdTableHorizontalLayout {\n if (declaredColWidth <= 0) {\n return {\n scrollX: null,\n fluidExtra: 0,\n displayTotal: declaredColWidth,\n isFluid: false,\n };\n }\n let compareWidth = this.nzTableComponent\n ? getTableScrollXViewportWidth(this.nzTableComponent)\n : 0;\n // 表体还没渲染出来(刚重建 / 在 spin 里)时用宿主宽兜底\n if (compareWidth <= 0 && this.hostEl && this.hostEl.nativeElement) {\n compareWidth = (this.hostEl.nativeElement as HTMLElement).offsetWidth;\n }\n // 仍量不到(如宿主在 display:none 里):先按声明宽走 fixed,等 ResizeObserver 触发再转 fluid\n if (compareWidth <= 0) {\n return fixedLayout(declaredColWidth);\n }\n // 1px 容差,避免亚像素误判\n if (declaredColWidth > compareWidth + 1) {\n return fixedLayout(declaredColWidth);\n }\n const fillWidth = this.nzTableComponent\n ? getTableViewportWidth(this.nzTableComponent)\n : 0;\n const containerWidth = Math.floor(fillWidth > 0 ? fillWidth : compareWidth);\n return fluidLayout(containerWidth, declaredColWidth);\n }\n\n /** 表格渲染后按真实容器宽校正横向布局;只改 x,y 保持不变 */\n private syncHorizontalScroll(): void {\n const prevHasX = !!(this.scroll && this.scroll.x);\n const layout = this.resolveHorizontalLayout(\n this.getDeclaredColWidthTotal(),\n );\n const unchanged =\n this.scroll &&\n this.scroll.x === layout.scrollX &&\n this.fluidExtraWidth === layout.fluidExtra &&\n this.fluidHorizontal === layout.isFluid;\n if (unchanged) {\n setTimeout(() => this.syncTotalFooterWithBody());\n return;\n }\n this.applyHorizontalLayout(layout);\n this.scroll = { x: layout.scrollX, y: this.scroll ? this.scroll.y : null };\n this.cdr.markForCheck();\n // x 从无到有(或反过来)要重建才能切换 table-layout\n if (prevHasX !== !!layout.scrollX) {\n this.applyTableScrollMode(true);\n return;\n }\n setTimeout(() => this.syncHeaderBodyScrollLeft());\n }\n\n /** 手动把表体横向滚动同步到表头 / 合计 footer(兜底 ng-zorro 监听丢失的情况) */\n private syncHeaderBodyScrollLeft(): void {\n if (!this.nzTableComponent) {\n return;\n }\n const header = (this.nzTableComponent as any)\n .tableHeaderNativeElement as HTMLElement | null;\n const body = this.getTableBodyScrollEl();\n if (this.scroll && this.scroll.x && header && body) {\n if (header.scrollLeft !== body.scrollLeft) {\n header.scrollLeft = body.scrollLeft;\n }\n }\n this.syncTotalFooterWithBody();\n }\n\n /** 取表体横向滚动容器(虚拟滚动优先 viewport) */\n private getTableBodyScrollEl(): HTMLElement | null {\n if (!this.nzTableComponent) {\n return null;\n }\n const mix = (this.nzTableComponent as any)\n .mixTableBodyNativeElement as HTMLElement | null;\n if (mix) {\n return mix;\n }\n const host = this.hostEl && (this.hostEl.nativeElement as HTMLElement);\n if (!host) {\n return null;\n }\n return (\n (host.querySelector(\n \"cdk-virtual-scroll-viewport.ant-table-body\",\n ) as HTMLElement) ||\n (host.querySelector(\".ant-table-body\") as HTMLElement) ||\n null\n );\n }\n\n private getTotalFooterScrollEl(): HTMLElement | null {\n const host = this.hostEl && (this.hostEl.nativeElement as HTMLElement);\n return host\n ? (host.querySelector(\".hd-table-total-footer\") as HTMLElement)\n : null;\n }\n\n /** 表体是否出现纵向滚动条(含滚动条槽宽) */\n private bodyHasVerticalScrollbar(body: HTMLElement): boolean {\n if (!body) {\n return false;\n }\n return (\n body.scrollHeight > body.clientHeight + 1 ||\n body.offsetWidth - body.clientWidth > 1\n );\n }\n\n /**\n * 合计 footer 与表体联动:\n * - fluid(列未撑满):不横滚、不测宽,表宽 100% 与表体同比例拉伸;\n * - fixed(有 scroll.x):同步 scrollLeft;\n * - 仅当表体有竖滚条时预留右侧槽,行少无竖滚时不占位。\n */\n private syncTotalFooterWithBody(): void {\n if (!this.showTableTotal) {\n this.unbindTotalFooterScrollSync();\n if (this.totalFooterNeedYGutter) {\n this.totalFooterNeedYGutter = false;\n this.cdr.markForCheck();\n }\n return;\n }\n const footer = this.getTotalFooterScrollEl();\n const body = this.getTableBodyScrollEl();\n if (!footer) {\n if (this.totalFooterSyncRetry < 10) {\n this.totalFooterSyncRetry++;\n setTimeout(() => this.syncTotalFooterWithBody(), 50);\n }\n return;\n }\n this.totalFooterSyncRetry = 0;\n const needYGutter = !!(body && this.bodyHasVerticalScrollbar(body));\n if (this.totalFooterNeedYGutter !== needYGutter) {\n this.totalFooterNeedYGutter = needYGutter;\n this.cdr.markForCheck();\n }\n if (this.isTotalFooterFluid) {\n this.unbindTotalFooterScrollSync();\n footer.scrollLeft = 0;\n return;\n }\n if (body) {\n this.syncTotalFooterScrollLeft(body.scrollLeft);\n this.bindTotalFooterScrollSync(body);\n }\n }\n\n private syncTotalFooterScrollLeft(scrollLeft: number): void {\n const footer = this.getTotalFooterScrollEl();\n if (footer && footer.scrollLeft !== scrollLeft) {\n footer.scrollLeft = scrollLeft;\n }\n }\n\n private bindTotalFooterScrollSync(body: HTMLElement): void {\n if (!this.showTableTotal || !body || this.isTotalFooterFluid) {\n return;\n }\n if (\n this.totalFooterScrollBoundBody === body &&\n this.totalFooterScrollHandler\n ) {\n return;\n }\n this.unbindTotalFooterScrollSync();\n this.totalFooterScrollBoundBody = body;\n this.totalFooterScrollHandler = () => {\n this.syncTotalFooterScrollLeft(body.scrollLeft);\n };\n body.addEventListener(\"scroll\", this.totalFooterScrollHandler, {\n passive: true,\n } as any);\n }\n\n private unbindTotalFooterScrollSync(): void {\n if (this.totalFooterScrollBoundBody && this.totalFooterScrollHandler) {\n this.totalFooterScrollBoundBody.removeEventListener(\n \"scroll\",\n this.totalFooterScrollHandler,\n );\n }\n this.totalFooterScrollBoundBody = null;\n this.totalFooterScrollHandler = null;\n }\n\n /**\n * 监听窗口 / 容器宽度变化:重新判定 scroll.x(fluid↔fixed)与合计右侧竖滚槽,\n * 避免拉宽/缩窄屏幕后合计行宽与表体错位。\n */\n private bindViewportResizeSync(): void {\n this.boundOnViewportResize = () => this.scheduleViewportScrollSync();\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.boundOnViewportResize);\n }\n const RO =\n typeof window !== \"undefined\" ? (window as any).ResizeObserver : null;\n if (RO && this.hostEl && this.hostEl.nativeElement) {\n this.hostResizeObserver = new RO(() => this.scheduleViewportScrollSync());\n this.hostResizeObserver.observe(this.hostEl.nativeElement);\n }\n }\n\n private unbindViewportResizeSync(): void {\n if (this.boundOnViewportResize && typeof window !== \"undefined\") {\n window.removeEventListener(\"resize\", this.boundOnViewportResize);\n }\n this.boundOnViewportResize = null;\n if (this.hostResizeObserver) {\n this.hostResizeObserver.disconnect();\n this.hostResizeObserver = null;\n }\n if (this.viewportResizeTimer != null) {\n clearTimeout(this.viewportResizeTimer);\n this.viewportResizeTimer = null;\n }\n }\n\n private scheduleViewportScrollSync(): void {\n if (this.viewportResizeTimer != null) {\n clearTimeout(this.viewportResizeTimer);\n }\n this.viewportResizeTimer = setTimeout(() => {\n this.viewportResizeTimer = null;\n if (!this.tableCols || !this.tableCols.length) {\n return;\n }\n this.syncHorizontalScroll();\n // 等表体布局稳定后再校合计竖滚槽 / 横滚同步\n setTimeout(() => this.syncTotalFooterWithBody(), 50);\n }, 100);\n }\n\n dealScroll() {\n // 左侧固定列:从左往右累计偏移(勾选列、序号列在最前面)\n let leftOffset = 0;\n if (this.showSelected) {\n leftOffset += SELECT_COL_WIDTH;\n }\n if (this.showTableTotal) {\n leftOffset += this.lineNumberColWidth;\n }\n this.tableCols.forEach((item) => {\n if (!item.width) {\n item.width = ColWidth.fixColWidth;\n }\n if (this.isColVisible(item)) {\n item.fixedWidth = leftOffset;\n leftOffset += item.width;\n }\n });\n\n // 右侧固定列:从右往左累计偏移,避免多列都 right:0 互相遮挡\n let rightOffset = 0;\n for (let i = this.tableCols.length - 1; i >= 0; i--) {\n const item = this.tableCols[i];\n if (!this.isColVisible(item)) {\n continue;\n }\n if (item.fixed === \"right\") {\n item.fixedRightWidth = rightOffset;\n rightOffset += item.width;\n } else {\n item.fixedRightWidth = 0;\n }\n }\n\n const layout = this.resolveHorizontalLayout(\n this.getDeclaredColWidthTotal(),\n );\n this.applyHorizontalLayout(layout);\n const maxOffset = this.getScrollYMaxOffset();\n const useVirtual = this.useVirtualScroll;\n const scrollX = layout.scrollX;\n\n if (this.virtualScroll && !useVirtual) {\n this.scroll = {\n x: scrollX,\n y: null,\n };\n return;\n }\n\n if (!this.virtualScroll) {\n this.scroll = {\n x: scrollX,\n y: `calc(100vh - ${maxOffset}px)`,\n };\n return;\n }\n\n this.scroll = {\n x: scrollX,\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 if (!this.pagination) {\n return;\n }\n // 前端分页:只同步页码/条数,不触发父组件查询\n if (this.frontPagination) {\n if (reset) {\n this.tablePageIndex = 1;\n this.tablePageSizeChange.emit(this.tablePageSize);\n } else {\n this.tablePageIndexChange.emit(this.tablePageIndex);\n }\n this.tableCacheOption.pageSize = this.tablePageSize;\n this.saveTableCacheOption();\n // 按当前页行数重算是否需要 scroll.y(末页数据少时去掉固定高度,避免留白)\n this.pendingResetScrollTop = true;\n this.applyTableScrollMode(false);\n this.scheduleResetTableBodyScrollTop();\n this.cdr.markForCheck();\n return;\n }\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 /**\n * 底部合计:与 hd-detail-lines 相同,使用 TotalOption(insertIndex / insertValue)。\n * 开启后强制展示序号列,「合计」落在序号列下;\n * insertIndex 从 1 起对应可见数据列;未传 insertValue 时按该列 name 对 content 求和。\n */\n calculateTableTotal() {\n if (\n !this.showTableTotal ||\n !this.tableTotalOption ||\n !this.tableTotalOption.length\n ) {\n this.tableTotalOptionList = [];\n return;\n }\n const visibleCols = (this.tableCols || []).filter(\n (c) => c && c.isShow !== false,\n );\n // columnsNumber 含序号列(与 detail-lines 一致),数据槽位数 = columnsNumber - 1\n const configured = Number(this.columnsNumber);\n const columnNumber =\n configured > 1\n ? configured - 1\n : configured === 1\n ? 1\n : visibleCols.length;\n if (!columnNumber || columnNumber < 1) {\n this.tableTotalOptionList = [];\n return;\n }\n this.tableTotalOptionList = new Array(columnNumber).fill(\"\");\n const content =\n this.tableData && this.tableData.content ? this.tableData.content : [];\n this.tableTotalOption.forEach((item) => {\n if (item == null || !item.insertIndex || item.insertIndex < 1) {\n return;\n }\n let value: any = item.insertValue;\n // 未传 insertValue 时:按 insertIndex 对应可见列 name 自动求和\n if (value == null || value === \"\") {\n const col = visibleCols[item.insertIndex - 1];\n const field = col && typeof col.name === \"string\" ? col.name : null;\n if (!field) {\n return;\n }\n let sum = 0;\n let hasValue = false;\n content.forEach((row) => {\n const raw = row ? row[field] : null;\n if (raw == null || raw === \"\") {\n return;\n }\n const num = Number(raw);\n if (!isNaN(num)) {\n sum += num;\n hasValue = true;\n }\n });\n if (!hasValue) {\n return;\n }\n value = sum;\n }\n const colAtIndex = visibleCols[item.insertIndex - 1];\n this.tableTotalOptionList[item.insertIndex - 1] = {\n value,\n align: item.align || (colAtIndex && colAtIndex.align) || \"left\",\n showDecimal: item.showDecimal || false,\n preserveNumber: item.preserveNumber != null ? item.preserveNumber : 2,\n isHide: item.isHide || false,\n };\n });\n }\n\n private getTableTotalCellMeta(col: HdTableColumn, colIndex: number): any {\n if (\n !col ||\n !this.tableTotalOptionList ||\n !this.tableTotalOptionList.length\n ) {\n return null;\n }\n let visibleIndex = -1;\n for (let i = 0; i <= colIndex; i++) {\n const c = this.tableCols[i];\n if (c && c.isShow !== false) {\n visibleIndex++;\n }\n }\n if (visibleIndex < 0 || visibleIndex >= this.tableTotalOptionList.length) {\n return null;\n }\n const meta = this.tableTotalOptionList[visibleIndex];\n return meta && typeof meta === \"object\" ? meta : null;\n }\n\n /** 合计单元格展示文案(对齐 detail-lines 小数规则) */\n getTableTotalCellValue(col: HdTableColumn, colIndex: number): any {\n const meta = this.getTableTotalCellMeta(col, colIndex);\n if (!meta || meta.isHide) {\n return \"\";\n }\n const value = meta.value;\n if (!(value || value === 0)) {\n return \"\";\n }\n const preserve =\n meta.preserveNumber != null ? Number(meta.preserveNumber) : 2;\n if (value % 1 === 0 && !meta.showDecimal) {\n return value;\n }\n const factor = Math.pow(10, preserve);\n return (Math.round(Number(value) * factor) / factor).toFixed(preserve);\n }\n\n getTableTotalCellAlign(col: HdTableColumn, colIndex: number): string {\n const meta = this.getTableTotalCellMeta(col, colIndex);\n const align = (meta && meta.align) || (col && col.align) || \"left\";\n if (align === \"right\" || align === \"center\" || align === \"left\") {\n return align;\n }\n return \"left\";\n }\n\n /** 底部「共 n 条」:非分页/前端分页用 content.length,服务端分页用 totalElements */\n getTableTotalCount(): number {\n if (!this.tableData) {\n return 0;\n }\n if (!this.pagination || this.frontPagination) {\n return this.tableData.content ? this.tableData.content.length : 0;\n }\n return this.tableData.totalElements != null\n ? this.tableData.totalElements\n : 0;\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n // 先显式置 false,避免 nz-checkbox 内部状态与 mapOfCheckedId 不同步(虚拟滚动复用行时常见)\n Object.keys(this.mapOfCheckList).forEach((key) => {\n this.mapOfCheckedId[key] = false;\n });\n this.listOfDisplayData.forEach((item) => {\n const key = item[this.selectField];\n if (key != null) {\n this.mapOfCheckedId[key] = false;\n }\n });\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n this.cdr.markForCheck();\n }\n\n /** 单选:选中当前行并清掉其它行;忽略 radio 因切换而发出的 false */\n onRadioSelect(checked: boolean, data: any): void {\n if (!checked || !data) {\n this.cdr.markForCheck();\n return;\n }\n if (this.isSelectDisabled(data)) {\n this.cdr.markForCheck();\n return;\n }\n const key = data[this.selectField];\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n if (key != null) {\n this.mapOfCheckedId[key] = true;\n this.mapOfCheckList[key] = data;\n }\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n if (this.selectEvent) {\n this.selectEvent.emit(key != null ? [data] : []);\n }\n this.cdr.markForCheck();\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (this.selectType === \"radio\") {\n if (data) {\n this.onRadioSelect(event, data);\n }\n return;\n }\n if (data) {\n // 禁用行不允许勾选;取消勾选仍允许(例如数据变更前已勾选)\n if (event && this.isSelectDisabled(data)) {\n this.cdr.markForCheck();\n return;\n }\n this.mapOfCheckedId[data[this.selectField]] = event;\n if (event) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n }\n const selectableList = this.listOfDisplayData.filter(\n (item) => !this.isSelectDisabled(item),\n );\n this.isAllDisplayDataChecked =\n selectableList.length > 0 &&\n selectableList.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n selectableList.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 // 全选/取消全选均跳过禁用行(禁用行保持原勾选状态)\n if (this.isSelectDisabled(item)) {\n return;\n }\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 /** 当前行是否禁用勾选 */\n isSelectDisabled(data: any): boolean {\n return !!(\n this.selectDisabledField &&\n data &&\n data[this.selectDisabledField] === true\n );\n }\n\n /** 当前行是否失效 */\n isInvalidRow(data: any): boolean {\n return !!(\n this.rowInvalidField &&\n data &&\n data[this.rowInvalidField] === true\n );\n }\n\n /**\n * 列文字颜色:color 为函数时按行计算(用于某一行某一列标红),否则整列同色。\n */\n resolveCellColor(col: HdTableColumn, data: any): string {\n if (!col || col.color == null || col.color === \"\") {\n return null;\n }\n if (typeof col.color === \"function\") {\n const value = col.color(data);\n return value || null;\n }\n return col.color;\n }\n\n /** 可点击单元格颜色:空值固定灰,否则按列 color */\n getLinkCellColor(col: HdTableColumn, data: any, isEmpty: boolean): string {\n if (isEmpty) {\n return \"#2A3634\";\n }\n return this.resolveCellColor(col, data);\n }\n\n /** 普通文本单元格颜色:失效行统一灰,否则用列配置 color */\n getPlainCellColor(col: HdTableColumn, data: any): string {\n if (this.isInvalidRow(data)) {\n return \"#868A9C\";\n }\n return this.resolveCellColor(col, data);\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 /** 字段值后是否展示竖线行号 */\n hasRowNo(col: HdTableColumn): boolean {\n return !!(\n col &&\n (col.rowNo === true || (typeof col.rowNo === \"string\" && col.rowNo))\n );\n }\n\n /**\n * 行号文案。rowNo 为字段名时取行数据;为 true 时按当前页序号(跨页连续,从 1 开始)。\n */\n getRowNoText(col: HdTableColumn, data: any, index: number): string {\n if (!this.hasRowNo(col)) {\n return \"\";\n }\n if (typeof col.rowNo === \"string\") {\n const value = data ? data[col.rowNo] : null;\n if (value == null || value === \"\") {\n return \"\";\n }\n return String(value);\n }\n const page =\n Number(this.tablePageIndex) > 0 ? Number(this.tablePageIndex) : 1;\n const size =\n Number(this.tablePageSize) > 0 ? Number(this.tablePageSize) : 0;\n const rowIndex = Number(index) >= 0 ? Number(index) : 0;\n return String((page - 1) * size + rowIndex + 1);\n }\n\n /** 表头「配送单号 | 行」拆成短竖线,避免字符 | 拉满行高 */\n getTitleParts(col: HdTableColumn): Array<string> {\n if (\n !this.hasRowNo(col) ||\n !col ||\n !col.title ||\n String(col.title).indexOf(\"|\") < 0\n ) {\n return null;\n }\n const raw = String(col.title).split(\"|\");\n if (raw.length < 2) {\n return null;\n }\n return [raw[0].trim(), raw.slice(1).join(\"|\").trim()];\n }\n\n /** 是否显示编辑笔图标(有 editType 时走行内控件,不再显示笔) */\n isEditable(col: HdTableColumn, data: any): boolean {\n if (!col || this.hasInlineEdit(col)) {\n return false;\n }\n if (col.editable == null || col.editable === false) {\n return false;\n }\n if (typeof col.editable === \"function\") {\n return !!col.editable(data);\n }\n return !!col.editable;\n }\n\n /** 点击编辑笔,回调父组件传入的 edit */\n onEditClick(event: Event, col: HdTableColumn, data: any): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.triggerEvent(col.edit || null, data);\n }\n\n /** 列是否配置了可用的行内编辑(name 必须是 string) */\n hasInlineEdit(col: HdTableColumn): boolean {\n if (!col || !col.editType) {\n return false;\n }\n if (typeof col.name !== \"string\" || !col.name) {\n console.warn(\n \"[hd-table] editType 要求 name 为 string,列「\" +\n (col.title || \"\") +\n \"」已回退只读\",\n );\n return false;\n }\n return true;\n }\n\n isEditDisabled(col: HdTableColumn, data: any): boolean {\n if (!col || col.editDisabled == null || col.editDisabled === false) {\n return false;\n }\n if (typeof col.editDisabled === \"function\") {\n return !!col.editDisabled(data);\n }\n return !!col.editDisabled;\n }\n\n getSelectList(col: HdTableColumn, data: any): Array<any> {\n if (!col || !col.selectOption) {\n return [];\n }\n const opt = col.selectOption;\n if (opt.selectListName && data) {\n const list = data[opt.selectListName];\n return Array.isArray(list) ? list : [];\n }\n return Array.isArray(opt.selectList) ? opt.selectList : [];\n }\n\n getSelectOptionLabel(col: HdTableColumn, item: any): string {\n if (!col || !col.selectOption || !item) {\n return \"\";\n }\n const opt = col.selectOption;\n const value = item[opt.value];\n const label = item[opt.label];\n if (opt.showLabelAndValue || opt.hdShowItemCode) {\n return `[${value == null ? \"\" : value}]${label == null ? \"\" : label}`;\n }\n return label == null ? \"\" : String(label);\n }\n\n getInputNumberProp(\n col: HdTableColumn,\n key: \"min\" | \"max\" | \"step\" | \"precision\",\n fallback: number,\n ): number {\n if (!col || !col.inputNumber) {\n return fallback;\n }\n const val = col.inputNumber[key];\n return val != null ? Number(val) : fallback;\n }\n\n isDateShowTime(col: HdTableColumn): boolean {\n return !!(col && col.dateOption && col.dateOption.showTime);\n }\n\n isDateShowToday(col: HdTableColumn): boolean {\n if (!col || !col.dateOption || col.dateOption.showToday == null) {\n return true;\n }\n return col.dateOption.showToday !== false;\n }\n\n getDateFormat(col: HdTableColumn, isRange: boolean): string {\n if (col && col.dateOption && col.dateOption.format) {\n return col.dateOption.format;\n }\n if (!isRange && this.isDateShowTime(col)) {\n return \"yyyy-MM-dd HH:mm:ss\";\n }\n return \"yyyy-MM-dd\";\n }\n\n getDisabledDate(col: HdTableColumn): (current: Date) => boolean {\n if (col && col.dateOption && col.dateOption.disabledDate) {\n return col.dateOption.disabledDate;\n }\n return function () {\n return false;\n };\n }\n\n getRangePlaceholder(col: HdTableColumn): Array<string> {\n const placeholder =\n col && col.dateOption ? col.dateOption.rangePlaceholder : null;\n if (placeholder && placeholder.length >= 2) {\n return [placeholder[0], placeholder[1]];\n }\n return [\"开始日期\", \"结束日期\"];\n }\n\n /** Input / InputNumber / 日期变更:先记旧值再写回并通知父组件 */\n onCellChange(col: HdTableColumn, data: any, value: any): void {\n if (!this.hasInlineEdit(col) || !data) {\n return;\n }\n const name = col.name as string;\n const previousValue = data[name];\n data[name] = value;\n this.cellChange.emit({\n line: data,\n col,\n name,\n value,\n previousValue,\n });\n this.cdr.markForCheck();\n }\n\n /**\n * Select 展开:有 onOpenChangeEvent 时展开先清空选项再回调 (open, line);关闭不回调业务。\n * 回调若 return 数组 / Promise / Observable,由组件写回 options 并 markForCheck。\n */\n onSelectOpenChange(col: HdTableColumn, data: any, open: boolean): void {\n if (!col || !col.onOpenChangeEvent) {\n return;\n }\n if (open) {\n this.clearSelectOptionsOnOpen(col, data);\n this.cdr.markForCheck();\n }\n const fn = col.onOpenChangeEvent;\n const debounceMs =\n col.onOpenChangeEventDebounceTime != null\n ? col.onOpenChangeEventDebounceTime\n : 0;\n if (!debounceMs) {\n if (open) {\n this.handleSelectLoaderResult(col, data, fn(open, data));\n }\n return;\n }\n if (this.selectOpenChangeSubscription) {\n this.selectOpenChangeSubscription.unsubscribe();\n }\n this.selectOpenChangeSubscription = this.selectOpenChangeSubject\n .pipe(debounceTime(debounceMs))\n .subscribe(({ fn: cb, open: o, line, col: c }) => {\n if (o) {\n this.handleSelectLoaderResult(c, line, cb(o, line));\n }\n });\n this.selectOpenChangeSubject.next({ fn, open, line: data, col });\n }\n\n /**\n * Select 搜索:有 onSearchEvent 时回调 (keyword, line),不清空 options。\n * 回调若 return 数组 / Promise / Observable,由组件写回 options 并 markForCheck。\n */\n onSelectSearch(col: HdTableColumn, data: any, keyword: string): void {\n if (!col || !col.onSearchEvent) {\n return;\n }\n const fn = col.onSearchEvent;\n const debounceMs =\n col.onSearchEventEventDebounceTime != null\n ? col.onSearchEventEventDebounceTime\n : 0;\n if (!debounceMs) {\n this.handleSelectLoaderResult(col, data, fn(keyword, data));\n return;\n }\n if (this.selectSearchSubscription) {\n this.selectSearchSubscription.unsubscribe();\n }\n this.selectSearchSubscription = this.selectSearchSubject\n .pipe(debounceTime(debounceMs))\n .subscribe(({ fn: cb, keyword: kw, line, col: c }) => {\n this.handleSelectLoaderResult(c, line, cb(kw, line));\n });\n this.selectSearchSubject.next({ fn, keyword, line: data, col });\n }\n\n /** 展开时清空列 selectList 或行上 selectListName,由业务回调再写入 */\n private clearSelectOptionsOnOpen(col: HdTableColumn, data: any): void {\n if (!col || !col.selectOption) {\n return;\n }\n const opt = col.selectOption;\n if (opt.selectList != null) {\n opt.selectList = [];\n }\n if (opt.selectListName && data) {\n data[opt.selectListName] = [];\n }\n }\n\n /**\n * 处理加载回调返回值:数组直接写回;Promise/Observable 完成后写回;void 仅 markForCheck。\n * 优先写 selectListName,否则写列上 selectList。\n */\n private handleSelectLoaderResult(\n col: HdTableColumn,\n data: any,\n result: any,\n ): void {\n if (result == null) {\n this.cdr.markForCheck();\n return;\n }\n if (Array.isArray(result)) {\n this.applySelectOptions(col, data, result);\n return;\n }\n if (typeof result.then === \"function\") {\n result.then(\n (list: any) => this.applySelectOptions(col, data, list),\n () => this.cdr.markForCheck(),\n );\n return;\n }\n if (typeof result.subscribe === \"function\") {\n if (this.selectLoaderSubscription) {\n this.selectLoaderSubscription.unsubscribe();\n }\n this.selectLoaderSubscription = result.subscribe(\n (list: any) => this.applySelectOptions(col, data, list),\n () => this.cdr.markForCheck(),\n );\n return;\n }\n this.cdr.markForCheck();\n }\n\n private applySelectOptions(col: HdTableColumn, data: any, list: any): void {\n if (!col || !col.selectOption || !Array.isArray(list)) {\n this.cdr.markForCheck();\n return;\n }\n const opt = col.selectOption;\n if (opt.selectListName && data) {\n data[opt.selectListName] = list;\n } else {\n opt.selectList = list;\n }\n this.cdr.markForCheck();\n }\n\n /** Select 变更:双写 value + label,并带 previous* / option */\n onSelectChange(col: HdTableColumn, data: any, value: any): void {\n if (!this.hasInlineEdit(col) || !data) {\n return;\n }\n const name = col.name as string;\n const opt = col.selectOption;\n const labelField = opt && opt.label ? opt.label : null;\n const previousValue = data[name];\n const previousLabel = labelField ? data[labelField] : undefined;\n const list = this.getSelectList(col, data);\n const previousOption =\n previousValue == null || !opt\n ? null\n : list.find((item) => item && item[opt.value] === previousValue) ||\n null;\n const option =\n value == null || !opt\n ? null\n : list.find((item) => item && item[opt.value] === value) || null;\n\n data[name] = value;\n let label: any = undefined;\n if (labelField) {\n label = option ? option[opt.label] : null;\n data[labelField] = label;\n }\n\n this.cellChange.emit({\n line: data,\n col,\n name,\n value,\n previousValue,\n label,\n previousLabel,\n option,\n previousOption,\n });\n this.cdr.markForCheck();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\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 FormsModule,\n NgZorroAntdModule,\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, EventEmitter, Input, Output } from \"@angular/core\";\nimport { InputBoolean } from \"ng-zorro-antd\";\n\n@Component({\n selector: \"hd-tip\",\n templateUrl: \"./hd-tip.component.html\",\n styleUrls: [\"./hd-tip.component.less\"],\n})\nexport class HdTipComponent {\n @Input() showIcon: boolean = true;\n @Input() fontSize: number;\n @Input() title: string;\n /** 是否在右侧展示展开/收起,默认关闭 */\n @Input() @InputBoolean() showCollapse: boolean = false;\n /** 当前是否展开(父组件可用 [(expanded)] 控制其它区块显隐) */\n @Input() @InputBoolean() expanded: boolean = true;\n @Output() expandedChange = new EventEmitter<boolean>();\n\n /** 展开(供父组件 ViewChild 调用) */\n expand(): void {\n this.setExpanded(true);\n }\n\n /** 收起(供父组件 ViewChild 调用) */\n collapse(): void {\n this.setExpanded(false);\n }\n\n /** 切换展开/收起(供父组件 ViewChild 或点击触发) */\n toggle(): void {\n this.setExpanded(!this.expanded);\n }\n\n private setExpanded(value: boolean): void {\n if (this.expanded === value) {\n return;\n }\n this.expanded = value;\n this.expandedChange.emit(this.expanded);\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 {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from \"@angular/core\";\nimport { HdAccessoryFile, HdAccessoryGroup } from \"./hd-accessory-list.service\";\n\n@Component({\n selector: \"hd-accessory-list\",\n templateUrl: \"./hd-accessory-list.component.html\",\n styleUrls: [\"./hd-accessory-list.component.less\"],\n})\nexport class HdAccessoryListComponent implements OnInit {\n /** 分组列表:每项含 name + accessoryList */\n @Input() groups: Array<HdAccessoryGroup> = [];\n /** 分组标签后是否自动加冒号,默认 true */\n @Input() labelColon: boolean = true;\n /** 点击附件时是否默认 window.open 下载/查看,默认 true */\n @Input() autoOpen: boolean = true;\n\n /** 点击附件回调(在 autoOpen 之前触发) */\n @Output() fileClick = new EventEmitter<{\n group: HdAccessoryGroup;\n file: HdAccessoryFile;\n path: string;\n }>();\n\n constructor() {}\n\n ngOnInit() {}\n\n getFileName(file: HdAccessoryFile): string {\n if (!file || file.name == null) {\n return \"\";\n }\n return String(file.name);\n }\n\n getFilePath(file: HdAccessoryFile): string {\n if (!file || file.path == null) {\n return \"\";\n }\n return String(file.path);\n }\n\n getFileSizeText(file: HdAccessoryFile): string {\n if (!file) {\n return \"\";\n }\n const raw = file.size;\n if (raw == null || raw === \"\") {\n return \"\";\n }\n if (typeof raw === \"string\") {\n return raw;\n }\n const bytes = Number(raw);\n if (isNaN(bytes) || bytes < 0) {\n return \"\";\n }\n if (bytes < 1024) {\n return bytes + \" B\";\n }\n if (bytes < 1024 * 1024) {\n return (bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0) + \" KB\";\n }\n return (\n (bytes / (1024 * 1024)).toFixed(bytes < 10 * 1024 * 1024 ? 1 : 0) + \" MB\"\n );\n }\n\n getLabelText(group: HdAccessoryGroup): string {\n const name = group && group.name != null ? String(group.name) : \"\";\n if (!name) {\n return \"\";\n }\n if (!this.labelColon) {\n return name;\n }\n return /[::]$/.test(name) ? name : name + \":\";\n }\n\n onFileClick(\n group: HdAccessoryGroup,\n file: HdAccessoryFile,\n event: Event,\n ): void {\n if (event) {\n event.preventDefault();\n }\n const path = this.getFilePath(file);\n this.fileClick.emit({ group, file, path });\n if (this.autoOpen && path) {\n window.open(path, \"_blank\");\n }\n }\n\n // 用箭头函数:ngFor 的 trackBy 调用时不会绑定组件 this\n trackByGroup = (index: number, group: HdAccessoryGroup): any => {\n return (group && group.name) || index;\n };\n\n trackByFile = (index: number, file: HdAccessoryFile): any => {\n return this.getFilePath(file) || this.getFileName(file) || index;\n };\n}\n","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgZorroAntdModule } from \"ng-zorro-antd\";\nimport { HdAccessoryListComponent } from \"./hd-accessory-list.component\";\n\n@NgModule({\n imports: [CommonModule, NgZorroAntdModule],\n declarations: [HdAccessoryListComponent],\n exports: [HdAccessoryListComponent],\n})\nexport class HdAccessoryListModule {}\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 { HdAccessoryListModule } from './hd-accessory-list/hd-accessory-list.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 HdAccessoryListModule,\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","/** 单个附件 */\nexport class HdAccessoryFile {\n /** 展示文件名 */\n name?: string;\n /** 完整下载/查看地址(由父组件直接传入) */\n path?: string;\n /** 文件大小(可缺省;有值才展示):数字按字节格式化,字符串原样展示 */\n size?: number | string;\n}\n\n/** 附件分组:标签 + 附件列表 */\nexport class HdAccessoryGroup {\n /** 分组标签,如「营业执照扫描件」 */\n name: string;\n /** 该分组下的附件 */\n accessoryList: Array<HdAccessoryFile> = [];\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","export class TotalOption {\n insertIndex: number; // 插入下标\n /** 合计值;hd-table 可不传,按 insertIndex 对应列对 content 自动求和 */\n insertValue?: any;\n align?: string; // 靠左还是靠右\n showDecimal?: boolean; // 是否显示小数位\n preserveNumber?: number; // 保留小数位数,不传默认 2\n isHide?: boolean; // 是否隐藏, 这里只针对列会同步消失的场景\n}\n","export const StaticConst = {\n MaxPageSize: 99999999\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"]}
|
|
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.service.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/utils/hd-table-scroll.util.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.service.ts","ng://fantasy-ngzorro/hd-form/hd-form.service.ts","ng://fantasy-ngzorro/utils/cascader.util.ts","ng://fantasy-ngzorro/hd-filter/hd-filter-scheme.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.component.ts","ng://fantasy-ngzorro/hd-form/hd-form.component.ts","ng://fantasy-ngzorro/hd-form/hd-form.module.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.module.ts","ng://fantasy-ngzorro/service/common-session.service.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-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/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/hd-accessory-list/hd-accessory-list.component.ts","ng://fantasy-ngzorro/hd-accessory-list/hd-accessory-list.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-accessory-list/hd-accessory-list.service.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.service.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.service.ts","ng://fantasy-ngzorro/model/staticConst.ts","ng://fantasy-ngzorro/utils.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","Text","Accessory","HdDetailFormService","HdDetailFormComponent","formCols","Array","nzColumn","imageClick","HdDetailFormFieldType","previewVisible","previewImagePath","previewTitle","previewImages","previewIndex","imageListCache","Map","displayListCache","filter","item","hide","refreshImageCache","ngOnChanges","changes","JSON","stringify","currentValue","previousValue","isAccessory","col","_this","clear","forEach","set","parseImageList","list","isArray","result","path","url","address","name","fileName","String","getImageList","has","get","hasImages","getDisplayImages","display","slice","getMoreCount","total","getImagePath","image","trackByImage","index","onImageClick","event","preventDefault","stopPropagation","applyPreviewImage","setTimeout","previewPrev","canPreviewPrev","previewNext","canPreviewNext","closePreview","getColSpan","width","Number","isNaN","Math","floor","triggerEvent","fn","onEditClick","edit","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","getTableViewportWidth","nzTable","hostClass","tableMainElement","tableMain","scrollBody","querySelector","clientWidth","wrapper","closest","host","measureElementNaturalWidth","element","clone","cloneNode","position","left","top","visibility","tableLayout","document","body","appendChild","scrollWidth","removeChild","measureHeaderDeclaredColWidth","ths","from","querySelectorAll","sum","hasFluidCol","th","declared","parsed","parseInt","replace","parsePx","offsetWidth","measureTableColWidth","reduce","table","viewportWidth","headerTable","bodyTable","getTableScrollXViewportWidth","resolveAutoTableScroll","hasData","colWidth","x","ceil","window","innerWidth","getNzTableScrollElements","header","nz","main","bindNzTableHeaderBodyScrollSync","els","onScroll","scrollLeft","addEventListener","removeEventListener","HdDetailLinesComponent","cdr","showSelected","allowDrop","showSearch","searchFields","scroll","tableScroll","selectField","selectEvent","showTotal","totalOption","columnsNumber","hdFrontPagination","totalOptionList","tableData","Page","tableLoading","tablePageIndex","tablePageSize","isAllDisplayDataChecked","isIndeterminate","listOfDisplayData","listOfAllData","mapOfCheckedId","mapOfCheckList","displayLines","isFilterData","storeFormLinesData","showTable","unbindBodyScroll","syncStoreFromLinesInput","applyDisplayFromStore","countSelected","calculateTotal","ngAfterViewInit","scheduleSyncHorizontalScroll","ngOnDestroy","unbindHeaderBodyScrollSync","lines","retry","syncHorizontalScroll","bindHeaderBodyScrollSync","afterX","effectiveScroll","nzTableComponent","nextScroll","nextX","y","prevHasY","remountTable","markForCheck","unbind","source","data","parse","restoreFromStore","searchLines","filterStr","trim","filterValue","toLowerCase","filteredData","_c","tslib_1.__values","keys","_d","toString","includes","_e","_f","selectedField","isSelectDisabled","round","drop","moveItemInArray","previousIndex","currentIndex","fill","insertIndex","insertValue","align","showDecimal","preserveNumber","isHide","currentPageDataChange","$event","refreshStatus","resetStatus","selectableList","every","some","values","checkAll","selectDisabledField","isInvalidRow","rowInvalidField","ChangeDetectorRef","ViewChild","HdDetailLinesModule","NzTableModule","DragDropModule","schemas","NO_ERRORS_SCHEMA","HdDetailLinesPageComponent","virtualScroll","tablePageIndexChange","tablePageSizeChange","pageChange","isCrossPageSelectLocal","measuredVirtualItemSize","virtualScrollActive","virtualTrackByRow","virtualItemSize","rowCount","base","estimatedHeight","effectiveVirtualItemSize","innerHeight","needsVerticalScroll","useVirtualScroll","getAutoScrollY","isCrossPageSelect","applyTableScrollMode","forceRemount","useVirtual","modeChanged","afterTableRender","refreshVirtualScrollViewport","forceMeasure","measureVirtualItemSize","viewport","cdkVirtualScrollViewport","checkViewportSize","force","elementRef","nativeElement","row","offsetHeight","resolvedScroll","nextY","nextHasY","getRowIndex","localIndex","onPageIndexChange","pageIndex","onPageSizeChange","HdDetailLinesPageModule","statusToColor","#FAB13B","#9FA4A2","#F5222D","#3B77E3","#20B95D","#F05B24","HdDetailTipComponent","HdStatusService","tip","setStatusColor","findKey","state","indexOf","toUpperCase","statusColor","HdDetailTipModule","inputNumber","showTime","require","Select","Date","DateRange","MultipleSelect","Cascader","Month","HdFilterService","totalWidth","isRowFirst","hdShowToday","ValidatorKey","TextArea","ViewDom","Switch","Time","Radio","Checkbox","RegionAddress","HdFormService","cascaderPinyinFilter","inputValue","pinyinField","keyword","label","pinyin","getCascaderShowSearch","cascaderOption","getCascaderMenuClassName","custom","menuClassName","HD_CASCADER_MENU_CLASS","getCascaderMenuStyle","menuStyle","dropdownMinWidth","minWidthCss","HD_FILTER_SCHEME_STORE","InjectionToken","HdFilterComponent","fb","schemeStore","enableFilterScheme","hidePadding","searchEvent","resetEvent","isShowMore","filterListModular","searchSubject","Subject","debounceTimeout","openChangeSubject","openChangeDebounceTimeout","defaultFilterValues","defaultValuesCaptured","schemeList","currentScheme","currentSchemeName","schemeLoading","schemeSaving","switchModalVisible","switchFormList","saveAsModalVisible","saveAsFormList","defaultSchemeName","switchDefaultKey","searchSubscription","pipe","debounceTime","subscribe","_a","selectOption","openChangeSubscription","init","tryLoadSchemes","enableLater","firstChange","keyLater","unsubscribe","schemeLoadSub","schemeActionSub","filterSchemeKey","checkList","filterList","formGroupList","control","normalizeFilterControlValue","show","validateFilterForm","group","clonePlain","getFilterData","onChangeEvent","onChangeEventDebounceTime","valueChanges","onSearchEvent","onSearchEventDebounceTime","onOpenChangeEvent","open","onOpenChangeEventDebounceTime","clearSelectOptionsOnOpen","debounceMs","opt","selectList","getVisibleFilterCount","getFilterColSpan","computeOffset","visibleCount","modular","nameList","tslib_1.__spread","Set","submitForm","getRawValue","resetForm","resetFilterFormWithValue","resetValue","patchValue","showMore","inputClean","patchObject","isAllowClear","applyDefault","canUseScheme","queryByFilterKey","applySchemeByName","uuid","found","find","templateName","err","showError","getDisplaySchemeList","fromDb","filterKey","openSwitchModal","current","buildSwitchFormList","getSwitchOptionKey","closeSwitchModal","switchFormChangeEvent","form","switchValidateForm","selectedKey","map","FormListType","placeholder","confirmSwitch","valid","schemeKey","applyScheme","isDefaultScheme","canDeleteCurrent","saveCurrentScheme","serializeFilterValue","save","saved","showSuccess","refreshSchemeListKeepCurrent","openSaveAsModal","buildSaveAsFormList","closeSaveAsModal","saveAsFormChangeEvent","saveAsValidateForm","maxLength","confirmSaveAs","deleteCurrentScheme","delete","emitSearch","scheme","patchFilterValues","patch","reviveFilterValue","FilterListType","v","parseDateLike","test","getTime","obj","msg","hdMessageService","success","console","FormBuilder","HdFilterSchemeStore","Optional","Inject","HdFormComponent","changeEvent","inputNumberDefaultFormatter","inputNumberDefaultParser","formList","validateHdForm","formItem","dealRow","year","month","day","newDateStr","toLocaleDateString","validator","Validators","required","formItemDate","checkboxOption","checkboxValue","regionValue","addressValue","requireValidators","addressName","onHdFormValueChanged","formListLength","j","columnItems","space","options","getRegionAddressValidateStatus","region","invalidDirty","dirty","invalid","getRegionAddressErrorTip","hasError","validatorKeys","controls","markAsDirty","updateValueAndValidity","isCheckboxChecked","onCheckboxItemChange","checked","splice","setValue","HdFormModule","HdFilterModule","CommonSessionService","putSession","session_key","session","sessionStorage","setItem","removeItem","getSession","getItem","removeSession","hideViewDomValue","isShow","canSearch","ColorOption","ExplainOption","cols","HdFormLinesService","HdFormLinesComponent","commonSessionService","showLineNumber","allowEmpty","deleteLastLineEvent","showKeyboardOperateTip","enableKeyboardOperate","showCheckbox","showColSettings","operateButtons","addLineEvent","selectionChange","showDeleteConfirm","paginationPageIndex","paginationPageSize","showForm","filterStoreFormLinesData","filterIndexStore","formValid","selectedRowIds","collectDomList","activeDomX","activeDomY","activeDom","activeSelectedComponentOpen","isDropdownVisible","showListNodes","nowListNodes","hideListNodes","cancelNowListNodes","cancelHideListNodes","formLinesCacheOption","FormLinesCacheOption","localforage","localtionTmp","colsCacheLoaded","deleteLineEvent","textWidthCache","localforage.createInstance","driver","localforage.INDEXEDDB","version","storeName","line","location","pathname","userSession","userCode","formLinesData","initColSettings","collectDomData","formInputDomListSub","formInputDomList","linesFormArray","count","btn","buttons","generateRowId","now","random","getRowId","getCurrentPageLines","start","end","isLineChecked","id","isAllChecked","pageLines","checkedCount","onAllChecked","emitSelectionChange","onLineCheckedChange","getSelectedLines","removeLineFromSelection","applyValuesToLine","emitEvent","addControl","markAsPristine","onlySelf","markAsUntouched","formLines","detectChanges","getControlValidateStatus","empty","undefined","touched","limitInputLength","input","getSelectedLinesData","mountedById","_hdRowId","batchFillSelected","storeItem","clearSelection","getSelectedCount","formLinesLeftButton","formLinesRightButton","showColSettingsButton","getConfigurableFormLines","isColumnVisible","FormLineType","getCacheKey","ready","then","setCols","catch","log","hasColsCache","saveFormLinesCacheOption","sortNodesByFormLinesOrder","nodes","order","f","sort","a","b","configurable","hasCache","node","title","cancelDropdown","confirmDropdown","submitGrids","visibleNames","checkAction","origin","temporaryNodeList_1","innerItem","setActiveSelectedComponentOpen","domList","dom","remove","oldIndex","getOldDomIndex","insertBefore","createDOMStructure","firstChild","getSelectTableColumnStyle","column","hdOptionHeader","createElement","className","paddingLeft","SELECT_TABLE_OPTION_HORIZONTAL_PADDING","paddingRight","tableColumns","selectOptionTableColumn","columnDiv","widthStyle","labelText","createTextNode","pageDomList","toArray","startIndex","endIndex","pageLinesLength","formLinesLength","interval","disableInputNumberKeyboardStep","this_1","NzInputNumberComponent","onKeyDown","keyCode","setValidateValue","jumpToNextInput","NzSelectComponent","focusDom","addNewLineAndFocus","addFormLine","jumpToPrevInput","jumpDirection","cleanFocusDom","dom_1","nzDisabled","nzSelectTopControlComponent","inputElement","scrollIntoView","behavior","block","inline","nzSelectService","mode","focus","inputDom_1","getElementById","nzId","select","ElementRef","NzDatePickerComponent","NzRangePickerComponent","NzTimePickerComponent","setActiveDom","blur","nzOpen","setActiveDomInFormLines","rowNumber","colNumber","getDomIndex","nowActiveDom_1","typeList","validateHdFormLines","getValid","selectListName","innerGetValid","tmpValidateHdFormLines","array","formLinesDataItem","formGroupObj","judgeValueIsNotEmpty","lineIndex","formGroupTmp","insert","getLines","allLines","setStoreData","_b","getStyle","styleObj","min-width","colorOption","color","isEdit","createForm","addFormLineWithData","isTrulyEmptyAllowed","newLine","newLineItem","delayJumpToNextInput","createLineFromValues","isEmptyLine","regenerateRowId","rowId","isHdFormLineSearchAdd","formGroupSubmit","handleChange","calculateLineNumber","afterLine","isFocus","insertAt","getInsertIndexAfter","markSearchAddedLine","toPageLocalRowIndex","copyFormLine","sourceIndex","sourceValues","copiedLine","deleteFormLine","lineOrIndex","removeAt","removedLine","at","maxPage","flag","idx","globalIndex","pageIndexChange","pageSizeChange","lines_1","getNowLines","addIndex","addedLine","flagCtrl","deletedIndex_1","filterIndex_1","pop","selectOptionCheckList","selectValue","isTextOverflow","text","maxWidth","cachedWidth","span","whiteSpace","fontSize","innerText","isOverflow","judgeColEmpty","str","ViewChildren","HdFormLinesModule","providers","HdCurrentTableComponent","showTableTotal","tableSearchEvent","tableTotalOptionList","search","selectedList","HdCurrentTableModule","HdLogComponent","HdLogService","modalService","showLogs","logs","create","nzTitle","nzContent","nzComponentParams","nzFooter","nzWidth","NzModalService","HdLogModule","entryComponents","HdPopconfirmComponent","confirmOption","cancelOption","cancel","confirm","HdPopconfirmModule","bootstrap","STATUS_COLOR_MAP","HdStatusComponent","statusLower","status","HdStatusModule","ColWidth","tableImageColWidth","tableTwoImageColWidth","billNumberColWidth","nameColWidth","codeColWidth","codeNameColWidth","enumColWidth","dateColWidth","dateTimeColWidth","dateRangeWidth","operateColWidth","numberColWidth","remarkColWidth","fixColWidth","maxColWidth","HdTableCellPipe","transform","isEmpty","overflow","raw","render","getHdTableCellRaw","charCodeAt","estimateTextWidth","Pipe","pure","fixed","btnList","canSort","canWarp","OperateBtn","showConfirm","isRepeat","TableCacheOption","colWidths","selectable","isLeaf","expanded","fixedLayout","declaredWidth","scrollX","fluidExtra","displayTotal","isFluid","HdTableComponent","hostEl","tableCols","selectType","showOperateColWarpButton","sortEvent","cellChange","pagination","frontPagination","tablePageSizeChangeEvent","tableCacheOption","tableColsCache","selectColListNodes","selectColListNodesCache","showDetail","isFirstEntrySearchLocal","tableColWidthTotal","fluidExtraWidth","fluidHorizontal","fluidExtraByCol","pendingResetScrollTop","currentSortKey","currentSortValue","totalFooterScrollBoundBody","totalFooterScrollHandler","totalFooterSyncRetry","totalFooterNeedYGutter","viewportResizeTimer","boundOnViewportResize","hostResizeObserver","selectOpenChangeSubject","selectSearchSubject","lineNumberColWidth","trackByRow","trackByCol","_index","beforeDrop","arg","dragNode","pos","of","TreeGrid","dragNodeIndex","findIndex","nodeIndex","delay","unbindTotalFooterScrollSync","unbindViewportResizeSync","selectOpenChangeSubscription","selectSearchSubscription","selectLoaderSubscription","isFirstEntrySearch","bindViewportResizeSync","deleteHideItem","getInitLocalforage","calculateTableTotal","scheduleResetTableBodyScrollTop","getColSort","toggleShowDetail","getScrollYMaxOffset","tableTotal","getVisibleRowCount","useFrontPagination","maxOffset","getRightSticky","fixedRightWidth","getLeftSticky","fixedWidth","isColVisible","getColDeclaredWidth","getDeclaredColWidthTotal","getColDisplayWidth","extra","rebuildFluidExtraByCol","parts","sumDeclared","share","frac","assigned","part","exact","remain","applyHorizontalLayout","layout","isTotalFooterFluid","getLineNumber","normalizeTableCacheOption","initTable","judgeRepeatCols","dealCols","dealOperateBtn","presetScrollBeforeRemount","prevHasX","dealScroll","nextHasX","flushResetTableBodyScrollTop","resetTableBodyScrollTop","scrollToOffset","scrollToIndex","viewportEl","scrollTop","mixTableBodyNativeElement","tableBodyNativeElement","tableBodyElement","el","delays","ms","tableBody","height","saveTableCacheOption","notIncols","incols","moveElementNearby","arr","elementToMoveTitle","targetElementTitle","tmpArray","targetIndex","elementIndex","newIndex","removedElement","title_1","temporaryNodeList","getHideListNodes","nodeItem","minWidth","leftFixedCols","rightFixedCols","normalCols","resultCols","colWidths_1","onResize","tempWidth","syncTotalFooterWithBody","operateCol","textStr_1","needShowConfirm","getBtnName","isDangerBtn","getVirtualScrollY","resolveHorizontalLayout","declaredColWidth","compareWidth","fillWidth","containerWidth","fluidLayout","refreshStickyOffsets","syncHeaderBodyScrollLeft","getTableBodyScrollEl","mix","getTotalFooterScrollEl","bodyHasVerticalScrollbar","scrollHeight","clientHeight","footer","needYGutter","syncTotalFooterScrollLeft","bindTotalFooterScrollSync","passive","scheduleViewportScrollSync","RO","ResizeObserver","observe","disconnect","clearTimeout","leftOffset","rightOffset","tableTotalOption","visibleCols","configured","columnNumber","field_1","sum_1","hasValue_1","num","colAtIndex","getTableTotalCellMeta","colIndex","visibleIndex","meta","getTableTotalCellValue","preserve","factor","pow","toFixed","getTableTotalCellAlign","getTableTotalCount","onRadioSelect","resolveCellColor","getLinkCellColor","getPlainCellColor","getStateField","isState","stateField","hasRowNo","rowNo","getRowNoText","page","rowIndex","getTitleParts","split","join","isEditable","hasInlineEdit","editable","editType","warn","isEditDisabled","editDisabled","getSelectList","getSelectOptionLabel","getInputNumberProp","fallback","val","isDateShowTime","dateOption","isDateShowToday","showToday","getDateFormat","isRange","format","getDisabledDate","disabledDate","getRangePlaceholder","rangePlaceholder","onCellChange","onSelectOpenChange","cb","handleSelectLoaderResult","onSelectSearch","onSearchEventEventDebounceTime","kw","applySelectOptions","onSelectChange","labelField","previousLabel","previousOption","changeDetection","ChangeDetectionStrategy","OnPush","HdTableModule","NzToolTipModule","NzPopconfirmModule","NzResizableModule","NzDropDownModule","NzTreeModule","NzIconModule","HdTipComponent","showIcon","showCollapse","expandedChange","expand","setExpanded","collapse","toggle","HdTipModule","HdAccessoryListComponent","groups","labelColon","autoOpen","fileClick","trackByGroup","trackByFile","file","getFilePath","getFileName","getFileSizeText","bytes","getLabelText","onFileClick","HdAccessoryListModule","HdOverlayCleanupService","router","started","clearStuckTooltips","events","NavigationStart","pane","parentNode","Router","HdComponentModule","_overlayCleanup","FantasyNgzorroModule","accessoryList","TotalOption","Utils","fillSelectOption","returnData","fillArrayFormItem","arrayToSelectOptionList","labelTip","valueTip","returnItem","nums","Error","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 { Injectable } from \"@angular/core\";\n\n/** hd-detail-form 字段展示类型 */\nexport enum HdDetailFormFieldType {\n /** 普通文本(默认) */\n Text = \"text\",\n /** 附件图片(描述项内横排缩略图) */\n Accessory = \"accessory\",\n}\n\n/** 附件图片项(path 为图片地址) */\nexport interface HdDetailFormImage {\n name?: string;\n path?: string;\n url?: string;\n}\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class HdDetailFormService {\n constructor() {}\n}\n","import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n SimpleChange,\n} from \"@angular/core\";\nimport { HdOption } from \"../model/common-type\";\nimport {\n HdDetailFormFieldType,\n HdDetailFormImage,\n} from \"./hd-detail-form.service\";\n\n/** 附件缩略图最多直接展示张数,超出末张蒙版 +n */\nconst MAX_VISIBLE_IMAGES = 4;\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 /** 一行列数,默认固定 4 列(不再按屏幕宽度自适应) */\n @Input() nzColumn:\n | number\n | {\n xxl?: number;\n xl?: number;\n lg?: number;\n md?: number;\n sm?: number;\n xs?: number;\n } = 4;\n\n /** 附件图片点击回调 */\n @Output() imageClick = new EventEmitter<{\n image: HdDetailFormImage;\n path: string;\n index: number;\n }>();\n\n HdDetailFormFieldType = HdDetailFormFieldType;\n\n /** 大图预览 */\n previewVisible = false;\n previewImagePath = \"\";\n previewTitle = \"图片预览\";\n /** 当前预览所属字段的图片列表(用于翻页) */\n previewImages: Array<HdDetailFormImage> = [];\n previewIndex = 0;\n\n /** 附件字段图片缓存(避免模板里反复 getImageList 导致 *ngFor 重建、点击丢失) */\n private imageListCache = new Map<HdOption, Array<HdDetailFormImage>>();\n private displayListCache = new Map<HdOption, Array<HdDetailFormImage>>();\n\n constructor() {}\n\n get canPreviewPrev(): boolean {\n return this.previewIndex > 0;\n }\n\n get canPreviewNext(): boolean {\n return this.previewIndex < this.previewImages.length - 1;\n }\n\n ngOnInit() {\n if (this.formCols && this.formCols.length > 0) {\n this.formCols = this.formCols.filter((item) => !item.hide);\n }\n this.refreshImageCache();\n }\n\n ngOnChanges(changes: SimpleChange) {\n if (\n changes[\"formCols\"] &&\n JSON.stringify(changes[\"formCols\"].currentValue) !==\n JSON.stringify(changes[\"formCols\"].previousValue)\n ) {\n if (this.formCols && this.formCols.length > 0) {\n this.formCols = this.formCols.filter((item) => !item.hide);\n }\n this.refreshImageCache();\n }\n }\n\n isAccessory(col: HdOption): boolean {\n return !!(\n col &&\n (col.type === HdDetailFormFieldType.Accessory || col.type === \"accessory\")\n );\n }\n\n private refreshImageCache(): void {\n this.imageListCache.clear();\n this.displayListCache.clear();\n (this.formCols || []).forEach((col) => {\n if (this.isAccessory(col)) {\n this.imageListCache.set(col, this.parseImageList(col));\n }\n });\n }\n\n /**\n * 解析附件图片列表。value 支持:\n * - string / string[](图片地址)\n * - { name?, path? / url? }[]\n */\n private parseImageList(col: HdOption): Array<HdDetailFormImage> {\n const value = col && col.value;\n if (value == null || value === \"\") {\n return [];\n }\n const list = Array.isArray(value) ? value : [value];\n const result: Array<HdDetailFormImage> = [];\n list.forEach((item) => {\n if (item == null || item === \"\") {\n return;\n }\n if (typeof item === \"string\") {\n result.push({ path: item });\n return;\n }\n const path = item.path || item.url || item.address || \"\";\n if (!path) {\n return;\n }\n result.push({\n name: item.name || item.fileName,\n path: String(path),\n });\n });\n return result;\n }\n\n getImageList(col: HdOption): Array<HdDetailFormImage> {\n if (!this.imageListCache.has(col)) {\n this.imageListCache.set(col, this.parseImageList(col));\n }\n return this.imageListCache.get(col) || [];\n }\n\n hasImages(col: HdOption): boolean {\n return this.getImageList(col).length > 0;\n }\n\n /** 实际渲染的缩略图(最多 4 张) */\n getDisplayImages(col: HdOption): Array<HdDetailFormImage> {\n if (this.displayListCache.has(col)) {\n return this.displayListCache.get(col);\n }\n const display = this.getImageList(col).slice(0, MAX_VISIBLE_IMAGES);\n this.displayListCache.set(col, display);\n return display;\n }\n\n /** 未展示张数(末张蒙版 +n) */\n getMoreCount(col: HdOption): number {\n const total = this.getImageList(col).length;\n return total > MAX_VISIBLE_IMAGES ? total - MAX_VISIBLE_IMAGES : 0;\n }\n\n getImagePath(image: HdDetailFormImage): string {\n return (image && (image.path || image.url)) || \"\";\n }\n\n trackByImage(index: number, image: HdDetailFormImage): string {\n return (image && (image.path || image.url)) || String(index);\n }\n\n onImageClick(\n col: HdOption,\n image: HdDetailFormImage,\n index: number,\n event?: Event\n ): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n const path = this.getImagePath(image);\n this.imageClick.emit({ image, path, index });\n if (!path) {\n return;\n }\n this.previewImages = this.getImageList(col).slice();\n this.previewIndex = index >= 0 ? index : 0;\n this.applyPreviewImage();\n setTimeout(() => {\n this.previewVisible = true;\n });\n }\n\n previewPrev(event?: Event): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (!this.canPreviewPrev) {\n return;\n }\n this.previewIndex -= 1;\n this.applyPreviewImage();\n }\n\n previewNext(event?: Event): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (!this.canPreviewNext) {\n return;\n }\n this.previewIndex += 1;\n this.applyPreviewImage();\n }\n\n private applyPreviewImage(): void {\n const image = this.previewImages[this.previewIndex];\n const path = this.getImagePath(image);\n this.previewImagePath = path;\n this.previewTitle =\n (image && image.name) || \"图片\" + (this.previewIndex + 1);\n }\n\n closePreview(): void {\n this.previewVisible = false;\n this.previewImages = [];\n this.previewIndex = 0;\n this.previewImagePath = \"\";\n }\n\n /** HdOption.width:默认 1,最大 4 */\n getColSpan(col: HdOption): number {\n const width = col && col.width != null ? Number(col.width) : 1;\n if (!width || width < 1 || isNaN(width)) {\n return 1;\n }\n return width > 4 ? 4 : Math.floor(width);\n }\n\n triggerEvent(fn: any) {\n if (fn) {\n fn(event);\n }\n }\n\n /** 点击编辑笔,回调父组件传入的 edit */\n onEditClick(event: Event, col: HdOption): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (col && col.edit) {\n col.edit(col);\n }\n }\n}\n","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgZorroAntdModule } from \"ng-zorro-antd\";\nimport { HdDetailFormComponent } from \"./hd-detail-form.component\";\n\n@NgModule({\n imports: [CommonModule, NgZorroAntdModule],\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 /** 占据列数,默认 1,最大 4(一行共 4 列);历史未传按 1 */\n width?: number;\n /**\n * 字段类型,默认文本。\n * `accessory`:附件图片,value 为图片地址 string / string[] 或 { name?, path?/url? }[]\n */\n type?: string;\n clickText?: string;\n click?: (value: any) => void;\n clickText1?: string;\n click1?: (value: any) => void;\n /**\n * 值后显示编辑笔图标(Figma edit/edit,14px)。\n */\n editable?: boolean;\n /** 点击编辑笔回调,供父组件处理(如弹窗改值) */\n edit?: (col?: HdOption) => 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 interface CascaderShowSearchOptions {\n filter?: (inputValue: string, path: any[]) => boolean;\n sorter?: (a: any[], b: any[], inputValue: string) => number;\n}\n\nexport class CascaderOption {\n options: Array<any>;\n /** 是否开启搜索,默认 true;传 false 关闭;传对象可自定义 filter/sorter */\n showSearch?: boolean | CascaderShowSearchOptions;\n /** 选项中拼音字段名,默认 pinyin */\n pinyinField?: string;\n /** 下拉菜单额外 class,默认 hd-cascader-menus */\n menuClassName?: string;\n /** 下拉菜单样式(对应 nzMenuStyle) */\n menuStyle?: { [key: string]: string };\n /**\n * 搜索结果下拉最小宽度(可选)。\n * number 按 px;string 可传 '360px' 等;不传则按文案自适应,不强制宽度\n */\n dropdownMinWidth?: number | string;\n}\n","import { NzTableComponent } from \"ng-zorro-antd/table\";\n\nexport interface HdTableScrollConfig {\n x?: string;\n y?: string;\n}\n\nconst DEFAULT_FLUID_COL_WIDTH = 150;\n\nexport function getTableViewportWidth(\n nzTable: NzTableComponent,\n hostClass = \"hd-table-container\",\n): number {\n if (!nzTable || !nzTable.tableMainElement) {\n return 0;\n }\n const tableMain = nzTable.tableMainElement.nativeElement as HTMLElement;\n const scrollBody = tableMain.querySelector(\n \".ant-table-body\",\n ) as HTMLElement;\n if (scrollBody && scrollBody.clientWidth > 0) {\n return scrollBody.clientWidth;\n }\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(`.${hostClass}`) as HTMLElement;\n if (host && host.clientWidth > 0) {\n return host.clientWidth;\n }\n return 0;\n}\n\nfunction parsePx(value: string): number {\n if (!value) {\n return 0;\n }\n const parsed = parseInt(String(value).replace(/px/i, \"\"), 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n\n/** 克隆表头/表体测量未被 scroll 压缩前的自然列宽 */\nfunction measureElementNaturalWidth(element: HTMLElement): number {\n const clone = element.cloneNode(true) as HTMLElement;\n clone.style.position = \"absolute\";\n clone.style.left = \"-99999px\";\n clone.style.top = \"0\";\n clone.style.visibility = \"hidden\";\n clone.style.width = \"max-content\";\n clone.style.tableLayout = \"auto\";\n document.body.appendChild(clone);\n const width = clone.scrollWidth;\n document.body.removeChild(clone);\n return width;\n}\n\n/** 汇总表头 th 上声明的列宽(style.width / nzWidth) */\nfunction measureHeaderDeclaredColWidth(tableMain: HTMLElement): number {\n const ths = Array.from(\n tableMain.querySelectorAll(\".ant-table-thead > tr > th\"),\n ) as HTMLElement[];\n if (!ths.length) {\n return 0;\n }\n let sum = 0;\n let hasFluidCol = false;\n ths.forEach((th) => {\n const declared = parsePx(th.style.width);\n if (declared > 0) {\n sum += declared;\n return;\n }\n hasFluidCol = true;\n sum += th.scrollWidth || th.offsetWidth || DEFAULT_FLUID_COL_WIDTH;\n });\n return hasFluidCol ? 0 : sum;\n}\n\nexport function measureTableColWidth(nzTable: NzTableComponent): number {\n if (!nzTable || !nzTable.tableMainElement) {\n return 0;\n }\n const tableMain = nzTable.tableMainElement.nativeElement as HTMLElement;\n const tables = Array.from(\n tableMain.querySelectorAll(\n \".ant-table-header table, .ant-table-body table, .cdk-virtual-scroll-content-wrapper table\",\n ),\n ) as HTMLElement[];\n\n let max = tables.reduce(\n (width, table) => Math.max(width, table.scrollWidth || 0),\n 0,\n );\n\n const viewportWidth = getTableViewportWidth(nzTable);\n // 未开启 scroll.x 时表格会被压进容器,scrollWidth 不可靠,需测自然列宽\n if (viewportWidth <= 0 || max <= viewportWidth) {\n const headerTable = tableMain.querySelector(\n \".ant-table-header table\",\n ) as HTMLElement;\n const bodyTable = tableMain.querySelector(\n \".ant-table-body table\",\n ) as HTMLElement;\n if (headerTable) {\n max = Math.max(max, measureElementNaturalWidth(headerTable));\n }\n if (bodyTable) {\n max = Math.max(max, measureElementNaturalWidth(bodyTable));\n }\n max = Math.max(max, measureHeaderDeclaredColWidth(tableMain));\n }\n\n return max;\n}\n\n/**\n * 用于判断是否需要 scroll.x 的视口宽。\n * 有纵向滚动条时 clientWidth 会少一截,若直接拿去比列宽,会「竖滚条导致误开横滚」;\n * 这里用 offsetWidth(含滚动条槽)作为屏幕可展示宽度。\n */\nexport function getTableScrollXViewportWidth(\n nzTable: NzTableComponent,\n hostClass = \"hd-table-container\",\n): number {\n if (!nzTable || !nzTable.tableMainElement) {\n return 0;\n }\n const tableMain = nzTable.tableMainElement.nativeElement as HTMLElement;\n const scrollBody =\n (tableMain.querySelector(\n \"cdk-virtual-scroll-viewport.ant-table-body\",\n ) as HTMLElement) ||\n (tableMain.querySelector(\".ant-table-body\") as HTMLElement);\n if (scrollBody && scrollBody.offsetWidth > 0) {\n return scrollBody.offsetWidth;\n }\n return getTableViewportWidth(nzTable, hostClass);\n}\n\n/**\n * 无数据或列宽未超出容器时不启用横向 scroll(表宽 100%、table-layout: auto)。\n * auto 布局下单元格 max-width 不生效,固定宽列会被均摊撑开;需要锁宽的场景见 hd-table 的横向布局。\n */\nexport function resolveAutoTableScroll(\n nzTable: NzTableComponent,\n hasData: boolean,\n colWidth?: number,\n): HdTableScrollConfig | null {\n if (!hasData) {\n return null;\n }\n const width =\n colWidth != null && colWidth > 0\n ? colWidth\n : measureTableColWidth(nzTable);\n if (width <= 0) {\n return null;\n }\n const viewportWidth = getTableScrollXViewportWidth(nzTable);\n if (viewportWidth > 0) {\n // 允许 1px 误差,避免亚像素导致误开横滚\n return width > viewportWidth + 1 ? { x: `${Math.ceil(width)}px` } : null;\n }\n if (typeof window !== \"undefined\" && width > window.innerWidth - 32) {\n return { x: `${Math.ceil(width)}px` };\n }\n return null;\n}\n\n/** 取 ng-zorro 分体表头 / 表体滚动容器(含虚拟滚动) */\nexport function getNzTableScrollElements(\n nzTable: NzTableComponent,\n): { header: HTMLElement | null; body: HTMLElement | null } {\n if (!nzTable) {\n return { header: null, body: null };\n }\n const nz = nzTable as any;\n let header = (nz.tableHeaderNativeElement as HTMLElement) || null;\n let body =\n (nz.mixTableBodyNativeElement as HTMLElement) ||\n (nz.tableBodyNativeElement as HTMLElement) ||\n null;\n const main =\n nz.tableMainElement &&\n (nz.tableMainElement.nativeElement as HTMLElement);\n if (main) {\n if (!header) {\n header = main.querySelector(\".ant-table-header\") as HTMLElement;\n }\n if (!body) {\n body =\n (main.querySelector(\n \"cdk-virtual-scroll-viewport.ant-table-body\",\n ) as HTMLElement) ||\n (main.querySelector(\".ant-table-body\") as HTMLElement);\n }\n }\n return { header, body };\n}\n\n/** 一次性把表体 scrollLeft 同步到表头 */\nexport function syncNzTableHeaderBodyScrollLeft(\n nzTable: NzTableComponent,\n): void {\n const els = getNzTableScrollElements(nzTable);\n if (!els.header || !els.body) {\n return;\n }\n if (els.header.scrollLeft !== els.body.scrollLeft) {\n els.header.scrollLeft = els.body.scrollLeft;\n }\n}\n\n/**\n * 监听表体横向滚动并同步表头。\n * 返回 unbind;DOM 未就绪时返回 null(调用方可重试)。\n */\nexport function bindNzTableHeaderBodyScrollSync(\n nzTable: NzTableComponent,\n): (() => void) | null {\n const els = getNzTableScrollElements(nzTable);\n if (!els.header || !els.body) {\n return null;\n }\n const header = els.header;\n const body = els.body;\n const onScroll = () => {\n if (header.scrollLeft !== body.scrollLeft) {\n header.scrollLeft = body.scrollLeft;\n }\n };\n body.addEventListener(\"scroll\", onScroll);\n onScroll();\n return () => {\n body.removeEventListener(\"scroll\", onScroll);\n };\n}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { NzTableComponent } from \"ng-zorro-antd/table\";\nimport { Page } from \"../model/common-type\";\nimport { measureTableColWidth, resolveAutoTableScroll, bindNzTableHeaderBodyScrollSync } from \"../utils/hd-table-scroll.util\";\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\n implements OnInit, OnChanges, AfterViewInit, OnDestroy {\n @ViewChild(\"hdTable\", { static: false }) nzTableComponent: NzTableComponent;\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 /**\n * 横向滚动。历史默认 `{ x: '1px' }`(2.1.28 前一直如此):开启横滚但不锁死列宽,\n * 业务页可不写 th/td width,由内容自适应。传 null 则按容器自动测算。\n */\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n tableScroll: { x?: string; y?: string } = null;\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n /**\n * 行勾选禁用字段名。定义后取当前行该字段:\n * 为 true 时禁用该行勾选(全选也会跳过)。\n */\n @Input() selectDisabledField: string;\n /**\n * 行失效字段名。定义后取当前行该字段:\n * 为 true 时整行背景色为 #F7F8FA、文字 #868A9C。\n */\n @Input() rowInvalidField: 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 /** 控制 nz-table 重建:scroll.y 从无到有时必须重建,否则表头不跟横滚 */\n showTable = true;\n private unbindBodyScroll: (() => void) | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n get effectiveScroll(): { x?: string; y?: string } {\n // 不自动补 nzScroll.y:有 y 会拆表头/表体,无列宽时列错位。\n // 仅有 x 时的纵滚由 less(max-height + overflow-y)承担,表头 sticky。\n // 仅当父组件显式传了 scroll.y 时才走 nz-table 分体纵滚。\n return this.scroll != null ? this.scroll : this.tableScroll;\n }\n\n ngOnInit(): void {\n this.syncStoreFromLinesInput();\n this.applyDisplayFromStore();\n this.countSelected();\n this.calculateTotal();\n }\n\n ngAfterViewInit(): void {\n this.scheduleSyncHorizontalScroll();\n }\n\n ngOnDestroy(): void {\n this.unbindHeaderBodyScrollSync();\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 if (changes[\"lines\"] || changes[\"showSelected\"]) {\n this.scheduleSyncHorizontalScroll();\n }\n }\n\n private scheduleSyncHorizontalScroll(retry = 0): void {\n const delay = retry === 0 ? 0 : 50;\n setTimeout(() => {\n if (this.scroll == null) {\n this.syncHorizontalScroll();\n }\n this.bindHeaderBodyScrollSync(0);\n const afterX =\n (this.effectiveScroll && this.effectiveScroll.x) ||\n (this.tableScroll && this.tableScroll.x);\n if (\n this.scroll == null &&\n retry < 5 &&\n this.displayLines &&\n this.displayLines.length > 0 &&\n !afterX &&\n measureTableColWidth(this.nzTableComponent) === 0\n ) {\n this.scheduleSyncHorizontalScroll(retry + 1);\n }\n }, delay);\n }\n\n private syncHorizontalScroll(): void {\n if (this.scroll != null) {\n return;\n }\n const hasData = !!(this.displayLines && this.displayLines.length);\n const nextScroll = resolveAutoTableScroll(\n this.nzTableComponent,\n hasData,\n );\n const nextX = nextScroll ? nextScroll.x : null;\n // 自动测算只设 x,不设 y(与 2.1.64 前一致,避免无列宽时表头/表体错位)\n if (this.tableScroll && this.tableScroll.x === nextX && !this.tableScroll.y) {\n return;\n }\n const prevHasY = !!(this.tableScroll && this.tableScroll.y);\n this.tableScroll = nextX ? { x: nextX } : null;\n if (prevHasY) {\n this.remountTable();\n return;\n }\n this.cdr.markForCheck();\n this.bindHeaderBodyScrollSync(0);\n }\n\n /** 重建 nz-table,让 header/body 滚动同步在 AfterViewInit 重新绑定 */\n private remountTable(): void {\n this.unbindHeaderBodyScrollSync();\n setTimeout(() => {\n this.showTable = false;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.showTable = true;\n this.cdr.markForCheck();\n setTimeout(() => this.bindHeaderBodyScrollSync(0));\n });\n });\n }\n\n /** 表体横滚时同步表头(兜底 ng-zorro 监听丢失);DOM 未就绪时重试 */\n private bindHeaderBodyScrollSync(retry = 0): void {\n this.unbindHeaderBodyScrollSync();\n if (!this.nzTableComponent || !(this.effectiveScroll && this.effectiveScroll.x)) {\n return;\n }\n const unbind = bindNzTableHeaderBodyScrollSync(this.nzTableComponent);\n if (unbind) {\n this.unbindBodyScroll = unbind;\n return;\n }\n if (retry < 8) {\n setTimeout(() => this.bindHeaderBodyScrollSync(retry + 1), 50);\n }\n }\n\n private unbindHeaderBodyScrollSync(): void {\n if (this.unbindBodyScroll) {\n this.unbindBodyScroll();\n this.unbindBodyScroll = null;\n }\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 this.scheduleSyncHorizontalScroll();\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 this.scheduleSyncHorizontalScroll();\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 && !this.isSelectDisabled(item)) {\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 preserveNumber: item.preserveNumber != null ? item.preserveNumber : 2,\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 this.scheduleSyncHorizontalScroll();\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 (data) {\n if (event && this.isSelectDisabled(data)) {\n return;\n }\n this.mapOfCheckedId[data[this.selectField]] = event;\n if (event) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n }\n const selectableList = this.listOfDisplayData.filter(\n (item) => !this.isSelectDisabled(item),\n );\n this.isAllDisplayDataChecked =\n selectableList.length > 0 &&\n selectableList.every((item) => this.mapOfCheckedId[item[this.selectField]]);\n this.isIndeterminate =\n selectableList.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 (this.isSelectDisabled(item)) {\n return;\n }\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 /** 当前行是否禁用勾选 */\n isSelectDisabled(data: any): boolean {\n return !!(\n this.selectDisabledField &&\n data &&\n data[this.selectDisabledField] === true\n );\n }\n\n /** 当前行是否失效 */\n isInvalidRow(data: any): boolean {\n return !!(\n this.rowInvalidField &&\n data &&\n data[this.rowInvalidField] === true\n );\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 AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { NzTableComponent } from \"ng-zorro-antd/table\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\nimport {\n measureTableColWidth,\n resolveAutoTableScroll,\n bindNzTableHeaderBodyScrollSync,\n} from \"../utils/hd-table-scroll.util\";\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\n implements OnInit, OnChanges, AfterViewInit, OnDestroy\n{\n @ViewChild(\"hdTable\", { static: false }) nzTableComponent: NzTableComponent;\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 /** 与 hd-table 一致:行数多时自动虚拟滚动;拖拽排序开启时强制关闭 */\n @Input() @InputBoolean() virtualScroll: boolean = true;\n /** 手动指定行高;不传则用默认/测量值 */\n @Input() virtualItemSize: number;\n /**\n * 横向滚动。历史默认 `{ x: '1px' }`(2.1.28 前一直如此):开启横滚但不锁死列宽,\n * 业务页可不写 th/td width。传 null 则按容器自动测算。\n */\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n tableScroll: { x?: string; y?: string } = null;\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n /**\n * 行勾选禁用字段名。定义后取当前行该字段:\n * 为 true 时禁用该行勾选(全选也会跳过)。\n */\n @Input() selectDisabledField: string;\n /**\n * 行失效字段名。定义后取当前行该字段:\n * 为 true 时整行背景色为 #F7F8FA、文字 #868A9C。\n */\n @Input() rowInvalidField: 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 showTable = true;\n /** 自动测量前的兜底行高 */\n measuredVirtualItemSize = 47;\n private virtualScrollActive: boolean | null = null;\n private unbindBodyScroll: (() => void) | null = null;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n get effectiveScroll(): { x?: string; y?: string } {\n return this.scroll != null ? this.scroll : this.tableScroll;\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 /** 当前页内容高度是否超出视口 / 已指定 scroll.y */\n get needsVerticalScroll(): boolean {\n const rowCount = this.displayLines ? this.displayLines.length : 0;\n if (rowCount <= 0) {\n return false;\n }\n const base = this.effectiveScroll;\n if (base && base.y) {\n // 父级已定高(如弹窗),行稍多就开虚拟,避免千行 DOM\n return rowCount > 20;\n }\n const maxOffset = 200;\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 get useVirtualScroll(): boolean {\n if (!this.virtualScroll || this.allowDrop) {\n return false;\n }\n return this.needsVerticalScroll;\n }\n\n /** 虚拟滚动必须有 y;业务自适应列宽场景不自动给仅有 x 的表补 y */\n get resolvedScroll(): { x?: string; y?: string } {\n const base = this.effectiveScroll ? { ...this.effectiveScroll } : {};\n if (this.useVirtualScroll && !base.y) {\n base.y = this.getAutoScrollY();\n }\n return base;\n }\n\n /** 虚拟滚动按数组下标追踪,避免业务主键 trackBy 导致 CDK 行复用错位 */\n virtualTrackByRow = (index: number): number => index;\n\n ngOnInit(): void {\n if (this.isCrossPageSelect === true) {\n this.isCrossPageSelectLocal = this.isCrossPageSelect;\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n ngAfterViewInit(): void {\n this.scheduleSyncHorizontalScroll();\n this.applyTableScrollMode(true);\n }\n\n ngOnDestroy(): void {\n this.unbindHeaderBodyScrollSync();\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 this.applyTableScrollMode(false);\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n this.countSelected();\n this.calculateTotal();\n if (\n changes[\"lines\"] ||\n changes[\"tableData\"] ||\n changes[\"showSelected\"] ||\n changes[\"scroll\"] ||\n changes[\"virtualScroll\"] ||\n changes[\"allowDrop\"]\n ) {\n this.scheduleSyncHorizontalScroll();\n this.applyTableScrollMode(false);\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.unbindHeaderBodyScrollSync();\n // 延后销毁/重建,避免当前 CD 周期内 ngIf 变更触发 ExpressionChanged\n setTimeout(() => {\n this.showTable = false;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.showTable = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.afterTableRender(useVirtual);\n });\n });\n });\n return;\n }\n\n this.cdr.markForCheck();\n this.afterTableRender(useVirtual);\n }\n\n private afterTableRender(useVirtual: boolean): void {\n this.scheduleSyncHorizontalScroll();\n this.bindHeaderBodyScrollSync(0);\n if (useVirtual) {\n this.refreshVirtualScrollViewport(true);\n }\n }\n\n refreshVirtualScrollViewport(forceMeasure = false): void {\n if (!this.useVirtualScroll) {\n this.bindHeaderBodyScrollSync(0);\n return;\n }\n setTimeout(() => {\n this.measureVirtualItemSize(forceMeasure);\n const viewport =\n this.nzTableComponent && this.nzTableComponent.cdkVirtualScrollViewport;\n if (viewport) {\n viewport.checkViewportSize();\n }\n this.bindHeaderBodyScrollSync(0);\n this.cdr.markForCheck();\n });\n }\n\n private measureVirtualItemSize(force = false): void {\n if (this.virtualItemSize != null && this.virtualItemSize > 0 && !force) {\n return;\n }\n const viewport =\n this.nzTableComponent && this.nzTableComponent.cdkVirtualScrollViewport;\n if (!viewport || !viewport.elementRef || !viewport.elementRef.nativeElement) {\n return;\n }\n const row = viewport.elementRef.nativeElement.querySelector(\n \"tr.hd-detail-lines-page-virtual-row\",\n ) as HTMLElement;\n if (row && row.offsetHeight > 0) {\n this.measuredVirtualItemSize = row.offsetHeight;\n }\n }\n\n private scheduleSyncHorizontalScroll(retry = 0): void {\n const delay = retry === 0 ? 0 : 50;\n setTimeout(() => {\n if (this.scroll == null) {\n this.syncHorizontalScroll();\n }\n this.bindHeaderBodyScrollSync(0);\n const afterX =\n (this.resolvedScroll && this.resolvedScroll.x) ||\n (this.tableScroll && this.tableScroll.x);\n if (\n this.scroll == null &&\n retry < 5 &&\n this.displayLines &&\n this.displayLines.length > 0 &&\n !afterX &&\n measureTableColWidth(this.nzTableComponent) === 0\n ) {\n this.scheduleSyncHorizontalScroll(retry + 1);\n }\n }, delay);\n }\n\n private getAutoScrollY(): string {\n return \"calc(100vh - 280px)\";\n }\n\n private syncHorizontalScroll(): void {\n if (this.scroll != null) {\n return;\n }\n const hasData = !!(this.displayLines && this.displayLines.length);\n const nextScroll = resolveAutoTableScroll(\n this.nzTableComponent,\n hasData,\n );\n const nextX = nextScroll ? nextScroll.x : null;\n // 自动测算只设 x;虚拟滚动才需要 y\n const nextY = this.useVirtualScroll ? this.getAutoScrollY() : null;\n const prevHasY = !!(this.tableScroll && this.tableScroll.y);\n const nextHasY = !!nextY;\n if (\n this.tableScroll &&\n this.tableScroll.x === nextX &&\n this.tableScroll.y === nextY\n ) {\n return;\n }\n this.tableScroll =\n nextX || nextY\n ? nextY\n ? { x: nextX, y: nextY }\n : { x: nextX }\n : null;\n if (prevHasY !== nextHasY) {\n this.applyTableScrollMode(true);\n return;\n }\n this.cdr.markForCheck();\n this.bindHeaderBodyScrollSync(0);\n }\n\n /** 表体横滚时同步表头;DOM 未就绪时重试 */\n private bindHeaderBodyScrollSync(retry = 0): void {\n this.unbindHeaderBodyScrollSync();\n if (!this.nzTableComponent || !(this.resolvedScroll && this.resolvedScroll.x)) {\n return;\n }\n const unbind = bindNzTableHeaderBodyScrollSync(this.nzTableComponent);\n if (unbind) {\n this.unbindBodyScroll = unbind;\n return;\n }\n if (retry < 8) {\n setTimeout(() => this.bindHeaderBodyScrollSync(retry + 1), 50);\n }\n }\n\n private unbindHeaderBodyScrollSync(): void {\n if (this.unbindBodyScroll) {\n this.unbindBodyScroll();\n this.unbindBodyScroll = null;\n }\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 this.scheduleSyncHorizontalScroll();\n this.applyTableScrollMode(false);\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 this.scheduleSyncHorizontalScroll();\n this.applyTableScrollMode(true);\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 && !this.isSelectDisabled(item)) {\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 preserveNumber: item.preserveNumber != null ? item.preserveNumber : 2,\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 this.scheduleSyncHorizontalScroll();\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 (data) {\n if (event && this.isSelectDisabled(data)) {\n return;\n }\n this.mapOfCheckedId[data[this.selectField]] = event;\n if (event) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n }\n const sourceList =\n this.listOfDisplayData && this.listOfDisplayData.length\n ? this.listOfDisplayData\n : this.displayLines;\n const selectableList = (sourceList || []).filter(\n (item) => !this.isSelectDisabled(item),\n );\n this.isAllDisplayDataChecked =\n selectableList.length > 0 &&\n selectableList.every((item) => this.mapOfCheckedId[item[this.selectField]]);\n this.isIndeterminate =\n selectableList.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 const sourceList =\n this.listOfDisplayData && this.listOfDisplayData.length\n ? this.listOfDisplayData\n : this.displayLines;\n (sourceList || []).forEach((item) => {\n if (this.isSelectDisabled(item)) {\n return;\n }\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 /** 当前行是否禁用勾选 */\n isSelectDisabled(data: any): boolean {\n return !!(\n this.selectDisabledField &&\n data &&\n data[this.selectDisabledField] === true\n );\n }\n\n /** 当前行是否失效 */\n isInvalidRow(data: any): boolean {\n return !!(\n this.rowInvalidField &&\n data &&\n data[this.rowInvalidField] === true\n );\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 // 橙色:部分完成 / 打印后修改 / 临期预警\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 { 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 onOpenChangeEvent?: Function; // select下拉展开/收起;展开时组件先清空 selectList 再回调,可用于按需请求\n onBlurEvent?: Function; // 控件失去焦点事件\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n showTime?: boolean = false; // 日期选择器是否包含时间\n require?: boolean = false; // 是否必填\n /**\n * 是否允许清空当前筛选项(Input 清空按钮、Select/Date/Cascader 等清空图标)。\n * 不传默认 true;Select 未配此项时仍可回退到 selectOption.hdAllowClear\n */\n hdAllowClear?: boolean;\n cascaderOption?: CascaderOption; // 级联选择器配置\n onChangeEventDebounceTime?: number; // change事件防抖\n onSearchEventEventDebounceTime?: number; // search事件防抖\n onOpenChangeEventDebounceTime?: number; // 下拉展开事件防抖,未配置或为0时同步触发(不防抖)\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 { 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 /**\n * 是否允许清空当前控件(Input 清空按钮、Select/Date/Cascader 等清空图标)。\n * 不传默认 true;Select 未配此项时仍可回退到 selectOption.hdAllowClear\n */\n hdAllowClear?: boolean;\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 /** RegionAddress:详细地址字段名(与 name 组成两个 FormControl) */\n addressName?: string;\n /** RegionAddress:详细地址初始值 */\n addressValue?: string;\n /** RegionAddress:详细地址占位符,默认「请输入详细地址」 */\n addressPlaceholder?: string;\n /** RegionAddress:详细地址最大长度 */\n addressMaxLength?: number;\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 RegionAddress, // 省市区级联 + 详细地址(占 2 列,注册两个 FormControl)\n}\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class HdFormService {\n constructor() {}\n}\n","import { CascaderOption } from '../model/common-type';\n\nexport const HD_CASCADER_MENU_CLASS = 'hd-cascader-menus';\n\nexport function cascaderPinyinFilter(\n inputValue: string,\n path: any[],\n pinyinField: string = 'pinyin'\n): boolean {\n if (!inputValue) {\n return true;\n }\n const keyword = inputValue.trim().toLowerCase();\n return path.some((option) => {\n const label =\n option.label != null ? String(option.label).toLowerCase() : '';\n const value =\n option.value != null ? String(option.value).toLowerCase() : '';\n const pinyin =\n option[pinyinField] != null\n ? String(option[pinyinField]).toLowerCase()\n : '';\n return (\n (label && label.indexOf(keyword) !== -1) ||\n (value && value.indexOf(keyword) !== -1) ||\n (pinyin && pinyin.indexOf(keyword) !== -1)\n );\n });\n}\n\nexport function getCascaderShowSearch(\n cascaderOption?: CascaderOption\n): boolean | { filter?: Function; sorter?: Function } {\n if (!cascaderOption) {\n return true;\n }\n if (cascaderOption.showSearch === false) {\n return false;\n }\n if (\n cascaderOption.showSearch &&\n typeof cascaderOption.showSearch === 'object'\n ) {\n return cascaderOption.showSearch;\n }\n const pinyinField = cascaderOption.pinyinField || 'pinyin';\n return {\n filter: (inputValue: string, path: any[]) =>\n cascaderPinyinFilter(inputValue, path, pinyinField),\n };\n}\n\n/** 下拉菜单 class:默认带 hd-cascader-menus,便于搜索结果按内容撑开 */\nexport function getCascaderMenuClassName(\n cascaderOption?: CascaderOption\n): string {\n const custom =\n cascaderOption && cascaderOption.menuClassName\n ? String(cascaderOption.menuClassName).trim()\n : '';\n if (!custom) {\n return HD_CASCADER_MENU_CLASS;\n }\n if (custom.indexOf(HD_CASCADER_MENU_CLASS) !== -1) {\n return custom;\n }\n return HD_CASCADER_MENU_CLASS + ' ' + custom;\n}\n\n/**\n * 合并 menuStyle。\n * 默认不强制宽度;仅当配置了 dropdownMinWidth / menuStyle 时才写入。\n */\nexport function getCascaderMenuStyle(\n cascaderOption?: CascaderOption\n): { [key: string]: string } | null {\n if (!cascaderOption) {\n return null;\n }\n const style: { [key: string]: string } = {};\n if (cascaderOption.menuStyle) {\n Object.keys(cascaderOption.menuStyle).forEach((key) => {\n style[key] = cascaderOption.menuStyle[key];\n });\n }\n if (cascaderOption.dropdownMinWidth != null) {\n const minWidthCss =\n typeof cascaderOption.dropdownMinWidth === 'number'\n ? cascaderOption.dropdownMinWidth + 'px'\n : String(cascaderOption.dropdownMinWidth);\n if (style['--hd-cascader-menu-min-width'] == null) {\n style['--hd-cascader-menu-min-width'] = minWidthCss;\n }\n }\n return Object.keys(style).length ? style : null;\n}\n","import { InjectionToken } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n/** 用户筛选条件模版(与 auth UserFilterScheme 对齐) */\r\nexport class HdFilterScheme {\r\n uuid?: string;\r\n userCode?: string;\r\n filterKey: string;\r\n templateName: string;\r\n filterValue: string;\r\n}\r\n\r\n/** 内置默认模版名 */\r\nexport const HD_FILTER_DEFAULT_SCHEME_NAME = '默认条件';\r\n\r\n/**\r\n * 业务仓实现并 provide,hd-filter 在 enableFilterScheme 时注入使用。\r\n * 不提供则开启开关也不会调接口。\r\n */\r\nexport abstract class HdFilterSchemeStore {\r\n abstract queryByFilterKey(filterKey: string): Observable<Array<HdFilterScheme>>;\r\n abstract save(scheme: HdFilterScheme): Observable<HdFilterScheme>;\r\n abstract delete(uuid: string): Observable<void>;\r\n}\r\n\r\nexport const HD_FILTER_SCHEME_STORE = new InjectionToken<HdFilterSchemeStore>('HD_FILTER_SCHEME_STORE');\r\n","import {\n Component,\n EventEmitter,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n SimpleChanges\n} from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { Filter, FilterListType } from './hd-filter.service';\nimport { FormItem, FormListType } from '../hd-form/hd-form.service';\nimport {\n getCascaderMenuClassName,\n getCascaderMenuStyle,\n getCascaderShowSearch,\n} from '../utils/cascader.util';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { InputBoolean } from 'ng-zorro-antd';\nimport {\n HD_FILTER_DEFAULT_SCHEME_NAME,\n HD_FILTER_SCHEME_STORE,\n HdFilterScheme,\n HdFilterSchemeStore\n} from './hd-filter-scheme';\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, OnChanges, OnDestroy {\n\n @Input() filterList: Array<Filter>;\n /** 是否启用筛选组(默认关闭) */\n @Input() @InputBoolean() enableFilterScheme = false;\n /** 筛选器标识,开启筛选组时必传 */\n @Input() filterSchemeKey: string;\n /** 是否去掉 hd-filter-container 的 padding,默认 false */\n @Input() @InputBoolean() hidePadding = false;\n\n @Output() searchEvent = new EventEmitter();\n @Output() resetEvent = new EventEmitter();\n\n validateFilterForm: FormGroup;\n isShowMore: boolean = true;\n filterListModular: number = 0;\n private searchSubject = new Subject<{ fn: any, event: any, selectOption?: any; }>();\n private debounceTimeout: number = 0;\n private openChangeSubject = new Subject<{ fn: any; event: any }>();\n private openChangeDebounceTimeout: number = 0;\n\n private searchSubscription: Subscription | undefined;\n private openChangeSubscription: Subscription | undefined;\n private schemeLoadSub: Subscription | undefined;\n private schemeActionSub: Subscription | undefined;\n\n /** 页面配置的初始值(虚拟「默认条件」) */\n private defaultFilterValues: { [key: string]: any } = {};\n private defaultValuesCaptured = false;\n\n schemeList: Array<HdFilterScheme> = [];\n currentScheme: HdFilterScheme = null;\n currentSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;\n schemeLoading = false;\n schemeSaving = false;\n\n switchModalVisible = false;\n switchFormList: Array<FormItem> = [];\n switchValidateForm: FormGroup;\n\n saveAsModalVisible = false;\n saveAsFormList: Array<FormItem> = [];\n saveAsValidateForm: FormGroup;\n\n readonly defaultSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;\n private readonly switchDefaultKey = '__DEFAULT__';\n\n constructor(\n private fb: FormBuilder,\n @Optional() @Inject(HD_FILTER_SCHEME_STORE) private schemeStore: HdFilterSchemeStore\n ) {\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\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 }\n\n ngOnInit() {\n this.init();\n // 首次加载只在这里请求一次;ngOnChanges 首次也会带上 enableFilterScheme/filterSchemeKey,避免重复调接口\n this.tryLoadSchemes(true);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['filterList']) {\n this.init();\n }\n if (changes['enableFilterScheme'] || changes['filterSchemeKey']) {\n // 首次变更与 ngOnInit 重复(第二次会 unsubscribe 第一次,表现为请求无返回);仅后续切换再加载\n const enableLater = changes['enableFilterScheme'] && !changes['enableFilterScheme'].firstChange;\n const keyLater = changes['filterSchemeKey'] && !changes['filterSchemeKey'].firstChange;\n if (enableLater || keyLater) {\n this.tryLoadSchemes(true);\n }\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.schemeLoadSub) {\n this.schemeLoadSub.unsubscribe();\n }\n if (this.schemeActionSub) {\n this.schemeActionSub.unsubscribe();\n }\n }\n\n get canUseScheme(): boolean {\n return !!(this.enableFilterScheme && this.filterSchemeKey && this.schemeStore);\n }\n\n private init(): void {\n this.isShowMore = true;\n if (!this.checkList(this.filterList)) {\n throw 'filter组件数据格式不规范';\n }\n if (!this.filterList) {\n this.filterList = [];\n }\n this.filterListModular = this.filterList.length % 4;\n const formGroupList = {};\n this.filterList.forEach((item, index) => {\n formGroupList[item.name] = this.fb.control(\n this.normalizeFilterControlValue(item, item.value),\n [],\n );\n item.show = index < 7;\n });\n this.validateFilterForm = this.fb.group(formGroupList);\n if (!this.defaultValuesCaptured) {\n this.defaultFilterValues = this.clonePlain(this.getFilterData());\n this.defaultValuesCaptured = true;\n }\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 this.debounceTimeout = onSearchEventDebounceTime;\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\n this.searchSubject.next({ fn, event, selectOption });\n } else {\n this.triggerEvent(fn, event, selectOption);\n }\n }\n\n onOpenChangeEvent(\n fn: any,\n open: boolean,\n onOpenChangeEventDebounceTime: any,\n filter?: Filter,\n ) {\n if (!fn) {\n return;\n }\n // 展开时先清空旧 options,避免条件变化后请求返回前仍展示上一批下拉数据\n if (open) {\n this.clearSelectOptionsOnOpen(filter);\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 /** 有 onOpenChangeEvent 时展开下拉先清空选项,由业务回调再写入新数据 */\n private clearSelectOptionsOnOpen(filter: Filter): void {\n if (!filter || !filter.selectOption) {\n return;\n }\n const opt = filter.selectOption;\n if (opt.selectList != null) {\n opt.selectList = [];\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 /** 当前展示的筛选项数量(尊重 item.show,与展开/收起一致) */\n getVisibleFilterCount(): number {\n return (this.filterList || []).filter((item) => item.show !== false).length;\n }\n\n /** 少条件时加宽字段列:1→18、2→9、≥3→6 */\n getFilterColSpan(): number {\n const n = this.getVisibleFilterCount();\n if (n === 1) {\n return 18;\n }\n if (n === 2) {\n return 9;\n }\n return 6;\n }\n\n computeOffset() {\n const visibleCount = this.getVisibleFilterCount();\n // ≤2 个可见条件时字段已加宽占满一行剩余,按钮不再 offset\n if (visibleCount <= 2) {\n return 0;\n }\n const modular = visibleCount % 4;\n if (visibleCount === 4) {\n return 18;\n }\n // ≥3:沿用原 %4 逻辑,按可见数计算(避免收起后错位)\n return this.isShowMore\n ? ((modular === 0 || visibleCount > 7) ? 0 : (3 - modular) * 6)\n : (modular === 0 ? 18 : (3 - modular) * 6);\n }\n\n private checkList(list: Array<Filter>): boolean {\n if (!list || (list && list.length === 0)) {\n return true;\n }\n const nameList = [];\n list.forEach((item) => {\n nameList.push(item.name);\n });\n if ([...new Set(nameList)].length !== list.length) {\n throw 'filter组件数据格式不规范,存在重复name值!';\n }\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 if (this.resetEvent.observers.length > 0) {\n this.resetEvent.emit(this.validateFilterForm.getRawValue());\n } else {\n this.searchEvent.emit(this.validateFilterForm.getRawValue());\n }\n }\n\n public resetFilterFormWithValue() {\n const resetValue: { [key: string]: any } = {};\n this.filterList.forEach((item) => {\n resetValue[item.name] = this.normalizeFilterControlValue(item, item.value);\n });\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 this.validateFilterForm.patchValue(patchObject);\n }\n\n isAllowClear(item: Filter): boolean {\n if (!item) {\n return true;\n }\n if (item.hdAllowClear != null) {\n return !!item.hdAllowClear;\n }\n if (item.selectOption && item.selectOption.hdAllowClear != null) {\n return !!item.selectOption.hdAllowClear;\n }\n return true;\n }\n\n // ---------- 筛选组 ----------\n\n private tryLoadSchemes(applyDefault: boolean) {\n if (!this.canUseScheme) {\n this.schemeList = [];\n this.currentScheme = null;\n this.currentSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;\n return;\n }\n this.schemeLoading = true;\n if (this.schemeLoadSub) {\n this.schemeLoadSub.unsubscribe();\n }\n this.schemeLoadSub = this.schemeStore.queryByFilterKey(this.filterSchemeKey).subscribe(\n (list) => {\n this.schemeLoading = false;\n this.schemeList = list || [];\n if (applyDefault) {\n this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);\n } else if (this.currentScheme && this.currentScheme.uuid) {\n const found = this.schemeList.find(s => s.uuid === this.currentScheme.uuid);\n this.currentScheme = found || null;\n this.currentSchemeName = found ? found.templateName : HD_FILTER_DEFAULT_SCHEME_NAME;\n }\n },\n (err) => {\n this.schemeLoading = false;\n this.showError('加载筛选模版失败:' + (err || ''));\n if (applyDefault) {\n this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);\n }\n }\n );\n }\n\n /** 展示用列表:保证有「默认条件」 */\n getDisplaySchemeList(): Array<HdFilterScheme> {\n const result: Array<HdFilterScheme> = [];\n const fromDb = this.schemeList.find(s => s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME);\n if (fromDb) {\n result.push(fromDb);\n } else {\n result.push({\n filterKey: this.filterSchemeKey,\n templateName: HD_FILTER_DEFAULT_SCHEME_NAME,\n filterValue: JSON.stringify(this.defaultFilterValues || {})\n });\n }\n (this.schemeList || []).forEach(s => {\n if (s.templateName !== HD_FILTER_DEFAULT_SCHEME_NAME) {\n result.push(s);\n }\n });\n return result;\n }\n\n openSwitchModal() {\n if (!this.canUseScheme) {\n return;\n }\n const current = this.currentScheme\n || {\n filterKey: this.filterSchemeKey,\n templateName: this.currentSchemeName || HD_FILTER_DEFAULT_SCHEME_NAME,\n filterValue: ''\n };\n this.buildSwitchFormList(this.getSwitchOptionKey(current));\n this.switchModalVisible = true;\n }\n\n closeSwitchModal() {\n this.switchModalVisible = false;\n }\n\n switchFormChangeEvent(form: FormGroup) {\n this.switchValidateForm = form;\n }\n\n getSwitchOptionKey(item: HdFilterScheme): string {\n if (!item) {\n return this.switchDefaultKey;\n }\n if (item.uuid) {\n return item.uuid;\n }\n return this.switchDefaultKey;\n }\n\n private buildSwitchFormList(selectedKey: string) {\n const selectList = this.getDisplaySchemeList().map(item => {\n return {\n value: this.getSwitchOptionKey(item),\n label: item.templateName\n };\n });\n this.switchFormList = [\n {\n type: FormListType.Select,\n label: '筛选组',\n name: 'schemeKey',\n require: true,\n width: 4,\n value: selectedKey,\n placeholder: '请选择筛选组',\n selectOption: {\n value: 'value',\n label: 'label',\n hdShowSearch: true,\n selectList: selectList\n }\n }\n ];\n }\n\n confirmSwitch(): boolean {\n if (!this.switchValidateForm || !this.switchValidateForm.valid) {\n this.showError('请选择筛选组');\n return false;\n }\n const schemeKey = this.switchValidateForm.getRawValue().schemeKey;\n if (schemeKey == null || schemeKey === '') {\n this.showError('请选择筛选组');\n return false;\n }\n const list = this.getDisplaySchemeList();\n let target: HdFilterScheme = null;\n if (schemeKey === this.switchDefaultKey) {\n target = list.find(s => s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME && !s.uuid)\n || list.find(s => s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME);\n } else {\n target = list.find(s => s.uuid === schemeKey);\n }\n if (!target) {\n this.showError('请选择筛选组');\n return false;\n }\n this.applyScheme(target, true);\n this.switchModalVisible = false;\n return true;\n }\n\n isDefaultScheme(item: HdFilterScheme): boolean {\n return !!(item && item.templateName === HD_FILTER_DEFAULT_SCHEME_NAME);\n }\n\n canDeleteCurrent(): boolean {\n return !!(this.currentScheme && this.currentScheme.uuid\n && this.currentScheme.templateName !== HD_FILTER_DEFAULT_SCHEME_NAME);\n }\n\n saveCurrentScheme() {\n if (!this.canUseScheme) {\n return;\n }\n const name = this.currentSchemeName || HD_FILTER_DEFAULT_SCHEME_NAME;\n const body: HdFilterScheme = {\n uuid: this.currentScheme && this.currentScheme.uuid ? this.currentScheme.uuid : null,\n filterKey: this.filterSchemeKey,\n templateName: name,\n filterValue: this.serializeFilterValue()\n };\n this.schemeSaving = true;\n if (this.schemeActionSub) {\n this.schemeActionSub.unsubscribe();\n }\n this.schemeActionSub = this.schemeStore.save(body).subscribe(\n (saved) => {\n this.schemeSaving = false;\n this.showSuccess('保存成功');\n this.currentScheme = saved;\n this.currentSchemeName = saved.templateName;\n this.refreshSchemeListKeepCurrent();\n },\n (err) => {\n this.schemeSaving = false;\n this.showError('保存失败:' + (err || ''));\n }\n );\n }\n\n openSaveAsModal() {\n this.buildSaveAsFormList();\n this.saveAsModalVisible = true;\n }\n\n closeSaveAsModal() {\n this.saveAsModalVisible = false;\n }\n\n saveAsFormChangeEvent(form: FormGroup) {\n this.saveAsValidateForm = form;\n }\n\n private buildSaveAsFormList() {\n this.saveAsFormList = [\n {\n type: FormListType.Input,\n label: '筛选组名称',\n name: 'templateName',\n require: true,\n width: 4,\n maxLength: 50,\n value: null,\n placeholder: '请输入筛选组名称'\n }\n ];\n }\n\n confirmSaveAs(): boolean {\n if (!this.saveAsValidateForm || !this.saveAsValidateForm.valid) {\n this.showError('请输入筛选组名称');\n return false;\n }\n const name = ((this.saveAsValidateForm.getRawValue().templateName) || '').trim();\n if (!name) {\n this.showError('请输入筛选组名称');\n return false;\n }\n if (name === HD_FILTER_DEFAULT_SCHEME_NAME) {\n this.showError('不能使用「默认条件」作为筛选组名称,请使用「保存为当前」覆盖默认条件');\n return false;\n }\n const exists = (this.schemeList || []).some(s => s.templateName === name);\n if (exists) {\n this.showError('筛选组名称已存在');\n return false;\n }\n const body: HdFilterScheme = {\n filterKey: this.filterSchemeKey,\n templateName: name,\n filterValue: this.serializeFilterValue()\n };\n this.schemeSaving = true;\n if (this.schemeActionSub) {\n this.schemeActionSub.unsubscribe();\n }\n this.schemeActionSub = this.schemeStore.save(body).subscribe(\n (saved) => {\n this.schemeSaving = false;\n this.saveAsModalVisible = false;\n this.showSuccess('另存为成功');\n this.currentScheme = saved;\n this.currentSchemeName = saved.templateName;\n this.refreshSchemeListKeepCurrent();\n },\n (err) => {\n this.schemeSaving = false;\n this.showError('另存为失败:' + (err || ''));\n }\n );\n return false;\n }\n\n deleteCurrentScheme() {\n if (!this.canDeleteCurrent()) {\n return;\n }\n const uuid = this.currentScheme.uuid;\n this.schemeSaving = true;\n if (this.schemeActionSub) {\n this.schemeActionSub.unsubscribe();\n }\n this.schemeActionSub = this.schemeStore.delete(uuid).subscribe(\n () => {\n this.schemeSaving = false;\n this.showSuccess('删除成功');\n this.schemeList = (this.schemeList || []).filter(s => s.uuid !== uuid);\n this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);\n },\n (err) => {\n this.schemeSaving = false;\n this.showError('删除失败:' + (err || ''));\n }\n );\n }\n\n private refreshSchemeListKeepCurrent() {\n if (!this.canUseScheme) {\n return;\n }\n this.schemeStore.queryByFilterKey(this.filterSchemeKey).subscribe(\n (list) => {\n this.schemeList = list || [];\n if (this.currentScheme && this.currentScheme.uuid) {\n const found = this.schemeList.find(s => s.uuid === this.currentScheme.uuid);\n if (found) {\n this.currentScheme = found;\n this.currentSchemeName = found.templateName;\n }\n }\n },\n () => { /* ignore */ }\n );\n }\n\n private applySchemeByName(name: string, emitSearch: boolean) {\n const list = this.getDisplaySchemeList();\n const target = list.find(s => s.templateName === name);\n if (target) {\n this.applyScheme(target, emitSearch);\n }\n }\n\n private applyScheme(scheme: HdFilterScheme, emitSearch: boolean) {\n this.currentScheme = scheme && scheme.uuid ? scheme : {\n filterKey: this.filterSchemeKey,\n templateName: scheme ? scheme.templateName : HD_FILTER_DEFAULT_SCHEME_NAME,\n filterValue: scheme ? scheme.filterValue : JSON.stringify(this.defaultFilterValues || {})\n };\n this.currentSchemeName = this.currentScheme.templateName || HD_FILTER_DEFAULT_SCHEME_NAME;\n\n let values: any = {};\n if (this.currentSchemeName === HD_FILTER_DEFAULT_SCHEME_NAME && !(scheme && scheme.uuid)) {\n values = this.clonePlain(this.defaultFilterValues || {});\n } else {\n try {\n values = JSON.parse(scheme.filterValue || '{}');\n } catch (e) {\n values = {};\n }\n if (this.currentSchemeName === HD_FILTER_DEFAULT_SCHEME_NAME) {\n // 库中默认条件覆盖初始值:以默认值为底,再叠加库值\n values = Object.assign({}, this.defaultFilterValues || {}, values || {});\n }\n }\n this.patchFilterValues(values);\n if (emitSearch) {\n this.submitForm();\n }\n }\n\n private serializeFilterValue(): string {\n return JSON.stringify(this.getFilterData() || {});\n }\n\n private patchFilterValues(values: { [key: string]: any }) {\n if (!this.validateFilterForm || !this.filterList) {\n return;\n }\n const patch: { [key: string]: any } = {};\n this.filterList.forEach(item => {\n if (values && Object.prototype.hasOwnProperty.call(values, item.name)) {\n patch[item.name] = this.reviveFilterValue(item, values[item.name]);\n }\n });\n this.validateFilterForm.patchValue(patch);\n }\n\n /**\n * 多选空态用 [],避免 FormControl 为 null 时 nz-select multiple 不显示 placeholder。\n * DateRange 必须保持 null(或把历史空数组归一为 null):业务侧大量用 !value 判断,\n * 若规范成 [] 会因 truthy 走进 moment(value[0]),被解析成「今天」。\n */\n private normalizeFilterControlValue(filter: Filter, value: any): any {\n if (!filter) {\n return value;\n }\n if (filter.type === FilterListType.MultipleSelect && value == null) {\n return [];\n }\n if (\n filter.type === FilterListType.DateRange &&\n (value == null || (Array.isArray(value) && value.length === 0))\n ) {\n return null;\n }\n return value;\n }\n\n private reviveFilterValue(filter: Filter, value: any): any {\n if (value == null) {\n return this.normalizeFilterControlValue(filter, value);\n }\n if (filter.type === FilterListType.DateRange) {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return null;\n }\n return value.map(v => this.parseDateLike(v));\n }\n return value;\n }\n if (filter.type === FilterListType.Date || filter.type === FilterListType.Month) {\n return this.parseDateLike(value);\n }\n return value;\n }\n\n private parseDateLike(value: any): any {\n if (value == null || value instanceof Date) {\n return value;\n }\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n const d = new Date(value);\n return isNaN(d.getTime()) ? value : d;\n }\n if (typeof value === 'number') {\n const d = new Date(value);\n return isNaN(d.getTime()) ? value : d;\n }\n return value;\n }\n\n private clonePlain(obj: any): any {\n try {\n return JSON.parse(JSON.stringify(obj == null ? {} : obj));\n } catch (e) {\n return {};\n }\n }\n\n private showSuccess(msg: string) {\n if (typeof window !== 'undefined' && (window as any).hdMessageService) {\n (window as any).hdMessageService.prototype.success(msg);\n }\n }\n\n private showError(msg: string) {\n if (typeof window !== 'undefined' && (window as any).hdMessageService) {\n (window as any).hdMessageService.prototype.error(msg);\n } else {\n // eslint-disable-next-line no-console\n console.error(msg);\n }\n }\n\n getCascaderShowSearch = getCascaderShowSearch;\n getCascaderMenuClassName = getCascaderMenuClassName;\n getCascaderMenuStyle = getCascaderMenuStyle;\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\";\nimport {\n getCascaderMenuClassName,\n getCascaderMenuStyle,\n getCascaderShowSearch,\n} from \"../utils/cascader.util\";\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 // 模板始终绑定 [formGroup],空列表时也必须有 FormGroup 实例\n this.validateHdForm = this.fb.group({});\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 this.validateHdForm = this.fb.group({});\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 formItem?: any,\n ) {\n if (!fn) {\n return;\n }\n // 展开时先清空旧 options,避免条件变化后请求返回前仍展示上一批下拉数据\n if (open) {\n this.clearSelectOptionsOnOpen(formItem);\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 /** 有 onOpenChangeEvent 时展开下拉先清空选项,由业务回调再写入新数据 */\n private clearSelectOptionsOnOpen(formItem: any): void {\n if (!formItem || !formItem.selectOption) {\n return;\n }\n const opt = formItem.selectOption;\n if (opt.selectList != null) {\n opt.selectList = [];\n }\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 // RegionAddress 固定占两列,保证级联宽与单列控件对齐\n this.formList.forEach((item) => {\n if (item.type === FormListType.RegionAddress) {\n item.width = 2;\n }\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 if (item.type === FormListType.RegionAddress) {\n const regionValue = Array.isArray(item.value) ? item.value : null;\n const addressValue =\n item.addressValue != null ? item.addressValue : null;\n const requireValidators =\n item.require && !item.hide ? [Validators.required] : [];\n if (item.validator) {\n formGroupList[item.name] = this.fb.control(\n { value: regionValue, disabled: item.disabled },\n item.require && !item.hide\n ? [Validators.required, item.validator]\n : [item.validator],\n );\n } else {\n formGroupList[item.name] = this.fb.control(\n { value: regionValue, disabled: item.disabled },\n requireValidators,\n );\n }\n formGroupList[item.addressName] = this.fb.control(\n { value: addressValue, disabled: item.disabled },\n requireValidators,\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 if (item.type === FormListType.RegionAddress && !item.addressName) {\n throw \"form组件 RegionAddress 必须配置 addressName\";\n }\n if (\n item.type === FormListType.RegionAddress &&\n (!item.cascaderOption || !item.cascaderOption.options)\n ) {\n throw \"form组件 RegionAddress 必须配置 cascaderOption.options\";\n }\n nameList.push(item.name);\n if (item.type === FormListType.RegionAddress) {\n nameList.push(item.addressName);\n }\n });\n // 校验 name / addressName 是否重复\n if ([...new Set(nameList)].length !== nameList.length) {\n throw \"form组件数据格式不规范,存在重复name值!\";\n }\n // ...more check\n return true;\n }\n\n /** RegionAddress 双控件任一脏且无效时显示 error */\n getRegionAddressValidateStatus(item: FormItem): string {\n if (!this.validateHdForm) {\n return \"\";\n }\n const region = this.validateHdForm.get(item.name);\n const address = item.addressName\n ? this.validateHdForm.get(item.addressName)\n : null;\n const invalidDirty = (control) =>\n control && control.dirty && control.invalid;\n if (invalidDirty(region) || invalidDirty(address)) {\n return \"error\";\n }\n return \"\";\n }\n\n getRegionAddressErrorTip(item: FormItem): string {\n if (!this.validateHdForm) {\n return \"\";\n }\n const region = this.validateHdForm.get(item.name);\n const address = item.addressName\n ? this.validateHdForm.get(item.addressName)\n : null;\n if (region && region.dirty && region.hasError(\"required\")) {\n return item.label + \"不能为空\";\n }\n if (address && address.dirty && address.hasError(\"required\")) {\n return \"详细地址不能为空\";\n }\n if (item.validatorKeys && region) {\n for (let i = 0; i < item.validatorKeys.length; i++) {\n const key = item.validatorKeys[i];\n if (region.hasError(key.key)) {\n return key.label;\n }\n }\n }\n return item.label + \"不能为空\";\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 /**\n * 是否允许清空:优先 FormItem.hdAllowClear,其次 selectOption.hdAllowClear,默认 true\n */\n isAllowClear(item: FormItem): boolean {\n if (!item) {\n return true;\n }\n if (item.hdAllowClear != null) {\n return !!item.hdAllowClear;\n }\n if (item.selectOption && item.selectOption.hdAllowClear != null) {\n return !!item.selectOption.hdAllowClear;\n }\n return true;\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 getCascaderShowSearch = getCascaderShowSearch;\n getCascaderMenuClassName = getCascaderMenuClassName;\n getCascaderMenuStyle = getCascaderMenuStyle;\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 { 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';\nimport { HdFormModule } from '../hd-form/hd-form.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule,\n HdFormModule\n ],\n declarations: [HdFilterComponent],\n exports: [HdFilterComponent]\n})\nexport class HdFilterModule { }\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","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 /** 列设置可见性(仅非 hide 的 ViewDom 可由设置列切换;默认 true) */\n isShow?: boolean = true;\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/selectListName 再回调\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/** 列设置缓存(IndexedDB),仅存可见 ViewDom 的 name 列表 */\nexport class FormLinesCacheOption {\n cols: Array<string> = [];\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 * as localforage from \"localforage\";\nimport {\n InputBoolean,\n NzDatePickerComponent,\n NzInputNumberComponent,\n NzRangePickerComponent,\n NzSelectComponent,\n NzTimePickerComponent,\n} from \"ng-zorro-antd\";\nimport { NzFormatEmitEvent } from \"ng-zorro-antd/core\";\nimport { Subject, Subscription } from \"rxjs\";\nimport { debounceTime } from \"rxjs/operators\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\nimport { TreeGrid } from \"../hd-table/hd-table.service\";\nimport { SelectOptionTableColumn } from \"../model/common-type\";\nimport { CommonSessionService } from \"../service/common-session.service\";\nimport { FormLine, FormLineType, FormLinesCacheOption } 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 /** 是否启用键盘方向键/Enter 在单元格间跳转,默认开启 */\n @Input() @InputBoolean() enableKeyboardOperate: boolean = true;\n @Input() @InputBoolean() tableLoading: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n /** 是否展示行勾选列,用于外部批量操作勾选行 */\n @Input() @InputBoolean() showCheckbox: boolean = false;\n /** 是否展示列设置(齿轮),默认关闭;需要时页面手工 `[showColSettings]=\"true\"`;仅非 hide 的 ViewDom 可配置,禁止拖拽调序 */\n @Input() @InputBoolean() showColSettings: boolean = false;\n /** 列设置缓存 key 片段;有值时持久化到 IndexedDB,无则仅当前会话生效 */\n @Input() uuid: string;\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 /** 表格上方自定义区域(如勾选提示),用法同 hd-table 的 tableTotal */\n @ContentChild(\"tableTotal\", { static: false })\n tableTotal: TemplateRef<any>;\n\n // 列设置\n isDropdownVisible: boolean = false;\n showListNodes: boolean = false;\n nowListNodes: Array<TreeGrid> = [];\n hideListNodes: Array<TreeGrid> = [];\n cancelNowListNodes: Array<TreeGrid> = [];\n cancelHideListNodes: Array<TreeGrid> = [];\n formLinesCacheOption: FormLinesCacheOption = new FormLinesCacheOption();\n private localforage: any = null;\n private localtionTmp: string = \"\";\n private userSession: any;\n /** 是否已从 IndexedDB 读到过列设置缓存(含 cols 为空) */\n private colsCacheLoaded: boolean = false;\n\n constructor(\n private fb: FormBuilder,\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 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 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 if (!this.userSession) {\n this.userSession = { userCode: \"dev\" };\n }\n // 缓存一下总的表单数据\n this.storeFormLinesData = this.formLinesData;\n this.initColSettings();\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 this.showColSettingsButton\n );\n }\n\n /** 是否展示列设置齿轮(有可配置 ViewDom 时) */\n get showColSettingsButton(): boolean {\n return (\n !!this.showColSettings && this.getConfigurableFormLines().length > 0\n );\n }\n\n /** 列是否渲染:hide 永不展示;ViewDom 受 isShow 控制 */\n isColumnVisible(item: FormLine): boolean {\n if (!item || item.hide) {\n return false;\n }\n if (item.type === FormLineType.ViewDom) {\n return item.isShow !== false;\n }\n return true;\n }\n\n /** 可进入列设置的字段:非 hide 的 ViewDom */\n getConfigurableFormLines(): FormLine[] {\n if (!this.formLines || !this.formLines.length) {\n return [];\n }\n return this.formLines.filter(\n (item) => item.type === FormLineType.ViewDom && !item.hide,\n );\n }\n\n private getCacheKey(): string {\n const userCode =\n (this.userSession && this.userSession.userCode) || \"dev\";\n return (\n \"hd-form-lines_\" +\n userCode +\n \"_\" +\n this.localtionTmp +\n \"_\" +\n this.uuid\n );\n }\n\n private initColSettings(): void {\n this.colsCacheLoaded = false;\n if (!this.showColSettings || !this.formLines || !this.formLines.length) {\n this.setCols();\n return;\n }\n if (!this.uuid) {\n this.setCols();\n return;\n }\n this.localforage\n .ready()\n .then(() => {\n this.localforage\n .getItem(this.getCacheKey())\n .then((value: FormLinesCacheOption) => {\n if (value && Array.isArray(value.cols)) {\n this.formLinesCacheOption = value;\n this.colsCacheLoaded = true;\n } else {\n this.formLinesCacheOption = new FormLinesCacheOption();\n this.colsCacheLoaded = false;\n }\n this.setCols();\n })\n .catch(() => {\n this.formLinesCacheOption = new FormLinesCacheOption();\n this.colsCacheLoaded = false;\n this.setCols();\n });\n })\n .catch((e) => {\n console.log(\"localforage加载异常\", e);\n this.formLinesCacheOption = new FormLinesCacheOption();\n this.colsCacheLoaded = false;\n this.setCols();\n });\n }\n\n private hasColsCache(): boolean {\n return this.colsCacheLoaded && Array.isArray(this.formLinesCacheOption.cols);\n }\n\n private saveFormLinesCacheOption(): void {\n if (!this.uuid) {\n return;\n }\n this.localforage.setItem(this.getCacheKey(), this.formLinesCacheOption);\n }\n\n /** 按 formLines 原始顺序排列节点(禁止调序时保持源顺序) */\n private sortNodesByFormLinesOrder(nodes: TreeGrid[]): TreeGrid[] {\n const order = this.getConfigurableFormLines().map((f) => f.name);\n return nodes.slice().sort((a, b) => {\n return order.indexOf(a.key) - order.indexOf(b.key);\n });\n }\n\n setCols(): void {\n this.showListNodes = false;\n this.nowListNodes = [];\n this.hideListNodes = [];\n const configurable = this.getConfigurableFormLines();\n const hasCache = this.hasColsCache();\n configurable.forEach((element) => {\n if (hasCache) {\n element.isShow = this.formLinesCacheOption.cols.includes(element.name);\n } else if (element.isShow === undefined || element.isShow === null) {\n element.isShow = true;\n }\n const node: TreeGrid = {\n title: element.label,\n key: element.name,\n checked: element.isShow !== false,\n disabled: false,\n };\n if (element.isShow !== false) {\n this.nowListNodes.push(node);\n } else {\n this.hideListNodes.push(node);\n }\n });\n this.nowListNodes = this.sortNodesByFormLinesOrder(this.nowListNodes);\n this.hideListNodes = this.sortNodesByFormLinesOrder(this.hideListNodes);\n setTimeout(() => {\n this.showListNodes = true;\n this.cdr.markForCheck();\n }, 0);\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 confirmDropdown(): void {\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(): void {\n const visibleNames = this.nowListNodes.map((item) => item.key);\n this.getConfigurableFormLines().forEach((line) => {\n line.isShow = visibleNames.includes(line.name);\n });\n this.formLinesCacheOption.cols = visibleNames;\n this.colsCacheLoaded = true;\n this.saveFormLinesCacheOption();\n this.isDropdownVisible = false;\n this.cdr.markForCheck();\n }\n\n /** 勾选/取消:仅在显示/隐藏两组间移动,不改变 formLines 顺序 */\n checkAction(event: NzFormatEmitEvent): void {\n if (event.node.origin.checked) {\n const node = this.hideListNodes.find((item) => {\n return item.key === event.node.origin.key;\n });\n if (!node) {\n return;\n }\n node.checked = true;\n this.hideListNodes = this.hideListNodes.filter((item) => {\n return item.key !== event.node.origin.key;\n });\n this.nowListNodes = this.sortNodesByFormLinesOrder(\n this.nowListNodes.concat([node]),\n );\n } else {\n const temporaryNodeList = this.hideListNodes.slice(0);\n this.nowListNodes.forEach((item) => {\n if (item.key === event.node.origin.key) {\n const innerItem = JSON.parse(JSON.stringify(item));\n innerItem.checked = false;\n temporaryNodeList.push(innerItem);\n }\n });\n this.hideListNodes = this.sortNodesByFormLinesOrder(temporaryNodeList);\n this.nowListNodes = this.nowListNodes.filter((item) => {\n return item.key !== event.node.origin.key;\n });\n }\n this.cdr.markForCheck();\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 if (!this.enableKeyboardOperate) {\n return;\n }\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.enableKeyboardOperate) {\n return;\n }\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 / isShow=false 的列不渲染 #formInputDom,不计入 collectDomList 的列下标\n if (\n typeList.includes(list[i].type) &&\n !list[i].hide &&\n list[i].isShow !== false\n ) {\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 (\n typeList.includes(list[i].type) &&\n !list[i].hide &&\n list[i].isShow !== false\n ) {\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 formItem?: any,\n ) {\n if (!fn) {\n return;\n }\n // 展开时先清空旧 options,避免条件变化后请求返回前仍展示上一批下拉数据\n if (open) {\n this.clearSelectOptionsOnOpen(formItem, line);\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 /** 有 onOpenChangeEvent 时展开下拉先清空选项,由业务回调再写入新数据 */\n private clearSelectOptionsOnOpen(formItem: any, line: any): void {\n if (!formItem || !formItem.selectOption) {\n return;\n }\n const opt = formItem.selectOption;\n if (opt.selectList != null) {\n opt.selectList = [];\n }\n if (\n opt.selectListName &&\n line &&\n line.get &&\n line.get(opt.selectListName)\n ) {\n line.get(opt.selectListName).setValue([], { emitEvent: false });\n }\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[\"formLines\"] &&\n changes[\"formLines\"].previousValue !== undefined &&\n JSON.stringify(changes[\"formLines\"].currentValue) !==\n JSON.stringify(changes[\"formLines\"].previousValue)\n ) {\n this.initColSettings();\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 preserveNumber: item.preserveNumber != null ? item.preserveNumber : 2,\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 // 关闭键盘操作时,选择框选中后不自动跳转到下一个输入控件\n if (!this.enableKeyboardOperate) {\n return;\n }\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 // 仅真正新增/复制的行在插入前单独置 true;搜索重建已有行必须为 false,\n // 否则筛选态下点「添加」会把第一行可见数据再插入一份\n formGroupObj.isHdFormLineSearchAdd = this.fb.control(false, []);\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.markSearchAddedLine(newLine);\n this.linesFormArray.insert(insertAt, newLine);\n this.calculateLineNumber();\n this.addLineEvent.emit(newLine);\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 const copiedLine = this.createLineFromValues(sourceValues, false, true);\n this.markSearchAddedLine(copiedLine);\n this.linesFormArray.insert(insertAt, copiedLine);\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 markSearchAddedLine(line: FormGroup): void {\n if (!this.isFilterData || !line) {\n return;\n }\n const flag = line.get(\"isHdFormLineSearchAdd\");\n if (flag) {\n flag.setValue(true, { emitEvent: false });\n }\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 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 && this.filterIndexStore.length > 0) {\n const insertAt =\n addIndex <= 0\n ? this.filterIndexStore[0]\n : this.filterIndexStore[addIndex - 1] + 1;\n const addedLine = {\n ...getNowLines[addIndex],\n isHdFormLineSearchAdd: false,\n };\n this.storeFormLinesData.splice(insertAt, 0, addedLine);\n for (let i = 0; i < this.filterIndexStore.length; i++) {\n if (this.filterIndexStore[i] >= insertAt) {\n this.filterIndexStore[i]++;\n }\n }\n this.filterIndexStore.splice(addIndex, 0, insertAt);\n if (this.filterStoreFormLinesData) {\n this.filterStoreFormLinesData.splice(addIndex, 0, addedLine);\n }\n const flagCtrl = (this.linesFormArray.at(addIndex) as FormGroup).get(\n \"isHdFormLineSearchAdd\",\n );\n if (flagCtrl) {\n flagCtrl.setValue(false, { emitEvent: false });\n }\n }\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 { CommonSessionService } from '../service/common-session.service';\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 providers: [CommonSessionService]\n})\nexport class HdFormLinesModule { }\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","/**\n * 表格 / 表单列宽常量(px)。\n * 使用 `as const`,发布后的 `.d.ts` 仍保留具体数值,IDE 悬停可直接看到。\n *\n * @example\n * import { ColWidth } from 'fantasy-ngzorro';\n * { width: ColWidth.enumColWidth } // 100\n */\nexport const ColWidth = {\n /** 表格小图标宽度 — 25 */\n tableImageColWidth: 25,\n /** 表格双小图标宽度 — 40 */\n tableTwoImageColWidth: 40,\n /** 单据单号列宽度 — 150 */\n billNumberColWidth: 150,\n /** 基本资料名称列宽度 — 150 */\n nameColWidth: 150,\n /** 基本资料代码列宽度 — 100 */\n codeColWidth: 100,\n /** 门店/货主/供应商 `[code]name` 展示固定宽度 — 200 */\n codeNameColWidth: 200,\n /** 枚举列宽度 — 100 */\n enumColWidth: 100,\n /** 单个日期 — 100 */\n dateColWidth: 100,\n /** 单个日期带时间 — 150 */\n dateTimeColWidth: 150,\n /** 日期范围 — 200 */\n dateRangeWidth: 200,\n /** 操作列宽度 — 150 */\n operateColWidth: 150,\n /** 数字列 — 100 */\n numberColWidth: 100,\n /** 备注列 — 250 */\n remarkColWidth: 250,\n /** 通用固定宽(超长省略)— 150 */\n fixColWidth: 150,\n /** 订单等内容缩略/展开列 — 350 */\n maxColWidth: 350,\n} as const;\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","import { InputNumber, SelectOption } from \"../model/common-type\";\n\n// 表格行\nexport class HdTableColumn {\n title: string; // 列名\n name: string | Function = null; // 字段名\n render?: (value: any) => string; // 渲染函数\n width?: number; // 列宽\n /**\n * 文字颜色。\n * 字符串:整列同色;\n * 函数:按行返回颜色(如标红返回 '#F5222D',不标色返回空)。\n */\n color?: string | ((line: any) => string);\n align?: \"right\" | \"left\" | \"center\" = \"left\";\n click?: (value: any) => void;\n /** 按行控制是否渲染为可点击超链接;未配置时只要有 click 则整列可点 */\n canClick?: (value: any) => boolean;\n fixed?: \"left\" | \"right\" = null;\n fixedWidth?: number; // 左侧固定列偏移(其左侧已固定列宽之和)\n fixedRightWidth?: number; // 右侧固定列偏移(其右侧已固定列宽之和)\n btnList?: Array<OperateBtn> = []; // title 为「操作」时整列按钮;其他列时作为单元格文案后的操作按钮\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 * 字段值后用竖线追加行号。前面的字段仍可配 click 作为超链接,行号本身不可点。\n * true:按分页连续序号(从 1 开始);\n * string:取当前行该字段作为行号。\n */\n rowNo?: boolean | string;\n /**\n * 值后显示编辑笔图标(Figma edit/edit,14px)。\n * true:整列可编辑;函数:按行控制。\n * 与 editType 互斥:配置了 editType 时走单元格内控件,不再显示编辑笔。\n */\n editable?: boolean | ((line: any) => boolean);\n /** 点击编辑笔回调,供父组件处理(如弹窗改值) */\n edit?: (line: any) => void;\n /**\n * 行内编辑类型;配置后该列常显控件。\n * name 须为 string(函数型 name 不支持行内编辑)。\n */\n editType?: \"input\" | \"inputNumber\" | \"select\" | \"date\" | \"dateRange\";\n /**\n * 行内编辑列是否必填。\n * 仅配置了 editType 时生效,列名前显示红色星号。\n */\n require?: boolean;\n /** 是否禁用行内编辑:true / 按行函数 */\n editDisabled?: boolean | ((line: any) => boolean);\n /** Select 配置(复用 SelectOption 子集) */\n selectOption?: SelectOption;\n /**\n * select 下拉展开;展开时组件先清空 selectList / 行上 selectListName,再回调 (open, line)。\n * 关闭不回调业务。用于按行按需加载选项。\n * 可 return 选项数组 / Promise / Observable,由 hd-table 写回并刷新(OnPush 下业务不必再改 tableData 引用)。\n */\n onOpenChangeEvent?: (open: boolean, line: any) => any;\n /** 下拉展开防抖(ms);未配或 0 同步触发 */\n onOpenChangeEventDebounceTime?: number;\n /**\n * select 输入搜索;回调 (keyword, line),不清空 options。\n * 远程搜索时建议同时设 selectOption.hdServerSearch = true。\n * 同样可 return 数组 / Promise / Observable,由组件写回并刷新。\n */\n onSearchEvent?: (keyword: string, line: any) => any;\n /** 搜索防抖(ms);命名对齐 form-lines;未配或 0 同步触发 */\n onSearchEventEventDebounceTime?: number;\n /** InputNumber 配置 */\n inputNumber?: InputNumber;\n /** editType 为 date / dateRange 时的日期配置 */\n dateOption?: HdTableDateOption;\n /** 输入框 / 下拉 / 日期 placeholder;日期范围占位用 dateOption.rangePlaceholder */\n placeholder?: string;\n}\n\n/** hd-table 行内编辑变更事件(乐观更新后抛出,previous* 供接口失败回滚) */\nexport class HdTableCellChange {\n line: any;\n col: HdTableColumn;\n name: string;\n value: any;\n previousValue: any;\n label?: any;\n previousLabel?: any;\n option?: any;\n previousOption?: any;\n}\n\nexport class OperateBtn {\n /** 按钮文案;支持按行动态,如 (line) => line.enabled ? '解除' : '设置' */\n name: string | ((line: any) => 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 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}\n\n/** hd-table 行内日期 / 日期范围 */\nexport class HdTableDateOption {\n /** 日期选择是否带时间;日期范围不使用 */\n showTime?: boolean;\n /** 是否显示「今天」,默认 true;仅日期选择 */\n showToday?: boolean;\n /** 不可选日期,对齐 nzDisabledDate */\n disabledDate?: (current: Date) => boolean;\n /** 显示格式。日期默认 yyyy-MM-dd,带时间默认 yyyy-MM-dd HH:mm:ss;范围默认 yyyy-MM-dd */\n format?: string;\n /** 日期范围占位,默认 ['开始日期', '结束日期'] */\n rangePlaceholder?: Array<string>;\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n SimpleChange,\n TemplateRef,\n ViewChild,\n} from \"@angular/core\";\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 { NzTableComponent } from \"ng-zorro-antd/table\";\nimport { Observable, of, Subject, Subscription } from \"rxjs\";\nimport { debounceTime, delay } from \"rxjs/operators\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\nimport { ColWidth } from \"../model/colWidth\";\nimport { Page } from \"../model/common-type\";\nimport { CommonSessionService } from \"../service/common-session.service\";\nimport {\n getTableScrollXViewportWidth,\n getTableViewportWidth,\n} from \"../utils/hd-table-scroll.util\";\nimport {\n HdTableCellChange,\n HdTableColumn,\n OperateBtn,\n TableCacheOption,\n TreeGrid,\n} from \"./hd-table.service\";\n\n/** 勾选列宽(px),与模板 nzWidth、less 兜底保持一致 */\nconst SELECT_COL_WIDTH = 40;\n\n/** 横向布局计算结果 */\ninterface HdTableHorizontalLayout {\n /** 传给 nzScroll.x;只有列宽总和 <= 0 时为 null */\n scrollX: string | null;\n /** 按声明宽比例分给各业务列的总补宽,列多时为 0 */\n fluidExtra: number;\n /** 实际渲染总宽 = 声明总宽 + fluidExtra */\n displayTotal: number;\n /** 列少、靠补宽吃满容器,不需要真正横滚 */\n isFluid: boolean;\n}\n\n/** 列多(或量不到容器宽):scroll.x = 声明总宽,正常横滚 */\nfunction fixedLayout(declaredWidth: number): HdTableHorizontalLayout {\n return {\n scrollX: `${Math.ceil(declaredWidth)}px`,\n fluidExtra: 0,\n displayTotal: declaredWidth,\n isFluid: false,\n };\n}\n\n/** 列少:scroll.x = 容器宽,差额按声明宽比例分到各业务列 */\nfunction fluidLayout(\n containerWidth: number,\n declaredWidth: number,\n): HdTableHorizontalLayout {\n const fluidExtra = Math.max(0, containerWidth - declaredWidth);\n return {\n scrollX: `${containerWidth}px`,\n fluidExtra,\n displayTotal: declaredWidth + fluidExtra,\n isFluid: true,\n };\n}\n\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, OnDestroy {\n @Input() uuid: string;\n @Input() tableCols: Array<HdTableColumn> = [];\n @Input() tableData: Page<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n /**\n * 勾选列形态。checkbox:多选(默认);radio:单选,无表头全选,selectEvent 仍回传数组(0 或 1 条)。\n */\n @Input() selectType: \"checkbox\" | \"radio\" = \"checkbox\";\n @Input() @InputBoolean() showOperateColWarpButton: boolean = false;\n /** 是否展示列设置(齿轮),默认开启;弹窗等场景可传 false 关闭 */\n @Input() @InputBoolean() showColSettings: boolean = true;\n @Input() @InputBoolean() virtualScroll: boolean = true;\n /** 手动指定行高;不传则在首屏渲染后自动测量 */\n @Input() virtualItemSize: number;\n @Input() selectField: string = \"billNumber\";\n /**\n * 行勾选禁用字段名。定义后取当前行该字段:\n * 为 true 时禁用该行勾选(全选也会跳过)。\n */\n @Input() selectDisabledField: string;\n /**\n * 行失效字段名。定义后取当前行该字段:\n * 为 true 时整行背景色为 #F7F8FA。\n */\n @Input() rowInvalidField: string;\n // 合计区域(类型与 hd-detail-lines 的 TotalOption 一致)\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<TotalOption>;\n /**\n * 合计列总数(含序号列,与 hd-detail-lines 一致);\n * 不传则按当前可见数据列数 + 1(序号)推算。\n */\n @Input() columnsNumber: number | string;\n @Output() sortEvent = new EventEmitter();\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n /** 行内编辑变更(已写回行对象;previous* 供接口失败回滚) */\n @Output() cellChange = new EventEmitter<HdTableCellChange>();\n @Input() tableLoading: boolean = false;\n /** 是否显示分页;false 时一次展示 tableData.content 全部行 */\n @Input() @InputBoolean() pagination: boolean = true;\n /**\n * 是否前端分页(对 content 全量切片)。\n * true:翻页不触发 tableSearchEvent,适合详情全量数据;\n * false(默认):服务端分页,翻页触发查询(现有列表行为)。\n * 与 pagination=false 同时用时以不分页为准。\n */\n @Input() @InputBoolean() frontPagination: 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 /** 实际渲染列宽合计(含勾选/序号 + 补宽),合计 footer 表宽用 */\n tableColWidthTotal = 0;\n\n /** 待按比例分给各业务列的总补宽;只影响展示,不写回 col.width(列宽缓存、拖拽仍用声明宽) */\n fluidExtraWidth = 0;\n\n /** 列少、靠补宽吃满容器:模板据此加 hd-table--fluid-x,隐藏 fixed-header 常驻的横滚槽 */\n fluidHorizontal = false;\n\n /** 各业务列分到的补宽(按列对象取,applyHorizontalLayout 时整表重建) */\n private fluidExtraByCol: Map<HdTableColumn, number> = new Map();\n\n /** 数据更新后待复位纵向滚动位置 */\n private pendingResetScrollTop = false;\n\n /** 当前排序,表格重建后用于恢复表头排序态 */\n private currentSortKey: string = null;\n private currentSortValue: string = null;\n\n @ViewChild(\"hdTable\", { static: false }) nzTableComponent: NzTableComponent;\n\n private totalFooterScrollBoundBody: HTMLElement = null;\n private totalFooterScrollHandler: () => void = null;\n private totalFooterSyncRetry = 0;\n\n /** 表体有竖滚条时合计 footer 才预留右侧滚动条槽 */\n totalFooterNeedYGutter = false;\n\n /** 视口/容器尺寸变化时重算 scroll.x 与合计对齐 */\n private viewportResizeTimer: any = null;\n private boundOnViewportResize: () => void = null;\n private hostResizeObserver: any = null;\n\n /** select 展开 / 搜索防抖(对齐 form-lines) */\n private selectOpenChangeSubject = new Subject<{\n fn: (open: boolean, line: any) => any;\n open: boolean;\n line: any;\n col: HdTableColumn;\n }>();\n private selectOpenChangeSubscription: Subscription | undefined;\n private selectSearchSubject = new Subject<{\n fn: (keyword: string, line: any) => any;\n keyword: string;\n line: any;\n col: HdTableColumn;\n }>();\n private selectSearchSubscription: Subscription | undefined;\n /** 异步回写 options 的订阅,避免连点搜索泄漏 */\n private selectLoaderSubscription: Subscription | undefined;\n\n constructor(\n private hostEl: ElementRef,\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 ngOnDestroy(): void {\n this.unbindTotalFooterScrollSync();\n this.unbindViewportResizeSync();\n if (this.selectOpenChangeSubscription) {\n this.selectOpenChangeSubscription.unsubscribe();\n }\n if (this.selectSearchSubscription) {\n this.selectSearchSubscription.unsubscribe();\n }\n if (this.selectLoaderSubscription) {\n this.selectLoaderSubscription.unsubscribe();\n }\n }\n\n /** 供业务在自行写回 options 后触发 OnPush 刷新(优先 return Observable/Promise 由组件处理) */\n markForCheck(): void {\n this.cdr.markForCheck();\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.bindViewportResizeSync();\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[\"selectType\"] &&\n changes[\"selectType\"][\"previousValue\"] != null &&\n changes[\"selectType\"][\"currentValue\"] !==\n changes[\"selectType\"][\"previousValue\"]\n ) {\n this.resetStatus();\n }\n if (\n changes[\"tableData\"] ||\n changes[\"tableTotalOption\"] ||\n changes[\"showTableTotal\"] ||\n changes[\"columnsNumber\"] ||\n changes[\"tableCols\"]\n ) {\n this.calculateTableTotal();\n }\n\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.pendingResetScrollTop = true;\n // 业务可能把 Page.pageSize 写成 content.length,换数据时就会走到这里,\n // 必须重算横向布局。滚动模式不变时不会重建,排序态不会被清掉。\n this.applyTableScrollMode(false);\n // 翻页/改 pageSize:主动多次复位,覆盖 CDK 异步渲染时序\n this.scheduleResetTableBodyScrollTop();\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n if (changes[\"tableData\"]) {\n this.pendingResetScrollTop = true;\n // 不论是否虚拟滚动,数据变化后都要重算横向布局\n this.applyTableScrollMode(false);\n // 数据更新后复位纵向滚动(含虚拟滚动场景)\n this.scheduleResetTableBodyScrollTop();\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 if (\n (changes[\"pagination\"] && !changes[\"pagination\"].firstChange) ||\n (changes[\"frontPagination\"] && !changes[\"frontPagination\"].firstChange)\n ) {\n // 分页模式切换需重建 nz-table(front / server / none)\n this.tablePageIndex = 1;\n this.applyTableScrollMode(true);\n this.cdr.markForCheck();\n }\n }\n\n /** 是否走前端分页(对 content 切片,不请求后端) */\n get useFrontPagination(): boolean {\n return !!this.pagination && !!this.frontPagination;\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.currentSortKey = sort && sort.key;\n this.currentSortValue = sort && sort.value;\n this.sortEvent.emit(sort);\n }\n\n getColSort(col: HdTableColumn): string | null {\n if (!col || !col.canSort || !this.currentSortKey) {\n return null;\n }\n return col.name === this.currentSortKey ? this.currentSortValue : null;\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 * 纵向可用高度扣减:按钮区/合计/分页等固定占位。\n * 必须与 dealScroll / presetScrollBeforeRemount 使用同一套,否则会误判「能放下」而不设 scroll.y。\n */\n private getScrollYMaxOffset(): number {\n return (this.tableTotal ? 180 : 140) + 216;\n }\n\n /**\n * 当前视口实际展示的行数。\n * 前端分页按 pageIndex/pageSize 切片估算,避免用全量 length 误判需要纵向滚动。\n */\n private getVisibleRowCount(): number {\n const content =\n this.tableData && this.tableData.content ? this.tableData.content : [];\n const total = content.length;\n if (!this.useFrontPagination) {\n return total;\n }\n if (total <= 0) {\n return 0;\n }\n const pageSize =\n Number(this.tablePageSize) > 0 ? Number(this.tablePageSize) : 10;\n const pageIndex =\n Number(this.tablePageIndex) > 0 ? Number(this.tablePageIndex) : 1;\n const start = (pageIndex - 1) * pageSize;\n if (start >= total) {\n return 0;\n }\n return Math.min(pageSize, total - start);\n }\n\n /** 当前页内容高度是否超出视口(需要表内纵向滚动) */\n get needsVerticalScroll(): boolean {\n const rowCount = this.getVisibleRowCount();\n if (rowCount <= 0) {\n return false;\n }\n const maxOffset = this.getScrollYMaxOffset();\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 /** 当前页数据能完整展示时不启用虚拟滚动,避免少量数据也出现滚动条 */\n get useVirtualScroll(): boolean {\n if (!this.virtualScroll) {\n return false;\n }\n return this.needsVerticalScroll;\n }\n\n getRightSticky(col: HdTableColumn): string | null {\n return col.fixed === \"right\" ? `${col.fixedRightWidth || 0}px` : null;\n }\n\n getLeftSticky(col: HdTableColumn): string | null {\n return col.fixed === \"left\" ? `${col.fixedWidth || 0}px` : null;\n }\n\n /**\n * 序号列固定宽(含 padding,可容纳 6 位如 199995)。\n * 不锁死时表体会随位数变宽(1→~64px,199995→~67px),合计行对不齐。\n */\n readonly lineNumberColWidth = 72;\n\n /** 开启合计时序号列的 left(跟在勾选列后面) */\n get lineNumberLeft(): string {\n return (this.showSelected ? SELECT_COL_WIDTH : 0) + \"px\";\n }\n\n get lineNumberColWidthPx(): string {\n return this.lineNumberColWidth + \"px\";\n }\n\n /**\n * 无 scroll.x 时合计走 fluid(width:100%)。\n * 列少时也会设 scroll.x(补宽吃满),合计走固定表宽。\n */\n get isTotalFooterFluid(): boolean {\n return !(this.scroll && this.scroll.x);\n }\n\n private isColVisible(col: HdTableColumn): boolean {\n return !!col && col.isShow !== false;\n }\n\n /** 业务列声明宽:未配置时按 fixColWidth */\n private getColDeclaredWidth(col: HdTableColumn): number {\n return col && col.width > 0 ? col.width : ColWidth.fixColWidth;\n }\n\n /** 声明列宽合计:勾选列 + 序号列 + 可见业务列,不含补宽 */\n private getDeclaredColWidthTotal(): number {\n let total = 0;\n if (this.showSelected) {\n total += SELECT_COL_WIDTH;\n }\n if (this.showTableTotal) {\n total += this.lineNumberColWidth;\n }\n (this.tableCols || []).forEach((col) => {\n if (this.isColVisible(col)) {\n total += this.getColDeclaredWidth(col);\n }\n });\n return total;\n }\n\n /** 模板里 th / td / 合计 col 用的列宽:声明宽 + 该列按比例分到的补宽 */\n getColDisplayWidth(col: HdTableColumn): number {\n const declared = this.getColDeclaredWidth(col);\n if (!col || this.fluidExtraWidth <= 0) {\n return declared;\n }\n const extra = this.fluidExtraByCol.get(col);\n return declared + (extra > 0 ? extra : 0);\n }\n\n /**\n * 把 fluidExtra 按各可见业务列声明宽比例分配(最大余数法),\n * 勾选列 / 序号列不参与;保证各列补宽之和等于 fluidExtra。\n */\n private rebuildFluidExtraByCol(fluidExtra: number): void {\n this.fluidExtraByCol = new Map();\n if (fluidExtra <= 0 || !this.tableCols || !this.tableCols.length) {\n return;\n }\n const parts: Array<{\n col: HdTableColumn;\n declared: number;\n share: number;\n frac: number;\n }> = [];\n let sumDeclared = 0;\n this.tableCols.forEach((col) => {\n if (!this.isColVisible(col)) {\n return;\n }\n const declared = this.getColDeclaredWidth(col);\n sumDeclared += declared;\n parts.push({ col, declared, share: 0, frac: 0 });\n });\n if (sumDeclared <= 0 || !parts.length) {\n return;\n }\n let assigned = 0;\n parts.forEach((part) => {\n const exact = (fluidExtra * part.declared) / sumDeclared;\n part.share = Math.floor(exact);\n part.frac = exact - part.share;\n assigned += part.share;\n });\n let remain = fluidExtra - assigned;\n parts\n .slice()\n .sort((a, b) => b.frac - a.frac)\n .forEach((part) => {\n if (remain <= 0) {\n return;\n }\n part.share += 1;\n remain -= 1;\n });\n parts.forEach((part) => {\n if (part.share > 0) {\n this.fluidExtraByCol.set(part.col, part.share);\n }\n });\n }\n\n /** 把横向布局结果写回组件状态(dealScroll / syncHorizontalScroll 共用) */\n private applyHorizontalLayout(layout: HdTableHorizontalLayout): void {\n this.fluidExtraWidth = layout.fluidExtra;\n this.fluidHorizontal = layout.isFluid;\n this.rebuildFluidExtraByCol(layout.fluidExtra);\n this.tableColWidthTotal = layout.displayTotal;\n }\n\n /** fluid → 100%;固定 → scroll.x(与表体同一套横向宽度) */\n get totalFooterTableWidth(): string {\n if (this.isTotalFooterFluid) {\n return \"100%\";\n }\n return this.scroll && this.scroll.x\n ? String(this.scroll.x)\n : this.tableColWidthTotal > 0\n ? this.tableColWidthTotal + \"px\"\n : \"100%\";\n }\n\n /** 当前页行号(跨页连续,从 1 开始) */\n getLineNumber(index: number): number {\n const page =\n Number(this.tablePageIndex) > 0 ? Number(this.tablePageIndex) : 1;\n const size =\n Number(this.tablePageSize) > 0 ? Number(this.tablePageSize) : 0;\n const rowIndex = Number(index) >= 0 ? Number(index) : 0;\n return (page - 1) * size + rowIndex + 1;\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.pagination &&\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 // 服务端分页才在初始化时抛 pageSizeChangeEvent 触发父查询;前端分页不抛\n if (\n this.pagination &&\n !this.frontPagination &&\n this.isFirstEntrySearchLocal\n ) {\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 // 必须先写好 scroll.y,再创建 nz-table。\n // ng-zorro 只在 AfterViewInit 绑一次 header/body 的 scroll 同步;\n // 若先以 y=null 创建再改成有 y,表头监听会丢,表现为列头不跟着横滚。\n this.presetScrollBeforeRemount(useVirtual);\n this.remountTable(useVirtual);\n return;\n }\n\n const prevHasX = !!(this.scroll && this.scroll.x);\n const prevHasY = !!(this.scroll && this.scroll.y);\n this.dealScroll();\n const nextHasX = !!(this.scroll && this.scroll.x);\n const nextHasY = !!(this.scroll && this.scroll.y);\n // scroll.x / scroll.y 从无到有(或反过来)时必须重建,原地改值不生效:\n // - y:ng-zorro 8 只在 AfterViewInit 绑一次表头/表体滚动同步,且决定表头是否拆成独立 table\n // - x:决定是否带 ant-table-fixed(table-layout: fixed),勾选列锁宽依赖它\n if (prevHasY !== nextHasY || prevHasX !== nextHasX) {\n this.remountTable(useVirtual);\n return;\n }\n\n this.cdr.markForCheck();\n this.afterTableRender(useVirtual);\n }\n\n /** 销毁并重建 nz-table:等 DOM 出来后再按真实容器宽重算一次横向布局 */\n private remountTable(useVirtual: boolean): void {\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 }\n\n /** 重建前预设 scroll,保证 AfterViewInit 时 header/body 结构已正确 */\n private presetScrollBeforeRemount(useVirtual: boolean): void {\n const maxOffset = this.getScrollYMaxOffset();\n const x = this.scroll ? this.scroll.x : null;\n if (this.virtualScroll && !useVirtual) {\n this.scroll = { x, y: null };\n return;\n }\n this.scroll = {\n x,\n y: `calc(100vh - ${maxOffset}px)`,\n };\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 // 实测行高后可能从「能放下」变为「超出」,需切换滚动模式\n if (this.useVirtualScroll) {\n this.applyTableScrollMode(false);\n return;\n }\n }\n setTimeout(() => {\n this.syncHorizontalScroll();\n this.flushResetTableBodyScrollTop();\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 this.flushResetTableBodyScrollTop();\n return;\n }\n setTimeout(() => {\n const viewport =\n this.nzTableComponent && this.nzTableComponent.cdkVirtualScrollViewport;\n if (!viewport) {\n this.syncHorizontalScroll();\n this.flushResetTableBodyScrollTop();\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.syncHorizontalScroll();\n viewport.checkViewportSize();\n this.flushResetTableBodyScrollTop();\n });\n } else {\n viewport.checkViewportSize();\n this.syncHorizontalScroll();\n this.flushResetTableBodyScrollTop();\n }\n });\n }\n\n /** 数据刷新后将表体纵向滚动复位到顶部 */\n private resetTableBodyScrollTop(): void {\n if (!this.nzTableComponent) {\n return;\n }\n const nzTable = this.nzTableComponent as any;\n const viewport = this.nzTableComponent.cdkVirtualScrollViewport;\n if (viewport) {\n if (typeof (viewport as any).scrollToOffset === \"function\") {\n (viewport as any).scrollToOffset(0);\n }\n if (typeof (viewport as any).scrollToIndex === \"function\") {\n (viewport as any).scrollToIndex(0);\n }\n const viewportEl =\n viewport.elementRef &&\n (viewport.elementRef.nativeElement as HTMLElement);\n if (viewportEl) {\n viewportEl.scrollTop = 0;\n }\n }\n const bodyCandidates = [\n nzTable.mixTableBodyNativeElement,\n nzTable.tableBodyNativeElement,\n nzTable.tableBodyElement && nzTable.tableBodyElement.nativeElement,\n ];\n bodyCandidates.forEach((el: HTMLElement) => {\n if (el) {\n el.scrollTop = 0;\n }\n });\n const tableMain =\n nzTable.tableMainElement &&\n (nzTable.tableMainElement.nativeElement as HTMLElement);\n if (!tableMain) {\n return;\n }\n const nodes = tableMain.querySelectorAll(\n \".ant-table-body, cdk-virtual-scroll-viewport\",\n );\n Array.prototype.forEach.call(nodes, (el: HTMLElement) => {\n el.scrollTop = 0;\n });\n }\n\n /**\n * 数据更新后多次尝试复位。\n * ng-zorro 8 + CDK 虚拟滚动会在数据刷新后异步改写 scrollTop,单次复位经常被覆盖。\n */\n private scheduleResetTableBodyScrollTop(): void {\n // 多次尝试:覆盖 nz-table / CDK 虚拟滚动异步改写 scrollTop\n const delays = [0, 50, 100];\n delays.forEach((ms, index) => {\n setTimeout(() => {\n this.resetTableBodyScrollTop();\n if (index === delays.length - 1) {\n this.pendingResetScrollTop = false;\n }\n }, ms);\n });\n }\n\n private flushResetTableBodyScrollTop(): void {\n if (!this.pendingResetScrollTop) {\n return;\n }\n this.resetTableBodyScrollTop();\n }\n\n /** 未手动传 virtualItemSize 时,从已渲染行测量真实高度 */\n measureVirtualItemSize(force = false): boolean {\n if (this.virtualItemSize != null && this.virtualItemSize > 0 && !force) {\n return false;\n }\n const viewport =\n this.nzTableComponent && this.nzTableComponent.cdkVirtualScrollViewport;\n const tableBody =\n 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 !!(\n this.tableCacheOption &&\n this.tableCacheOption.cols &&\n this.tableCacheOption.cols.length > 0\n );\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 setTimeout(() => this.syncTotalFooterWithBody());\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 += typeof btn.name === \"function\" ? \"操作\" : 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 getBtnName(btn: OperateBtn, data: any): string {\n if (typeof btn.name === \"function\") {\n return btn.name(data) || \"\";\n }\n return btn.name != null ? String(btn.name) : \"\";\n }\n\n isDangerBtn(btn: OperateBtn, data: any): boolean {\n return this.getBtnName(btn, data) === \"删除\";\n }\n\n /** 虚拟滚动开启时使用视口最大高度 */\n private getVirtualScrollY(maxOffset: number): string {\n return `calc(100vh - ${maxOffset}px)`;\n }\n\n /*\n * 横向布局(勾选列锁 40px 的关键)\n *\n * 勾选列只有在 table-layout: fixed 下才锁得住:ng-zorro 8 仅在 nzScroll.x 有值时\n * 给 table 加 ant-table-fixed;auto 布局下 table 宽 100%、每列都有 nzWidth,\n * 剩余空间会按比例摊到所有列(含勾选列),单元格上的 max-width 也不生效。\n * 所以只要有列(无论有没有数据)就一定设置 scroll.x:\n * - 列少:scroll.x = 容器宽,差额按声明宽比例分到各业务列(fluid,不出真横滚)\n * - 列多:scroll.x = 声明总宽,正常横滚\n * less 里勾选列的 40px 只是 fixed 布局下的兜底。\n */\n\n /**\n * 按声明列宽合计 + 容器宽算出横向布局。\n * 判断「是否超宽」用 offsetWidth(含竖滚条槽),避免只因竖滚条就误开横滚;\n * 补宽目标用 clientWidth 并向下取整,避免表宽多 1px 逼出横滚条。\n */\n private resolveHorizontalLayout(\n declaredColWidth: number,\n ): HdTableHorizontalLayout {\n if (declaredColWidth <= 0) {\n return {\n scrollX: null,\n fluidExtra: 0,\n displayTotal: declaredColWidth,\n isFluid: false,\n };\n }\n let compareWidth = this.nzTableComponent\n ? getTableScrollXViewportWidth(this.nzTableComponent)\n : 0;\n // 表体还没渲染出来(刚重建 / 在 spin 里)时用宿主宽兜底\n if (compareWidth <= 0 && this.hostEl && this.hostEl.nativeElement) {\n compareWidth = (this.hostEl.nativeElement as HTMLElement).offsetWidth;\n }\n // 仍量不到(如宿主在 display:none 里):先按声明宽走 fixed,等 ResizeObserver 触发再转 fluid\n if (compareWidth <= 0) {\n return fixedLayout(declaredColWidth);\n }\n // 1px 容差,避免亚像素误判\n if (declaredColWidth > compareWidth + 1) {\n return fixedLayout(declaredColWidth);\n }\n const fillWidth = this.nzTableComponent\n ? getTableViewportWidth(this.nzTableComponent)\n : 0;\n const containerWidth = Math.floor(fillWidth > 0 ? fillWidth : compareWidth);\n return fluidLayout(containerWidth, declaredColWidth);\n }\n\n /** 表格渲染后按真实容器宽校正横向布局;只改 x,y 保持不变 */\n private syncHorizontalScroll(): void {\n const prevHasX = !!(this.scroll && this.scroll.x);\n const layout = this.resolveHorizontalLayout(\n this.getDeclaredColWidthTotal(),\n );\n const unchanged =\n this.scroll &&\n this.scroll.x === layout.scrollX &&\n this.fluidExtraWidth === layout.fluidExtra &&\n this.fluidHorizontal === layout.isFluid;\n if (unchanged) {\n setTimeout(() => this.syncTotalFooterWithBody());\n return;\n }\n this.applyHorizontalLayout(layout);\n this.refreshStickyOffsets();\n this.scroll = { x: layout.scrollX, y: this.scroll ? this.scroll.y : null };\n this.cdr.markForCheck();\n // x 从无到有(或反过来)要重建才能切换 table-layout\n if (prevHasX !== !!layout.scrollX) {\n this.applyTableScrollMode(true);\n return;\n }\n setTimeout(() => this.syncHeaderBodyScrollLeft());\n }\n\n /** 手动把表体横向滚动同步到表头 / 合计 footer(兜底 ng-zorro 监听丢失的情况) */\n private syncHeaderBodyScrollLeft(): void {\n if (!this.nzTableComponent) {\n return;\n }\n const header = (this.nzTableComponent as any)\n .tableHeaderNativeElement as HTMLElement | null;\n const body = this.getTableBodyScrollEl();\n if (this.scroll && this.scroll.x && header && body) {\n if (header.scrollLeft !== body.scrollLeft) {\n header.scrollLeft = body.scrollLeft;\n }\n }\n this.syncTotalFooterWithBody();\n }\n\n /** 取表体横向滚动容器(虚拟滚动优先 viewport) */\n private getTableBodyScrollEl(): HTMLElement | null {\n if (!this.nzTableComponent) {\n return null;\n }\n const mix = (this.nzTableComponent as any)\n .mixTableBodyNativeElement as HTMLElement | null;\n if (mix) {\n return mix;\n }\n const host = this.hostEl && (this.hostEl.nativeElement as HTMLElement);\n if (!host) {\n return null;\n }\n return (\n (host.querySelector(\n \"cdk-virtual-scroll-viewport.ant-table-body\",\n ) as HTMLElement) ||\n (host.querySelector(\".ant-table-body\") as HTMLElement) ||\n null\n );\n }\n\n private getTotalFooterScrollEl(): HTMLElement | null {\n const host = this.hostEl && (this.hostEl.nativeElement as HTMLElement);\n return host\n ? (host.querySelector(\".hd-table-total-footer\") as HTMLElement)\n : null;\n }\n\n /** 表体是否出现纵向滚动条(含滚动条槽宽) */\n private bodyHasVerticalScrollbar(body: HTMLElement): boolean {\n if (!body) {\n return false;\n }\n return (\n body.scrollHeight > body.clientHeight + 1 ||\n body.offsetWidth - body.clientWidth > 1\n );\n }\n\n /**\n * 合计 footer 与表体联动:\n * - fluid(列未撑满):不横滚、不测宽,表宽 100% 与表体同比例拉伸;\n * - fixed(有 scroll.x):同步 scrollLeft;\n * - 仅当表体有竖滚条时预留右侧槽,行少无竖滚时不占位。\n */\n private syncTotalFooterWithBody(): void {\n if (!this.showTableTotal) {\n this.unbindTotalFooterScrollSync();\n if (this.totalFooterNeedYGutter) {\n this.totalFooterNeedYGutter = false;\n this.cdr.markForCheck();\n }\n return;\n }\n const footer = this.getTotalFooterScrollEl();\n const body = this.getTableBodyScrollEl();\n if (!footer) {\n if (this.totalFooterSyncRetry < 10) {\n this.totalFooterSyncRetry++;\n setTimeout(() => this.syncTotalFooterWithBody(), 50);\n }\n return;\n }\n this.totalFooterSyncRetry = 0;\n const needYGutter = !!(body && this.bodyHasVerticalScrollbar(body));\n if (this.totalFooterNeedYGutter !== needYGutter) {\n this.totalFooterNeedYGutter = needYGutter;\n this.cdr.markForCheck();\n }\n if (this.isTotalFooterFluid) {\n this.unbindTotalFooterScrollSync();\n footer.scrollLeft = 0;\n return;\n }\n if (body) {\n this.syncTotalFooterScrollLeft(body.scrollLeft);\n this.bindTotalFooterScrollSync(body);\n }\n }\n\n private syncTotalFooterScrollLeft(scrollLeft: number): void {\n const footer = this.getTotalFooterScrollEl();\n if (footer && footer.scrollLeft !== scrollLeft) {\n footer.scrollLeft = scrollLeft;\n }\n }\n\n private bindTotalFooterScrollSync(body: HTMLElement): void {\n if (!this.showTableTotal || !body || this.isTotalFooterFluid) {\n return;\n }\n if (\n this.totalFooterScrollBoundBody === body &&\n this.totalFooterScrollHandler\n ) {\n return;\n }\n this.unbindTotalFooterScrollSync();\n this.totalFooterScrollBoundBody = body;\n this.totalFooterScrollHandler = () => {\n this.syncTotalFooterScrollLeft(body.scrollLeft);\n };\n body.addEventListener(\"scroll\", this.totalFooterScrollHandler, {\n passive: true,\n } as any);\n }\n\n private unbindTotalFooterScrollSync(): void {\n if (this.totalFooterScrollBoundBody && this.totalFooterScrollHandler) {\n this.totalFooterScrollBoundBody.removeEventListener(\n \"scroll\",\n this.totalFooterScrollHandler,\n );\n }\n this.totalFooterScrollBoundBody = null;\n this.totalFooterScrollHandler = null;\n }\n\n /**\n * 监听窗口 / 容器宽度变化:重新判定 scroll.x(fluid↔fixed)与合计右侧竖滚槽,\n * 避免拉宽/缩窄屏幕后合计行宽与表体错位。\n */\n private bindViewportResizeSync(): void {\n this.boundOnViewportResize = () => this.scheduleViewportScrollSync();\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.boundOnViewportResize);\n }\n const RO =\n typeof window !== \"undefined\" ? (window as any).ResizeObserver : null;\n if (RO && this.hostEl && this.hostEl.nativeElement) {\n this.hostResizeObserver = new RO(() => this.scheduleViewportScrollSync());\n this.hostResizeObserver.observe(this.hostEl.nativeElement);\n }\n }\n\n private unbindViewportResizeSync(): void {\n if (this.boundOnViewportResize && typeof window !== \"undefined\") {\n window.removeEventListener(\"resize\", this.boundOnViewportResize);\n }\n this.boundOnViewportResize = null;\n if (this.hostResizeObserver) {\n this.hostResizeObserver.disconnect();\n this.hostResizeObserver = null;\n }\n if (this.viewportResizeTimer != null) {\n clearTimeout(this.viewportResizeTimer);\n this.viewportResizeTimer = null;\n }\n }\n\n private scheduleViewportScrollSync(): void {\n if (this.viewportResizeTimer != null) {\n clearTimeout(this.viewportResizeTimer);\n }\n this.viewportResizeTimer = setTimeout(() => {\n this.viewportResizeTimer = null;\n if (!this.tableCols || !this.tableCols.length) {\n return;\n }\n this.syncHorizontalScroll();\n // 等表体布局稳定后再校合计竖滚槽 / 横滚同步\n setTimeout(() => this.syncTotalFooterWithBody(), 50);\n }, 100);\n }\n\n /**\n * 左/右冻结偏移按展示宽累计(fluid 比例补宽后各列变宽,不能再用声明宽)。\n * 须在 applyHorizontalLayout 之后调用。\n */\n private refreshStickyOffsets(): void {\n let leftOffset = 0;\n if (this.showSelected) {\n leftOffset += SELECT_COL_WIDTH;\n }\n if (this.showTableTotal) {\n leftOffset += this.lineNumberColWidth;\n }\n (this.tableCols || []).forEach((item) => {\n if (!item.width) {\n item.width = ColWidth.fixColWidth;\n }\n if (this.isColVisible(item)) {\n item.fixedWidth = leftOffset;\n leftOffset += this.getColDisplayWidth(item);\n }\n });\n\n let rightOffset = 0;\n for (let i = (this.tableCols || []).length - 1; i >= 0; i--) {\n const item = this.tableCols[i];\n if (!this.isColVisible(item)) {\n continue;\n }\n if (item.fixed === \"right\") {\n item.fixedRightWidth = rightOffset;\n rightOffset += this.getColDisplayWidth(item);\n } else {\n item.fixedRightWidth = 0;\n }\n }\n }\n\n dealScroll() {\n (this.tableCols || []).forEach((item) => {\n if (!item.width) {\n item.width = ColWidth.fixColWidth;\n }\n });\n\n const layout = this.resolveHorizontalLayout(\n this.getDeclaredColWidthTotal(),\n );\n this.applyHorizontalLayout(layout);\n this.refreshStickyOffsets();\n const maxOffset = this.getScrollYMaxOffset();\n const useVirtual = this.useVirtualScroll;\n const scrollX = layout.scrollX;\n\n if (this.virtualScroll && !useVirtual) {\n this.scroll = {\n x: scrollX,\n y: null,\n };\n return;\n }\n\n if (!this.virtualScroll) {\n this.scroll = {\n x: scrollX,\n y: `calc(100vh - ${maxOffset}px)`,\n };\n return;\n }\n\n this.scroll = {\n x: scrollX,\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 if (!this.pagination) {\n return;\n }\n // 前端分页:只同步页码/条数,不触发父组件查询\n if (this.frontPagination) {\n if (reset) {\n this.tablePageIndex = 1;\n this.tablePageSizeChange.emit(this.tablePageSize);\n } else {\n this.tablePageIndexChange.emit(this.tablePageIndex);\n }\n this.tableCacheOption.pageSize = this.tablePageSize;\n this.saveTableCacheOption();\n // 按当前页行数重算是否需要 scroll.y(末页数据少时去掉固定高度,避免留白)\n this.pendingResetScrollTop = true;\n this.applyTableScrollMode(false);\n this.scheduleResetTableBodyScrollTop();\n this.cdr.markForCheck();\n return;\n }\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 /**\n * 底部合计:与 hd-detail-lines 相同,使用 TotalOption(insertIndex / insertValue)。\n * 开启后强制展示序号列,「合计」落在序号列下;\n * insertIndex 从 1 起对应可见数据列;未传 insertValue 时按该列 name 对 content 求和。\n */\n calculateTableTotal() {\n if (\n !this.showTableTotal ||\n !this.tableTotalOption ||\n !this.tableTotalOption.length\n ) {\n this.tableTotalOptionList = [];\n return;\n }\n const visibleCols = (this.tableCols || []).filter(\n (c) => c && c.isShow !== false,\n );\n // columnsNumber 含序号列(与 detail-lines 一致),数据槽位数 = columnsNumber - 1\n const configured = Number(this.columnsNumber);\n const columnNumber =\n configured > 1\n ? configured - 1\n : configured === 1\n ? 1\n : visibleCols.length;\n if (!columnNumber || columnNumber < 1) {\n this.tableTotalOptionList = [];\n return;\n }\n this.tableTotalOptionList = new Array(columnNumber).fill(\"\");\n const content =\n this.tableData && this.tableData.content ? this.tableData.content : [];\n this.tableTotalOption.forEach((item) => {\n if (item == null || !item.insertIndex || item.insertIndex < 1) {\n return;\n }\n let value: any = item.insertValue;\n // 未传 insertValue 时:按 insertIndex 对应可见列 name 自动求和\n if (value == null || value === \"\") {\n const col = visibleCols[item.insertIndex - 1];\n const field = col && typeof col.name === \"string\" ? col.name : null;\n if (!field) {\n return;\n }\n let sum = 0;\n let hasValue = false;\n content.forEach((row) => {\n const raw = row ? row[field] : null;\n if (raw == null || raw === \"\") {\n return;\n }\n const num = Number(raw);\n if (!isNaN(num)) {\n sum += num;\n hasValue = true;\n }\n });\n if (!hasValue) {\n return;\n }\n value = sum;\n }\n const colAtIndex = visibleCols[item.insertIndex - 1];\n this.tableTotalOptionList[item.insertIndex - 1] = {\n value,\n align: item.align || (colAtIndex && colAtIndex.align) || \"left\",\n showDecimal: item.showDecimal || false,\n preserveNumber: item.preserveNumber != null ? item.preserveNumber : 2,\n isHide: item.isHide || false,\n };\n });\n }\n\n private getTableTotalCellMeta(col: HdTableColumn, colIndex: number): any {\n if (\n !col ||\n !this.tableTotalOptionList ||\n !this.tableTotalOptionList.length\n ) {\n return null;\n }\n let visibleIndex = -1;\n for (let i = 0; i <= colIndex; i++) {\n const c = this.tableCols[i];\n if (c && c.isShow !== false) {\n visibleIndex++;\n }\n }\n if (visibleIndex < 0 || visibleIndex >= this.tableTotalOptionList.length) {\n return null;\n }\n const meta = this.tableTotalOptionList[visibleIndex];\n return meta && typeof meta === \"object\" ? meta : null;\n }\n\n /** 合计单元格展示文案(对齐 detail-lines 小数规则) */\n getTableTotalCellValue(col: HdTableColumn, colIndex: number): any {\n const meta = this.getTableTotalCellMeta(col, colIndex);\n if (!meta || meta.isHide) {\n return \"\";\n }\n const value = meta.value;\n if (!(value || value === 0)) {\n return \"\";\n }\n const preserve =\n meta.preserveNumber != null ? Number(meta.preserveNumber) : 2;\n if (value % 1 === 0 && !meta.showDecimal) {\n return value;\n }\n const factor = Math.pow(10, preserve);\n return (Math.round(Number(value) * factor) / factor).toFixed(preserve);\n }\n\n getTableTotalCellAlign(col: HdTableColumn, colIndex: number): string {\n const meta = this.getTableTotalCellMeta(col, colIndex);\n const align = (meta && meta.align) || (col && col.align) || \"left\";\n if (align === \"right\" || align === \"center\" || align === \"left\") {\n return align;\n }\n return \"left\";\n }\n\n /** 底部「共 n 条」:非分页/前端分页用 content.length,服务端分页用 totalElements */\n getTableTotalCount(): number {\n if (!this.tableData) {\n return 0;\n }\n if (!this.pagination || this.frontPagination) {\n return this.tableData.content ? this.tableData.content.length : 0;\n }\n return this.tableData.totalElements != null\n ? this.tableData.totalElements\n : 0;\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n // 先显式置 false,避免 nz-checkbox 内部状态与 mapOfCheckedId 不同步(虚拟滚动复用行时常见)\n Object.keys(this.mapOfCheckList).forEach((key) => {\n this.mapOfCheckedId[key] = false;\n });\n this.listOfDisplayData.forEach((item) => {\n const key = item[this.selectField];\n if (key != null) {\n this.mapOfCheckedId[key] = false;\n }\n });\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n this.cdr.markForCheck();\n }\n\n /** 单选:选中当前行并清掉其它行;忽略 radio 因切换而发出的 false */\n onRadioSelect(checked: boolean, data: any): void {\n if (!checked || !data) {\n this.cdr.markForCheck();\n return;\n }\n if (this.isSelectDisabled(data)) {\n this.cdr.markForCheck();\n return;\n }\n const key = data[this.selectField];\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n if (key != null) {\n this.mapOfCheckedId[key] = true;\n this.mapOfCheckList[key] = data;\n }\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n if (this.selectEvent) {\n this.selectEvent.emit(key != null ? [data] : []);\n }\n this.cdr.markForCheck();\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (this.selectType === \"radio\") {\n if (data) {\n this.onRadioSelect(event, data);\n }\n return;\n }\n if (data) {\n // 禁用行不允许勾选;取消勾选仍允许(例如数据变更前已勾选)\n if (event && this.isSelectDisabled(data)) {\n this.cdr.markForCheck();\n return;\n }\n this.mapOfCheckedId[data[this.selectField]] = event;\n if (event) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n }\n const selectableList = this.listOfDisplayData.filter(\n (item) => !this.isSelectDisabled(item),\n );\n this.isAllDisplayDataChecked =\n selectableList.length > 0 &&\n selectableList.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n selectableList.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 // 全选/取消全选均跳过禁用行(禁用行保持原勾选状态)\n if (this.isSelectDisabled(item)) {\n return;\n }\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 /** 当前行是否禁用勾选 */\n isSelectDisabled(data: any): boolean {\n return !!(\n this.selectDisabledField &&\n data &&\n data[this.selectDisabledField] === true\n );\n }\n\n /** 当前行是否失效 */\n isInvalidRow(data: any): boolean {\n return !!(\n this.rowInvalidField &&\n data &&\n data[this.rowInvalidField] === true\n );\n }\n\n /**\n * 列文字颜色:color 为函数时按行计算(用于某一行某一列标红),否则整列同色。\n */\n resolveCellColor(col: HdTableColumn, data: any): string {\n if (!col || col.color == null || col.color === \"\") {\n return null;\n }\n if (typeof col.color === \"function\") {\n const value = col.color(data);\n return value || null;\n }\n return col.color;\n }\n\n /** 可点击单元格颜色:空值固定灰,否则按列 color */\n getLinkCellColor(col: HdTableColumn, data: any, isEmpty: boolean): string {\n if (isEmpty) {\n return \"#2A3634\";\n }\n return this.resolveCellColor(col, data);\n }\n\n /** 普通文本单元格颜色:失效行统一灰,否则用列配置 color */\n getPlainCellColor(col: HdTableColumn, data: any): string {\n if (this.isInvalidRow(data)) {\n return \"#868A9C\";\n }\n return this.resolveCellColor(col, data);\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 /** 字段值后是否展示竖线行号 */\n hasRowNo(col: HdTableColumn): boolean {\n return !!(\n col &&\n (col.rowNo === true || (typeof col.rowNo === \"string\" && col.rowNo))\n );\n }\n\n /**\n * 行号文案。rowNo 为字段名时取行数据;为 true 时按当前页序号(跨页连续,从 1 开始)。\n */\n getRowNoText(col: HdTableColumn, data: any, index: number): string {\n if (!this.hasRowNo(col)) {\n return \"\";\n }\n if (typeof col.rowNo === \"string\") {\n const value = data ? data[col.rowNo] : null;\n if (value == null || value === \"\") {\n return \"\";\n }\n return String(value);\n }\n const page =\n Number(this.tablePageIndex) > 0 ? Number(this.tablePageIndex) : 1;\n const size =\n Number(this.tablePageSize) > 0 ? Number(this.tablePageSize) : 0;\n const rowIndex = Number(index) >= 0 ? Number(index) : 0;\n return String((page - 1) * size + rowIndex + 1);\n }\n\n /** 表头「配送单号 | 行」拆成短竖线,避免字符 | 拉满行高 */\n getTitleParts(col: HdTableColumn): Array<string> {\n if (\n !this.hasRowNo(col) ||\n !col ||\n !col.title ||\n String(col.title).indexOf(\"|\") < 0\n ) {\n return null;\n }\n const raw = String(col.title).split(\"|\");\n if (raw.length < 2) {\n return null;\n }\n return [raw[0].trim(), raw.slice(1).join(\"|\").trim()];\n }\n\n /** 是否显示编辑笔图标(有 editType 时走行内控件,不再显示笔) */\n isEditable(col: HdTableColumn, data: any): boolean {\n if (!col || this.hasInlineEdit(col)) {\n return false;\n }\n if (col.editable == null || col.editable === false) {\n return false;\n }\n if (typeof col.editable === \"function\") {\n return !!col.editable(data);\n }\n return !!col.editable;\n }\n\n /** 点击编辑笔,回调父组件传入的 edit */\n onEditClick(event: Event, col: HdTableColumn, data: any): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.triggerEvent(col.edit || null, data);\n }\n\n /** 列是否配置了可用的行内编辑(name 必须是 string) */\n hasInlineEdit(col: HdTableColumn): boolean {\n if (!col || !col.editType) {\n return false;\n }\n if (typeof col.name !== \"string\" || !col.name) {\n console.warn(\n \"[hd-table] editType 要求 name 为 string,列「\" +\n (col.title || \"\") +\n \"」已回退只读\",\n );\n return false;\n }\n return true;\n }\n\n isEditDisabled(col: HdTableColumn, data: any): boolean {\n if (!col || col.editDisabled == null || col.editDisabled === false) {\n return false;\n }\n if (typeof col.editDisabled === \"function\") {\n return !!col.editDisabled(data);\n }\n return !!col.editDisabled;\n }\n\n getSelectList(col: HdTableColumn, data: any): Array<any> {\n if (!col || !col.selectOption) {\n return [];\n }\n const opt = col.selectOption;\n if (opt.selectListName && data) {\n const list = data[opt.selectListName];\n return Array.isArray(list) ? list : [];\n }\n return Array.isArray(opt.selectList) ? opt.selectList : [];\n }\n\n getSelectOptionLabel(col: HdTableColumn, item: any): string {\n if (!col || !col.selectOption || !item) {\n return \"\";\n }\n const opt = col.selectOption;\n const value = item[opt.value];\n const label = item[opt.label];\n if (opt.showLabelAndValue || opt.hdShowItemCode) {\n return `[${value == null ? \"\" : value}]${label == null ? \"\" : label}`;\n }\n return label == null ? \"\" : String(label);\n }\n\n getInputNumberProp(\n col: HdTableColumn,\n key: \"min\" | \"max\" | \"step\" | \"precision\",\n fallback: number,\n ): number {\n if (!col || !col.inputNumber) {\n return fallback;\n }\n const val = col.inputNumber[key];\n return val != null ? Number(val) : fallback;\n }\n\n isDateShowTime(col: HdTableColumn): boolean {\n return !!(col && col.dateOption && col.dateOption.showTime);\n }\n\n isDateShowToday(col: HdTableColumn): boolean {\n if (!col || !col.dateOption || col.dateOption.showToday == null) {\n return true;\n }\n return col.dateOption.showToday !== false;\n }\n\n getDateFormat(col: HdTableColumn, isRange: boolean): string {\n if (col && col.dateOption && col.dateOption.format) {\n return col.dateOption.format;\n }\n if (!isRange && this.isDateShowTime(col)) {\n return \"yyyy-MM-dd HH:mm:ss\";\n }\n return \"yyyy-MM-dd\";\n }\n\n getDisabledDate(col: HdTableColumn): (current: Date) => boolean {\n if (col && col.dateOption && col.dateOption.disabledDate) {\n return col.dateOption.disabledDate;\n }\n return function () {\n return false;\n };\n }\n\n getRangePlaceholder(col: HdTableColumn): Array<string> {\n const placeholder =\n col && col.dateOption ? col.dateOption.rangePlaceholder : null;\n if (placeholder && placeholder.length >= 2) {\n return [placeholder[0], placeholder[1]];\n }\n return [\"开始日期\", \"结束日期\"];\n }\n\n /** Input / InputNumber / 日期变更:先记旧值再写回并通知父组件 */\n onCellChange(col: HdTableColumn, data: any, value: any): void {\n if (!this.hasInlineEdit(col) || !data) {\n return;\n }\n const name = col.name as string;\n const previousValue = data[name];\n data[name] = value;\n this.cellChange.emit({\n line: data,\n col,\n name,\n value,\n previousValue,\n });\n this.cdr.markForCheck();\n }\n\n /**\n * Select 展开:有 onOpenChangeEvent 时展开先清空选项再回调 (open, line);关闭不回调业务。\n * 回调若 return 数组 / Promise / Observable,由组件写回 options 并 markForCheck。\n */\n onSelectOpenChange(col: HdTableColumn, data: any, open: boolean): void {\n if (!col || !col.onOpenChangeEvent) {\n return;\n }\n if (open) {\n this.clearSelectOptionsOnOpen(col, data);\n this.cdr.markForCheck();\n }\n const fn = col.onOpenChangeEvent;\n const debounceMs =\n col.onOpenChangeEventDebounceTime != null\n ? col.onOpenChangeEventDebounceTime\n : 0;\n if (!debounceMs) {\n if (open) {\n this.handleSelectLoaderResult(col, data, fn(open, data));\n }\n return;\n }\n if (this.selectOpenChangeSubscription) {\n this.selectOpenChangeSubscription.unsubscribe();\n }\n this.selectOpenChangeSubscription = this.selectOpenChangeSubject\n .pipe(debounceTime(debounceMs))\n .subscribe(({ fn: cb, open: o, line, col: c }) => {\n if (o) {\n this.handleSelectLoaderResult(c, line, cb(o, line));\n }\n });\n this.selectOpenChangeSubject.next({ fn, open, line: data, col });\n }\n\n /**\n * Select 搜索:有 onSearchEvent 时回调 (keyword, line),不清空 options。\n * 回调若 return 数组 / Promise / Observable,由组件写回 options 并 markForCheck。\n */\n onSelectSearch(col: HdTableColumn, data: any, keyword: string): void {\n if (!col || !col.onSearchEvent) {\n return;\n }\n const fn = col.onSearchEvent;\n const debounceMs =\n col.onSearchEventEventDebounceTime != null\n ? col.onSearchEventEventDebounceTime\n : 0;\n if (!debounceMs) {\n this.handleSelectLoaderResult(col, data, fn(keyword, data));\n return;\n }\n if (this.selectSearchSubscription) {\n this.selectSearchSubscription.unsubscribe();\n }\n this.selectSearchSubscription = this.selectSearchSubject\n .pipe(debounceTime(debounceMs))\n .subscribe(({ fn: cb, keyword: kw, line, col: c }) => {\n this.handleSelectLoaderResult(c, line, cb(kw, line));\n });\n this.selectSearchSubject.next({ fn, keyword, line: data, col });\n }\n\n /** 展开时清空列 selectList 或行上 selectListName,由业务回调再写入 */\n private clearSelectOptionsOnOpen(col: HdTableColumn, data: any): void {\n if (!col || !col.selectOption) {\n return;\n }\n const opt = col.selectOption;\n if (opt.selectList != null) {\n opt.selectList = [];\n }\n if (opt.selectListName && data) {\n data[opt.selectListName] = [];\n }\n }\n\n /**\n * 处理加载回调返回值:数组直接写回;Promise/Observable 完成后写回;void 仅 markForCheck。\n * 优先写 selectListName,否则写列上 selectList。\n */\n private handleSelectLoaderResult(\n col: HdTableColumn,\n data: any,\n result: any,\n ): void {\n if (result == null) {\n this.cdr.markForCheck();\n return;\n }\n if (Array.isArray(result)) {\n this.applySelectOptions(col, data, result);\n return;\n }\n if (typeof result.then === \"function\") {\n result.then(\n (list: any) => this.applySelectOptions(col, data, list),\n () => this.cdr.markForCheck(),\n );\n return;\n }\n if (typeof result.subscribe === \"function\") {\n if (this.selectLoaderSubscription) {\n this.selectLoaderSubscription.unsubscribe();\n }\n this.selectLoaderSubscription = result.subscribe(\n (list: any) => this.applySelectOptions(col, data, list),\n () => this.cdr.markForCheck(),\n );\n return;\n }\n this.cdr.markForCheck();\n }\n\n private applySelectOptions(col: HdTableColumn, data: any, list: any): void {\n if (!col || !col.selectOption || !Array.isArray(list)) {\n this.cdr.markForCheck();\n return;\n }\n const opt = col.selectOption;\n if (opt.selectListName && data) {\n data[opt.selectListName] = list;\n } else {\n opt.selectList = list;\n }\n this.cdr.markForCheck();\n }\n\n /** Select 变更:双写 value + label,并带 previous* / option */\n onSelectChange(col: HdTableColumn, data: any, value: any): void {\n if (!this.hasInlineEdit(col) || !data) {\n return;\n }\n const name = col.name as string;\n const opt = col.selectOption;\n const labelField = opt && opt.label ? opt.label : null;\n const previousValue = data[name];\n const previousLabel = labelField ? data[labelField] : undefined;\n const list = this.getSelectList(col, data);\n const previousOption =\n previousValue == null || !opt\n ? null\n : list.find((item) => item && item[opt.value] === previousValue) ||\n null;\n const option =\n value == null || !opt\n ? null\n : list.find((item) => item && item[opt.value] === value) || null;\n\n data[name] = value;\n let label: any = undefined;\n if (labelField) {\n label = option ? option[opt.label] : null;\n data[labelField] = label;\n }\n\n this.cellChange.emit({\n line: data,\n col,\n name,\n value,\n previousValue,\n label,\n previousLabel,\n option,\n previousOption,\n });\n this.cdr.markForCheck();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\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 FormsModule,\n NgZorroAntdModule,\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, EventEmitter, Input, Output } from \"@angular/core\";\nimport { InputBoolean } from \"ng-zorro-antd\";\n\n@Component({\n selector: \"hd-tip\",\n templateUrl: \"./hd-tip.component.html\",\n styleUrls: [\"./hd-tip.component.less\"],\n})\nexport class HdTipComponent {\n @Input() showIcon: boolean = true;\n @Input() fontSize: number;\n @Input() title: string;\n /** 是否在右侧展示展开/收起,默认关闭 */\n @Input() @InputBoolean() showCollapse: boolean = false;\n /** 当前是否展开(父组件可用 [(expanded)] 控制其它区块显隐) */\n @Input() @InputBoolean() expanded: boolean = true;\n @Output() expandedChange = new EventEmitter<boolean>();\n\n /** 展开(供父组件 ViewChild 调用) */\n expand(): void {\n this.setExpanded(true);\n }\n\n /** 收起(供父组件 ViewChild 调用) */\n collapse(): void {\n this.setExpanded(false);\n }\n\n /** 切换展开/收起(供父组件 ViewChild 或点击触发) */\n toggle(): void {\n this.setExpanded(!this.expanded);\n }\n\n private setExpanded(value: boolean): void {\n if (this.expanded === value) {\n return;\n }\n this.expanded = value;\n this.expandedChange.emit(this.expanded);\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 {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from \"@angular/core\";\nimport { HdAccessoryFile, HdAccessoryGroup } from \"./hd-accessory-list.service\";\n\n@Component({\n selector: \"hd-accessory-list\",\n templateUrl: \"./hd-accessory-list.component.html\",\n styleUrls: [\"./hd-accessory-list.component.less\"],\n})\nexport class HdAccessoryListComponent implements OnInit {\n /** 分组列表:每项含 name + accessoryList */\n @Input() groups: Array<HdAccessoryGroup> = [];\n /** 分组标签后是否自动加冒号,默认 true */\n @Input() labelColon: boolean = true;\n /** 点击附件时是否默认 window.open 下载/查看,默认 true */\n @Input() autoOpen: boolean = true;\n\n /** 点击附件回调(在 autoOpen 之前触发) */\n @Output() fileClick = new EventEmitter<{\n group: HdAccessoryGroup;\n file: HdAccessoryFile;\n path: string;\n }>();\n\n constructor() {}\n\n ngOnInit() {}\n\n getFileName(file: HdAccessoryFile): string {\n if (!file || file.name == null) {\n return \"\";\n }\n return String(file.name);\n }\n\n getFilePath(file: HdAccessoryFile): string {\n if (!file || file.path == null) {\n return \"\";\n }\n return String(file.path);\n }\n\n getFileSizeText(file: HdAccessoryFile): string {\n if (!file) {\n return \"\";\n }\n const raw = file.size;\n if (raw == null || raw === \"\") {\n return \"\";\n }\n if (typeof raw === \"string\") {\n return raw;\n }\n const bytes = Number(raw);\n if (isNaN(bytes) || bytes < 0) {\n return \"\";\n }\n if (bytes < 1024) {\n return bytes + \" B\";\n }\n if (bytes < 1024 * 1024) {\n return (bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0) + \" KB\";\n }\n return (\n (bytes / (1024 * 1024)).toFixed(bytes < 10 * 1024 * 1024 ? 1 : 0) + \" MB\"\n );\n }\n\n getLabelText(group: HdAccessoryGroup): string {\n const name = group && group.name != null ? String(group.name) : \"\";\n if (!name) {\n return \"\";\n }\n if (!this.labelColon) {\n return name;\n }\n return /[::]$/.test(name) ? name : name + \":\";\n }\n\n onFileClick(\n group: HdAccessoryGroup,\n file: HdAccessoryFile,\n event: Event,\n ): void {\n if (event) {\n event.preventDefault();\n }\n const path = this.getFilePath(file);\n this.fileClick.emit({ group, file, path });\n if (this.autoOpen && path) {\n window.open(path, \"_blank\");\n }\n }\n\n // 用箭头函数:ngFor 的 trackBy 调用时不会绑定组件 this\n trackByGroup = (index: number, group: HdAccessoryGroup): any => {\n return (group && group.name) || index;\n };\n\n trackByFile = (index: number, file: HdAccessoryFile): any => {\n return this.getFilePath(file) || this.getFileName(file) || index;\n };\n}\n","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgZorroAntdModule } from \"ng-zorro-antd\";\nimport { HdAccessoryListComponent } from \"./hd-accessory-list.component\";\n\n@NgModule({\n imports: [CommonModule, NgZorroAntdModule],\n declarations: [HdAccessoryListComponent],\n exports: [HdAccessoryListComponent],\n})\nexport class HdAccessoryListModule {}\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 { HdAccessoryListModule } from './hd-accessory-list/hd-accessory-list.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 HdAccessoryListModule,\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","/** 单个附件 */\nexport class HdAccessoryFile {\n /** 展示文件名 */\n name?: string;\n /** 完整下载/查看地址(由父组件直接传入) */\n path?: string;\n /** 文件大小(可缺省;有值才展示):数字按字节格式化,字符串原样展示 */\n size?: number | string;\n}\n\n/** 附件分组:标签 + 附件列表 */\nexport class HdAccessoryGroup {\n /** 分组标签,如「营业执照扫描件」 */\n name: string;\n /** 该分组下的附件 */\n accessoryList: Array<HdAccessoryFile> = [];\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","export class TotalOption {\n insertIndex: number; // 插入下标\n /** 合计值;hd-table 可不传,按 insertIndex 对应列对 content 自动求和 */\n insertValue?: any;\n align?: string; // 靠左还是靠右\n showDecimal?: boolean; // 是否显示小数位\n preserveNumber?: number; // 保留小数位数,不传默认 2\n isHide?: boolean; // 是否隐藏, 这里只针对列会同步消失的场景\n}\n","export const StaticConst = {\n MaxPageSize: 99999999\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"]}
|