fantasy-ngzorro 2.0.7 → 2.0.8
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 +51 -2
- package/bundles/fantasy-ngzorro.umd.js.map +1 -1
- package/bundles/fantasy-ngzorro.umd.min.js +1 -1
- package/bundles/fantasy-ngzorro.umd.min.js.map +1 -1
- package/esm2015/hd-form/hd-form.component.js +41 -3
- package/esm5/hd-form/hd-form.component.js +52 -3
- package/fantasy-ngzorro.metadata.json +1 -1
- package/fesm2015/fantasy-ngzorro.js +40 -2
- package/fesm2015/fantasy-ngzorro.js.map +1 -1
- package/fesm5/fantasy-ngzorro.js +51 -2
- package/fesm5/fantasy-ngzorro.js.map +1 -1
- package/hd-form/hd-form.component.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/tslib/tslib.es6.js","ng://fantasy-ngzorro/hd-button-group/hd-button-group.component.ts","ng://fantasy-ngzorro/hd-button-group/hd-button-group.module.ts","ng://fantasy-ngzorro/hd-button/hd-button.service.ts","ng://fantasy-ngzorro/hd-button/hd-button.component.ts","ng://fantasy-ngzorro/hd-button/hd-button.module.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.component.ts","ng://fantasy-ngzorro/hd-detail-form/hd-detail-form.module.ts","ng://fantasy-ngzorro/hd-space/hd-space.service.ts","ng://fantasy-ngzorro/hd-space/hd-space.component.ts","ng://fantasy-ngzorro/hd-space/hd-space.module.ts","ng://fantasy-ngzorro/model/common-type.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.component.ts","ng://fantasy-ngzorro/hd-detail-lines/hd-detail-lines.module.ts","ng://fantasy-ngzorro/hd-detail-lines-page/hd-detail-lines-page.component.ts","ng://fantasy-ngzorro/hd-detail-lines-page/hd-detail-lines-page.module.ts","ng://fantasy-ngzorro/hd-status/hd-status.service.ts","ng://fantasy-ngzorro/hd-detail-tip/hd-detail-tip.component.ts","ng://fantasy-ngzorro/hd-detail-tip/hd-detail-tip.module.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.component.ts","ng://fantasy-ngzorro/hd-filter/hd-filter.module.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.service.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.component.ts","ng://fantasy-ngzorro/hd-form-lines/hd-form-lines.module.ts","ng://fantasy-ngzorro/hd-form/hd-form.service.ts","ng://fantasy-ngzorro/hd-form/hd-form.component.ts","ng://fantasy-ngzorro/hd-form/hd-form.module.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.component.ts","ng://fantasy-ngzorro/hd-current-table/hd-current-table.module.ts","ng://fantasy-ngzorro/hd-log/hd-log.component.ts","ng://fantasy-ngzorro/hd-log/hd-log.service.ts","ng://fantasy-ngzorro/hd-log/hd-log.module.ts","ng://fantasy-ngzorro/hd-popconfirm/hd-popconfirm.component.ts","ng://fantasy-ngzorro/hd-popconfirm/hd-popconfirm.module.ts","ng://fantasy-ngzorro/hd-status/hd-status.component.ts","ng://fantasy-ngzorro/hd-status/hd-status.module.ts","ng://fantasy-ngzorro/service/common-session.service.ts","ng://fantasy-ngzorro/model/colWidth.ts","ng://fantasy-ngzorro/hd-table/hd-table.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","nzColumn","xxl","xl","lg","md","sm","xs","filter","item","hide","ngOnChanges","changes","JSON","stringify","currentValue","previousValue","triggerEvent","fn","event","HdDetailFormModule","Style","HdSpaceService","HdSpaceComponent","SpaceType","background","style","HdSpaceModule","ReactiveFormsModule","totalPages","totalElements","pageNumber","pageSize","hasContent","hasNext","content","HdOption","SelectOption","showLabelAndValue","hdDropdownMatchSelectWidth","hdServerSearch","hdShowItemCode","hdShowSearch","hdAllowClear","RadioOption","CheckboxOption","SelectOptionTableColumn","SelectOptionTableColumnIcon","InputNumber","min","max","step","precision","CascaderOption","HdDetailLinesComponent","showSelected","allowDrop","showSearch","searchFields","scroll","x","selectField","selectEvent","showTotal","totalOption","columnsNumber","hdFrontPagination","totalOptionList","tableData","Page","tableLoading","tablePageIndex","tablePageSize","isAllDisplayDataChecked","isIndeterminate","listOfDisplayData","listOfAllData","mapOfCheckedId","mapOfCheckList","displayLines","isFilterData","storeFormLinesData","syncStoreFromLinesInput","applyDisplayFromStore","countSelected","calculateTotal","lines","source","data","parse","restoreFromStore","searchLines","_this","filterStr","trim","filterValue","toLowerCase","filteredData","_c","tslib_1.__values","keys","_d","toString","includes","_e","_f","selectedField","forEach","round","drop","moveItemInArray","previousIndex","currentIndex","Number","fill","insertIndex","insertValue","align","showDecimal","isHide","currentPageDataChange","$event","refreshStatus","resetStatus","every","some","values","checkAll","HdDetailLinesModule","NzTableModule","DragDropModule","schemas","NO_ERRORS_SCHEMA","HdDetailLinesPageComponent","tablePageIndexChange","tablePageSizeChange","pageChange","isCrossPageSelectLocal","isCrossPageSelect","getRowIndex","localIndex","onPageIndexChange","pageIndex","onPageSizeChange","HdDetailLinesPageModule","statusToColor","#FAB13B","#9FA4A2","#F5222D","#3B77E3","#20B95D","#F05B24","HdDetailTipComponent","HdStatusService","tip","setStatusColor","findKey","state","indexOf","toUpperCase","statusColor","HdDetailTipModule","HdFilterComponent","fb","searchEvent","resetEvent","isShowMore","filterListModular","searchSubject","Subject","debounceTimeout","searchSubscription","pipe","debounceTime","subscribe","_a","selectOption","init","checkList","filterList","formGroupList","index","name","control","show","validateFilterForm","group","onChangeEvent","onChangeEventDebounceTime","get","valueChanges","onSearchEvent","onSearchEventDebounceTime","unsubscribe","computeOffset","list","nameList","tslib_1.__spread","Set","submitForm","getRawValue","resetForm","resetFilterFormWithValue","resetValue","patchValue","getFilterData","showMore","inputClean","patchObject","FormBuilder","HdFilterModule","require","hideViewDomValue","inputNumber","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","needShowConfirm","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 @Input() nzColumn: number | { xxl?: number; xl?: number; lg?: number; md?: number; sm?: number; xs?: number } =\n { xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 };\n\n constructor() { }\n\n ngOnInit() {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n\n ngOnChanges(changes: SimpleChange) {\n if (changes['formCols'] && JSON.stringify(changes['formCols'].currentValue) !== JSON.stringify(changes['formCols'].previousValue)) {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n }\n\n triggerEvent(fn: any) {\n if (fn) {\n fn(event);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdDetailFormComponent } from './hd-detail-form.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule\n ],\n exports: [HdDetailFormComponent],\n declarations: [HdDetailFormComponent]\n})\nexport class HdDetailFormModule { }\n","import { Injectable } from '@angular/core';\n\nexport enum SpaceType {\n row = 'row',\n column = 'column'\n}\n\nexport class Style {\n background: string\n width: string\n height: string\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdSpaceService {\n\n constructor() { }\n\n}\n","import { Component, Input, OnInit, Output } from '@angular/core';\nimport { Style, SpaceType } from \"./hd-space.service\"; \n\n@Component({\n selector: 'hd-space',\n templateUrl: './hd-space.component.html',\n styleUrls: ['./hd-space.component.less']\n})\nexport class HdSpaceComponent implements OnInit {\n @Input() type: SpaceType = SpaceType.row; \n @Input() size: number; \n @Input() background: string = 'inherit'; \n\n style: Style = new Style();\n\n constructor() { }\n\n ngOnInit() {\n this.style['background'] = this.background;\n if(this.type === SpaceType.row){\n this.style['width'] = '100%';\n this.style['height'] = this.size + 'px';\n }else{\n this.style['height'] = '100%';\n this.style['width'] = this.size + 'px';\n }\n }\n\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdSpaceComponent } from './hd-space.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdSpaceComponent],\n exports: [HdSpaceComponent]\n})\nexport class HdSpaceModule { }\n","export class Page<T> {\n totalPages = 0;\n totalElements = 0;\n pageNumber = 0;\n pageSize = 10;\n hasContent = false;\n hasNext = false;\n content: Array<T> = [];\n}\n\nexport class HdOption {\n label: string;\n value: any;\n color?: string;\n hide?: boolean;\n clickText?: string;\n click?: (value: any) => void;\n}\n\nexport class SelectOption {\n label: string;\n value: string;\n selectList?: Array<any>;\n selectListName?: string;\n showLabelAndValue?: boolean = false;\n hdDropdownMatchSelectWidth?: boolean = false;\n hdServerSearch?: boolean = false;\n hdShowItemCode?: boolean = false; // 是否用[value]label显示选项列表\n tableColumns?: Array<SelectOptionTableColumn>;\n hdShowSearch?: boolean = true;\n hdAllowClear?: boolean = true;\n}\n\nexport class RadioOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class CheckboxOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class SelectOptionTableColumn {\n width: number;\n label: string; // 这里对应的是列名\n name: string; // 对应selectList里面的name值, 如果有render字段 则去render函数渲染\n icons?: Array<SelectOptionTableColumnIcon>; // 对应的图片名字\n render?: (value: any) => string;\n}\n\nexport class SelectOptionTableColumnIcon {\n iconName: string;\n fieldName: string;\n}\n\nexport class InputNumber {\n min?: number = 0;\n max?: number = 99999999;\n step?: number = 1;\n precision?: number = 4;\n nzFormatter?: Function;\n nzParser?: Function;\n}\n\nexport class CascaderOption {\n options: Array<any>;\n}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"./hd-detail-lines.service\";\n\n@Component({\n selector: \"hd-detail-lines\",\n templateUrl: \"./hd-detail-lines.component.html\",\n styleUrls: [\"./hd-detail-lines.component.less\"],\n})\nexport class HdDetailLinesComponent implements OnInit, OnChanges {\n @Input() lines: Array<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() allowDrop: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n // 不传递这个字段时默认为查询所有字段是否有匹配的\n @Input() searchFields: string[] = [];\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n @Output() selectEvent = new EventEmitter();\n @ContentChild(\"detailLineHead\", { static: false })\n detailLineHead: TemplateRef<any>;\n @ContentChild(\"detailLineBody\", { static: false })\n detailLineBody: TemplateRef<any>;\n // 合计区域\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n @Input() hdFrontPagination: boolean = false;\n totalOptionList = [];\n\n tableData: Page<any> = new Page();\n tableLoading: boolean = false;\n // 表格分页参数\n tablePageIndex: number = 1;\n 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 | ((line: any) => boolean) = false;\n isRepeat?: boolean = false; // 是否和别的按钮有显示冲突,譬如:开启,关闭需要再关闭按钮加一个这个属性\n click?: (value: any) => void;\n permission?: (value: any) => boolean;\n}\n\nexport class HdTableTotalOption {\n columnNumber: number; // 总列数\n insertIndex: number; // 插入下标\n insertName: string; // 插入字段\n}\n\nexport class TableCacheOption {\n pageSize: number;\n colWidths: Map<string, number> = new Map<string, number>(); // name -> width\n cols: Array<string>; // ['title']\n}\n\n// 设置列 树组件对象\nexport class TreeGrid {\n title: string = '';\n key: string = '';\n disabled?: boolean = false;\n checked?: boolean = false;\n selectable?: boolean = false;\n isLeaf?: boolean = true;\n expanded?: boolean = false;\n}","import {\n 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 OperateBtn,\n TableCacheOption,\n TreeGrid,\n} from \"./hd-table.service\";\n@Component({\n selector: \"hd-table\",\n templateUrl: \"./hd-table.component.html\",\n styleUrls: [\"./hd-table.component.less\"],\n})\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 needShowConfirm(btn: OperateBtn, data: any): boolean {\n if (typeof btn.showConfirm === \"function\") {\n return btn.showConfirm(data);\n }\n return !!btn.showConfirm;\n }\n\n 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"]}
|
|
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","nzColumn","xxl","xl","lg","md","sm","xs","filter","item","hide","ngOnChanges","changes","JSON","stringify","currentValue","previousValue","triggerEvent","fn","event","HdDetailFormModule","Style","HdSpaceService","HdSpaceComponent","SpaceType","background","style","HdSpaceModule","ReactiveFormsModule","totalPages","totalElements","pageNumber","pageSize","hasContent","hasNext","content","HdOption","SelectOption","showLabelAndValue","hdDropdownMatchSelectWidth","hdServerSearch","hdShowItemCode","hdShowSearch","hdAllowClear","RadioOption","CheckboxOption","SelectOptionTableColumn","SelectOptionTableColumnIcon","InputNumber","min","max","step","precision","CascaderOption","HdDetailLinesComponent","showSelected","allowDrop","showSearch","searchFields","scroll","x","selectField","selectEvent","showTotal","totalOption","columnsNumber","hdFrontPagination","totalOptionList","tableData","Page","tableLoading","tablePageIndex","tablePageSize","isAllDisplayDataChecked","isIndeterminate","listOfDisplayData","listOfAllData","mapOfCheckedId","mapOfCheckList","displayLines","isFilterData","storeFormLinesData","syncStoreFromLinesInput","applyDisplayFromStore","countSelected","calculateTotal","lines","source","data","parse","restoreFromStore","searchLines","_this","filterStr","trim","filterValue","toLowerCase","filteredData","_c","tslib_1.__values","keys","_d","toString","includes","_e","_f","selectedField","forEach","round","drop","moveItemInArray","previousIndex","currentIndex","Number","fill","insertIndex","insertValue","align","showDecimal","isHide","currentPageDataChange","$event","refreshStatus","resetStatus","every","some","values","checkAll","HdDetailLinesModule","NzTableModule","DragDropModule","schemas","NO_ERRORS_SCHEMA","HdDetailLinesPageComponent","tablePageIndexChange","tablePageSizeChange","pageChange","isCrossPageSelectLocal","isCrossPageSelect","getRowIndex","localIndex","onPageIndexChange","pageIndex","onPageSizeChange","HdDetailLinesPageModule","statusToColor","#FAB13B","#9FA4A2","#F5222D","#3B77E3","#20B95D","#F05B24","HdDetailTipComponent","HdStatusService","tip","setStatusColor","findKey","state","indexOf","toUpperCase","statusColor","HdDetailTipModule","HdFilterComponent","fb","searchEvent","resetEvent","isShowMore","filterListModular","searchSubject","Subject","debounceTimeout","searchSubscription","pipe","debounceTime","subscribe","_a","selectOption","init","checkList","filterList","formGroupList","index","name","control","show","validateFilterForm","group","onChangeEvent","onChangeEventDebounceTime","get","valueChanges","onSearchEvent","onSearchEventDebounceTime","unsubscribe","computeOffset","list","nameList","tslib_1.__spread","Set","submitForm","getRawValue","resetForm","resetFilterFormWithValue","resetValue","patchValue","getFilterData","showMore","inputClean","patchObject","FormBuilder","HdFilterModule","require","hideViewDomValue","inputNumber","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","isCheckboxChecked","current","onCheckboxItemChange","checked","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","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","needShowConfirm","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 @Input() nzColumn: number | { xxl?: number; xl?: number; lg?: number; md?: number; sm?: number; xs?: number } =\n { xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 };\n\n constructor() { }\n\n ngOnInit() {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n\n ngOnChanges(changes: SimpleChange) {\n if (changes['formCols'] && JSON.stringify(changes['formCols'].currentValue) !== JSON.stringify(changes['formCols'].previousValue)) {\n if (this.formCols && this.formCols.length > 0) {\n // 剔除掉formCols里面不需要显示的内容\n this.formCols = this.formCols.filter(item => !item.hide);\n }\n }\n }\n\n triggerEvent(fn: any) {\n if (fn) {\n fn(event);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdDetailFormComponent } from './hd-detail-form.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\n\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule\n ],\n exports: [HdDetailFormComponent],\n declarations: [HdDetailFormComponent]\n})\nexport class HdDetailFormModule { }\n","import { Injectable } from '@angular/core';\n\nexport enum SpaceType {\n row = 'row',\n column = 'column'\n}\n\nexport class Style {\n background: string\n width: string\n height: string\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class HdSpaceService {\n\n constructor() { }\n\n}\n","import { Component, Input, OnInit, Output } from '@angular/core';\nimport { Style, SpaceType } from \"./hd-space.service\"; \n\n@Component({\n selector: 'hd-space',\n templateUrl: './hd-space.component.html',\n styleUrls: ['./hd-space.component.less']\n})\nexport class HdSpaceComponent implements OnInit {\n @Input() type: SpaceType = SpaceType.row; \n @Input() size: number; \n @Input() background: string = 'inherit'; \n\n style: Style = new Style();\n\n constructor() { }\n\n ngOnInit() {\n this.style['background'] = this.background;\n if(this.type === SpaceType.row){\n this.style['width'] = '100%';\n this.style['height'] = this.size + 'px';\n }else{\n this.style['height'] = '100%';\n this.style['width'] = this.size + 'px';\n }\n }\n\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdSpaceComponent } from './hd-space.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule\n ],\n declarations: [HdSpaceComponent],\n exports: [HdSpaceComponent]\n})\nexport class HdSpaceModule { }\n","export class Page<T> {\n totalPages = 0;\n totalElements = 0;\n pageNumber = 0;\n pageSize = 10;\n hasContent = false;\n hasNext = false;\n content: Array<T> = [];\n}\n\nexport class HdOption {\n label: string;\n value: any;\n color?: string;\n hide?: boolean;\n clickText?: string;\n click?: (value: any) => void;\n}\n\nexport class SelectOption {\n label: string;\n value: string;\n selectList?: Array<any>;\n selectListName?: string;\n showLabelAndValue?: boolean = false;\n hdDropdownMatchSelectWidth?: boolean = false;\n hdServerSearch?: boolean = false;\n hdShowItemCode?: boolean = false; // 是否用[value]label显示选项列表\n tableColumns?: Array<SelectOptionTableColumn>;\n hdShowSearch?: boolean = true;\n hdAllowClear?: boolean = true;\n}\n\nexport class RadioOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class CheckboxOption {\n label: string;\n value: string;\n optionList?: Array<any>;\n showLabelAndValue?: boolean = false;\n}\n\nexport class SelectOptionTableColumn {\n width: number;\n label: string; // 这里对应的是列名\n name: string; // 对应selectList里面的name值, 如果有render字段 则去render函数渲染\n icons?: Array<SelectOptionTableColumnIcon>; // 对应的图片名字\n render?: (value: any) => string;\n}\n\nexport class SelectOptionTableColumnIcon {\n iconName: string;\n fieldName: string;\n}\n\nexport class InputNumber {\n min?: number = 0;\n max?: number = 99999999;\n step?: number = 1;\n precision?: number = 4;\n nzFormatter?: Function;\n nzParser?: Function;\n}\n\nexport class CascaderOption {\n options: Array<any>;\n}\n","import { CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\nimport {\n Component,\n ContentChild,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n} from \"@angular/core\";\nimport { round } from \"lodash\";\nimport { InputBoolean } from \"ng-zorro-antd/core\";\nimport { Page } from \"../model/common-type\";\nimport { TotalOption } from \"./hd-detail-lines.service\";\n\n@Component({\n selector: \"hd-detail-lines\",\n templateUrl: \"./hd-detail-lines.component.html\",\n styleUrls: [\"./hd-detail-lines.component.less\"],\n})\nexport class HdDetailLinesComponent implements OnInit, OnChanges {\n @Input() lines: Array<any>;\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() @InputBoolean() allowDrop: boolean = false;\n @Input() @InputBoolean() showSearch: boolean = false;\n // 不传递这个字段时默认为查询所有字段是否有匹配的\n @Input() searchFields: string[] = [];\n @Input() scroll: { [key: string]: string } = { x: \"1px\" };\n @Input() selectField: string = \"billNumber\";\n @Input() selectedField: string;\n @Output() selectEvent = new EventEmitter();\n @ContentChild(\"detailLineHead\", { static: false })\n detailLineHead: TemplateRef<any>;\n @ContentChild(\"detailLineBody\", { static: false })\n detailLineBody: TemplateRef<any>;\n // 合计区域\n @Input() @InputBoolean() showTotal: boolean = false;\n @Input() totalOption: Array<TotalOption> = [];\n @Input() columnsNumber: number | string = 0;\n @Input() hdFrontPagination: boolean = false;\n totalOptionList = [];\n\n tableData: Page<any> = new Page();\n tableLoading: boolean = false;\n // 表格分页参数\n tablePageIndex: number = 1;\n 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 isCheckboxChecked(name: string, value: any): boolean {\n const control = this.validateHdForm.get(name);\n const current = control ? control.value : null;\n return Array.isArray(current) && current.indexOf(value) !== -1;\n }\n\n onCheckboxItemChange(name: string, value: any, checked: boolean): void {\n const control = this.validateHdForm.get(name);\n if (!control) {\n return;\n }\n const current = Array.isArray(control.value) ? [...control.value] : [];\n const index = current.indexOf(value);\n if (checked && index === -1) {\n current.push(value);\n } else if (!checked && index !== -1) {\n current.splice(index, 1);\n }\n control.setValue(current);\n control.markAsDirty();\n control.updateValueAndValidity();\n }\n\n readonly inputNumberDefaultFormatter = (value: unknown) => value;\n readonly inputNumberDefaultParser = (value: string) => value;\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdFormComponent } from './hd-form.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdButtonModule } from '../hd-button/hd-button.module';\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n NgZorroAntdModule,\n HdButtonModule\n ],\n declarations: [HdFormComponent],\n exports: [HdFormComponent]\n})\nexport class HdFormModule { }\n","import { Component, ContentChild, EventEmitter, Input, OnInit, Output, SimpleChange, SimpleChanges, TemplateRef } from '@angular/core';\nimport { TableTotalOption } from './hd-current-table.service';\nimport { InputBoolean } from 'ng-zorro-antd/core';\nimport { Page } from '../model/common-type';\n\n@Component({\n selector: 'hd-current-table',\n templateUrl: './hd-current-table.component.html',\n styleUrls: ['./hd-current-table.component.less']\n})\nexport class HdCurrentTableComponent implements OnInit {\n @Input() tableData: Page<any>;\n @Input() scroll: { [key: string]: string } = { x: '1px' };\n @Input() @InputBoolean() showSelected: boolean = false;\n @Input() selectField: string = 'billNumber';\n // 合计区域\n @Input() @InputBoolean() showTableTotal: boolean = false;\n @Input() tableTotalOption: Array<TableTotalOption>;\n @Output() selectEvent = new EventEmitter();\n @Output() tableSearchEvent = new EventEmitter();\n @ContentChild(\"tableHead\", { static: false }) tableHead: TemplateRef<any>;\n @ContentChild(\"tableBody\", { static: false }) tableBody: TemplateRef<any>;\n @ContentChild(\"tableTotal\", { static: false }) tableTotal: TemplateRef<any>;\n\n @Input() tableLoading: boolean = false;\n // 表格分页参数\n @Input() tablePageIndex: number = 1;\n @Input() tablePageSize: number = 10;\n @Output() tablePageIndexChange = new EventEmitter<any>();\n @Output() tablePageSizeChange = new EventEmitter<any>();\n // 表格勾选参数\n isAllDisplayDataChecked = false;\n isIndeterminate = false;\n listOfDisplayData = [];\n listOfAllData = [];\n listOfSelection: Array<any> | TemplateRef<void>;\n mapOfCheckedId: { [key: string]: boolean } = {};\n mapOfCheckList: { [key: string]: any } = {};\n\n tableTotalOptionList = [];\n\n constructor() { }\n\n ngOnInit(): void { }\n\n ngOnChanges(changes: SimpleChange) {\n // 数据改变时,重置勾选状态\n if (changes && changes['tableData'] && changes['tableData']['currentValue'] && changes['tableData']['previousValue']) {\n if(changes['tableData']['currentValue']['pageSize'] !== changes['tableData']['previousValue']['pageSize']\n || changes['tableData']['currentValue']['pageNumber'] !== changes['tableData']['previousValue']['pageNumber']){\n return;\n }\n this.resetStatus();\n }\n }\n\n // 表格勾选逻辑\n currentPageDataChange($event: any): void {\n this.listOfDisplayData = $event;\n this.refreshStatus();\n this.resetStatus();\n }\n\n search(reset: boolean) {\n if(reset){\n this.tablePageSizeChange.emit(this.tablePageSize);\n }else{\n this.tablePageIndexChange.emit(this.tablePageIndex);\n }\n // 触发父组件查询事件\n this.tableSearchEvent.emit(reset);\n }\n\n resetStatus() {\n this.isAllDisplayDataChecked = false;\n this.isIndeterminate = false;\n this.mapOfCheckedId = {};\n this.mapOfCheckList = {};\n this.selectEvent.emit([]);\n }\n\n refreshStatus(event: boolean = false, data: any = null): void {\n if (event && data) {\n !this.mapOfCheckList[data[this.selectField]] && (this.mapOfCheckList[data[this.selectField]] = data);\n } else if (!event && data) {\n this.mapOfCheckList[data[this.selectField]] && delete this.mapOfCheckList[data[this.selectField]];\n }\n this.isAllDisplayDataChecked = this.listOfDisplayData.every(item => this.mapOfCheckedId[item[this.selectField]]);\n this.isIndeterminate =\n this.listOfDisplayData.some(item => this.mapOfCheckedId[item[this.selectField]]) && !this.isAllDisplayDataChecked;\n // 触发select事件\n if (this.selectEvent) {\n const selectedList: Array<any> = Object.values(this.mapOfCheckList);\n this.selectEvent.emit(selectedList);\n }\n // 如果数据为空,则清空勾选标识\n if (this.tableData.content.length === 0) {\n this.isAllDisplayDataChecked = false;\n }\n }\n\n checkAll(value: boolean): void {\n this.listOfDisplayData.forEach(item => {\n if (value) {\n !this.mapOfCheckList[item[this.selectField]] && (this.mapOfCheckList[item[this.selectField]] = item);\n } else {\n this.mapOfCheckList[item[this.selectField]] && delete this.mapOfCheckList[item[this.selectField]];\n }\n\n this.mapOfCheckedId[item[this.selectField]] = value\n });\n this.refreshStatus();\n }\n}\n","import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdCurrentTableComponent } from './hd-current-table.component';\nimport { NzTableModule } from 'ng-zorro-antd/table';\nimport { HdSpaceModule } from '../hd-space/hd-space.module';\n\n@NgModule({\n imports: [\n CommonModule,\n NzTableModule,\n HdSpaceModule\n ],\n declarations: [HdCurrentTableComponent],\n exports: [HdCurrentTableComponent],\n schemas: [NO_ERRORS_SCHEMA]\n})\nexport class HdCurrentTableModule { }\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'hd-log',\n templateUrl: './hd-log.component.html',\n styleUrls: ['./hd-log.component.less']\n})\nexport class HdLogComponent implements OnInit {\n @Input() logs: any[];\n\n constructor() {\n }\n\n ngOnInit() {\n }\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport { NzModalService } from 'ng-zorro-antd';\nimport { HdLogComponent } from './hd-log.component';\n\n@Injectable({\n providedIn: 'root',\n})\n\nexport class HdLogService {\n\n constructor(private modalService: NzModalService) { }\n\n showLogs(logs: any[]) {\n this.modalService.create({\n nzTitle: '操作日志',\n nzContent: HdLogComponent,\n nzComponentParams: { logs },\n nzFooter: null,\n nzWidth: 1000\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HdLogComponent } from './hd-log.component';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdDetailLinesModule } from '../hd-detail-lines/hd-detail-lines.module';\nimport { HdLogService } from './hd-log.service';\n@NgModule({\n imports: [\n CommonModule,\n NgZorroAntdModule,\n HdDetailLinesModule\n ],\n entryComponents: [HdLogComponent],\n declarations: [HdLogComponent],\n exports: [HdLogComponent],\n providers: [HdLogService]\n})\nexport class HdLogModule { }\n","import { Component, OnInit, Output, Input, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'hd-popconfirm',\n templateUrl: './hd-popconfirm.component.html',\n styleUrls: ['./hd-popconfirm.component.less']\n})\nexport class HdPopconfirmComponent implements OnInit {\n @Input() message: string;\n @Output() confirmOption = new EventEmitter<any>();\n @Output() cancelOption = new EventEmitter<any>();\n\n constructor() { }\n\n ngOnInit() {\n }\n\n\n cancel(e: any): void{\n this.cancelOption.emit();\n }\n\n confirm(e: any): void{\n this.confirmOption.emit();\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NgZorroAntdModule } from 'ng-zorro-antd';\nimport { HdPopconfirmComponent } from \"./hd-popconfirm.component\";\n\n@NgModule({\n declarations: [\n HdPopconfirmComponent\n ],\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgZorroAntdModule,\n ],\n exports: [HdPopconfirmComponent],\n providers: [],\n bootstrap: [HdPopconfirmComponent]\n})\nexport class HdPopconfirmModule {\n}\n","import { Component, OnInit, Input, 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 | ((line: any) => boolean) = false;\n isRepeat?: boolean = false; // 是否和别的按钮有显示冲突,譬如:开启,关闭需要再关闭按钮加一个这个属性\n click?: (value: any) => void;\n permission?: (value: any) => boolean;\n}\n\nexport class HdTableTotalOption {\n columnNumber: number; // 总列数\n insertIndex: number; // 插入下标\n insertName: string; // 插入字段\n}\n\nexport class TableCacheOption {\n pageSize: number;\n colWidths: Map<string, number> = new Map<string, number>(); // name -> width\n cols: Array<string>; // ['title']\n}\n\n// 设置列 树组件对象\nexport class TreeGrid {\n title: string = '';\n key: string = '';\n disabled?: boolean = false;\n checked?: boolean = false;\n selectable?: boolean = false;\n isLeaf?: boolean = true;\n expanded?: boolean = false;\n}","import {\n 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 OperateBtn,\n TableCacheOption,\n TreeGrid,\n} from \"./hd-table.service\";\n@Component({\n selector: \"hd-table\",\n templateUrl: \"./hd-table.component.html\",\n styleUrls: [\"./hd-table.component.less\"],\n})\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 needShowConfirm(btn: OperateBtn, data: any): boolean {\n if (typeof btn.showConfirm === \"function\") {\n return btn.showConfirm(data);\n }\n return !!btn.showConfirm;\n }\n\n 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"]}
|