@yibozhang/pro-table 0.0.1
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 +24 -0
- package/bundles/yibozhang-pro-table.umd.js +3110 -0
- package/bundles/yibozhang-pro-table.umd.js.map +1 -0
- package/bundles/yibozhang-pro-table.umd.min.js +2 -0
- package/bundles/yibozhang-pro-table.umd.min.js.map +1 -0
- package/esm2015/lib/components/colmuns-setting/colmuns-setting.component.js +158 -0
- package/esm2015/lib/components/dynamic-search-field/dynamic-search-field.component.js +101 -0
- package/esm2015/lib/constants.js +89 -0
- package/esm2015/lib/page-container/page-container.component.js +21 -0
- package/esm2015/lib/page-container/page-container.module.js +25 -0
- package/esm2015/lib/page-public/antd-form.js +734 -0
- package/esm2015/lib/plate-input/plate-input.component.js +155 -0
- package/esm2015/lib/plate-input/plate-input.module.js +26 -0
- package/esm2015/lib/plate-input/plate-prefix-load.service.js +41 -0
- package/esm2015/lib/pro-table.component.js +983 -0
- package/esm2015/lib/pro-table.module.js +73 -0
- package/esm2015/lib/table-search-bar/table-search-bar-module.js +27 -0
- package/esm2015/lib/table-search-bar/table-search-bar.component.js +51 -0
- package/esm2015/lib/tokens.js +4 -0
- package/esm2015/lib/type.js +2 -0
- package/esm2015/public-api.js +12 -0
- package/esm2015/yibozhang-pro-table.js +13 -0
- package/fesm2015/yibozhang-pro-table.js +2448 -0
- package/fesm2015/yibozhang-pro-table.js.map +1 -0
- package/lib/components/colmuns-setting/colmuns-setting.component.d.ts +35 -0
- package/lib/components/colmuns-setting/colmuns-setting.component.d.ts.map +1 -0
- package/lib/components/dynamic-search-field/dynamic-search-field.component.d.ts +22 -0
- package/lib/components/dynamic-search-field/dynamic-search-field.component.d.ts.map +1 -0
- package/lib/constants.d.ts +20 -0
- package/lib/constants.d.ts.map +1 -0
- package/lib/page-container/page-container.component.d.ts +9 -0
- package/lib/page-container/page-container.component.d.ts.map +1 -0
- package/lib/page-container/page-container.module.d.ts +3 -0
- package/lib/page-container/page-container.module.d.ts.map +1 -0
- package/lib/page-public/antd-form.d.ts +99 -0
- package/lib/page-public/antd-form.d.ts.map +1 -0
- package/lib/plate-input/plate-input.component.d.ts +31 -0
- package/lib/plate-input/plate-input.component.d.ts.map +1 -0
- package/lib/plate-input/plate-input.module.d.ts +3 -0
- package/lib/plate-input/plate-input.module.d.ts.map +1 -0
- package/lib/plate-input/plate-prefix-load.service.d.ts +13 -0
- package/lib/plate-input/plate-prefix-load.service.d.ts.map +1 -0
- package/lib/pro-table.component.d.ts +122 -0
- package/lib/pro-table.component.d.ts.map +1 -0
- package/lib/pro-table.module.d.ts +3 -0
- package/lib/pro-table.module.d.ts.map +1 -0
- package/lib/table-search-bar/table-search-bar-module.d.ts +3 -0
- package/lib/table-search-bar/table-search-bar-module.d.ts.map +1 -0
- package/lib/table-search-bar/table-search-bar.component.d.ts +15 -0
- package/lib/table-search-bar/table-search-bar.component.d.ts.map +1 -0
- package/lib/tokens.d.ts +36 -0
- package/lib/tokens.d.ts.map +1 -0
- package/lib/type.d.ts +226 -0
- package/lib/type.d.ts.map +1 -0
- package/package.json +40 -0
- package/public-api.d.ts +9 -0
- package/public-api.d.ts.map +1 -0
- package/src/lib/styles/custom-antd.less +114 -0
- package/src/lib/styles/margin.css +90 -0
- package/src/lib/styles/theme.less +42 -0
- package/yibozhang-pro-table.d.ts +13 -0
- package/yibozhang-pro-table.d.ts.map +1 -0
- package/yibozhang-pro-table.metadata.json +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/tslib/tslib.es6.js","../../../projects/pro-table/src/lib/constants.ts","../../../projects/pro-table/src/lib/tokens.ts","../../../projects/pro-table/src/lib/pro-table.component.ts","../../../projects/pro-table/src/lib/page-container/page-container.component.ts","../../../projects/pro-table/src/lib/page-container/page-container.module.ts","../../../projects/pro-table/src/lib/plate-input/plate-input.component.ts","../../../projects/pro-table/src/lib/plate-input/plate-input.module.ts","../../../projects/pro-table/src/lib/table-search-bar/table-search-bar.component.ts","../../../projects/pro-table/src/lib/table-search-bar/table-search-bar-module.ts","../../../projects/pro-table/src/lib/components/colmuns-setting/colmuns-setting.component.ts","../../../projects/pro-table/src/lib/components/dynamic-search-field/dynamic-search-field.component.ts","../../../projects/pro-table/src/lib/pro-table.module.ts","../../../projects/pro-table/src/lib/plate-input/plate-prefix-load.service.ts","../../../projects/pro-table/src/lib/page-public/antd-form.ts"],"names":["__rest","s","e","t","p","Object","prototype","hasOwnProperty","call","indexOf","getOwnPropertySymbols","i","length","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","apply","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","this","n","v","op","TypeError","pop","push","__values","o","m","__read","r","ar","error","__spread","arguments","concat","SuppressedError","ɵ1","ɵ2","PRO_TABLE_DEFAULT_PROPS","input","name","placeHolder","disabled","select","options","allowClear","selectMultiple","inputPlate","checkbox","noStyle","date","showTime","format","mode","autoComplete","dataSource","ɵ0","backFill","defaultActiveFirstOption","returnFullData","inputNumber","min","max","precision","formatterPercent","parserPercent","custom","PRO_TABLE_DEFAULT_COLUMN","width","align","fixedLeft","fixedRight","auxiliaryColumn","PRO_TABLE_COLUMN_REMOTE","InjectionToken","PLATE_PREFIX_LOAD_SERVICE","ProTableComponent","columnRemote","showSearchBtn","showClearBtn","title","tableName","multiRow","columns","showSearchBar","showActionBar","confirmBtnText","clearBtnText","labelWidth","labelAlign","bordered","outerBordered","showPagination","frontPagination","scroll","summaryData","sortMode","showColumnSetting","multipleSort","showCheckbox","rowDisabled","autoTriggerRequest","onRowClick","EventEmitter","onRowDbClick","onValuesChange","onResetFormBeforeReload","_savedSearchParams","templateMap","Map","customTemplates","_sortMap","_sortPriority","_autoCompleteDebounceMap","_preCheckDone","_columns","_searchParams","_searchFiledColumns","_pageInfo","pageIndex","pageSize","total","pageSizeOptions","_loading","_selectedTableRow","_selectedRows","_checkedAll","_indeterminate","_serverColumns","_autoCompleteDataSources","fetchRemoteColumns","_a","getCol","_d","persistRemoteColumns","setCol","isObservable","toPromise","ngOnInit","formateInnerColumns","setSearchParams","createSearchParamsProxy","handleQuery","queryDynamicColumns","ngAfterContentInit","autoRegisterTemplates","preCheckServerColumns","res","initColumns","filter","col","map","column","field","prop","isShow","hideInTable","header","sortName","code","isEqual","data","tabColumn","console","log","checkResult","_tabColumn","item","updateTableColumns","assign","_this","columnsWithCustomRender","customRender","forEach","templateName","template","findTemplateByName","set","columnsWithCustomLabel","customLabelRender","findLabelTemplateByName","getTemplateFromContent","templateIndex","findIndex","allTemplates","toArray","tpl","actionBarTpl","imgActionBarTpl","warn","customLabelColumns","labelTemplateIndex","setSearchFormDefaultProp","valueType","fieldProps","setSelectRequest","hasIn","_b","request","flag","hideInSearch","cloneDeep","key","defaultValue","checkedValues","opt","checked","_c","sort","a","b","aOrder","isNil","order","Number","MAX_SAFE_INTEGER","bOrder","injectColumns","originalColumns","processedInjectColumns","nonAuxiliaryColumns","reorderedNonAuxiliaryColumns","remainingNonAuxiliaryColumns","injectCol","existingColIndex","existingCol","updatedCol","splice","remainingCol","hiddenCol","finalColumns","nonAuxiliaryIndex","originalCol","reorderedCol","mergedCol","target","self","Proxy","obj","String","emit","params","getSearchParams","clearEmptySearchParams","buildServerSortPayload","activeKeys","k","sorts","find","sortDataSourceInPlace","Array","isArray","keysInPriority","av","bv","cmp","compareValues","aVal","bVal","Date","getTime","localeCompare","aNum","bNum","isNaN","executeAutoCompleteDataSource","event","fieldKey","catch","useSaved","rawParams","pageInfo","reload","afterDelete","setFieldsValue","fields","keys","setFieldValue","clearSelectedRow","setColumns","getSelectedRowData","getCheckedRows","getTemplate","customTemplate","get","getToolTipTextValue","ellipsis","getTableRowChecked","isRowChecked","JSON","stringify","isRowDisabled","some","row","toggleRowChecked","stopPropagation","index","updateCheckAllStatus","availableRows","checkedCount","totalCount","toggleCheckAll","getSelectedRows","clearSelectedRows","handleFieldCheckBoxChange","checkBoxOptions","handleSearch","handleResetForm","targetColumn","originalColumn","originalFieldProps","defaultValues_1","originalOptions","includes","handlePageIndexChange","handlePageSizeChange","error_4","onSortChange","sortKey","sortOrder","getSortOrder","handleTableRowClick","handleTableRowDbClick","handleColumnsSettingConfirm","handleAutoCompleteInput","has","debouncedFn_1","debounce","evt","currentColumn","debouncedFn","getAutoCompleteDataSource","getFieldProps","getLabelTemplate","getFormItemClassName","Component","args","selector","Optional","type","Inject","Input","Output","ContentChild","ContentChildren","TemplateRef","PageContainerComponent","NgModule","imports","CommonModule","FormsModule","HttpClientModule","RouterModule","NzCardModule","ReactiveFormsModule","declarations","providers","exports","PlateInputComponent","cdr","elementRef","platePrefixLoadService","nzPopoverVisible","platePrefix","plateSuffix","platePrefixOptions","onChange","onTouched","loadPrefixOptions","handlePlatePrefix","emitValue","removeClickOutsideListener","writeValue","split","join","registerOnChange","fn","registerOnTouched","setDisabledState","isDisabled","previousDisabled","detectChanges","handlePrefixClick","preventDefault","setTimeout","attachClickOutsideListener","clickOutsideHandler","nativeElement","popoverContent","document","querySelector","clickedInPopover","contains","addEventListener","removeEventListener","undefined","ngOnDestroy","fullPlate","onBlur","handleAntdPlateSuffixBlur","toUpperCase","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","ChangeDetectorRef","ElementRef","NzGridModule","NzInputModule","NzPopoverModule","NzIconModule","TableSearchBarComponent","leftColSpan","rightColSpan","setCSSVariablesToTarget","ngAfterViewInit","NzSpaceModule","ColmunsSettingComponent","selectedColumns","afterConfirm","modalVisible","sortableInstance","initSortable","destroy","sortableContainer","Sortable","animation","ghostClass","chosenClass","dragClass","handle","onEnd","onSortEnd","oldIndex","newIndex","newSelectedColumns","movedItem","trackByColumn","toString","syncOptionsWithSelectedColumns","selectedProps","option","handleModalVisible","handleModalClose","handleSelectRemove","handleCheckBoxChange","record","handleConfirm","payload","subscribe","finally","ViewChild","static","DynamicSearchFieldComponent","cfr","component","props","valueChange","cmpRef","isCva","cvaOnChange","render","ngOnChanges","changes","firstChange","instance","applyProps","factory","resolveComponentFactory","vc","clear","createComponent","extra","componentProps","ComponentFactoryResolver","read","ViewContainerRef","NzFormModule","NzSelectModule","NzButtonModule","PageContainerModule","TableSearchBarModule","NzTableModule","PlateInputModule","NzDatePickerModule","NzModalModule","NzCheckboxModule","NzTypographyModule","DragDropModule","NzAutocompleteModule","NzInputNumberModule","NzToolTipModule","useValue","DefaultPlatePrefixLoadService","http","defaultApiUrl","post","dictCode","list","Injectable","HttpClient","AntdFormService","fb","formStore","formModifyType","labelObservers","errorMessageStore","formArrayConfigStore","INTERNAL_ID_FIELD","classPrefix","defaultErrorMessages","required","minlength","maxlength","email","pattern","createFormGroup","config","groupConfig","entries","_f","_g","isFormArrayConfig","itemConfig","uniqueIdField","formArray","createFormArrayFromConfig","initialItems","errorMessages","fieldName","errorMessageKey","fieldConfig","validators","group","resetFormGroup","reset","addFieldsConfig","formName","fieldsConfig","success","added","failed","formGroup","onFieldAdded","controlsToAdd","errorMessagesToAdd","formArrayConfigsToAdd","itemFieldName","fieldConfigTyped","controlOptions","control","disable","errorMessage","message","_e","addControl","messages","updateValueAndValidity","emitEvent","removeFieldsConfig","fieldNames","removed","onFieldRemoved","fieldsToRemove","errorMessageKeysToRemove","formArrayFields","FormArray","startsWith","removeControl","patchFormValues","values","processedValues","patchFormArray","patchValue","validateForm","valid","rawValue","getRawValue","excludeInternalFields","markAllControlsAsDirty","onlySelf","invalid","markAsDirty","FormGroup","controls","childControl","getFieldErrorMessage","controlName","errors","arrayMatch","match","mergedMessages","_h","_j","watchFormChanges","handler","setupValueChangeSubscription","watchFieldChanges","getFormClassName","formContainerSelector","timeout","observer","MutationObserver","cancelAnimationFrame","requestAnimationFrame","dom","querySelectorAll","appliedCount","style","textAlign","applyStyles","formContainer","observe","childList","subtree","attributes","getFormArray","arrayName","array","itemGroup","createItemFormGroup","generateInternalId","itemData","businessId","now","Math","random","substr","itemId","findFormArrayItemIdByBusinessField","businessIdValue","itemValue","at","internalId","idInInternalId","replace","findFormArrayItemById","getOperationType","action","filterOperationFields","filtered","newValues","itemsToDelete","Set","itemsToUpdate","itemsToAdd","operationType","filteredData","add","deleteIndices","found","removeAt","_a_1","dataToUpdate","newItem","val","valueChanges$","valueChanges","pipe","debounceTime","distinctUntilChanged","emitInitial","providedIn","FormBuilder"],"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, SuppressedError, Symbol, Iterator */\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 (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\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 __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\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 = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"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 (g && (g = 0, op[0] && (_ = 0)), _) 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 var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(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, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, 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\n/** @deprecated */\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\n/** @deprecated */\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 __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\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 = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\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: false } : 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\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\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 = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, 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, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import {\r\n InputFieldProps,\r\n InputPlateFieldProps,\r\n SelectFieldProps,\r\n SelectMultipleFieldProps,\r\n DateFieldProps,\r\n CheckboxFieldProps,\r\n AutoCompleteFieldProps,\r\n CustomFieldProps,\r\n InputNumberFieldProps,\r\n} from \"./type\";\r\n\r\nexport const PRO_TABLE_DEFAULT_PROPS: {\r\n input: InputFieldProps;\r\n inputPlate: InputPlateFieldProps;\r\n select: SelectFieldProps;\r\n selectMultiple: SelectMultipleFieldProps;\r\n date: DateFieldProps;\r\n checkbox: CheckboxFieldProps;\r\n autoComplete: AutoCompleteFieldProps;\r\n custom: CustomFieldProps;\r\n inputNumber: InputNumberFieldProps;\r\n} = {\r\n input: {\r\n name: \"\",\r\n placeHolder: \"\",\r\n disabled: false,\r\n label: \"\",\r\n value: \"\",\r\n },\r\n select: {\r\n name: \"\",\r\n options: [],\r\n disabled: false,\r\n label: \"\",\r\n value: \"\",\r\n allowClear: true,\r\n placeHolder: \"\",\r\n },\r\n selectMultiple: {\r\n name: \"\",\r\n options: [],\r\n disabled: false,\r\n label: \"\",\r\n value: [],\r\n allowClear: true,\r\n placeHolder: \"请选择\",\r\n },\r\n inputPlate: {\r\n name: \"\",\r\n label: \"\",\r\n value: \"\",\r\n },\r\n checkbox: {\r\n name: \"\",\r\n options: [],\r\n disabled: false,\r\n label: \"\",\r\n value: [],\r\n noStyle: false,\r\n },\r\n date: {\r\n name: \"\",\r\n disabled: false,\r\n label: \"\",\r\n value: \"\",\r\n allowClear: true,\r\n placeHolder: \"请选择\",\r\n showTime: false,\r\n format: \"yyyy-MM-dd\",\r\n mode: \"date\",\r\n },\r\n autoComplete: {\r\n name: \"\",\r\n disabled: false,\r\n placeHolder: \"请输入\",\r\n label: \"\",\r\n value: \"\",\r\n dataSource: () => [],\r\n backFill: false,\r\n defaultActiveFirstOption: false,\r\n returnFullData: false,\r\n },\r\n inputNumber: {\r\n name: \"\",\r\n disabled: false,\r\n label: \"\",\r\n value: \"\",\r\n placeHolder: \"请输入\",\r\n min: 0,\r\n max: 100,\r\n precision: 0,\r\n formatterPercent: (value: number) => `${value}`,\r\n parserPercent: (value: string) => value,\r\n },\r\n custom: {\r\n name: \"\",\r\n value: null,\r\n label: \"\",\r\n },\r\n};\r\n\r\nexport const PRO_TABLE_DEFAULT_COLUMN = {\r\n width: \"\",\r\n align: \"left\",\r\n fixedLeft: false,\r\n fixedRight: false,\r\n auxiliaryColumn: false,\r\n};\r\n","import { InjectionToken } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\n\r\nexport interface ProTableRemoteColumnService {\r\n /**\r\n * 查询当前表的列配置\r\n */\r\n getCol: (tableName: string, multiRow?: boolean) => Promise<any>;\r\n /**\r\n * 写入列配置\r\n */\r\n setCol?: (\r\n tableName: string,\r\n columns: Array<{\r\n field: string;\r\n isShow: boolean;\r\n header: string;\r\n sortName?: string | null;\r\n }>,\r\n multiRow?: boolean\r\n ) => Promise<any> | Observable<any>;\r\n}\r\n\r\nexport const PRO_TABLE_COLUMN_REMOTE = new InjectionToken<ProTableRemoteColumnService | null>(\r\n \"PRO_TABLE_COLUMN_REMOTE\"\r\n);\r\n\r\n/**\r\n * 车牌前缀选项接口\r\n */\r\nexport interface PlatePrefixOption {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n/**\r\n * 车牌前缀加载服务接口\r\n */\r\nexport interface PlatePrefixLoadService {\r\n /**\r\n * 加载车牌前缀选项列表\r\n */\r\n loadPrefixOptions(): Promise<PlatePrefixOption[]>;\r\n}\r\n\r\nexport const PLATE_PREFIX_LOAD_SERVICE = new InjectionToken<PlatePrefixLoadService>(\r\n \"PLATE_PREFIX_LOAD_SERVICE\"\r\n);\r\n\r\n","import {\r\n AfterContentInit,\r\n Component,\r\n ContentChild,\r\n ContentChildren,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnInit,\r\n Optional,\r\n Output,\r\n QueryList,\r\n TemplateRef,\r\n} from \"@angular/core\";\r\nimport { cloneDeep, hasIn, isNil, debounce, isEqual } from \"lodash-es\";\r\nimport { PRO_TABLE_DEFAULT_COLUMN, PRO_TABLE_DEFAULT_PROPS } from \"./constants\";\r\nimport {\r\n AutoCompleteFieldProps,\r\n CheckboxFieldProps,\r\n OptionsType,\r\n ProTableColumn,\r\n ProTablePageInfo,\r\n ProTableRequestResult,\r\n ProTableValuesChange,\r\n SelectFieldProps,\r\n} from \"./type\";\r\nimport { PRO_TABLE_COLUMN_REMOTE, ProTableRemoteColumnService } from \"./tokens\";\r\nimport { isObservable } from \"rxjs\";\r\n\r\n@Component({\r\n selector: \"app-pro-table\",\r\n templateUrl: \"./pro-table.component.html\",\r\n styleUrls: [\"./pro-table.component.css\"],\r\n})\r\nexport class ProTableComponent implements OnInit, AfterContentInit {\r\n @Input() showSearchBtn: boolean = true;\r\n\r\n @Input() showClearBtn: boolean = true;\r\n\r\n @Input() title: string | null = null;\r\n\r\n @Input() tableName: string = \"\";\r\n\r\n @Input() multiRow: boolean = false;\r\n\r\n @Input() columns: ProTableColumn[] = [];\r\n\r\n @Input() showSearchBar: boolean = true;\r\n\r\n @Input() showActionBar: boolean = true;\r\n\r\n @Input() confirmBtnText: string = \"查询\";\r\n\r\n @Input() clearBtnText: string = \"清空\";\r\n\r\n @Input() labelWidth: string = \"90px\";\r\n\r\n @Input() labelAlign: string = \"right\";\r\n\r\n @Input() dataSource: any[] = [];\r\n\r\n @Input() bordered: boolean = true;\r\n\r\n @Input() outerBordered: boolean = true;\r\n\r\n @Input() showPagination: boolean = true;\r\n\r\n @Input() frontPagination: boolean = false;\r\n\r\n @Input() scroll: { x?: string | number; y?: string | number } | null = null\r\n\r\n @Input() request: (params: any) => Promise<ProTableRequestResult>;\r\n\r\n @Input() summaryData: Record<string, any> | null = null;\r\n\r\n // 排序模式:local 本地排序;server 在线排序(提交给接口)\r\n @Input() sortMode: \"local\" | \"server\" = \"local\";\r\n\r\n @Input() showColumnSetting: boolean = false;\r\n\r\n // 是否开启多列排序(默认单列)\r\n @Input() multipleSort: boolean = false;\r\n\r\n @Input() showCheckbox: boolean = false;\r\n\r\n // 判断行是否禁用的函数\r\n @Input() rowDisabled: (data: any) => boolean = () => false;\r\n\r\n // 是否自动触发请求\r\n @Input() autoTriggerRequest: boolean = true;\r\n\r\n @Input() customTableRender?: TemplateRef<any>;\r\n\r\n @Output() onRowClick = new EventEmitter<any>();\r\n\r\n @Output() onRowDbClick = new EventEmitter<any>();\r\n\r\n @Output() onValuesChange = new EventEmitter<ProTableValuesChange>();\r\n\r\n @Output() onResetFormBeforeReload = new EventEmitter<any>();\r\n\r\n @ContentChild(\"actionBar\") actionBarTpl!: TemplateRef<any>;\r\n\r\n @ContentChild(\"ImgActionBar\") imgActionBarTpl!: TemplateRef<any>;\r\n\r\n @ContentChildren(TemplateRef) allTemplates!: QueryList<TemplateRef<any>>;\r\n\r\n private _savedSearchParams: any = {};\r\n\r\n // 存储模板映射关系 - 通过字符串名称映射到模板引用\r\n private templateMap = new Map<string, TemplateRef<any>>();\r\n\r\n // 存储所有自定义模板的引用\r\n private customTemplates = new Map<string, TemplateRef<any>>();\r\n\r\n // 记录各列排序状态:'ascend' | 'descend' | null\r\n\r\n private _sortMap: Record<string, \"ascend\" | \"descend\" | null> = {};\r\n\r\n // 记录多列排序的优先级(后设置的优先)\r\n private _sortPriority: string[] = [];\r\n\r\n // 存储每个 autoComplete 字段的防抖函数\r\n private _autoCompleteDebounceMap: Map<string, (event: Event) => void> =\r\n new Map();\r\n\r\n // 仅在初始化时运行列配置预检查,避免后续调用重复触发\r\n private _preCheckDone: boolean = false;\r\n\r\n _columns: ProTableColumn[] = [];\r\n\r\n // 筛选表单数据存储\r\n _searchParams: any = {};\r\n\r\n // 筛选表单list渲染数据\r\n _searchFiledColumns: ProTableColumn[] = [];\r\n\r\n _pageInfo: ProTablePageInfo = {\r\n pageIndex: 1,\r\n pageSize: 15,\r\n total: 100,\r\n pageSizeOptions: [10, 15, 20, 50, 100, 500, 1000],\r\n };\r\n\r\n _loading: boolean = false;\r\n\r\n _selectedTableRow: any = null;\r\n\r\n // 选中的行数据(用于复选框选择)\r\n _selectedRows: any[] = [];\r\n\r\n // 全选状态\r\n _checkedAll: boolean = false;\r\n\r\n // 半选状态(部分选中)\r\n _indeterminate: boolean = false;\r\n\r\n // 远程columns\r\n _serverColumns: ProTableColumn[] = [];\r\n\r\n // 存储 autoComplete 字段的数据源\r\n _autoCompleteDataSources: Record<string, any[]> = {};\r\n\r\n constructor(\r\n @Optional()\r\n @Inject(PRO_TABLE_COLUMN_REMOTE)\r\n private columnRemote: ProTableRemoteColumnService | null\r\n ) {}\r\n\r\n private async fetchRemoteColumns() {\r\n if (!this.columnRemote?.getCol || !this.tableName) {\r\n return null;\r\n }\r\n try {\r\n const res = await this.columnRemote.getCol(this.tableName, this.multiRow);\r\n return res;\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n private async persistRemoteColumns(columns: any[]) {\r\n if (!this.columnRemote?.setCol || !this.tableName) {\r\n return null;\r\n }\r\n try {\r\n const result = this.columnRemote.setCol(\r\n this.tableName,\r\n columns,\r\n this.multiRow\r\n );\r\n if (result && isObservable(result)) {\r\n return await result.toPromise();\r\n }\r\n return result;\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n async ngOnInit(): Promise<void> {\r\n this._searchParams = {};\r\n this.formateInnerColumns(this.columns);\r\n await this.setSearchParams(this.columns);\r\n\r\n // 使用 Proxy 包装 _searchParams,拦截表单项值变化并向外发出事件\r\n this._searchParams = this.createSearchParamsProxy(this._searchParams);\r\n if (this.autoTriggerRequest) {\r\n this.handleQuery();\r\n }\r\n this.queryDynamicColumns();\r\n }\r\n\r\n ngAfterContentInit() {\r\n // 自动注册所有自定义模板\r\n this.autoRegisterTemplates();\r\n }\r\n\r\n private async preCheckServerColumns(): Promise<boolean> {\r\n const res = await this.fetchRemoteColumns();\r\n if (!res) return false;\r\n const initColumns = this.columns\r\n .filter((col) => !col.auxiliaryColumn)\r\n .map((column) => {\r\n return {\r\n field: column.prop,\r\n isShow: !column.hideInTable, // 默认全部显示\r\n header: column.title,\r\n sortName: column.sortName || null,\r\n };\r\n });\r\n if (res.code === 0) {\r\n if (!isEqual(res.data.tabColumn, initColumns)) {\r\n const initRes = await this.persistRemoteColumns(initColumns);\r\n if (initRes) {\r\n this.queryDynamicColumns();\r\n }\r\n\r\n return false;\r\n } else {\r\n console.log(\"一致\");\r\n return true;\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n private async queryDynamicColumns() {\r\n if (!this.tableName || !this.columnRemote) return;\r\n if (!this._preCheckDone) {\r\n const checkResult = await this.preCheckServerColumns();\r\n this._preCheckDone = true;\r\n if (!checkResult) return;\r\n }\r\n const res = await this.fetchRemoteColumns();\r\n if (!res) return;\r\n if (res.code === 0) {\r\n const _tabColumn = res.data.tabColumn.map((item) => {\r\n return {\r\n title: item.header,\r\n prop: item.field,\r\n sortName: item.sortName,\r\n hideInTable: !item.isShow,\r\n };\r\n });\r\n this._serverColumns = _tabColumn;\r\n this.updateTableColumns(_tabColumn);\r\n } else if (res.code === 10) {\r\n // 如果未设置接口返回,需要默认调用一次修改函数初始化数据\r\n const initColumns = this.columns\r\n .filter((col) => !col.auxiliaryColumn)\r\n .map((column) => {\r\n return {\r\n field: column.prop,\r\n isShow: true, // 默认全部显示\r\n header: column.title,\r\n sortName: column.sortName || null,\r\n };\r\n });\r\n\r\n // 调用修改接口初始化数据\r\n const initRes = await this.persistRemoteColumns(initColumns);\r\n if (initRes) {\r\n this.queryDynamicColumns();\r\n }\r\n }\r\n }\r\n\r\n private formateInnerColumns(columns: ProTableColumn[]) {\r\n this._columns = columns\r\n .filter((item) => !item.hideInTable)\r\n .map((item) => {\r\n return { ...PRO_TABLE_DEFAULT_COLUMN, ...item } as ProTableColumn;\r\n });\r\n }\r\n\r\n // 自动注册模板的方法\r\n private autoRegisterTemplates() {\r\n // 获取所有需要自定义模板的列\r\n const columnsWithCustomRender = this._columns.filter(\r\n (col) => col.customRender\r\n );\r\n\r\n if (columnsWithCustomRender.length > 0) {\r\n // 尝试从ContentChildren中查找对应的模板\r\n columnsWithCustomRender.forEach((column) => {\r\n const templateName = column.customRender!;\r\n const template = this.findTemplateByName(templateName);\r\n\r\n if (template) {\r\n this.customTemplates.set(templateName, template);\r\n } else {\r\n }\r\n });\r\n }\r\n\r\n // 获取所有需要自定义label模板的列(使用原始columns,确保顺序正确)\r\n const columnsWithCustomLabel = this.columns.filter(\r\n (col) => col.customLabelRender\r\n );\r\n\r\n if (columnsWithCustomLabel.length > 0) {\r\n // 尝试从ContentChildren中查找对应的label模板\r\n columnsWithCustomLabel.forEach((column) => {\r\n const templateName = column.customLabelRender!;\r\n const template = this.findLabelTemplateByName(\r\n templateName,\r\n columnsWithCustomLabel\r\n );\r\n\r\n if (template) {\r\n this.customTemplates.set(templateName, template);\r\n } else {\r\n }\r\n });\r\n }\r\n }\r\n\r\n // 根据名称查找模板\r\n private findTemplateByName(templateName: string): TemplateRef<any> | null {\r\n return this.getTemplateFromContent(templateName);\r\n }\r\n\r\n // 从ContentChildren中查找指定名称的模板\r\n private getTemplateFromContent(\r\n templateName: string\r\n ): TemplateRef<any> | null {\r\n const customRenderColumns = this._columns.filter((col) => col.customRender);\r\n const templateIndex = customRenderColumns.findIndex(\r\n (col) => col.customRender === templateName\r\n );\r\n\r\n if (templateIndex >= 0) {\r\n // 获取所有模板,并过滤掉特殊模板(actionBar和ImgActionBar)\r\n // 这样可以避免因为特殊模板的位置导致索引计算错误\r\n const templates = this.allTemplates.toArray();\r\n const customTemplates = templates.filter(\r\n (tpl) => tpl !== this.actionBarTpl && tpl !== this.imgActionBarTpl\r\n );\r\n\r\n if (templateIndex < customTemplates.length) {\r\n const template = customTemplates[templateIndex];\r\n return template;\r\n }\r\n }\r\n\r\n console.warn(`未找到模板 ${templateName}`);\r\n return null;\r\n }\r\n\r\n // 根据名称查找label模板\r\n private findLabelTemplateByName(\r\n templateName: string,\r\n customLabelColumns: ProTableColumn[]\r\n ): TemplateRef<any> | null {\r\n const templateIndex = customLabelColumns.findIndex(\r\n (col) => col.customLabelRender === templateName\r\n );\r\n\r\n if (templateIndex >= 0) {\r\n // 获取所有模板,并过滤掉特殊模板(actionBar和ImgActionBar)\r\n const templates = this.allTemplates.toArray();\r\n const customTemplates = templates.filter(\r\n (tpl) => tpl !== this.actionBarTpl && tpl !== this.imgActionBarTpl\r\n );\r\n\r\n // 计算label模板的索引:需要跳过所有的customRender模板\r\n const customRenderColumns = this._columns.filter(\r\n (col) => col.customRender\r\n );\r\n const labelTemplateIndex = customRenderColumns.length + templateIndex;\r\n\r\n if (labelTemplateIndex < customTemplates.length) {\r\n const template = customTemplates[labelTemplateIndex];\r\n return template;\r\n }\r\n }\r\n\r\n console.warn(`未找到label模板 ${templateName}`);\r\n return null;\r\n }\r\n\r\n // 设置筛选表单默认属性\r\n private setSearchFormDefaultProp(columns: ProTableColumn[]) {\r\n columns.forEach((item) => {\r\n if (item.valueType) {\r\n if (item.fieldProps) {\r\n item.fieldProps = {\r\n ...PRO_TABLE_DEFAULT_PROPS[item.valueType],\r\n ...item.fieldProps,\r\n };\r\n } else {\r\n item.fieldProps = { ...PRO_TABLE_DEFAULT_PROPS[item.valueType] };\r\n }\r\n }\r\n });\r\n }\r\n\r\n // 动态设置Options\r\n private setSelectRequest(columns: ProTableColumn[]) {\r\n columns.map(async (item) => {\r\n if (item.fieldProps && hasIn(item.fieldProps, \"request\")) {\r\n try {\r\n const options = await (\r\n item.fieldProps as SelectFieldProps\r\n ).request?.();\r\n (item.fieldProps as SelectFieldProps).options = options;\r\n } catch (error) {\r\n (item.fieldProps as SelectFieldProps).options = [];\r\n }\r\n }\r\n });\r\n }\r\n\r\n private async setSearchParams(columns: ProTableColumn[]) {\r\n this._searchFiledColumns = [];\r\n columns\r\n .filter((item) => {\r\n const flag = !item.hideInSearch && item.valueType;\r\n if (flag) {\r\n this._searchFiledColumns.push(cloneDeep(item));\r\n }\r\n return flag;\r\n })\r\n .forEach((column) => {\r\n const key = column.fieldProps?.name || column.prop;\r\n let defaultValue = PRO_TABLE_DEFAULT_PROPS[column.valueType].value;\r\n\r\n // 对于checkbox类型,从options中找出checked为true的项作为默认值\r\n if (column.valueType === \"checkbox\") {\r\n const checkedValues = (column.fieldProps?.options || [])\r\n .filter((opt: OptionsType) => opt.checked)\r\n .map((opt: OptionsType) => opt.value);\r\n this._searchParams[key] =\r\n checkedValues.length > 0 ? checkedValues : defaultValue;\r\n } else {\r\n this._searchParams[key] = column.fieldProps?.value || defaultValue;\r\n }\r\n\r\n // 初始化 autoComplete 数据源\r\n if (column.valueType === \"autoComplete\") {\r\n this._autoCompleteDataSources[key] = [];\r\n }\r\n });\r\n\r\n // 根据列的 order 字段进行排序,未设置 order 的放在最后\r\n this._searchFiledColumns.sort((a: any, b: any) => {\r\n const aOrder = isNil(a?.order) ? Number.MAX_SAFE_INTEGER : a.order;\r\n const bOrder = isNil(b?.order) ? Number.MAX_SAFE_INTEGER : b.order;\r\n if (aOrder === bOrder) return 0;\r\n return aOrder - bOrder;\r\n });\r\n\r\n this.setSearchFormDefaultProp(this._searchFiledColumns);\r\n\r\n // 并发加载所有需要异步获取的选项\r\n this.setSelectRequest(this._searchFiledColumns);\r\n }\r\n\r\n private updateTableColumns(injectColumns: ProTableColumn[]) {\r\n // 1. 使用最原始的columns作为数据源,确保辅助列完全不受影响\r\n const originalColumns = cloneDeep(this.columns);\r\n\r\n // 2. 处理字段映射(如果提供了fields参数)\r\n let processedInjectColumns = injectColumns;\r\n\r\n // 3. 分离辅助列和非辅助列(使用原始数据)\r\n const nonAuxiliaryColumns = originalColumns.filter(\r\n (col) => !col.auxiliaryColumn\r\n );\r\n\r\n // 4. 按照injectColumns的顺序重新排列非辅助列\r\n const reorderedNonAuxiliaryColumns: ProTableColumn[] = [];\r\n const remainingNonAuxiliaryColumns = [...nonAuxiliaryColumns]; // 复制一份用于查找和移除\r\n\r\n processedInjectColumns.forEach((injectCol) => {\r\n // 查找非辅助列中对应的下标\r\n const existingColIndex = remainingNonAuxiliaryColumns.findIndex(\r\n (col) => col.prop === injectCol.prop\r\n );\r\n if (existingColIndex !== -1) {\r\n // 如果找到相同列,用injectColumns中的属性覆盖原始columns中的属性\r\n const existingCol = remainingNonAuxiliaryColumns[existingColIndex];\r\n\r\n const updatedCol = { ...existingCol, ...injectCol };\r\n reorderedNonAuxiliaryColumns.push(updatedCol);\r\n // 从剩余数组中移除,避免重复\r\n remainingNonAuxiliaryColumns.splice(existingColIndex, 1);\r\n } else {\r\n // 如果没找到对应的列,直接添加injectColumns中的列\r\n reorderedNonAuxiliaryColumns.push(injectCol);\r\n }\r\n });\r\n\r\n // 5. 处理剩余的原始columns中的非辅助列(在injectColumns中未出现的列)\r\n // 这些列应该被隐藏(设置hideInTable为true)\r\n remainingNonAuxiliaryColumns.forEach((remainingCol) => {\r\n const hiddenCol = { ...remainingCol, hideInTable: true };\r\n reorderedNonAuxiliaryColumns.push(hiddenCol);\r\n });\r\n\r\n // 6. 按照原始columns的顺序重新组合:保持辅助列的原始位置和属性\r\n const finalColumns: ProTableColumn[] = [];\r\n let nonAuxiliaryIndex = 0;\r\n let auxiliaryIndex = 0;\r\n\r\n originalColumns.forEach((originalCol) => {\r\n if (originalCol.auxiliaryColumn) {\r\n // 如果是辅助列,使用原始列数据,完全不进行任何修改\r\n finalColumns.push(originalCol);\r\n auxiliaryIndex++;\r\n } else {\r\n // 如果是非辅助列,使用重新排序后的列,但保留原始列的所有属性\r\n const reorderedCol = reorderedNonAuxiliaryColumns[nonAuxiliaryIndex];\r\n if (reorderedCol) {\r\n // 合并原始列和重新排序后的列,确保保留所有原始属性\r\n const mergedCol = { ...originalCol, ...reorderedCol };\r\n finalColumns.push(mergedCol);\r\n } else {\r\n // 如果重新排序后的列不存在,使用原始列\r\n finalColumns.push(originalCol);\r\n }\r\n nonAuxiliaryIndex++;\r\n }\r\n });\r\n this.formateInnerColumns(finalColumns);\r\n }\r\n\r\n // 通过 Proxy 监听 _searchParams 的属性变更\r\n private createSearchParamsProxy(target: any) {\r\n const self = this;\r\n const handler: ProxyHandler<any> = {\r\n set(obj: any, prop: string | symbol, value: any) {\r\n const key = String(prop);\r\n const oldVal = obj[key];\r\n if (oldVal === value) {\r\n obj[key] = value;\r\n return true;\r\n }\r\n obj[key] = value;\r\n try {\r\n self.onValuesChange.emit({\r\n key,\r\n value,\r\n params: self.getSearchParams(),\r\n });\r\n } catch (e) {}\r\n return true;\r\n },\r\n };\r\n return new Proxy(target, handler);\r\n }\r\n\r\n private clearEmptySearchParams() {\r\n const cloneSearchParams = cloneDeep(this._searchParams);\r\n return cloneSearchParams;\r\n }\r\n\r\n private buildServerSortPayload() {\r\n // 构建激活排序集合(按优先级从低到高,末尾优先)\r\n const activeKeys = this._sortPriority.filter((k) => !!this._sortMap[k]);\r\n if (activeKeys.length === 0) return null;\r\n const sorts = activeKeys.map((field) => {\r\n // 查找对应的列配置,优先使用sortName字段\r\n const column = this._columns.find((col) => col.prop === field);\r\n const sortField = column?.sortName || field;\r\n return {\r\n field: sortField,\r\n order: this._sortMap[field]!,\r\n };\r\n });\r\n if (this.multipleSort) {\r\n return sorts; // 以数组形式提交多列排序\r\n }\r\n const [first] = sorts;\r\n return first; // 兼容单列结构 { field, order }\r\n }\r\n\r\n private sortDataSourceInPlace() {\r\n if (!Array.isArray(this.dataSource) || this.dataSource.length === 0) return;\r\n const activeKeys = this._sortPriority.filter((k) => !!this._sortMap[k]);\r\n if (activeKeys.length === 0) return;\r\n\r\n // 复制一份优先级,从前到后优先级从低到高(最后设置的字段优先)\r\n const keysInPriority = [...activeKeys];\r\n this.dataSource.sort((a: any, b: any) => {\r\n for (let i = keysInPriority.length - 1; i >= 0; i--) {\r\n const field = keysInPriority[i];\r\n const order = this._sortMap[field]!;\r\n const av = a?.[field];\r\n const bv = b?.[field];\r\n const cmp = this.compareValues(av, bv);\r\n if (cmp !== 0) return order === \"ascend\" ? cmp : -cmp;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n private compareValues(aVal: any, bVal: any): number {\r\n if (aVal == null && bVal == null) return 0;\r\n if (aVal == null) return -1;\r\n if (bVal == null) return 1;\r\n if (aVal instanceof Date && bVal instanceof Date) {\r\n return aVal.getTime() - bVal.getTime();\r\n }\r\n if (typeof aVal === \"boolean\" && typeof bVal === \"boolean\") {\r\n return aVal === bVal ? 0 : aVal ? 1 : -1;\r\n }\r\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\r\n return aVal - bVal;\r\n }\r\n if (typeof aVal === \"string\" && typeof bVal === \"string\") {\r\n return aVal.localeCompare(bVal);\r\n }\r\n const aNum = Number(aVal);\r\n const bNum = Number(bVal);\r\n if (!isNaN(aNum) && !isNaN(bNum)) return aNum - bNum;\r\n return String(aVal).localeCompare(String(bVal));\r\n }\r\n\r\n // 执行 autoComplete 数据源查询(实际执行逻辑)\r\n private executeAutoCompleteDataSource(event: Event, column: ProTableColumn) {\r\n const fieldKey = column.fieldProps?.name || column.prop;\r\n\r\n if (\r\n (column.fieldProps as AutoCompleteFieldProps).dataSource &&\r\n typeof (column.fieldProps as AutoCompleteFieldProps).dataSource ===\r\n \"function\"\r\n ) {\r\n try {\r\n const result = (column.fieldProps as AutoCompleteFieldProps).dataSource(\r\n event\r\n );\r\n // 如果返回的是 Promise,处理异步结果\r\n if (result instanceof Promise) {\r\n result\r\n .then((data) => {\r\n this._autoCompleteDataSources[fieldKey] = data || [];\r\n })\r\n .catch((error) => {\r\n console.error(\"AutoComplete dataSource error:\", error);\r\n this._autoCompleteDataSources[fieldKey] = [];\r\n });\r\n } else {\r\n // 同步返回结果\r\n this._autoCompleteDataSources[fieldKey] = result || [];\r\n }\r\n } catch (error) {\r\n console.error(\"AutoComplete dataSource error:\", error);\r\n this._autoCompleteDataSources[fieldKey] = [];\r\n }\r\n }\r\n }\r\n\r\n public getSearchParams(options?: {\r\n useSaved?: boolean; // 使用最近一次查询提交的参数,默认为 false;false 为当前表单值\r\n }): any {\r\n const { useSaved = false } = options || {};\r\n const rawParams = useSaved ? this._savedSearchParams : this._searchParams;\r\n const params = cloneDeep(rawParams || {});\r\n\r\n return {\r\n params,\r\n pageInfo: {\r\n pageIndex: this._pageInfo.pageIndex,\r\n pageSize: this._pageInfo.pageSize,\r\n },\r\n // 在线排序模式:把排序对象提交给接口\r\n ...(this.sortMode === \"server\"\r\n ? { sort: this.buildServerSortPayload() }\r\n : {}),\r\n };\r\n }\r\n\r\n public reload(afterDelete?: boolean) {\r\n this.handleQuery(afterDelete);\r\n }\r\n\r\n public setFieldsValue(fields: Record<string, any>) {\r\n Object.keys(fields).forEach((k) => {\r\n this._searchParams[k] = fields[k]; // 保留 Proxy,逐项赋值触发拦截\r\n });\r\n }\r\n\r\n public setFieldValue(key: string, value: any) {\r\n this._searchParams[key] = value;\r\n }\r\n\r\n public clearSelectedRow() {\r\n this._selectedTableRow = null;\r\n }\r\n\r\n public async setColumns(\r\n columns: ProTableColumn[],\r\n options?: {\r\n reload?: boolean; // 是否重新加载数据,默认为 false\r\n }\r\n ): Promise<void> {\r\n // 更新 columns 输入属性\r\n this.columns = cloneDeep(columns);\r\n\r\n // 重新格式化内部列\r\n this.formateInnerColumns(this.columns);\r\n\r\n // 重新设置搜索参数(异步操作)\r\n // 先清空旧的搜索参数,避免旧数据残留\r\n this._searchParams = {};\r\n await this.setSearchParams(this.columns);\r\n\r\n // 重新创建 Proxy,确保表单项值变化能正常触发事件\r\n this._searchParams = this.createSearchParamsProxy(this._searchParams);\r\n\r\n // 重新注册模板(如果组件已经初始化完成)\r\n if (this.allTemplates) {\r\n this.autoRegisterTemplates();\r\n }\r\n\r\n // 如果设置了 reload 选项为 true,则重新查询数据\r\n if (options?.reload === true) {\r\n this.handleQuery();\r\n }\r\n }\r\n\r\n public getSelectedRowData<T = any>(): T {\r\n return this._selectedTableRow;\r\n }\r\n\r\n public getCheckedRows<T = any>(): T[] {\r\n return this._selectedRows;\r\n }\r\n\r\n // 获取指定名称的模板\r\n getTemplate(name: string | undefined): TemplateRef<any> | null {\r\n if (!name) return null;\r\n try {\r\n // 首先从自定义模板中查找\r\n const customTemplate = this.customTemplates.get(name);\r\n if (customTemplate) {\r\n return customTemplate;\r\n }\r\n\r\n // 然后从通用模板映射中查找\r\n const template = this.templateMap.get(name);\r\n if (template) {\r\n return template;\r\n }\r\n return null;\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n getToolTipTextValue(column: ProTableColumn, data: any): string {\r\n const key =\r\n column.customRender && this.getTemplate(column.customRender)\r\n ? \"\"\r\n : column.ellipsis\r\n ? column.prop\r\n : \"\";\r\n return !key ? \"\" : data[key];\r\n }\r\n\r\n getTableRowChecked(data: any) {\r\n // 启用复选框时:行高亮应与复选框选中状态一致(支持多选)\r\n if (this.showCheckbox) {\r\n return this.isRowChecked(data);\r\n }\r\n // 未启用复选框时:仍然使用单选行高亮\r\n if (!this._selectedTableRow) return false;\r\n return JSON.stringify(this._selectedTableRow) === JSON.stringify(data);\r\n }\r\n\r\n // 检查行是否被禁用\r\n isRowDisabled(data: any): boolean {\r\n if (!this.showCheckbox) return false;\r\n return this.rowDisabled ? this.rowDisabled(data) : false;\r\n }\r\n\r\n // 检查行是否被复选框选中\r\n isRowChecked(data: any): boolean {\r\n if (!this.showCheckbox) return false;\r\n return this._selectedRows.some(\r\n (row) => JSON.stringify(row) === JSON.stringify(data)\r\n );\r\n }\r\n\r\n // 切换行的选中状态\r\n toggleRowChecked(data: any, checked: boolean, event?: Event) {\r\n if (event) {\r\n event.stopPropagation(); // 阻止事件冒泡,避免触发行点击\r\n }\r\n // 如果行被禁用,不允许切换选中状态\r\n if (this.isRowDisabled(data)) {\r\n return;\r\n }\r\n const index = this._selectedRows.findIndex(\r\n (row) => JSON.stringify(row) === JSON.stringify(data)\r\n );\r\n if (checked) {\r\n // 选中\r\n if (index === -1) {\r\n this._selectedRows.push(data);\r\n }\r\n // 勾选复选框时同步设置高亮选中行\r\n this._selectedTableRow = data;\r\n } else {\r\n // 取消选中\r\n if (index > -1) {\r\n this._selectedRows.splice(index, 1);\r\n }\r\n // 若当前高亮行为该行,则取消高亮\r\n if (\r\n this._selectedTableRow &&\r\n JSON.stringify(this._selectedTableRow) === JSON.stringify(data)\r\n ) {\r\n this._selectedTableRow = null;\r\n }\r\n }\r\n this.updateCheckAllStatus();\r\n }\r\n\r\n // 更新全选状态\r\n updateCheckAllStatus() {\r\n if (!this.showCheckbox || !Array.isArray(this.dataSource)) {\r\n this._checkedAll = false;\r\n this._indeterminate = false;\r\n return;\r\n }\r\n // 只计算可用的行(未禁用的行)\r\n const availableRows = this.dataSource.filter(\r\n (row) => !this.isRowDisabled(row)\r\n );\r\n const checkedCount = this._selectedRows.length;\r\n const totalCount = availableRows.length;\r\n this._checkedAll =\r\n totalCount > 0 && checkedCount > 0 && checkedCount === totalCount;\r\n this._indeterminate = checkedCount > 0 && checkedCount < totalCount;\r\n }\r\n\r\n // 全选/取消全选\r\n toggleCheckAll(checked: boolean, event?: Event) {\r\n if (event) {\r\n event.stopPropagation();\r\n }\r\n if (checked) {\r\n // 全选:只选中未禁用的行\r\n this._selectedRows = this.dataSource.filter(\r\n (row) => !this.isRowDisabled(row)\r\n );\r\n // 同步设置高亮选中行为第一条可选数据\r\n const availableRows = this._selectedRows;\r\n this._selectedTableRow =\r\n availableRows.length > 0 ? availableRows[0] : null;\r\n } else {\r\n // 取消全选\r\n this._selectedRows = [];\r\n // 取消高亮\r\n this._selectedTableRow = null;\r\n }\r\n this.updateCheckAllStatus();\r\n }\r\n\r\n // 获取选中的行数据\r\n getSelectedRows(): any[] {\r\n return this._selectedRows;\r\n }\r\n\r\n // 清空选中的行\r\n clearSelectedRows() {\r\n this._selectedRows = [];\r\n this._checkedAll = false;\r\n this._indeterminate = false;\r\n this._selectedTableRow = null;\r\n }\r\n\r\n handleFieldCheckBoxChange(checkBoxOptions: OptionsType[], key: string) {\r\n this.setFieldsValue({\r\n [key]: checkBoxOptions\r\n .filter((item) => item.checked)\r\n .map((item) => item.value),\r\n });\r\n }\r\n\r\n handleSearch() {\r\n this._savedSearchParams = this.clearEmptySearchParams();\r\n this._pageInfo.pageIndex = 1;\r\n this.handleQuery();\r\n }\r\n\r\n handleResetForm() {\r\n Object.keys(this._searchParams).forEach((key) => {\r\n const targetColumn = this._searchFiledColumns.find((item) => {\r\n return (item.fieldProps?.name || item.prop) === key;\r\n });\r\n\r\n // 对于checkbox类型,需要特殊处理默认值\r\n if (targetColumn?.valueType === \"checkbox\") {\r\n // 从原始columns配置中获取初始配置,以确保使用正确的默认值\r\n const originalColumn = this.columns.find((item) => {\r\n return (item.fieldProps?.name || item.prop) === key;\r\n });\r\n\r\n // 从原始options中找出checked为true的项作为默认值\r\n const originalFieldProps = originalColumn?.fieldProps as\r\n | CheckboxFieldProps\r\n | undefined;\r\n const checkedValues = (originalFieldProps?.options || [])\r\n .filter((opt: OptionsType) => opt.checked)\r\n .map((opt: OptionsType) => opt.value);\r\n const defaultValue =\r\n checkedValues.length > 0\r\n ? checkedValues\r\n : PRO_TABLE_DEFAULT_PROPS[targetColumn.valueType].value;\r\n\r\n this._searchParams[key] = defaultValue;\r\n\r\n // 根据默认值恢复options的checked状态,使用原始options的结构\r\n const defaultValues = Array.isArray(defaultValue) ? defaultValue : [];\r\n const originalOptions = originalFieldProps?.options || [];\r\n const targetFieldProps = targetColumn.fieldProps as CheckboxFieldProps;\r\n targetFieldProps.options = originalOptions.map((item: OptionsType) => {\r\n return {\r\n ...item,\r\n checked: defaultValues.includes(item.value),\r\n };\r\n });\r\n } else {\r\n this._searchParams[key] = targetColumn?.fieldProps\r\n ? targetColumn?.fieldProps.value ||\r\n PRO_TABLE_DEFAULT_PROPS[targetColumn.valueType].value\r\n : PRO_TABLE_DEFAULT_PROPS[targetColumn.valueType].value;\r\n }\r\n });\r\n\r\n this._savedSearchParams = {};\r\n this._pageInfo.pageIndex = 1;\r\n this.onResetFormBeforeReload.emit();\r\n this.handleQuery();\r\n }\r\n\r\n handlePageIndexChange(pageIndex: number) {\r\n this._pageInfo.pageIndex = pageIndex;\r\n this.handleQuery();\r\n }\r\n\r\n handlePageSizeChange(pageSize: any) {\r\n this._pageInfo.pageSize = pageSize;\r\n this._pageInfo.pageIndex = 1;\r\n this.handleQuery();\r\n }\r\n\r\n async handleQuery(afterDelete?: boolean) {\r\n // 删除后刷新且当前页仅剩一条记录时,若不在第一页则先回退一页\r\n if (\r\n afterDelete &&\r\n Array.isArray(this.dataSource) &&\r\n this.dataSource.length === 1 &&\r\n this._pageInfo.pageIndex > 1\r\n ) {\r\n this._pageInfo.pageIndex = this._pageInfo.pageIndex - 1;\r\n }\r\n this._loading = true;\r\n if (this.request) {\r\n try {\r\n const result = await this.request({\r\n params: this.clearEmptySearchParams(),\r\n pageInfo: {\r\n pageIndex: this._pageInfo.pageIndex,\r\n pageSize: this._pageInfo.pageSize,\r\n },\r\n // 在线排序模式:把排序对象提交给接口\r\n ...(this.sortMode === \"server\"\r\n ? { sort: this.buildServerSortPayload() }\r\n : {}),\r\n });\r\n this.dataSource = result.data || [];\r\n this.summaryData = result.summaryData || null;\r\n // 本地排序模式:拿到数据后在前端排序\r\n if (this.sortMode === \"local\") {\r\n this.sortDataSourceInPlace();\r\n }\r\n this._pageInfo.total = result.total || 0;\r\n // 更新全选状态\r\n if (this.showCheckbox) {\r\n this.updateCheckAllStatus();\r\n }\r\n } catch (error) {\r\n console.error(\"查询失败:\", error);\r\n this.dataSource = [];\r\n this._pageInfo.total = 0;\r\n this.summaryData = null;\r\n } finally {\r\n this._loading = false;\r\n this._selectedTableRow = null;\r\n // 清空选中行(可选,根据业务需求决定是否保留跨页选中)\r\n // this.clearSelectedRows();\r\n }\r\n } else {\r\n console.warn(\"未提供 _request 回调函数\");\r\n this._loading = false;\r\n }\r\n this.clearSelectedRows();\r\n }\r\n\r\n // 触发列排序变更\r\n onSortChange(sortKey: string, sortOrder: \"ascend\" | \"descend\" | null) {\r\n // 单列排序:重置其它列;多列排序:保留其它列\r\n if (!this.multipleSort) {\r\n Object.keys(this._sortMap).forEach((key) => {\r\n if (key !== sortKey) this._sortMap[key] = null;\r\n });\r\n }\r\n this._sortMap[sortKey] = sortOrder;\r\n\r\n // 维护优先级队列:有序列且非空 -> 置于末尾;为空 -> 移除\r\n this._sortPriority = this._sortPriority.filter((k) => k !== sortKey);\r\n if (sortOrder) {\r\n this._sortPriority.push(sortKey);\r\n }\r\n\r\n if (this.sortMode === \"local\") {\r\n this.sortDataSourceInPlace();\r\n } else {\r\n // 在线排序:重新请求\r\n this.handleQuery();\r\n }\r\n }\r\n\r\n getSortOrder(sortKey: string): \"ascend\" | \"descend\" | null {\r\n return this._sortMap[sortKey] || null;\r\n }\r\n\r\n handleTableRowClick(data: any) {\r\n this._selectedTableRow = data;\r\n // 如果开启了复选框,点击行时只选中点击行(如果行未被禁用)\r\n if (this.showCheckbox && !this.isRowDisabled(data)) {\r\n // 先清空所有选中行\r\n this._selectedRows = [];\r\n // 只选中当前点击的行\r\n this.toggleRowChecked(data, true);\r\n }\r\n this.onRowClick.emit(this._selectedTableRow);\r\n }\r\n\r\n handleTableRowDbClick(data: any) {\r\n this._selectedTableRow = data;\r\n this.onRowDbClick.emit(this._selectedTableRow);\r\n }\r\n\r\n handleColumnsSettingConfirm() {\r\n this.queryDynamicColumns();\r\n }\r\n\r\n // 处理 autoComplete 输入事件(带防抖)\r\n handleAutoCompleteInput(event: Event, column: ProTableColumn) {\r\n const fieldKey = column.fieldProps?.name || column.prop;\r\n\r\n // 如果该字段还没有防抖函数,创建一个\r\n if (!this._autoCompleteDebounceMap.has(fieldKey)) {\r\n const debouncedFn = debounce((evt: Event) => {\r\n // 重新查找对应的 column,确保使用最新的配置\r\n const currentColumn = this._searchFiledColumns.find(\r\n (col) => (col.fieldProps?.name || col.prop) === fieldKey\r\n );\r\n if (currentColumn) {\r\n this.executeAutoCompleteDataSource(evt, currentColumn);\r\n }\r\n }, 300); // 300ms 防抖延迟\r\n this._autoCompleteDebounceMap.set(fieldKey, debouncedFn);\r\n }\r\n\r\n // 调用防抖函数\r\n const debouncedFn = this._autoCompleteDebounceMap.get(fieldKey);\r\n if (debouncedFn) {\r\n debouncedFn(event);\r\n }\r\n }\r\n\r\n // 获取 autoComplete 的数据源\r\n getAutoCompleteDataSource(column: ProTableColumn): any[] {\r\n const fieldKey = column.fieldProps?.name || column.prop;\r\n return this._autoCompleteDataSources[fieldKey] || [];\r\n }\r\n\r\n getFieldProps(column: ProTableColumn): any {\r\n return column.fieldProps;\r\n }\r\n\r\n // 获取指定名称的label模板\r\n getLabelTemplate(name: string | undefined): TemplateRef<any> | null {\r\n if (!name) return null;\r\n try {\r\n // 首先从自定义模板中查找\r\n const customTemplate = this.customTemplates.get(name);\r\n if (customTemplate) {\r\n return customTemplate;\r\n }\r\n\r\n // 然后从通用模板映射中查找\r\n const template = this.templateMap.get(name);\r\n if (template) {\r\n return template;\r\n }\r\n return null;\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n // 获取 form-item 的动态类名\r\n getFormItemClassName(column: ProTableColumn): string {\r\n const fieldName = this.getFieldProps(column).name || column.prop;\r\n return `pro-table-${fieldName}-form-item`;\r\n }\r\n}\r\n","import { Component, ContentChild, Input, OnInit, TemplateRef } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: \"app-page-container\",\r\n templateUrl: \"./page-container.component.html\",\r\n styleUrls: [\"./page-container.component.less\"],\r\n})\r\nexport class PageContainerComponent implements OnInit {\r\n @Input() title: string = \"\";\r\n @ContentChild(\"header\") headerTpl!: TemplateRef<any>;\r\n @ContentChild(\"body\") bodyTpl!: TemplateRef<any>;\r\n\r\n constructor() {}\r\n\r\n ngOnInit(): void {}\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { RouterModule } from \"@angular/router\";\r\nimport { NzCardModule } from \"ng-zorro-antd/card\";\r\nimport { PageContainerComponent } from \"./page-container.component\";\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n HttpClientModule,\r\n RouterModule,\r\n NzCardModule,\r\n ReactiveFormsModule,\r\n ],\r\n declarations: [PageContainerComponent],\r\n providers: [],\r\n exports: [PageContainerComponent],\r\n})\r\nexport class PageContainerModule {}\r\n","import { Component, OnInit, OnDestroy, forwardRef, ChangeDetectorRef, ElementRef, Inject, Optional } from \"@angular/core\";\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\nimport { PLATE_PREFIX_LOAD_SERVICE, PlatePrefixLoadService, PlatePrefixOption } from \"../tokens\";\r\n\r\n@Component({\r\n selector: \"app-plate-input\",\r\n templateUrl: \"./plate-input.component.html\",\r\n styleUrls: [\"./plate-input.component.less\"],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PlateInputComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class PlateInputComponent implements OnInit, OnDestroy, ControlValueAccessor {\r\n nzPopoverVisible: boolean = false;\r\n platePrefix: string = \"\";\r\n plateSuffix: string = \"\";\r\n platePrefixOptions: Array<PlatePrefixOption> = [];\r\n disabled: boolean = false;\r\n private onChange = (value: string) => {};\r\n private onTouched = () => {};\r\n\r\n private clickOutsideHandler?: (event: MouseEvent) => void;\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n private elementRef: ElementRef,\r\n @Optional() @Inject(PLATE_PREFIX_LOAD_SERVICE) private platePrefixLoadService?: PlatePrefixLoadService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (this.platePrefixLoadService) {\r\n // 使用注入的全局服务加载车牌前缀选项\r\n this.platePrefixLoadService\r\n .loadPrefixOptions()\r\n .then((data: Array<PlatePrefixOption>) => {\r\n this.platePrefixOptions = data;\r\n })\r\n .catch(() => {\r\n this.platePrefixOptions = [];\r\n });\r\n } else {\r\n // 如果没有注入服务,则保持空数组\r\n this.platePrefixOptions = [];\r\n }\r\n }\r\n\r\n handlePlatePrefix(value: string): void {\r\n this.platePrefix = value;\r\n this.emitValue();\r\n this.nzPopoverVisible = false;\r\n this.removeClickOutsideListener();\r\n }\r\n\r\n writeValue(value: string): void {\r\n if (value) {\r\n this.platePrefix = value.split(\"\")[0];\r\n this.plateSuffix = value\r\n .split(\"\")\r\n .filter((item, index) => index > 0)\r\n .join(\"\");\r\n } else {\r\n this.platePrefix = \"\";\r\n this.plateSuffix = \"\";\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n const previousDisabled = this.disabled;\r\n this.disabled = isDisabled;\r\n \r\n // 如果禁用状态改变,关闭 popover 并移除监听器\r\n if (previousDisabled !== isDisabled) {\r\n this.nzPopoverVisible = false;\r\n this.removeClickOutsideListener();\r\n // 强制变更检测\r\n this.cdr.detectChanges();\r\n }\r\n }\r\n\r\n handlePrefixClick(event: Event): void {\r\n if (this.disabled) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.nzPopoverVisible = false;\r\n return;\r\n }\r\n // 手动切换 popover 的显示/隐藏状态\r\n this.nzPopoverVisible = !this.nzPopoverVisible;\r\n \r\n // 如果打开了 popover,添加文档点击监听器\r\n if (this.nzPopoverVisible) {\r\n setTimeout(() => {\r\n this.attachClickOutsideListener();\r\n }, 0);\r\n } else {\r\n this.removeClickOutsideListener();\r\n }\r\n \r\n event.stopPropagation(); // 阻止事件冒泡\r\n }\r\n\r\n private attachClickOutsideListener(): void {\r\n if (this.clickOutsideHandler) {\r\n return;\r\n }\r\n \r\n this.clickOutsideHandler = (event: MouseEvent) => {\r\n const nativeElement = this.elementRef.nativeElement;\r\n const target = event.target as HTMLElement;\r\n \r\n // 检查是否点击在 popover 内容区域内\r\n const popoverContent = document.querySelector('.plate-input-popover');\r\n const clickedInPopover = popoverContent && popoverContent.contains(target);\r\n \r\n // 检查是否点击在组件内部(前缀按钮)\r\n const clickedInComponent = nativeElement.contains(target);\r\n \r\n // 如果点击既不在组件内部,也不在 popover 内容区域,则关闭 popover\r\n if (!clickedInComponent && !clickedInPopover) {\r\n this.nzPopoverVisible = false;\r\n this.removeClickOutsideListener();\r\n this.cdr.detectChanges();\r\n }\r\n };\r\n \r\n // 使用捕获阶段,确保在其他事件处理之前执行\r\n document.addEventListener('click', this.clickOutsideHandler, true);\r\n }\r\n\r\n private removeClickOutsideListener(): void {\r\n if (this.clickOutsideHandler) {\r\n document.removeEventListener('click', this.clickOutsideHandler, true);\r\n this.clickOutsideHandler = undefined;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.removeClickOutsideListener();\r\n }\r\n\r\n private emitValue(): void {\r\n const fullPlate = this.platePrefix + this.plateSuffix;\r\n this.onChange(fullPlate);\r\n }\r\n\r\n onBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n handleAntdPlateSuffixBlur(event: any): void {\r\n if (this.disabled) return;\r\n const value = event.target.value.toUpperCase();\r\n this.plateSuffix = value;\r\n this.emitValue();\r\n }\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { NzGridModule } from \"ng-zorro-antd/grid\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\nimport { NzPopoverModule } from \"ng-zorro-antd/popover\";\r\nimport { PlateInputComponent } from \"./plate-input.component\";\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzGridModule,\r\n NzInputModule,\r\n NzPopoverModule,\r\n NzIconModule,\r\n ],\r\n declarations: [PlateInputComponent],\r\n providers: [],\r\n exports: [PlateInputComponent],\r\n})\r\nexport class PlateInputModule {}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ContentChild,\r\n Input,\r\n OnInit,\r\n TemplateRef\r\n} from \"@angular/core\";\r\n\r\n@Component({\r\n selector: \"app-table-search-bar\",\r\n templateUrl: \"./table-search-bar.component.html\",\r\n styleUrls: [\"./table-search-bar.component.less\"],\r\n})\r\nexport class TableSearchBarComponent implements OnInit, AfterViewInit {\r\n @Input() leftColSpan: number = 21;\r\n @Input() rightColSpan: number = 3;\r\n @Input() labelWidth: string = \"90px\";\r\n @Input() labelAlign: string = \"right\";\r\n @ContentChild(\"leftContent\") leftContentTpl!: TemplateRef<any>;\r\n @ContentChild(\"actionTextBtn\") actionTextBtnTpl!: TemplateRef<any>;\r\n @ContentChild(\"actionImgBtn\") actionImgBtnTpl!: TemplateRef<any>;\r\n\r\n constructor() {}\r\n\r\n ngOnInit(): void {\r\n this.setCSSVariablesToTarget();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.setCSSVariablesToTarget();\r\n }\r\n\r\n private setCSSVariablesToTarget(): void {\r\n // setTimeout(() => {\r\n // const leftElement = document.querySelectorAll(\".table-search-bar-left\");\r\n // console.log('leftElement',leftElement);\r\n // if (leftElement.length > 0) {\r\n // leftElement.forEach((element) => {\r\n // (element as HTMLElement).style.setProperty(\r\n // \"--label-width\",\r\n // this.labelWidth\r\n // );\r\n // (element as HTMLElement).style.setProperty(\r\n // \"--label-align\",\r\n // this.labelAlign\r\n // );\r\n // });\r\n // }\r\n // });\r\n }\r\n}\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { RouterModule } from \"@angular/router\";\r\nimport { NzGridModule } from \"ng-zorro-antd/grid\";\r\nimport { TableSearchBarComponent } from \"./table-search-bar.component\";\r\nimport { NzSpaceModule } from \"ng-zorro-antd/space\";\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n HttpClientModule,\r\n RouterModule,\r\n NzGridModule,\r\n ReactiveFormsModule,\r\n NzSpaceModule,\r\n ],\r\n declarations: [TableSearchBarComponent],\r\n providers: [],\r\n exports: [TableSearchBarComponent],\r\n})\r\nexport class TableSearchBarModule {}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n ViewChild,\r\n} from \"@angular/core\";\r\nimport Sortable from \"sortablejs\";\r\nimport { ProTableColumn } from \"../../type\";\r\nimport { PRO_TABLE_COLUMN_REMOTE, ProTableRemoteColumnService } from \"../../tokens\";\r\nimport { Inject, Optional } from \"@angular/core\";\r\nimport { isObservable } from \"rxjs\";\r\n\r\n@Component({\r\n selector: \"app-colmuns-setting\",\r\n templateUrl: \"./colmuns-setting.component.html\",\r\n styleUrls: [\"./colmuns-setting.component.less\"],\r\n})\r\nexport class ColmunsSettingComponent\r\n implements OnInit, AfterViewInit, OnDestroy\r\n{\r\n @Input() columns: ProTableColumn[] = [];\r\n\r\n @Input() selectedColumns: ProTableColumn[] = [];\r\n\r\n @Input() tableName: string;\r\n\r\n @Output() afterConfirm = new EventEmitter<ProTableColumn[]>();\r\n\r\n @ViewChild(\"sortableContainer\", { static: false })\r\n sortableContainer!: ElementRef;\r\n\r\n modalVisible: boolean = false;\r\n\r\n options: Array<{ label: string; value: string; checked: boolean }> = [];\r\n\r\n private sortableInstance: Sortable | null = null;\r\n\r\n constructor(\r\n @Optional()\r\n @Inject(PRO_TABLE_COLUMN_REMOTE)\r\n private columnRemote: ProTableRemoteColumnService | null\r\n ) {}\r\n\r\n ngOnInit(): void {}\r\n\r\n ngAfterViewInit(): void {\r\n this.initSortable();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.sortableInstance) {\r\n this.sortableInstance.destroy();\r\n }\r\n }\r\n\r\n initSortable(): void {\r\n // 先销毁已存在的实例\r\n if (this.sortableInstance) {\r\n this.sortableInstance.destroy();\r\n this.sortableInstance = null;\r\n }\r\n\r\n if (this.sortableContainer && this.sortableContainer.nativeElement) {\r\n this.sortableInstance = new Sortable(\r\n this.sortableContainer.nativeElement,\r\n {\r\n animation: 150,\r\n ghostClass: \"sortable-ghost\",\r\n chosenClass: \"sortable-chosen\",\r\n dragClass: \"sortable-drag\",\r\n handle: \".sort-list-item\", // 指定拖拽句柄\r\n onEnd: (evt) => {\r\n this.onSortEnd(evt);\r\n },\r\n }\r\n );\r\n }\r\n }\r\n\r\n onSortEnd(evt: any): void {\r\n const { oldIndex, newIndex } = evt;\r\n if (oldIndex !== newIndex) {\r\n // 创建新的数组来避免直接修改输入属性\r\n const newSelectedColumns = [...this.selectedColumns];\r\n const movedItem = newSelectedColumns.splice(oldIndex, 1)[0];\r\n newSelectedColumns.splice(newIndex, 0, movedItem);\r\n\r\n // 更新 selectedColumns\r\n this.selectedColumns = newSelectedColumns;\r\n }\r\n }\r\n\r\n trackByColumn(index: number, item: ProTableColumn): string {\r\n return item.prop || index.toString();\r\n }\r\n\r\n /**\r\n * 同步 options 数组的 checked 状态与 selectedColumns\r\n */\r\n private syncOptionsWithSelectedColumns(): void {\r\n const selectedProps = this.selectedColumns.map((col) => col.prop);\r\n this.options.forEach((option) => {\r\n option.checked = selectedProps.includes(option.value);\r\n });\r\n }\r\n\r\n handleModalVisible() {\r\n this.options = this.columns\r\n .filter((item) => !item.auxiliaryColumn)\r\n .map((item) => {\r\n return {\r\n label: item.title,\r\n value: item.prop,\r\n checked: item.hideInTable ? false : true,\r\n sortName: item.sortName || null,\r\n };\r\n });\r\n\r\n // 同步 options 的 checked 状态与当前 selectedColumns\r\n this.syncOptionsWithSelectedColumns();\r\n\r\n this.modalVisible = true;\r\n\r\n // 模态框打开后重新初始化排序\r\n setTimeout(() => {\r\n this.initSortable();\r\n }, 100);\r\n }\r\n\r\n handleModalClose() {\r\n this.modalVisible = false;\r\n if (this.sortableInstance) {\r\n this.sortableInstance.destroy();\r\n this.sortableInstance = null;\r\n }\r\n }\r\n\r\n handleSelectRemove(key: string) {\r\n this.selectedColumns = this.selectedColumns.filter(\r\n (item) => item.prop !== key\r\n );\r\n\r\n // 使用同步方法确保所有状态一致\r\n this.syncOptionsWithSelectedColumns();\r\n }\r\n\r\n handleCheckBoxChange(value, record) {\r\n if (!value) {\r\n this.handleSelectRemove(record.value);\r\n } else {\r\n this.selectedColumns.push({\r\n title: record.label,\r\n prop: record.value,\r\n sortName: record.sortName,\r\n hideInTable: false,\r\n });\r\n // 添加项目后同步状态\r\n this.syncOptionsWithSelectedColumns();\r\n }\r\n }\r\n handleConfirm() {\r\n if (!this.columnRemote?.setCol || !this.tableName) {\r\n this.modalVisible = false;\r\n this.afterConfirm.emit();\r\n return;\r\n }\r\n const payload = this.selectedColumns.map((column) => {\r\n return {\r\n field: column.prop,\r\n isShow: column.hideInTable ? false : true,\r\n header: column.title,\r\n sortName: column.sortName || null,\r\n };\r\n });\r\n const result = this.columnRemote.setCol(this.tableName, payload);\r\n const done = (res) => {\r\n this.modalVisible = false;\r\n this.afterConfirm.emit();\r\n };\r\n if (result && isObservable(result)) {\r\n result.subscribe(done, () => done(null));\r\n } else {\r\n Promise.resolve(result).finally(() => done(null));\r\n }\r\n }\r\n}\r\n","import { Component, ComponentFactoryResolver, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, Type, ViewChild, ViewContainerRef } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-dynamic-search-field',\r\n template: `<ng-template #vc></ng-template>`\r\n})\r\nexport class DynamicSearchFieldComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() component: Type<any> | null = null;\r\n @Input() value: any;\r\n @Input() props: { [key: string]: any } | null = null;\r\n @Output() valueChange = new EventEmitter<any>();\r\n\r\n @ViewChild('vc', { read: ViewContainerRef, static: true }) vc!: ViewContainerRef;\r\n\r\n private cmpRef: any = null;\r\n private isCva = false;\r\n private cvaOnChange: ((val: any) => void) | null = null;\r\n\r\n constructor(private cfr: ComponentFactoryResolver) {}\r\n\r\n ngOnInit(): void {\r\n this.render();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.component && !changes.component.firstChange) {\r\n this.destroy();\r\n this.render();\r\n return;\r\n }\r\n if (this.cmpRef) {\r\n if (changes.value && !changes.value.firstChange) {\r\n if (this.isCva) {\r\n if (typeof this.cmpRef.instance.writeValue === 'function') {\r\n this.cmpRef.instance.writeValue(this.value);\r\n }\r\n } else if ('value' in this.cmpRef.instance) {\r\n this.cmpRef.instance.value = this.value;\r\n }\r\n }\r\n if (changes.props && !changes.props.firstChange) {\r\n this.applyProps();\r\n }\r\n }\r\n }\r\n\r\n private render() {\r\n if (!this.component) return;\r\n const factory = this.cfr.resolveComponentFactory(this.component);\r\n this.vc.clear();\r\n this.cmpRef = this.vc.createComponent(factory);\r\n\r\n this.isCva = typeof this.cmpRef.instance.registerOnChange === 'function' && typeof this.cmpRef.instance.writeValue === 'function';\r\n\r\n if (this.isCva) {\r\n this.cmpRef.instance.writeValue(this.value);\r\n this.cmpRef.instance.registerOnChange((v: any) => {\r\n this.valueChange.emit(v);\r\n });\r\n } else {\r\n if ('value' in this.cmpRef.instance) {\r\n this.cmpRef.instance.value = this.value;\r\n }\r\n if ('valueChange' in this.cmpRef.instance && this.cmpRef.instance.valueChange && typeof this.cmpRef.instance.valueChange.subscribe === 'function') {\r\n this.cmpRef.instance.valueChange.subscribe((v: any) => {\r\n this.valueChange.emit(v);\r\n });\r\n }\r\n }\r\n\r\n this.applyProps();\r\n }\r\n\r\n private applyProps() {\r\n const p = this.props || {};\r\n const extra = p.componentProps || {};\r\n Object.keys(extra).forEach((k) => {\r\n try {\r\n this.cmpRef.instance[k] = extra[k];\r\n } catch {}\r\n });\r\n }\r\n\r\n private destroy() {\r\n if (this.cmpRef) {\r\n try { this.cmpRef.destroy(); } catch {}\r\n this.cmpRef = null;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy();\r\n }\r\n}\r\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { RouterModule } from \"@angular/router\";\r\nimport { NzButtonModule } from \"ng-zorro-antd/button\";\r\nimport { NzCheckboxModule } from \"ng-zorro-antd/checkbox\";\r\nimport { NzDatePickerModule } from \"ng-zorro-antd/date-picker\";\r\nimport { NzFormModule } from \"ng-zorro-antd/form\";\r\nimport { NzGridModule } from \"ng-zorro-antd/grid\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\nimport { NzModalModule } from \"ng-zorro-antd/modal\";\r\nimport { NzPopoverModule } from \"ng-zorro-antd/popover\";\r\nimport { NzSelectModule } from \"ng-zorro-antd/select\";\r\nimport { NzSpaceModule } from \"ng-zorro-antd/space\";\r\nimport { NzTableModule } from \"ng-zorro-antd/table\";\r\nimport { NzTypographyModule } from \"ng-zorro-antd/typography\";\r\nimport { PageContainerModule } from \"./page-container/page-container.module\";\r\nimport { PlateInputModule } from \"./plate-input/plate-input.module\";\r\nimport { TableSearchBarModule } from \"./table-search-bar/table-search-bar-module\";\r\nimport { ColmunsSettingComponent } from \"./components/colmuns-setting/colmuns-setting.component\";\r\nimport { ProTableComponent } from \"./pro-table.component\";\r\nimport { DynamicSearchFieldComponent } from \"./components/dynamic-search-field/dynamic-search-field.component\";\r\nimport { NzAutocompleteModule } from 'ng-zorro-antd/auto-complete';\r\nimport { NzInputNumberModule } from 'ng-zorro-antd/input-number';\r\nimport { NzToolTipModule } from \"ng-zorro-antd/tooltip\";\r\nimport { PRO_TABLE_COLUMN_REMOTE } from \"./tokens\";\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n HttpClientModule,\r\n RouterModule,\r\n NzFormModule,\r\n NzSelectModule,\r\n NzSpaceModule,\r\n NzGridModule,\r\n NzInputModule,\r\n ReactiveFormsModule,\r\n NzPopoverModule,\r\n NzIconModule,\r\n NzButtonModule,\r\n PageContainerModule,\r\n TableSearchBarModule,\r\n NzTableModule,\r\n PlateInputModule,\r\n NzDatePickerModule,\r\n NzModalModule,\r\n NzCheckboxModule,\r\n NzTypographyModule,\r\n DragDropModule,\r\n NzCheckboxModule,\r\n NzAutocompleteModule,\r\n NzInputNumberModule,\r\n NzToolTipModule,\r\n ],\r\n declarations: [ProTableComponent, ColmunsSettingComponent, DynamicSearchFieldComponent],\r\n providers: [\r\n {\r\n // 默认不提供远程列服务,宿主可覆盖注入\r\n provide: PRO_TABLE_COLUMN_REMOTE,\r\n useValue: null,\r\n },\r\n ],\r\n exports: [ProTableComponent],\r\n})\r\nexport class ProTableModule {}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { PlatePrefixLoadService, PlatePrefixOption } from \"../tokens\";\r\n\r\n/**\r\n * 默认的车牌前缀加载服务实现\r\n * 使用 HttpClient 调用 API 获取车牌前缀选项\r\n */\r\n@Injectable()\r\nexport class DefaultPlatePrefixLoadService implements PlatePrefixLoadService {\r\n private readonly defaultApiUrl = \"/PlateFirstWord/GetPlateFirstWord\";\r\n\r\n constructor(private http: HttpClient) {}\r\n\r\n loadPrefixOptions(): Promise<PlatePrefixOption[]> {\r\n return this.http\r\n .post<string[]>(this.defaultApiUrl, { dictCode: \"PlateFirstWord\" })\r\n .toPromise()\r\n .then((list: string[]) => {\r\n const options: PlatePrefixOption[] = [];\r\n // 添加空选项(与旧版保持一致)\r\n options.push({ label: \"\", value: \"\" });\r\n // 转换数据格式\r\n for (let i = 0; i < list.length; i++) {\r\n options.push({\r\n label: list[i],\r\n value: list[i],\r\n });\r\n }\r\n return options;\r\n })\r\n .catch(() => {\r\n // 发生错误时返回空数组\r\n return [];\r\n });\r\n }\r\n}\r\n\r\n","import { Injectable } from \"@angular/core\";\r\nimport {\r\n AbstractControl,\r\n AbstractControlOptions,\r\n FormArray,\r\n FormBuilder,\r\n FormGroup,\r\n ValidatorFn,\r\n} from \"@angular/forms\";\r\nimport { Subscription } from \"rxjs\";\r\nimport { debounceTime, distinctUntilChanged } from \"rxjs/operators\";\r\n\r\n// ==================== 类型定义 ====================\r\n\r\n// 字段错误消息类型(字符串或函数)\r\nexport type FieldErrorMessage =\r\n | string\r\n | ((context: { control: AbstractControl; controlName: string }) => string);\r\n\r\n// 字段错误消息集合\r\nexport type FieldErrorMessages = Record<string, FieldErrorMessage>;\r\n\r\n// 字段配置\r\nexport type FieldConfig = {\r\n value: any;\r\n disabled?: boolean;\r\n validators?: () => ValidatorFn[];\r\n errorMessages?: FieldErrorMessages;\r\n};\r\n\r\n// FormArray 配置类型\r\nexport type FormArrayConfig = {\r\n type: \"array\";\r\n itemConfig: FormConfig; // 每行的表单配置\r\n initialItems?: any[]; // 初始数据项\r\n errorMessages?: Record<string, FieldErrorMessages>; // 行字段的错误消息配置\r\n uniqueIdField?: string; // 业务唯一标识字段(如 'dictId', 'id' 等)\r\n};\r\n\r\n// 表单修改类型\r\nexport type FormModifyType = \"create\" | \"update\";\r\n\r\n// 表单配置(支持普通字段和 FormArray)\r\nexport type FormConfig = Record<string, FieldConfig | FormArrayConfig>;\r\n\r\n// 监听选项\r\nexport type WatchOptions = {\r\n debounce?: number;\r\n distinctUntilChanged?: boolean;\r\n emitInitial?: boolean;\r\n};\r\n\r\n// 批量添加字段配置选项\r\nexport type AddFieldsConfigOptions = {\r\n emitEvent?: boolean;\r\n updateValueAndValidity?: boolean;\r\n onFieldAdded?: (fieldName: string, success: boolean, error?: string) => void; // 每个字段添加的回调\r\n};\r\n\r\n// 批量添加字段配置结果\r\nexport type AddFieldsConfigResult = {\r\n success: boolean;\r\n added: string[]; // 成功添加的字段名列表\r\n failed: Array<{ fieldName: string; error: string }>; // 失败的字段及错误信息\r\n};\r\n\r\n// 批量删除字段配置选项\r\nexport type RemoveFieldsConfigOptions = {\r\n emitEvent?: boolean;\r\n onFieldRemoved?: (fieldName: string, success: boolean, error?: string) => void; // 每个字段删除的回调\r\n};\r\n\r\n// 批量删除字段配置结果\r\nexport type RemoveFieldsConfigResult = {\r\n success: boolean;\r\n removed: string[]; // 成功删除的字段名列表\r\n failed: Array<{ fieldName: string; error: string }>; // 失败的字段及错误信息\r\n};\r\n\r\n// ==================== 服务类 ====================\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class AntdFormService {\r\n // ==================== 公共属性 ====================\r\n formStore: Record<string, FormGroup> = {};\r\n formModifyType: FormModifyType = \"create\";\r\n\r\n // ==================== 私有属性 ====================\r\n private labelWidth: string = \"120px\";\r\n private labelAlign: string = \"right\";\r\n private labelObservers: Record<string, MutationObserver> = {};\r\n private errorMessageStore: Record<\r\n string,\r\n Record<string, FieldErrorMessages>\r\n > = {};\r\n private formArrayConfigStore: Record<\r\n string,\r\n Record<string, { itemConfig: FormConfig; uniqueIdField?: string }>\r\n > = {};\r\n private readonly INTERNAL_ID_FIELD = \"__formItemId\";\r\n private classPrefix = \"ant-form-\";\r\n private readonly defaultErrorMessages: FieldErrorMessages = {\r\n required: \"该字段为必填项\",\r\n minlength: \"输入长度不足\",\r\n maxlength: \"输入长度超限\",\r\n email: \"请输入合法的邮箱地址\",\r\n pattern: \"输入格式不正确\",\r\n };\r\n\r\n // ==================== 构造函数 ====================\r\n constructor(private fb: FormBuilder) {}\r\n\r\n // ==================== 表单创建和初始化 ====================\r\n\r\n // 初始化表单(支持 FormArray)\r\n createFormGroup(\r\n name: string,\r\n config: FormConfig,\r\n options?: { labelWidth?: string; labelAlign?: string }\r\n ): FormGroup {\r\n const groupConfig: Record<string, any> = {};\r\n this.errorMessageStore[name] = {};\r\n\r\n Object.entries(config).forEach(([key, field]) => {\r\n if (this.isFormArrayConfig(field)) {\r\n // FormArray 配置处理\r\n if (!this.formArrayConfigStore[name]) {\r\n this.formArrayConfigStore[name] = {};\r\n }\r\n this.formArrayConfigStore[name][key] = {\r\n itemConfig: field.itemConfig,\r\n uniqueIdField: field.uniqueIdField,\r\n };\r\n\r\n const formArray = this.createFormArrayFromConfig(\r\n name,\r\n key,\r\n field.itemConfig,\r\n field.initialItems || [],\r\n field.uniqueIdField\r\n );\r\n groupConfig[key] = formArray;\r\n\r\n // 存储 FormArray 字段的错误消息配置,格式:arrayName[].fieldName\r\n if (field.errorMessages) {\r\n Object.entries(field.errorMessages).forEach(\r\n ([fieldName, errorMessages]) => {\r\n const errorMessageKey = `${key}[].${fieldName}`;\r\n this.errorMessageStore[name][errorMessageKey] = errorMessages;\r\n }\r\n );\r\n }\r\n } else {\r\n // 普通字段配置\r\n const fieldConfig = field as FieldConfig;\r\n groupConfig[key] = [\r\n { value: fieldConfig.value, disabled: fieldConfig.disabled ?? false },\r\n fieldConfig.validators?.() ?? [],\r\n ];\r\n if (fieldConfig.errorMessages) {\r\n this.errorMessageStore[name][key] = fieldConfig.errorMessages;\r\n }\r\n }\r\n });\r\n\r\n if (options?.labelWidth) {\r\n this.labelWidth = options.labelWidth;\r\n }\r\n if (options?.labelAlign) {\r\n this.labelAlign = options.labelAlign;\r\n }\r\n this.formStore[name] = this.fb.group(groupConfig);\r\n this.setCSSVariablesToTarget(name);\r\n return this.formStore[name];\r\n }\r\n\r\n // ==================== 表单操作 ====================\r\n\r\n // 重置表单\r\n resetFormGroup(name: string, value?: any): void {\r\n this.formStore[name]?.reset(value);\r\n }\r\n\r\n // 批量添加字段配置\r\n addFieldsConfig(\r\n formName: string,\r\n fieldsConfig: FormConfig,\r\n options?: AddFieldsConfigOptions\r\n ): AddFieldsConfigResult {\r\n const result: AddFieldsConfigResult = {\r\n success: true,\r\n added: [],\r\n failed: [],\r\n };\r\n\r\n // 1. 验证表单是否存在\r\n const formGroup = this.formStore[formName];\r\n if (!formGroup) {\r\n // 如果表单不存在,所有字段都失败\r\n Object.keys(fieldsConfig).forEach((fieldName) => {\r\n const error = `Form \"${formName}\" not found`;\r\n result.failed.push({\r\n fieldName,\r\n error,\r\n });\r\n options?.onFieldAdded?.(fieldName, false, error);\r\n });\r\n result.success = false;\r\n return result;\r\n }\r\n\r\n // 2. 初始化 errorMessageStore 和 formArrayConfigStore(如果不存在)\r\n if (!this.errorMessageStore[formName]) {\r\n this.errorMessageStore[formName] = {};\r\n }\r\n if (!this.formArrayConfigStore[formName]) {\r\n this.formArrayConfigStore[formName] = {};\r\n }\r\n\r\n // 3. 批量构建控件配置\r\n const controlsToAdd: Record<string, AbstractControl> = {};\r\n const errorMessagesToAdd: Record<string, FieldErrorMessages> = {};\r\n const formArrayConfigsToAdd: Record<\r\n string,\r\n { itemConfig: FormConfig; uniqueIdField?: string }\r\n > = {};\r\n\r\n // 4. 遍历所有字段配置,进行验证和构建\r\n Object.entries(fieldsConfig).forEach(([fieldName, fieldConfig]) => {\r\n try {\r\n // 4.1 检查字段是否已存在\r\n if (formGroup.get(fieldName)) {\r\n const error = `Field \"${fieldName}\" already exists`;\r\n result.failed.push({\r\n fieldName,\r\n error,\r\n });\r\n options?.onFieldAdded?.(fieldName, false, error);\r\n return;\r\n }\r\n\r\n // 4.2 根据字段类型创建控件\r\n if (this.isFormArrayConfig(fieldConfig)) {\r\n // FormArray 处理\r\n const formArray = this.createFormArrayFromConfig(\r\n formName,\r\n fieldName,\r\n fieldConfig.itemConfig,\r\n fieldConfig.initialItems || [],\r\n fieldConfig.uniqueIdField\r\n );\r\n controlsToAdd[fieldName] = formArray;\r\n\r\n // 存储 FormArray 配置\r\n formArrayConfigsToAdd[fieldName] = {\r\n itemConfig: fieldConfig.itemConfig,\r\n uniqueIdField: fieldConfig.uniqueIdField,\r\n };\r\n\r\n // 存储错误消息\r\n if (fieldConfig.errorMessages) {\r\n Object.entries(fieldConfig.errorMessages).forEach(\r\n ([itemFieldName, errorMessages]) => {\r\n const errorMessageKey = `${fieldName}[].${itemFieldName}`;\r\n errorMessagesToAdd[errorMessageKey] = errorMessages;\r\n }\r\n );\r\n }\r\n } else {\r\n // 普通字段处理\r\n const fieldConfigTyped = fieldConfig as FieldConfig;\r\n const controlOptions: AbstractControlOptions = {\r\n validators: fieldConfigTyped.validators?.() ?? [],\r\n };\r\n const control = this.fb.control(\r\n fieldConfigTyped.value,\r\n controlOptions\r\n );\r\n // 设置 disabled 状态\r\n if (fieldConfigTyped.disabled) {\r\n control.disable();\r\n }\r\n controlsToAdd[fieldName] = control;\r\n\r\n // 存储错误消息\r\n if (fieldConfigTyped.errorMessages) {\r\n errorMessagesToAdd[fieldName] = fieldConfigTyped.errorMessages;\r\n }\r\n }\r\n\r\n result.added.push(fieldName);\r\n options?.onFieldAdded?.(fieldName, true);\r\n } catch (error: any) {\r\n const errorMessage =\r\n error?.message || error?.toString() || \"Unknown error\";\r\n result.failed.push({\r\n fieldName,\r\n error: errorMessage,\r\n });\r\n options?.onFieldAdded?.(fieldName, false, errorMessage);\r\n }\r\n });\r\n\r\n // 5. 批量添加到 FormGroup\r\n if (Object.keys(controlsToAdd).length > 0) {\r\n Object.entries(controlsToAdd).forEach(([fieldName, control]) => {\r\n formGroup.addControl(fieldName, control);\r\n });\r\n\r\n // 6. 批量存储错误消息\r\n Object.entries(errorMessagesToAdd).forEach(([key, messages]) => {\r\n this.errorMessageStore[formName][key] = messages;\r\n });\r\n\r\n // 7. 批量存储 FormArray 配置\r\n Object.entries(formArrayConfigsToAdd).forEach(([fieldName, config]) => {\r\n this.formArrayConfigStore[formName][fieldName] = config;\r\n });\r\n\r\n // 8. 更新表单验证状态\r\n if (options?.updateValueAndValidity) {\r\n formGroup.updateValueAndValidity({\r\n emitEvent: options?.emitEvent ?? true,\r\n });\r\n }\r\n }\r\n\r\n // 9. 判断整体是否成功\r\n result.success = result.failed.length === 0;\r\n\r\n return result;\r\n }\r\n\r\n // 批量删除字段配置\r\n removeFieldsConfig(\r\n formName: string,\r\n fieldNames: string[],\r\n options?: RemoveFieldsConfigOptions\r\n ): RemoveFieldsConfigResult {\r\n const result: RemoveFieldsConfigResult = {\r\n success: true,\r\n removed: [],\r\n failed: [],\r\n };\r\n\r\n // 1. 验证表单是否存在\r\n const formGroup = this.formStore[formName];\r\n if (!formGroup) {\r\n fieldNames.forEach((fieldName) => {\r\n const error = `Form \"${formName}\" not found`;\r\n result.failed.push({\r\n fieldName,\r\n error,\r\n });\r\n options?.onFieldRemoved?.(fieldName, false, error);\r\n });\r\n result.success = false;\r\n return result;\r\n }\r\n\r\n // 2. 批量收集需要清理的信息\r\n const fieldsToRemove: string[] = [];\r\n const errorMessageKeysToRemove: string[] = [];\r\n const formArrayFields: string[] = [];\r\n\r\n // 3. 验证每个字段并收集信息\r\n fieldNames.forEach((fieldName) => {\r\n const control = formGroup.get(fieldName);\r\n\r\n if (!control) {\r\n const error = `Field \"${fieldName}\" not found`;\r\n result.failed.push({\r\n fieldName,\r\n error,\r\n });\r\n options?.onFieldRemoved?.(fieldName, false, error);\r\n return;\r\n }\r\n\r\n // 判断是否是 FormArray\r\n if (control instanceof FormArray) {\r\n formArrayFields.push(fieldName);\r\n\r\n // 收集 FormArray 相关的错误消息键(格式:arrayName[].fieldName)\r\n if (this.errorMessageStore[formName]) {\r\n Object.keys(this.errorMessageStore[formName]).forEach((key) => {\r\n if (key.startsWith(`${fieldName}[].`)) {\r\n errorMessageKeysToRemove.push(key);\r\n }\r\n });\r\n }\r\n } else {\r\n // 普通字段的错误消息键\r\n errorMessageKeysToRemove.push(fieldName);\r\n }\r\n\r\n fieldsToRemove.push(fieldName);\r\n });\r\n\r\n // 4. 批量执行删除操作\r\n try {\r\n // 4.1 从 FormGroup 中移除控件\r\n fieldsToRemove.forEach((fieldName) => {\r\n formGroup.removeControl(fieldName);\r\n result.removed.push(fieldName);\r\n options?.onFieldRemoved?.(fieldName, true);\r\n });\r\n\r\n // 4.2 批量删除错误消息\r\n if (this.errorMessageStore[formName]) {\r\n errorMessageKeysToRemove.forEach((key) => {\r\n delete this.errorMessageStore[formName][key];\r\n });\r\n }\r\n\r\n // 4.3 批量删除 FormArray 配置\r\n if (this.formArrayConfigStore[formName]) {\r\n formArrayFields.forEach((fieldName) => {\r\n delete this.formArrayConfigStore[formName][fieldName];\r\n });\r\n }\r\n } catch (error: any) {\r\n // 如果批量删除过程中出错,标记为失败\r\n fieldsToRemove.forEach((fieldName) => {\r\n if (!result.removed.includes(fieldName)) {\r\n const errorMessage =\r\n error?.message || error?.toString() || \"Failed to remove field\";\r\n result.failed.push({\r\n fieldName,\r\n error: errorMessage,\r\n });\r\n options?.onFieldRemoved?.(fieldName, false, errorMessage);\r\n }\r\n });\r\n }\r\n\r\n // 5. 判断整体是否成功\r\n result.success = result.failed.length === 0;\r\n\r\n return result;\r\n }\r\n\r\n // 局部赋值(支持 FormArray 的智能更新,统一根据 action 字段判断操作类型)\r\n patchFormValues(\r\n name: string,\r\n values: Record<string, any>,\r\n options?: { emitEvent?: boolean }\r\n ): void {\r\n const formGroup = this.formStore[name];\r\n if (!formGroup) {\r\n console.warn(\r\n `[AntdFormService] patchFormValues: form \"${name}\" not found.`\r\n );\r\n return;\r\n }\r\n\r\n const processedValues: Record<string, any> = {};\r\n\r\n Object.entries(values).forEach(([key, value]) => {\r\n const control = formGroup.get(key);\r\n\r\n // 检测是否是 FormArray\r\n if (control instanceof FormArray && Array.isArray(value)) {\r\n this.patchFormArray(name, key, value);\r\n return;\r\n }\r\n\r\n // 普通字段,直接加入\r\n processedValues[key] = value;\r\n });\r\n\r\n // 处理普通字段\r\n if (Object.keys(processedValues).length > 0) {\r\n formGroup.patchValue(processedValues, {\r\n emitEvent: options?.emitEvent ?? true,\r\n });\r\n }\r\n }\r\n\r\n // 表单校验(自动过滤内部字段)\r\n validateForm(\r\n name: string,\r\n options?: { emitEvent?: boolean; onlySelf?: boolean }\r\n ): boolean | Record<string, any> {\r\n if (this.formStore[name].valid) {\r\n const rawValue = this.formStore[name].getRawValue();\r\n return this.excludeInternalFields(rawValue);\r\n } else {\r\n // 递归校验所有控件,包括 FormArray 中的项\r\n this.markAllControlsAsDirty(\r\n this.formStore[name],\r\n options?.emitEvent ?? true,\r\n options?.onlySelf ?? false\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n // 递归标记所有无效控件为 dirty(包括 FormArray 中的项)\r\n private markAllControlsAsDirty(\r\n control: AbstractControl,\r\n emitEvent: boolean,\r\n onlySelf: boolean\r\n ): void {\r\n if (control.invalid) {\r\n control.markAsDirty();\r\n control.updateValueAndValidity({\r\n emitEvent,\r\n onlySelf,\r\n });\r\n }\r\n\r\n // 如果是 FormGroup,递归处理所有子控件\r\n if (control instanceof FormGroup) {\r\n Object.values(control.controls).forEach((childControl) => {\r\n this.markAllControlsAsDirty(childControl, emitEvent, onlySelf);\r\n });\r\n }\r\n\r\n // 如果是 FormArray,递归处理数组中的每一项\r\n if (control instanceof FormArray) {\r\n control.controls.forEach((childControl) => {\r\n this.markAllControlsAsDirty(childControl, emitEvent, onlySelf);\r\n });\r\n }\r\n }\r\n\r\n // ==================== 错误消息相关 ====================\r\n\r\n // 获取字段首条错误提示,支持普通字段和 FormArray 字段(格式:arrayName.index.fieldName)\r\n getFieldErrorMessage(name: string, controlName: string): string {\r\n const formGroup = this.formStore[name];\r\n if (!formGroup) {\r\n console.warn(\r\n `[AntdFormService] getFieldErrorMessage: form \"${name}\" not found.`\r\n );\r\n return \"\";\r\n }\r\n const control = formGroup.get(controlName);\r\n if (!control) {\r\n console.warn(\r\n `[AntdFormService] getFieldErrorMessage: control \"${controlName}\" not found in form \"${name}\".`\r\n );\r\n return \"\";\r\n }\r\n if (!control.errors) {\r\n return \"\";\r\n }\r\n\r\n // 解析 controlName,支持 FormArray 格式:arrayName.index.fieldName\r\n let errorMessageKey = controlName;\r\n const arrayMatch = controlName.match(/^(.+)\\.(\\d+)\\.(.+)$/);\r\n if (arrayMatch) {\r\n // FormArray 格式:arrayName.index.fieldName -> 使用 arrayName[].fieldName 作为 key\r\n const [, arrayName, , fieldName] = arrayMatch;\r\n errorMessageKey = `${arrayName}[].${fieldName}`;\r\n }\r\n\r\n // 从 errorMessageStore 获取错误消息配置\r\n const errorMessages = this.errorMessageStore[name]?.[errorMessageKey];\r\n const mergedMessages = {\r\n ...this.defaultErrorMessages,\r\n ...(errorMessages ?? {}),\r\n };\r\n\r\n for (const errorKey of Object.keys(control.errors)) {\r\n const message = mergedMessages[errorKey];\r\n if (message) {\r\n // 不再支持函数形式,只返回字符串\r\n return typeof message === \"string\" ? message : \"\";\r\n }\r\n }\r\n return \"\";\r\n }\r\n\r\n // ==================== 监听相关 ====================\r\n\r\n // 监听表单所有字段变更\r\n watchFormChanges<T = any>(\r\n name: string,\r\n handler: (value: T) => void,\r\n options?: WatchOptions\r\n ): Subscription | undefined {\r\n const formGroup = this.formStore[name];\r\n if (!formGroup) {\r\n console.warn(\r\n `[AntdFormService] watchFormChanges: form \"${name}\" not found.`\r\n );\r\n return undefined;\r\n }\r\n\r\n return this.setupValueChangeSubscription(formGroup, handler, options);\r\n }\r\n\r\n // 监听指定字段变更\r\n watchFieldChanges<T = any>(\r\n name: string,\r\n controlName: string,\r\n handler: (value: T) => void,\r\n options?: WatchOptions\r\n ): Subscription | undefined {\r\n const formGroup = this.formStore[name];\r\n if (!formGroup) {\r\n console.warn(\r\n `[AntdFormService] watchFieldChanges: form \"${name}\" not found.`\r\n );\r\n return undefined;\r\n }\r\n\r\n const control = formGroup.get(controlName);\r\n if (!control) {\r\n console.warn(\r\n `[AntdFormService] watchFieldChanges: control \"${controlName}\" not found in form \"${name}\".`\r\n );\r\n return undefined;\r\n }\r\n\r\n return this.setupValueChangeSubscription(control, handler, options);\r\n }\r\n\r\n // ==================== 工具方法 ====================\r\n\r\n // 获取表单类名\r\n getFormClassName(name: string): string {\r\n return `${this.classPrefix}${name}`;\r\n }\r\n\r\n // 设置 CSS 变量到目标元素(支持持久化监听动态添加的元素)\r\n setCSSVariablesToTarget(name: string): void {\r\n const selector = `.${this.getFormClassName(name)} .ant-form-item-label`;\r\n const formContainerSelector = `.${this.getFormClassName(name)}`;\r\n const applyStyles = (): boolean => {\r\n const dom = document.querySelectorAll(selector);\r\n if (!dom.length) {\r\n return false;\r\n }\r\n let appliedCount = 0;\r\n dom.forEach((item) => {\r\n const target = item as HTMLElement;\r\n if (\r\n target.style.width !== this.labelWidth ||\r\n target.style.textAlign !== this.labelAlign\r\n ) {\r\n target.style.width = this.labelWidth;\r\n target.style.textAlign = this.labelAlign;\r\n appliedCount++;\r\n }\r\n });\r\n return appliedCount > 0;\r\n };\r\n if (this.labelObservers[name]) {\r\n return;\r\n }\r\n let timeout: any = null;\r\n const observer = new MutationObserver(() => {\r\n cancelAnimationFrame(timeout);\r\n timeout = requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n applyStyles();\r\n }, 0);\r\n });\r\n });\r\n const formContainer = document.querySelector(formContainerSelector);\r\n observer.observe(formContainer || document.body, {\r\n childList: true,\r\n subtree: true,\r\n attributes: true,\r\n });\r\n this.labelObservers[name] = observer;\r\n }\r\n\r\n // ==================== 私有方法 ====================\r\n\r\n // 获取 FormArray\r\n private getFormArray(formName: string, arrayName: string): FormArray | null {\r\n const formGroup = this.formStore[formName];\r\n if (!formGroup) {\r\n console.warn(\r\n `[AntdFormService] getFormArray: form \"${formName}\" not found.`\r\n );\r\n return null;\r\n }\r\n\r\n const control = formGroup.get(arrayName);\r\n if (!control || !(control instanceof FormArray)) {\r\n console.warn(\r\n `[AntdFormService] getFormArray: array \"${arrayName}\" not found in form \"${formName}\".`\r\n );\r\n return null;\r\n }\r\n\r\n return control as FormArray;\r\n }\r\n\r\n // 判断是否是 FormArray 配置\r\n private isFormArrayConfig(\r\n field: FieldConfig | FormArrayConfig\r\n ): field is FormArrayConfig {\r\n return (field as FormArrayConfig).type === \"array\";\r\n }\r\n\r\n // 从配置创建 FormArray\r\n private createFormArrayFromConfig(\r\n formName: string,\r\n arrayName: string,\r\n itemConfig: FormConfig,\r\n initialItems: any[],\r\n uniqueIdField?: string\r\n ): FormArray {\r\n const formArray = this.fb.array([]);\r\n\r\n initialItems.forEach((item) => {\r\n const itemGroup = this.createItemFormGroup(\r\n itemConfig,\r\n item,\r\n uniqueIdField\r\n );\r\n formArray.push(itemGroup);\r\n });\r\n\r\n return formArray;\r\n }\r\n\r\n // 生成内部ID(使用业务唯一字段或生成临时ID)\r\n private generateInternalId(itemData: any, uniqueIdField?: string): string {\r\n // 优先使用业务唯一字段\r\n if (uniqueIdField && itemData?.[uniqueIdField] !== undefined) {\r\n const businessId = itemData[uniqueIdField];\r\n if (\r\n businessId !== null &&\r\n businessId !== undefined &&\r\n businessId !== \"\"\r\n ) {\r\n return `business-${uniqueIdField}-${businessId}`;\r\n }\r\n }\r\n\r\n // 如果没有业务ID,生成临时ID(用于新添加的项)\r\n return `temp-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n // 创建单个项的 FormGroup\r\n private createItemFormGroup(\r\n itemConfig: FormConfig,\r\n itemData: any,\r\n uniqueIdField?: string\r\n ): FormGroup {\r\n const groupConfig: Record<string, any> = {};\r\n\r\n // 添加内部ID字段\r\n const itemId = this.generateInternalId(itemData, uniqueIdField);\r\n groupConfig[this.INTERNAL_ID_FIELD] = [\r\n { value: itemId, disabled: true },\r\n [],\r\n ];\r\n\r\n // 添加业务字段\r\n Object.entries(itemConfig).forEach(([key, field]) => {\r\n // itemConfig 中的字段应该是 FieldConfig,不应该包含 FormArrayConfig\r\n if (this.isFormArrayConfig(field)) {\r\n console.warn(\r\n `[AntdFormService] createItemFormGroup: FormArrayConfig is not allowed in itemConfig. Skipping field \"${key}\".`\r\n );\r\n return;\r\n }\r\n\r\n const fieldConfig = field as FieldConfig;\r\n const value =\r\n itemData?.[key] !== undefined ? itemData[key] : fieldConfig.value;\r\n groupConfig[key] = [\r\n { value: value, disabled: fieldConfig.disabled ?? false },\r\n fieldConfig.validators?.() ?? [],\r\n ];\r\n });\r\n return this.fb.group(groupConfig);\r\n }\r\n\r\n // 通过业务唯一字段查找内部ID\r\n private findFormArrayItemIdByBusinessField(\r\n formName: string,\r\n arrayName: string,\r\n uniqueIdField: string,\r\n businessIdValue: any\r\n ): string | null {\r\n const formArray = this.getFormArray(formName, arrayName);\r\n if (!formArray) return null;\r\n\r\n for (let i = 0; i < formArray.length; i++) {\r\n const item = formArray.at(i) as FormGroup;\r\n const itemValue = item.getRawValue();\r\n const internalId = itemValue[this.INTERNAL_ID_FIELD];\r\n\r\n // 检查内部ID是否匹配业务ID\r\n if (internalId && internalId.startsWith(`business-${uniqueIdField}-`)) {\r\n const idInInternalId = internalId.replace(\r\n `business-${uniqueIdField}-`,\r\n \"\"\r\n );\r\n if (String(idInInternalId) === String(businessIdValue)) {\r\n return internalId;\r\n }\r\n }\r\n\r\n // 也检查当前业务字段值是否匹配(处理业务ID更新的情况)\r\n if (itemValue[uniqueIdField] === businessIdValue) {\r\n return internalId;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // 通过内部ID查找项\r\n private findFormArrayItemById(\r\n formName: string,\r\n arrayName: string,\r\n itemId: string\r\n ): { index: number; formGroup: FormGroup } | null {\r\n const formArray = this.getFormArray(formName, arrayName);\r\n if (!formArray) return null;\r\n\r\n for (let i = 0; i < formArray.length; i++) {\r\n const item = formArray.at(i) as FormGroup;\r\n const id = item.get(this.INTERNAL_ID_FIELD)?.value;\r\n if (id === itemId) {\r\n return { index: i, formGroup: item };\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // 获取操作类型(必须明确指定 action 字段)\r\n private getOperationType(\r\n itemData: any\r\n ): \"create\" | \"update\" | \"delete\" | null {\r\n if (!itemData || typeof itemData !== \"object\") return null;\r\n\r\n const action = itemData.action;\r\n if (action === \"delete\" || action === \"update\" || action === \"create\") {\r\n return action;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n // 过滤操作字段(action 字段不保存到表单中)\r\n private filterOperationFields(itemData: any): any {\r\n if (!itemData || typeof itemData !== \"object\") return itemData;\r\n\r\n const filtered: any = {};\r\n Object.entries(itemData).forEach(([key, value]) => {\r\n if (key !== \"action\") {\r\n filtered[key] = value;\r\n }\r\n });\r\n return filtered;\r\n }\r\n\r\n // 处理 FormArray 的更新(统一根据 action 字段判断操作类型)\r\n private patchFormArray(\r\n formName: string,\r\n arrayName: string,\r\n newValues: any[]\r\n ): void {\r\n const formArray = this.getFormArray(formName, arrayName);\r\n if (!formArray) {\r\n console.warn(\r\n `[AntdFormService] patchFormArray: array \"${arrayName}\" not found in form \"${formName}\".`\r\n );\r\n return;\r\n }\r\n\r\n const config = this.formArrayConfigStore[formName]?.[arrayName];\r\n if (!config) {\r\n console.warn(\r\n `[AntdFormService] patchFormArray: config not found for array \"${arrayName}\" in form \"${formName}\".`\r\n );\r\n return;\r\n }\r\n\r\n const { itemConfig, uniqueIdField } = config;\r\n\r\n // 统一根据 action 字段判断操作类型\r\n const itemsToDelete = new Set<string>();\r\n const itemsToUpdate = new Map<string, any>();\r\n const itemsToAdd: any[] = [];\r\n\r\n newValues.forEach((itemData) => {\r\n if (!itemData || typeof itemData !== \"object\") return;\r\n\r\n const operationType = this.getOperationType(itemData);\r\n if (!operationType) {\r\n console.warn(\r\n `[AntdFormService] patchFormArray: Item missing required \"action\" field. Skipping.`,\r\n itemData\r\n );\r\n return;\r\n }\r\n\r\n // 删除操作\r\n if (operationType === \"delete\") {\r\n if (uniqueIdField && itemData[uniqueIdField] !== undefined) {\r\n const businessId = itemData[uniqueIdField];\r\n const internalId = this.findFormArrayItemIdByBusinessField(\r\n formName,\r\n arrayName,\r\n uniqueIdField,\r\n businessId\r\n );\r\n if (internalId) {\r\n itemsToDelete.add(internalId);\r\n } else {\r\n console.warn(\r\n `[AntdFormService] patchFormArray: Cannot delete item with ${uniqueIdField}=${businessId}, item not found.`\r\n );\r\n }\r\n } else {\r\n console.warn(\r\n `[AntdFormService] patchFormArray: Cannot delete item, missing required uniqueIdField \"${uniqueIdField}\".`\r\n );\r\n }\r\n return;\r\n }\r\n\r\n // 更新操作\r\n if (operationType === \"update\") {\r\n if (uniqueIdField && itemData[uniqueIdField] !== undefined) {\r\n const businessId = itemData[uniqueIdField];\r\n const internalId = this.findFormArrayItemIdByBusinessField(\r\n formName,\r\n arrayName,\r\n uniqueIdField,\r\n businessId\r\n );\r\n\r\n if (internalId) {\r\n const filteredData = this.filterOperationFields(itemData);\r\n itemsToUpdate.set(internalId, filteredData);\r\n } else {\r\n console.warn(\r\n `[AntdFormService] patchFormArray: Cannot update item with ${uniqueIdField}=${businessId}, item not found. Skipping.`\r\n );\r\n }\r\n } else {\r\n console.warn(\r\n `[AntdFormService] patchFormArray: Cannot update item, missing required uniqueIdField \"${uniqueIdField}\". Skipping.`\r\n );\r\n }\r\n return;\r\n }\r\n\r\n // 创建操作\r\n if (operationType === \"create\") {\r\n const filteredData = this.filterOperationFields(itemData);\r\n itemsToAdd.push(filteredData);\r\n }\r\n });\r\n\r\n // 执行删除(需要从后往前删除,避免索引变化)\r\n const deleteIndices: number[] = [];\r\n itemsToDelete.forEach((itemId) => {\r\n const found = this.findFormArrayItemById(formName, arrayName, itemId);\r\n if (found) {\r\n deleteIndices.push(found.index);\r\n }\r\n });\r\n deleteIndices\r\n .sort((a, b) => b - a)\r\n .forEach((index) => {\r\n formArray.removeAt(index);\r\n });\r\n\r\n // 执行更新\r\n itemsToUpdate.forEach((itemData, itemId) => {\r\n const found = this.findFormArrayItemById(formName, arrayName, itemId);\r\n if (found) {\r\n const { [this.INTERNAL_ID_FIELD]: _, ...dataToUpdate } = itemData;\r\n found.formGroup.patchValue(dataToUpdate);\r\n }\r\n });\r\n\r\n // 执行添加\r\n itemsToAdd.forEach((itemData) => {\r\n const newItem = this.createItemFormGroup(\r\n itemConfig,\r\n itemData,\r\n uniqueIdField\r\n );\r\n formArray.push(newItem);\r\n });\r\n }\r\n\r\n // 过滤内部字段(递归处理对象和数组)\r\n private excludeInternalFields(value: any): any {\r\n if (value === null || value === undefined) {\r\n return value;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((item) => this.excludeInternalFields(item));\r\n }\r\n\r\n if (typeof value !== \"object\") {\r\n return value;\r\n }\r\n\r\n const filtered: any = {};\r\n Object.entries(value).forEach(([key, val]) => {\r\n // 过滤以 __ 开头的内部字段和 action 字段\r\n if (!key.startsWith(\"__\") && key !== \"action\") {\r\n filtered[key] = this.excludeInternalFields(val);\r\n }\r\n });\r\n return filtered;\r\n }\r\n\r\n // 设置值变更订阅\r\n private setupValueChangeSubscription<T>(\r\n target: { valueChanges: any; value: any },\r\n handler: (value: T) => void,\r\n options?: WatchOptions\r\n ): Subscription {\r\n let valueChanges$ = target.valueChanges;\r\n\r\n if (options?.debounce != null) {\r\n valueChanges$ = valueChanges$.pipe(debounceTime(options.debounce));\r\n }\r\n\r\n if (options?.distinctUntilChanged !== false) {\r\n valueChanges$ = valueChanges$.pipe(distinctUntilChanged());\r\n }\r\n\r\n if (options?.emitInitial) {\r\n handler(target.value);\r\n }\r\n\r\n return valueChanges$.subscribe(handler);\r\n }\r\n}"]}
|