@yibozhang/pro-table 0.0.8 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/yibozhang-pro-table.umd.js +3 -2
- package/bundles/yibozhang-pro-table.umd.js.map +1 -1
- package/bundles/yibozhang-pro-table.umd.min.js +1 -1
- package/bundles/yibozhang-pro-table.umd.min.js.map +1 -1
- package/esm2015/lib/constants.js +2 -1
- package/esm2015/lib/pro-table.component.js +3 -3
- package/fesm2015/yibozhang-pro-table.js +3 -2
- package/fesm2015/yibozhang-pro-table.js.map +1 -1
- package/lib/constants.d.ts +1 -0
- package/lib/constants.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/lib/styles/custom-antd.less +6 -9
- package/yibozhang-pro-table.metadata.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../node_modules/tslib/tslib.es6.js","../../../pro-table/src/lib/constants.ts","../../../pro-table/src/lib/tokens.ts","../../../pro-table/src/lib/pro-table.component.ts","../../../pro-table/src/lib/page-container/page-container.component.ts","../../../pro-table/src/lib/page-container/page-container.module.ts","../../../pro-table/src/lib/plate-input/plate-input.component.ts","../../../pro-table/src/lib/plate-input/plate-input.module.ts","../../../pro-table/src/lib/table-search-bar/table-search-bar.component.ts","../../../pro-table/src/lib/table-search-bar/table-search-bar-module.ts","../../../pro-table/src/lib/components/colmuns-setting/colmuns-setting.component.ts","../../../pro-table/src/lib/components/dynamic-search-field/dynamic-search-field.component.ts","../../../pro-table/src/lib/pro-table.module.ts","../../../pro-table/src/lib/plate-input/plate-prefix-load.service.ts","../../../pro-table/src/lib/page-public/antd-form.ts","../../../pro-table/src/lib/page-public/array-form.ts"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","_","label","sent","trys","ops","g","Object","create","Iterator","prototype","verb","Symbol","iterator","this","n","v","op","TypeError","call","pop","length","push","__values","o","s","m","i","__read","r","ar","error","__spread","arguments","concat","SuppressedError","ɵ0","ɵ1","ɵ2","PRO_TABLE_DEFAULT_PROPS","input","name","placeHolder","disabled","select","options","allowClear","selectMultiple","inputPlate","checkbox","noStyle","date","showTime","format","mode","autoComplete","dataSource","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","_selectedRowIds","Set","_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","row","getTemplate","customTemplate","get","getToolTipTextValue","ellipsis","getTableRowChecked","isRowChecked","JSON","stringify","isRowDisabled","toggleRowChecked","stopPropagation","id","getRowId","undefined","add","delete","index","isSameRow","updateCheckAllStatus","availableRows","checkedCount","totalCount","toggleCheckAll","getSelectedRows","handleRowCheckedChange","refreshCheckAllStatus","row1","row2","id1","id2","clearSelectedRows","clear","handleFieldCheckBoxChange","checkBoxOptions","handleSearch","handleResetForm","targetColumn","originalColumn","originalFieldProps","defaultValues_1","originalOptions","includes","handlePageIndexChange","handlePageSizeChange","previousDataSource","has","newDataIds_1","oldItem","oldId","error_4","onSortChange","sortKey","sortOrder","getSortOrder","handleTableRowClick","handleTableRowDbClick","handleColumnsSettingConfirm","handleAutoCompleteInput","debouncedFn_1","debounce","evt","currentColumn","debouncedFn","getAutoCompleteDataSource","getFieldProps","getLabelTemplate","getFormItemClassName","type","Component","args","selector","Optional","Inject","Input","Output","ContentChild","ContentChildren","TemplateRef","PageContainerComponent","showHeader","headerTpl","bodyTpl","PageContainerModule","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","ngOnDestroy","fullPlate","onBlur","handleAntdPlateSuffixBlur","toUpperCase","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","ChangeDetectorRef","ElementRef","PlateInputModule","NzGridModule","NzInputModule","NzPopoverModule","NzIconModule","TableSearchBarComponent","leftColSpan","rightColSpan","setCSSVariablesToTarget","ngAfterViewInit","leftContentTpl","actionTextBtnTpl","actionImgBtnTpl","TableSearchBarModule","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","createComponent","extra","componentProps","ComponentFactoryResolver","read","ViewContainerRef","ProTableModule","NzFormModule","NzSelectModule","NzButtonModule","NzTableModule","NzDatePickerModule","NzModalModule","NzCheckboxModule","NzTypographyModule","DragDropModule","NzAutocompleteModule","NzInputNumberModule","NzToolTipModule","useValue","DefaultPlatePrefixLoadService","http","defaultApiUrl","post","dictCode","list","Injectable","HttpClient","AntdFormService","fb","formStore","formModifyType","formRegisterStore","labelObservers","errorMessageStore","classPrefix","defaultErrorMessages","required","minlength","maxlength","email","pattern","isFormGroupConfig","config","createNestedFormGroup","groupConfig","entries","_f","_g","fieldConfig","_e","validators","group","createFormGroup","nestedGroup","errorMessages","resetFormGroup","reset","isFormRegistered","destory","names","getNestedFormGroup","formGroup","path","trim","pathParts","p","currentGroup","pathParts_1","pathParts_1_1","part","FormGroup","addFieldsConfig","formName","fieldsConfig","success","added","failed","rootFormGroup","fieldName","onFieldAdded","targetPath","targetFormGroup","controlsToAdd","errorMessagesToAdd","control","controlOptions","disable","errorMessage","message","addControl","messages","updateValueAndValidity","emitEvent","removeFieldsConfig","fieldNames","removed","onFieldRemoved","fieldsToRemove","errorMessageKeysToRemove","removeControl","patchFormValues","values","patchValue","validateForm","valid","rawValue","getRawValue","excludeInternalFields","markAllControlsAsDirty","onlySelf","invalid","markAsDirty","controls","childControl","getFieldErrorMessage","controlName","errors","mergedMessages","_h","watchFormChanges","handler","setupValueChangeSubscription","watchFieldChanges","getFormClassName","formContainerSelector","timeout","observer","MutationObserver","cancelAnimationFrame","requestAnimationFrame","dom","querySelectorAll","appliedCount","closest","customWidth","getAttribute","customAlign","finalWidth","finalTextAlign","style","textAlign","applyStyles","formContainer","observe","childList","subtree","attributes","filtered","val","startsWith","valueChanges$","valueChanges","pipe","debounceTime","distinctUntilChanged","emitInitial","providedIn","FormBuilder","ArrayFormService","cloneValue","cloned","every","keysA","keysB","createRowSnapshot","snapshot","initializeData","enrichRow","uid","uuidv4","isEdit","addRow","defaultValues","newRow","isAdd","validateField","validator","validateRow","results","validateData","registerForm","initializedData","initialSnapshot","validationResults","editingSnapshot","allTouched","rowTouched","autoUpdateArrayReference","getForm","getFormData","form","addRowToForm","e_3","enableEdit","disableEdit","snapshot_1","confirmEdit","deleteRowFromForm","isFieldTouched","initialValue","currentValue","validateFieldInRow","validateRowAllFields","hasError","targetObject","arrayPropertyName","newArray","hasEditingRow","some","resetFormArray"],"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 // 使用 Set 存储选中项的 ID,支持跨页选中\r\n private _selectedRowIds = new Set<string | number>();\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 if (!this.showCheckbox) {\r\n return [];\r\n }\r\n // 返回当前数据源中所有 checked 为 true 的项\r\n // 注意:如果需要获取所有页的选中项,需要遍历所有数据源或使用 _selectedRowIds\r\n return this.dataSource.filter((row) => row.checked === true) as T[];\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 // 直接读取数据对象的 checked 属性\r\n return data.checked === true;\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\r\n // 直接设置数据对象的 checked 属性\r\n data.checked = checked;\r\n\r\n // 同步更新 _selectedRowIds(用于跨页选中)\r\n const id = this.getRowId(data);\r\n if (id !== undefined) {\r\n if (checked) {\r\n this._selectedRowIds.add(id);\r\n } else {\r\n this._selectedRowIds.delete(id);\r\n }\r\n }\r\n\r\n // 同步更新 _selectedRows(用于兼容性)\r\n const index = this._selectedRows.findIndex((row) =>\r\n this.isSameRow(row, data)\r\n );\r\n if (checked) {\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 if (index > -1) {\r\n this._selectedRows.splice(index, 1);\r\n }\r\n // 若当前高亮行为该行,则取消高亮\r\n if (\r\n this._selectedTableRow &&\r\n this.isSameRow(this._selectedTableRow, data)\r\n ) {\r\n this._selectedTableRow = null;\r\n }\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 // 基于数据对象的 checked 属性计算\r\n const checkedCount = availableRows.filter(\r\n (row) => row.checked === true\r\n ).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\r\n // 只处理可用的行(未禁用的行)\r\n const availableRows = this.dataSource.filter(\r\n (row) => !this.isRowDisabled(row)\r\n );\r\n\r\n // 批量设置 checked 属性\r\n availableRows.forEach((row) => {\r\n row.checked = checked;\r\n\r\n // 同步更新 _selectedRowIds(用于跨页选中)\r\n const id = this.getRowId(row);\r\n if (id !== undefined) {\r\n if (checked) {\r\n this._selectedRowIds.add(id);\r\n } else {\r\n this._selectedRowIds.delete(id);\r\n }\r\n }\r\n });\r\n\r\n // 同步更新 _selectedRows(用于兼容性)\r\n if (checked) {\r\n this._selectedRows = [...availableRows];\r\n // 同步设置高亮选中行为第一条可选数据\r\n this._selectedTableRow =\r\n availableRows.length > 0 ? availableRows[0] : null;\r\n } else {\r\n this._selectedRows = [];\r\n // 取消高亮\r\n this._selectedTableRow = null;\r\n }\r\n\r\n this.updateCheckAllStatus();\r\n }\r\n\r\n // 获取选中的行数据(保留用于兼容性)\r\n getSelectedRows(): any[] {\r\n return this.getCheckedRows();\r\n }\r\n\r\n // 处理行 checkbox 变化事件(数据驱动模式)\r\n handleRowCheckedChange(data: any, checked: boolean): void {\r\n if (this.isRowDisabled(data)) {\r\n return;\r\n }\r\n\r\n // 数据对象的 checked 属性已经通过双向绑定自动更新\r\n // 这里只需要同步更新 _selectedRowIds 和 _selectedRows\r\n\r\n // 同步更新 _selectedRowIds(用于跨页选中)\r\n const id = this.getRowId(data);\r\n if (id !== undefined) {\r\n if (checked) {\r\n this._selectedRowIds.add(id);\r\n } else {\r\n this._selectedRowIds.delete(id);\r\n }\r\n }\r\n\r\n // 同步更新 _selectedRows(用于兼容性)\r\n const index = this._selectedRows.findIndex((row) =>\r\n this.isSameRow(row, data)\r\n );\r\n if (checked) {\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 if (index > -1) {\r\n this._selectedRows.splice(index, 1);\r\n }\r\n // 若当前高亮行为该行,则取消高亮\r\n if (\r\n this._selectedTableRow &&\r\n this.isSameRow(this._selectedTableRow, data)\r\n ) {\r\n this._selectedTableRow = null;\r\n }\r\n }\r\n\r\n // 更新全选状态\r\n this.updateCheckAllStatus();\r\n }\r\n\r\n // 刷新全选状态(用于其他场景)\r\n refreshCheckAllStatus(): void {\r\n this.updateCheckAllStatus();\r\n }\r\n\r\n // 获取行的唯一标识(用于跨页选中)\r\n private getRowId(data: any): string | number | undefined {\r\n return data.id ?? data.key ?? undefined;\r\n }\r\n\r\n // 判断两行是否为同一行\r\n private isSameRow(row1: any, row2: any): boolean {\r\n const id1 = this.getRowId(row1);\r\n const id2 = this.getRowId(row2);\r\n\r\n if (id1 !== undefined && id2 !== undefined) {\r\n return id1 === id2;\r\n }\r\n\r\n // fallback 到 JSON 比较\r\n return JSON.stringify(row1) === JSON.stringify(row2);\r\n }\r\n\r\n // 清空选中的行(数据驱动模式)\r\n clearSelectedRows() {\r\n // 清空当前数据源中所有项的 checked 状态\r\n if (Array.isArray(this.dataSource)) {\r\n this.dataSource.forEach((row) => {\r\n row.checked = false;\r\n });\r\n }\r\n\r\n // 清空选中集合\r\n this._selectedRowIds.clear();\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\r\n // 保存删除前的数据源(用于删除后查询时移除被删除项的选中状态)\r\n const previousDataSource =\r\n afterDelete && this.showCheckbox ? [...this.dataSource] : [];\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\r\n // 自动注入 checked 字段,支持跨页选中\r\n if (this.showCheckbox) {\r\n this.dataSource = (result.data || []).map((item) => {\r\n const id = this.getRowId(item);\r\n // 如果数据已有 checked 属性,保留;否则根据 _selectedRowIds 判断\r\n const checked =\r\n item.checked !== undefined\r\n ? item.checked\r\n : id !== undefined\r\n ? this._selectedRowIds.has(id)\r\n : false;\r\n return {\r\n ...item,\r\n checked: checked,\r\n };\r\n });\r\n\r\n // 删除后查询:移除被删除项的选中状态\r\n if (afterDelete && previousDataSource.length > 0) {\r\n const newDataIds = new Set(\r\n this.dataSource.map((item) => this.getRowId(item))\r\n );\r\n\r\n // 遍历之前的数据源,如果不在新数据源中,说明被删除了,需要清除其选中状态\r\n previousDataSource.forEach((oldItem) => {\r\n const oldId = this.getRowId(oldItem);\r\n if (oldId !== undefined && !newDataIds.has(oldId)) {\r\n // 被删除的项,从选中集合中移除\r\n this._selectedRowIds.delete(oldId);\r\n // 如果数据对象还在其他地方引用,清除其选中状态\r\n if (oldItem.checked !== undefined) {\r\n oldItem.checked = false;\r\n }\r\n }\r\n });\r\n }\r\n } else {\r\n this.dataSource = result.data || [];\r\n }\r\n\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 } else {\r\n console.warn(\"未提供 _request 回调函数\");\r\n this._loading = false;\r\n }\r\n // 不再调用 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 @Input() showHeader: boolean = true;\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 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// 嵌套 FormGroup 配置\r\nexport type FormGroupConfig = {\r\n type: \"group\";\r\n fields: FormConfig;\r\n disabled?: boolean;\r\n validators?: () => ValidatorFn[];\r\n errorMessages?: FieldErrorMessages;\r\n};\r\n\r\n// 表单修改类型\r\nexport type FormModifyType = \"create\" | \"update\";\r\n\r\n// 表单配置(支持普通字段和嵌套 FormGroup)\r\nexport type FormConfig = Record<string, FieldConfig | FormGroupConfig>;\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 targetPath?: string; // 目标路径,用于在嵌套 FormGroup 内部添加字段,例如: \"cardBaseInfo\" 或 \"userInfo.addressInfo\"\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?: (\r\n fieldName: string,\r\n success: boolean,\r\n error?: string\r\n ) => 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 formRegisterStore: Record<string, boolean> = {};\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 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 // 判断是否为嵌套 FormGroup 配置\r\n private isFormGroupConfig(\r\n config: FieldConfig | FormGroupConfig\r\n ): config is FormGroupConfig {\r\n return (\r\n typeof config === \"object\" &&\r\n config !== null &&\r\n \"type\" in config &&\r\n config.type === \"group\"\r\n );\r\n }\r\n\r\n // 递归创建嵌套 FormGroup\r\n private createNestedFormGroup(\r\n fields: FormConfig,\r\n disabled?: boolean\r\n ): FormGroup {\r\n const groupConfig: Record<string, any> = {};\r\n\r\n Object.entries(fields).forEach(([key, fieldConfig]) => {\r\n if (this.isFormGroupConfig(fieldConfig)) {\r\n // 递归创建嵌套的 FormGroup\r\n groupConfig[key] = this.createNestedFormGroup(\r\n fieldConfig.fields,\r\n fieldConfig.disabled ?? disabled\r\n );\r\n } else {\r\n // 创建普通 FormControl\r\n groupConfig[key] = [\r\n {\r\n value: fieldConfig.value,\r\n disabled: fieldConfig.disabled ?? disabled ?? false,\r\n },\r\n fieldConfig.validators?.() ?? [],\r\n ];\r\n }\r\n });\r\n\r\n return this.fb.group(groupConfig);\r\n }\r\n\r\n // 初始化表单\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, fieldConfig]) => {\r\n if (this.isFormGroupConfig(fieldConfig)) {\r\n // 处理嵌套 FormGroup\r\n const nestedGroup = this.createNestedFormGroup(\r\n fieldConfig.fields,\r\n fieldConfig.disabled\r\n );\r\n groupConfig[key] = nestedGroup;\r\n\r\n // 存储嵌套 FormGroup 的错误消息(如果需要)\r\n if (fieldConfig.errorMessages) {\r\n this.errorMessageStore[name][key] = fieldConfig.errorMessages;\r\n }\r\n } else {\r\n // 处理普通字段\r\n groupConfig[key] = [\r\n {\r\n value: fieldConfig.value,\r\n disabled: fieldConfig.disabled ?? false,\r\n },\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.formRegisterStore[name] = true;\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 isFormRegistered(name: string): boolean {\r\n return this.formRegisterStore[name] ?? false;\r\n }\r\n\r\n // 销毁对应的表单\r\n destory(names: string[]): void {\r\n names.forEach((name) => {\r\n // 2. 清理错误消息存储\r\n if (this.errorMessageStore[name]) {\r\n delete this.errorMessageStore[name];\r\n }\r\n\r\n // 3. 清理表单注册标记\r\n if (this.formRegisterStore[name]) {\r\n delete this.formRegisterStore[name];\r\n }\r\n\r\n // 4. 清理表单组(Angular 会自动处理 FormGroup 的清理)\r\n if (this.formStore[name]) {\r\n delete this.formStore[name];\r\n }\r\n });\r\n }\r\n\r\n // 根据路径获取嵌套的 FormGroup\r\n private getNestedFormGroup(\r\n formGroup: FormGroup,\r\n path: string\r\n ): FormGroup | null {\r\n if (!path || path.trim() === \"\") {\r\n return formGroup;\r\n }\r\n\r\n const pathParts = path.split(\".\").filter((p) => p.trim() !== \"\");\r\n let currentGroup: AbstractControl | null = formGroup;\r\n\r\n for (const part of pathParts) {\r\n if (!currentGroup || !(currentGroup instanceof FormGroup)) {\r\n return null;\r\n }\r\n currentGroup = currentGroup.get(part);\r\n if (!currentGroup || !(currentGroup instanceof FormGroup)) {\r\n return null;\r\n }\r\n }\r\n\r\n return currentGroup instanceof FormGroup ? currentGroup : null;\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 rootFormGroup = this.formStore[formName];\r\n if (!rootFormGroup) {\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. 获取目标 FormGroup(支持嵌套路径)\r\n const targetPath = options?.targetPath;\r\n const targetFormGroup = targetPath\r\n ? this.getNestedFormGroup(rootFormGroup, targetPath)\r\n : rootFormGroup;\r\n\r\n if (!targetFormGroup) {\r\n // 如果目标 FormGroup 不存在,所有字段都失败\r\n Object.keys(fieldsConfig).forEach((fieldName) => {\r\n const error = targetPath\r\n ? `Target FormGroup at path \"${targetPath}\" not found`\r\n : `FormGroup 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 // 3. 初始化 errorMessageStore(如果不存在)\r\n if (!this.errorMessageStore[formName]) {\r\n this.errorMessageStore[formName] = {};\r\n }\r\n\r\n // 4. 批量构建控件配置\r\n const controlsToAdd: Record<string, AbstractControl> = {};\r\n const errorMessagesToAdd: Record<string, FieldErrorMessages> = {};\r\n\r\n // 5. 遍历所有字段配置,进行验证和构建\r\n Object.entries(fieldsConfig).forEach(([fieldName, fieldConfig]) => {\r\n try {\r\n // 5.1 检查字段是否已存在\r\n if (targetFormGroup.get(fieldName)) {\r\n const error = `Field \"${fieldName}\" already exists${\r\n targetPath ? ` in \"${targetPath}\"` : \"\"\r\n }`;\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 // 5.2 创建控件\r\n let control: AbstractControl;\r\n\r\n if (this.isFormGroupConfig(fieldConfig)) {\r\n // 创建嵌套 FormGroup\r\n control = this.createNestedFormGroup(\r\n fieldConfig.fields,\r\n fieldConfig.disabled\r\n );\r\n // 存储嵌套 FormGroup 的错误消息(如果需要)\r\n if (fieldConfig.errorMessages) {\r\n const errorMessageKey = targetPath\r\n ? `${targetPath}.${fieldName}`\r\n : fieldName;\r\n errorMessagesToAdd[errorMessageKey] = fieldConfig.errorMessages;\r\n }\r\n } else {\r\n // 创建普通 FormControl\r\n const controlOptions: AbstractControlOptions = {\r\n validators: fieldConfig.validators?.() ?? [],\r\n };\r\n control = this.fb.control(fieldConfig.value, controlOptions);\r\n // 设置 disabled 状态\r\n if (fieldConfig.disabled) {\r\n control.disable();\r\n }\r\n // 存储错误消息\r\n if (fieldConfig.errorMessages) {\r\n const errorMessageKey = targetPath\r\n ? `${targetPath}.${fieldName}`\r\n : fieldName;\r\n errorMessagesToAdd[errorMessageKey] = fieldConfig.errorMessages;\r\n }\r\n }\r\n\r\n controlsToAdd[fieldName] = control;\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 // 6. 批量添加到目标 FormGroup\r\n if (Object.keys(controlsToAdd).length > 0) {\r\n Object.entries(controlsToAdd).forEach(([fieldName, control]) => {\r\n targetFormGroup.addControl(fieldName, control);\r\n });\r\n\r\n // 7. 批量存储错误消息\r\n Object.entries(errorMessagesToAdd).forEach(([key, messages]) => {\r\n this.errorMessageStore[formName][key] = messages;\r\n });\r\n\r\n // 8. 更新表单验证状态\r\n if (options?.updateValueAndValidity) {\r\n targetFormGroup.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\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 // 收集错误消息键\r\n errorMessageKeysToRemove.push(fieldName);\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 } 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 // 局部赋值\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 formGroup.patchValue(values, {\r\n emitEvent: options?.emitEvent ?? true,\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 // 递归校验所有控件\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\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\r\n // ==================== 错误消息相关 ====================\r\n\r\n // 获取字段首条错误提示\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 // 从 errorMessageStore 获取错误消息配置\r\n const errorMessages = this.errorMessageStore[name]?.[controlName];\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\r\n dom.forEach((item) => {\r\n const target = item as HTMLElement;\r\n if (target.closest(\".pro-table-container\")) {\r\n return;\r\n }\r\n const customWidth = target.getAttribute(\"custom-width\");\r\n const customAlign = target.getAttribute(\"custom-align\");\r\n const finalWidth = customWidth || this.labelWidth;\r\n const finalTextAlign = customAlign || this.labelAlign;\r\n if (\r\n target.style.width !== finalWidth ||\r\n target.style.textAlign !== finalTextAlign\r\n ) {\r\n target.style.width = finalWidth;\r\n target.style.textAlign = finalTextAlign;\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 // 过滤内部字段(递归处理对象和数组)\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 // 过滤以 __ 开头的内部字段\r\n if (!key.startsWith(\"__\")) {\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}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\n/** 字段校验结果类型 */\r\nexport type ValidationResult = string;\r\n\r\n/** 字段校验方法类型 */\r\nexport type FieldValidator = (\r\n value: any,\r\n row: ArrayFormRow,\r\n fieldName: string\r\n) => ValidationResult;\r\n\r\n/** 字段配置接口 */\r\nexport interface FieldConfig {\r\n name: string;\r\n validator?: FieldValidator;\r\n}\r\n\r\n/** 数组表单行数据接口 */\r\nexport interface ArrayFormRow {\r\n uid?: string;\r\n isEdit: boolean;\r\n isAdd?: boolean;\r\n disabled?: boolean;\r\n [key: string]: any;\r\n}\r\n\r\n/** 数组表单配置接口 */\r\nexport interface ArrayFormConfig {\r\n fields: FieldConfig[];\r\n defaultValues?: Record<string, any>;\r\n // 自动更新目标对象和属性名,用于触发 Angular 变化检测\r\n targetObject?: Record<string, any>;\r\n arrayPropertyName?: string;\r\n}\r\n\r\n/** 表单存储项接口 */\r\nexport interface ArrayFormStoreItem {\r\n data: ArrayFormRow[];\r\n config: ArrayFormConfig;\r\n validationResults?: Record<string, Record<string, ValidationResult>>;\r\n /** 初始值快照,用于自动检测字段是否被修改 */\r\n initialSnapshot: Record<string, Record<string, any>>;\r\n /** 编辑时快照,用于取消编辑时恢复数据 */\r\n editingSnapshot: Record<string, Record<string, any>>;\r\n /** 是否标记所有字段为已触碰(整个表单提交时设为 true) */\r\n allTouched: boolean;\r\n /** 每行的 touched 状态(单行保存时设为 true) */\r\n rowTouched: Record<string, boolean>;\r\n}\r\n\r\n/** 表单存储接口 */\r\nexport interface ArrayFormStore {\r\n [formName: string]: ArrayFormStoreItem;\r\n}\r\n\r\n/** 数组型数据收集基础服务 */\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class ArrayFormService {\r\n private formStore: ArrayFormStore = {};\r\n\r\n constructor() {}\r\n\r\n /** 深度克隆值 */\r\n private cloneValue(value: any): any {\r\n if (value === null || value === undefined) {\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map((item) => this.cloneValue(item));\r\n }\r\n if (typeof value === \"object\") {\r\n const cloned: Record<string, any> = {};\r\n for (const key of Object.keys(value)) {\r\n cloned[key] = this.cloneValue(value[key]);\r\n }\r\n return cloned;\r\n }\r\n return value;\r\n }\r\n\r\n /** 比较两个值是否相等 */\r\n private isEqual(a: any, b: any): boolean {\r\n if (a === b) return true;\r\n if (a === null || b === null) return a === b;\r\n if (a === undefined || b === undefined) return a === b;\r\n if (typeof a !== typeof b) return false;\r\n\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false;\r\n return a.every((item, index) => this.isEqual(item, b[index]));\r\n }\r\n\r\n if (typeof a === \"object\" && typeof b === \"object\") {\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n if (keysA.length !== keysB.length) return false;\r\n return keysA.every((key) => this.isEqual(a[key], b[key]));\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** 创建行的初始值快照 */\r\n private createRowSnapshot(\r\n row: ArrayFormRow,\r\n fields: FieldConfig[]\r\n ): Record<string, any> {\r\n const snapshot: Record<string, any> = {};\r\n fields.forEach((field) => {\r\n snapshot[field.name] = this.cloneValue(row[field.name]);\r\n });\r\n return snapshot;\r\n }\r\n\r\n /** 初始化数组数据,添加 uid 和 isEdit 字段 */\r\n private initializeData(data: any[]): ArrayFormRow[] {\r\n return data.map((item) => this.enrichRow(item));\r\n }\r\n\r\n /** 为单行数据添加 uid 和 isEdit 字段 */\r\n private enrichRow(row: any): ArrayFormRow {\r\n return {\r\n ...row,\r\n uid: row.uid || uuidv4(),\r\n isEdit: row.isEdit !== undefined ? row.isEdit : false,\r\n disabled: row.disabled !== undefined ? row.disabled : false,\r\n };\r\n }\r\n\r\n /** 新增一行数据 */\r\n private addRow(\r\n data: ArrayFormRow[],\r\n defaultValues?: Record<string, any>\r\n ): ArrayFormRow {\r\n const newRow: ArrayFormRow = {\r\n ...defaultValues,\r\n uid: uuidv4(),\r\n isEdit: true,\r\n isAdd: true,\r\n disabled: false,\r\n };\r\n data.push(newRow);\r\n return newRow;\r\n }\r\n\r\n /** 校验单个字段 */\r\n private validateField(\r\n row: ArrayFormRow,\r\n fieldName: string,\r\n config: ArrayFormConfig\r\n ): ValidationResult {\r\n const fieldConfig = config.fields.find((f) => f.name === fieldName);\r\n\r\n if (!fieldConfig) {\r\n return \"\";\r\n }\r\n\r\n if (fieldConfig.validator) {\r\n return fieldConfig.validator(row[fieldName], row, fieldName);\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /** 校验整行数据 */\r\n private validateRow(\r\n row: ArrayFormRow,\r\n config: ArrayFormConfig\r\n ): Record<string, ValidationResult> {\r\n const results: Record<string, ValidationResult> = {};\r\n\r\n config.fields.forEach((fieldConfig) => {\r\n results[fieldConfig.name] = this.validateField(\r\n row,\r\n fieldConfig.name,\r\n config\r\n );\r\n });\r\n\r\n return results;\r\n }\r\n\r\n /** 校验整个数组 */\r\n private validateData(\r\n data: ArrayFormRow[],\r\n config: ArrayFormConfig\r\n ): Record<string, Record<string, ValidationResult>> {\r\n const results: Record<string, Record<string, ValidationResult>> = {};\r\n\r\n data.forEach((row) => {\r\n results[row.uid] = this.validateRow(row, config);\r\n });\r\n\r\n return results;\r\n }\r\n\r\n /** 注册表单到存储 */\r\n registerForm(\r\n formName: string,\r\n data: ArrayFormRow[],\r\n config: ArrayFormConfig\r\n ): void {\r\n const initializedData = this.initializeData(data);\r\n\r\n // 记录初始值快照\r\n const initialSnapshot: Record<string, Record<string, any>> = {};\r\n initializedData.forEach((row) => {\r\n initialSnapshot[row.uid!] = this.createRowSnapshot(row, config.fields);\r\n });\r\n\r\n this.formStore[formName] = {\r\n data: initializedData,\r\n config,\r\n validationResults: {},\r\n initialSnapshot,\r\n editingSnapshot: {},\r\n allTouched: false,\r\n rowTouched: {},\r\n };\r\n // 如果配置了自动更新,立即更新一次\r\n this.autoUpdateArrayReference(formName);\r\n }\r\n\r\n /** 从存储中获取表单 */\r\n getForm(formName: string): ArrayFormStoreItem | undefined {\r\n return this.formStore[formName];\r\n }\r\n\r\n /** 从存储中获取表单数据 */\r\n getFormData(\r\n formName: string\r\n ):\r\n | Array<Pick<ArrayFormRow, \"uid\" | \"isEdit\" | \"isAdd\" | keyof ArrayFormRow>>\r\n | undefined {\r\n const form = this.formStore[formName];\r\n if (!form) {\r\n return undefined;\r\n }\r\n return form.data.map((item) => {\r\n delete item.isEdit;\r\n delete item.isAdd;\r\n delete item.uid;\r\n return item;\r\n });\r\n }\r\n\r\n /** 向表单添加行 */\r\n addRowToForm(\r\n formName: string,\r\n defaultValues?: Record<string, any>\r\n ): ArrayFormRow | undefined {\r\n const form = this.formStore[formName];\r\n if (!form) {\r\n return undefined;\r\n }\r\n const newRow = this.addRow(form.data, defaultValues);\r\n // 为新行记录初始值快照\r\n form.initialSnapshot[newRow.uid!] = this.createRowSnapshot(\r\n newRow,\r\n form.config.fields\r\n );\r\n // 自动更新外部数组引用\r\n this.autoUpdateArrayReference(formName);\r\n return newRow;\r\n }\r\n\r\n /** 校验表单,自动标记所有字段为已触碰 */\r\n validateForm(formName: string): boolean {\r\n const form = this.formStore[formName];\r\n if (!form) {\r\n return true;\r\n }\r\n // 标记所有字段为已触碰\r\n form.allTouched = true;\r\n const results = this.validateData(form.data, form.config);\r\n form.validationResults = results;\r\n\r\n // 检查是否有任何错误\r\n for (const uid of Object.keys(results)) {\r\n for (const fieldName of Object.keys(results[uid])) {\r\n if (results[uid][fieldName]) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** 开启编辑模式,保存快照用于取消恢复 */\r\n enableEdit(formName: string, row: ArrayFormRow): void {\r\n const form = this.formStore[formName];\r\n if (form && row.uid) {\r\n // 保存编辑前的快照\r\n form.editingSnapshot[row.uid] = this.createRowSnapshot(\r\n row,\r\n form.config.fields\r\n );\r\n }\r\n row.isEdit = true;\r\n }\r\n\r\n /** 取消编辑,恢复到编辑前的数据 */\r\n disableEdit(formName: string, row: ArrayFormRow): void {\r\n const form = this.formStore[formName];\r\n if (form && row.uid && form.editingSnapshot[row.uid]) {\r\n // 恢复编辑前的数据\r\n const snapshot = form.editingSnapshot[row.uid];\r\n form.config.fields.forEach((field) => {\r\n row[field.name] = this.cloneValue(snapshot[field.name]);\r\n });\r\n // 更新初始快照为恢复后的值,消除 touched 状态\r\n form.initialSnapshot[row.uid] = this.cloneValue(snapshot);\r\n // 清理编辑快照和 touched 状态\r\n delete form.editingSnapshot[row.uid];\r\n delete form.rowTouched[row.uid];\r\n // 清理该行的校验结果\r\n if (form.validationResults) {\r\n delete form.validationResults[row.uid];\r\n }\r\n }\r\n row.isEdit = false;\r\n }\r\n\r\n /** 确认编辑,保留修改后的数据 */\r\n confirmEdit(formName: string, row: ArrayFormRow): void {\r\n const form = this.formStore[formName];\r\n if (form && row.uid) {\r\n // 清理编辑快照(保留当前数据)\r\n if (form.editingSnapshot[row.uid]) {\r\n delete form.editingSnapshot[row.uid];\r\n }\r\n // 更新初始快照为当前值(用于后续 touched 检测)\r\n form.initialSnapshot[row.uid] = this.createRowSnapshot(\r\n row,\r\n form.config.fields\r\n );\r\n // 清除 touched 状态,基于新的 initialSnapshot 重新判断\r\n delete form.rowTouched[row.uid];\r\n }\r\n row.isEdit = false;\r\n row.isAdd = false;\r\n }\r\n\r\n /** 从表单中删除指定行 */\r\n deleteRowFromForm(formName: string, row: ArrayFormRow): boolean {\r\n const form = this.formStore[formName];\r\n if (!form || !row.uid) {\r\n return false;\r\n }\r\n const index = form.data.findIndex((item) => item.uid === row.uid);\r\n if (index === -1) {\r\n return false;\r\n }\r\n form.data.splice(index, 1);\r\n // 清理该行的所有快照、touched 状态和校验结果\r\n delete form.initialSnapshot[row.uid];\r\n delete form.editingSnapshot[row.uid];\r\n delete form.rowTouched[row.uid];\r\n if (form.validationResults) {\r\n delete form.validationResults[row.uid];\r\n }\r\n // 自动更新外部数组引用\r\n this.autoUpdateArrayReference(formName);\r\n return true;\r\n }\r\n\r\n /** 检测字段是否已被触碰 */\r\n private isFieldTouched(\r\n form: ArrayFormStoreItem,\r\n row: ArrayFormRow,\r\n fieldName: string\r\n ): boolean {\r\n // 整个表单已 touched(整个表单提交时)\r\n if (form.allTouched) {\r\n return true;\r\n }\r\n // 当前行已 touched(单行保存时)\r\n if (form.rowTouched[row.uid!]) {\r\n return true;\r\n }\r\n // 检测当前值与初始值是否不同\r\n const initialValue = form.initialSnapshot[row.uid!]?.[fieldName];\r\n const currentValue = row[fieldName];\r\n return !this.isEqual(initialValue, currentValue);\r\n }\r\n\r\n /** 校验指定行的指定字段,未修改时不显示校验状态 */\r\n validateFieldInRow(\r\n formName: string,\r\n row: ArrayFormRow,\r\n fieldName: string\r\n ): \"success\" | \"error\" | \"\" {\r\n const form = this.formStore[formName];\r\n if (!form) {\r\n return \"\";\r\n }\r\n\r\n const fieldConfig = form.config.fields.find((f) => f.name === fieldName);\r\n if (!fieldConfig) {\r\n return \"\";\r\n }\r\n\r\n // 执行校验\r\n let result: ValidationResult = \"\";\r\n if (fieldConfig.validator) {\r\n result = fieldConfig.validator(row[fieldName], row, fieldName);\r\n }\r\n\r\n // 更新校验结果存储\r\n if (!form.validationResults) {\r\n form.validationResults = {};\r\n }\r\n if (!form.validationResults[row.uid!]) {\r\n form.validationResults[row.uid!] = {};\r\n }\r\n form.validationResults[row.uid!][fieldName] = result;\r\n\r\n // 如果字段未被触碰,不显示校验状态\r\n if (!this.isFieldTouched(form, row, fieldName)) {\r\n return \"\";\r\n }\r\n\r\n return result ? \"error\" : \"success\";\r\n }\r\n\r\n /** 获取指定行指定字段的校验错误信息 */\r\n getFieldErrorMessage(\r\n formName: string,\r\n row: ArrayFormRow,\r\n fieldName: string\r\n ): string {\r\n const form = this.formStore[formName];\r\n if (!form || !row.uid) {\r\n return \"\";\r\n }\r\n // 如果字段未被触碰,不显示错误信息\r\n if (!this.isFieldTouched(form, row, fieldName)) {\r\n return \"\";\r\n }\r\n return form.validationResults?.[row.uid]?.[fieldName] || \"\";\r\n }\r\n\r\n /** 校验指定行的所有字段 */\r\n validateRowAllFields(formName: string, row: ArrayFormRow): boolean {\r\n const form = this.formStore[formName];\r\n if (!form || !row.uid) {\r\n return true;\r\n }\r\n\r\n // 更新初始快照为当前值\r\n form.initialSnapshot[row.uid] = this.createRowSnapshot(\r\n row,\r\n form.config.fields\r\n );\r\n // 标记当前行为 touched(只影响当前行,不影响其他行)\r\n form.rowTouched[row.uid] = true;\r\n\r\n let hasError = false;\r\n\r\n form.config.fields.forEach((fieldConfig) => {\r\n const result = this.validateFieldInRow(formName, row, fieldConfig.name);\r\n if (result === \"error\") {\r\n hasError = true;\r\n }\r\n });\r\n\r\n return !hasError;\r\n }\r\n\r\n /** 自动更新外部数组引用 */\r\n private autoUpdateArrayReference(formName: string): void {\r\n const form = this.formStore[formName];\r\n if (!form || !form.config.targetObject || !form.config.arrayPropertyName) {\r\n return;\r\n }\r\n const newArray = form.data ? [...form.data] : [];\r\n // 更新目标对象的数组属性为新数组引用\r\n (form.config.targetObject as any)[form.config.arrayPropertyName] = newArray;\r\n }\r\n\r\n /** 是否有正在编辑的行 */\r\n hasEditingRow(formName: string): boolean {\r\n const form = this.formStore[formName];\r\n if (!form) {\r\n return false;\r\n }\r\n return form.data.some((item) => item.isEdit);\r\n }\r\n\r\n // 销毁对应的表单\r\n destory(names: string[]): void {\r\n names.forEach((name) => {\r\n if (this.formStore[name]) {\r\n // 清理表单数据\r\n delete this.formStore[name];\r\n }\r\n });\r\n }\r\n\r\n // 重置表单数组\r\n resetFormArray(name: string): void {\r\n const form = this.formStore[name];\r\n if (!form) {\r\n return;\r\n }\r\n\r\n // 1. 清空数据数组\r\n form.data = [];\r\n\r\n // 2. 清理所有快照\r\n form.initialSnapshot = {};\r\n form.editingSnapshot = {};\r\n\r\n // 3. 清理校验结果\r\n form.validationResults = {};\r\n\r\n // 4. 重置 touched 状态\r\n form.allTouched = false;\r\n form.rowTouched = {};\r\n\r\n // 5. 如果配置了自动更新,更新外部数组引用\r\n this.autoUpdateArrayReference(name);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/tslib/tslib.es6.js","../../../pro-table/src/lib/constants.ts","../../../pro-table/src/lib/tokens.ts","../../../pro-table/src/lib/pro-table.component.ts","../../../pro-table/src/lib/page-container/page-container.component.ts","../../../pro-table/src/lib/page-container/page-container.module.ts","../../../pro-table/src/lib/plate-input/plate-input.component.ts","../../../pro-table/src/lib/plate-input/plate-input.module.ts","../../../pro-table/src/lib/table-search-bar/table-search-bar.component.ts","../../../pro-table/src/lib/table-search-bar/table-search-bar-module.ts","../../../pro-table/src/lib/components/colmuns-setting/colmuns-setting.component.ts","../../../pro-table/src/lib/components/dynamic-search-field/dynamic-search-field.component.ts","../../../pro-table/src/lib/pro-table.module.ts","../../../pro-table/src/lib/plate-input/plate-prefix-load.service.ts","../../../pro-table/src/lib/page-public/antd-form.ts","../../../pro-table/src/lib/page-public/array-form.ts"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","_","label","sent","trys","ops","g","Object","create","Iterator","prototype","verb","Symbol","iterator","this","n","v","op","TypeError","call","pop","length","push","__values","o","s","m","i","__read","r","ar","error","__spread","arguments","concat","SuppressedError","ɵ0","ɵ1","ɵ2","PRO_TABLE_DEFAULT_PROPS","input","name","placeHolder","disabled","select","options","allowClear","selectMultiple","inputPlate","checkbox","noStyle","date","showTime","format","mode","autoComplete","dataSource","backFill","defaultActiveFirstOption","returnFullData","inputNumber","min","max","precision","formatterPercent","parserPercent","custom","PRO_TABLE_DEFAULT_COLUMN","width","align","fixedLeft","fixedRight","auxiliaryColumn","ellipsis","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","_selectedRowIds","Set","_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","row","getTemplate","customTemplate","get","getToolTipTextValue","getTableRowChecked","isRowChecked","JSON","stringify","isRowDisabled","toggleRowChecked","stopPropagation","id","getRowId","undefined","add","delete","index","isSameRow","updateCheckAllStatus","availableRows","checkedCount","totalCount","toggleCheckAll","getSelectedRows","handleRowCheckedChange","refreshCheckAllStatus","row1","row2","id1","id2","clearSelectedRows","clear","handleFieldCheckBoxChange","checkBoxOptions","handleSearch","handleResetForm","targetColumn","originalColumn","originalFieldProps","defaultValues_1","originalOptions","includes","handlePageIndexChange","handlePageSizeChange","previousDataSource","has","newDataIds_1","oldItem","oldId","error_4","onSortChange","sortKey","sortOrder","getSortOrder","handleTableRowClick","handleTableRowDbClick","handleColumnsSettingConfirm","handleAutoCompleteInput","debouncedFn_1","debounce","evt","currentColumn","debouncedFn","getAutoCompleteDataSource","getFieldProps","getLabelTemplate","getFormItemClassName","type","Component","args","selector","Optional","Inject","Input","Output","ContentChild","ContentChildren","TemplateRef","PageContainerComponent","showHeader","headerTpl","bodyTpl","PageContainerModule","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","ngOnDestroy","fullPlate","onBlur","handleAntdPlateSuffixBlur","toUpperCase","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","ChangeDetectorRef","ElementRef","PlateInputModule","NzGridModule","NzInputModule","NzPopoverModule","NzIconModule","TableSearchBarComponent","leftColSpan","rightColSpan","setCSSVariablesToTarget","ngAfterViewInit","leftContentTpl","actionTextBtnTpl","actionImgBtnTpl","TableSearchBarModule","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","createComponent","extra","componentProps","ComponentFactoryResolver","read","ViewContainerRef","ProTableModule","NzFormModule","NzSelectModule","NzButtonModule","NzTableModule","NzDatePickerModule","NzModalModule","NzCheckboxModule","NzTypographyModule","DragDropModule","NzAutocompleteModule","NzInputNumberModule","NzToolTipModule","useValue","DefaultPlatePrefixLoadService","http","defaultApiUrl","post","dictCode","list","Injectable","HttpClient","AntdFormService","fb","formStore","formModifyType","formRegisterStore","labelObservers","errorMessageStore","classPrefix","defaultErrorMessages","required","minlength","maxlength","email","pattern","isFormGroupConfig","config","createNestedFormGroup","groupConfig","entries","_f","_g","fieldConfig","_e","validators","group","createFormGroup","nestedGroup","errorMessages","resetFormGroup","reset","isFormRegistered","destory","names","getNestedFormGroup","formGroup","path","trim","pathParts","p","currentGroup","pathParts_1","pathParts_1_1","part","FormGroup","addFieldsConfig","formName","fieldsConfig","success","added","failed","rootFormGroup","fieldName","onFieldAdded","targetPath","targetFormGroup","controlsToAdd","errorMessagesToAdd","control","controlOptions","disable","errorMessage","message","addControl","messages","updateValueAndValidity","emitEvent","removeFieldsConfig","fieldNames","removed","onFieldRemoved","fieldsToRemove","errorMessageKeysToRemove","removeControl","patchFormValues","values","patchValue","validateForm","valid","rawValue","getRawValue","excludeInternalFields","markAllControlsAsDirty","onlySelf","invalid","markAsDirty","controls","childControl","getFieldErrorMessage","controlName","errors","mergedMessages","_h","watchFormChanges","handler","setupValueChangeSubscription","watchFieldChanges","getFormClassName","formContainerSelector","timeout","observer","MutationObserver","cancelAnimationFrame","requestAnimationFrame","dom","querySelectorAll","appliedCount","closest","customWidth","getAttribute","customAlign","finalWidth","finalTextAlign","style","textAlign","applyStyles","formContainer","observe","childList","subtree","attributes","filtered","val","startsWith","valueChanges$","valueChanges","pipe","debounceTime","distinctUntilChanged","emitInitial","providedIn","FormBuilder","ArrayFormService","cloneValue","cloned","every","keysA","keysB","createRowSnapshot","snapshot","initializeData","enrichRow","uid","uuidv4","isEdit","addRow","defaultValues","newRow","isAdd","validateField","validator","validateRow","results","validateData","registerForm","initializedData","initialSnapshot","validationResults","editingSnapshot","allTouched","rowTouched","autoUpdateArrayReference","getForm","getFormData","form","addRowToForm","e_3","enableEdit","disableEdit","snapshot_1","confirmEdit","deleteRowFromForm","isFieldTouched","initialValue","currentValue","validateFieldInRow","validateRowAllFields","hasError","targetObject","arrayPropertyName","newArray","hasEditingRow","some","resetFormArray"],"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 ellipsis: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 // 使用 Set 存储选中项的 ID,支持跨页选中\r\n private _selectedRowIds = new Set<string | number>();\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 if (!this.showCheckbox) {\r\n return [];\r\n }\r\n // 返回当前数据源中所有 checked 为 true 的项\r\n // 注意:如果需要获取所有页的选中项,需要遍历所有数据源或使用 _selectedRowIds\r\n return this.dataSource.filter((row) => row.checked === true) as T[];\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 // 直接读取数据对象的 checked 属性\r\n return data.checked === true;\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\r\n // 直接设置数据对象的 checked 属性\r\n data.checked = checked;\r\n\r\n // 同步更新 _selectedRowIds(用于跨页选中)\r\n const id = this.getRowId(data);\r\n if (id !== undefined) {\r\n if (checked) {\r\n this._selectedRowIds.add(id);\r\n } else {\r\n this._selectedRowIds.delete(id);\r\n }\r\n }\r\n\r\n // 同步更新 _selectedRows(用于兼容性)\r\n const index = this._selectedRows.findIndex((row) =>\r\n this.isSameRow(row, data)\r\n );\r\n if (checked) {\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 if (index > -1) {\r\n this._selectedRows.splice(index, 1);\r\n }\r\n // 若当前高亮行为该行,则取消高亮\r\n if (\r\n this._selectedTableRow &&\r\n this.isSameRow(this._selectedTableRow, data)\r\n ) {\r\n this._selectedTableRow = null;\r\n }\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 // 基于数据对象的 checked 属性计算\r\n const checkedCount = availableRows.filter(\r\n (row) => row.checked === true\r\n ).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\r\n // 只处理可用的行(未禁用的行)\r\n const availableRows = this.dataSource.filter(\r\n (row) => !this.isRowDisabled(row)\r\n );\r\n\r\n // 批量设置 checked 属性\r\n availableRows.forEach((row) => {\r\n row.checked = checked;\r\n\r\n // 同步更新 _selectedRowIds(用于跨页选中)\r\n const id = this.getRowId(row);\r\n if (id !== undefined) {\r\n if (checked) {\r\n this._selectedRowIds.add(id);\r\n } else {\r\n this._selectedRowIds.delete(id);\r\n }\r\n }\r\n });\r\n\r\n // 同步更新 _selectedRows(用于兼容性)\r\n if (checked) {\r\n this._selectedRows = [...availableRows];\r\n // 同步设置高亮选中行为第一条可选数据\r\n this._selectedTableRow =\r\n availableRows.length > 0 ? availableRows[0] : null;\r\n } else {\r\n this._selectedRows = [];\r\n // 取消高亮\r\n this._selectedTableRow = null;\r\n }\r\n\r\n this.updateCheckAllStatus();\r\n }\r\n\r\n // 获取选中的行数据(保留用于兼容性)\r\n getSelectedRows(): any[] {\r\n return this.getCheckedRows();\r\n }\r\n\r\n // 处理行 checkbox 变化事件(数据驱动模式)\r\n handleRowCheckedChange(data: any, checked: boolean): void {\r\n if (this.isRowDisabled(data)) {\r\n return;\r\n }\r\n\r\n // 数据对象的 checked 属性已经通过双向绑定自动更新\r\n // 这里只需要同步更新 _selectedRowIds 和 _selectedRows\r\n\r\n // 同步更新 _selectedRowIds(用于跨页选中)\r\n const id = this.getRowId(data);\r\n if (id !== undefined) {\r\n if (checked) {\r\n this._selectedRowIds.add(id);\r\n } else {\r\n this._selectedRowIds.delete(id);\r\n }\r\n }\r\n\r\n // 同步更新 _selectedRows(用于兼容性)\r\n const index = this._selectedRows.findIndex((row) =>\r\n this.isSameRow(row, data)\r\n );\r\n if (checked) {\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 if (index > -1) {\r\n this._selectedRows.splice(index, 1);\r\n }\r\n // 若当前高亮行为该行,则取消高亮\r\n if (\r\n this._selectedTableRow &&\r\n this.isSameRow(this._selectedTableRow, data)\r\n ) {\r\n this._selectedTableRow = null;\r\n }\r\n }\r\n\r\n // 更新全选状态\r\n this.updateCheckAllStatus();\r\n }\r\n\r\n // 刷新全选状态(用于其他场景)\r\n refreshCheckAllStatus(): void {\r\n this.updateCheckAllStatus();\r\n }\r\n\r\n // 获取行的唯一标识(用于跨页选中)\r\n private getRowId(data: any): string | number | undefined {\r\n return data.id ?? data.key ?? undefined;\r\n }\r\n\r\n // 判断两行是否为同一行\r\n private isSameRow(row1: any, row2: any): boolean {\r\n const id1 = this.getRowId(row1);\r\n const id2 = this.getRowId(row2);\r\n\r\n if (id1 !== undefined && id2 !== undefined) {\r\n return id1 === id2;\r\n }\r\n\r\n // fallback 到 JSON 比较\r\n return JSON.stringify(row1) === JSON.stringify(row2);\r\n }\r\n\r\n // 清空选中的行(数据驱动模式)\r\n clearSelectedRows() {\r\n // 清空当前数据源中所有项的 checked 状态\r\n if (Array.isArray(this.dataSource)) {\r\n this.dataSource.forEach((row) => {\r\n row.checked = false;\r\n });\r\n }\r\n\r\n // 清空选中集合\r\n this._selectedRowIds.clear();\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\r\n // 保存删除前的数据源(用于删除后查询时移除被删除项的选中状态)\r\n const previousDataSource =\r\n afterDelete && this.showCheckbox ? [...this.dataSource] : [];\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\r\n // 自动注入 checked 字段,支持跨页选中\r\n if (this.showCheckbox) {\r\n this.dataSource = (result.data || []).map((item) => {\r\n const id = this.getRowId(item);\r\n // 如果数据已有 checked 属性,保留;否则根据 _selectedRowIds 判断\r\n const checked =\r\n item.checked !== undefined\r\n ? item.checked\r\n : id !== undefined\r\n ? this._selectedRowIds.has(id)\r\n : false;\r\n return {\r\n ...item,\r\n checked: checked,\r\n };\r\n });\r\n\r\n // 删除后查询:移除被删除项的选中状态\r\n if (afterDelete && previousDataSource.length > 0) {\r\n const newDataIds = new Set(\r\n this.dataSource.map((item) => this.getRowId(item))\r\n );\r\n\r\n // 遍历之前的数据源,如果不在新数据源中,说明被删除了,需要清除其选中状态\r\n previousDataSource.forEach((oldItem) => {\r\n const oldId = this.getRowId(oldItem);\r\n if (oldId !== undefined && !newDataIds.has(oldId)) {\r\n // 被删除的项,从选中集合中移除\r\n this._selectedRowIds.delete(oldId);\r\n // 如果数据对象还在其他地方引用,清除其选中状态\r\n if (oldItem.checked !== undefined) {\r\n oldItem.checked = false;\r\n }\r\n }\r\n });\r\n }\r\n } else {\r\n this.dataSource = result.data || [];\r\n }\r\n\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 } else {\r\n console.warn(\"未提供 _request 回调函数\");\r\n this._loading = false;\r\n }\r\n // 不再调用 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 @Input() showHeader: boolean = true;\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 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// 嵌套 FormGroup 配置\r\nexport type FormGroupConfig = {\r\n type: \"group\";\r\n fields: FormConfig;\r\n disabled?: boolean;\r\n validators?: () => ValidatorFn[];\r\n errorMessages?: FieldErrorMessages;\r\n};\r\n\r\n// 表单修改类型\r\nexport type FormModifyType = \"create\" | \"update\";\r\n\r\n// 表单配置(支持普通字段和嵌套 FormGroup)\r\nexport type FormConfig = Record<string, FieldConfig | FormGroupConfig>;\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 targetPath?: string; // 目标路径,用于在嵌套 FormGroup 内部添加字段,例如: \"cardBaseInfo\" 或 \"userInfo.addressInfo\"\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?: (\r\n fieldName: string,\r\n success: boolean,\r\n error?: string\r\n ) => 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 formRegisterStore: Record<string, boolean> = {};\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 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 // 判断是否为嵌套 FormGroup 配置\r\n private isFormGroupConfig(\r\n config: FieldConfig | FormGroupConfig\r\n ): config is FormGroupConfig {\r\n return (\r\n typeof config === \"object\" &&\r\n config !== null &&\r\n \"type\" in config &&\r\n config.type === \"group\"\r\n );\r\n }\r\n\r\n // 递归创建嵌套 FormGroup\r\n private createNestedFormGroup(\r\n fields: FormConfig,\r\n disabled?: boolean\r\n ): FormGroup {\r\n const groupConfig: Record<string, any> = {};\r\n\r\n Object.entries(fields).forEach(([key, fieldConfig]) => {\r\n if (this.isFormGroupConfig(fieldConfig)) {\r\n // 递归创建嵌套的 FormGroup\r\n groupConfig[key] = this.createNestedFormGroup(\r\n fieldConfig.fields,\r\n fieldConfig.disabled ?? disabled\r\n );\r\n } else {\r\n // 创建普通 FormControl\r\n groupConfig[key] = [\r\n {\r\n value: fieldConfig.value,\r\n disabled: fieldConfig.disabled ?? disabled ?? false,\r\n },\r\n fieldConfig.validators?.() ?? [],\r\n ];\r\n }\r\n });\r\n\r\n return this.fb.group(groupConfig);\r\n }\r\n\r\n // 初始化表单\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, fieldConfig]) => {\r\n if (this.isFormGroupConfig(fieldConfig)) {\r\n // 处理嵌套 FormGroup\r\n const nestedGroup = this.createNestedFormGroup(\r\n fieldConfig.fields,\r\n fieldConfig.disabled\r\n );\r\n groupConfig[key] = nestedGroup;\r\n\r\n // 存储嵌套 FormGroup 的错误消息(如果需要)\r\n if (fieldConfig.errorMessages) {\r\n this.errorMessageStore[name][key] = fieldConfig.errorMessages;\r\n }\r\n } else {\r\n // 处理普通字段\r\n groupConfig[key] = [\r\n {\r\n value: fieldConfig.value,\r\n disabled: fieldConfig.disabled ?? false,\r\n },\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.formRegisterStore[name] = true;\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 isFormRegistered(name: string): boolean {\r\n return this.formRegisterStore[name] ?? false;\r\n }\r\n\r\n // 销毁对应的表单\r\n destory(names: string[]): void {\r\n names.forEach((name) => {\r\n // 2. 清理错误消息存储\r\n if (this.errorMessageStore[name]) {\r\n delete this.errorMessageStore[name];\r\n }\r\n\r\n // 3. 清理表单注册标记\r\n if (this.formRegisterStore[name]) {\r\n delete this.formRegisterStore[name];\r\n }\r\n\r\n // 4. 清理表单组(Angular 会自动处理 FormGroup 的清理)\r\n if (this.formStore[name]) {\r\n delete this.formStore[name];\r\n }\r\n });\r\n }\r\n\r\n // 根据路径获取嵌套的 FormGroup\r\n private getNestedFormGroup(\r\n formGroup: FormGroup,\r\n path: string\r\n ): FormGroup | null {\r\n if (!path || path.trim() === \"\") {\r\n return formGroup;\r\n }\r\n\r\n const pathParts = path.split(\".\").filter((p) => p.trim() !== \"\");\r\n let currentGroup: AbstractControl | null = formGroup;\r\n\r\n for (const part of pathParts) {\r\n if (!currentGroup || !(currentGroup instanceof FormGroup)) {\r\n return null;\r\n }\r\n currentGroup = currentGroup.get(part);\r\n if (!currentGroup || !(currentGroup instanceof FormGroup)) {\r\n return null;\r\n }\r\n }\r\n\r\n return currentGroup instanceof FormGroup ? currentGroup : null;\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 rootFormGroup = this.formStore[formName];\r\n if (!rootFormGroup) {\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. 获取目标 FormGroup(支持嵌套路径)\r\n const targetPath = options?.targetPath;\r\n const targetFormGroup = targetPath\r\n ? this.getNestedFormGroup(rootFormGroup, targetPath)\r\n : rootFormGroup;\r\n\r\n if (!targetFormGroup) {\r\n // 如果目标 FormGroup 不存在,所有字段都失败\r\n Object.keys(fieldsConfig).forEach((fieldName) => {\r\n const error = targetPath\r\n ? `Target FormGroup at path \"${targetPath}\" not found`\r\n : `FormGroup 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 // 3. 初始化 errorMessageStore(如果不存在)\r\n if (!this.errorMessageStore[formName]) {\r\n this.errorMessageStore[formName] = {};\r\n }\r\n\r\n // 4. 批量构建控件配置\r\n const controlsToAdd: Record<string, AbstractControl> = {};\r\n const errorMessagesToAdd: Record<string, FieldErrorMessages> = {};\r\n\r\n // 5. 遍历所有字段配置,进行验证和构建\r\n Object.entries(fieldsConfig).forEach(([fieldName, fieldConfig]) => {\r\n try {\r\n // 5.1 检查字段是否已存在\r\n if (targetFormGroup.get(fieldName)) {\r\n const error = `Field \"${fieldName}\" already exists${\r\n targetPath ? ` in \"${targetPath}\"` : \"\"\r\n }`;\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 // 5.2 创建控件\r\n let control: AbstractControl;\r\n\r\n if (this.isFormGroupConfig(fieldConfig)) {\r\n // 创建嵌套 FormGroup\r\n control = this.createNestedFormGroup(\r\n fieldConfig.fields,\r\n fieldConfig.disabled\r\n );\r\n // 存储嵌套 FormGroup 的错误消息(如果需要)\r\n if (fieldConfig.errorMessages) {\r\n const errorMessageKey = targetPath\r\n ? `${targetPath}.${fieldName}`\r\n : fieldName;\r\n errorMessagesToAdd[errorMessageKey] = fieldConfig.errorMessages;\r\n }\r\n } else {\r\n // 创建普通 FormControl\r\n const controlOptions: AbstractControlOptions = {\r\n validators: fieldConfig.validators?.() ?? [],\r\n };\r\n control = this.fb.control(fieldConfig.value, controlOptions);\r\n // 设置 disabled 状态\r\n if (fieldConfig.disabled) {\r\n control.disable();\r\n }\r\n // 存储错误消息\r\n if (fieldConfig.errorMessages) {\r\n const errorMessageKey = targetPath\r\n ? `${targetPath}.${fieldName}`\r\n : fieldName;\r\n errorMessagesToAdd[errorMessageKey] = fieldConfig.errorMessages;\r\n }\r\n }\r\n\r\n controlsToAdd[fieldName] = control;\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 // 6. 批量添加到目标 FormGroup\r\n if (Object.keys(controlsToAdd).length > 0) {\r\n Object.entries(controlsToAdd).forEach(([fieldName, control]) => {\r\n targetFormGroup.addControl(fieldName, control);\r\n });\r\n\r\n // 7. 批量存储错误消息\r\n Object.entries(errorMessagesToAdd).forEach(([key, messages]) => {\r\n this.errorMessageStore[formName][key] = messages;\r\n });\r\n\r\n // 8. 更新表单验证状态\r\n if (options?.updateValueAndValidity) {\r\n targetFormGroup.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\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 // 收集错误消息键\r\n errorMessageKeysToRemove.push(fieldName);\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 } 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 // 局部赋值\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 formGroup.patchValue(values, {\r\n emitEvent: options?.emitEvent ?? true,\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 // 递归校验所有控件\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\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\r\n // ==================== 错误消息相关 ====================\r\n\r\n // 获取字段首条错误提示\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 // 从 errorMessageStore 获取错误消息配置\r\n const errorMessages = this.errorMessageStore[name]?.[controlName];\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\r\n dom.forEach((item) => {\r\n const target = item as HTMLElement;\r\n if (target.closest(\".pro-table-container\")) {\r\n return;\r\n }\r\n const customWidth = target.getAttribute(\"custom-width\");\r\n const customAlign = target.getAttribute(\"custom-align\");\r\n const finalWidth = customWidth || this.labelWidth;\r\n const finalTextAlign = customAlign || this.labelAlign;\r\n if (\r\n target.style.width !== finalWidth ||\r\n target.style.textAlign !== finalTextAlign\r\n ) {\r\n target.style.width = finalWidth;\r\n target.style.textAlign = finalTextAlign;\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 // 过滤内部字段(递归处理对象和数组)\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 // 过滤以 __ 开头的内部字段\r\n if (!key.startsWith(\"__\")) {\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}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\n/** 字段校验结果类型 */\r\nexport type ValidationResult = string;\r\n\r\n/** 字段校验方法类型 */\r\nexport type FieldValidator = (\r\n value: any,\r\n row: ArrayFormRow,\r\n fieldName: string\r\n) => ValidationResult;\r\n\r\n/** 字段配置接口 */\r\nexport interface FieldConfig {\r\n name: string;\r\n validator?: FieldValidator;\r\n}\r\n\r\n/** 数组表单行数据接口 */\r\nexport interface ArrayFormRow {\r\n uid?: string;\r\n isEdit: boolean;\r\n isAdd?: boolean;\r\n disabled?: boolean;\r\n [key: string]: any;\r\n}\r\n\r\n/** 数组表单配置接口 */\r\nexport interface ArrayFormConfig {\r\n fields: FieldConfig[];\r\n defaultValues?: Record<string, any>;\r\n // 自动更新目标对象和属性名,用于触发 Angular 变化检测\r\n targetObject?: Record<string, any>;\r\n arrayPropertyName?: string;\r\n}\r\n\r\n/** 表单存储项接口 */\r\nexport interface ArrayFormStoreItem {\r\n data: ArrayFormRow[];\r\n config: ArrayFormConfig;\r\n validationResults?: Record<string, Record<string, ValidationResult>>;\r\n /** 初始值快照,用于自动检测字段是否被修改 */\r\n initialSnapshot: Record<string, Record<string, any>>;\r\n /** 编辑时快照,用于取消编辑时恢复数据 */\r\n editingSnapshot: Record<string, Record<string, any>>;\r\n /** 是否标记所有字段为已触碰(整个表单提交时设为 true) */\r\n allTouched: boolean;\r\n /** 每行的 touched 状态(单行保存时设为 true) */\r\n rowTouched: Record<string, boolean>;\r\n}\r\n\r\n/** 表单存储接口 */\r\nexport interface ArrayFormStore {\r\n [formName: string]: ArrayFormStoreItem;\r\n}\r\n\r\n/** 数组型数据收集基础服务 */\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class ArrayFormService {\r\n private formStore: ArrayFormStore = {};\r\n\r\n constructor() {}\r\n\r\n /** 深度克隆值 */\r\n private cloneValue(value: any): any {\r\n if (value === null || value === undefined) {\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map((item) => this.cloneValue(item));\r\n }\r\n if (typeof value === \"object\") {\r\n const cloned: Record<string, any> = {};\r\n for (const key of Object.keys(value)) {\r\n cloned[key] = this.cloneValue(value[key]);\r\n }\r\n return cloned;\r\n }\r\n return value;\r\n }\r\n\r\n /** 比较两个值是否相等 */\r\n private isEqual(a: any, b: any): boolean {\r\n if (a === b) return true;\r\n if (a === null || b === null) return a === b;\r\n if (a === undefined || b === undefined) return a === b;\r\n if (typeof a !== typeof b) return false;\r\n\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false;\r\n return a.every((item, index) => this.isEqual(item, b[index]));\r\n }\r\n\r\n if (typeof a === \"object\" && typeof b === \"object\") {\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n if (keysA.length !== keysB.length) return false;\r\n return keysA.every((key) => this.isEqual(a[key], b[key]));\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** 创建行的初始值快照 */\r\n private createRowSnapshot(\r\n row: ArrayFormRow,\r\n fields: FieldConfig[]\r\n ): Record<string, any> {\r\n const snapshot: Record<string, any> = {};\r\n fields.forEach((field) => {\r\n snapshot[field.name] = this.cloneValue(row[field.name]);\r\n });\r\n return snapshot;\r\n }\r\n\r\n /** 初始化数组数据,添加 uid 和 isEdit 字段 */\r\n private initializeData(data: any[]): ArrayFormRow[] {\r\n return data.map((item) => this.enrichRow(item));\r\n }\r\n\r\n /** 为单行数据添加 uid 和 isEdit 字段 */\r\n private enrichRow(row: any): ArrayFormRow {\r\n return {\r\n ...row,\r\n uid: row.uid || uuidv4(),\r\n isEdit: row.isEdit !== undefined ? row.isEdit : false,\r\n disabled: row.disabled !== undefined ? row.disabled : false,\r\n };\r\n }\r\n\r\n /** 新增一行数据 */\r\n private addRow(\r\n data: ArrayFormRow[],\r\n defaultValues?: Record<string, any>\r\n ): ArrayFormRow {\r\n const newRow: ArrayFormRow = {\r\n ...defaultValues,\r\n uid: uuidv4(),\r\n isEdit: true,\r\n isAdd: true,\r\n disabled: false,\r\n };\r\n data.push(newRow);\r\n return newRow;\r\n }\r\n\r\n /** 校验单个字段 */\r\n private validateField(\r\n row: ArrayFormRow,\r\n fieldName: string,\r\n config: ArrayFormConfig\r\n ): ValidationResult {\r\n const fieldConfig = config.fields.find((f) => f.name === fieldName);\r\n\r\n if (!fieldConfig) {\r\n return \"\";\r\n }\r\n\r\n if (fieldConfig.validator) {\r\n return fieldConfig.validator(row[fieldName], row, fieldName);\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /** 校验整行数据 */\r\n private validateRow(\r\n row: ArrayFormRow,\r\n config: ArrayFormConfig\r\n ): Record<string, ValidationResult> {\r\n const results: Record<string, ValidationResult> = {};\r\n\r\n config.fields.forEach((fieldConfig) => {\r\n results[fieldConfig.name] = this.validateField(\r\n row,\r\n fieldConfig.name,\r\n config\r\n );\r\n });\r\n\r\n return results;\r\n }\r\n\r\n /** 校验整个数组 */\r\n private validateData(\r\n data: ArrayFormRow[],\r\n config: ArrayFormConfig\r\n ): Record<string, Record<string, ValidationResult>> {\r\n const results: Record<string, Record<string, ValidationResult>> = {};\r\n\r\n data.forEach((row) => {\r\n results[row.uid] = this.validateRow(row, config);\r\n });\r\n\r\n return results;\r\n }\r\n\r\n /** 注册表单到存储 */\r\n registerForm(\r\n formName: string,\r\n data: ArrayFormRow[],\r\n config: ArrayFormConfig\r\n ): void {\r\n const initializedData = this.initializeData(data);\r\n\r\n // 记录初始值快照\r\n const initialSnapshot: Record<string, Record<string, any>> = {};\r\n initializedData.forEach((row) => {\r\n initialSnapshot[row.uid!] = this.createRowSnapshot(row, config.fields);\r\n });\r\n\r\n this.formStore[formName] = {\r\n data: initializedData,\r\n config,\r\n validationResults: {},\r\n initialSnapshot,\r\n editingSnapshot: {},\r\n allTouched: false,\r\n rowTouched: {},\r\n };\r\n // 如果配置了自动更新,立即更新一次\r\n this.autoUpdateArrayReference(formName);\r\n }\r\n\r\n /** 从存储中获取表单 */\r\n getForm(formName: string): ArrayFormStoreItem | undefined {\r\n return this.formStore[formName];\r\n }\r\n\r\n /** 从存储中获取表单数据 */\r\n getFormData(\r\n formName: string\r\n ):\r\n | Array<Pick<ArrayFormRow, \"uid\" | \"isEdit\" | \"isAdd\" | keyof ArrayFormRow>>\r\n | undefined {\r\n const form = this.formStore[formName];\r\n if (!form) {\r\n return undefined;\r\n }\r\n return form.data.map((item) => {\r\n delete item.isEdit;\r\n delete item.isAdd;\r\n delete item.uid;\r\n return item;\r\n });\r\n }\r\n\r\n /** 向表单添加行 */\r\n addRowToForm(\r\n formName: string,\r\n defaultValues?: Record<string, any>\r\n ): ArrayFormRow | undefined {\r\n const form = this.formStore[formName];\r\n if (!form) {\r\n return undefined;\r\n }\r\n const newRow = this.addRow(form.data, defaultValues);\r\n // 为新行记录初始值快照\r\n form.initialSnapshot[newRow.uid!] = this.createRowSnapshot(\r\n newRow,\r\n form.config.fields\r\n );\r\n // 自动更新外部数组引用\r\n this.autoUpdateArrayReference(formName);\r\n return newRow;\r\n }\r\n\r\n /** 校验表单,自动标记所有字段为已触碰 */\r\n validateForm(formName: string): boolean {\r\n const form = this.formStore[formName];\r\n if (!form) {\r\n return true;\r\n }\r\n // 标记所有字段为已触碰\r\n form.allTouched = true;\r\n const results = this.validateData(form.data, form.config);\r\n form.validationResults = results;\r\n\r\n // 检查是否有任何错误\r\n for (const uid of Object.keys(results)) {\r\n for (const fieldName of Object.keys(results[uid])) {\r\n if (results[uid][fieldName]) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** 开启编辑模式,保存快照用于取消恢复 */\r\n enableEdit(formName: string, row: ArrayFormRow): void {\r\n const form = this.formStore[formName];\r\n if (form && row.uid) {\r\n // 保存编辑前的快照\r\n form.editingSnapshot[row.uid] = this.createRowSnapshot(\r\n row,\r\n form.config.fields\r\n );\r\n }\r\n row.isEdit = true;\r\n }\r\n\r\n /** 取消编辑,恢复到编辑前的数据 */\r\n disableEdit(formName: string, row: ArrayFormRow): void {\r\n const form = this.formStore[formName];\r\n if (form && row.uid && form.editingSnapshot[row.uid]) {\r\n // 恢复编辑前的数据\r\n const snapshot = form.editingSnapshot[row.uid];\r\n form.config.fields.forEach((field) => {\r\n row[field.name] = this.cloneValue(snapshot[field.name]);\r\n });\r\n // 更新初始快照为恢复后的值,消除 touched 状态\r\n form.initialSnapshot[row.uid] = this.cloneValue(snapshot);\r\n // 清理编辑快照和 touched 状态\r\n delete form.editingSnapshot[row.uid];\r\n delete form.rowTouched[row.uid];\r\n // 清理该行的校验结果\r\n if (form.validationResults) {\r\n delete form.validationResults[row.uid];\r\n }\r\n }\r\n row.isEdit = false;\r\n }\r\n\r\n /** 确认编辑,保留修改后的数据 */\r\n confirmEdit(formName: string, row: ArrayFormRow): void {\r\n const form = this.formStore[formName];\r\n if (form && row.uid) {\r\n // 清理编辑快照(保留当前数据)\r\n if (form.editingSnapshot[row.uid]) {\r\n delete form.editingSnapshot[row.uid];\r\n }\r\n // 更新初始快照为当前值(用于后续 touched 检测)\r\n form.initialSnapshot[row.uid] = this.createRowSnapshot(\r\n row,\r\n form.config.fields\r\n );\r\n // 清除 touched 状态,基于新的 initialSnapshot 重新判断\r\n delete form.rowTouched[row.uid];\r\n }\r\n row.isEdit = false;\r\n row.isAdd = false;\r\n }\r\n\r\n /** 从表单中删除指定行 */\r\n deleteRowFromForm(formName: string, row: ArrayFormRow): boolean {\r\n const form = this.formStore[formName];\r\n if (!form || !row.uid) {\r\n return false;\r\n }\r\n const index = form.data.findIndex((item) => item.uid === row.uid);\r\n if (index === -1) {\r\n return false;\r\n }\r\n form.data.splice(index, 1);\r\n // 清理该行的所有快照、touched 状态和校验结果\r\n delete form.initialSnapshot[row.uid];\r\n delete form.editingSnapshot[row.uid];\r\n delete form.rowTouched[row.uid];\r\n if (form.validationResults) {\r\n delete form.validationResults[row.uid];\r\n }\r\n // 自动更新外部数组引用\r\n this.autoUpdateArrayReference(formName);\r\n return true;\r\n }\r\n\r\n /** 检测字段是否已被触碰 */\r\n private isFieldTouched(\r\n form: ArrayFormStoreItem,\r\n row: ArrayFormRow,\r\n fieldName: string\r\n ): boolean {\r\n // 整个表单已 touched(整个表单提交时)\r\n if (form.allTouched) {\r\n return true;\r\n }\r\n // 当前行已 touched(单行保存时)\r\n if (form.rowTouched[row.uid!]) {\r\n return true;\r\n }\r\n // 检测当前值与初始值是否不同\r\n const initialValue = form.initialSnapshot[row.uid!]?.[fieldName];\r\n const currentValue = row[fieldName];\r\n return !this.isEqual(initialValue, currentValue);\r\n }\r\n\r\n /** 校验指定行的指定字段,未修改时不显示校验状态 */\r\n validateFieldInRow(\r\n formName: string,\r\n row: ArrayFormRow,\r\n fieldName: string\r\n ): \"success\" | \"error\" | \"\" {\r\n const form = this.formStore[formName];\r\n if (!form) {\r\n return \"\";\r\n }\r\n\r\n const fieldConfig = form.config.fields.find((f) => f.name === fieldName);\r\n if (!fieldConfig) {\r\n return \"\";\r\n }\r\n\r\n // 执行校验\r\n let result: ValidationResult = \"\";\r\n if (fieldConfig.validator) {\r\n result = fieldConfig.validator(row[fieldName], row, fieldName);\r\n }\r\n\r\n // 更新校验结果存储\r\n if (!form.validationResults) {\r\n form.validationResults = {};\r\n }\r\n if (!form.validationResults[row.uid!]) {\r\n form.validationResults[row.uid!] = {};\r\n }\r\n form.validationResults[row.uid!][fieldName] = result;\r\n\r\n // 如果字段未被触碰,不显示校验状态\r\n if (!this.isFieldTouched(form, row, fieldName)) {\r\n return \"\";\r\n }\r\n\r\n return result ? \"error\" : \"success\";\r\n }\r\n\r\n /** 获取指定行指定字段的校验错误信息 */\r\n getFieldErrorMessage(\r\n formName: string,\r\n row: ArrayFormRow,\r\n fieldName: string\r\n ): string {\r\n const form = this.formStore[formName];\r\n if (!form || !row.uid) {\r\n return \"\";\r\n }\r\n // 如果字段未被触碰,不显示错误信息\r\n if (!this.isFieldTouched(form, row, fieldName)) {\r\n return \"\";\r\n }\r\n return form.validationResults?.[row.uid]?.[fieldName] || \"\";\r\n }\r\n\r\n /** 校验指定行的所有字段 */\r\n validateRowAllFields(formName: string, row: ArrayFormRow): boolean {\r\n const form = this.formStore[formName];\r\n if (!form || !row.uid) {\r\n return true;\r\n }\r\n\r\n // 更新初始快照为当前值\r\n form.initialSnapshot[row.uid] = this.createRowSnapshot(\r\n row,\r\n form.config.fields\r\n );\r\n // 标记当前行为 touched(只影响当前行,不影响其他行)\r\n form.rowTouched[row.uid] = true;\r\n\r\n let hasError = false;\r\n\r\n form.config.fields.forEach((fieldConfig) => {\r\n const result = this.validateFieldInRow(formName, row, fieldConfig.name);\r\n if (result === \"error\") {\r\n hasError = true;\r\n }\r\n });\r\n\r\n return !hasError;\r\n }\r\n\r\n /** 自动更新外部数组引用 */\r\n private autoUpdateArrayReference(formName: string): void {\r\n const form = this.formStore[formName];\r\n if (!form || !form.config.targetObject || !form.config.arrayPropertyName) {\r\n return;\r\n }\r\n const newArray = form.data ? [...form.data] : [];\r\n // 更新目标对象的数组属性为新数组引用\r\n (form.config.targetObject as any)[form.config.arrayPropertyName] = newArray;\r\n }\r\n\r\n /** 是否有正在编辑的行 */\r\n hasEditingRow(formName: string): boolean {\r\n const form = this.formStore[formName];\r\n if (!form) {\r\n return false;\r\n }\r\n return form.data.some((item) => item.isEdit);\r\n }\r\n\r\n // 销毁对应的表单\r\n destory(names: string[]): void {\r\n names.forEach((name) => {\r\n if (this.formStore[name]) {\r\n // 清理表单数据\r\n delete this.formStore[name];\r\n }\r\n });\r\n }\r\n\r\n // 重置表单数组\r\n resetFormArray(name: string): void {\r\n const form = this.formStore[name];\r\n if (!form) {\r\n return;\r\n }\r\n\r\n // 1. 清空数据数组\r\n form.data = [];\r\n\r\n // 2. 清理所有快照\r\n form.initialSnapshot = {};\r\n form.editingSnapshot = {};\r\n\r\n // 3. 清理校验结果\r\n form.validationResults = {};\r\n\r\n // 4. 重置 touched 状态\r\n form.allTouched = false;\r\n form.rowTouched = {};\r\n\r\n // 5. 如果配置了自动更新,更新外部数组引用\r\n this.autoUpdateArrayReference(name);\r\n }\r\n}\r\n"]}
|