fantasy-ngzorro 2.0.3 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/fantasy-ngzorro.umd.js +192 -151
- package/bundles/fantasy-ngzorro.umd.js.map +1 -1
- package/bundles/fantasy-ngzorro.umd.min.js +1 -1
- package/bundles/fantasy-ngzorro.umd.min.js.map +1 -1
- package/esm2015/fantasy-ngzorro.js +2 -2
- package/esm2015/hd-detail-form/hd-detail-form.component.js +1 -1
- package/esm2015/hd-form/hd-form.component.js +24 -3
- package/esm2015/hd-form/hd-form.service.js +7 -3
- package/esm2015/index.js +2 -2
- package/esm2015/model/common-type.js +16 -1
- package/esm2015/public-api.js +2 -2
- package/esm5/fantasy-ngzorro.js +2 -2
- package/esm5/hd-detail-form/hd-detail-form.component.js +1 -1
- package/esm5/hd-form/hd-form.component.js +24 -3
- package/esm5/hd-form/hd-form.service.js +7 -3
- package/esm5/index.js +2 -2
- package/esm5/model/common-type.js +18 -1
- package/esm5/public-api.js +2 -2
- package/fantasy-ngzorro.metadata.json +1 -1
- package/fesm2015/fantasy-ngzorro.js +184 -145
- package/fesm2015/fantasy-ngzorro.js.map +1 -1
- package/fesm5/fantasy-ngzorro.js +192 -152
- package/fesm5/fantasy-ngzorro.js.map +1 -1
- package/hd-form/hd-form.service.d.ts +5 -3
- package/model/common-type.d.ts +6 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/tslib/tslib.es6.js","ng://fantasy-ngzorro/hd-button-group/hd-button-group.component.ts","ng://fantasy-ngzorro/hd-button-group/hd-button-group.module.ts","ng://fantasy-ngzorro/hd-button/hd-button.service.ts","ng://fantasy-ngzorro/hd-button/hd-button.component.ts","ng://fantasy-ngzorro/hd-button/hd-button.module.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.component.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.module.ts","ng://fantasy-ngzorro/hd-space/hd-space.service.ts","ng://fantasy-ngzorro/hd-space/hd-space.component.ts","ng://fantasy-ngzorro/hd-space/hd-space.module.ts","ng://fantasy-ngzorro/model/common-type.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.component.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.module.ts","ng://fantasy-ngzorro/hd-detail-lines-page/hd-detail-lines-page.component.ts","ng://fantasy-ngzorro/hd-detail-lines-page/hd-detail-lines-page.module.ts","ng://fantasy-ngzorro/hd-status/hd-status.service.ts","ng://fantasy-ngzorro/hd-detail-tip/hd-detail-tip.component.ts","ng://fantasy-ngzorro/hd-detail-tip/hd-detail-tip.module.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.component.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.module.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.service.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.component.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.module.ts","ng://fantasy-ngzorro/hd-form/hd-form.component.ts","ng://fantasy-ngzorro/hd-form/hd-form.module.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.component.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.module.ts","ng://fantasy-ngzorro/hd-log/hd-log.component.ts","ng://fantasy-ngzorro/hd-log/hd-log.service.ts","ng://fantasy-ngzorro/hd-log/hd-log.module.ts","ng://fantasy-ngzorro/hd-popconfirm/hd-popconfirm.component.ts","ng://fantasy-ngzorro/hd-popconfirm/hd-popconfirm.module.ts","ng://fantasy-ngzorro/hd-status/hd-status.component.ts","ng://fantasy-ngzorro/hd-status/hd-status.module.ts","ng://fantasy-ngzorro/service/common-session.service.ts","ng://fantasy-ngzorro/model/colWidth.ts","ng://fantasy-ngzorro/hd-table/hd-table.service.ts","ng://fantasy-ngzorro/hd-table/hd-table.component.ts","ng://fantasy-ngzorro/hd-table/hd-table.module.ts","ng://fantasy-ngzorro/hd-tip/hd-tip.component.ts","ng://fantasy-ngzorro/hd-tip/hd-tip.module.ts","ng://fantasy-ngzorro/hd-component.module.ts","ng://fantasy-ngzorro/fantasy-ngzorro.module.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.service.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.service.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.service.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.service.ts","ng://fantasy-ngzorro/hd-form/hd-form.service.ts","ng://fantasy-ngzorro/utils.ts","ng://fantasy-ngzorro/model/staticConst.ts"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__decorate","decorators","target","key","desc","d","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__metadata","metadataKey","metadataValue","metadata","__values","o","Symbol","iterator","m","next","value","done","TypeError","__read","e","ar","push","error","__spread","concat","HdButtonGroupComponent","ngOnInit","Component","args","selector","template","ContentChild","static","HdButtonGroupModule","NgModule","imports","CommonModule","FormsModule","NgZorroAntdModule","declarations","exports","primary","dashed","danger","default","link","submit","reset","add","normal","small","HdButtonService","Injectable","providedIn","HdButtonComponent","type","ButtonType","size","ButtonSize","disabled","clickAction","EventEmitter","nzOnConfirm","loading","observers","innerClickAction","option","emit","Input","Output","tslib_1.__decorate","InputBoolean","HdButtonModule","HdDetailFormComponent","formCols","Array","filter","item","hide","ngOnChanges","changes","JSON","stringify","currentValue","previousValue","triggerEvent","fn","event","HdDetailFormModule","Style","HdSpaceService","HdSpaceComponent","SpaceType","background","style","HdSpaceModule","ReactiveFormsModule","totalPages","totalElements","pageNumber","pageSize","hasContent","hasNext","content","HdOption","SelectOption","showLabelAndValue","hdDropdownMatchSelectWidth","hdServerSearch","hdShowItemCode","hdShowSearch","hdAllowClear","RadioOption","SelectOptionTableColumn","SelectOptionTableColumnIcon","InputNumber","min","max","step","precision","CascaderOption","HdDetailLinesComponent","showSelected","allowDrop","showSearch","searchFields","scroll","x","selectField","selectEvent","showTotal","totalOption","columnsNumber","hdFrontPagination","totalOptionList","tableData","Page","tableLoading","tablePageIndex","tablePageSize","isAllDisplayDataChecked","isIndeterminate","listOfDisplayData","listOfAllData","mapOfCheckedId","mapOfCheckList","displayLines","isFilterData","storeFormLinesData","syncStoreFromLinesInput","applyDisplayFromStore","countSelected","calculateTotal","lines","source","data","parse","restoreFromStore","searchLines","_this","filterStr","trim","filterValue","toLowerCase","filteredData","_c","tslib_1.__values","keys","_d","toString","includes","_e","_f","selectedField","forEach","round","drop","moveItemInArray","previousIndex","currentIndex","Number","fill","insertIndex","insertValue","align","showDecimal","isHide","currentPageDataChange","$event","refreshStatus","resetStatus","every","some","values","checkAll","HdDetailLinesModule","NzTableModule","DragDropModule","schemas","NO_ERRORS_SCHEMA","HdDetailLinesPageComponent","tablePageIndexChange","tablePageSizeChange","pageChange","isCrossPageSelectLocal","isCrossPageSelect","getRowIndex","localIndex","onPageIndexChange","pageIndex","onPageSizeChange","HdDetailLinesPageModule","statusToColor","#FAB13B","#9FA4A2","#F5222D","#3B77E3","#20B95D","#F05B24","HdDetailTipComponent","HdStatusService","tip","setStatusColor","findKey","state","indexOf","toUpperCase","statusColor","HdDetailTipModule","HdFilterComponent","fb","searchEvent","resetEvent","isShowMore","filterListModular","searchSubject","Subject","debounceTimeout","searchSubscription","pipe","debounceTime","subscribe","_a","selectOption","init","checkList","filterList","formGroupList","index","name","control","show","validateFilterForm","group","onChangeEvent","onChangeEventDebounceTime","get","valueChanges","onSearchEvent","onSearchEventDebounceTime","unsubscribe","computeOffset","list","nameList","tslib_1.__spread","Set","submitForm","getRawValue","resetForm","resetFilterFormWithValue","resetValue","patchValue","getFilterData","showMore","inputClean","patchObject","FormBuilder","HdFilterModule","require","hideViewDomValue","inputNumber","showTime","canSearch","ColorOption","ExplainOption","Select","Date","DateRange","TextArea","MultipleSelect","ViewDom","Switch","Time","HdFormLinesService","HdFormLinesComponent","cdr","showLineNumber","allowEmpty","deleteLastLineEvent","showKeyboardOperateTip","operateButtons","changeEvent","showDeleteConfirm","paginationPageIndex","paginationPageSize","showForm","filterStoreFormLinesData","filterIndexStore","formValid","collectDomList","activeDomX","activeDomY","activeDom","activeSelectedComponentOpen","deleteLineEvent","textWidthCache","line","formLinesData","ngAfterViewInit","collectDomData","formInputDomListSub","formInputDomList","ngOnDestroy","linesFormArray","controls","setActiveSelectedComponentOpen","setTimeout","domList","document","querySelectorAll","dom","header","remove","oldIndex","getOldDomIndex","formLines","insertBefore","createDOMStructure","slice","firstChild","getSelectTableColumnStyle","column","width","formItem","hdOptionHeader","createElement","className","paddingLeft","SELECT_TABLE_OPTION_HORIZONTAL_PADDING","paddingRight","tableColumns","selectOptionTableColumn","columnDiv","widthStyle","label","labelText","createTextNode","appendChild","pageDomList","toArray","startIndex","endIndex","pageLinesLength","formLinesLength","interval","splice","disableInputNumberKeyboardStep","j","this_1","NzInputNumberComponent","onKeyDown","keyCode","setValidateValue","jumpToNextInput","y","NzSelectComponent","console","log","focusDom","addNewLineAndFocus","Math","ceil","addFormLine","jumpToPrevInput","jumpDirection","cleanFocusDom","dom_1","nzDisabled","nzSelectTopControlComponent","inputElement","nativeElement","scrollIntoView","behavior","block","inline","nzSelectService","mode","focus","inputDom_1","getElementById","nzId","select","ElementRef","NzDatePickerComponent","NzRangePickerComponent","NzTimePickerComponent","setActiveDom","blur","nzOpen","open","setActiveDomInFormLines","rowNumber","colNumber","getDomIndex","nowActiveDom_1","test","typeList","validateHdFormLines","getValid","innerGetValid","tmpValidateHdFormLines","array","formLinesDataItem","formGroupObj","judgeValueIsNotEmpty","Validators","required","lineIndex","formGroupTmp","insert","valid","getLines","allLines","setStoreData","_b","getStyle","styleObj","min-width","colorOption","color","isEdit","createForm","addFormLineWithData","onHdFormValueChanged","newLine","newLineItem","delayJumpToNextInput","isHdFormLineSearchAdd","formGroupSubmit","innerIndex","FormLineType","calculateLineNumber","setValue","emitEvent","isFocus","deleteFormLine","removeAt","pageIndexChange","pageSizeChange","lines_1","getNowLines","addIndex","deletedIndex_1","count","filterIndex_1","pop","selectOptionCheckList","innerItem","selectValue","id","querySelector","isTextOverflow","text","maxWidth","cachedWidth","undefined","span","visibility","position","whiteSpace","fontSize","display","innerText","body","isOverflow","offsetWidth","removeChild","judgeColEmpty","str","ChangeDetectorRef","ViewChildren","HdFormLinesModule","HdFormComponent","inputNumberDefaultFormatter","inputNumberDefaultParser","formList","dealRow","split","map","year","month","day","newDateStr","toLocaleDateString","replace","validator","formItemDate","validateHdForm","formListLength","totalWidth","isRowFirst","columnItems","space","markAsDirty","updateValueAndValidity","HdFormModule","HdCurrentTableComponent","showTableTotal","tableSearchEvent","tableTotalOptionList","search","selectedList","HdCurrentTableModule","HdLogComponent","HdLogService","modalService","showLogs","logs","create","nzTitle","nzContent","nzComponentParams","nzFooter","nzWidth","NzModalService","HdLogModule","entryComponents","providers","HdPopconfirmComponent","confirmOption","cancelOption","cancel","confirm","HdPopconfirmModule","bootstrap","HdStatusComponent","statusLower","status","HdStatusModule","CommonSessionService","putSession","session_key","session","window","sessionStorage","setItem","removeItem","getSession","getItem","removeSession","ColWidth","tableImageColWidth","tableTwoImageColWidth","billNumberColWidth","nameColWidth","codeColWidth","codeNameColWidth","enumColWidth","dateColWidth","dateTimeColWidth","dateRangeWidth","operateColWidth","numberColWidth","remarkColWidth","fixColWidth","maxColWidth","fixed","btnList","isShow","canSort","canWarp","OperateBtn","showConfirm","isRepeat","HdTableTotalOption","TableCacheOption","colWidths","Map","title","checked","selectable","isLeaf","expanded","HdTableComponent","commonSessionService","tableCols","showOperateColWarpButton","sortEvent","tablePageSizeChangeEvent","tableCacheOption","tableColsCache","showTable","selectColListNodes","selectColListNodesCache","showListNodes","isDropdownVisible","nowListNodes","hideListNodes","cancelNowListNodes","cancelHideListNodes","showDetail","localforage","localtionTmp","isFirstEntrySearchLocal","beforeDrop","arg","node","origin","dragNode","pos","of","TreeGrid","dragNodeIndex","findIndex","nodeIndex","delay","localforage.createInstance","driver","localforage.INDEXEDDB","version","storeName","isFirstEntrySearch","location","pathname","userSession","userCode","deleteHideItem","ready","then","getInitLocalforage","catch","sort","uuid","normalizeTableCacheOption","initTable","err","judgeRepeatCols","dealCols","setCols","dealScroll","dealOperateBtn","cancelDropdown","confirmDropdown","submitGrids","cols","saveTableCacheOption","hasColsCache","reduce","notIncols","incols","a","b","element","col","has","moveElementNearby","arr","elementToMoveTitle","targetElementTitle","tmpArray","targetIndex","elementIndex","newIndex","removedElement","checkAction","find","title_1","temporaryNodeList","temporaryNodeList_1","getHideListNodes","nodeItem","minWidth","leftFixedCols","rightFixedCols","normalCols","resultCols","colWidths_1","set","onResize","tempWidth","operateCol","textStr_1","btn","colWidth","fixedWidth","tableTotal","getStateField","isState","stateField","HdTableModule","NzToolTipModule","NzPopconfirmModule","NzResizableModule","NzDropDownModule","NzTreeModule","NzIconModule","HdTipComponent","showIcon","HdTipModule","HdComponentModule","FantasyNgzorroModule","HdDetailFormService","TotalOption","Cascader","Month","HdFilterService","ValidatorKey","Radio","HdFormService","Utils","fillSelectOption","options","returnData","selectList","fillArrayFormItem","obj","arrayToSelectOptionList","labelTip","valueTip","returnItem","nums","isArray","Error","num","result","nums_1","nums_1_1","subtract","shift","nums_2","nums_2_1","multiply","nums_3","nums_3_1","divide","nums_4","nums_4_1","MaxPageSize"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, ContentChild, Input, OnInit, TemplateRef } from '@angular/core';\n\n@Component({\n selector: 'hd-button-group',\n templateUrl: './hd-button-group.component.html',\n styleUrls: ['./hd-button-group.component.less']\n})\nexport class HdButtonGroupComponent implements OnInit {\n @ContentChild(\"buttonGroupLeft\", { static: false }) buttonGroupLeft: TemplateRef<any>;\n @ContentChild(\"buttonGroupRight\", { static: false }) buttonGroupRight: TemplateRef<any>;\n\n constructor() { }\n\n ngOnInit() {\n\n }\n}\n","import { HdButtonGroupComponent } from './hd-button-group.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdButtonGroupComponent],\n exports: [HdButtonGroupComponent]\n})\nexport class HdButtonGroupModule { }\n","import { Injectable } from '@angular/core';\n\nexport enum ButtonType {\n primary = 'primary',\n dashed = 'dashed',\n danger = 'danger',\n default = 'default',\n link = 'link',\n submit = 'submit',\n // 增加类型\n reset = 'reset',\n add = 'add'\n}\n\nexport enum ButtonSize {\n normal = 'normal',\n small = 'small'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdButtonService {\n\n constructor() { }\n\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { InputBoolean } from 'ng-zorro-antd';\nimport { ButtonSize, ButtonType } from './hd-button.service';\n@Component({\n selector: 'hd-button',\n templateUrl: './hd-button.component.html',\n styleUrls: ['./hd-button.component.less']\n})\nexport class HdButtonComponent implements OnInit {\n\n // 默认default\n @Input() type: ButtonType = ButtonType.default;\n @Input() size: ButtonSize = ButtonSize.normal;\n @Input() @InputBoolean() loading: boolean;\n @Input() @InputBoolean() disabled: boolean = false;\n @Output() clickAction = new EventEmitter<any>();\n @Output() nzOnConfirm = new EventEmitter<any>();\n constructor() { }\n\n ngOnInit() {\n if ((this.loading === false || this.loading === true) && this.clickAction.observers.length === 0 && this.nzOnConfirm.observers.length === 0) {\n throw '存在loading效果的hd-button组件禁止使用click绑定点击事件,请使用clickAction绑定!';\n }\n if (this.type === 'submit') {\n throw '禁止使用submit类型的按钮,请使用普通按钮+click事件触发表单提交!';\n }\n }\n\n /** loading 时一并禁用,避免与外部 [disabled] 绑定互相翻转状态 */\n get isDisabled(): boolean {\n return this.disabled || this.loading;\n }\n\n innerClickAction(option: any) {\n // loading 状态下,不允许触发点击事件\n if (this.loading) {\n return;\n }\n this.clickAction.emit(option);\n }\n}\n","import { HdButtonComponent } from './hd-button.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdButtonComponent],\n exports: [HdButtonComponent]\n})\nexport class HdButtonModule { }\n","import { Component, Input, OnInit, SimpleChange } from '@angular/core';\nimport { HdOption } from '../model/common-type';\n\n@Component({\n selector: 'hd-detail-form',\n templateUrl: './hd-detail-form.component.html',\n styleUrls: ['./hd-detail-form.component.less']\n})\nexport class HdDetailFormComponent implements OnInit {\n @Input() formCols: Array<HdOption> = new Array();\n\n constructor() { }\n\n ngOnInit() {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n\n ngOnChanges(changes: SimpleChange) {\n if (changes['formCols'] && JSON.stringify(changes['formCols'].currentValue) !== JSON.stringify(changes['formCols'].previousValue)) {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n }\n\n triggerEvent(fn: any) {\n if (fn) {\n fn(event);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdDetailFormComponent } from './hd-detail-form.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule\n ],\n exports: [HdDetailFormComponent],\n declarations: [HdDetailFormComponent]\n})\nexport class HdDetailFormModule { }\n","import { Injectable } from '@angular/core';\n\nexport enum SpaceType {\n row = 'row',\n column = 'column'\n}\n\nexport class Style {\n background: string\n width: string\n height: string\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdSpaceService {\n\n constructor() { }\n\n}\n","import { Component, Input, OnInit, Output } from '@angular/core';\nimport { Style, SpaceType } from \"./hd-space.service\"; \n\n@Component({\n selector: 'hd-space',\n templateUrl: './hd-space.component.html',\n styleUrls: ['./hd-space.component.less']\n})\nexport class HdSpaceComponent implements OnInit {\n @Input() type: SpaceType = SpaceType.row; \n @Input() size: number; \n @Input() background: string = 'inherit'; \n\n style: Style = new Style();\n\n constructor() { }\n\n ngOnInit() {\n this.style['background'] = this.background;\n if(this.type === SpaceType.row){\n this.style['width'] = '100%';\n this.style['height'] = this.size + 'px';\n }else{\n this.style['height'] = '100%';\n this.style['width'] = this.size + 'px';\n }\n }\n\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdSpaceComponent } from './hd-space.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdSpaceComponent],\n exports: [HdSpaceComponent]\n})\nexport class HdSpaceModule { }\n","export class Page<T> {\n totalPages = 0;\n totalElements = 0;\n pageNumber = 0;\n pageSize = 10;\n hasContent = false;\n hasNext = false;\n content: Array<T> = [];\n}\n\nexport class HdOption {\n label: string;\n value: any;\n color?: string;\n hide?: boolean;\n clickText?: string;\n click?: (value: any) => void;\n}\n\nexport class SelectOption {\n label: string;\n value: string;\n selectList?: Array<any>;\n selectListName?: string;\n showLabelAndValue?: boolean = false;\n hdDropdownMatchSelectWidth?: boolean = false;\n hdServerSearch?: boolean = false;\n hdShowItemCode?: boolean = false; // 是否用[value]label显示选项列表\n tableColumns?: Array<SelectOptionTableColumn>;\n hdShowSearch?: boolean = true;\n hdAllowClear?: boolean = true;\n}\n\nexport class RadioOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class SelectOptionTableColumn {\n width: number;\n label: string; // 这里对应的是列名\n name: string; // 对应selectList里面的name值, 如果有render字段 则去render函数渲染\n icons?: Array<SelectOptionTableColumnIcon>; // 对应的图片名字\n render?: (value: any) => string;\n}\n\nexport class SelectOptionTableColumnIcon {\n iconName: string;\n fieldName: string;\n}\n\nexport class InputNumber {\n min?: number = 0;\n max?: number = 99999999;\n step?: number = 1;\n precision?: number = 4;\n nzFormatter?: Function;\n nzParser?: Function;\n}\n\nexport class CascaderOption {\n options: Array<any>;\n}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"./hd-detail-lines.service\";\n\n@Component({\n selector: \"hd-detail-lines\",\n templateUrl: \"./hd-detail-lines.component.html\",\n styleUrls: [\"./hd-detail-lines.component.less\"],\n})\nexport class HdDetailLinesComponent implements OnInit, OnChanges {\n @Input() lines: Array<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() allowDrop: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n // 不传递这个字段时默认为查询所有字段是否有匹配的\n @Input() searchFields: string[] = [];\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n @Output() selectEvent = new EventEmitter();\n @ContentChild(\"detailLineHead\", { static: false })\n detailLineHead: TemplateRef<any>;\n @ContentChild(\"detailLineBody\", { static: false })\n detailLineBody: TemplateRef<any>;\n // 合计区域\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n @Input() hdFrontPagination: boolean = false;\n totalOptionList = [];\n\n tableData: Page<any> = new Page();\n tableLoading: boolean = false;\n // 表格分页参数\n tablePageIndex: number = 1;\n tablePageSize: number = 10;\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n filterStr: string;\n /** 表格实际展示的数据(筛选结果或全量) */\n displayLines: Array<any> = [];\n /** 是否处于筛选状态 */\n isFilterData = false;\n storeFormLinesData: any = []; // 缓存的总的列表数据\n\n constructor() {}\n\n ngOnInit(): void {\n this.syncStoreFromLinesInput();\n this.applyDisplayFromStore();\n this.countSelected();\n this.calculateTotal();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes[\"lines\"]) {\n if (!this.isFilterData) {\n this.syncStoreFromLinesInput();\n this.displayLines = this.lines || [];\n } else if (\n !this.storeFormLinesData ||\n this.storeFormLinesData.length === 0\n ) {\n this.syncStoreFromLinesInput();\n }\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n private syncStoreFromLinesInput(source?: Array<any>): void {\n const data = source || this.lines;\n this.storeFormLinesData = data ? JSON.parse(JSON.stringify(data)) : [];\n }\n\n /** 未筛选时与父组件 lines 同源,避免模板内 ngModel 与父数据脱节 */\n private applyDisplayFromStore(): void {\n if (this.lines && this.lines.length > 0) {\n this.displayLines = this.lines;\n return;\n }\n this.displayLines = this.storeFormLinesData\n ? JSON.parse(JSON.stringify(this.storeFormLinesData))\n : [];\n }\n\n private restoreFromStore(): void {\n this.isFilterData = false;\n this.applyDisplayFromStore();\n this.tableLoading = false;\n this.countSelected();\n this.calculateTotal();\n }\n\n // 全局性的搜索(涵盖页面上所有的可视文字)\n searchLines() {\n // 清空搜索:即使当前展示为空也要能从缓存恢复(对齐 hd-form-lines)\n if (!this.filterStr || !this.filterStr.trim()) {\n if (!this.storeFormLinesData || this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n this.restoreFromStore();\n return;\n }\n if (!this.storeFormLinesData || this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n const filterValue = this.filterStr.trim().toLowerCase();\n this.isFilterData = true;\n\n const filteredData = this.storeFormLinesData.filter((data: any) => {\n if (!this.searchFields || this.searchFields.length === 0) {\n for (const item of Object.keys(data)) {\n if (\n data[item] &&\n data[item].toString().toLowerCase().includes(filterValue)\n ) {\n return true;\n }\n }\n return false;\n }\n for (const item of this.searchFields) {\n if (\n data[item] &&\n data[item].toString().toLowerCase().includes(filterValue)\n ) {\n return true;\n }\n }\n return false;\n });\n this.displayLines = JSON.parse(JSON.stringify(filteredData));\n this.tableLoading = false;\n this.countSelected();\n this.calculateTotal();\n }\n\n private countSelected(): void {\n if (\n this.showSelected &&\n this.selectedField &&\n this.displayLines &&\n this.displayLines.length\n ) {\n this.displayLines.forEach((item) => {\n if (item[this.selectedField] === true) {\n this.mapOfCheckedId[item[this.selectField]] = true;\n this.mapOfCheckList[item[this.selectField]] = item;\n }\n });\n if (\n this.displayLines.length === Object.keys(this.mapOfCheckList).length\n ) {\n this.isAllDisplayDataChecked = true;\n this.isIndeterminate = true;\n }\n }\n }\n\n get LodashRound() {\n return round;\n }\n\n drop(event: CdkDragDrop<string[]>): void {\n moveItemInArray(this.displayLines, event.previousIndex, event.currentIndex);\n this.displayLines = JSON.parse(JSON.stringify(this.displayLines));\n if (!this.isFilterData) {\n this.storeFormLinesData = JSON.parse(JSON.stringify(this.displayLines));\n }\n }\n\n calculateTotal() {\n // 这里处理合计数据\n if (this.showTotal && this.displayLines && this.displayLines.length) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"right\",\n showDecimal: item.showDecimal || false,\n isHide: item.isHide || false,\n };\n }\n });\n }\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n this.selectEvent.emit(Object.values(this.mapOfCheckList));\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n }\n}\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { HdButtonGroupModule } from \"../hd-button-group/hd-button-group.module\";\nimport { NgZorroAntdModule } from \"ng-zorro-antd\";\nimport { NzTableModule } from \"ng-zorro-antd/table\";\nimport { HdButtonModule } from \"../hd-button/hd-button.module\";\nimport { HdSpaceModule } from \"../hd-space/hd-space.module\";\nimport { HdDetailLinesComponent } from \"./hd-detail-lines.component\";\n\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n DragDropModule,\n FormsModule,\n NgZorroAntdModule,\n HdSpaceModule,\n HdButtonModule,\n HdButtonGroupModule,\n ],\n declarations: [HdDetailLinesComponent],\n exports: [HdDetailLinesComponent],\n schemas: [NO_ERRORS_SCHEMA],\n})\nexport class HdDetailLinesModule {}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\n\n@Component({\n selector: \"hd-detail-lines-page\",\n templateUrl: \"./hd-detail-lines-page.component.html\",\n styleUrls: [\"./hd-detail-lines-page.component.less\"],\n})\nexport class HdDetailLinesPageComponent implements OnInit, OnChanges {\n @Input() lines: Array<any> = [];\n /** 与 hd-table 一致,可传 Page 对象;未传 lines 时使用 tableData.content */\n @Input() tableData: Page<any> = new Page();\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() allowDrop: boolean = false;\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n @Input() isCrossPageSelect: boolean;\n @Output() selectEvent = new EventEmitter();\n @ContentChild(\"detailLineHead\", { static: false })\n detailLineHead: TemplateRef<any>;\n @ContentChild(\"detailLineBody\", { static: false })\n detailLineBody: TemplateRef<any>;\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n @Input() tableLoading: boolean = false;\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 10;\n @Output() tablePageIndexChange = new EventEmitter<number>();\n @Output() tablePageSizeChange = new EventEmitter<number>();\n @Output() pageChange = new EventEmitter<void>();\n\n totalOptionList = [];\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n isCrossPageSelectLocal: boolean = false;\n\n constructor() {}\n\n ngOnInit(): void {\n if (this.isCrossPageSelect === true) {\n this.isCrossPageSelectLocal = this.isCrossPageSelect;\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n changes &&\n changes[\"tableData\"] &&\n changes[\"tableData\"][\"currentValue\"] &&\n changes[\"tableData\"][\"previousValue\"]\n ) {\n if (\n changes[\"tableData\"][\"currentValue\"][\"pageSize\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageSize\"] ||\n changes[\"tableData\"][\"currentValue\"][\"pageNumber\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageNumber\"]\n ) {\n this.countSelected();\n this.calculateTotal();\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n get displayLines(): Array<any> {\n if (this.lines && this.lines.length) {\n return this.lines;\n }\n return (this.tableData && this.tableData.content) || [];\n }\n\n get totalCount(): number {\n if (this.tableData && this.tableData.totalElements != null) {\n return this.tableData.totalElements;\n }\n return this.displayLines.length;\n }\n\n getRowIndex(localIndex: number): number {\n return (this.tablePageIndex - 1) * this.tablePageSize + localIndex;\n }\n\n onPageIndexChange(pageIndex: number): void {\n this.tablePageIndex = pageIndex;\n this.tablePageIndexChange.emit(this.tablePageIndex);\n this.pageChange.emit();\n }\n\n onPageSizeChange(pageSize: number): void {\n this.tablePageSize = pageSize;\n this.tablePageIndex = 1;\n this.tablePageSizeChange.emit(this.tablePageSize);\n this.tablePageIndexChange.emit(this.tablePageIndex);\n this.pageChange.emit();\n }\n\n private countSelected(): void {\n if (\n this.showSelected &&\n this.selectedField &&\n this.displayLines &&\n this.displayLines.length\n ) {\n this.displayLines.forEach((item) => {\n if (item[this.selectedField] === true) {\n this.mapOfCheckedId[item[this.selectField]] = true;\n this.mapOfCheckList[item[this.selectField]] = item;\n }\n });\n if (\n this.displayLines.length === Object.keys(this.mapOfCheckList).length\n ) {\n this.isAllDisplayDataChecked = true;\n this.isIndeterminate = true;\n }\n }\n }\n\n get LodashRound() {\n return round;\n }\n\n drop(event: CdkDragDrop<string[]>): void {\n const lines = [...this.displayLines];\n moveItemInArray(lines, event.previousIndex, event.currentIndex);\n this.lines = lines;\n }\n\n calculateTotal() {\n if (this.showTotal && this.displayLines && this.displayLines.length) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"right\",\n showDecimal: item.showDecimal || false,\n isHide: item.isHide || false,\n };\n }\n });\n }\n }\n\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n if (this.selectEvent) {\n this.selectEvent.emit(Object.values(this.mapOfCheckList));\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n }\n}\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\nimport { NzTableModule } from \"ng-zorro-antd/table\";\nimport { HdDetailLinesPageComponent } from \"./hd-detail-lines-page.component\";\n\n@NgModule({\n imports: [CommonModule, NzTableModule, DragDropModule],\n declarations: [HdDetailLinesPageComponent],\n exports: [HdDetailLinesPageComponent],\n schemas: [NO_ERRORS_SCHEMA],\n})\nexport class HdDetailLinesPageModule {}\n","import { Injectable } from '@angular/core';\n\nexport const statusToColor = {\n // 黄色\n '#FAB13B': ['partshipped', 'committed', 'partValid', 'confirm', 'picking'],\n // 灰色\n '#9FA4A2': ['initial', 'uncommitted', 'OFF_LINE', 'UN_PRINTED', 'unpublish', 'pastpublish', 'TO_COMMIT', 'unpublished', '未审核', 'returned'],\n // 红色\n '#F5222D': ['delete', 'deleted', 'aborted', 'rejected', '停用', '禁用', 'unpicked', 'DELETED', 'AUDIT_REJECT', 'rejected', 'invalid', 'disabled', ''],\n // 蓝色\n '#3B77E3': ['audited', 'adjusted', 'invoiced', 'audit', 'submitted', 'TO_AUDIT', '已审核', '处理中', 'processing', 'firstReviewed', 'awaiting_effective'],\n // 绿色\n '#20B95D': ['shipped', 'received', 'checked', 'using', 'reverse', 'valid', 'approved', 'ON_LINE', 'finished', 'opened', 'PRINTED', '启用', 'picked', 'published', 'AUDITED', '已收票', '付款完成', '收款完成', '已收款', 'accepted',\n 'offered', 'confirmed', 'effective', '已发布'],\n // 橙色\n '#F05B24': ['partialReceived', 'partDelete', 'tender', 'MODIFIED_AFTER_PRINTED', '部分付款', '部分收款', 'partPublished']\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdStatusService {\n constructor() {\n }\n}\n","import { Component, Input, OnInit, SimpleChange } from \"@angular/core\";\nimport { statusToColor } from \"../hd-status/hd-status.service\";\n\n@Component({\n selector: \"hd-detail-tip\",\n templateUrl: \"./hd-detail-tip.component.html\",\n styleUrls: [\"./hd-detail-tip.component.less\"],\n})\nexport class HdDetailTipComponent implements OnInit {\n constructor() {}\n @Input() state: string;\n @Input() stateText: string;\n @Input() billNumber: string;\n @Input() tip: string = \"详情\";\n statusColor: string;\n\n ngOnInit() {\n this.setStatusColor();\n }\n\n ngOnChanges() {\n this.setStatusColor();\n }\n\n setStatusColor() {\n let findKey = '';\n for (let key in statusToColor) {\n if (\n this.state &&\n (statusToColor[key].indexOf(this.state) !== -1 ||\n statusToColor[key].indexOf(this.state.toUpperCase()) !== -1 ||\n statusToColor[key].indexOf(this.state.toLowerCase()) !== -1)\n ) {\n findKey = key;\n }\n }\n if (findKey) {\n this.statusColor = findKey;\n } else {\n this.statusColor = '#9FA4A2';\n }\n }\n}\n","import { HdDetailTipComponent } from './hd-detail-tip.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdDetailTipComponent],\n exports: [HdDetailTipComponent]\n})\nexport class HdDetailTipModule { }\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { Filter } from './hd-filter.service';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n@Component({\n selector: 'hd-filter',\n templateUrl: './hd-filter.component.html',\n styleUrls: ['./hd-filter.component.less']\n})\nexport class HdFilterComponent implements OnInit {\n\n @Input() filterList: Array<Filter>;\n @Output() searchEvent = new EventEmitter();\n @Output() resetEvent = new EventEmitter();\n\n validateFilterForm: FormGroup;\n isShowMore: boolean = true;\n // 对filterList取模运算\n filterListModular: number = 0;\n private searchSubject = new Subject<{ fn: any, event: any, selectOption?: any; }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n\n private searchSubscription: Subscription | undefined;\n constructor(private fb: FormBuilder) {\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\n }\n\n ngOnInit() {\n this.init();\n }\n\n ngOnChanges() {\n this.init();\n }\n\n private init(): void {\n this.isShowMore = true;\n // 异常捕获\n if (!this.checkList(this.filterList)) {\n throw 'filter组件数据格式不规范';\n }\n this.filterListModular = this.filterList.length % 4;\n // 首先根据定义的组件数组 去初始化表单\n let formGroupList = {};\n this.filterList.forEach((item, index) => {\n formGroupList[item.name] = this.fb.control(item.value, []);\n // 初始化控件显影\n item.show = index < 7;\n });\n this.validateFilterForm = this.fb.group(formGroupList);\n this.filterList.forEach((item) => {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n this.validateFilterForm.get(item.name).valueChanges\n .pipe(\n debounceTime(item.onChangeEventDebounceTime)\n )\n .subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n } else {\n this.validateFilterForm.get(item.name).valueChanges.subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n }\n }\n });\n }\n\n onSearchEvent(fn: any, event: any, onSearchEventDebounceTime: any, selectOption?: any) {\n if (onSearchEventDebounceTime) {\n // 更新防抖时间\n this.debounceTimeout = onSearchEventDebounceTime;\n\n // 取消之前的订阅\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n\n // 创建新的订阅\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\n\n // 发送事件\n this.searchSubject.next({ fn, event, selectOption });\n } else {\n this.triggerEvent(fn, event, selectOption);\n }\n }\n\n triggerEvent(fn: any, event: any, selectOption?: any) {\n if (fn && selectOption) {\n fn(event, selectOption);\n } else if (fn) {\n fn(event);\n } else {\n return;\n }\n }\n\n computeOffset() {\n // 特殊处理下等于4个选项的情况\n if (this.filterList.length === 4) {\n return 18;\n }\n return this.isShowMore ? ((this.filterListModular === 0 || this.filterList.length > 7) ? 0 : (3 - this.filterListModular) * 6) : (this.filterListModular === 0 ? 18 : (3 - this.filterListModular) * 6);\n }\n\n private checkList(list: Array<Filter>): boolean {\n if (!list || (list && list.length === 0)) {\n return true;\n }\n let nameList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FilterListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {\n // throw 'filter组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw 'filter组件数据格式不规范,存在重复name值!';\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n this.searchEvent.emit(this.validateFilterForm.getRawValue());\n }\n\n public resetForm(): void {\n this.resetFilterFormWithValue();\n // this.validateFilterForm.reset();\n if (this.resetEvent.observers.length > 0) {\n // 如果有父组件绑定了 resetEvent 的处理器\n this.resetEvent.emit(this.validateFilterForm.getRawValue());\n } else {\n // 如果没有绑定处理器,则触发 searchEvent\n this.searchEvent.emit(this.validateFilterForm.getRawValue());\n }\n }\n\n /**\n * 带初始值重置表单\n */\n public resetFilterFormWithValue() {\n const resetValue: { [key: string]: any } = {};\n this.filterList.forEach((item) => {\n resetValue[item.name] = item.value;\n });\n // 重置表单值(会触发valueChanges事件)\n this.validateFilterForm.patchValue(resetValue);\n }\n\n public getFilterData() {\n return this.validateFilterForm.getRawValue();\n }\n\n public showMore(): void {\n this.isShowMore = !this.isShowMore;\n this.filterList.forEach((item, index) => {\n item.show = this.isShowMore ? index < 7 : true;\n });\n }\n\n public inputClean(filter: Filter): void {\n const patchObject = {};\n patchObject[filter.name] = null;\n\n this.validateFilterForm.patchValue(patchObject);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdFilterComponent } from './hd-filter.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule\n ],\n declarations: [HdFilterComponent],\n exports: [HdFilterComponent]\n})\nexport class HdFilterModule { }\n","import { Injectable } from '@angular/core';\nimport { InputNumber, SelectOption } from '../model/common-type';\n// 控件列表\nexport class FormLine {\n type: FormLineType; // 控件类型\n label: string; // 文本\n name: string; // 字段名称\n placeholder?: string; // 输入框的提示文件\n require?: boolean = false; // 是否必填\n hide?: boolean = false; // 是否为隐藏字段,仅用于填充表单的字段,不显示在页面上\n hideViewDomValue?: boolean = false; // type为ViewDom时,是否隐藏value值, 用于特殊场景,譬如列表中图片的显示\n align?: 'left' | 'right' | 'center'; // 列对齐方式\n value?: string | boolean | number | Date | Array<string | Date> | null = null; // 值 不传默认为null\n isSelect?: boolean; // 输入框等是否允许点击之后全选内容\n selectOption?: SelectOption; // 控件为Select时,选项列表\n explainOptionRight?: ExplainOption; // 明细字段的说明(右侧)\n explainOption?: ExplainOption; // 明细字段的说明\n colorOption?: ColorOption; // 颜色字段的说明\n // 组件内部成员\n maxLength?: number; // input控件的输入长度\n preserveNumber?: number; // 需要保留小数的列的位数\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n defaultLabel?: any; // select选择器不初始化的时候可以使用defaultLabel搭配value,设置默认值\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n disabled?: boolean; // 不可输入状态\n showTime?: boolean = false; // 日期选择器是否包含时间\n style?: object;\n canSearch?: boolean = false; // 指明hide 情况下的控件是否可以被搜索,默认false\n onChangeEventDebounceTime?: number; // change事件防抖\n onSearchEventEventDebounceTime?: number; // search事件防抖\n}\n\nexport class ColorOption {\n name: string;\n color?: string;\n}\n\nexport class ExplainOption {\n show: boolean;\n name: string;\n color?: string;\n}\n\n\n// 控件类型\nexport enum FormLineType {\n Input = 'Input', // 输入框\n Select = 'Select', // 单项选择器\n Date = 'Date', // 单个日期选择\n DateRange = 'DateRange', // 日期范围选择\n TextArea = 'TextArea', // 块级输入框\n InputNumber = 'InputNumber',// 数字输入\n MultipleSelect = 'MultipleSelect', // 多选\n ViewDom = 'ViewDom', // 单纯的显示控件\n Switch = 'Switch', // 开关\n Time = 'Time' // 时间选择器\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdFormLinesService {\n constructor() { }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n SimpleChanges,\n TemplateRef,\n ViewChildren,\n} from \"@angular/core\";\nimport { FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\nimport { round } from \"lodash\";\nimport {\n InputBoolean,\n NzDatePickerComponent,\n NzInputNumberComponent,\n NzRangePickerComponent,\n NzSelectComponent,\n NzTimePickerComponent,\n} from \"ng-zorro-antd\";\nimport { Subject, Subscription } from \"rxjs\";\nimport { debounceTime } from \"rxjs/operators\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\nimport { SelectOptionTableColumn } from \"../model/common-type\";\nimport { FormLine, FormLineType } from \"./hd-form-lines.service\";\n\n/** 与 ant-select 选项项水平内边距一致,用于表头与选项行对齐 */\nconst SELECT_TABLE_OPTION_HORIZONTAL_PADDING = 12;\n\n@Component({\n selector: \"hd-form-lines\",\n templateUrl: \"./hd-form-lines.component.html\",\n styleUrls: [\"./hd-form-lines.component.less\"],\n})\nexport class HdFormLinesComponent implements OnInit, AfterViewInit, OnDestroy {\n @ViewChildren(\"formInputDom\") formInputDomList!: QueryList<ElementRef>;\n\n @Input() @InputBoolean() showLineNumber: boolean = true;\n @Input() @InputBoolean() allowEmpty: boolean = true;\n @Output() deleteLastLineEvent = new EventEmitter();\n @Input() @InputBoolean() showKeyboardOperateTip: boolean = false;\n @Input() @InputBoolean() tableLoading: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n @Input() formLines: Array<FormLine>;\n // 针对formLines里面所有的name,\n @Input() formLinesData: any;\n @Input() operateButtons: Array<string> = [\"add\", \"delete\"];\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Output() changeEvent = new EventEmitter();\n @Input() @InputBoolean() showDeleteConfirm: boolean = false;\n paginationPageIndex: number = 1;\n paginationPageSize: number = 10;\n validateHdFormLines: FormGroup;\n newLine: any;\n inputValue: string;\n\n // 合计区域\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n totalOptionList = [];\n\n showForm: boolean = false;\n filterStr: string;\n storeFormLinesData: any = []; // 缓存的总的表单数据\n filterStoreFormLinesData: any = []; // 筛选出来的数据列表\n filterIndexStore: Array<number> = []; // 筛选出来的数据在原始列表中的下标\n isFilterData: boolean = false; // 是否是已经筛选过的数据\n formValid: boolean = false; // 表单当前的状态\n private searchSubject = new Subject<{ fn: any; event: any; line: any }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n\n private searchSubscription: Subscription | undefined;\n private formInputDomListSub: Subscription | undefined;\n\n // 当前页的dom二维数组\n collectDomList: Array<\n Array<\n | ElementRef\n | NzSelectComponent\n | NzInputNumberComponent\n | NzDatePickerComponent\n | NzRangePickerComponent\n | NzTimePickerComponent\n >\n > = [];\n // 当前聚焦的dom元素坐标\n activeDomX: number = null;\n activeDomY: number = null;\n activeDom:\n | ElementRef\n | NzSelectComponent\n | NzInputNumberComponent\n | NzDatePickerComponent\n | NzRangePickerComponent\n | NzTimePickerComponent = null;\n activeSelectedComponentOpen: boolean = false;\n @ContentChild(\"ViewDomRightTemplate\", { static: false })\n ViewDomRightTemplate: TemplateRef<any>;\n\n constructor(\n private fb: FormBuilder,\n private cdr: ChangeDetectorRef,\n ) {\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event, line }) => this.triggerEvent(fn, event, line));\n }\n\n ngOnInit() {\n // 缓存一下总的表单数据\n this.storeFormLinesData = this.formLinesData;\n this.init();\n }\n\n ngAfterViewInit() {\n this.collectDomData();\n this.formInputDomListSub = this.formInputDomList.changes.subscribe(() => {\n this.collectDomData();\n });\n }\n\n ngOnDestroy() {\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n if (this.formInputDomListSub) {\n this.formInputDomListSub.unsubscribe();\n }\n }\n\n get formLinesLength() {\n return this.linesFormArray.controls.length;\n }\n\n setActiveSelectedComponentOpen(value: boolean) {\n this.activeSelectedComponentOpen = value;\n if (value === true) {\n setTimeout(() => {\n const domList = document.querySelectorAll(\n \".ant-select-dropdown.hd-select-table\",\n );\n if (domList.length > 0) {\n const dom = domList[0];\n dom\n .querySelectorAll(\".hd-option-header\")\n .forEach((header) => header.remove());\n const oldIndex = this.getOldDomIndex(this.activeDomY, this.formLines);\n dom.insertBefore(\n this.createDOMStructure(\n this.formLines[oldIndex],\n this.linesFormArray.controls.slice(\n (this.paginationPageIndex - 1) * this.paginationPageSize,\n (this.paginationPageIndex - 1) * this.paginationPageSize +\n this.paginationPageSize,\n )[this.activeDomX],\n ),\n dom.firstChild,\n );\n }\n }, 0);\n }\n }\n\n getSelectTableColumnStyle(column: SelectOptionTableColumn): {\n [key: string]: string;\n } {\n if (!column || !column.width) {\n return { width: \"unset\" };\n }\n return { width: `${column.width}px` };\n }\n\n createDOMStructure(formItem, line) {\n // 创建外部 div\n const hdOptionHeader = document.createElement(\"div\");\n hdOptionHeader.className = \"hd-option-header\";\n hdOptionHeader.style.paddingLeft = `${SELECT_TABLE_OPTION_HORIZONTAL_PADDING}px`;\n hdOptionHeader.style.paddingRight = `${SELECT_TABLE_OPTION_HORIZONTAL_PADDING}px`;\n\n // 检查条件,确定是否要创建子元素\n // const selectListLength = (formItem && formItem.selectOption && formItem.selectOption.selectList && formItem.selectOption.selectList.length) || 0;\n // if\n // const lineValueLength = (line.get(formItem.selectOption.selectListName) && line.get(formItem.selectOption.selectListName).value && line.get(formItem.selectOption.selectListName).value.length) || 0;\n\n // if (selectListLength > 0 || lineValueLength > 0) {\n // 遍历 tableColumns 创建内部列 div\n formItem.selectOption.tableColumns.forEach((selectOptionTableColumn) => {\n const columnDiv = document.createElement(\"div\");\n columnDiv.className = \"hd-option-header-column\";\n\n const widthStyle = this.getSelectTableColumnStyle(\n selectOptionTableColumn,\n );\n columnDiv.style.width = widthStyle.width;\n\n // 添加列标签内容\n if (selectOptionTableColumn.label) {\n const labelText = document.createTextNode(\n selectOptionTableColumn.label,\n );\n columnDiv.appendChild(labelText);\n }\n\n // 添加列 div 到外部 div\n hdOptionHeader.appendChild(columnDiv);\n });\n // }\n\n return hdOptionHeader;\n }\n\n collectDomData() {\n this.collectDomList = [];\n const pageDomList = this.formInputDomList.toArray();\n // Step 1: 获取当前页的数据量\n const startIndex = (this.paginationPageIndex - 1) * this.paginationPageSize;\n const endIndex = this.paginationPageIndex * this.paginationPageSize;\n const adjustedEndIndex =\n endIndex > this.formLinesLength ? this.formLinesLength : endIndex;\n const pageLinesLength = adjustedEndIndex - startIndex;\n\n const interval = pageDomList.length / pageLinesLength;\n // Step 2: 拆分formInputDomList\n for (let i = 0; i < pageLinesLength; i++) {\n this.collectDomList.push(pageDomList.splice(0, interval));\n }\n this.disableInputNumberKeyboardStep();\n }\n\n /**\n * ng-zorro 8 在 input 的 onKeyDown 里用上下键调 up()/down() 改 step。\n * 只覆盖 onKeyDown(不动 up/down),键盘方向键交给表单跳转,+/- 按钮仍可用。\n */\n private disableInputNumberKeyboardStep(): void {\n for (let i = 0; i < this.collectDomList.length; i++) {\n for (let j = 0; j < this.collectDomList[i].length; j++) {\n const dom = this.collectDomList[i][j];\n if (dom instanceof NzInputNumberComponent) {\n dom.onKeyDown = (e: KeyboardEvent) => {\n if (e.keyCode === 38 || e.keyCode === 40) {\n return;\n }\n if (e.keyCode === 13) {\n dom.setValidateValue();\n }\n };\n }\n }\n }\n }\n\n // 聚焦下一个dom\n jumpToNextInput(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n // 如果是最后一个可输入元素,新增行\n if (\n !(this.activeDom instanceof NzSelectComponent) &&\n x === this.collectDomList.length - 1 &&\n y === this.collectDomList[0].length - 1\n ) {\n this.addNewLineAndFocus();\n } else {\n if (y === this.collectDomList[0].length - 1) {\n console.log(\"执行过程1\");\n // 如果是最后一列,则跳转到下一行第一个输入框\n this.focusDom(x + 1, 0, \"right\");\n } else {\n console.log(\"执行过程2\");\n // 如果不是最后一列,则跳转到当前行下一个输入框\n this.focusDom(x, y + 1, \"right\");\n }\n }\n }\n\n /**\n * 增加新行并且聚焦到第一个元素,\n * 这里要注意,如果存在翻页情况,需要处理\n */\n addNewLineAndFocus() {\n // 当前行为当前页最后一行的时候,判断下一页是否有数据\n // 1、如果有:翻页+聚焦第一行第一个元素\n // 2、如果没有:新增行+翻页+聚焦第一行第一个元素\n if (this.activeDomX === this.paginationPageSize - 1) {\n // 判断下一页是否有数据\n if (\n this.paginationPageIndex <\n Math.ceil(this.formLinesLength / this.paginationPageSize)\n ) {\n // 翻页+聚焦第一行第一个元素\n this.paginationPageIndex++;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程3\");\n this.focusDom(0, 0, \"right\");\n }, 0);\n } else {\n // 新增行+翻页+聚焦第一行第一个元素\n this.addFormLine();\n this.paginationPageIndex++;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程4\");\n this.focusDom(0, 0);\n }, 0);\n }\n } else {\n this.addFormLine();\n }\n }\n\n // 聚焦到上一个dom\n jumpToPrevInput(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n if (x === 0 && y === 0) {\n // 如果是第一个可输入元素, 判断是否有上一页, 如果有,则翻页+聚焦到上一页最后一个元素\n if (this.paginationPageIndex > 1) {\n // 翻页+聚焦到上一页最后一个元素\n this.paginationPageIndex--;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程5\");\n this.focusDom(\n this.collectDomList.length - 1,\n this.collectDomList[0].length - 1,\n );\n }, 0);\n }\n return;\n } else {\n if (y === 0) {\n console.log(\"执行过程6\");\n // 如果是第一列,则跳转到上一行最后一个输入框\n this.focusDom(x - 1, this.collectDomList[0].length - 1, \"left\");\n } else {\n console.log(\"执行过程7\");\n // 如果不是第一列,则跳转到当前行上一个输入框\n this.focusDom(x, y - 1, \"left\");\n }\n }\n }\n\n /**\n * 聚焦到某个dom\n * @param x 坐标x\n * @param y 坐标y\n * @param jumpDirection 跳转方向\n */\n focusDom(x: number, y: number, jumpDirection: string = \"right\") {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n // 先清除一下当前的焦点\n this.cleanFocusDom(this.activeDomX, this.activeDomY);\n if (this.collectDomList[x] && this.collectDomList[x][y]) {\n const dom = this.collectDomList[x][y];\n // 需要判断下一个focus的dom是否是禁用状态,如果是禁用状态需要跳过\n if (dom instanceof NzSelectComponent) {\n if (dom.nzDisabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n dom.nzSelectTopControlComponent.inputElement.nativeElement.scrollIntoView(\n { behavior: \"smooth\", block: \"center\", inline: \"center\" },\n );\n // 这里多选框需要额外处理下,因为向下的时候会触发内部Input的聚焦,把下一个dom的focus放到宏任务中,延迟处理。\n if (dom.nzSelectService.mode === \"multiple\") {\n setTimeout(() => {\n dom.focus();\n }, 0);\n } else {\n dom.focus();\n }\n } else if (dom instanceof NzInputNumberComponent) {\n if (dom.nzDisabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n const inputDom: any = document.getElementById(dom.nzId);\n inputDom.focus();\n inputDom.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\",\n });\n setTimeout(() => {\n inputDom.select();\n }, 0);\n } else if (dom instanceof ElementRef) {\n if (dom.nativeElement.disabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n dom.nativeElement.focus();\n dom.nativeElement.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\",\n });\n setTimeout(() => {\n dom.nativeElement.select();\n }, 0);\n } else if (\n dom instanceof NzDatePickerComponent ||\n dom instanceof NzRangePickerComponent ||\n dom instanceof NzTimePickerComponent\n ) {\n // TODO:在ngzorro8.5.x版本,时间相关的选择器没有暴露出open方法,暂时先不处理。(10.x及以上版本提供了open方法)\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n this.setActiveDom(x, y);\n } else {\n // 没有dom的场景下,需要判断是左还是右,\n }\n }\n\n cleanFocusDom(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n if (this.collectDomList[x] && this.collectDomList[x][y]) {\n const dom = this.collectDomList[x][y];\n if (dom instanceof NzSelectComponent) {\n dom.blur();\n dom.nzOpen = false;\n } else if (dom instanceof NzInputNumberComponent) {\n dom.blur();\n } else if (dom instanceof ElementRef) {\n dom.nativeElement.blur();\n } else {\n }\n }\n }\n\n setActiveDom(x: number, y: number) {\n this.activeDomX = x;\n this.activeDomY = y;\n this.activeDom = this.collectDomList[this.activeDomX][this.activeDomY];\n if (this.activeDom instanceof NzSelectComponent) {\n this.setActiveSelectedComponentOpen(this.activeDom.open);\n }\n }\n\n /**\n * 根据行号和列号名称获取当前聚焦的dom位置\n * @param rowNumber 行号\n * @param colNumber 列号\n */\n setActiveDomInFormLines(rowNumber: number, colNumber: number) {\n this.activeDomX = rowNumber;\n this.activeDomY = this.getDomIndex(colNumber, this.formLines);\n this.setActiveDom(this.activeDomX, this.activeDomY);\n }\n\n /**\n * 键盘点击事件\n * @param event 键盘事件\n * @returns\n */\n onKeyDown(event: KeyboardEvent) {\n if (this.activeDomX === null || this.activeDomY === null) {\n return;\n }\n switch (event.key) {\n case \"ArrowUp\":\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen\n ) {\n return;\n }\n if (this.activeDomX !== 0) {\n this.focusDom(this.activeDomX - 1, this.activeDomY);\n }\n break;\n case \"ArrowDown\":\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen\n ) {\n return;\n }\n // 判断是否在最后一行,加行\n if (this.activeDomX === this.collectDomList.length - 1) {\n this.cleanFocusDom(this.activeDomX, this.activeDomY);\n this.addNewLineAndFocus();\n break;\n } else {\n this.focusDom(this.activeDomX + 1, this.activeDomY);\n }\n break;\n case \"ArrowLeft\":\n this.jumpToPrevInput(this.activeDomX, this.activeDomY);\n break;\n case \"ArrowRight\":\n this.jumpToNextInput(this.activeDomX, this.activeDomY);\n break;\n case \"Enter\":\n if (this.activeDom instanceof NzSelectComponent) {\n this.setActiveSelectedComponentOpen(this.activeDom.open);\n if (this.activeSelectedComponentOpen === false) {\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n } else if (this.activeDomX === this.collectDomList.length - 1) {\n this.addNewLineAndFocus();\n }\n break;\n case \"Escape\":\n if (this.activeDom instanceof NzSelectComponent) {\n const nowActiveDom = this.activeDom as NzSelectComponent;\n setTimeout(() => {\n this.setActiveSelectedComponentOpen(nowActiveDom.open);\n if (this.activeSelectedComponentOpen === false) {\n if (nowActiveDom.nzSelectService.mode === \"multiple\") {\n setTimeout(() => {\n this.focusDom(this.activeDomX, this.activeDomY);\n }, 0);\n } else {\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n }\n }, 0);\n }\n break;\n default:\n // 如果当前聚焦的是选择框,且键入0-9a-zA-Z,则弹出\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen === false &&\n /^[0-9a-zA-Z]$/.test(event.key)\n ) {\n const dom = this.activeDom;\n dom.nzOpen = true;\n this.setActiveSelectedComponentOpen(true);\n // // TODO:这里暂时注释,不能直接带入键入值,这样会导致输入中文的时候带入英文字符,不符合预期\n // dom.nzSelectTopControlComponent.inputValue = event.key;\n // // 获取 input 元素\n // const inputElement = dom.nzSelectTopControlComponent.inputElement.nativeElement;\n // setTimeout(() => {\n // // 触发输入事件,以确保 Angular 检测到值的变化\n // const eventInput = new Event('input', { bubbles: true });\n // inputElement.dispatchEvent(eventInput);\n // }, 0);\n }\n break;\n }\n }\n\n /**\n * 根据在初始dom下标和数据集 获取在collectDomList中的下标\n * @param index 初始下标\n * @param list 老数据集\n * @returns\n */\n private getDomIndex(index: number, list: Array<FormLine>): number {\n const typeList = [\n \"Input\",\n \"Select\",\n \"Date\",\n \"DateRange\",\n \"TextArea\",\n \"InputNumber\",\n \"MultipleSelect\",\n ];\n let filterList = [];\n for (let i = 0; i < list.length; i++) {\n if (i === index) {\n return filterList.length;\n }\n // 与模板一致:hide 的列不渲染 #formInputDom,不计入 collectDomList 的列下标\n if (typeList.includes(list[i].type) && !list[i].hide) {\n filterList.push(list[i]);\n }\n }\n return null;\n }\n\n /**\n * 根据在collectDomList中的下标和数据集 获取初始dom下标\n * @param index 新下标\n * @param list 老数据集\n * @returns\n */\n private getOldDomIndex(index: number, list: Array<FormLine>): number {\n console.log(\"index\", index);\n console.log(\"list\", list);\n const typeList = [\n \"Input\",\n \"Select\",\n \"Date\",\n \"DateRange\",\n \"TextArea\",\n \"InputNumber\",\n \"MultipleSelect\",\n ];\n let filterList = [];\n for (let i = 0; i < list.length; i++) {\n if (typeList.includes(list[i].type) && !list[i].hide) {\n filterList.push(list[i]);\n if (filterList.length === index + 1) {\n return i;\n }\n }\n }\n return null;\n }\n\n get linesFormArray(): any {\n return this.validateHdFormLines.get(\"lines\") as FormArray;\n }\n\n get LodashRound() {\n return round;\n }\n\n // 暴露的方法,用于获取所有数据的valid状态\n public getValid() {\n return this.formValid;\n }\n\n onSearchEvent(\n fn: any,\n event: any,\n line: any,\n onSearchEventDebounceTime: any,\n ) {\n if (onSearchEventDebounceTime) {\n // 更新防抖时间\n this.debounceTimeout = onSearchEventDebounceTime;\n\n // 取消之前的订阅\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n\n // 创建新的订阅\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event, line }) => this.triggerEvent(fn, event, line));\n\n // 发送事件\n this.searchSubject.next({ fn, event, line });\n } else {\n this.triggerEvent(fn, event, line);\n }\n setTimeout(() => {\n this.setActiveSelectedComponentOpen(true);\n }, 0);\n }\n\n /**\n *\n * @param fn 父组件函数\n * @param event 事件值\n * @param line 触发的行\n */\n triggerEvent(fn: any, event: any, line: any) {\n if (fn) {\n fn(event, line);\n }\n }\n\n innerGetValid() {\n let tmpValidateHdFormLines = this.fb.group({\n lines: this.fb.array([]),\n });\n this.storeFormLinesData.forEach((formLinesDataItem) => {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = this.fb.control(\n {\n value: this.judgeValueIsNotEmpty(formLinesDataItem[item.name])\n ? formLinesDataItem[item.name]\n : item.value || null,\n disabled: item.disabled,\n },\n item.require ? [Validators.required] : [],\n );\n if (item.selectOption && item.selectOption.label) {\n formGroupObj[item.selectOption.label] = this.fb.control(\n formLinesDataItem[item.selectOption.label] || null,\n [],\n );\n }\n });\n formGroupObj.lineIndex = this.fb.control(\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).controls.length,\n [],\n );\n let formGroupTmp = this.fb.group(formGroupObj);\n this.formLines.forEach((item) => {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n formGroupTmp\n .get(item.name)\n .valueChanges.pipe(debounceTime(item.onChangeEventDebounceTime))\n .subscribe((value) => {\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n } else {\n formGroupTmp.get(item.name).valueChanges.subscribe((value) => {\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n }\n }\n });\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).insert(\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).controls.length,\n formGroupTmp,\n );\n });\n return tmpValidateHdFormLines.valid;\n }\n\n // 暴露的方法,用于获取所有数据\n public getLines() {\n let allLines = [];\n this.storeFormLinesData.forEach((formLinesDataItem) => {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = formLinesDataItem[item.name];\n });\n formGroupObj.lineIndex = formLinesDataItem.lineIndex;\n allLines.push(formGroupObj);\n });\n return allLines;\n }\n\n // 全局性的搜索(涵盖页面上所有的可视文字)\n searchLines() {\n if (this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n // 如果没有输入搜索字符串,则显示缓存内的所有数据\n if (!this.filterStr) {\n this.isFilterData = false;\n this.setStoreData();\n return;\n }\n const filterValue = this.filterStr.trim().toLowerCase();\n this.isFilterData = true;\n this.filterIndexStore = [];\n\n // 根据搜索字符串过滤数据\n const filteredData = this.storeFormLinesData.filter(\n (data: any, index: number) => {\n for (const item of this.formLines) {\n if (\n (item.hide && item.canSearch) ||\n (!item.hide && item.name !== \"uuid\")\n ) {\n console.log(\"item\", item.name);\n const value = data[item.name]\n ? data[item.name].toString().toLowerCase()\n : \"\";\n if (value.includes(filterValue)) {\n this.filterIndexStore.push(index);\n return true;\n }\n }\n }\n return false;\n },\n );\n // 缓存一下筛选后的表单数据\n this.filterStoreFormLinesData = filteredData;\n // 处理筛选好的数据 然后重新渲染\n this.formLinesData = filteredData;\n this.init(true);\n }\n\n setStoreData() {\n this.formLinesData = this.storeFormLinesData;\n this.init(true);\n }\n\n getStyle(line: FormGroup, formItem: any, width: string) {\n let styleObj = {\n \"min-width\": width,\n };\n if (formItem.style) {\n styleObj = { ...styleObj, ...formItem.style };\n }\n if (\n formItem.colorOption &&\n formItem.colorOption.name &&\n line.get(formItem.colorOption.name).value\n ) {\n styleObj = {\n ...styleObj,\n ...{ color: line.get(formItem.colorOption.name).value },\n };\n }\n return styleObj;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n changes[\"formLinesData\"] &&\n JSON.stringify(changes[\"formLinesData\"].currentValue) !==\n JSON.stringify(changes[\"formLinesData\"].previousValue)\n ) {\n if (this.storeFormLinesData && this.storeFormLinesData.length === 0) {\n this.storeFormLinesData = this.formLinesData;\n }\n this.init();\n }\n if (\n changes[\"totalOption\"] &&\n JSON.stringify(changes[\"totalOption\"].currentValue) !==\n JSON.stringify(changes[\"totalOption\"].previousValue)\n ) {\n this.calculateTotal();\n }\n }\n\n calculateTotal() {\n // 这里处理合计数据\n if (this.showTotal) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"left\",\n showDecimal: item.showDecimal || false,\n };\n }\n });\n }\n }\n\n private init(isEdit: boolean = false): void {\n this.paginationPageIndex = 1;\n // 异常捕获\n if (!this.checkList(this.formLines)) {\n this.tableLoading = false;\n return;\n }\n this.createForm();\n // 如果没有formLinesData,则认为是新增\n if (\n !isEdit &&\n (!this.formLinesData ||\n (this.formLinesData && this.formLinesData.length === 0))\n ) {\n this.tableLoading = false;\n this.addFormLine(0, false);\n this.showForm = true;\n } else {\n // 编辑逻辑\n this.addFormLineWithData();\n }\n this.validateHdFormLines.valueChanges.subscribe((data) =>\n this.onHdFormValueChanged(data),\n );\n this.onHdFormValueChanged();\n }\n\n /**\n * 创建表单\n */\n private createForm() {\n this.validateHdFormLines = this.fb.group({\n lines: this.fb.array([]),\n });\n this.newLine = this.newLineItem();\n }\n\n delayJumpToNextInput() {\n setTimeout(() => {\n this.jumpToNextInput(this.activeDomX, this.activeDomY);\n }, 0);\n }\n\n /**\n * 定义空的newLineItem 结构\n */\n private newLineItem(): FormGroup {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = this.fb.control(\n {\n value: item.value,\n disabled: item.disabled,\n } || null,\n item.require && !item.hide ? [Validators.required] : [],\n );\n });\n formGroupObj.lineIndex = this.fb.control(\n this.linesFormArray.controls.length,\n [],\n );\n // 用来标识是否是搜索状态下新增的行\n formGroupObj.isHdFormLineSearchAdd = this.fb.control(this.isFilterData, []);\n let formGroupSubmit = this.fb.group(formGroupObj);\n this.formLines.forEach((item, innerIndex) => {\n if (item.onChangeEvent) {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n formGroupSubmit\n .get(item.name)\n .valueChanges.pipe(debounceTime(item.onChangeEventDebounceTime))\n .subscribe((value) => {\n if (item.type === FormLineType.Select && value !== null) {\n this.delayJumpToNextInput();\n }\n this.triggerEvent(item.onChangeEvent, value, formGroupSubmit);\n });\n } else {\n formGroupSubmit.get(item.name).valueChanges.subscribe((value) => {\n if (item.type === FormLineType.Select && value !== null) {\n this.delayJumpToNextInput();\n }\n this.triggerEvent(item.onChangeEvent, value, formGroupSubmit);\n });\n }\n }\n }\n });\n return formGroupSubmit;\n }\n\n private calculateLineNumber() {\n this.linesFormArray.controls.forEach((item, index) => {\n item.get(\"lineIndex\").setValue(index + 1, { emitEvent: false });\n });\n }\n\n /**\n * 编辑的时候数据处理\n */\n addFormLineWithData() {\n this.formLinesData.forEach((formLinesDataItem, index) => {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = this.fb.control(\n {\n value: this.judgeValueIsNotEmpty(formLinesDataItem[item.name])\n ? formLinesDataItem[item.name]\n : item.value || null,\n disabled: item.disabled,\n },\n item.require ? [Validators.required] : [],\n );\n if (item.selectOption && item.selectOption.label) {\n formGroupObj[item.selectOption.label] = this.fb.control(\n formLinesDataItem[item.selectOption.label] || null,\n [],\n );\n }\n });\n formGroupObj.lineIndex = this.fb.control(\n this.linesFormArray.controls.length + 1,\n [],\n );\n let formGroupTmp = this.fb.group(formGroupObj);\n this.formLines.forEach((item, innerIndex) => {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n formGroupTmp\n .get(item.name)\n .valueChanges.pipe(debounceTime(item.onChangeEventDebounceTime))\n .subscribe((value) => {\n if (item.type === FormLineType.Select && value !== null) {\n this.delayJumpToNextInput();\n }\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n } else {\n formGroupTmp.get(item.name).valueChanges.subscribe((value) => {\n if (item.type === FormLineType.Select && value !== null) {\n this.delayJumpToNextInput();\n }\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n }\n }\n });\n this.linesFormArray.insert(\n this.linesFormArray.controls.length,\n formGroupTmp,\n );\n });\n this.tableLoading = false;\n this.showForm = true;\n }\n\n addFormLine(index?: any, isFocus: boolean = true) {\n this.linesFormArray.insert(\n index || this.linesFormArray.controls.length,\n this.newLineItem(),\n );\n this.calculateLineNumber();\n setTimeout(() => {\n this.collectDomData();\n if (isFocus) {\n if (index !== null && index !== undefined) {\n this.activeDomX = index;\n } else {\n this.activeDomX = this.collectDomList.length - 1;\n }\n this.activeDomY = 0;\n console.log(\"执行过程13\");\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n }, 0);\n }\n\n @Output() deleteLineEvent = new EventEmitter();\n\n deleteFormLine(index: any) {\n console.log(\"index\", index);\n // 最后一条数据的时候要判断一下\n if (this.linesFormArray.controls.length === 1 && !this.allowEmpty) {\n if (this.deleteLastLineEvent) {\n this.deleteLastLineEvent.emit();\n }\n return;\n }\n this.linesFormArray.removeAt(index - 1);\n if (\n !this.isFilterData &&\n this.linesFormArray.controls &&\n this.linesFormArray.controls.length === 0\n ) {\n this.addFormLine();\n } else {\n // 删除尾页的最后一个元素动作\n if (\n this.paginationPageIndex * this.paginationPageSize ===\n this.linesFormArray.controls.length + this.paginationPageSize\n ) {\n this.paginationPageIndex--;\n }\n this.calculateLineNumber();\n }\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n public pageIndexChange(event: number): void {\n this.paginationPageIndex = event;\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n public pageSizeChange(event: number): void {\n this.paginationPageSize = event;\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n private onHdFormValueChanged(data?: any) {\n if (this.isFilterData) {\n if (data && data.lines && this.filterIndexStore.length !== 0) {\n const lines = data.lines;\n if (lines.length === this.filterIndexStore.length) {\n this.filterIndexStore.forEach((item, index) => {\n this.storeFormLinesData[item] = {\n ...this.filterStoreFormLinesData[index],\n ...lines[index],\n };\n });\n } else if (lines.length > this.filterIndexStore.length) {\n // 有新增数据的情况\n // step 1: 先找新增的index下标\n const getNowLines = this.validateHdFormLines.getRawValue().lines;\n let addIndex = -1;\n for (let i = 0; i < getNowLines.length; i++) {\n if (getNowLines[i].isHdFormLineSearchAdd) {\n addIndex = i;\n break;\n }\n }\n if (addIndex !== -1) {\n this.storeFormLinesData.splice(\n this.filterIndexStore[addIndex - 1] + 1,\n 0,\n getNowLines[addIndex],\n );\n }\n this.filterIndexStore.push(this.filterIndexStore[addIndex - 1] + 1);\n } else {\n // 有删除数据的情况\n // step 1:先找到删除的index下标\n let deletedIndex = -1;\n let count = 0;\n if (lines.length === 0) {\n deletedIndex = 0;\n } else {\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].lineIndex - count > 1) {\n deletedIndex = i;\n break;\n }\n count++;\n }\n }\n if (deletedIndex !== -1) {\n // step 2: 删除总数据中的对应数据, 把下标数组和lines长度对齐,同时把下标数组在deletedIndex后面的值全都-1\n this.storeFormLinesData = this.storeFormLinesData.filter(\n (item, index) => {\n return index !== this.filterIndexStore[deletedIndex];\n },\n );\n this.filterIndexStore.splice(deletedIndex, 1);\n for (let i = 0; i < this.filterIndexStore.length; i++) {\n if (i >= deletedIndex) {\n this.filterIndexStore[i]--;\n }\n }\n } else {\n // step 2: 没有找到deletedIndex说明删除操作在最后一行\n const filterIndex =\n this.filterIndexStore[this.filterIndexStore.length - 1];\n this.storeFormLinesData = this.storeFormLinesData.filter(\n (item, index) => {\n return index !== filterIndex;\n },\n );\n this.filterIndexStore.pop();\n }\n }\n } else {\n if (data && data.lines) {\n this.storeFormLinesData = data.lines;\n }\n }\n } else {\n if (data && data.lines) {\n this.storeFormLinesData = data.lines;\n }\n }\n\n // 总表单\n if (!this.isFilterData) {\n this.formValid = this.validateHdFormLines.valid;\n } else {\n if (this.formValid) {\n // 如果整体表单是true,不管子表单是什么,都变成子表单的状态\n this.formValid = this.validateHdFormLines.valid;\n } else {\n // 如果整体表单是false:1、子表单为true,需要重算;2、子表单为false,用子表单状态\n if (this.validateHdFormLines.valid) {\n this.formValid = this.innerGetValid();\n } else {\n this.formValid = this.validateHdFormLines.valid;\n }\n }\n }\n // this.calculateLineNumber();\n this.changeEvent.emit(this.validateHdFormLines);\n }\n\n private checkList(list: Array<FormLine>): boolean {\n if (!list || (list && list.length === 0)) {\n return false;\n }\n let nameList = [];\n let selectOptionCheckList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FormLineType.Select && (!item.selectList || (item.selectList && item.selectList.length === 0))) {\n // throw 'formLines组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n\n // 校验有onSearch的字段的selectOption的value、label是否在formLine里面都定义了\n if (item.onSearchEvent && item.selectOption) {\n selectOptionCheckList = [];\n list.forEach((innerItem) => {\n if (\n innerItem.name === item.selectOption.value ||\n innerItem.name === item.selectOption.label\n ) {\n selectOptionCheckList.push(innerItem.name);\n }\n });\n if (selectOptionCheckList.length < 2) {\n throw `formLines组件数据格式不规范,字段${item.name}的selectOption的value、label字段未能在formLines中找到对应字段!`;\n }\n }\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw \"formLines组件数据格式不规范,存在重复name值!\";\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n this.changeEvent.emit(this.validateHdFormLines.getRawValue());\n }\n\n public resetForm(): void {\n // 删除\n for (let i = this.linesFormArray.controls.length; i >= 0; i--) {\n this.deleteFormLine(i);\n }\n this.paginationPageIndex = 1;\n }\n\n public inputClean(formItem: any, line: any): void {\n line.get(formItem.name).setValue(null);\n }\n\n public selectValue(id: string, rowNumber: number, colNumber: number): void {\n const inputDom: any = document.querySelector(id);\n inputDom.select();\n this.setActiveDomInFormLines(rowNumber, colNumber);\n }\n\n private textWidthCache: { [key: string]: number } = {};\n\n isTextOverflow(text: string, maxWidth: number): boolean {\n const cachedWidth = this.textWidthCache[text];\n if (cachedWidth !== undefined) {\n return cachedWidth + 15 >= maxWidth;\n }\n\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = text;\n document.body.appendChild(span);\n const isOverflow = span.offsetWidth + 15 >= maxWidth;\n this.textWidthCache[text] = span.offsetWidth;\n span.style.display = \"none\";\n document.body.removeChild(span);\n return isOverflow;\n }\n\n judgeColEmpty(str: any) {\n if (str || str === 0) {\n return str;\n } else {\n return \"<空>\";\n }\n }\n\n judgeValueIsNotEmpty(str: any) {\n if (str === null && str === undefined) {\n return false;\n } else {\n return true;\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonGroupModule } from '../hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\nimport { HdFormLinesComponent } from './hd-form-lines.component';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule,\n HdSpaceModule,\n HdButtonGroupModule\n ],\n declarations: [HdFormLinesComponent],\n exports: [HdFormLinesComponent]\n})\nexport class HdFormLinesModule { }\n","import { Component, EventEmitter, Input, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { FormItem } from './hd-form.service';\n// import * as moment from 'moment';\n@Component({\n selector: 'hd-form',\n templateUrl: './hd-form.component.html',\n styleUrls: ['./hd-form.component.less']\n})\nexport class HdFormComponent implements OnInit {\n\n @Input() formList: Array<FormItem>;\n @Output() changeEvent = new EventEmitter();\n validateHdForm: FormGroup;\n inputValue: string;\n\n private searchSubject = new Subject<{ fn: any, event: any; }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n\n private searchSubscription: Subscription | undefined;\n constructor(private fb: FormBuilder) {\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event }) => this.triggerEvent(fn, event));\n }\n\n ngOnInit() {\n if (!this.formList || this.formList.length === 0) {\n return;\n }\n\n this.init();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['formList'] && JSON.stringify(changes['formList'].currentValue) !== JSON.stringify(changes['formList'].previousValue)) {\n if (!this.formList || this.formList.length === 0) {\n return;\n }\n this.init();\n }\n }\n\n onSearchEvent(fn: any, event: any, onSearchEventDebounceTime: any) {\n if (onSearchEventDebounceTime) {\n // 更新防抖时间\n this.debounceTimeout = onSearchEventDebounceTime;\n\n // 取消之前的订阅\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n\n // 创建新的订阅\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event }) => this.triggerEvent(fn, event));\n\n // 发送事件\n this.searchSubject.next({ fn, event });\n } else {\n this.triggerEvent(fn, event);\n }\n }\n\n triggerEvent(fn: any, event: any) {\n if (fn) {\n fn(event);\n }\n }\n\n private init(): void {\n // 异常捕获\n if (!this.checkList(this.formList)) {\n throw 'form组件数据格式不规范';\n }\n // 对表单数据做初始化,用row隔离每行数据item\n this.dealRow();\n // 首先根据定义的组件数组 去初始化表单\n let formGroupList = {};\n this.formList.forEach((item, index) => {\n // 日期相关的控件做特殊处理\n if (item.type === 2 && item.value) {\n const [year, month, day] = item.value.toString().split('-').map(str => parseInt(str));\n const newDateStr = new Date(year, month - 1, day)\n .toLocaleDateString('zh-Hans-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })\n .replace(/\\//g, '-');\n if (item.validator) {\n formGroupList[item.name] = this.fb.control({ value: new Date(newDateStr), disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);\n } else {\n formGroupList[item.name] = this.fb.control({ value: new Date(newDateStr), disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);\n }\n } else if (item.type === 3 && item.value) {\n let formItemDate = JSON.parse(JSON.stringify(item.value));\n if (formItemDate && formItemDate instanceof Array) {\n formItemDate = formItemDate.map((item) => {\n const [year, month, day] = item.split('-').map(str => parseInt(str));\n const newDateStr = new Date(year, month - 1, day)\n .toLocaleDateString('zh-Hans-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })\n .replace(/\\//g, '-');\n item = new Date(newDateStr);\n });\n if (item.validator) {\n formGroupList[item.name] = this.fb.control({ value: formItemDate, disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);\n } else {\n formGroupList[item.name] = this.fb.control({ value: formItemDate, disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);\n }\n } else {\n throw 'form组件中DateRange控件value值格式不规范,正确示例[\\'2020-01-22\\', \\'2020-01-23\\']';\n }\n } else {\n if (item.validator) {\n formGroupList[item.name] = this.fb.control({ value: item.value, disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);\n } else {\n formGroupList[item.name] = this.fb.control({ value: item.value, disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);\n }\n }\n });\n\n this.validateHdForm = this.fb.group(formGroupList);\n\n this.formList.forEach((item) => {\n if (item.onChangeEvent) {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n this.validateHdForm.get(item.name).valueChanges\n .pipe(\n debounceTime(item.onChangeEventDebounceTime)\n )\n .subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n } else {\n this.validateHdForm.get(item.name).valueChanges.subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n }\n }\n }\n });\n this.validateHdForm.valueChanges.subscribe(data => this.onHdFormValueChanged(data));\n this.onHdFormValueChanged();\n }\n\n private dealRow() {\n // 一阶段 遍历数据计算相关数据\n const formListLength = this.formList.length;\n let step = 0;\n for (let i = 0; i < formListLength; i++) {\n if (!this.formList[i].hide) {\n if (i === 0) {\n this.formList[i].totalWidth = this.formList[i].width || 1;\n this.formList[i].isRowFirst = 1;\n step = step + 4;\n } else {\n // 去找到前一个非hide的控件\n for (let j = i - 1; j >= 0; j--) {\n if (this.formList[j].totalWidth) {\n this.formList[i].totalWidth = this.formList[j].totalWidth + (this.formList[i].width || 1);\n if ((this.formList[j].totalWidth + (this.formList[i].width || 1)) > step && this.formList[j].totalWidth <= step) {\n step = step + 4;\n this.formList[i].isRowFirst = 1;\n } else {\n this.formList[i].isRowFirst = 0;\n }\n break;\n }\n }\n }\n }\n }\n\n // 二阶段 isRowFirst的数组项增加子节点\n for (let m = 0; m < formListLength; m++) {\n if (this.formList[m].isRowFirst === 1) {\n this.formList[m].columnItems = [];\n let space = 0;\n for (let n = 1; n < formListLength - m; n++) {\n if (space === 4 || this.formList[m + n].isRowFirst === 1) {\n break;\n }\n if (!this.formList[m + n].hide && this.formList[m + n] && this.formList[m + n].isRowFirst === 0) {\n this.formList[m].columnItems.push(this.formList[m + n]);\n space++;\n }\n }\n }\n }\n }\n\n private onHdFormValueChanged(data?: any) {\n this.changeEvent.emit(this.validateHdForm);\n }\n\n private checkList(list: Array<FormItem>): boolean {\n if (!list || (list && list.length === 0)) {\n return false;\n }\n let nameList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FormListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {\n // throw 'form组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw 'form组件数据格式不规范,存在重复name值!';\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n Object.values(this.validateHdForm.controls).forEach(control => {\n control.markAsDirty();\n control.updateValueAndValidity();\n });\n this.changeEvent.emit(this.validateHdForm.getRawValue());\n }\n\n public resetForm(): void {\n this.validateHdForm.reset();\n Object.values(this.validateHdForm.controls).forEach(control => {\n control.markAsDirty();\n control.updateValueAndValidity();\n });\n this.changeEvent.emit(this.validateHdForm.getRawValue());\n }\n\n public inputClean(filter: FormItem): void {\n const patchObject = {};\n patchObject[filter.name] = null;\n this.validateHdForm.patchValue(patchObject);\n }\n\n readonly inputNumberDefaultFormatter = (value: unknown) => value;\n readonly inputNumberDefaultParser = (value: string) => value;\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdFormComponent } from './hd-form.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule\n ],\n declarations: [HdFormComponent],\n exports: [HdFormComponent]\n})\nexport class HdFormModule { }\n","import { Component, ContentChild, EventEmitter, Input, OnInit, Output, SimpleChange, SimpleChanges, TemplateRef } from '@angular/core';\nimport { TableTotalOption } from './hd-current-table.service';\nimport { InputBoolean } from 'ng-zorro-antd/core';\nimport { Page } from '../model/common-type';\n\n@Component({\n selector: 'hd-current-table',\n templateUrl: './hd-current-table.component.html',\n styleUrls: ['./hd-current-table.component.less']\n})\nexport class HdCurrentTableComponent implements OnInit {\n @Input() tableData: Page<any>;\n @Input() scroll: { [key: string]: string } = { x: '1px' };\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() selectField: string = 'billNumber';\n // 合计区域\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<TableTotalOption>;\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n @ContentChild(\"tableHead\", { static: false }) tableHead: TemplateRef<any>;\n @ContentChild(\"tableBody\", { static: false }) tableBody: TemplateRef<any>;\n @ContentChild(\"tableTotal\", { static: false }) tableTotal: TemplateRef<any>;\n\n @Input() tableLoading: boolean = false;\n // 表格分页参数\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 10;\n @Output() tablePageIndexChange = new EventEmitter<any>();\n @Output() tablePageSizeChange = new EventEmitter<any>();\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n\n tableTotalOptionList = [];\n\n constructor() { }\n\n ngOnInit(): void { }\n\n ngOnChanges(changes: SimpleChange) {\n // 数据改变时,重置勾选状态\n if (changes && changes['tableData'] && changes['tableData']['currentValue'] && changes['tableData']['previousValue']) {\n if(changes['tableData']['currentValue']['pageSize'] !== changes['tableData']['previousValue']['pageSize']\n || changes['tableData']['currentValue']['pageNumber'] !== changes['tableData']['previousValue']['pageNumber']){\n return;\n }\n this.resetStatus();\n }\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n this.resetStatus();\n }\n\n search(reset: boolean) {\n if(reset){\n this.tablePageSizeChange.emit(this.tablePageSize);\n }else{\n this.tablePageIndexChange.emit(this.tablePageIndex);\n }\n // 触发父组件查询事件\n this.tableSearchEvent.emit(reset);\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] && (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] && delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(item => this.mapOfCheckedId[item[this.selectField]]);\n this.isIndeterminate =\n this.listOfDisplayData.some(item => this.mapOfCheckedId[item[this.selectField]]) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n const selectedList: Array<any> = Object.values(this.mapOfCheckList);\n this.selectEvent.emit(selectedList);\n }\n // 如果数据为空,则清空勾选标识\n if (this.tableData.content.length === 0) {\n this.isAllDisplayDataChecked = false;\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach(item => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] && (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] && delete this.mapOfCheckList[item[this.selectField]];\n }\n\n this.mapOfCheckedId[item[this.selectField]] = value\n });\n this.refreshStatus();\n }\n}\n","import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdCurrentTableComponent } from './hd-current-table.component';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\n\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n HdSpaceModule\n ],\n declarations: [HdCurrentTableComponent],\n exports: [HdCurrentTableComponent],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class HdCurrentTableModule { }\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'hd-log',\n templateUrl: './hd-log.component.html',\n styleUrls: ['./hd-log.component.less']\n})\nexport class HdLogComponent implements OnInit {\n @Input() logs: any[];\n\n constructor() {\n }\n\n ngOnInit() {\n }\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport { NzModalService } from 'ng-zorro-antd';\nimport { HdLogComponent } from './hd-log.component';\n\n@Injectable({\n providedIn: 'root',\n})\n\nexport class HdLogService {\n\n constructor(private modalService: NzModalService) { }\n\n showLogs(logs: any[]) {\n this.modalService.create({\n nzTitle: '操作日志',\n nzContent: HdLogComponent,\n nzComponentParams: { logs },\n nzFooter: null,\n nzWidth: 1000\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdLogComponent } from './hd-log.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdDetailLinesModule } from '../hd-detail-lines/hd-detail-lines.module';\nimport { HdLogService } from './hd-log.service';\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule,\n HdDetailLinesModule\n ],\n entryComponents: [HdLogComponent],\n declarations: [HdLogComponent],\n exports: [HdLogComponent],\n providers: [HdLogService]\n})\nexport class HdLogModule { }\n","import { Component, OnInit, Output, Input, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'hd-popconfirm',\n templateUrl: './hd-popconfirm.component.html',\n styleUrls: ['./hd-popconfirm.component.less']\n})\nexport class HdPopconfirmComponent implements OnInit {\n @Input() message: string;\n @Output() confirmOption = new EventEmitter<any>();\n @Output() cancelOption = new EventEmitter<any>();\n\n constructor() { }\n\n ngOnInit() {\n }\n\n\n cancel(e: any): void{\n this.cancelOption.emit();\n }\n\n confirm(e: any): void{\n this.confirmOption.emit();\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdPopconfirmComponent } from \"./hd-popconfirm.component\";\n\n@NgModule({\n declarations: [\n HdPopconfirmComponent\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgZorroAntdModule,\n ],\n exports: [HdPopconfirmComponent],\n providers: [],\n bootstrap: [HdPopconfirmComponent]\n})\nexport class HdPopconfirmModule {\n}\n","import { Component, OnInit, Input, SimpleChange } from \"@angular/core\";\nimport { statusToColor } from \"./hd-status.service\";\n\n@Component({\n selector: \"hd-status\",\n templateUrl: \"./hd-status.component.html\",\n styleUrls: [\"./hd-status.component.less\"],\n})\nexport class HdStatusComponent implements OnInit {\n @Input() status: string;\n statusColor: string;\n\n constructor() {}\n\n ngOnInit() {\n this.setStatusColor();\n }\n\n ngOnChanges() {\n this.setStatusColor();\n }\n\n setStatusColor() {\n let findKey = \"\";\n const statusLower = this.status && this.status.toLowerCase();\n for (const key in statusToColor) {\n if (\n statusLower &&\n statusToColor[key].some(\n (item) => item && item.toLowerCase() === statusLower,\n )\n ) {\n findKey = key; \n }\n }\n this.statusColor = findKey || \"#9FA4A2\";\n }\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdStatusComponent } from \"./hd-status.component\";\n\n@NgModule({\n declarations: [\n HdStatusComponent,\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgZorroAntdModule,\n ],\n exports: [HdStatusComponent],\n providers: [],\n bootstrap: [HdStatusComponent]\n})\nexport class HdStatusModule {\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class CommonSessionService {\n putSession(session_key: string, session: any) {\n if (session) {\n window.sessionStorage.setItem(session_key, JSON.stringify(session));\n } else {\n window.sessionStorage.removeItem(session_key);\n }\n }\n\n getSession(session_key: string): any {\n return JSON.parse(window.sessionStorage.getItem(session_key));\n }\n\n removeSession(session_key: string) {\n window.sessionStorage.removeItem(session_key);\n }\n}\n","export const ColWidth = {\n tableImageColWidth: 25, // 表格小图标宽度\n tableTwoImageColWidth: 40, // 表格小图标宽度\n billNumberColWidth: 150, // 单据单号列宽度\n nameColWidth: 150, // 基本资料名称列宽度\n codeColWidth: 100, // 基本资料代码列宽度\n codeNameColWidth: 200, // 用于门店、货主、供应商以“[code]name“格式展示时固定宽度\n enumColWidth: 100, // 枚举列宽度\n dateColWidth: 100, // 单个日期\n dateTimeColWidth: 150, // 单个日期带时间\n dateRangeWidth: 200, // 日期范围\n operateColWidth: 150, // 操作列宽度\n numberColWidth: 100, // 数字列\n remarkColWidth: 250, // 备注列\n fixColWidth: 150, // 不属于以上内容的列统一使用该宽度,增加超长省略\n maxColWidth: 350 // 用于展示订单内容,需要缩略、展开显示的列\n};\n","\n// 表格行\nexport class HdTableColumn {\n title: string; // 列名\n name: string | Function = null; // 字段名\n render?: (value: any) => string; // 渲染函数\n width?: number; // 列宽\n color?: string; // 颜色\n align?: 'right' | 'left' | 'center' = 'left';\n click?: (value: any) => void;\n fixed?: 'left' | 'right' = null;\n fixedWidth?: number; // 固定列宽度\n btnList?: Array<OperateBtn> = [];\n isShow?: boolean = true;\n canSort?: boolean = false; // 是否可以排序\n canWarp?: boolean = false; // 用于某一列需要个性化的场景,当为true时,且表格选项showOperateColWarpButton为true时,通过按钮控制对应的列是否换行\n minWidth?: number; // 最小宽度,保证列名能正常显示\n stateField?: string; // 状态列取值字段,默认取 state\n isState?: boolean; // 是否按状态列渲染,取值字段为 name\n}\n\nexport class OperateBtn {\n name: string;\n showConfirm?: boolean = false;\n isRepeat?: boolean = false; // 是否和别的按钮有显示冲突,譬如:开启,关闭需要再关闭按钮加一个这个属性\n click?: (value: any) => void;\n permission?: (value: any) => boolean;\n}\n\nexport class HdTableTotalOption {\n columnNumber: number; // 总列数\n insertIndex: number; // 插入下标\n insertName: string; // 插入字段\n}\n\nexport class TableCacheOption {\n pageSize: number;\n colWidths: Map<string, number> = new Map<string, number>(); // name -> width\n cols: Array<string>; // ['title']\n}\n\n// 设置列 树组件对象\nexport class TreeGrid {\n title: string = '';\n key: string = '';\n disabled?: boolean = false;\n checked?: boolean = false;\n selectable?: boolean = false;\n isLeaf?: boolean = true;\n expanded?: boolean = false;\n}","import {\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnInit,\n Output,\n SimpleChange,\n TemplateRef,\n} from \"@angular/core\";\nimport * as localforage from \"localforage\";\nimport {\n InputBoolean,\n NzFormatBeforeDropEvent,\n NzFormatEmitEvent,\n} from \"ng-zorro-antd/core\";\nimport { NzResizeEvent } from \"ng-zorro-antd/resizable\";\nimport { Observable, of } from \"rxjs\";\nimport { delay } from \"rxjs/operators\";\nimport { ColWidth } from \"../model/colWidth\";\nimport { Page } from \"../model/common-type\";\nimport { CommonSessionService } from \"../service/common-session.service\";\nimport {\n HdTableColumn,\n HdTableTotalOption,\n TableCacheOption,\n TreeGrid,\n} from \"./hd-table.service\";\n@Component({\n selector: \"hd-table\",\n templateUrl: \"./hd-table.component.html\",\n styleUrls: [\"./hd-table.component.less\"],\n})\nexport class HdTableComponent implements OnInit {\n @Input() uuid: string;\n @Input() tableCols: Array<HdTableColumn> = [];\n @Input() tableData: Page<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() showOperateColWarpButton: boolean = false;\n @Input() selectField: string = \"billNumber\";\n // 合计区域\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<HdTableTotalOption>;\n @Output() sortEvent = new EventEmitter();\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n @Input() tableLoading: boolean = false;\n // 表格分页参数\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 10;\n @Input() isFirstEntrySearch: boolean;\n @Input() isCrossPageSelect: boolean;\n @Output() tablePageIndexChange = new EventEmitter<any>();\n @Output() tablePageSizeChange = new EventEmitter<any>();\n @Output() tablePageSizeChangeEvent = new EventEmitter<any>();\n @ContentChild(\"tableTotal\", { static: false }) tableTotal: TemplateRef<any>;\n @ContentChild(\"tableLeftButton\", { static: false })\n tableLeftButton: TemplateRef<any>;\n @ContentChild(\"tableRightButton\", { static: false })\n tableRightButton: TemplateRef<any>;\n scroll = null;\n\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n // 合计参数\n tableTotalOptionList = [];\n private textWidthCache: { [key: string]: number } = {};\n // 缓存信息\n tableCacheOption: TableCacheOption = new TableCacheOption();\n userSession: any;\n\n tableColsCache: Array<HdTableColumn> = [];\n showTable: boolean = false;\n selectColListNodes: Array<TreeGrid> = [];\n selectColListNodesCache: Array<TreeGrid> = [];\n showListNodes: boolean = false;\n\n isDropdownVisible: boolean = false;\n // 设置列的可见操作数组\n nowListNodes: Array<TreeGrid> = [];\n // 设置列的不可见操作数组\n hideListNodes: Array<TreeGrid> = [];\n\n // 点击时需要有临时数组存放两个tree,用于取消时候恢复调整前的状态\n cancelNowListNodes: Array<TreeGrid> = [];\n cancelHideListNodes: Array<TreeGrid> = [];\n showDetail: boolean = false;\n localforage: any = null;\n localtionTmp: string = \"\";\n isFirstEntrySearchLocal: boolean = true;\n isCrossPageSelectLocal: boolean = false;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private commonSessionService: CommonSessionService,\n ) {\n this.localforage = localforage.createInstance({\n driver: localforage.INDEXEDDB,\n name: \"hd-fscm\", // 设置存储库的名称\n version: 1.0, // 设置存储库的版本\n storeName: \"hd-fscm-store\", // 设置存储库的存储空间名称\n });\n }\n\n ngOnInit(): void {\n if (this.isFirstEntrySearch === false) {\n this.isFirstEntrySearchLocal = this.isFirstEntrySearch;\n }\n if (this.isCrossPageSelect === true) {\n this.isCrossPageSelectLocal = this.isCrossPageSelect;\n }\n this.localtionTmp = location.pathname;\n if (this.localtionTmp) {\n this.localtionTmp = this.localtionTmp.replace(/\\//g, \"_\");\n }\n this.userSession = this.commonSessionService.getSession(\n \"__jy_authorization_session__\",\n );\n // 用于开发环境调试\n if (!this.userSession) {\n this.userSession = {\n userCode: \"dev\",\n };\n }\n\n this.deleteHideItem();\n if (!this.tableCols || this.tableCols.length === 0) {\n return;\n }\n\n this.localforage\n .ready()\n .then(() => {\n this.getInitLocalforage();\n })\n .catch(function (e) {\n console.log(\"localforage加载异常step1\", e);\n throw \"localforage加载异常\";\n });\n }\n\n ngOnChanges(changes: SimpleChange) {\n // 数据改变时,重置勾选状态\n if (\n changes &&\n changes[\"tableData\"] &&\n changes[\"tableData\"][\"currentValue\"] &&\n changes[\"tableData\"][\"previousValue\"]\n ) {\n if (\n changes[\"tableData\"][\"currentValue\"][\"pageSize\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageSize\"] ||\n changes[\"tableData\"][\"currentValue\"][\"pageNumber\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageNumber\"]\n ) {\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n if (\n changes[\"tableCols\"] &&\n JSON.stringify(changes[\"tableCols\"].currentValue) !==\n JSON.stringify(changes[\"tableCols\"].previousValue) &&\n changes[\"tableCols\"].previousValue !== undefined\n ) {\n this.deleteHideItem();\n if (!this.tableCols || this.tableCols.length === 0) {\n return;\n }\n this.localforage\n .ready()\n .then(() => {\n this.getInitLocalforage();\n })\n .catch(function (e) {\n console.log(\"localforage加载异常step2\", e);\n throw \"localforage加载异常\";\n });\n }\n }\n\n deleteHideItem() {\n // 首先把isShow为false数据剔除掉\n this.tableCols = this.tableCols.filter((item) => {\n // 如果对象没有 isShow 属性,则默认为 true,保留该对象\n if (!item.hasOwnProperty(\"isShow\")) {\n return true;\n }\n // 如果对象有 isShow 属性,则检查其值是否为 true\n return item.isShow === true;\n });\n }\n\n sort(sort: { key: string; value: string }) {\n this.sortEvent.emit(sort);\n }\n\n getInitLocalforage() {\n // 首先获取当前hd-table存储的数据 如果没有,则初始化下当前的数据\n this.localforage\n .getItem(\n \"hd-table_\" +\n this.userSession.userCode +\n \"_\" +\n this.localtionTmp +\n \"_\" +\n this.uuid,\n )\n .then((value: TableCacheOption) => {\n if (value) {\n this.tableCacheOption = value;\n this.normalizeTableCacheOption();\n if (\n this.tableCacheOption.pageSize &&\n this.tableCacheOption.pageSize > 10\n ) {\n this.tablePageSize = this.tableCacheOption.pageSize;\n this.tablePageSizeChange.emit(this.tablePageSize);\n }\n } else {\n this.tableCacheOption = new TableCacheOption();\n this.tableCacheOption.pageSize = this.tablePageSize;\n }\n if (this.isFirstEntrySearchLocal) {\n this.tablePageSizeChangeEvent.emit(this.tablePageSize);\n } else {\n this.isFirstEntrySearchLocal = true;\n }\n this.initTable();\n })\n .catch((err) => {\n this.tableCacheOption = new TableCacheOption();\n this.tableCacheOption.pageSize = this.tablePageSize;\n this.initTable();\n });\n }\n\n initTable() {\n this.showTable = false;\n if (!this.uuid) {\n throw \"hd-table缺失uuid参数,请使用编辑器插件生成并给hd-table赋予uuid属性\";\n }\n if (this.judgeRepeatCols()) {\n this.dealCols();\n this.setCols();\n this.dealScroll();\n this.dealOperateBtn();\n this.showTable = true;\n }\n }\n\n // 设置列点击取消\n cancelDropdown(): void {\n this.isDropdownVisible = false;\n this.hideListNodes = JSON.parse(JSON.stringify(this.cancelHideListNodes));\n this.nowListNodes = JSON.parse(JSON.stringify(this.cancelNowListNodes));\n }\n\n // 点击触发设置列\n confirmDropdown(): void {\n // 临时存放下,取消的时候恢复原来的状态 深拷贝下对象数组\n this.cancelHideListNodes = JSON.parse(JSON.stringify(this.hideListNodes));\n this.cancelNowListNodes = JSON.parse(JSON.stringify(this.nowListNodes));\n this.isDropdownVisible = true;\n }\n\n submitGrids() {\n this.tableCacheOption.cols = [];\n this.nowListNodes.forEach((item) => {\n this.tableCacheOption.cols.push(item.title);\n });\n this.saveTableCacheOption();\n this.initTable();\n this.isDropdownVisible = false;\n }\n\n // 从缓存设置列\n setCols() {\n this.showListNodes = false;\n this.nowListNodes = [];\n this.hideListNodes = [];\n if (this.hasColsCache()) {\n let { notIncols, incols } = this.tableColsCache.reduce(\n (acc, item) => {\n if (this.tableCacheOption.cols.includes(item.title)) {\n acc.incols.push(item);\n } else {\n acc.notIncols.push(item);\n }\n return acc;\n },\n { notIncols: [], incols: [] },\n );\n incols.sort((a, b) => {\n return (\n this.tableCacheOption.cols.indexOf(a.title) -\n this.tableCacheOption.cols.indexOf(b.title)\n );\n });\n this.tableCols = incols.concat(notIncols);\n }\n\n this.tableCols.forEach((element, index) => {\n if (this.hasColsCache()) {\n element.isShow = this.tableCacheOption.cols.includes(element.title)\n ? true\n : false;\n if (element.isShow) {\n this.nowListNodes.push({\n title: element.title,\n key: element.title,\n disabled: element.fixed ? true : false,\n // selectable: false,\n checked: this.tableCacheOption.cols.includes(element.title)\n ? true\n : false,\n });\n } else {\n this.hideListNodes.push({\n title: element.title,\n key: element.title,\n disabled: element.fixed ? true : false,\n // selectable: false,\n checked: this.tableCacheOption.cols.includes(element.title)\n ? true\n : false,\n });\n }\n } else {\n element.isShow = true;\n this.nowListNodes.push({\n title: element.title,\n key: element.title,\n checked: true,\n // selectable: false,\n disabled: element.fixed ? true : false,\n });\n }\n });\n\n // 调整列宽为缓存宽度\n if (\n this.tableCacheOption &&\n this.tableCacheOption.colWidths &&\n this.tableCacheOption.colWidths.size !== 0\n ) {\n this.tableCols.forEach((col) => {\n if (this.tableCacheOption.colWidths.has(col.title)) {\n col.width = this.tableCacheOption.colWidths.get(col.title);\n }\n });\n }\n\n this.dealCols();\n setTimeout(() => {\n this.showListNodes = true;\n }, 0);\n }\n\n // 拖拽操作\n beforeDrop = (arg: NzFormatBeforeDropEvent): Observable<boolean> => {\n if (\n arg.node.origin.disabled ||\n !arg.dragNode.origin.checked ||\n arg.pos === 0\n ) {\n return of(false);\n } else {\n let node: TreeGrid = new TreeGrid();\n node.checked = arg.dragNode.origin.checked;\n node.disabled = arg.dragNode.origin.disabled;\n node.expanded = arg.dragNode.origin.expanded;\n node.isLeaf = arg.dragNode.origin.isLeaf;\n node.key = arg.dragNode.origin.key;\n node.selectable = arg.dragNode.origin.selectable;\n node.title = arg.dragNode.origin.title;\n // 拖拽元素下标\n let dragNodeIndex = this.nowListNodes.findIndex((item) => {\n return item.title == arg.dragNode.origin.title;\n });\n // 目标位置的下标\n let nodeIndex =\n this.nowListNodes.findIndex((item) => {\n return item.title == arg.node.origin.title;\n }) + (arg.pos === -1 ? 0 : arg.pos);\n this.nowListNodes.splice(nodeIndex, 0, node);\n this.nowListNodes.splice(\n nodeIndex >= dragNodeIndex ? dragNodeIndex : dragNodeIndex + 1,\n 1,\n );\n return of(true).pipe(delay(100));\n }\n };\n\n moveElementNearby(arr, elementToMoveTitle, targetElementTitle, pos) {\n const tmpArray = JSON.parse(JSON.stringify(arr));\n const targetIndex = tmpArray.findIndex(\n (item) => item.title === targetElementTitle,\n );\n const elementIndex = tmpArray.findIndex(\n (item) => item.title === elementToMoveTitle,\n );\n const newIndex = pos < 0 ? targetIndex + pos : targetIndex;\n // 移除目标元素,并插入到新的位置\n const removedElement = tmpArray.splice(elementIndex, 1);\n tmpArray.splice(newIndex + 1, 0, removedElement[0]);\n return tmpArray;\n }\n\n // 勾选操作\n checkAction(event: NzFormatEmitEvent): void {\n // 勾选只有在hideListNodes,取消勾选只有在nowListNodes\n if (event.node.origin.checked) {\n let node: TreeGrid = new TreeGrid();\n node = this.hideListNodes.find((item) => {\n return item.title === event.node.origin.title;\n });\n node.checked = true;\n // 找到第一个fixed属性为right的title,找到插入元素的位置\n let title = null;\n for (let i = this.tableColsCache.length - 1; i >= 0; i--) {\n if (this.tableColsCache[i].fixed === \"right\") {\n title = this.tableColsCache[i].title;\n break;\n }\n }\n let temporaryNodeList = this.nowListNodes.slice(0);\n if (!title) {\n temporaryNodeList.push(node);\n } else {\n const index = this.nowListNodes.findIndex(\n (node) => node.title === title,\n );\n temporaryNodeList.splice(index, 0, node);\n }\n this.nowListNodes = temporaryNodeList;\n this.hideListNodes = this.hideListNodes.filter((item) => {\n return item.title !== event.node.origin.title;\n });\n } else {\n // if (this.hideListNodes.length === 0 && this.tableCacheOption && this.tableCacheOption.cols) {\n // this.hideListNodes = this.getHideListNodes();\n // }\n let temporaryNodeList = this.hideListNodes.slice(0);\n this.nowListNodes.forEach((item) => {\n if (item.title === event.node.origin.title) {\n const innerItem = JSON.parse(JSON.stringify(item));\n innerItem.checked = false;\n temporaryNodeList.push(innerItem);\n }\n });\n this.hideListNodes = temporaryNodeList;\n\n // 为了防止未选择的数组顺序因为push方法而改变,通过初始数据获取显示的字段列表\n this.nowListNodes = this.nowListNodes.filter((item) => {\n return item.title !== event.node.origin.title;\n });\n }\n }\n\n // 防止未选择的数组顺序因为push方法而改变,从初始数据获取隐藏未显示的字段列表\n getHideListNodes(): Array<TreeGrid> {\n let temporaryNodeList: Array<TreeGrid> = [];\n // 从tableColsCache里面找没有在storage里面出现的字段,组成hideList\n this.tableColsCache.forEach((item) => {\n if (!this.tableCacheOption.cols.includes(item.title)) {\n let nodeItem: TreeGrid = new TreeGrid();\n nodeItem.title = item.title;\n nodeItem.key = item.title;\n nodeItem.disabled = item.fixed ? true : false;\n nodeItem.checked = false;\n temporaryNodeList.push(nodeItem);\n }\n });\n return temporaryNodeList;\n }\n\n dealCols() {\n if (!this.tableCols[0].minWidth) {\n this.tableCols.forEach((item) => {\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = item.title;\n document.body.appendChild(span);\n item.minWidth = span.offsetWidth + 16;\n span.style.display = \"none\";\n document.body.removeChild(span);\n });\n }\n // 处理左右吸附的数据在数组中的位置\n const leftFixedCols = this.tableCols.filter((col) => col.fixed === \"left\");\n const rightFixedCols = this.tableCols.filter(\n (col) => col.fixed === \"right\",\n );\n const normalCols = this.tableCols.filter((col) => !col.fixed);\n const resultCols = leftFixedCols.concat(normalCols).concat(rightFixedCols);\n this.tableCols = resultCols;\n if (!this.tableColsCache || this.tableColsCache.length === 0) {\n // 缓存一下表格的数据\n this.tableColsCache = [...this.tableCols];\n }\n }\n\n normalizeTableCacheOption() {\n if (!this.tableCacheOption.colWidths) {\n this.tableCacheOption.colWidths = new Map<string, number>();\n } else if (!(this.tableCacheOption.colWidths instanceof Map)) {\n const colWidths = new Map<string, number>();\n Object.keys(this.tableCacheOption.colWidths).forEach((key) => {\n colWidths.set(key, (this.tableCacheOption.colWidths as any)[key]);\n });\n this.tableCacheOption.colWidths = colWidths;\n }\n }\n\n private hasColsCache(): boolean {\n return !!(this.tableCacheOption && this.tableCacheOption.cols && this.tableCacheOption.cols.length > 0);\n }\n\n saveTableCacheOption() {\n this.localforage.setItem(\n \"hd-table_\" +\n this.userSession.userCode +\n \"_\" +\n this.localtionTmp +\n \"_\" +\n this.uuid,\n this.tableCacheOption,\n );\n }\n\n judgeRepeatCols() {\n for (let i = 0; i < this.tableCols.length; i++) {\n for (let j = i + 1; j < this.tableCols.length; j++) {\n if (this.tableCols[i].title === this.tableCols[j].title) {\n throw `hd-table组件中列名 ${this.tableCols[i].title} 重复`;\n }\n }\n }\n return true;\n }\n\n onResize({ width }: NzResizeEvent, col: HdTableColumn): void {\n this.normalizeTableCacheOption();\n let tempWidth = 0;\n if (width > col.minWidth) {\n tempWidth = width;\n } else {\n tempWidth = col.minWidth;\n }\n this.tableCacheOption.colWidths.set(col.title, tempWidth);\n this.saveTableCacheOption();\n this.tableCols = this.tableCols.map((e) =>\n e.title === col.title ? { ...e, width: tempWidth } : e,\n );\n this.dealScroll();\n }\n\n dealOperateBtn() {\n let operateCol = this.tableCols.find((col) => col.title === \"操作\") || null;\n if (operateCol) {\n let textStr = \"\";\n operateCol.btnList.forEach((btn) => {\n if (!btn.isRepeat) {\n textStr += btn.name;\n }\n });\n\n const span = document.createElement(\"a\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = textStr;\n document.body.appendChild(span);\n operateCol.width =\n span.offsetWidth +\n (operateCol.btnList.filter((item) => !item.isRepeat).length - 1) * 4 +\n 16;\n span.style.display = \"none\";\n document.body.removeChild(span);\n }\n }\n\n triggerEvent(fn: any, event: any) {\n if (fn) {\n fn(event);\n }\n }\n\n dealScroll() {\n let colWidth = 0;\n if (this.showSelected) {\n colWidth += 40;\n }\n this.tableCols.forEach((item) => {\n if (!item.width) {\n item.width = ColWidth.fixColWidth;\n }\n if (item.isShow) {\n item.fixedWidth = colWidth;\n colWidth += item.width;\n }\n });\n\n if (this.tableTotal) {\n this.scroll = {\n x: \"1px\",\n y: \"calc(100vh - 180px)\",\n };\n } else {\n this.scroll = {\n x: \"1px\",\n y: \"calc(100vh - 140px)\",\n };\n }\n }\n\n isTextOverflow(text: string, maxWidth: number): boolean {\n const cachedWidth = this.textWidthCache[text];\n if (cachedWidth !== undefined) {\n return cachedWidth + 15 >= maxWidth;\n }\n\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = text;\n document.body.appendChild(span);\n const isOverflow = span.offsetWidth + 15 >= maxWidth;\n this.textWidthCache[text] = span.offsetWidth;\n span.style.display = \"none\";\n document.body.removeChild(span);\n return isOverflow;\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n search(reset: boolean) {\n this.tableCacheOption.pageSize = this.tablePageSize;\n this.saveTableCacheOption();\n if (reset) {\n this.tablePageSizeChange.emit(this.tablePageSize);\n this.tablePageSizeChangeEvent.emit(this.tablePageSize);\n } else {\n this.tablePageIndexChange.emit(this.tablePageIndex);\n // 触发父组件查询事件\n this.tableSearchEvent.emit(reset);\n }\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n const selectedList: Array<any> = Object.values(this.mapOfCheckList);\n this.selectEvent.emit(selectedList);\n }\n // 如果数据为空,则清空勾选标识\n if (this.tableData.content.length === 0) {\n this.isAllDisplayDataChecked = false;\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n }\n\n judgeColEmpty(str: any) {\n if (str || str === 0) {\n return str;\n } else {\n return \"<空>\";\n }\n }\n\n getStateField(col: HdTableColumn): string {\n if (col.isState) {\n return col.name as string;\n }\n return col.stateField || 'state';\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\nimport { NzResizableModule } from 'ng-zorro-antd/resizable';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\nimport { NzTreeModule } from 'ng-zorro-antd/tree';\nimport { HdButtonGroupModule } from '../hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\nimport { HdStatusModule } from '../hd-status/hd-status.module';\nimport { CommonSessionService } from '../service/common-session.service';\nimport { HdTableComponent } from './hd-table.component';\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n HdSpaceModule,\n HdStatusModule,\n HdButtonModule,\n HdButtonGroupModule,\n NzToolTipModule,\n NzPopconfirmModule,\n NzResizableModule,\n NzDropDownModule,\n NzTreeModule,\n NzIconModule\n ],\n declarations: [HdTableComponent],\n providers: [CommonSessionService],\n exports: [HdTableComponent],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class HdTableModule { }\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'hd-tip',\n templateUrl: './hd-tip.component.html',\n styleUrls: ['./hd-tip.component.less']\n})\nexport class HdTipComponent implements OnInit {\n @Input() showIcon: boolean = true;\n @Input() fontSize: number;\n @Input() title: string;\n constructor() { }\n\n ngOnInit() {\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdTipComponent } from './hd-tip.component';\nimport {NgZorroAntdModule} from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule\n ],\n exports: [HdTipComponent],\n declarations: [HdTipComponent]\n})\nexport class HdTipModule { }\n","import { HdButtonGroupModule } from './hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from './hd-button/hd-button.module';\n\nimport { HdDetailFormModule } from './hd-detail-form/hd-detail-form.module';\nimport { HdDetailLinesModule } from './hd-detail-lines/hd-detail-lines.module';\nimport { HdDetailLinesPageModule } from './hd-detail-lines-page/hd-detail-lines-page.module';\nimport { HdDetailTipModule } from './hd-detail-tip/hd-detail-tip.module';\n\nimport { HdFilterModule } from './hd-filter/hd-filter.module';\nimport { HdFormLinesModule } from './hd-form-lines/hd-form-lines.module';\nimport { HdFormModule } from './hd-form/hd-form.module';\n\nimport { NgModule } from '@angular/core';\nimport { HdCurrentTableModule } from './hd-current-table/hd-current-table.module';\nimport { HdLogModule } from './hd-log/hd-log.module';\nimport { HdPopconfirmModule } from './hd-popconfirm/hd-popconfirm.module';\nimport { HdSpaceModule } from './hd-space/hd-space.module';\nimport { HdStatusModule } from './hd-status/hd-status.module';\nimport { HdTableModule } from './hd-table/hd-table.module';\nimport { HdTipModule } from './hd-tip/hd-tip.module';\n@NgModule({\n exports: [\n HdButtonModule,\n HdButtonGroupModule,\n\n HdDetailFormModule,\n HdDetailLinesModule,\n HdDetailLinesPageModule,\n HdDetailTipModule,\n\n HdFilterModule,\n HdFormModule,\n HdFormLinesModule,\n\n HdSpaceModule,\n HdStatusModule,\n HdCurrentTableModule,\n HdTableModule,\n HdTipModule,\n HdPopconfirmModule,\n HdLogModule\n ]\n})\n\nexport class HdComponentModule {\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdComponentModule } from \"./hd-component.module\";\nimport { HdLogComponent } from './hd-log/hd-log.component';\n@NgModule({\n imports: [CommonModule],\n exports: [HdComponentModule],\n providers: [],\n entryComponents: [HdLogComponent]\n})\nexport class FantasyNgzorroModule { }\n","import { HdOption } from \"../model/common-type\";\n\n// 表格行\nexport class TableColumn {\n label: string; // 文本\n name: string; // 字段名称\n value?: string | boolean | Array<string | Date> | null = null; // 值 不传默认为null\n selectList?: Array<HdOption>; // 控件为Select时,选项列表\n // 组件内部成员\n show?: boolean;\n}\n\n//\nexport class TableTotalOption {\n columnNumber: number; // 总列数\n insertIndex: number; // 插入下标\n insertName: string; // 插入字段\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdDetailFormService {\n\n constructor() { }\n\n}\n","export class TotalOption {\n insertIndex: number; // 插入下标\n insertValue: any; // 插入值\n align?: string; // 靠左还是靠右\n showDecimal?: boolean; // 是否显示小数位\n isHide?: boolean; // 是否隐藏, 这里只针对列会同步消失的场景\n}\n","import { Injectable } from '@angular/core';\nimport { SelectOption, CascaderOption, InputNumber } from '../model/common-type';\n\n// 控件列表\nexport class Filter {\n type: FilterListType;\n label: string; // 文本\n name: string; // 字段名称\n placeholder?: string; // 输入框提示文案\n value?: string | boolean | number | Array<string | Date> | null = null; // 值 不传默认为null\n // 组件内部成员\n show?: boolean;\n selectOption?: SelectOption; // 控件为Select时,选项列表\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onBlurEvent?: Function; // 控件失去焦点事件\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n showTime?: boolean = false; // 日期选择器是否包含时间\n require?: boolean = false; // 是否必填\n cascaderOption?: CascaderOption; // 级联选择器配置\n onChangeEventDebounceTime?: number; // change事件防抖\n onSearchEventEventDebounceTime?: number; // search事件防抖\n}\n\n\n// 控件类型\nexport enum FilterListType {\n Input, // 输入框\n Select, // 单项选择器\n Date, // 单个日期选择\n DateRange, // 日期范围选择\n MultipleSelect, // 多选\n Cascader, // 级联选择\n Month, // 月份选择\n InputNumber // 数字输入\n}\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdFilterService {\n\n constructor() {\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { ValidatorFn } from '@angular/forms';\nimport { CascaderOption, InputNumber, RadioOption, SelectOption } from '../model/common-type';\n\n// 控件列表\nexport class FormItem {\n type: FormListType;\n label: string; // 文本\n name: string; // 字段名称\n require?: boolean = false; // 是否必填\n placeholder?: string; // 输入框提示文案\n width?: number = 1; // 占据的列数。默认1\n hide?: boolean = false; // 是否为隐藏字段,仅用于填充表单的字段,不显示在页面上\n totalWidth?: number = 0;\n isRowFirst?: number = 0; // 是否是一行的第一个元素\n columnItems?: Array<any>; // 当前行的所有列的items\n value?: string | boolean | number | Date | Array<string | Date> | null = null; // 值 不传默认为null\n disabled?: boolean;\n color?: string;\n // 组件内部成员\n maxLength?: number; // input控件的输入长度\n prefix?: string; // input前缀文字,对应 nz-input-group nzPrefix\n prefixIcon?: string; // input前缀图标,对应 nz-icon nzType\n selectOption?: SelectOption; // 控件为Select时,选项列表\n radioOption?: RadioOption; // 控件为Radio时,选项列表\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n defaultLabel?: string | Array<string>; // select选择器不初始化的时候可以使用defaultLabel搭配value,设置默认值\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n explain?: string; // label底部的介绍\n textAreaRows?: number; // textArea的行数\n showTime?: boolean = false; // 日期选择器是否包含时间\n labelColor?: string; // label的文字的颜色\n validatorKeys?: Array<ValidatorKey>;\n validator?: ValidatorFn;\n onChangeEventDebounceTime?: number; // change事件防抖\n onSearchEventEventDebounceTime?: number; // search事件防抖\n cascaderOption?: CascaderOption; // 级联选择器配置\n format?: string; // 时间的格式化规则\n}\n\nexport class ValidatorKey {\n key: string;\n label: string;\n}\n\n// 控件类型\nexport enum FormListType {\n Input, // 输入框\n Select, // 单项选择器\n Date, // 单个日期选择\n DateRange, // 日期范围选择\n TextArea, // 块级输入框\n InputNumber, // 数字输入\n MultipleSelect, // 多选\n ViewDom, // 单纯的显示控件\n Switch, // 开关\n Time, // 时间选择器\n Cascader, // 级联选择器\n Radio // 单选\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdFormService {\n constructor() {\n }\n}\n","import { FormItem } from './hd-form/hd-form.service';\nimport { round } from 'lodash';\n// 工具类\nexport const Utils = {\n /**\n * 填充select控件选项\n * @param formList 入参数组 Array<any>\n * @param name 需要填充options的属性名称\n * @param options 选项列表\n */\n fillSelectOption(formList: Array<any>, name: string, options: Array<any>) {\n const returnData = formList;\n if (!returnData || !returnData.length) {\n return returnData;\n }\n const length = formList.length;\n for (let i = 0; i < length; i++) {\n if (returnData[i].name === name) {\n returnData[i].selectOption.selectList = options;\n }\n }\n return returnData;\n },\n\n /**\n * 填充FormItem数组:针对入参list的每一个FormItem,判断obj中是否有对应的name字段,如果有,则填充value。\n * @param list 入参数组 Array<FormItem>\n * @param obj 需要填充到list的属性\n */\n fillArrayFormItem(list: Array<FormItem>, obj: Object) {\n const returnData = [];\n if (!list || !list.length) {\n return returnData;\n }\n const length = list.length;\n for (let i = 0; i < length; i++) {\n if (obj[list[i].name]) {\n list[i].value = obj[list[i].name];\n }\n }\n return list;\n },\n\n /**\n * 数组转换成选择器的选项数组\n * @param list 入参数组 字符串数组或对象数组\n * @param option 转换选项\n * 注:list为字符串数组,option不需要传,按照标准的label、value转换\n */\n arrayToSelectOptionList(list: Array<any>, option?: {\n value: string,\n label: string,\n valueTip?: string,\n labelTip?: string\n }) {\n const returnData = [];\n if (!list || !list.length) {\n return returnData;\n }\n if (option) {\n if (option.labelTip && option.valueTip) {\n list.forEach((item) => {\n const returnItem: any = item;\n returnItem.label = item[option.label];\n returnItem.value = item[option.value];\n if (option.valueTip) {\n returnItem[option.valueTip] = item[option.value];\n }\n if (option.labelTip) {\n returnItem[option.labelTip] = item[option.label];\n }\n returnData.push(returnItem);\n });\n } else {\n list.forEach((item) => {\n const returnItem: any = item;\n returnItem.label = item[option.label];\n returnItem.value = item[option.value];\n returnData.push(returnItem);\n });\n }\n } else {\n list.forEach((item) => {\n const returnItem: any = {};\n returnItem.label = item;\n returnItem.value = item;\n returnData.push(returnItem);\n });\n }\n return returnData;\n },\n\n /**\n * 求和\n * @param nums 数组\n * @param precision 精度\n */\n add(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n let result = 0;\n for (const num of nums) {\n result += num;\n }\n return round(result, precision);\n },\n\n /**\n * 减法\n * @param nums 数组\n * @param precision 精度\n */\n subtract(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n if (nums.length < 2) {\n throw new Error('减法入参数量至少要2个!');\n }\n let result = nums.shift();\n for (const num of nums) {\n result -= num;\n }\n return round(result, precision);\n },\n\n /**\n * 乘法\n * @param nums 数组\n * @param precision 精度\n */\n multiply(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n let result = 1;\n for (const num of nums) {\n result = result * num;\n }\n return round(result, precision);\n },\n\n /**\n * 除法\n * @param nums 数组\n * @param precision 精度\n */\n divide(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n if (nums.length < 2) {\n throw new Error('除法入参数量至少要2个!');\n }\n let result = nums.shift();\n for (const num of nums) {\n if (num === 0) {\n throw new Error('除数不能为0!');\n }\n result = result / num;\n }\n return round(result, precision);\n }\n};\n","export const StaticConst = {\n MaxPageSize: 99999999\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/tslib/tslib.es6.js","ng://fantasy-ngzorro/hd-button-group/hd-button-group.component.ts","ng://fantasy-ngzorro/hd-button-group/hd-button-group.module.ts","ng://fantasy-ngzorro/hd-button/hd-button.service.ts","ng://fantasy-ngzorro/hd-button/hd-button.component.ts","ng://fantasy-ngzorro/hd-button/hd-button.module.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.component.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.module.ts","ng://fantasy-ngzorro/hd-space/hd-space.service.ts","ng://fantasy-ngzorro/hd-space/hd-space.component.ts","ng://fantasy-ngzorro/hd-space/hd-space.module.ts","ng://fantasy-ngzorro/model/common-type.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.component.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.module.ts","ng://fantasy-ngzorro/hd-detail-lines-page/hd-detail-lines-page.component.ts","ng://fantasy-ngzorro/hd-detail-lines-page/hd-detail-lines-page.module.ts","ng://fantasy-ngzorro/hd-status/hd-status.service.ts","ng://fantasy-ngzorro/hd-detail-tip/hd-detail-tip.component.ts","ng://fantasy-ngzorro/hd-detail-tip/hd-detail-tip.module.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.component.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.module.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.service.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.component.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.module.ts","ng://fantasy-ngzorro/hd-form/hd-form.service.ts","ng://fantasy-ngzorro/hd-form/hd-form.component.ts","ng://fantasy-ngzorro/hd-form/hd-form.module.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.component.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.module.ts","ng://fantasy-ngzorro/hd-log/hd-log.component.ts","ng://fantasy-ngzorro/hd-log/hd-log.service.ts","ng://fantasy-ngzorro/hd-log/hd-log.module.ts","ng://fantasy-ngzorro/hd-popconfirm/hd-popconfirm.component.ts","ng://fantasy-ngzorro/hd-popconfirm/hd-popconfirm.module.ts","ng://fantasy-ngzorro/hd-status/hd-status.component.ts","ng://fantasy-ngzorro/hd-status/hd-status.module.ts","ng://fantasy-ngzorro/service/common-session.service.ts","ng://fantasy-ngzorro/model/colWidth.ts","ng://fantasy-ngzorro/hd-table/hd-table.service.ts","ng://fantasy-ngzorro/hd-table/hd-table.component.ts","ng://fantasy-ngzorro/hd-table/hd-table.module.ts","ng://fantasy-ngzorro/hd-tip/hd-tip.component.ts","ng://fantasy-ngzorro/hd-tip/hd-tip.module.ts","ng://fantasy-ngzorro/hd-component.module.ts","ng://fantasy-ngzorro/fantasy-ngzorro.module.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.service.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.service.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.service.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.service.ts","ng://fantasy-ngzorro/utils.ts","ng://fantasy-ngzorro/model/staticConst.ts"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__decorate","decorators","target","key","desc","d","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__metadata","metadataKey","metadataValue","metadata","__values","o","Symbol","iterator","m","next","value","done","TypeError","__read","e","ar","push","error","__spread","concat","HdButtonGroupComponent","ngOnInit","Component","args","selector","template","ContentChild","static","HdButtonGroupModule","NgModule","imports","CommonModule","FormsModule","NgZorroAntdModule","declarations","exports","primary","dashed","danger","default","link","submit","reset","add","normal","small","HdButtonService","Injectable","providedIn","HdButtonComponent","type","ButtonType","size","ButtonSize","disabled","clickAction","EventEmitter","nzOnConfirm","loading","observers","innerClickAction","option","emit","Input","Output","tslib_1.__decorate","InputBoolean","HdButtonModule","HdDetailFormComponent","formCols","Array","filter","item","hide","ngOnChanges","changes","JSON","stringify","currentValue","previousValue","triggerEvent","fn","event","HdDetailFormModule","Style","HdSpaceService","HdSpaceComponent","SpaceType","background","style","HdSpaceModule","ReactiveFormsModule","totalPages","totalElements","pageNumber","pageSize","hasContent","hasNext","content","HdOption","SelectOption","showLabelAndValue","hdDropdownMatchSelectWidth","hdServerSearch","hdShowItemCode","hdShowSearch","hdAllowClear","RadioOption","CheckboxOption","SelectOptionTableColumn","SelectOptionTableColumnIcon","InputNumber","min","max","step","precision","CascaderOption","HdDetailLinesComponent","showSelected","allowDrop","showSearch","searchFields","scroll","x","selectField","selectEvent","showTotal","totalOption","columnsNumber","hdFrontPagination","totalOptionList","tableData","Page","tableLoading","tablePageIndex","tablePageSize","isAllDisplayDataChecked","isIndeterminate","listOfDisplayData","listOfAllData","mapOfCheckedId","mapOfCheckList","displayLines","isFilterData","storeFormLinesData","syncStoreFromLinesInput","applyDisplayFromStore","countSelected","calculateTotal","lines","source","data","parse","restoreFromStore","searchLines","_this","filterStr","trim","filterValue","toLowerCase","filteredData","_c","tslib_1.__values","keys","_d","toString","includes","_e","_f","selectedField","forEach","round","drop","moveItemInArray","previousIndex","currentIndex","Number","fill","insertIndex","insertValue","align","showDecimal","isHide","currentPageDataChange","$event","refreshStatus","resetStatus","every","some","values","checkAll","HdDetailLinesModule","NzTableModule","DragDropModule","schemas","NO_ERRORS_SCHEMA","HdDetailLinesPageComponent","tablePageIndexChange","tablePageSizeChange","pageChange","isCrossPageSelectLocal","isCrossPageSelect","getRowIndex","localIndex","onPageIndexChange","pageIndex","onPageSizeChange","HdDetailLinesPageModule","statusToColor","#FAB13B","#9FA4A2","#F5222D","#3B77E3","#20B95D","#F05B24","HdDetailTipComponent","HdStatusService","tip","setStatusColor","findKey","state","indexOf","toUpperCase","statusColor","HdDetailTipModule","HdFilterComponent","fb","searchEvent","resetEvent","isShowMore","filterListModular","searchSubject","Subject","debounceTimeout","searchSubscription","pipe","debounceTime","subscribe","_a","selectOption","init","checkList","filterList","formGroupList","index","name","control","show","validateFilterForm","group","onChangeEvent","onChangeEventDebounceTime","get","valueChanges","onSearchEvent","onSearchEventDebounceTime","unsubscribe","computeOffset","list","nameList","tslib_1.__spread","Set","submitForm","getRawValue","resetForm","resetFilterFormWithValue","resetValue","patchValue","getFilterData","showMore","inputClean","patchObject","FormBuilder","HdFilterModule","require","hideViewDomValue","inputNumber","showTime","canSearch","ColorOption","ExplainOption","Select","Date","DateRange","TextArea","MultipleSelect","ViewDom","Switch","Time","HdFormLinesService","HdFormLinesComponent","cdr","showLineNumber","allowEmpty","deleteLastLineEvent","showKeyboardOperateTip","operateButtons","changeEvent","showDeleteConfirm","paginationPageIndex","paginationPageSize","showForm","filterStoreFormLinesData","filterIndexStore","formValid","collectDomList","activeDomX","activeDomY","activeDom","activeSelectedComponentOpen","deleteLineEvent","textWidthCache","line","formLinesData","ngAfterViewInit","collectDomData","formInputDomListSub","formInputDomList","ngOnDestroy","linesFormArray","controls","setActiveSelectedComponentOpen","setTimeout","domList","document","querySelectorAll","dom","header","remove","oldIndex","getOldDomIndex","formLines","insertBefore","createDOMStructure","slice","firstChild","getSelectTableColumnStyle","column","width","formItem","hdOptionHeader","createElement","className","paddingLeft","SELECT_TABLE_OPTION_HORIZONTAL_PADDING","paddingRight","tableColumns","selectOptionTableColumn","columnDiv","widthStyle","label","labelText","createTextNode","appendChild","pageDomList","toArray","startIndex","endIndex","pageLinesLength","formLinesLength","interval","splice","disableInputNumberKeyboardStep","j","this_1","NzInputNumberComponent","onKeyDown","keyCode","setValidateValue","jumpToNextInput","y","NzSelectComponent","console","log","focusDom","addNewLineAndFocus","Math","ceil","addFormLine","jumpToPrevInput","jumpDirection","cleanFocusDom","dom_1","nzDisabled","nzSelectTopControlComponent","inputElement","nativeElement","scrollIntoView","behavior","block","inline","nzSelectService","mode","focus","inputDom_1","getElementById","nzId","select","ElementRef","NzDatePickerComponent","NzRangePickerComponent","NzTimePickerComponent","setActiveDom","blur","nzOpen","open","setActiveDomInFormLines","rowNumber","colNumber","getDomIndex","nowActiveDom_1","test","typeList","validateHdFormLines","getValid","innerGetValid","tmpValidateHdFormLines","array","formLinesDataItem","formGroupObj","judgeValueIsNotEmpty","Validators","required","lineIndex","formGroupTmp","insert","valid","getLines","allLines","setStoreData","_b","getStyle","styleObj","min-width","colorOption","color","isEdit","createForm","addFormLineWithData","onHdFormValueChanged","newLine","newLineItem","delayJumpToNextInput","isHdFormLineSearchAdd","formGroupSubmit","innerIndex","FormLineType","calculateLineNumber","setValue","emitEvent","isFocus","deleteFormLine","removeAt","pageIndexChange","pageSizeChange","lines_1","getNowLines","addIndex","deletedIndex_1","count","filterIndex_1","pop","selectOptionCheckList","innerItem","selectValue","id","querySelector","isTextOverflow","text","maxWidth","cachedWidth","undefined","span","visibility","position","whiteSpace","fontSize","display","innerText","body","isOverflow","offsetWidth","removeChild","judgeColEmpty","str","ChangeDetectorRef","ViewChildren","HdFormLinesModule","totalWidth","isRowFirst","ValidatorKey","Cascader","Radio","Checkbox","HdFormService","HdFormComponent","inputNumberDefaultFormatter","inputNumberDefaultParser","formList","dealRow","split","map","year","month","day","newDateStr","toLocaleDateString","replace","validator","formItemDate","FormListType","checkboxOption","checkboxValue","isArray","validateHdForm","formListLength","columnItems","space","markAsDirty","updateValueAndValidity","HdFormModule","HdCurrentTableComponent","showTableTotal","tableSearchEvent","tableTotalOptionList","search","selectedList","HdCurrentTableModule","HdLogComponent","HdLogService","modalService","showLogs","logs","create","nzTitle","nzContent","nzComponentParams","nzFooter","nzWidth","NzModalService","HdLogModule","entryComponents","providers","HdPopconfirmComponent","confirmOption","cancelOption","cancel","confirm","HdPopconfirmModule","bootstrap","HdStatusComponent","statusLower","status","HdStatusModule","CommonSessionService","putSession","session_key","session","window","sessionStorage","setItem","removeItem","getSession","getItem","removeSession","ColWidth","tableImageColWidth","tableTwoImageColWidth","billNumberColWidth","nameColWidth","codeColWidth","codeNameColWidth","enumColWidth","dateColWidth","dateTimeColWidth","dateRangeWidth","operateColWidth","numberColWidth","remarkColWidth","fixColWidth","maxColWidth","fixed","btnList","isShow","canSort","canWarp","OperateBtn","showConfirm","isRepeat","HdTableTotalOption","TableCacheOption","colWidths","Map","title","checked","selectable","isLeaf","expanded","HdTableComponent","commonSessionService","tableCols","showOperateColWarpButton","sortEvent","tablePageSizeChangeEvent","tableCacheOption","tableColsCache","showTable","selectColListNodes","selectColListNodesCache","showListNodes","isDropdownVisible","nowListNodes","hideListNodes","cancelNowListNodes","cancelHideListNodes","showDetail","localforage","localtionTmp","isFirstEntrySearchLocal","beforeDrop","arg","node","origin","dragNode","pos","of","TreeGrid","dragNodeIndex","findIndex","nodeIndex","delay","localforage.createInstance","driver","localforage.INDEXEDDB","version","storeName","isFirstEntrySearch","location","pathname","userSession","userCode","deleteHideItem","ready","then","getInitLocalforage","catch","sort","uuid","normalizeTableCacheOption","initTable","err","judgeRepeatCols","dealCols","setCols","dealScroll","dealOperateBtn","cancelDropdown","confirmDropdown","submitGrids","cols","saveTableCacheOption","hasColsCache","reduce","notIncols","incols","a","b","element","col","has","moveElementNearby","arr","elementToMoveTitle","targetElementTitle","tmpArray","targetIndex","elementIndex","newIndex","removedElement","checkAction","find","title_1","temporaryNodeList","temporaryNodeList_1","getHideListNodes","nodeItem","minWidth","leftFixedCols","rightFixedCols","normalCols","resultCols","colWidths_1","set","onResize","tempWidth","operateCol","textStr_1","btn","colWidth","fixedWidth","tableTotal","getStateField","isState","stateField","HdTableModule","NzToolTipModule","NzPopconfirmModule","NzResizableModule","NzDropDownModule","NzTreeModule","NzIconModule","HdTipComponent","showIcon","HdTipModule","HdComponentModule","FantasyNgzorroModule","HdDetailFormService","TotalOption","Month","HdFilterService","Utils","fillSelectOption","options","returnData","selectList","fillArrayFormItem","obj","arrayToSelectOptionList","labelTip","valueTip","returnItem","nums","Error","num","result","nums_1","nums_1_1","subtract","shift","nums_2","nums_2_1","multiply","nums_3","nums_3_1","divide","nums_4","nums_4_1","MaxPageSize"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, ContentChild, Input, OnInit, TemplateRef } from '@angular/core';\n\n@Component({\n selector: 'hd-button-group',\n templateUrl: './hd-button-group.component.html',\n styleUrls: ['./hd-button-group.component.less']\n})\nexport class HdButtonGroupComponent implements OnInit {\n @ContentChild(\"buttonGroupLeft\", { static: false }) buttonGroupLeft: TemplateRef<any>;\n @ContentChild(\"buttonGroupRight\", { static: false }) buttonGroupRight: TemplateRef<any>;\n\n constructor() { }\n\n ngOnInit() {\n\n }\n}\n","import { HdButtonGroupComponent } from './hd-button-group.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdButtonGroupComponent],\n exports: [HdButtonGroupComponent]\n})\nexport class HdButtonGroupModule { }\n","import { Injectable } from '@angular/core';\n\nexport enum ButtonType {\n primary = 'primary',\n dashed = 'dashed',\n danger = 'danger',\n default = 'default',\n link = 'link',\n submit = 'submit',\n // 增加类型\n reset = 'reset',\n add = 'add'\n}\n\nexport enum ButtonSize {\n normal = 'normal',\n small = 'small'\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdButtonService {\n\n constructor() { }\n\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { InputBoolean } from 'ng-zorro-antd';\nimport { ButtonSize, ButtonType } from './hd-button.service';\n@Component({\n selector: 'hd-button',\n templateUrl: './hd-button.component.html',\n styleUrls: ['./hd-button.component.less']\n})\nexport class HdButtonComponent implements OnInit {\n\n // 默认default\n @Input() type: ButtonType = ButtonType.default;\n @Input() size: ButtonSize = ButtonSize.normal;\n @Input() @InputBoolean() loading: boolean;\n @Input() @InputBoolean() disabled: boolean = false;\n @Output() clickAction = new EventEmitter<any>();\n @Output() nzOnConfirm = new EventEmitter<any>();\n constructor() { }\n\n ngOnInit() {\n if ((this.loading === false || this.loading === true) && this.clickAction.observers.length === 0 && this.nzOnConfirm.observers.length === 0) {\n throw '存在loading效果的hd-button组件禁止使用click绑定点击事件,请使用clickAction绑定!';\n }\n if (this.type === 'submit') {\n throw '禁止使用submit类型的按钮,请使用普通按钮+click事件触发表单提交!';\n }\n }\n\n /** loading 时一并禁用,避免与外部 [disabled] 绑定互相翻转状态 */\n get isDisabled(): boolean {\n return this.disabled || this.loading;\n }\n\n innerClickAction(option: any) {\n // loading 状态下,不允许触发点击事件\n if (this.loading) {\n return;\n }\n this.clickAction.emit(option);\n }\n}\n","import { HdButtonComponent } from './hd-button.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdButtonComponent],\n exports: [HdButtonComponent]\n})\nexport class HdButtonModule { }\n","import { Component, Input, OnInit, SimpleChange } from '@angular/core';\nimport { HdOption } from '../model/common-type';\n\n@Component({\n selector: 'hd-detail-form',\n templateUrl: './hd-detail-form.component.html',\n styleUrls: ['./hd-detail-form.component.less']\n})\nexport class HdDetailFormComponent implements OnInit {\n @Input() formCols: Array<HdOption> = new Array();\n\n constructor() { }\n\n ngOnInit() {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n\n ngOnChanges(changes: SimpleChange) {\n if (changes['formCols'] && JSON.stringify(changes['formCols'].currentValue) !== JSON.stringify(changes['formCols'].previousValue)) {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n }\n\n triggerEvent(fn: any) {\n if (fn) {\n fn(event);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdDetailFormComponent } from './hd-detail-form.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule\n ],\n exports: [HdDetailFormComponent],\n declarations: [HdDetailFormComponent]\n})\nexport class HdDetailFormModule { }\n","import { Injectable } from '@angular/core';\n\nexport enum SpaceType {\n row = 'row',\n column = 'column'\n}\n\nexport class Style {\n background: string\n width: string\n height: string\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdSpaceService {\n\n constructor() { }\n\n}\n","import { Component, Input, OnInit, Output } from '@angular/core';\nimport { Style, SpaceType } from \"./hd-space.service\"; \n\n@Component({\n selector: 'hd-space',\n templateUrl: './hd-space.component.html',\n styleUrls: ['./hd-space.component.less']\n})\nexport class HdSpaceComponent implements OnInit {\n @Input() type: SpaceType = SpaceType.row; \n @Input() size: number; \n @Input() background: string = 'inherit'; \n\n style: Style = new Style();\n\n constructor() { }\n\n ngOnInit() {\n this.style['background'] = this.background;\n if(this.type === SpaceType.row){\n this.style['width'] = '100%';\n this.style['height'] = this.size + 'px';\n }else{\n this.style['height'] = '100%';\n this.style['width'] = this.size + 'px';\n }\n }\n\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdSpaceComponent } from './hd-space.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdSpaceComponent],\n exports: [HdSpaceComponent]\n})\nexport class HdSpaceModule { }\n","export class Page<T> {\n totalPages = 0;\n totalElements = 0;\n pageNumber = 0;\n pageSize = 10;\n hasContent = false;\n hasNext = false;\n content: Array<T> = [];\n}\n\nexport class HdOption {\n label: string;\n value: any;\n color?: string;\n hide?: boolean;\n clickText?: string;\n click?: (value: any) => void;\n}\n\nexport class SelectOption {\n label: string;\n value: string;\n selectList?: Array<any>;\n selectListName?: string;\n showLabelAndValue?: boolean = false;\n hdDropdownMatchSelectWidth?: boolean = false;\n hdServerSearch?: boolean = false;\n hdShowItemCode?: boolean = false; // 是否用[value]label显示选项列表\n tableColumns?: Array<SelectOptionTableColumn>;\n hdShowSearch?: boolean = true;\n hdAllowClear?: boolean = true;\n}\n\nexport class RadioOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class CheckboxOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class SelectOptionTableColumn {\n width: number;\n label: string; // 这里对应的是列名\n name: string; // 对应selectList里面的name值, 如果有render字段 则去render函数渲染\n icons?: Array<SelectOptionTableColumnIcon>; // 对应的图片名字\n render?: (value: any) => string;\n}\n\nexport class SelectOptionTableColumnIcon {\n iconName: string;\n fieldName: string;\n}\n\nexport class InputNumber {\n min?: number = 0;\n max?: number = 99999999;\n step?: number = 1;\n precision?: number = 4;\n nzFormatter?: Function;\n nzParser?: Function;\n}\n\nexport class CascaderOption {\n options: Array<any>;\n}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"./hd-detail-lines.service\";\n\n@Component({\n selector: \"hd-detail-lines\",\n templateUrl: \"./hd-detail-lines.component.html\",\n styleUrls: [\"./hd-detail-lines.component.less\"],\n})\nexport class HdDetailLinesComponent implements OnInit, OnChanges {\n @Input() lines: Array<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() allowDrop: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n // 不传递这个字段时默认为查询所有字段是否有匹配的\n @Input() searchFields: string[] = [];\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n @Output() selectEvent = new EventEmitter();\n @ContentChild(\"detailLineHead\", { static: false })\n detailLineHead: TemplateRef<any>;\n @ContentChild(\"detailLineBody\", { static: false })\n detailLineBody: TemplateRef<any>;\n // 合计区域\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n @Input() hdFrontPagination: boolean = false;\n totalOptionList = [];\n\n tableData: Page<any> = new Page();\n tableLoading: boolean = false;\n // 表格分页参数\n tablePageIndex: number = 1;\n tablePageSize: number = 10;\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n filterStr: string;\n /** 表格实际展示的数据(筛选结果或全量) */\n displayLines: Array<any> = [];\n /** 是否处于筛选状态 */\n isFilterData = false;\n storeFormLinesData: any = []; // 缓存的总的列表数据\n\n constructor() {}\n\n ngOnInit(): void {\n this.syncStoreFromLinesInput();\n this.applyDisplayFromStore();\n this.countSelected();\n this.calculateTotal();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes[\"lines\"]) {\n if (!this.isFilterData) {\n this.syncStoreFromLinesInput();\n this.displayLines = this.lines || [];\n } else if (\n !this.storeFormLinesData ||\n this.storeFormLinesData.length === 0\n ) {\n this.syncStoreFromLinesInput();\n }\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n private syncStoreFromLinesInput(source?: Array<any>): void {\n const data = source || this.lines;\n this.storeFormLinesData = data ? JSON.parse(JSON.stringify(data)) : [];\n }\n\n /** 未筛选时与父组件 lines 同源,避免模板内 ngModel 与父数据脱节 */\n private applyDisplayFromStore(): void {\n if (this.lines && this.lines.length > 0) {\n this.displayLines = this.lines;\n return;\n }\n this.displayLines = this.storeFormLinesData\n ? JSON.parse(JSON.stringify(this.storeFormLinesData))\n : [];\n }\n\n private restoreFromStore(): void {\n this.isFilterData = false;\n this.applyDisplayFromStore();\n this.tableLoading = false;\n this.countSelected();\n this.calculateTotal();\n }\n\n // 全局性的搜索(涵盖页面上所有的可视文字)\n searchLines() {\n // 清空搜索:即使当前展示为空也要能从缓存恢复(对齐 hd-form-lines)\n if (!this.filterStr || !this.filterStr.trim()) {\n if (!this.storeFormLinesData || this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n this.restoreFromStore();\n return;\n }\n if (!this.storeFormLinesData || this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n const filterValue = this.filterStr.trim().toLowerCase();\n this.isFilterData = true;\n\n const filteredData = this.storeFormLinesData.filter((data: any) => {\n if (!this.searchFields || this.searchFields.length === 0) {\n for (const item of Object.keys(data)) {\n if (\n data[item] &&\n data[item].toString().toLowerCase().includes(filterValue)\n ) {\n return true;\n }\n }\n return false;\n }\n for (const item of this.searchFields) {\n if (\n data[item] &&\n data[item].toString().toLowerCase().includes(filterValue)\n ) {\n return true;\n }\n }\n return false;\n });\n this.displayLines = JSON.parse(JSON.stringify(filteredData));\n this.tableLoading = false;\n this.countSelected();\n this.calculateTotal();\n }\n\n private countSelected(): void {\n if (\n this.showSelected &&\n this.selectedField &&\n this.displayLines &&\n this.displayLines.length\n ) {\n this.displayLines.forEach((item) => {\n if (item[this.selectedField] === true) {\n this.mapOfCheckedId[item[this.selectField]] = true;\n this.mapOfCheckList[item[this.selectField]] = item;\n }\n });\n if (\n this.displayLines.length === Object.keys(this.mapOfCheckList).length\n ) {\n this.isAllDisplayDataChecked = true;\n this.isIndeterminate = true;\n }\n }\n }\n\n get LodashRound() {\n return round;\n }\n\n drop(event: CdkDragDrop<string[]>): void {\n moveItemInArray(this.displayLines, event.previousIndex, event.currentIndex);\n this.displayLines = JSON.parse(JSON.stringify(this.displayLines));\n if (!this.isFilterData) {\n this.storeFormLinesData = JSON.parse(JSON.stringify(this.displayLines));\n }\n }\n\n calculateTotal() {\n // 这里处理合计数据\n if (this.showTotal && this.displayLines && this.displayLines.length) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"right\",\n showDecimal: item.showDecimal || false,\n isHide: item.isHide || false,\n };\n }\n });\n }\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n this.selectEvent.emit(Object.values(this.mapOfCheckList));\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n }\n}\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { HdButtonGroupModule } from \"../hd-button-group/hd-button-group.module\";\nimport { NgZorroAntdModule } from \"ng-zorro-antd\";\nimport { NzTableModule } from \"ng-zorro-antd/table\";\nimport { HdButtonModule } from \"../hd-button/hd-button.module\";\nimport { HdSpaceModule } from \"../hd-space/hd-space.module\";\nimport { HdDetailLinesComponent } from \"./hd-detail-lines.component\";\n\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n DragDropModule,\n FormsModule,\n NgZorroAntdModule,\n HdSpaceModule,\n HdButtonModule,\n HdButtonGroupModule,\n ],\n declarations: [HdDetailLinesComponent],\n exports: [HdDetailLinesComponent],\n schemas: [NO_ERRORS_SCHEMA],\n})\nexport class HdDetailLinesModule {}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\n\n@Component({\n selector: \"hd-detail-lines-page\",\n templateUrl: \"./hd-detail-lines-page.component.html\",\n styleUrls: [\"./hd-detail-lines-page.component.less\"],\n})\nexport class HdDetailLinesPageComponent implements OnInit, OnChanges {\n @Input() lines: Array<any> = [];\n /** 与 hd-table 一致,可传 Page 对象;未传 lines 时使用 tableData.content */\n @Input() tableData: Page<any> = new Page();\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() allowDrop: boolean = false;\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n @Input() isCrossPageSelect: boolean;\n @Output() selectEvent = new EventEmitter();\n @ContentChild(\"detailLineHead\", { static: false })\n detailLineHead: TemplateRef<any>;\n @ContentChild(\"detailLineBody\", { static: false })\n detailLineBody: TemplateRef<any>;\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n @Input() tableLoading: boolean = false;\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 10;\n @Output() tablePageIndexChange = new EventEmitter<number>();\n @Output() tablePageSizeChange = new EventEmitter<number>();\n @Output() pageChange = new EventEmitter<void>();\n\n totalOptionList = [];\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n isCrossPageSelectLocal: boolean = false;\n\n constructor() {}\n\n ngOnInit(): void {\n if (this.isCrossPageSelect === true) {\n this.isCrossPageSelectLocal = this.isCrossPageSelect;\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n changes &&\n changes[\"tableData\"] &&\n changes[\"tableData\"][\"currentValue\"] &&\n changes[\"tableData\"][\"previousValue\"]\n ) {\n if (\n changes[\"tableData\"][\"currentValue\"][\"pageSize\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageSize\"] ||\n changes[\"tableData\"][\"currentValue\"][\"pageNumber\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageNumber\"]\n ) {\n this.countSelected();\n this.calculateTotal();\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n this.countSelected();\n this.calculateTotal();\n }\n\n get displayLines(): Array<any> {\n if (this.lines && this.lines.length) {\n return this.lines;\n }\n return (this.tableData && this.tableData.content) || [];\n }\n\n get totalCount(): number {\n if (this.tableData && this.tableData.totalElements != null) {\n return this.tableData.totalElements;\n }\n return this.displayLines.length;\n }\n\n getRowIndex(localIndex: number): number {\n return (this.tablePageIndex - 1) * this.tablePageSize + localIndex;\n }\n\n onPageIndexChange(pageIndex: number): void {\n this.tablePageIndex = pageIndex;\n this.tablePageIndexChange.emit(this.tablePageIndex);\n this.pageChange.emit();\n }\n\n onPageSizeChange(pageSize: number): void {\n this.tablePageSize = pageSize;\n this.tablePageIndex = 1;\n this.tablePageSizeChange.emit(this.tablePageSize);\n this.tablePageIndexChange.emit(this.tablePageIndex);\n this.pageChange.emit();\n }\n\n private countSelected(): void {\n if (\n this.showSelected &&\n this.selectedField &&\n this.displayLines &&\n this.displayLines.length\n ) {\n this.displayLines.forEach((item) => {\n if (item[this.selectedField] === true) {\n this.mapOfCheckedId[item[this.selectField]] = true;\n this.mapOfCheckList[item[this.selectField]] = item;\n }\n });\n if (\n this.displayLines.length === Object.keys(this.mapOfCheckList).length\n ) {\n this.isAllDisplayDataChecked = true;\n this.isIndeterminate = true;\n }\n }\n }\n\n get LodashRound() {\n return round;\n }\n\n drop(event: CdkDragDrop<string[]>): void {\n const lines = [...this.displayLines];\n moveItemInArray(lines, event.previousIndex, event.currentIndex);\n this.lines = lines;\n }\n\n calculateTotal() {\n if (this.showTotal && this.displayLines && this.displayLines.length) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"right\",\n showDecimal: item.showDecimal || false,\n isHide: item.isHide || false,\n };\n }\n });\n }\n }\n\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n if (this.selectEvent) {\n this.selectEvent.emit(Object.values(this.mapOfCheckList));\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n }\n}\n","import { DragDropModule } from \"@angular/cdk/drag-drop\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\nimport { NzTableModule } from \"ng-zorro-antd/table\";\nimport { HdDetailLinesPageComponent } from \"./hd-detail-lines-page.component\";\n\n@NgModule({\n imports: [CommonModule, NzTableModule, DragDropModule],\n declarations: [HdDetailLinesPageComponent],\n exports: [HdDetailLinesPageComponent],\n schemas: [NO_ERRORS_SCHEMA],\n})\nexport class HdDetailLinesPageModule {}\n","import { Injectable } from '@angular/core';\n\nexport const statusToColor = {\n // 黄色\n '#FAB13B': ['partshipped', 'committed', 'partValid', 'confirm', 'picking'],\n // 灰色\n '#9FA4A2': ['initial', 'uncommitted', 'OFF_LINE', 'UN_PRINTED', 'unpublish', 'pastpublish', 'TO_COMMIT', 'unpublished', '未审核', 'returned'],\n // 红色\n '#F5222D': ['delete', 'deleted', 'aborted', 'rejected', '停用', '禁用', 'unpicked', 'DELETED', 'AUDIT_REJECT', 'rejected', 'invalid', 'disabled', ''],\n // 蓝色\n '#3B77E3': ['audited', 'adjusted', 'invoiced', 'audit', 'submitted', 'TO_AUDIT', '已审核', '处理中', 'processing', 'firstReviewed', 'awaiting_effective'],\n // 绿色\n '#20B95D': ['shipped', 'received', 'checked', 'using', 'reverse', 'valid', 'approved', 'ON_LINE', 'finished', 'opened', 'PRINTED', '启用', 'picked', 'published', 'AUDITED', '已收票', '付款完成', '收款完成', '已收款', 'accepted',\n 'offered', 'confirmed', 'effective', '已发布'],\n // 橙色\n '#F05B24': ['partialReceived', 'partDelete', 'tender', 'MODIFIED_AFTER_PRINTED', '部分付款', '部分收款', 'partPublished']\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdStatusService {\n constructor() {\n }\n}\n","import { Component, Input, OnInit, SimpleChange } from \"@angular/core\";\nimport { statusToColor } from \"../hd-status/hd-status.service\";\n\n@Component({\n selector: \"hd-detail-tip\",\n templateUrl: \"./hd-detail-tip.component.html\",\n styleUrls: [\"./hd-detail-tip.component.less\"],\n})\nexport class HdDetailTipComponent implements OnInit {\n constructor() {}\n @Input() state: string;\n @Input() stateText: string;\n @Input() billNumber: string;\n @Input() tip: string = \"详情\";\n statusColor: string;\n\n ngOnInit() {\n this.setStatusColor();\n }\n\n ngOnChanges() {\n this.setStatusColor();\n }\n\n setStatusColor() {\n let findKey = '';\n for (let key in statusToColor) {\n if (\n this.state &&\n (statusToColor[key].indexOf(this.state) !== -1 ||\n statusToColor[key].indexOf(this.state.toUpperCase()) !== -1 ||\n statusToColor[key].indexOf(this.state.toLowerCase()) !== -1)\n ) {\n findKey = key;\n }\n }\n if (findKey) {\n this.statusColor = findKey;\n } else {\n this.statusColor = '#9FA4A2';\n }\n }\n}\n","import { HdDetailTipComponent } from './hd-detail-tip.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdDetailTipComponent],\n exports: [HdDetailTipComponent]\n})\nexport class HdDetailTipModule { }\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { Filter } from './hd-filter.service';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n@Component({\n selector: 'hd-filter',\n templateUrl: './hd-filter.component.html',\n styleUrls: ['./hd-filter.component.less']\n})\nexport class HdFilterComponent implements OnInit {\n\n @Input() filterList: Array<Filter>;\n @Output() searchEvent = new EventEmitter();\n @Output() resetEvent = new EventEmitter();\n\n validateFilterForm: FormGroup;\n isShowMore: boolean = true;\n // 对filterList取模运算\n filterListModular: number = 0;\n private searchSubject = new Subject<{ fn: any, event: any, selectOption?: any; }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n\n private searchSubscription: Subscription | undefined;\n constructor(private fb: FormBuilder) {\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\n }\n\n ngOnInit() {\n this.init();\n }\n\n ngOnChanges() {\n this.init();\n }\n\n private init(): void {\n this.isShowMore = true;\n // 异常捕获\n if (!this.checkList(this.filterList)) {\n throw 'filter组件数据格式不规范';\n }\n this.filterListModular = this.filterList.length % 4;\n // 首先根据定义的组件数组 去初始化表单\n let formGroupList = {};\n this.filterList.forEach((item, index) => {\n formGroupList[item.name] = this.fb.control(item.value, []);\n // 初始化控件显影\n item.show = index < 7;\n });\n this.validateFilterForm = this.fb.group(formGroupList);\n this.filterList.forEach((item) => {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n this.validateFilterForm.get(item.name).valueChanges\n .pipe(\n debounceTime(item.onChangeEventDebounceTime)\n )\n .subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n } else {\n this.validateFilterForm.get(item.name).valueChanges.subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n }\n }\n });\n }\n\n onSearchEvent(fn: any, event: any, onSearchEventDebounceTime: any, selectOption?: any) {\n if (onSearchEventDebounceTime) {\n // 更新防抖时间\n this.debounceTimeout = onSearchEventDebounceTime;\n\n // 取消之前的订阅\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n\n // 创建新的订阅\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption));\n\n // 发送事件\n this.searchSubject.next({ fn, event, selectOption });\n } else {\n this.triggerEvent(fn, event, selectOption);\n }\n }\n\n triggerEvent(fn: any, event: any, selectOption?: any) {\n if (fn && selectOption) {\n fn(event, selectOption);\n } else if (fn) {\n fn(event);\n } else {\n return;\n }\n }\n\n computeOffset() {\n // 特殊处理下等于4个选项的情况\n if (this.filterList.length === 4) {\n return 18;\n }\n return this.isShowMore ? ((this.filterListModular === 0 || this.filterList.length > 7) ? 0 : (3 - this.filterListModular) * 6) : (this.filterListModular === 0 ? 18 : (3 - this.filterListModular) * 6);\n }\n\n private checkList(list: Array<Filter>): boolean {\n if (!list || (list && list.length === 0)) {\n return true;\n }\n let nameList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FilterListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {\n // throw 'filter组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw 'filter组件数据格式不规范,存在重复name值!';\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n this.searchEvent.emit(this.validateFilterForm.getRawValue());\n }\n\n public resetForm(): void {\n this.resetFilterFormWithValue();\n // this.validateFilterForm.reset();\n if (this.resetEvent.observers.length > 0) {\n // 如果有父组件绑定了 resetEvent 的处理器\n this.resetEvent.emit(this.validateFilterForm.getRawValue());\n } else {\n // 如果没有绑定处理器,则触发 searchEvent\n this.searchEvent.emit(this.validateFilterForm.getRawValue());\n }\n }\n\n /**\n * 带初始值重置表单\n */\n public resetFilterFormWithValue() {\n const resetValue: { [key: string]: any } = {};\n this.filterList.forEach((item) => {\n resetValue[item.name] = item.value;\n });\n // 重置表单值(会触发valueChanges事件)\n this.validateFilterForm.patchValue(resetValue);\n }\n\n public getFilterData() {\n return this.validateFilterForm.getRawValue();\n }\n\n public showMore(): void {\n this.isShowMore = !this.isShowMore;\n this.filterList.forEach((item, index) => {\n item.show = this.isShowMore ? index < 7 : true;\n });\n }\n\n public inputClean(filter: Filter): void {\n const patchObject = {};\n patchObject[filter.name] = null;\n\n this.validateFilterForm.patchValue(patchObject);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdFilterComponent } from './hd-filter.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule\n ],\n declarations: [HdFilterComponent],\n exports: [HdFilterComponent]\n})\nexport class HdFilterModule { }\n","import { Injectable } from '@angular/core';\nimport { InputNumber, SelectOption } from '../model/common-type';\n// 控件列表\nexport class FormLine {\n type: FormLineType; // 控件类型\n label: string; // 文本\n name: string; // 字段名称\n placeholder?: string; // 输入框的提示文件\n require?: boolean = false; // 是否必填\n hide?: boolean = false; // 是否为隐藏字段,仅用于填充表单的字段,不显示在页面上\n hideViewDomValue?: boolean = false; // type为ViewDom时,是否隐藏value值, 用于特殊场景,譬如列表中图片的显示\n align?: 'left' | 'right' | 'center'; // 列对齐方式\n value?: string | boolean | number | Date | Array<string | Date> | null = null; // 值 不传默认为null\n isSelect?: boolean; // 输入框等是否允许点击之后全选内容\n selectOption?: SelectOption; // 控件为Select时,选项列表\n explainOptionRight?: ExplainOption; // 明细字段的说明(右侧)\n explainOption?: ExplainOption; // 明细字段的说明\n colorOption?: ColorOption; // 颜色字段的说明\n // 组件内部成员\n maxLength?: number; // input控件的输入长度\n preserveNumber?: number; // 需要保留小数的列的位数\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n defaultLabel?: any; // select选择器不初始化的时候可以使用defaultLabel搭配value,设置默认值\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n disabled?: boolean; // 不可输入状态\n showTime?: boolean = false; // 日期选择器是否包含时间\n style?: object;\n canSearch?: boolean = false; // 指明hide 情况下的控件是否可以被搜索,默认false\n onChangeEventDebounceTime?: number; // change事件防抖\n onSearchEventEventDebounceTime?: number; // search事件防抖\n}\n\nexport class ColorOption {\n name: string;\n color?: string;\n}\n\nexport class ExplainOption {\n show: boolean;\n name: string;\n color?: string;\n}\n\n\n// 控件类型\nexport enum FormLineType {\n Input = 'Input', // 输入框\n Select = 'Select', // 单项选择器\n Date = 'Date', // 单个日期选择\n DateRange = 'DateRange', // 日期范围选择\n TextArea = 'TextArea', // 块级输入框\n InputNumber = 'InputNumber',// 数字输入\n MultipleSelect = 'MultipleSelect', // 多选\n ViewDom = 'ViewDom', // 单纯的显示控件\n Switch = 'Switch', // 开关\n Time = 'Time' // 时间选择器\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdFormLinesService {\n constructor() { }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n SimpleChanges,\n TemplateRef,\n ViewChildren,\n} from \"@angular/core\";\nimport { FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\nimport { round } from \"lodash\";\nimport {\n InputBoolean,\n NzDatePickerComponent,\n NzInputNumberComponent,\n NzRangePickerComponent,\n NzSelectComponent,\n NzTimePickerComponent,\n} from \"ng-zorro-antd\";\nimport { Subject, Subscription } from \"rxjs\";\nimport { debounceTime } from \"rxjs/operators\";\nimport { TotalOption } from \"../hd-detail-lines/hd-detail-lines.service\";\nimport { SelectOptionTableColumn } from \"../model/common-type\";\nimport { FormLine, FormLineType } from \"./hd-form-lines.service\";\n\n/** 与 ant-select 选项项水平内边距一致,用于表头与选项行对齐 */\nconst SELECT_TABLE_OPTION_HORIZONTAL_PADDING = 12;\n\n@Component({\n selector: \"hd-form-lines\",\n templateUrl: \"./hd-form-lines.component.html\",\n styleUrls: [\"./hd-form-lines.component.less\"],\n})\nexport class HdFormLinesComponent implements OnInit, AfterViewInit, OnDestroy {\n @ViewChildren(\"formInputDom\") formInputDomList!: QueryList<ElementRef>;\n\n @Input() @InputBoolean() showLineNumber: boolean = true;\n @Input() @InputBoolean() allowEmpty: boolean = true;\n @Output() deleteLastLineEvent = new EventEmitter();\n @Input() @InputBoolean() showKeyboardOperateTip: boolean = false;\n @Input() @InputBoolean() tableLoading: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n @Input() formLines: Array<FormLine>;\n // 针对formLines里面所有的name,\n @Input() formLinesData: any;\n @Input() operateButtons: Array<string> = [\"add\", \"delete\"];\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Output() changeEvent = new EventEmitter();\n @Input() @InputBoolean() showDeleteConfirm: boolean = false;\n paginationPageIndex: number = 1;\n paginationPageSize: number = 10;\n validateHdFormLines: FormGroup;\n newLine: any;\n inputValue: string;\n\n // 合计区域\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n totalOptionList = [];\n\n showForm: boolean = false;\n filterStr: string;\n storeFormLinesData: any = []; // 缓存的总的表单数据\n filterStoreFormLinesData: any = []; // 筛选出来的数据列表\n filterIndexStore: Array<number> = []; // 筛选出来的数据在原始列表中的下标\n isFilterData: boolean = false; // 是否是已经筛选过的数据\n formValid: boolean = false; // 表单当前的状态\n private searchSubject = new Subject<{ fn: any; event: any; line: any }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n\n private searchSubscription: Subscription | undefined;\n private formInputDomListSub: Subscription | undefined;\n\n // 当前页的dom二维数组\n collectDomList: Array<\n Array<\n | ElementRef\n | NzSelectComponent\n | NzInputNumberComponent\n | NzDatePickerComponent\n | NzRangePickerComponent\n | NzTimePickerComponent\n >\n > = [];\n // 当前聚焦的dom元素坐标\n activeDomX: number = null;\n activeDomY: number = null;\n activeDom:\n | ElementRef\n | NzSelectComponent\n | NzInputNumberComponent\n | NzDatePickerComponent\n | NzRangePickerComponent\n | NzTimePickerComponent = null;\n activeSelectedComponentOpen: boolean = false;\n @ContentChild(\"ViewDomRightTemplate\", { static: false })\n ViewDomRightTemplate: TemplateRef<any>;\n\n constructor(\n private fb: FormBuilder,\n private cdr: ChangeDetectorRef,\n ) {\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event, line }) => this.triggerEvent(fn, event, line));\n }\n\n ngOnInit() {\n // 缓存一下总的表单数据\n this.storeFormLinesData = this.formLinesData;\n this.init();\n }\n\n ngAfterViewInit() {\n this.collectDomData();\n this.formInputDomListSub = this.formInputDomList.changes.subscribe(() => {\n this.collectDomData();\n });\n }\n\n ngOnDestroy() {\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n if (this.formInputDomListSub) {\n this.formInputDomListSub.unsubscribe();\n }\n }\n\n get formLinesLength() {\n return this.linesFormArray.controls.length;\n }\n\n setActiveSelectedComponentOpen(value: boolean) {\n this.activeSelectedComponentOpen = value;\n if (value === true) {\n setTimeout(() => {\n const domList = document.querySelectorAll(\n \".ant-select-dropdown.hd-select-table\",\n );\n if (domList.length > 0) {\n const dom = domList[0];\n dom\n .querySelectorAll(\".hd-option-header\")\n .forEach((header) => header.remove());\n const oldIndex = this.getOldDomIndex(this.activeDomY, this.formLines);\n dom.insertBefore(\n this.createDOMStructure(\n this.formLines[oldIndex],\n this.linesFormArray.controls.slice(\n (this.paginationPageIndex - 1) * this.paginationPageSize,\n (this.paginationPageIndex - 1) * this.paginationPageSize +\n this.paginationPageSize,\n )[this.activeDomX],\n ),\n dom.firstChild,\n );\n }\n }, 0);\n }\n }\n\n getSelectTableColumnStyle(column: SelectOptionTableColumn): {\n [key: string]: string;\n } {\n if (!column || !column.width) {\n return { width: \"unset\" };\n }\n return { width: `${column.width}px` };\n }\n\n createDOMStructure(formItem, line) {\n // 创建外部 div\n const hdOptionHeader = document.createElement(\"div\");\n hdOptionHeader.className = \"hd-option-header\";\n hdOptionHeader.style.paddingLeft = `${SELECT_TABLE_OPTION_HORIZONTAL_PADDING}px`;\n hdOptionHeader.style.paddingRight = `${SELECT_TABLE_OPTION_HORIZONTAL_PADDING}px`;\n\n // 检查条件,确定是否要创建子元素\n // const selectListLength = (formItem && formItem.selectOption && formItem.selectOption.selectList && formItem.selectOption.selectList.length) || 0;\n // if\n // const lineValueLength = (line.get(formItem.selectOption.selectListName) && line.get(formItem.selectOption.selectListName).value && line.get(formItem.selectOption.selectListName).value.length) || 0;\n\n // if (selectListLength > 0 || lineValueLength > 0) {\n // 遍历 tableColumns 创建内部列 div\n formItem.selectOption.tableColumns.forEach((selectOptionTableColumn) => {\n const columnDiv = document.createElement(\"div\");\n columnDiv.className = \"hd-option-header-column\";\n\n const widthStyle = this.getSelectTableColumnStyle(\n selectOptionTableColumn,\n );\n columnDiv.style.width = widthStyle.width;\n\n // 添加列标签内容\n if (selectOptionTableColumn.label) {\n const labelText = document.createTextNode(\n selectOptionTableColumn.label,\n );\n columnDiv.appendChild(labelText);\n }\n\n // 添加列 div 到外部 div\n hdOptionHeader.appendChild(columnDiv);\n });\n // }\n\n return hdOptionHeader;\n }\n\n collectDomData() {\n this.collectDomList = [];\n const pageDomList = this.formInputDomList.toArray();\n // Step 1: 获取当前页的数据量\n const startIndex = (this.paginationPageIndex - 1) * this.paginationPageSize;\n const endIndex = this.paginationPageIndex * this.paginationPageSize;\n const adjustedEndIndex =\n endIndex > this.formLinesLength ? this.formLinesLength : endIndex;\n const pageLinesLength = adjustedEndIndex - startIndex;\n\n const interval = pageDomList.length / pageLinesLength;\n // Step 2: 拆分formInputDomList\n for (let i = 0; i < pageLinesLength; i++) {\n this.collectDomList.push(pageDomList.splice(0, interval));\n }\n this.disableInputNumberKeyboardStep();\n }\n\n /**\n * ng-zorro 8 在 input 的 onKeyDown 里用上下键调 up()/down() 改 step。\n * 只覆盖 onKeyDown(不动 up/down),键盘方向键交给表单跳转,+/- 按钮仍可用。\n */\n private disableInputNumberKeyboardStep(): void {\n for (let i = 0; i < this.collectDomList.length; i++) {\n for (let j = 0; j < this.collectDomList[i].length; j++) {\n const dom = this.collectDomList[i][j];\n if (dom instanceof NzInputNumberComponent) {\n dom.onKeyDown = (e: KeyboardEvent) => {\n if (e.keyCode === 38 || e.keyCode === 40) {\n return;\n }\n if (e.keyCode === 13) {\n dom.setValidateValue();\n }\n };\n }\n }\n }\n }\n\n // 聚焦下一个dom\n jumpToNextInput(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n // 如果是最后一个可输入元素,新增行\n if (\n !(this.activeDom instanceof NzSelectComponent) &&\n x === this.collectDomList.length - 1 &&\n y === this.collectDomList[0].length - 1\n ) {\n this.addNewLineAndFocus();\n } else {\n if (y === this.collectDomList[0].length - 1) {\n console.log(\"执行过程1\");\n // 如果是最后一列,则跳转到下一行第一个输入框\n this.focusDom(x + 1, 0, \"right\");\n } else {\n console.log(\"执行过程2\");\n // 如果不是最后一列,则跳转到当前行下一个输入框\n this.focusDom(x, y + 1, \"right\");\n }\n }\n }\n\n /**\n * 增加新行并且聚焦到第一个元素,\n * 这里要注意,如果存在翻页情况,需要处理\n */\n addNewLineAndFocus() {\n // 当前行为当前页最后一行的时候,判断下一页是否有数据\n // 1、如果有:翻页+聚焦第一行第一个元素\n // 2、如果没有:新增行+翻页+聚焦第一行第一个元素\n if (this.activeDomX === this.paginationPageSize - 1) {\n // 判断下一页是否有数据\n if (\n this.paginationPageIndex <\n Math.ceil(this.formLinesLength / this.paginationPageSize)\n ) {\n // 翻页+聚焦第一行第一个元素\n this.paginationPageIndex++;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程3\");\n this.focusDom(0, 0, \"right\");\n }, 0);\n } else {\n // 新增行+翻页+聚焦第一行第一个元素\n this.addFormLine();\n this.paginationPageIndex++;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程4\");\n this.focusDom(0, 0);\n }, 0);\n }\n } else {\n this.addFormLine();\n }\n }\n\n // 聚焦到上一个dom\n jumpToPrevInput(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n if (x === 0 && y === 0) {\n // 如果是第一个可输入元素, 判断是否有上一页, 如果有,则翻页+聚焦到上一页最后一个元素\n if (this.paginationPageIndex > 1) {\n // 翻页+聚焦到上一页最后一个元素\n this.paginationPageIndex--;\n setTimeout(() => {\n this.collectDomData();\n console.log(\"执行过程5\");\n this.focusDom(\n this.collectDomList.length - 1,\n this.collectDomList[0].length - 1,\n );\n }, 0);\n }\n return;\n } else {\n if (y === 0) {\n console.log(\"执行过程6\");\n // 如果是第一列,则跳转到上一行最后一个输入框\n this.focusDom(x - 1, this.collectDomList[0].length - 1, \"left\");\n } else {\n console.log(\"执行过程7\");\n // 如果不是第一列,则跳转到当前行上一个输入框\n this.focusDom(x, y - 1, \"left\");\n }\n }\n }\n\n /**\n * 聚焦到某个dom\n * @param x 坐标x\n * @param y 坐标y\n * @param jumpDirection 跳转方向\n */\n focusDom(x: number, y: number, jumpDirection: string = \"right\") {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n // 先清除一下当前的焦点\n this.cleanFocusDom(this.activeDomX, this.activeDomY);\n if (this.collectDomList[x] && this.collectDomList[x][y]) {\n const dom = this.collectDomList[x][y];\n // 需要判断下一个focus的dom是否是禁用状态,如果是禁用状态需要跳过\n if (dom instanceof NzSelectComponent) {\n if (dom.nzDisabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n dom.nzSelectTopControlComponent.inputElement.nativeElement.scrollIntoView(\n { behavior: \"smooth\", block: \"center\", inline: \"center\" },\n );\n // 这里多选框需要额外处理下,因为向下的时候会触发内部Input的聚焦,把下一个dom的focus放到宏任务中,延迟处理。\n if (dom.nzSelectService.mode === \"multiple\") {\n setTimeout(() => {\n dom.focus();\n }, 0);\n } else {\n dom.focus();\n }\n } else if (dom instanceof NzInputNumberComponent) {\n if (dom.nzDisabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n const inputDom: any = document.getElementById(dom.nzId);\n inputDom.focus();\n inputDom.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\",\n });\n setTimeout(() => {\n inputDom.select();\n }, 0);\n } else if (dom instanceof ElementRef) {\n if (dom.nativeElement.disabled) {\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n dom.nativeElement.focus();\n dom.nativeElement.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\",\n });\n setTimeout(() => {\n dom.nativeElement.select();\n }, 0);\n } else if (\n dom instanceof NzDatePickerComponent ||\n dom instanceof NzRangePickerComponent ||\n dom instanceof NzTimePickerComponent\n ) {\n // TODO:在ngzorro8.5.x版本,时间相关的选择器没有暴露出open方法,暂时先不处理。(10.x及以上版本提供了open方法)\n if (jumpDirection === \"right\") {\n this.jumpToNextInput(x, y);\n } else if (jumpDirection === \"left\") {\n this.jumpToPrevInput(x, y);\n }\n return;\n }\n this.setActiveDom(x, y);\n } else {\n // 没有dom的场景下,需要判断是左还是右,\n }\n }\n\n cleanFocusDom(x: number, y: number) {\n if (\n x === null ||\n y === null ||\n !this.collectDomList ||\n this.collectDomList.length === 0\n ) {\n return;\n }\n if (this.collectDomList[x] && this.collectDomList[x][y]) {\n const dom = this.collectDomList[x][y];\n if (dom instanceof NzSelectComponent) {\n dom.blur();\n dom.nzOpen = false;\n } else if (dom instanceof NzInputNumberComponent) {\n dom.blur();\n } else if (dom instanceof ElementRef) {\n dom.nativeElement.blur();\n } else {\n }\n }\n }\n\n setActiveDom(x: number, y: number) {\n this.activeDomX = x;\n this.activeDomY = y;\n this.activeDom = this.collectDomList[this.activeDomX][this.activeDomY];\n if (this.activeDom instanceof NzSelectComponent) {\n this.setActiveSelectedComponentOpen(this.activeDom.open);\n }\n }\n\n /**\n * 根据行号和列号名称获取当前聚焦的dom位置\n * @param rowNumber 行号\n * @param colNumber 列号\n */\n setActiveDomInFormLines(rowNumber: number, colNumber: number) {\n this.activeDomX = rowNumber;\n this.activeDomY = this.getDomIndex(colNumber, this.formLines);\n this.setActiveDom(this.activeDomX, this.activeDomY);\n }\n\n /**\n * 键盘点击事件\n * @param event 键盘事件\n * @returns\n */\n onKeyDown(event: KeyboardEvent) {\n if (this.activeDomX === null || this.activeDomY === null) {\n return;\n }\n switch (event.key) {\n case \"ArrowUp\":\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen\n ) {\n return;\n }\n if (this.activeDomX !== 0) {\n this.focusDom(this.activeDomX - 1, this.activeDomY);\n }\n break;\n case \"ArrowDown\":\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen\n ) {\n return;\n }\n // 判断是否在最后一行,加行\n if (this.activeDomX === this.collectDomList.length - 1) {\n this.cleanFocusDom(this.activeDomX, this.activeDomY);\n this.addNewLineAndFocus();\n break;\n } else {\n this.focusDom(this.activeDomX + 1, this.activeDomY);\n }\n break;\n case \"ArrowLeft\":\n this.jumpToPrevInput(this.activeDomX, this.activeDomY);\n break;\n case \"ArrowRight\":\n this.jumpToNextInput(this.activeDomX, this.activeDomY);\n break;\n case \"Enter\":\n if (this.activeDom instanceof NzSelectComponent) {\n this.setActiveSelectedComponentOpen(this.activeDom.open);\n if (this.activeSelectedComponentOpen === false) {\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n } else if (this.activeDomX === this.collectDomList.length - 1) {\n this.addNewLineAndFocus();\n }\n break;\n case \"Escape\":\n if (this.activeDom instanceof NzSelectComponent) {\n const nowActiveDom = this.activeDom as NzSelectComponent;\n setTimeout(() => {\n this.setActiveSelectedComponentOpen(nowActiveDom.open);\n if (this.activeSelectedComponentOpen === false) {\n if (nowActiveDom.nzSelectService.mode === \"multiple\") {\n setTimeout(() => {\n this.focusDom(this.activeDomX, this.activeDomY);\n }, 0);\n } else {\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n }\n }, 0);\n }\n break;\n default:\n // 如果当前聚焦的是选择框,且键入0-9a-zA-Z,则弹出\n if (\n this.activeDom instanceof NzSelectComponent &&\n this.activeSelectedComponentOpen === false &&\n /^[0-9a-zA-Z]$/.test(event.key)\n ) {\n const dom = this.activeDom;\n dom.nzOpen = true;\n this.setActiveSelectedComponentOpen(true);\n // // TODO:这里暂时注释,不能直接带入键入值,这样会导致输入中文的时候带入英文字符,不符合预期\n // dom.nzSelectTopControlComponent.inputValue = event.key;\n // // 获取 input 元素\n // const inputElement = dom.nzSelectTopControlComponent.inputElement.nativeElement;\n // setTimeout(() => {\n // // 触发输入事件,以确保 Angular 检测到值的变化\n // const eventInput = new Event('input', { bubbles: true });\n // inputElement.dispatchEvent(eventInput);\n // }, 0);\n }\n break;\n }\n }\n\n /**\n * 根据在初始dom下标和数据集 获取在collectDomList中的下标\n * @param index 初始下标\n * @param list 老数据集\n * @returns\n */\n private getDomIndex(index: number, list: Array<FormLine>): number {\n const typeList = [\n \"Input\",\n \"Select\",\n \"Date\",\n \"DateRange\",\n \"TextArea\",\n \"InputNumber\",\n \"MultipleSelect\",\n ];\n let filterList = [];\n for (let i = 0; i < list.length; i++) {\n if (i === index) {\n return filterList.length;\n }\n // 与模板一致:hide 的列不渲染 #formInputDom,不计入 collectDomList 的列下标\n if (typeList.includes(list[i].type) && !list[i].hide) {\n filterList.push(list[i]);\n }\n }\n return null;\n }\n\n /**\n * 根据在collectDomList中的下标和数据集 获取初始dom下标\n * @param index 新下标\n * @param list 老数据集\n * @returns\n */\n private getOldDomIndex(index: number, list: Array<FormLine>): number {\n console.log(\"index\", index);\n console.log(\"list\", list);\n const typeList = [\n \"Input\",\n \"Select\",\n \"Date\",\n \"DateRange\",\n \"TextArea\",\n \"InputNumber\",\n \"MultipleSelect\",\n ];\n let filterList = [];\n for (let i = 0; i < list.length; i++) {\n if (typeList.includes(list[i].type) && !list[i].hide) {\n filterList.push(list[i]);\n if (filterList.length === index + 1) {\n return i;\n }\n }\n }\n return null;\n }\n\n get linesFormArray(): any {\n return this.validateHdFormLines.get(\"lines\") as FormArray;\n }\n\n get LodashRound() {\n return round;\n }\n\n // 暴露的方法,用于获取所有数据的valid状态\n public getValid() {\n return this.formValid;\n }\n\n onSearchEvent(\n fn: any,\n event: any,\n line: any,\n onSearchEventDebounceTime: any,\n ) {\n if (onSearchEventDebounceTime) {\n // 更新防抖时间\n this.debounceTimeout = onSearchEventDebounceTime;\n\n // 取消之前的订阅\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n\n // 创建新的订阅\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(this.debounceTimeout))\n .subscribe(({ fn, event, line }) => this.triggerEvent(fn, event, line));\n\n // 发送事件\n this.searchSubject.next({ fn, event, line });\n } else {\n this.triggerEvent(fn, event, line);\n }\n setTimeout(() => {\n this.setActiveSelectedComponentOpen(true);\n }, 0);\n }\n\n /**\n *\n * @param fn 父组件函数\n * @param event 事件值\n * @param line 触发的行\n */\n triggerEvent(fn: any, event: any, line: any) {\n if (fn) {\n fn(event, line);\n }\n }\n\n innerGetValid() {\n let tmpValidateHdFormLines = this.fb.group({\n lines: this.fb.array([]),\n });\n this.storeFormLinesData.forEach((formLinesDataItem) => {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = this.fb.control(\n {\n value: this.judgeValueIsNotEmpty(formLinesDataItem[item.name])\n ? formLinesDataItem[item.name]\n : item.value || null,\n disabled: item.disabled,\n },\n item.require ? [Validators.required] : [],\n );\n if (item.selectOption && item.selectOption.label) {\n formGroupObj[item.selectOption.label] = this.fb.control(\n formLinesDataItem[item.selectOption.label] || null,\n [],\n );\n }\n });\n formGroupObj.lineIndex = this.fb.control(\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).controls.length,\n [],\n );\n let formGroupTmp = this.fb.group(formGroupObj);\n this.formLines.forEach((item) => {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n formGroupTmp\n .get(item.name)\n .valueChanges.pipe(debounceTime(item.onChangeEventDebounceTime))\n .subscribe((value) => {\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n } else {\n formGroupTmp.get(item.name).valueChanges.subscribe((value) => {\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n }\n }\n });\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).insert(\n (tmpValidateHdFormLines.get(\"lines\") as FormArray).controls.length,\n formGroupTmp,\n );\n });\n return tmpValidateHdFormLines.valid;\n }\n\n // 暴露的方法,用于获取所有数据\n public getLines() {\n let allLines = [];\n this.storeFormLinesData.forEach((formLinesDataItem) => {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = formLinesDataItem[item.name];\n });\n formGroupObj.lineIndex = formLinesDataItem.lineIndex;\n allLines.push(formGroupObj);\n });\n return allLines;\n }\n\n // 全局性的搜索(涵盖页面上所有的可视文字)\n searchLines() {\n if (this.storeFormLinesData.length < 1) {\n return;\n }\n this.tableLoading = true;\n // 如果没有输入搜索字符串,则显示缓存内的所有数据\n if (!this.filterStr) {\n this.isFilterData = false;\n this.setStoreData();\n return;\n }\n const filterValue = this.filterStr.trim().toLowerCase();\n this.isFilterData = true;\n this.filterIndexStore = [];\n\n // 根据搜索字符串过滤数据\n const filteredData = this.storeFormLinesData.filter(\n (data: any, index: number) => {\n for (const item of this.formLines) {\n if (\n (item.hide && item.canSearch) ||\n (!item.hide && item.name !== \"uuid\")\n ) {\n console.log(\"item\", item.name);\n const value = data[item.name]\n ? data[item.name].toString().toLowerCase()\n : \"\";\n if (value.includes(filterValue)) {\n this.filterIndexStore.push(index);\n return true;\n }\n }\n }\n return false;\n },\n );\n // 缓存一下筛选后的表单数据\n this.filterStoreFormLinesData = filteredData;\n // 处理筛选好的数据 然后重新渲染\n this.formLinesData = filteredData;\n this.init(true);\n }\n\n setStoreData() {\n this.formLinesData = this.storeFormLinesData;\n this.init(true);\n }\n\n getStyle(line: FormGroup, formItem: any, width: string) {\n let styleObj = {\n \"min-width\": width,\n };\n if (formItem.style) {\n styleObj = { ...styleObj, ...formItem.style };\n }\n if (\n formItem.colorOption &&\n formItem.colorOption.name &&\n line.get(formItem.colorOption.name).value\n ) {\n styleObj = {\n ...styleObj,\n ...{ color: line.get(formItem.colorOption.name).value },\n };\n }\n return styleObj;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n changes[\"formLinesData\"] &&\n JSON.stringify(changes[\"formLinesData\"].currentValue) !==\n JSON.stringify(changes[\"formLinesData\"].previousValue)\n ) {\n if (this.storeFormLinesData && this.storeFormLinesData.length === 0) {\n this.storeFormLinesData = this.formLinesData;\n }\n this.init();\n }\n if (\n changes[\"totalOption\"] &&\n JSON.stringify(changes[\"totalOption\"].currentValue) !==\n JSON.stringify(changes[\"totalOption\"].previousValue)\n ) {\n this.calculateTotal();\n }\n }\n\n calculateTotal() {\n // 这里处理合计数据\n if (this.showTotal) {\n this.totalOptionList = new Array(Number(this.columnsNumber) - 1).fill(\"\");\n this.totalOption.forEach((item) => {\n if (item.insertIndex && (item.insertValue || item.insertValue === 0)) {\n this.totalOptionList[item.insertIndex - 1] = {\n value: item.insertValue,\n align: item.align || \"left\",\n showDecimal: item.showDecimal || false,\n };\n }\n });\n }\n }\n\n private init(isEdit: boolean = false): void {\n this.paginationPageIndex = 1;\n // 异常捕获\n if (!this.checkList(this.formLines)) {\n this.tableLoading = false;\n return;\n }\n this.createForm();\n // 如果没有formLinesData,则认为是新增\n if (\n !isEdit &&\n (!this.formLinesData ||\n (this.formLinesData && this.formLinesData.length === 0))\n ) {\n this.tableLoading = false;\n this.addFormLine(0, false);\n this.showForm = true;\n } else {\n // 编辑逻辑\n this.addFormLineWithData();\n }\n this.validateHdFormLines.valueChanges.subscribe((data) =>\n this.onHdFormValueChanged(data),\n );\n this.onHdFormValueChanged();\n }\n\n /**\n * 创建表单\n */\n private createForm() {\n this.validateHdFormLines = this.fb.group({\n lines: this.fb.array([]),\n });\n this.newLine = this.newLineItem();\n }\n\n delayJumpToNextInput() {\n setTimeout(() => {\n this.jumpToNextInput(this.activeDomX, this.activeDomY);\n }, 0);\n }\n\n /**\n * 定义空的newLineItem 结构\n */\n private newLineItem(): FormGroup {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = this.fb.control(\n {\n value: item.value,\n disabled: item.disabled,\n } || null,\n item.require && !item.hide ? [Validators.required] : [],\n );\n });\n formGroupObj.lineIndex = this.fb.control(\n this.linesFormArray.controls.length,\n [],\n );\n // 用来标识是否是搜索状态下新增的行\n formGroupObj.isHdFormLineSearchAdd = this.fb.control(this.isFilterData, []);\n let formGroupSubmit = this.fb.group(formGroupObj);\n this.formLines.forEach((item, innerIndex) => {\n if (item.onChangeEvent) {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n formGroupSubmit\n .get(item.name)\n .valueChanges.pipe(debounceTime(item.onChangeEventDebounceTime))\n .subscribe((value) => {\n if (item.type === FormLineType.Select && value !== null) {\n this.delayJumpToNextInput();\n }\n this.triggerEvent(item.onChangeEvent, value, formGroupSubmit);\n });\n } else {\n formGroupSubmit.get(item.name).valueChanges.subscribe((value) => {\n if (item.type === FormLineType.Select && value !== null) {\n this.delayJumpToNextInput();\n }\n this.triggerEvent(item.onChangeEvent, value, formGroupSubmit);\n });\n }\n }\n }\n });\n return formGroupSubmit;\n }\n\n private calculateLineNumber() {\n this.linesFormArray.controls.forEach((item, index) => {\n item.get(\"lineIndex\").setValue(index + 1, { emitEvent: false });\n });\n }\n\n /**\n * 编辑的时候数据处理\n */\n addFormLineWithData() {\n this.formLinesData.forEach((formLinesDataItem, index) => {\n let formGroupObj: any = {};\n this.formLines.forEach((item) => {\n // 新增行 初始数据都为null\n formGroupObj[item.name] = this.fb.control(\n {\n value: this.judgeValueIsNotEmpty(formLinesDataItem[item.name])\n ? formLinesDataItem[item.name]\n : item.value || null,\n disabled: item.disabled,\n },\n item.require ? [Validators.required] : [],\n );\n if (item.selectOption && item.selectOption.label) {\n formGroupObj[item.selectOption.label] = this.fb.control(\n formLinesDataItem[item.selectOption.label] || null,\n [],\n );\n }\n });\n formGroupObj.lineIndex = this.fb.control(\n this.linesFormArray.controls.length + 1,\n [],\n );\n let formGroupTmp = this.fb.group(formGroupObj);\n this.formLines.forEach((item, innerIndex) => {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n formGroupTmp\n .get(item.name)\n .valueChanges.pipe(debounceTime(item.onChangeEventDebounceTime))\n .subscribe((value) => {\n if (item.type === FormLineType.Select && value !== null) {\n this.delayJumpToNextInput();\n }\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n } else {\n formGroupTmp.get(item.name).valueChanges.subscribe((value) => {\n if (item.type === FormLineType.Select && value !== null) {\n this.delayJumpToNextInput();\n }\n this.triggerEvent(item.onChangeEvent, value, formGroupTmp);\n });\n }\n }\n });\n this.linesFormArray.insert(\n this.linesFormArray.controls.length,\n formGroupTmp,\n );\n });\n this.tableLoading = false;\n this.showForm = true;\n }\n\n addFormLine(index?: any, isFocus: boolean = true) {\n this.linesFormArray.insert(\n index || this.linesFormArray.controls.length,\n this.newLineItem(),\n );\n this.calculateLineNumber();\n setTimeout(() => {\n this.collectDomData();\n if (isFocus) {\n if (index !== null && index !== undefined) {\n this.activeDomX = index;\n } else {\n this.activeDomX = this.collectDomList.length - 1;\n }\n this.activeDomY = 0;\n console.log(\"执行过程13\");\n this.focusDom(this.activeDomX, this.activeDomY);\n }\n }, 0);\n }\n\n @Output() deleteLineEvent = new EventEmitter();\n\n deleteFormLine(index: any) {\n console.log(\"index\", index);\n // 最后一条数据的时候要判断一下\n if (this.linesFormArray.controls.length === 1 && !this.allowEmpty) {\n if (this.deleteLastLineEvent) {\n this.deleteLastLineEvent.emit();\n }\n return;\n }\n this.linesFormArray.removeAt(index - 1);\n if (\n !this.isFilterData &&\n this.linesFormArray.controls &&\n this.linesFormArray.controls.length === 0\n ) {\n this.addFormLine();\n } else {\n // 删除尾页的最后一个元素动作\n if (\n this.paginationPageIndex * this.paginationPageSize ===\n this.linesFormArray.controls.length + this.paginationPageSize\n ) {\n this.paginationPageIndex--;\n }\n this.calculateLineNumber();\n }\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n public pageIndexChange(event: number): void {\n this.paginationPageIndex = event;\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n public pageSizeChange(event: number): void {\n this.paginationPageSize = event;\n setTimeout(() => {\n this.collectDomData();\n }, 0);\n }\n\n private onHdFormValueChanged(data?: any) {\n if (this.isFilterData) {\n if (data && data.lines && this.filterIndexStore.length !== 0) {\n const lines = data.lines;\n if (lines.length === this.filterIndexStore.length) {\n this.filterIndexStore.forEach((item, index) => {\n this.storeFormLinesData[item] = {\n ...this.filterStoreFormLinesData[index],\n ...lines[index],\n };\n });\n } else if (lines.length > this.filterIndexStore.length) {\n // 有新增数据的情况\n // step 1: 先找新增的index下标\n const getNowLines = this.validateHdFormLines.getRawValue().lines;\n let addIndex = -1;\n for (let i = 0; i < getNowLines.length; i++) {\n if (getNowLines[i].isHdFormLineSearchAdd) {\n addIndex = i;\n break;\n }\n }\n if (addIndex !== -1) {\n this.storeFormLinesData.splice(\n this.filterIndexStore[addIndex - 1] + 1,\n 0,\n getNowLines[addIndex],\n );\n }\n this.filterIndexStore.push(this.filterIndexStore[addIndex - 1] + 1);\n } else {\n // 有删除数据的情况\n // step 1:先找到删除的index下标\n let deletedIndex = -1;\n let count = 0;\n if (lines.length === 0) {\n deletedIndex = 0;\n } else {\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].lineIndex - count > 1) {\n deletedIndex = i;\n break;\n }\n count++;\n }\n }\n if (deletedIndex !== -1) {\n // step 2: 删除总数据中的对应数据, 把下标数组和lines长度对齐,同时把下标数组在deletedIndex后面的值全都-1\n this.storeFormLinesData = this.storeFormLinesData.filter(\n (item, index) => {\n return index !== this.filterIndexStore[deletedIndex];\n },\n );\n this.filterIndexStore.splice(deletedIndex, 1);\n for (let i = 0; i < this.filterIndexStore.length; i++) {\n if (i >= deletedIndex) {\n this.filterIndexStore[i]--;\n }\n }\n } else {\n // step 2: 没有找到deletedIndex说明删除操作在最后一行\n const filterIndex =\n this.filterIndexStore[this.filterIndexStore.length - 1];\n this.storeFormLinesData = this.storeFormLinesData.filter(\n (item, index) => {\n return index !== filterIndex;\n },\n );\n this.filterIndexStore.pop();\n }\n }\n } else {\n if (data && data.lines) {\n this.storeFormLinesData = data.lines;\n }\n }\n } else {\n if (data && data.lines) {\n this.storeFormLinesData = data.lines;\n }\n }\n\n // 总表单\n if (!this.isFilterData) {\n this.formValid = this.validateHdFormLines.valid;\n } else {\n if (this.formValid) {\n // 如果整体表单是true,不管子表单是什么,都变成子表单的状态\n this.formValid = this.validateHdFormLines.valid;\n } else {\n // 如果整体表单是false:1、子表单为true,需要重算;2、子表单为false,用子表单状态\n if (this.validateHdFormLines.valid) {\n this.formValid = this.innerGetValid();\n } else {\n this.formValid = this.validateHdFormLines.valid;\n }\n }\n }\n // this.calculateLineNumber();\n this.changeEvent.emit(this.validateHdFormLines);\n }\n\n private checkList(list: Array<FormLine>): boolean {\n if (!list || (list && list.length === 0)) {\n return false;\n }\n let nameList = [];\n let selectOptionCheckList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FormLineType.Select && (!item.selectList || (item.selectList && item.selectList.length === 0))) {\n // throw 'formLines组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n\n // 校验有onSearch的字段的selectOption的value、label是否在formLine里面都定义了\n if (item.onSearchEvent && item.selectOption) {\n selectOptionCheckList = [];\n list.forEach((innerItem) => {\n if (\n innerItem.name === item.selectOption.value ||\n innerItem.name === item.selectOption.label\n ) {\n selectOptionCheckList.push(innerItem.name);\n }\n });\n if (selectOptionCheckList.length < 2) {\n throw `formLines组件数据格式不规范,字段${item.name}的selectOption的value、label字段未能在formLines中找到对应字段!`;\n }\n }\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw \"formLines组件数据格式不规范,存在重复name值!\";\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n this.changeEvent.emit(this.validateHdFormLines.getRawValue());\n }\n\n public resetForm(): void {\n // 删除\n for (let i = this.linesFormArray.controls.length; i >= 0; i--) {\n this.deleteFormLine(i);\n }\n this.paginationPageIndex = 1;\n }\n\n public inputClean(formItem: any, line: any): void {\n line.get(formItem.name).setValue(null);\n }\n\n public selectValue(id: string, rowNumber: number, colNumber: number): void {\n const inputDom: any = document.querySelector(id);\n inputDom.select();\n this.setActiveDomInFormLines(rowNumber, colNumber);\n }\n\n private textWidthCache: { [key: string]: number } = {};\n\n isTextOverflow(text: string, maxWidth: number): boolean {\n const cachedWidth = this.textWidthCache[text];\n if (cachedWidth !== undefined) {\n return cachedWidth + 15 >= maxWidth;\n }\n\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = text;\n document.body.appendChild(span);\n const isOverflow = span.offsetWidth + 15 >= maxWidth;\n this.textWidthCache[text] = span.offsetWidth;\n span.style.display = \"none\";\n document.body.removeChild(span);\n return isOverflow;\n }\n\n judgeColEmpty(str: any) {\n if (str || str === 0) {\n return str;\n } else {\n return \"<空>\";\n }\n }\n\n judgeValueIsNotEmpty(str: any) {\n if (str === null && str === undefined) {\n return false;\n } else {\n return true;\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonGroupModule } from '../hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\nimport { HdFormLinesComponent } from './hd-form-lines.component';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule,\n HdSpaceModule,\n HdButtonGroupModule\n ],\n declarations: [HdFormLinesComponent],\n exports: [HdFormLinesComponent]\n})\nexport class HdFormLinesModule { }\n","import { Injectable } from '@angular/core';\nimport { ValidatorFn } from '@angular/forms';\nimport { CascaderOption, CheckboxOption, InputNumber, RadioOption, SelectOption } from '../model/common-type';\n\n// 控件列表\nexport class FormItem {\n type: FormListType;\n label: string; // 文本\n name: string; // 字段名称\n require?: boolean = false; // 是否必填\n placeholder?: string; // 输入框提示文案\n width?: number = 1; // 占据的列数。默认1\n hide?: boolean = false; // 是否为隐藏字段,仅用于填充表单的字段,不显示在页面上\n totalWidth?: number = 0;\n isRowFirst?: number = 0; // 是否是一行的第一个元素\n columnItems?: Array<any>; // 当前行的所有列的items\n value?: string | boolean | number | Date | Array<string | number | boolean | Date> | null = null; // 值 不传默认为null\n disabled?: boolean;\n color?: string;\n // 组件内部成员\n maxLength?: number; // input控件的输入长度\n prefix?: string; // input前缀文字,对应 nz-input-group nzPrefix\n prefixIcon?: string; // input前缀图标,对应 nz-icon nzType\n selectOption?: SelectOption; // 控件为Select时,选项列表\n radioOption?: RadioOption; // 控件为Radio时,选项列表\n checkboxOption?: CheckboxOption; // 控件为Checkbox组时,选项列表\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n defaultLabel?: string | Array<string>; // select选择器不初始化的时候可以使用defaultLabel搭配value,设置默认值\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n explain?: string; // label底部的介绍\n textAreaRows?: number; // textArea的行数\n showTime?: boolean = false; // 日期选择器是否包含时间\n labelColor?: string; // label的文字的颜色\n validatorKeys?: Array<ValidatorKey>;\n validator?: ValidatorFn;\n onChangeEventDebounceTime?: number; // change事件防抖\n onSearchEventEventDebounceTime?: number; // search事件防抖\n cascaderOption?: CascaderOption; // 级联选择器配置\n format?: string; // 时间的格式化规则\n}\n\nexport class ValidatorKey {\n key: string;\n label: string;\n}\n\n// 控件类型\nexport enum FormListType {\n Input, // 输入框\n Select, // 单项选择器\n Date, // 单个日期选择\n DateRange, // 日期范围选择\n TextArea, // 块级输入框\n InputNumber, // 数字输入\n MultipleSelect, // 多选\n ViewDom, // 单纯的显示控件\n Switch, // 开关\n Time, // 时间选择器\n Cascader, // 级联选择器\n Radio, // 单选\n Checkbox // 复选框\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdFormService {\n constructor() {\n }\n}\n","import { Component, EventEmitter, Input, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { FormItem, FormListType } from './hd-form.service';\n// import * as moment from 'moment';\n@Component({\n selector: 'hd-form',\n templateUrl: './hd-form.component.html',\n styleUrls: ['./hd-form.component.less']\n})\nexport class HdFormComponent implements OnInit {\n\n @Input() formList: Array<FormItem>;\n @Output() changeEvent = new EventEmitter();\n validateHdForm: FormGroup;\n inputValue: string;\n\n private searchSubject = new Subject<{ fn: any, event: any; }>();\n private debounceTimeout: number = 0; // 默认防抖时间\n\n private searchSubscription: Subscription | undefined;\n constructor(private fb: FormBuilder) {\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event }) => this.triggerEvent(fn, event));\n }\n\n ngOnInit() {\n if (!this.formList || this.formList.length === 0) {\n return;\n }\n\n this.init();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['formList'] && JSON.stringify(changes['formList'].currentValue) !== JSON.stringify(changes['formList'].previousValue)) {\n if (!this.formList || this.formList.length === 0) {\n return;\n }\n this.init();\n }\n }\n\n onSearchEvent(fn: any, event: any, onSearchEventDebounceTime: any) {\n if (onSearchEventDebounceTime) {\n // 更新防抖时间\n this.debounceTimeout = onSearchEventDebounceTime;\n\n // 取消之前的订阅\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n\n // 创建新的订阅\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.debounceTimeout)\n ).subscribe(({ fn, event }) => this.triggerEvent(fn, event));\n\n // 发送事件\n this.searchSubject.next({ fn, event });\n } else {\n this.triggerEvent(fn, event);\n }\n }\n\n triggerEvent(fn: any, event: any) {\n if (fn) {\n fn(event);\n }\n }\n\n private init(): void {\n // 异常捕获\n if (!this.checkList(this.formList)) {\n throw 'form组件数据格式不规范';\n }\n // 对表单数据做初始化,用row隔离每行数据item\n this.dealRow();\n // 首先根据定义的组件数组 去初始化表单\n let formGroupList = {};\n this.formList.forEach((item, index) => {\n // 日期相关的控件做特殊处理\n if (item.type === 2 && item.value) {\n const [year, month, day] = item.value.toString().split('-').map(str => parseInt(str));\n const newDateStr = new Date(year, month - 1, day)\n .toLocaleDateString('zh-Hans-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })\n .replace(/\\//g, '-');\n if (item.validator) {\n formGroupList[item.name] = this.fb.control({ value: new Date(newDateStr), disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);\n } else {\n formGroupList[item.name] = this.fb.control({ value: new Date(newDateStr), disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);\n }\n } else if (item.type === 3 && item.value) {\n let formItemDate = JSON.parse(JSON.stringify(item.value));\n if (formItemDate && formItemDate instanceof Array) {\n formItemDate = formItemDate.map((item) => {\n const [year, month, day] = item.split('-').map(str => parseInt(str));\n const newDateStr = new Date(year, month - 1, day)\n .toLocaleDateString('zh-Hans-CN', { year: 'numeric', month: '2-digit', day: '2-digit' })\n .replace(/\\//g, '-');\n item = new Date(newDateStr);\n });\n if (item.validator) {\n formGroupList[item.name] = this.fb.control({ value: formItemDate, disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);\n } else {\n formGroupList[item.name] = this.fb.control({ value: formItemDate, disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);\n }\n } else {\n throw 'form组件中DateRange控件value值格式不规范,正确示例[\\'2020-01-22\\', \\'2020-01-23\\']';\n }\n } else if (item.type === FormListType.Checkbox && item.checkboxOption) {\n const checkboxValue = Array.isArray(item.value) ? item.value : [];\n if (item.validator) {\n formGroupList[item.name] = this.fb.control({ value: checkboxValue, disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);\n } else {\n formGroupList[item.name] = this.fb.control({ value: checkboxValue, disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);\n }\n } else if (item.type === FormListType.Checkbox) {\n const checkboxValue = item.value != null ? item.value : false;\n if (item.validator) {\n formGroupList[item.name] = this.fb.control({ value: checkboxValue, disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);\n } else {\n formGroupList[item.name] = this.fb.control({ value: checkboxValue, disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);\n }\n } else {\n if (item.validator) {\n formGroupList[item.name] = this.fb.control({ value: item.value, disabled: item.disabled }, item.require && !item.hide ? [Validators.required, item.validator] : []);\n } else {\n formGroupList[item.name] = this.fb.control({ value: item.value, disabled: item.disabled }, item.require && !item.hide ? [Validators.required] : []);\n }\n }\n });\n\n this.validateHdForm = this.fb.group(formGroupList);\n\n this.formList.forEach((item) => {\n if (item.onChangeEvent) {\n if (item.onChangeEvent) {\n if (item.onChangeEventDebounceTime) {\n this.validateHdForm.get(item.name).valueChanges\n .pipe(\n debounceTime(item.onChangeEventDebounceTime)\n )\n .subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n } else {\n this.validateHdForm.get(item.name).valueChanges.subscribe(value => this.triggerEvent(item.onChangeEvent, value));\n }\n }\n }\n });\n this.validateHdForm.valueChanges.subscribe(data => this.onHdFormValueChanged(data));\n this.onHdFormValueChanged();\n }\n\n private dealRow() {\n // 一阶段 遍历数据计算相关数据\n const formListLength = this.formList.length;\n let step = 0;\n for (let i = 0; i < formListLength; i++) {\n if (!this.formList[i].hide) {\n if (i === 0) {\n this.formList[i].totalWidth = this.formList[i].width || 1;\n this.formList[i].isRowFirst = 1;\n step = step + 4;\n } else {\n // 去找到前一个非hide的控件\n for (let j = i - 1; j >= 0; j--) {\n if (this.formList[j].totalWidth) {\n this.formList[i].totalWidth = this.formList[j].totalWidth + (this.formList[i].width || 1);\n if ((this.formList[j].totalWidth + (this.formList[i].width || 1)) > step && this.formList[j].totalWidth <= step) {\n step = step + 4;\n this.formList[i].isRowFirst = 1;\n } else {\n this.formList[i].isRowFirst = 0;\n }\n break;\n }\n }\n }\n }\n }\n\n // 二阶段 isRowFirst的数组项增加子节点\n for (let m = 0; m < formListLength; m++) {\n if (this.formList[m].isRowFirst === 1) {\n this.formList[m].columnItems = [];\n let space = 0;\n for (let n = 1; n < formListLength - m; n++) {\n if (space === 4 || this.formList[m + n].isRowFirst === 1) {\n break;\n }\n if (!this.formList[m + n].hide && this.formList[m + n] && this.formList[m + n].isRowFirst === 0) {\n this.formList[m].columnItems.push(this.formList[m + n]);\n space++;\n }\n }\n }\n }\n }\n\n private onHdFormValueChanged(data?: any) {\n this.changeEvent.emit(this.validateHdForm);\n }\n\n private checkList(list: Array<FormItem>): boolean {\n if (!list || (list && list.length === 0)) {\n return false;\n }\n let nameList = [];\n list.forEach((item) => {\n // 校验单项选择器\n // if (item.type === FormListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {\n // throw 'form组件数据格式不规范,存在单项选择器没有传入选项!'\n // }\n nameList.push(item.name);\n });\n // 校验name是否重复\n if ([...new Set(nameList)].length !== list.length) {\n throw 'form组件数据格式不规范,存在重复name值!';\n }\n // ...more check\n return true;\n }\n\n public submitForm(): void {\n Object.values(this.validateHdForm.controls).forEach(control => {\n control.markAsDirty();\n control.updateValueAndValidity();\n });\n this.changeEvent.emit(this.validateHdForm.getRawValue());\n }\n\n public resetForm(): void {\n this.validateHdForm.reset();\n Object.values(this.validateHdForm.controls).forEach(control => {\n control.markAsDirty();\n control.updateValueAndValidity();\n });\n this.changeEvent.emit(this.validateHdForm.getRawValue());\n }\n\n public inputClean(filter: FormItem): void {\n const patchObject = {};\n patchObject[filter.name] = null;\n this.validateHdForm.patchValue(patchObject);\n }\n\n readonly inputNumberDefaultFormatter = (value: unknown) => value;\n readonly inputNumberDefaultParser = (value: string) => value;\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdFormComponent } from './hd-form.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule\n ],\n declarations: [HdFormComponent],\n exports: [HdFormComponent]\n})\nexport class HdFormModule { }\n","import { Component, ContentChild, EventEmitter, Input, OnInit, Output, SimpleChange, SimpleChanges, TemplateRef } from '@angular/core';\nimport { TableTotalOption } from './hd-current-table.service';\nimport { InputBoolean } from 'ng-zorro-antd/core';\nimport { Page } from '../model/common-type';\n\n@Component({\n selector: 'hd-current-table',\n templateUrl: './hd-current-table.component.html',\n styleUrls: ['./hd-current-table.component.less']\n})\nexport class HdCurrentTableComponent implements OnInit {\n @Input() tableData: Page<any>;\n @Input() scroll: { [key: string]: string } = { x: '1px' };\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() selectField: string = 'billNumber';\n // 合计区域\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<TableTotalOption>;\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n @ContentChild(\"tableHead\", { static: false }) tableHead: TemplateRef<any>;\n @ContentChild(\"tableBody\", { static: false }) tableBody: TemplateRef<any>;\n @ContentChild(\"tableTotal\", { static: false }) tableTotal: TemplateRef<any>;\n\n @Input() tableLoading: boolean = false;\n // 表格分页参数\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 10;\n @Output() tablePageIndexChange = new EventEmitter<any>();\n @Output() tablePageSizeChange = new EventEmitter<any>();\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n\n tableTotalOptionList = [];\n\n constructor() { }\n\n ngOnInit(): void { }\n\n ngOnChanges(changes: SimpleChange) {\n // 数据改变时,重置勾选状态\n if (changes && changes['tableData'] && changes['tableData']['currentValue'] && changes['tableData']['previousValue']) {\n if(changes['tableData']['currentValue']['pageSize'] !== changes['tableData']['previousValue']['pageSize']\n || changes['tableData']['currentValue']['pageNumber'] !== changes['tableData']['previousValue']['pageNumber']){\n return;\n }\n this.resetStatus();\n }\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n this.resetStatus();\n }\n\n search(reset: boolean) {\n if(reset){\n this.tablePageSizeChange.emit(this.tablePageSize);\n }else{\n this.tablePageIndexChange.emit(this.tablePageIndex);\n }\n // 触发父组件查询事件\n this.tableSearchEvent.emit(reset);\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] && (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] && delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(item => this.mapOfCheckedId[item[this.selectField]]);\n this.isIndeterminate =\n this.listOfDisplayData.some(item => this.mapOfCheckedId[item[this.selectField]]) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n const selectedList: Array<any> = Object.values(this.mapOfCheckList);\n this.selectEvent.emit(selectedList);\n }\n // 如果数据为空,则清空勾选标识\n if (this.tableData.content.length === 0) {\n this.isAllDisplayDataChecked = false;\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach(item => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] && (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] && delete this.mapOfCheckList[item[this.selectField]];\n }\n\n this.mapOfCheckedId[item[this.selectField]] = value\n });\n this.refreshStatus();\n }\n}\n","import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdCurrentTableComponent } from './hd-current-table.component';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\n\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n HdSpaceModule\n ],\n declarations: [HdCurrentTableComponent],\n exports: [HdCurrentTableComponent],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class HdCurrentTableModule { }\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'hd-log',\n templateUrl: './hd-log.component.html',\n styleUrls: ['./hd-log.component.less']\n})\nexport class HdLogComponent implements OnInit {\n @Input() logs: any[];\n\n constructor() {\n }\n\n ngOnInit() {\n }\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport { NzModalService } from 'ng-zorro-antd';\nimport { HdLogComponent } from './hd-log.component';\n\n@Injectable({\n providedIn: 'root',\n})\n\nexport class HdLogService {\n\n constructor(private modalService: NzModalService) { }\n\n showLogs(logs: any[]) {\n this.modalService.create({\n nzTitle: '操作日志',\n nzContent: HdLogComponent,\n nzComponentParams: { logs },\n nzFooter: null,\n nzWidth: 1000\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdLogComponent } from './hd-log.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdDetailLinesModule } from '../hd-detail-lines/hd-detail-lines.module';\nimport { HdLogService } from './hd-log.service';\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule,\n HdDetailLinesModule\n ],\n entryComponents: [HdLogComponent],\n declarations: [HdLogComponent],\n exports: [HdLogComponent],\n providers: [HdLogService]\n})\nexport class HdLogModule { }\n","import { Component, OnInit, Output, Input, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'hd-popconfirm',\n templateUrl: './hd-popconfirm.component.html',\n styleUrls: ['./hd-popconfirm.component.less']\n})\nexport class HdPopconfirmComponent implements OnInit {\n @Input() message: string;\n @Output() confirmOption = new EventEmitter<any>();\n @Output() cancelOption = new EventEmitter<any>();\n\n constructor() { }\n\n ngOnInit() {\n }\n\n\n cancel(e: any): void{\n this.cancelOption.emit();\n }\n\n confirm(e: any): void{\n this.confirmOption.emit();\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdPopconfirmComponent } from \"./hd-popconfirm.component\";\n\n@NgModule({\n declarations: [\n HdPopconfirmComponent\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgZorroAntdModule,\n ],\n exports: [HdPopconfirmComponent],\n providers: [],\n bootstrap: [HdPopconfirmComponent]\n})\nexport class HdPopconfirmModule {\n}\n","import { Component, OnInit, Input, SimpleChange } from \"@angular/core\";\nimport { statusToColor } from \"./hd-status.service\";\n\n@Component({\n selector: \"hd-status\",\n templateUrl: \"./hd-status.component.html\",\n styleUrls: [\"./hd-status.component.less\"],\n})\nexport class HdStatusComponent implements OnInit {\n @Input() status: string;\n statusColor: string;\n\n constructor() {}\n\n ngOnInit() {\n this.setStatusColor();\n }\n\n ngOnChanges() {\n this.setStatusColor();\n }\n\n setStatusColor() {\n let findKey = \"\";\n const statusLower = this.status && this.status.toLowerCase();\n for (const key in statusToColor) {\n if (\n statusLower &&\n statusToColor[key].some(\n (item) => item && item.toLowerCase() === statusLower,\n )\n ) {\n findKey = key; \n }\n }\n this.statusColor = findKey || \"#9FA4A2\";\n }\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdStatusComponent } from \"./hd-status.component\";\n\n@NgModule({\n declarations: [\n HdStatusComponent,\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgZorroAntdModule,\n ],\n exports: [HdStatusComponent],\n providers: [],\n bootstrap: [HdStatusComponent]\n})\nexport class HdStatusModule {\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class CommonSessionService {\n putSession(session_key: string, session: any) {\n if (session) {\n window.sessionStorage.setItem(session_key, JSON.stringify(session));\n } else {\n window.sessionStorage.removeItem(session_key);\n }\n }\n\n getSession(session_key: string): any {\n return JSON.parse(window.sessionStorage.getItem(session_key));\n }\n\n removeSession(session_key: string) {\n window.sessionStorage.removeItem(session_key);\n }\n}\n","export const ColWidth = {\n tableImageColWidth: 25, // 表格小图标宽度\n tableTwoImageColWidth: 40, // 表格小图标宽度\n billNumberColWidth: 150, // 单据单号列宽度\n nameColWidth: 150, // 基本资料名称列宽度\n codeColWidth: 100, // 基本资料代码列宽度\n codeNameColWidth: 200, // 用于门店、货主、供应商以“[code]name“格式展示时固定宽度\n enumColWidth: 100, // 枚举列宽度\n dateColWidth: 100, // 单个日期\n dateTimeColWidth: 150, // 单个日期带时间\n dateRangeWidth: 200, // 日期范围\n operateColWidth: 150, // 操作列宽度\n numberColWidth: 100, // 数字列\n remarkColWidth: 250, // 备注列\n fixColWidth: 150, // 不属于以上内容的列统一使用该宽度,增加超长省略\n maxColWidth: 350 // 用于展示订单内容,需要缩略、展开显示的列\n};\n","\n// 表格行\nexport class HdTableColumn {\n title: string; // 列名\n name: string | Function = null; // 字段名\n render?: (value: any) => string; // 渲染函数\n width?: number; // 列宽\n color?: string; // 颜色\n align?: 'right' | 'left' | 'center' = 'left';\n click?: (value: any) => void;\n fixed?: 'left' | 'right' = null;\n fixedWidth?: number; // 固定列宽度\n btnList?: Array<OperateBtn> = [];\n isShow?: boolean = true;\n canSort?: boolean = false; // 是否可以排序\n canWarp?: boolean = false; // 用于某一列需要个性化的场景,当为true时,且表格选项showOperateColWarpButton为true时,通过按钮控制对应的列是否换行\n minWidth?: number; // 最小宽度,保证列名能正常显示\n stateField?: string; // 状态列取值字段,默认取 state\n isState?: boolean; // 是否按状态列渲染,取值字段为 name\n}\n\nexport class OperateBtn {\n name: string;\n showConfirm?: boolean = false;\n isRepeat?: boolean = false; // 是否和别的按钮有显示冲突,譬如:开启,关闭需要再关闭按钮加一个这个属性\n click?: (value: any) => void;\n permission?: (value: any) => boolean;\n}\n\nexport class HdTableTotalOption {\n columnNumber: number; // 总列数\n insertIndex: number; // 插入下标\n insertName: string; // 插入字段\n}\n\nexport class TableCacheOption {\n pageSize: number;\n colWidths: Map<string, number> = new Map<string, number>(); // name -> width\n cols: Array<string>; // ['title']\n}\n\n// 设置列 树组件对象\nexport class TreeGrid {\n title: string = '';\n key: string = '';\n disabled?: boolean = false;\n checked?: boolean = false;\n selectable?: boolean = false;\n isLeaf?: boolean = true;\n expanded?: boolean = false;\n}","import {\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnInit,\n Output,\n SimpleChange,\n TemplateRef,\n} from \"@angular/core\";\nimport * as localforage from \"localforage\";\nimport {\n InputBoolean,\n NzFormatBeforeDropEvent,\n NzFormatEmitEvent,\n} from \"ng-zorro-antd/core\";\nimport { NzResizeEvent } from \"ng-zorro-antd/resizable\";\nimport { Observable, of } from \"rxjs\";\nimport { delay } from \"rxjs/operators\";\nimport { ColWidth } from \"../model/colWidth\";\nimport { Page } from \"../model/common-type\";\nimport { CommonSessionService } from \"../service/common-session.service\";\nimport {\n HdTableColumn,\n HdTableTotalOption,\n TableCacheOption,\n TreeGrid,\n} from \"./hd-table.service\";\n@Component({\n selector: \"hd-table\",\n templateUrl: \"./hd-table.component.html\",\n styleUrls: [\"./hd-table.component.less\"],\n})\nexport class HdTableComponent implements OnInit {\n @Input() uuid: string;\n @Input() tableCols: Array<HdTableColumn> = [];\n @Input() tableData: Page<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() showOperateColWarpButton: boolean = false;\n @Input() selectField: string = \"billNumber\";\n // 合计区域\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<HdTableTotalOption>;\n @Output() sortEvent = new EventEmitter();\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n @Input() tableLoading: boolean = false;\n // 表格分页参数\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 10;\n @Input() isFirstEntrySearch: boolean;\n @Input() isCrossPageSelect: boolean;\n @Output() tablePageIndexChange = new EventEmitter<any>();\n @Output() tablePageSizeChange = new EventEmitter<any>();\n @Output() tablePageSizeChangeEvent = new EventEmitter<any>();\n @ContentChild(\"tableTotal\", { static: false }) tableTotal: TemplateRef<any>;\n @ContentChild(\"tableLeftButton\", { static: false })\n tableLeftButton: TemplateRef<any>;\n @ContentChild(\"tableRightButton\", { static: false })\n tableRightButton: TemplateRef<any>;\n scroll = null;\n\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n // 合计参数\n tableTotalOptionList = [];\n private textWidthCache: { [key: string]: number } = {};\n // 缓存信息\n tableCacheOption: TableCacheOption = new TableCacheOption();\n userSession: any;\n\n tableColsCache: Array<HdTableColumn> = [];\n showTable: boolean = false;\n selectColListNodes: Array<TreeGrid> = [];\n selectColListNodesCache: Array<TreeGrid> = [];\n showListNodes: boolean = false;\n\n isDropdownVisible: boolean = false;\n // 设置列的可见操作数组\n nowListNodes: Array<TreeGrid> = [];\n // 设置列的不可见操作数组\n hideListNodes: Array<TreeGrid> = [];\n\n // 点击时需要有临时数组存放两个tree,用于取消时候恢复调整前的状态\n cancelNowListNodes: Array<TreeGrid> = [];\n cancelHideListNodes: Array<TreeGrid> = [];\n showDetail: boolean = false;\n localforage: any = null;\n localtionTmp: string = \"\";\n isFirstEntrySearchLocal: boolean = true;\n isCrossPageSelectLocal: boolean = false;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private commonSessionService: CommonSessionService,\n ) {\n this.localforage = localforage.createInstance({\n driver: localforage.INDEXEDDB,\n name: \"hd-fscm\", // 设置存储库的名称\n version: 1.0, // 设置存储库的版本\n storeName: \"hd-fscm-store\", // 设置存储库的存储空间名称\n });\n }\n\n ngOnInit(): void {\n if (this.isFirstEntrySearch === false) {\n this.isFirstEntrySearchLocal = this.isFirstEntrySearch;\n }\n if (this.isCrossPageSelect === true) {\n this.isCrossPageSelectLocal = this.isCrossPageSelect;\n }\n this.localtionTmp = location.pathname;\n if (this.localtionTmp) {\n this.localtionTmp = this.localtionTmp.replace(/\\//g, \"_\");\n }\n this.userSession = this.commonSessionService.getSession(\n \"__jy_authorization_session__\",\n );\n // 用于开发环境调试\n if (!this.userSession) {\n this.userSession = {\n userCode: \"dev\",\n };\n }\n\n this.deleteHideItem();\n if (!this.tableCols || this.tableCols.length === 0) {\n return;\n }\n\n this.localforage\n .ready()\n .then(() => {\n this.getInitLocalforage();\n })\n .catch(function (e) {\n console.log(\"localforage加载异常step1\", e);\n throw \"localforage加载异常\";\n });\n }\n\n ngOnChanges(changes: SimpleChange) {\n // 数据改变时,重置勾选状态\n if (\n changes &&\n changes[\"tableData\"] &&\n changes[\"tableData\"][\"currentValue\"] &&\n changes[\"tableData\"][\"previousValue\"]\n ) {\n if (\n changes[\"tableData\"][\"currentValue\"][\"pageSize\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageSize\"] ||\n changes[\"tableData\"][\"currentValue\"][\"pageNumber\"] !==\n changes[\"tableData\"][\"previousValue\"][\"pageNumber\"]\n ) {\n return;\n }\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n if (\n changes[\"tableCols\"] &&\n JSON.stringify(changes[\"tableCols\"].currentValue) !==\n JSON.stringify(changes[\"tableCols\"].previousValue) &&\n changes[\"tableCols\"].previousValue !== undefined\n ) {\n this.deleteHideItem();\n if (!this.tableCols || this.tableCols.length === 0) {\n return;\n }\n this.localforage\n .ready()\n .then(() => {\n this.getInitLocalforage();\n })\n .catch(function (e) {\n console.log(\"localforage加载异常step2\", e);\n throw \"localforage加载异常\";\n });\n }\n }\n\n deleteHideItem() {\n // 首先把isShow为false数据剔除掉\n this.tableCols = this.tableCols.filter((item) => {\n // 如果对象没有 isShow 属性,则默认为 true,保留该对象\n if (!item.hasOwnProperty(\"isShow\")) {\n return true;\n }\n // 如果对象有 isShow 属性,则检查其值是否为 true\n return item.isShow === true;\n });\n }\n\n sort(sort: { key: string; value: string }) {\n this.sortEvent.emit(sort);\n }\n\n getInitLocalforage() {\n // 首先获取当前hd-table存储的数据 如果没有,则初始化下当前的数据\n this.localforage\n .getItem(\n \"hd-table_\" +\n this.userSession.userCode +\n \"_\" +\n this.localtionTmp +\n \"_\" +\n this.uuid,\n )\n .then((value: TableCacheOption) => {\n if (value) {\n this.tableCacheOption = value;\n this.normalizeTableCacheOption();\n if (\n this.tableCacheOption.pageSize &&\n this.tableCacheOption.pageSize > 10\n ) {\n this.tablePageSize = this.tableCacheOption.pageSize;\n this.tablePageSizeChange.emit(this.tablePageSize);\n }\n } else {\n this.tableCacheOption = new TableCacheOption();\n this.tableCacheOption.pageSize = this.tablePageSize;\n }\n if (this.isFirstEntrySearchLocal) {\n this.tablePageSizeChangeEvent.emit(this.tablePageSize);\n } else {\n this.isFirstEntrySearchLocal = true;\n }\n this.initTable();\n })\n .catch((err) => {\n this.tableCacheOption = new TableCacheOption();\n this.tableCacheOption.pageSize = this.tablePageSize;\n this.initTable();\n });\n }\n\n initTable() {\n this.showTable = false;\n if (!this.uuid) {\n throw \"hd-table缺失uuid参数,请使用编辑器插件生成并给hd-table赋予uuid属性\";\n }\n if (this.judgeRepeatCols()) {\n this.dealCols();\n this.setCols();\n this.dealScroll();\n this.dealOperateBtn();\n this.showTable = true;\n }\n }\n\n // 设置列点击取消\n cancelDropdown(): void {\n this.isDropdownVisible = false;\n this.hideListNodes = JSON.parse(JSON.stringify(this.cancelHideListNodes));\n this.nowListNodes = JSON.parse(JSON.stringify(this.cancelNowListNodes));\n }\n\n // 点击触发设置列\n confirmDropdown(): void {\n // 临时存放下,取消的时候恢复原来的状态 深拷贝下对象数组\n this.cancelHideListNodes = JSON.parse(JSON.stringify(this.hideListNodes));\n this.cancelNowListNodes = JSON.parse(JSON.stringify(this.nowListNodes));\n this.isDropdownVisible = true;\n }\n\n submitGrids() {\n this.tableCacheOption.cols = [];\n this.nowListNodes.forEach((item) => {\n this.tableCacheOption.cols.push(item.title);\n });\n this.saveTableCacheOption();\n this.initTable();\n this.isDropdownVisible = false;\n }\n\n // 从缓存设置列\n setCols() {\n this.showListNodes = false;\n this.nowListNodes = [];\n this.hideListNodes = [];\n if (this.hasColsCache()) {\n let { notIncols, incols } = this.tableColsCache.reduce(\n (acc, item) => {\n if (this.tableCacheOption.cols.includes(item.title)) {\n acc.incols.push(item);\n } else {\n acc.notIncols.push(item);\n }\n return acc;\n },\n { notIncols: [], incols: [] },\n );\n incols.sort((a, b) => {\n return (\n this.tableCacheOption.cols.indexOf(a.title) -\n this.tableCacheOption.cols.indexOf(b.title)\n );\n });\n this.tableCols = incols.concat(notIncols);\n }\n\n this.tableCols.forEach((element, index) => {\n if (this.hasColsCache()) {\n element.isShow = this.tableCacheOption.cols.includes(element.title)\n ? true\n : false;\n if (element.isShow) {\n this.nowListNodes.push({\n title: element.title,\n key: element.title,\n disabled: element.fixed ? true : false,\n // selectable: false,\n checked: this.tableCacheOption.cols.includes(element.title)\n ? true\n : false,\n });\n } else {\n this.hideListNodes.push({\n title: element.title,\n key: element.title,\n disabled: element.fixed ? true : false,\n // selectable: false,\n checked: this.tableCacheOption.cols.includes(element.title)\n ? true\n : false,\n });\n }\n } else {\n element.isShow = true;\n this.nowListNodes.push({\n title: element.title,\n key: element.title,\n checked: true,\n // selectable: false,\n disabled: element.fixed ? true : false,\n });\n }\n });\n\n // 调整列宽为缓存宽度\n if (\n this.tableCacheOption &&\n this.tableCacheOption.colWidths &&\n this.tableCacheOption.colWidths.size !== 0\n ) {\n this.tableCols.forEach((col) => {\n if (this.tableCacheOption.colWidths.has(col.title)) {\n col.width = this.tableCacheOption.colWidths.get(col.title);\n }\n });\n }\n\n this.dealCols();\n setTimeout(() => {\n this.showListNodes = true;\n }, 0);\n }\n\n // 拖拽操作\n beforeDrop = (arg: NzFormatBeforeDropEvent): Observable<boolean> => {\n if (\n arg.node.origin.disabled ||\n !arg.dragNode.origin.checked ||\n arg.pos === 0\n ) {\n return of(false);\n } else {\n let node: TreeGrid = new TreeGrid();\n node.checked = arg.dragNode.origin.checked;\n node.disabled = arg.dragNode.origin.disabled;\n node.expanded = arg.dragNode.origin.expanded;\n node.isLeaf = arg.dragNode.origin.isLeaf;\n node.key = arg.dragNode.origin.key;\n node.selectable = arg.dragNode.origin.selectable;\n node.title = arg.dragNode.origin.title;\n // 拖拽元素下标\n let dragNodeIndex = this.nowListNodes.findIndex((item) => {\n return item.title == arg.dragNode.origin.title;\n });\n // 目标位置的下标\n let nodeIndex =\n this.nowListNodes.findIndex((item) => {\n return item.title == arg.node.origin.title;\n }) + (arg.pos === -1 ? 0 : arg.pos);\n this.nowListNodes.splice(nodeIndex, 0, node);\n this.nowListNodes.splice(\n nodeIndex >= dragNodeIndex ? dragNodeIndex : dragNodeIndex + 1,\n 1,\n );\n return of(true).pipe(delay(100));\n }\n };\n\n moveElementNearby(arr, elementToMoveTitle, targetElementTitle, pos) {\n const tmpArray = JSON.parse(JSON.stringify(arr));\n const targetIndex = tmpArray.findIndex(\n (item) => item.title === targetElementTitle,\n );\n const elementIndex = tmpArray.findIndex(\n (item) => item.title === elementToMoveTitle,\n );\n const newIndex = pos < 0 ? targetIndex + pos : targetIndex;\n // 移除目标元素,并插入到新的位置\n const removedElement = tmpArray.splice(elementIndex, 1);\n tmpArray.splice(newIndex + 1, 0, removedElement[0]);\n return tmpArray;\n }\n\n // 勾选操作\n checkAction(event: NzFormatEmitEvent): void {\n // 勾选只有在hideListNodes,取消勾选只有在nowListNodes\n if (event.node.origin.checked) {\n let node: TreeGrid = new TreeGrid();\n node = this.hideListNodes.find((item) => {\n return item.title === event.node.origin.title;\n });\n node.checked = true;\n // 找到第一个fixed属性为right的title,找到插入元素的位置\n let title = null;\n for (let i = this.tableColsCache.length - 1; i >= 0; i--) {\n if (this.tableColsCache[i].fixed === \"right\") {\n title = this.tableColsCache[i].title;\n break;\n }\n }\n let temporaryNodeList = this.nowListNodes.slice(0);\n if (!title) {\n temporaryNodeList.push(node);\n } else {\n const index = this.nowListNodes.findIndex(\n (node) => node.title === title,\n );\n temporaryNodeList.splice(index, 0, node);\n }\n this.nowListNodes = temporaryNodeList;\n this.hideListNodes = this.hideListNodes.filter((item) => {\n return item.title !== event.node.origin.title;\n });\n } else {\n // if (this.hideListNodes.length === 0 && this.tableCacheOption && this.tableCacheOption.cols) {\n // this.hideListNodes = this.getHideListNodes();\n // }\n let temporaryNodeList = this.hideListNodes.slice(0);\n this.nowListNodes.forEach((item) => {\n if (item.title === event.node.origin.title) {\n const innerItem = JSON.parse(JSON.stringify(item));\n innerItem.checked = false;\n temporaryNodeList.push(innerItem);\n }\n });\n this.hideListNodes = temporaryNodeList;\n\n // 为了防止未选择的数组顺序因为push方法而改变,通过初始数据获取显示的字段列表\n this.nowListNodes = this.nowListNodes.filter((item) => {\n return item.title !== event.node.origin.title;\n });\n }\n }\n\n // 防止未选择的数组顺序因为push方法而改变,从初始数据获取隐藏未显示的字段列表\n getHideListNodes(): Array<TreeGrid> {\n let temporaryNodeList: Array<TreeGrid> = [];\n // 从tableColsCache里面找没有在storage里面出现的字段,组成hideList\n this.tableColsCache.forEach((item) => {\n if (!this.tableCacheOption.cols.includes(item.title)) {\n let nodeItem: TreeGrid = new TreeGrid();\n nodeItem.title = item.title;\n nodeItem.key = item.title;\n nodeItem.disabled = item.fixed ? true : false;\n nodeItem.checked = false;\n temporaryNodeList.push(nodeItem);\n }\n });\n return temporaryNodeList;\n }\n\n dealCols() {\n if (!this.tableCols[0].minWidth) {\n this.tableCols.forEach((item) => {\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = item.title;\n document.body.appendChild(span);\n item.minWidth = span.offsetWidth + 16;\n span.style.display = \"none\";\n document.body.removeChild(span);\n });\n }\n // 处理左右吸附的数据在数组中的位置\n const leftFixedCols = this.tableCols.filter((col) => col.fixed === \"left\");\n const rightFixedCols = this.tableCols.filter(\n (col) => col.fixed === \"right\",\n );\n const normalCols = this.tableCols.filter((col) => !col.fixed);\n const resultCols = leftFixedCols.concat(normalCols).concat(rightFixedCols);\n this.tableCols = resultCols;\n if (!this.tableColsCache || this.tableColsCache.length === 0) {\n // 缓存一下表格的数据\n this.tableColsCache = [...this.tableCols];\n }\n }\n\n normalizeTableCacheOption() {\n if (!this.tableCacheOption.colWidths) {\n this.tableCacheOption.colWidths = new Map<string, number>();\n } else if (!(this.tableCacheOption.colWidths instanceof Map)) {\n const colWidths = new Map<string, number>();\n Object.keys(this.tableCacheOption.colWidths).forEach((key) => {\n colWidths.set(key, (this.tableCacheOption.colWidths as any)[key]);\n });\n this.tableCacheOption.colWidths = colWidths;\n }\n }\n\n private hasColsCache(): boolean {\n return !!(this.tableCacheOption && this.tableCacheOption.cols && this.tableCacheOption.cols.length > 0);\n }\n\n saveTableCacheOption() {\n this.localforage.setItem(\n \"hd-table_\" +\n this.userSession.userCode +\n \"_\" +\n this.localtionTmp +\n \"_\" +\n this.uuid,\n this.tableCacheOption,\n );\n }\n\n judgeRepeatCols() {\n for (let i = 0; i < this.tableCols.length; i++) {\n for (let j = i + 1; j < this.tableCols.length; j++) {\n if (this.tableCols[i].title === this.tableCols[j].title) {\n throw `hd-table组件中列名 ${this.tableCols[i].title} 重复`;\n }\n }\n }\n return true;\n }\n\n onResize({ width }: NzResizeEvent, col: HdTableColumn): void {\n this.normalizeTableCacheOption();\n let tempWidth = 0;\n if (width > col.minWidth) {\n tempWidth = width;\n } else {\n tempWidth = col.minWidth;\n }\n this.tableCacheOption.colWidths.set(col.title, tempWidth);\n this.saveTableCacheOption();\n this.tableCols = this.tableCols.map((e) =>\n e.title === col.title ? { ...e, width: tempWidth } : e,\n );\n this.dealScroll();\n }\n\n dealOperateBtn() {\n let operateCol = this.tableCols.find((col) => col.title === \"操作\") || null;\n if (operateCol) {\n let textStr = \"\";\n operateCol.btnList.forEach((btn) => {\n if (!btn.isRepeat) {\n textStr += btn.name;\n }\n });\n\n const span = document.createElement(\"a\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = textStr;\n document.body.appendChild(span);\n operateCol.width =\n span.offsetWidth +\n (operateCol.btnList.filter((item) => !item.isRepeat).length - 1) * 4 +\n 16;\n span.style.display = \"none\";\n document.body.removeChild(span);\n }\n }\n\n triggerEvent(fn: any, event: any) {\n if (fn) {\n fn(event);\n }\n }\n\n dealScroll() {\n let colWidth = 0;\n if (this.showSelected) {\n colWidth += 40;\n }\n this.tableCols.forEach((item) => {\n if (!item.width) {\n item.width = ColWidth.fixColWidth;\n }\n if (item.isShow) {\n item.fixedWidth = colWidth;\n colWidth += item.width;\n }\n });\n\n if (this.tableTotal) {\n this.scroll = {\n x: \"1px\",\n y: \"calc(100vh - 180px)\",\n };\n } else {\n this.scroll = {\n x: \"1px\",\n y: \"calc(100vh - 140px)\",\n };\n }\n }\n\n isTextOverflow(text: string, maxWidth: number): boolean {\n const cachedWidth = this.textWidthCache[text];\n if (cachedWidth !== undefined) {\n return cachedWidth + 15 >= maxWidth;\n }\n\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n span.style.position = \"absolute\";\n span.style.whiteSpace = \"nowrap\";\n span.style.fontSize = \"14px\";\n span.style.display = \"inline-block\"; // 将样式修改为 inline-block\n span.innerText = text;\n document.body.appendChild(span);\n const isOverflow = span.offsetWidth + 15 >= maxWidth;\n this.textWidthCache[text] = span.offsetWidth;\n span.style.display = \"none\";\n document.body.removeChild(span);\n return isOverflow;\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n if (!this.isCrossPageSelectLocal) {\n this.resetStatus();\n }\n }\n\n search(reset: boolean) {\n this.tableCacheOption.pageSize = this.tablePageSize;\n this.saveTableCacheOption();\n if (reset) {\n this.tablePageSizeChange.emit(this.tablePageSize);\n this.tablePageSizeChangeEvent.emit(this.tablePageSize);\n } else {\n this.tablePageIndexChange.emit(this.tablePageIndex);\n // 触发父组件查询事件\n this.tableSearchEvent.emit(reset);\n }\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] &&\n (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] &&\n delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n );\n this.isIndeterminate =\n this.listOfDisplayData.some(\n (item) => this.mapOfCheckedId[item[this.selectField]],\n ) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n const selectedList: Array<any> = Object.values(this.mapOfCheckList);\n this.selectEvent.emit(selectedList);\n }\n // 如果数据为空,则清空勾选标识\n if (this.tableData.content.length === 0) {\n this.isAllDisplayDataChecked = false;\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach((item) => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] &&\n (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] &&\n delete this.mapOfCheckList[item[this.selectField]];\n }\n\n this.mapOfCheckedId[item[this.selectField]] = value;\n });\n this.refreshStatus();\n }\n\n judgeColEmpty(str: any) {\n if (str || str === 0) {\n return str;\n } else {\n return \"<空>\";\n }\n }\n\n getStateField(col: HdTableColumn): string {\n if (col.isState) {\n return col.name as string;\n }\n return col.stateField || 'state';\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { NzDropDownModule } from 'ng-zorro-antd/dropdown';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\nimport { NzResizableModule } from 'ng-zorro-antd/resizable';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { NzToolTipModule } from 'ng-zorro-antd/tooltip';\nimport { NzTreeModule } from 'ng-zorro-antd/tree';\nimport { HdButtonGroupModule } from '../hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\nimport { HdStatusModule } from '../hd-status/hd-status.module';\nimport { CommonSessionService } from '../service/common-session.service';\nimport { HdTableComponent } from './hd-table.component';\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n HdSpaceModule,\n HdStatusModule,\n HdButtonModule,\n HdButtonGroupModule,\n NzToolTipModule,\n NzPopconfirmModule,\n NzResizableModule,\n NzDropDownModule,\n NzTreeModule,\n NzIconModule\n ],\n declarations: [HdTableComponent],\n providers: [CommonSessionService],\n exports: [HdTableComponent],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class HdTableModule { }\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'hd-tip',\n templateUrl: './hd-tip.component.html',\n styleUrls: ['./hd-tip.component.less']\n})\nexport class HdTipComponent implements OnInit {\n @Input() showIcon: boolean = true;\n @Input() fontSize: number;\n @Input() title: string;\n constructor() { }\n\n ngOnInit() {\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdTipComponent } from './hd-tip.component';\nimport {NgZorroAntdModule} from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule\n ],\n exports: [HdTipComponent],\n declarations: [HdTipComponent]\n})\nexport class HdTipModule { }\n","import { HdButtonGroupModule } from './hd-button-group/hd-button-group.module';\nimport { HdButtonModule } from './hd-button/hd-button.module';\n\nimport { HdDetailFormModule } from './hd-detail-form/hd-detail-form.module';\nimport { HdDetailLinesModule } from './hd-detail-lines/hd-detail-lines.module';\nimport { HdDetailLinesPageModule } from './hd-detail-lines-page/hd-detail-lines-page.module';\nimport { HdDetailTipModule } from './hd-detail-tip/hd-detail-tip.module';\n\nimport { HdFilterModule } from './hd-filter/hd-filter.module';\nimport { HdFormLinesModule } from './hd-form-lines/hd-form-lines.module';\nimport { HdFormModule } from './hd-form/hd-form.module';\n\nimport { NgModule } from '@angular/core';\nimport { HdCurrentTableModule } from './hd-current-table/hd-current-table.module';\nimport { HdLogModule } from './hd-log/hd-log.module';\nimport { HdPopconfirmModule } from './hd-popconfirm/hd-popconfirm.module';\nimport { HdSpaceModule } from './hd-space/hd-space.module';\nimport { HdStatusModule } from './hd-status/hd-status.module';\nimport { HdTableModule } from './hd-table/hd-table.module';\nimport { HdTipModule } from './hd-tip/hd-tip.module';\n@NgModule({\n exports: [\n HdButtonModule,\n HdButtonGroupModule,\n\n HdDetailFormModule,\n HdDetailLinesModule,\n HdDetailLinesPageModule,\n HdDetailTipModule,\n\n HdFilterModule,\n HdFormModule,\n HdFormLinesModule,\n\n HdSpaceModule,\n HdStatusModule,\n HdCurrentTableModule,\n HdTableModule,\n HdTipModule,\n HdPopconfirmModule,\n HdLogModule\n ]\n})\n\nexport class HdComponentModule {\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdComponentModule } from \"./hd-component.module\";\nimport { HdLogComponent } from './hd-log/hd-log.component';\n@NgModule({\n imports: [CommonModule],\n exports: [HdComponentModule],\n providers: [],\n entryComponents: [HdLogComponent]\n})\nexport class FantasyNgzorroModule { }\n","import { HdOption } from \"../model/common-type\";\n\n// 表格行\nexport class TableColumn {\n label: string; // 文本\n name: string; // 字段名称\n value?: string | boolean | Array<string | Date> | null = null; // 值 不传默认为null\n selectList?: Array<HdOption>; // 控件为Select时,选项列表\n // 组件内部成员\n show?: boolean;\n}\n\n//\nexport class TableTotalOption {\n columnNumber: number; // 总列数\n insertIndex: number; // 插入下标\n insertName: string; // 插入字段\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdDetailFormService {\n\n constructor() { }\n\n}\n","export class TotalOption {\n insertIndex: number; // 插入下标\n insertValue: any; // 插入值\n align?: string; // 靠左还是靠右\n showDecimal?: boolean; // 是否显示小数位\n isHide?: boolean; // 是否隐藏, 这里只针对列会同步消失的场景\n}\n","import { Injectable } from '@angular/core';\nimport { SelectOption, CascaderOption, InputNumber } from '../model/common-type';\n\n// 控件列表\nexport class Filter {\n type: FilterListType;\n label: string; // 文本\n name: string; // 字段名称\n placeholder?: string; // 输入框提示文案\n value?: string | boolean | number | Array<string | Date> | null = null; // 值 不传默认为null\n // 组件内部成员\n show?: boolean;\n selectOption?: SelectOption; // 控件为Select时,选项列表\n inputNumber?: InputNumber = new InputNumber(); // number组件的min、max、step\n onSearchEvent?: Function; // select选择器搜索事件 可用于更新备选集合\n onChangeEvent?: Function; // 控件的值改变事件 可用于控件间联动\n onBlurEvent?: Function; // 控件失去焦点事件\n hdDisabledDate?: Function; // date-picker组件不可选择的日期\n showTime?: boolean = false; // 日期选择器是否包含时间\n require?: boolean = false; // 是否必填\n cascaderOption?: CascaderOption; // 级联选择器配置\n onChangeEventDebounceTime?: number; // change事件防抖\n onSearchEventEventDebounceTime?: number; // search事件防抖\n}\n\n\n// 控件类型\nexport enum FilterListType {\n Input, // 输入框\n Select, // 单项选择器\n Date, // 单个日期选择\n DateRange, // 日期范围选择\n MultipleSelect, // 多选\n Cascader, // 级联选择\n Month, // 月份选择\n InputNumber // 数字输入\n}\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdFilterService {\n\n constructor() {\n }\n\n}\n","import { FormItem } from './hd-form/hd-form.service';\nimport { round } from 'lodash';\n// 工具类\nexport const Utils = {\n /**\n * 填充select控件选项\n * @param formList 入参数组 Array<any>\n * @param name 需要填充options的属性名称\n * @param options 选项列表\n */\n fillSelectOption(formList: Array<any>, name: string, options: Array<any>) {\n const returnData = formList;\n if (!returnData || !returnData.length) {\n return returnData;\n }\n const length = formList.length;\n for (let i = 0; i < length; i++) {\n if (returnData[i].name === name) {\n returnData[i].selectOption.selectList = options;\n }\n }\n return returnData;\n },\n\n /**\n * 填充FormItem数组:针对入参list的每一个FormItem,判断obj中是否有对应的name字段,如果有,则填充value。\n * @param list 入参数组 Array<FormItem>\n * @param obj 需要填充到list的属性\n */\n fillArrayFormItem(list: Array<FormItem>, obj: Object) {\n const returnData = [];\n if (!list || !list.length) {\n return returnData;\n }\n const length = list.length;\n for (let i = 0; i < length; i++) {\n if (obj[list[i].name]) {\n list[i].value = obj[list[i].name];\n }\n }\n return list;\n },\n\n /**\n * 数组转换成选择器的选项数组\n * @param list 入参数组 字符串数组或对象数组\n * @param option 转换选项\n * 注:list为字符串数组,option不需要传,按照标准的label、value转换\n */\n arrayToSelectOptionList(list: Array<any>, option?: {\n value: string,\n label: string,\n valueTip?: string,\n labelTip?: string\n }) {\n const returnData = [];\n if (!list || !list.length) {\n return returnData;\n }\n if (option) {\n if (option.labelTip && option.valueTip) {\n list.forEach((item) => {\n const returnItem: any = item;\n returnItem.label = item[option.label];\n returnItem.value = item[option.value];\n if (option.valueTip) {\n returnItem[option.valueTip] = item[option.value];\n }\n if (option.labelTip) {\n returnItem[option.labelTip] = item[option.label];\n }\n returnData.push(returnItem);\n });\n } else {\n list.forEach((item) => {\n const returnItem: any = item;\n returnItem.label = item[option.label];\n returnItem.value = item[option.value];\n returnData.push(returnItem);\n });\n }\n } else {\n list.forEach((item) => {\n const returnItem: any = {};\n returnItem.label = item;\n returnItem.value = item;\n returnData.push(returnItem);\n });\n }\n return returnData;\n },\n\n /**\n * 求和\n * @param nums 数组\n * @param precision 精度\n */\n add(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n let result = 0;\n for (const num of nums) {\n result += num;\n }\n return round(result, precision);\n },\n\n /**\n * 减法\n * @param nums 数组\n * @param precision 精度\n */\n subtract(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n if (nums.length < 2) {\n throw new Error('减法入参数量至少要2个!');\n }\n let result = nums.shift();\n for (const num of nums) {\n result -= num;\n }\n return round(result, precision);\n },\n\n /**\n * 乘法\n * @param nums 数组\n * @param precision 精度\n */\n multiply(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n let result = 1;\n for (const num of nums) {\n result = result * num;\n }\n return round(result, precision);\n },\n\n /**\n * 除法\n * @param nums 数组\n * @param precision 精度\n */\n divide(nums: number[], precision: number = 2) {\n if (!Array.isArray(nums)) {\n throw new Error('参数必须是数组');\n }\n if (nums.some(num => typeof num !== 'number')) {\n throw new Error('数组元素必须是数字');\n }\n if (nums.length < 2) {\n throw new Error('除法入参数量至少要2个!');\n }\n let result = nums.shift();\n for (const num of nums) {\n if (num === 0) {\n throw new Error('除数不能为0!');\n }\n result = result / num;\n }\n return round(result, precision);\n }\n};\n","export const StaticConst = {\n MaxPageSize: 99999999\n};\n"]}
|