ngx-histaff-alpha 6.8.2 → 6.8.4

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.
Files changed (56) hide show
  1. package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-BqjboYjv.mjs → ngx-histaff-alpha-ai-hint-for-table.component-DNzp1e4r.mjs} +2 -2
  2. package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-BqjboYjv.mjs.map → ngx-histaff-alpha-ai-hint-for-table.component-DNzp1e4r.mjs.map} +1 -1
  3. package/fesm2022/{ngx-histaff-alpha-core-form-design.component-gFVfWdCK.mjs → ngx-histaff-alpha-core-form-design.component-COU0j6A1.mjs} +4 -4
  4. package/fesm2022/{ngx-histaff-alpha-core-form-design.component-gFVfWdCK.mjs.map → ngx-histaff-alpha-core-form-design.component-COU0j6A1.mjs.map} +1 -1
  5. package/fesm2022/{ngx-histaff-alpha-core-sys-action.component-BHMOJ9Wv.mjs → ngx-histaff-alpha-core-sys-action.component-BcbxxbiH.mjs} +2 -2
  6. package/fesm2022/{ngx-histaff-alpha-core-sys-action.component-BHMOJ9Wv.mjs.map → ngx-histaff-alpha-core-sys-action.component-BcbxxbiH.mjs.map} +1 -1
  7. package/fesm2022/{ngx-histaff-alpha-core-template-editor.component-JepLT3Kj.mjs → ngx-histaff-alpha-core-template-editor.component-CmlAEjel.mjs} +2 -2
  8. package/fesm2022/{ngx-histaff-alpha-core-template-editor.component-JepLT3Kj.mjs.map → ngx-histaff-alpha-core-template-editor.component-CmlAEjel.mjs.map} +1 -1
  9. package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-Ci5mPC3a.mjs → ngx-histaff-alpha-core-toast-loading.component-ChI14kG6.mjs} +2 -2
  10. package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-Ci5mPC3a.mjs.map → ngx-histaff-alpha-core-toast-loading.component-ChI14kG6.mjs.map} +1 -1
  11. package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-C1uTy3Fc.mjs → ngx-histaff-alpha-core-workflow-consume.component-10iNOdMU.mjs} +2 -2
  12. package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-C1uTy3Fc.mjs.map → ngx-histaff-alpha-core-workflow-consume.component-10iNOdMU.mjs.map} +1 -1
  13. package/fesm2022/{ngx-histaff-alpha-db-settings.component-C9jL42sk.mjs → ngx-histaff-alpha-db-settings.component-B_vmJCH1.mjs} +5 -5
  14. package/fesm2022/{ngx-histaff-alpha-db-settings.component-C9jL42sk.mjs.map → ngx-histaff-alpha-db-settings.component-B_vmJCH1.mjs.map} +1 -1
  15. package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-sAxUjDDo.mjs → ngx-histaff-alpha-design-wrapper.component-D69aMbnU.mjs} +5 -5
  16. package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-sAxUjDDo.mjs.map → ngx-histaff-alpha-design-wrapper.component-D69aMbnU.mjs.map} +1 -1
  17. package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-BlSny2JD.mjs → ngx-histaff-alpha-design-wrapper.route-CQjA9Bm5.mjs} +5 -5
  18. package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-BlSny2JD.mjs.map → ngx-histaff-alpha-design-wrapper.route-CQjA9Bm5.mjs.map} +1 -1
  19. package/fesm2022/{ngx-histaff-alpha-hrm-schema.component-DuFTr8Ym.mjs → ngx-histaff-alpha-hrm-schema.component-COWJ2Ral.mjs} +2 -2
  20. package/fesm2022/{ngx-histaff-alpha-hrm-schema.component-DuFTr8Ym.mjs.map → ngx-histaff-alpha-hrm-schema.component-COWJ2Ral.mjs.map} +1 -1
  21. package/fesm2022/{ngx-histaff-alpha-live-form.component-B7gcJMSi.mjs → ngx-histaff-alpha-live-form.component-Db5vGzS-.mjs} +2 -2
  22. package/fesm2022/{ngx-histaff-alpha-live-form.component-B7gcJMSi.mjs.map → ngx-histaff-alpha-live-form.component-Db5vGzS-.mjs.map} +1 -1
  23. package/fesm2022/{ngx-histaff-alpha-ngx-histaff-alpha-B6JZNI6c.mjs → ngx-histaff-alpha-ngx-histaff-alpha-ahDUrQN8.mjs} +593 -566
  24. package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-ahDUrQN8.mjs.map +1 -0
  25. package/fesm2022/{ngx-histaff-alpha-simple-chat.component-Ct043oiC.mjs → ngx-histaff-alpha-simple-chat.component-CUG_FqKD.mjs} +2 -2
  26. package/fesm2022/{ngx-histaff-alpha-simple-chat.component-Ct043oiC.mjs.map → ngx-histaff-alpha-simple-chat.component-CUG_FqKD.mjs.map} +1 -1
  27. package/fesm2022/{ngx-histaff-alpha-sys-smtp-client-edit.component-CYEhx-zn.mjs → ngx-histaff-alpha-sys-smtp-client-edit.component-ilgHs5Ow.mjs} +2 -2
  28. package/fesm2022/{ngx-histaff-alpha-sys-smtp-client-edit.component-CYEhx-zn.mjs.map → ngx-histaff-alpha-sys-smtp-client-edit.component-ilgHs5Ow.mjs.map} +1 -1
  29. package/fesm2022/{ngx-histaff-alpha-sys-smtp-client.component-jEb9g23R.mjs → ngx-histaff-alpha-sys-smtp-client.component-INHDOFv_.mjs} +2 -2
  30. package/fesm2022/{ngx-histaff-alpha-sys-smtp-client.component-jEb9g23R.mjs.map → ngx-histaff-alpha-sys-smtp-client.component-INHDOFv_.mjs.map} +1 -1
  31. package/fesm2022/{ngx-histaff-alpha-template-list.component-r_mRH85W.mjs → ngx-histaff-alpha-template-list.component-d-CuW__f.mjs} +2 -2
  32. package/fesm2022/{ngx-histaff-alpha-template-list.component-r_mRH85W.mjs.map → ngx-histaff-alpha-template-list.component-d-CuW__f.mjs.map} +1 -1
  33. package/fesm2022/{ngx-histaff-alpha-tracker-studio.component-BcyA0mRW.mjs → ngx-histaff-alpha-tracker-studio.component-BtY_SG87.mjs} +2 -2
  34. package/fesm2022/{ngx-histaff-alpha-tracker-studio.component-BcyA0mRW.mjs.map → ngx-histaff-alpha-tracker-studio.component-BtY_SG87.mjs.map} +1 -1
  35. package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-BVr6v49F.mjs → ngx-histaff-alpha-wf-form-assign.component-DvuaKC7t.mjs} +2 -2
  36. package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-BVr6v49F.mjs.map → ngx-histaff-alpha-wf-form-assign.component-DvuaKC7t.mjs.map} +1 -1
  37. package/fesm2022/{ngx-histaff-alpha-wf-global-config.component-DTuh5zdi.mjs → ngx-histaff-alpha-wf-global-config.component-CCMceLib.mjs} +2 -2
  38. package/fesm2022/{ngx-histaff-alpha-wf-global-config.component-DTuh5zdi.mjs.map → ngx-histaff-alpha-wf-global-config.component-CCMceLib.mjs.map} +1 -1
  39. package/fesm2022/{ngx-histaff-alpha-wf-instance-status.component-BKDScZSG.mjs → ngx-histaff-alpha-wf-instance-status.component-BtFXU-R-.mjs} +2 -2
  40. package/fesm2022/{ngx-histaff-alpha-wf-instance-status.component-BKDScZSG.mjs.map → ngx-histaff-alpha-wf-instance-status.component-BtFXU-R-.mjs.map} +1 -1
  41. package/fesm2022/{ngx-histaff-alpha-wf-instance-step-react.component-BwE5a99D.mjs → ngx-histaff-alpha-wf-instance-step-react.component-Bv5QnQbm.mjs} +3 -3
  42. package/fesm2022/{ngx-histaff-alpha-wf-instance-step-react.component-BwE5a99D.mjs.map → ngx-histaff-alpha-wf-instance-step-react.component-Bv5QnQbm.mjs.map} +1 -1
  43. package/fesm2022/{ngx-histaff-alpha-wf-lab.component-lqKBXhBp.mjs → ngx-histaff-alpha-wf-lab.component-qS2-1UVx.mjs} +2 -2
  44. package/fesm2022/{ngx-histaff-alpha-wf-lab.component-lqKBXhBp.mjs.map → ngx-histaff-alpha-wf-lab.component-qS2-1UVx.mjs.map} +1 -1
  45. package/fesm2022/ngx-histaff-alpha.mjs +1 -1
  46. package/lib/app/libraries/core-dom-decision-editor/core-dom-decision-editor.component.d.ts +7 -42
  47. package/lib/app/libraries/core-dom-decision-editor/dom-decision-context.service.d.ts +64 -9
  48. package/lib/app/libraries/core-dom-decision-editor/dom-oid-factory/dom-oid-factory.component.d.ts +1 -1
  49. package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/intent-draft.model.d.ts +1 -0
  50. package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/omega-intent.d.ts +6 -0
  51. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/_base/intent-input-context.d.ts +1 -1
  52. package/lib/app/libraries/core-dom-decision-editor/intent-composer/intent-composer.component.d.ts +2 -7
  53. package/lib/app/libraries/core-pagination-full/core-pagination-full/core-pagination-full.component.d.ts +3 -0
  54. package/lib/app/services/socket.service.d.ts +1 -0
  55. package/package.json +2 -2
  56. package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-B6JZNI6c.mjs.map +0 -1
@@ -9594,6 +9594,7 @@ class SocketService {
9594
9594
  this.chatService = chatService;
9595
9595
  this.$workflowTicket = signal(null);
9596
9596
  this.$hubStatuses = signal([]);
9597
+ this.$appdomainHubConnected = signal(false);
9597
9598
  }
9598
9599
  // ✅ Hàm tiện ích để cập nhật Signal trạng thái
9599
9600
  updateHubStatus(name, isConnected) {
@@ -9737,10 +9738,12 @@ class SocketService {
9737
9738
  });
9738
9739
  const start = async () => {
9739
9740
  let id;
9741
+ this.$appdomainHubConnected.set(false);
9740
9742
  try {
9741
9743
  this.hubConnectionService.message = "HubConnection creating requested.";
9742
9744
  await connection.start();
9743
9745
  console.log("🟢🟢🟢 SignalR Connected.");
9746
+ this.$appdomainHubConnected.set(true);
9744
9747
  this.hubConnectionService.message = "HubConnection created.";
9745
9748
  this.hubConnectionService.hubConnection$.next(connection);
9746
9749
  if (id)
@@ -9748,6 +9751,7 @@ class SocketService {
9748
9751
  }
9749
9752
  catch (err) {
9750
9753
  console.group(`🔴🔴🔴 HUB CONNECTION PROBLEM ====================`);
9754
+ this.$appdomainHubConnected.set(false);
9751
9755
  this.hubConnectionService.message = err;
9752
9756
  console.warn("hubConnection start() error: ", err, this.appConfigService.BASE_URL + '/hubs/signal');
9753
9757
  if (typeof err === 'string') {
@@ -14634,6 +14638,8 @@ class CorePaginationFullComponent extends BaseComponent {
14634
14638
  this.onClickAdd = new EventEmitter();
14635
14639
  this.onCurrentPageChange = new EventEmitter();
14636
14640
  this.onSizeChange = new EventEmitter();
14641
+ this.ss = inject(SocketService);
14642
+ this.$appdomainHubConnected = this.ss.$appdomainHubConnected;
14637
14643
  this.navigationDirection = 1;
14638
14644
  this.displayPageCount = [];
14639
14645
  this.SizeChanger = [5, 10, 20, 50, 200, 500, 1000, 5000, 10000];
@@ -14766,7 +14772,7 @@ class CorePaginationFullComponent extends BaseComponent {
14766
14772
  this.subscriptions.map(x => x?.unsubscribe());
14767
14773
  }
14768
14774
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CorePaginationFullComponent, deps: [{ token: MultiLanguageService }], target: i0.ɵɵFactoryTarget.Component }); }
14769
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.5", type: CorePaginationFullComponent, isStandalone: true, selector: "core-pagination-full", inputs: { currentPage$: "currentPage$", height: "height", pageCount: "pageCount", loading: "loading", showAdd: "showAdd", background: "background", pageSize$: "pageSize$", innerBodyCount$: "innerBodyCount$", pagination$: "pagination$", fixedPageSize: "fixedPageSize" }, outputs: { onClickAdd: "onClickAdd", onCurrentPageChange: "onCurrentPageChange", onSizeChange: "onSizeChange" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "current", first: true, predicate: ["current"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div #container class=\"pagination-full-container inter-font d-flex d-flex-between\" [ngStyle]=\"{\r\n width: '100%'\r\n}\">\r\n <div class=\"custom-select-container\">\r\n <label style=\"color:#848484\">{{ 'UI.COMPONENT.CORE-PAGINATION-FULL.VIEW' | translate: lang\r\n }}&nbsp;&nbsp;</label>\r\n <select class=\"custom-select\" [(ngModel)]=\"selectedSize\" (ngModelChange)=\"onSizeChangeLocal($event)\"\r\n [disabled]=\"!!fixedPageSize\">\r\n <option *ngFor=\"let size of SizeChanger\">{{size}}</option>\r\n </select>\r\n <label style=\"color:#848484\">&nbsp;/{{innerBodyCount$.value}}&nbsp;{{\r\n 'UI.COMPONENT.CORE-PAGINATION-FULL.RESULTS' | translate: lang }}</label>\r\n </div>\r\n <div class=\"pagination-container\">\r\n <div class=\"first pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===1\" (click)=\"goFirst()\"></div>\r\n <div class=\"previous pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===1\" (click)=\"goPrevious()\"></div>\r\n <div #current *ngFor=\"let item of displayPageCount\" [class.hide-item]=\"item !== currentPage$.value\">\r\n <div class=\"d-flex d-flex-center\">\r\n <span (click)=\"clickPageNumber(item)\" [class.current]=\"item == currentPage$.value\"\r\n [class.not-current]=\"item !== currentPage$.value\">\r\n <object>\r\n {{ item }}\r\n </object>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"next pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===pageCount\" (click)=\"goNext()\"></div>\r\n <div class=\"last pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===pageCount\" (click)=\"goLast()\"></div>\r\n </div>\r\n</div>", styles: [".pagination-full-container{--bg: #848484;--color: white;--height: 30px;--button-size: 30px;--font-size: 12px;--aperture-size: 36px;width:100%!important;display:flex;align-items:center;justify-content:space-between;background-color:#fff}.pagination-full-container *{font-size:13px!important}@keyframes rotate-current-content-fw{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes rotate-current-content-bw{0%{transform:rotate(0)}to{transform:rotate(-360deg)}}.pagination-full-container select{border-color:#848484;color:#848484}.pagination-full-container span{display:inline-flex;align-items:center;justify-content:center;height:var(--button-size)}.pagination-full-container span.current,.pagination-full-container span.not-current{display:inline-flex;align-items:center;justify-content:center}.pagination-full-container .add:before{font-family:feather;content:\"\\e9b1\";font-weight:700;font-size:var(--font-size);color:#fff;background:var(--bg);width:var(--button-size);height:var(--button-size);display:flex;align-items:center;justify-content:center;border-top-right-radius:50%;border-bottom-right-radius:50%}.pagination-full-container select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:1px solid #ccc;background-color:#f9f9f9;color:#333;padding-left:12px;font-size:16px;width:200px;height:30px;cursor:pointer}.pagination-full-container select{background-image:url(\"data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns%3D%27http%3A//www.w3.org/2000/svg%27 viewBox%3D%270 0 4 5%27%3E%3Cpath fill%3D%27%23333%27 d%3D%27M2 0L0 2h4z%27/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:calc(100% - 10px);background-position-y:10px;background-size:10px;line-height:normal}.pagination-full-container select:hover{border-color:#888}.pagination-full-container select:focus{outline:none}.pagination-full-container select:disabled{background-color:#e9ecef;color:#6c757d;cursor:not-allowed}.pagination-full-container .custom-select{width:80px;height:28px}.pagination-full-container .custom-select-container{color:#a5a4a4;margin-right:12px;background-color:#fff}.pagination-full-container .pagination-container{height:var(--height);display:flex;align-items:center;justify-content:center;background-color:#fff}.pagination-full-container .pagination-container>div{display:inline-block;cursor:pointer;margin-right:5px}.pagination-full-container .pagination-container .disable{cursor:default;opacity:.5!important}.pagination-full-container .pagination-container .current{margin:0;opacity:1;display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container .not-current{border:1px solid #D1D1D1;opacity:1;display:flex;justify-content:center}.pagination-full-container .pagination-container .not-current:hover{background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .aperture{width:var(--aperture-size);height:var(--aperture-size);animation:1s infinite linear;opacity:0;transition:.25s ease-out}.pagination-full-container .pagination-container .aperture:before{font-size:var(--aperture-size)}.pagination-full-container .pagination-container .visible{opacity:1;transition:.25s ease-out}.pagination-full-container .pagination-container .current,.pagination-full-container .pagination-container .loading{width:var(--button-size);height:var(--button-size);background:var(--color-basic-orange);color:var(--color)}.pagination-full-container .pagination-container .not-current{width:var(--button-size);height:var(--button-size);background:#fff;color:#848484}.pagination-full-container .pagination-container .current-text{position:absolute}.pagination-full-container .pagination-container .not-current>div,.pagination-full-container .pagination-container .current>div{width:var(--button-size);height:var(--button-size);display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container div:before{font-family:feather;font-size:var(--font-size);width:var(--button-size);height:var(--button-size);background:var(--bg);color:var(--color);display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container .first:before{content:\"\\e933\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .first.disable:hover:before{content:\"\\e933\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .first:hover:before{content:\"\\e933\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .previous.disable:hover:before{content:\"\\e92f\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .previous:before{content:\"\\e92f\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .previous:hover:before{content:\"\\e92f\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .next:before{content:\"\\e930\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .next.disable:hover:before{content:\"\\e930\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .next:hover:before{content:\"\\e930\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .last.disable:hover:before{content:\"\\e934\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .last:before{content:\"\\e934\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .last:hover:before{content:\"\\e934\";background:#a5a4a4;color:#fff;border:1px solid white}.pointer{cursor:pointer}@media only screen and (max-width: 768px){.custom-select-container{display:none}}@media only screen and (max-width: 576px){.pagination-container .pagination-container .not-current{display:none}.hide-item{display:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
14775
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.5", type: CorePaginationFullComponent, isStandalone: true, selector: "core-pagination-full", inputs: { currentPage$: "currentPage$", height: "height", pageCount: "pageCount", loading: "loading", showAdd: "showAdd", background: "background", pageSize$: "pageSize$", innerBodyCount$: "innerBodyCount$", pagination$: "pagination$", fixedPageSize: "fixedPageSize" }, outputs: { onClickAdd: "onClickAdd", onCurrentPageChange: "onCurrentPageChange", onSizeChange: "onSizeChange" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "current", first: true, predicate: ["current"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div #container class=\"pagination-full-container inter-font d-flex d-flex-between\" [ngStyle]=\"{\r\n width: '100%'\r\n}\">\r\n <div class=\"custom-select-container\">\r\n <label style=\"color:#848484\">{{ 'UI.COMPONENT.CORE-PAGINATION-FULL.VIEW' | translate: lang\r\n }}&nbsp;&nbsp;</label>\r\n <select class=\"custom-select\" [(ngModel)]=\"selectedSize\" (ngModelChange)=\"onSizeChangeLocal($event)\"\r\n [disabled]=\"!!fixedPageSize\">\r\n <option *ngFor=\"let size of SizeChanger\">{{size}}</option>\r\n </select>\r\n <label style=\"color:#848484\">&nbsp;/{{innerBodyCount$.value}}&nbsp;{{\r\n 'UI.COMPONENT.CORE-PAGINATION-FULL.RESULTS' | translate: lang }}</label>\r\n </div>\r\n <div class=\"pagination-container\">\r\n <div class=\"hub-status\">\r\n <span class=\"status-dot\" [class.connected]=\"$appdomainHubConnected()\"></span>\r\n </div>\r\n\r\n <div class=\"first pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===1\" (click)=\"goFirst()\"></div>\r\n <div class=\"previous pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===1\" (click)=\"goPrevious()\"></div>\r\n <div #current *ngFor=\"let item of displayPageCount\" [class.hide-item]=\"item !== currentPage$.value\">\r\n <div class=\"d-flex d-flex-center\">\r\n <span (click)=\"clickPageNumber(item)\" [class.current]=\"item == currentPage$.value\"\r\n [class.not-current]=\"item !== currentPage$.value\">\r\n <object>\r\n {{ item }}\r\n </object>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"next pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===pageCount\" (click)=\"goNext()\"></div>\r\n <div class=\"last pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===pageCount\" (click)=\"goLast()\"></div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.pagination-full-container{--bg: #848484;--color: white;--height: 30px;--button-size: 30px;--font-size: 12px;--aperture-size: 36px;width:100%!important;display:flex;align-items:center;justify-content:space-between;background-color:#fff}.pagination-full-container *{font-size:13px!important}@keyframes rotate-current-content-fw{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes rotate-current-content-bw{0%{transform:rotate(0)}to{transform:rotate(-360deg)}}.pagination-full-container select{border-color:#848484;color:#848484}.pagination-full-container span{display:inline-flex;align-items:center;justify-content:center;height:var(--button-size)}.pagination-full-container span.current,.pagination-full-container span.not-current{display:inline-flex;align-items:center;justify-content:center}.pagination-full-container .add:before{font-family:feather;content:\"\\e9b1\";font-weight:700;font-size:var(--font-size);color:#fff;background:var(--bg);width:var(--button-size);height:var(--button-size);display:flex;align-items:center;justify-content:center;border-top-right-radius:50%;border-bottom-right-radius:50%}.pagination-full-container select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:1px solid #ccc;background-color:#f9f9f9;color:#333;padding-left:12px;font-size:16px;width:200px;height:30px;cursor:pointer}.pagination-full-container select{background-image:url(\"data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns%3D%27http%3A//www.w3.org/2000/svg%27 viewBox%3D%270 0 4 5%27%3E%3Cpath fill%3D%27%23333%27 d%3D%27M2 0L0 2h4z%27/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:calc(100% - 10px);background-position-y:10px;background-size:10px;line-height:normal}.pagination-full-container select:hover{border-color:#888}.pagination-full-container select:focus{outline:none}.pagination-full-container select:disabled{background-color:#e9ecef;color:#6c757d;cursor:not-allowed}.pagination-full-container .custom-select{width:80px;height:28px}.pagination-full-container .custom-select-container{color:#a5a4a4;margin-right:12px;background-color:#fff}.pagination-full-container .pagination-container{height:var(--height);display:flex;align-items:center;justify-content:center;background-color:#fff}.pagination-full-container .pagination-container>div{display:inline-block;cursor:pointer;margin-right:5px}.pagination-full-container .pagination-container .disable{cursor:default;opacity:.5!important}.pagination-full-container .pagination-container .current{margin:0;opacity:1;display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container .not-current{border:1px solid #D1D1D1;opacity:1;display:flex;justify-content:center}.pagination-full-container .pagination-container .not-current:hover{background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .aperture{width:var(--aperture-size);height:var(--aperture-size);animation:1s infinite linear;opacity:0;transition:.25s ease-out}.pagination-full-container .pagination-container .aperture:before{font-size:var(--aperture-size)}.pagination-full-container .pagination-container .visible{opacity:1;transition:.25s ease-out}.pagination-full-container .pagination-container .current,.pagination-full-container .pagination-container .loading{width:var(--button-size);height:var(--button-size);background:var(--color-basic-orange);color:var(--color)}.pagination-full-container .pagination-container .not-current{width:var(--button-size);height:var(--button-size);background:#fff;color:#848484}.pagination-full-container .pagination-container .current-text{position:absolute}.pagination-full-container .pagination-container .not-current>div,.pagination-full-container .pagination-container .current>div{width:var(--button-size);height:var(--button-size);display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container div:before{font-family:feather;font-size:var(--font-size);width:var(--button-size);height:var(--button-size);background:var(--bg);color:var(--color);display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container .first:before{content:\"\\e933\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .first.disable:hover:before{content:\"\\e933\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .first:hover:before{content:\"\\e933\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .previous.disable:hover:before{content:\"\\e92f\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .previous:before{content:\"\\e92f\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .previous:hover:before{content:\"\\e92f\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .next:before{content:\"\\e930\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .next.disable:hover:before{content:\"\\e930\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .next:hover:before{content:\"\\e930\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .last.disable:hover:before{content:\"\\e934\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .last:before{content:\"\\e934\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .last:hover:before{content:\"\\e934\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .hub-status{display:flex;align-items:center;font-size:.85rem;color:#555}.pagination-full-container .status-dot{width:10px;height:10px;border-radius:50%;background-color:#fca5a5;box-shadow:0 0 4px #fca5a580;transition:all .2s ease}.pagination-full-container .status-dot.connected{background-color:#22c55e;box-shadow:0 0 6px #22c55e}.pointer{cursor:pointer}@media only screen and (max-width: 768px){.custom-select-container{display:none}}@media only screen and (max-width: 576px){.pagination-container .pagination-container .not-current{display:none}.hide-item{display:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
14770
14776
  }
14771
14777
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CorePaginationFullComponent, decorators: [{
14772
14778
  type: Component,
@@ -14774,7 +14780,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
14774
14780
  CommonModule,
14775
14781
  FormsModule,
14776
14782
  TranslatePipe
14777
- ], template: "<div #container class=\"pagination-full-container inter-font d-flex d-flex-between\" [ngStyle]=\"{\r\n width: '100%'\r\n}\">\r\n <div class=\"custom-select-container\">\r\n <label style=\"color:#848484\">{{ 'UI.COMPONENT.CORE-PAGINATION-FULL.VIEW' | translate: lang\r\n }}&nbsp;&nbsp;</label>\r\n <select class=\"custom-select\" [(ngModel)]=\"selectedSize\" (ngModelChange)=\"onSizeChangeLocal($event)\"\r\n [disabled]=\"!!fixedPageSize\">\r\n <option *ngFor=\"let size of SizeChanger\">{{size}}</option>\r\n </select>\r\n <label style=\"color:#848484\">&nbsp;/{{innerBodyCount$.value}}&nbsp;{{\r\n 'UI.COMPONENT.CORE-PAGINATION-FULL.RESULTS' | translate: lang }}</label>\r\n </div>\r\n <div class=\"pagination-container\">\r\n <div class=\"first pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===1\" (click)=\"goFirst()\"></div>\r\n <div class=\"previous pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===1\" (click)=\"goPrevious()\"></div>\r\n <div #current *ngFor=\"let item of displayPageCount\" [class.hide-item]=\"item !== currentPage$.value\">\r\n <div class=\"d-flex d-flex-center\">\r\n <span (click)=\"clickPageNumber(item)\" [class.current]=\"item == currentPage$.value\"\r\n [class.not-current]=\"item !== currentPage$.value\">\r\n <object>\r\n {{ item }}\r\n </object>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"next pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===pageCount\" (click)=\"goNext()\"></div>\r\n <div class=\"last pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===pageCount\" (click)=\"goLast()\"></div>\r\n </div>\r\n</div>", styles: [".pagination-full-container{--bg: #848484;--color: white;--height: 30px;--button-size: 30px;--font-size: 12px;--aperture-size: 36px;width:100%!important;display:flex;align-items:center;justify-content:space-between;background-color:#fff}.pagination-full-container *{font-size:13px!important}@keyframes rotate-current-content-fw{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes rotate-current-content-bw{0%{transform:rotate(0)}to{transform:rotate(-360deg)}}.pagination-full-container select{border-color:#848484;color:#848484}.pagination-full-container span{display:inline-flex;align-items:center;justify-content:center;height:var(--button-size)}.pagination-full-container span.current,.pagination-full-container span.not-current{display:inline-flex;align-items:center;justify-content:center}.pagination-full-container .add:before{font-family:feather;content:\"\\e9b1\";font-weight:700;font-size:var(--font-size);color:#fff;background:var(--bg);width:var(--button-size);height:var(--button-size);display:flex;align-items:center;justify-content:center;border-top-right-radius:50%;border-bottom-right-radius:50%}.pagination-full-container select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:1px solid #ccc;background-color:#f9f9f9;color:#333;padding-left:12px;font-size:16px;width:200px;height:30px;cursor:pointer}.pagination-full-container select{background-image:url(\"data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns%3D%27http%3A//www.w3.org/2000/svg%27 viewBox%3D%270 0 4 5%27%3E%3Cpath fill%3D%27%23333%27 d%3D%27M2 0L0 2h4z%27/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:calc(100% - 10px);background-position-y:10px;background-size:10px;line-height:normal}.pagination-full-container select:hover{border-color:#888}.pagination-full-container select:focus{outline:none}.pagination-full-container select:disabled{background-color:#e9ecef;color:#6c757d;cursor:not-allowed}.pagination-full-container .custom-select{width:80px;height:28px}.pagination-full-container .custom-select-container{color:#a5a4a4;margin-right:12px;background-color:#fff}.pagination-full-container .pagination-container{height:var(--height);display:flex;align-items:center;justify-content:center;background-color:#fff}.pagination-full-container .pagination-container>div{display:inline-block;cursor:pointer;margin-right:5px}.pagination-full-container .pagination-container .disable{cursor:default;opacity:.5!important}.pagination-full-container .pagination-container .current{margin:0;opacity:1;display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container .not-current{border:1px solid #D1D1D1;opacity:1;display:flex;justify-content:center}.pagination-full-container .pagination-container .not-current:hover{background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .aperture{width:var(--aperture-size);height:var(--aperture-size);animation:1s infinite linear;opacity:0;transition:.25s ease-out}.pagination-full-container .pagination-container .aperture:before{font-size:var(--aperture-size)}.pagination-full-container .pagination-container .visible{opacity:1;transition:.25s ease-out}.pagination-full-container .pagination-container .current,.pagination-full-container .pagination-container .loading{width:var(--button-size);height:var(--button-size);background:var(--color-basic-orange);color:var(--color)}.pagination-full-container .pagination-container .not-current{width:var(--button-size);height:var(--button-size);background:#fff;color:#848484}.pagination-full-container .pagination-container .current-text{position:absolute}.pagination-full-container .pagination-container .not-current>div,.pagination-full-container .pagination-container .current>div{width:var(--button-size);height:var(--button-size);display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container div:before{font-family:feather;font-size:var(--font-size);width:var(--button-size);height:var(--button-size);background:var(--bg);color:var(--color);display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container .first:before{content:\"\\e933\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .first.disable:hover:before{content:\"\\e933\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .first:hover:before{content:\"\\e933\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .previous.disable:hover:before{content:\"\\e92f\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .previous:before{content:\"\\e92f\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .previous:hover:before{content:\"\\e92f\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .next:before{content:\"\\e930\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .next.disable:hover:before{content:\"\\e930\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .next:hover:before{content:\"\\e930\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .last.disable:hover:before{content:\"\\e934\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .last:before{content:\"\\e934\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .last:hover:before{content:\"\\e934\";background:#a5a4a4;color:#fff;border:1px solid white}.pointer{cursor:pointer}@media only screen and (max-width: 768px){.custom-select-container{display:none}}@media only screen and (max-width: 576px){.pagination-container .pagination-container .not-current{display:none}.hide-item{display:none!important}}\n"] }]
14783
+ ], template: "<div #container class=\"pagination-full-container inter-font d-flex d-flex-between\" [ngStyle]=\"{\r\n width: '100%'\r\n}\">\r\n <div class=\"custom-select-container\">\r\n <label style=\"color:#848484\">{{ 'UI.COMPONENT.CORE-PAGINATION-FULL.VIEW' | translate: lang\r\n }}&nbsp;&nbsp;</label>\r\n <select class=\"custom-select\" [(ngModel)]=\"selectedSize\" (ngModelChange)=\"onSizeChangeLocal($event)\"\r\n [disabled]=\"!!fixedPageSize\">\r\n <option *ngFor=\"let size of SizeChanger\">{{size}}</option>\r\n </select>\r\n <label style=\"color:#848484\">&nbsp;/{{innerBodyCount$.value}}&nbsp;{{\r\n 'UI.COMPONENT.CORE-PAGINATION-FULL.RESULTS' | translate: lang }}</label>\r\n </div>\r\n <div class=\"pagination-container\">\r\n <div class=\"hub-status\">\r\n <span class=\"status-dot\" [class.connected]=\"$appdomainHubConnected()\"></span>\r\n </div>\r\n\r\n <div class=\"first pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===1\" (click)=\"goFirst()\"></div>\r\n <div class=\"previous pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===1\" (click)=\"goPrevious()\"></div>\r\n <div #current *ngFor=\"let item of displayPageCount\" [class.hide-item]=\"item !== currentPage$.value\">\r\n <div class=\"d-flex d-flex-center\">\r\n <span (click)=\"clickPageNumber(item)\" [class.current]=\"item == currentPage$.value\"\r\n [class.not-current]=\"item !== currentPage$.value\">\r\n <object>\r\n {{ item }}\r\n </object>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"next pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===pageCount\" (click)=\"goNext()\"></div>\r\n <div class=\"last pointer\" [class.disable]=\"!!!pageCount || currentPage$.value===pageCount\" (click)=\"goLast()\"></div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.pagination-full-container{--bg: #848484;--color: white;--height: 30px;--button-size: 30px;--font-size: 12px;--aperture-size: 36px;width:100%!important;display:flex;align-items:center;justify-content:space-between;background-color:#fff}.pagination-full-container *{font-size:13px!important}@keyframes rotate-current-content-fw{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes rotate-current-content-bw{0%{transform:rotate(0)}to{transform:rotate(-360deg)}}.pagination-full-container select{border-color:#848484;color:#848484}.pagination-full-container span{display:inline-flex;align-items:center;justify-content:center;height:var(--button-size)}.pagination-full-container span.current,.pagination-full-container span.not-current{display:inline-flex;align-items:center;justify-content:center}.pagination-full-container .add:before{font-family:feather;content:\"\\e9b1\";font-weight:700;font-size:var(--font-size);color:#fff;background:var(--bg);width:var(--button-size);height:var(--button-size);display:flex;align-items:center;justify-content:center;border-top-right-radius:50%;border-bottom-right-radius:50%}.pagination-full-container select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:1px solid #ccc;background-color:#f9f9f9;color:#333;padding-left:12px;font-size:16px;width:200px;height:30px;cursor:pointer}.pagination-full-container select{background-image:url(\"data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns%3D%27http%3A//www.w3.org/2000/svg%27 viewBox%3D%270 0 4 5%27%3E%3Cpath fill%3D%27%23333%27 d%3D%27M2 0L0 2h4z%27/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:calc(100% - 10px);background-position-y:10px;background-size:10px;line-height:normal}.pagination-full-container select:hover{border-color:#888}.pagination-full-container select:focus{outline:none}.pagination-full-container select:disabled{background-color:#e9ecef;color:#6c757d;cursor:not-allowed}.pagination-full-container .custom-select{width:80px;height:28px}.pagination-full-container .custom-select-container{color:#a5a4a4;margin-right:12px;background-color:#fff}.pagination-full-container .pagination-container{height:var(--height);display:flex;align-items:center;justify-content:center;background-color:#fff}.pagination-full-container .pagination-container>div{display:inline-block;cursor:pointer;margin-right:5px}.pagination-full-container .pagination-container .disable{cursor:default;opacity:.5!important}.pagination-full-container .pagination-container .current{margin:0;opacity:1;display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container .not-current{border:1px solid #D1D1D1;opacity:1;display:flex;justify-content:center}.pagination-full-container .pagination-container .not-current:hover{background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .aperture{width:var(--aperture-size);height:var(--aperture-size);animation:1s infinite linear;opacity:0;transition:.25s ease-out}.pagination-full-container .pagination-container .aperture:before{font-size:var(--aperture-size)}.pagination-full-container .pagination-container .visible{opacity:1;transition:.25s ease-out}.pagination-full-container .pagination-container .current,.pagination-full-container .pagination-container .loading{width:var(--button-size);height:var(--button-size);background:var(--color-basic-orange);color:var(--color)}.pagination-full-container .pagination-container .not-current{width:var(--button-size);height:var(--button-size);background:#fff;color:#848484}.pagination-full-container .pagination-container .current-text{position:absolute}.pagination-full-container .pagination-container .not-current>div,.pagination-full-container .pagination-container .current>div{width:var(--button-size);height:var(--button-size);display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container div:before{font-family:feather;font-size:var(--font-size);width:var(--button-size);height:var(--button-size);background:var(--bg);color:var(--color);display:flex;align-items:center;justify-content:center}.pagination-full-container .pagination-container .first:before{content:\"\\e933\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .first.disable:hover:before{content:\"\\e933\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .first:hover:before{content:\"\\e933\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .previous.disable:hover:before{content:\"\\e92f\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .previous:before{content:\"\\e92f\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .previous:hover:before{content:\"\\e92f\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .next:before{content:\"\\e930\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .next.disable:hover:before{content:\"\\e930\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .next:hover:before{content:\"\\e930\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .pagination-container .last.disable:hover:before{content:\"\\e934\";background:#fff;color:#a5a4a4;border:1px solid #A5A4A4}.pagination-full-container .pagination-container .last:before{content:\"\\e934\";background:#fff;color:#a5a4a4;border:1px solid #D1D1D1}.pagination-full-container .pagination-container .last:hover:before{content:\"\\e934\";background:#a5a4a4;color:#fff;border:1px solid white}.pagination-full-container .hub-status{display:flex;align-items:center;font-size:.85rem;color:#555}.pagination-full-container .status-dot{width:10px;height:10px;border-radius:50%;background-color:#fca5a5;box-shadow:0 0 4px #fca5a580;transition:all .2s ease}.pagination-full-container .status-dot.connected{background-color:#22c55e;box-shadow:0 0 6px #22c55e}.pointer{cursor:pointer}@media only screen and (max-width: 768px){.custom-select-container{display:none}}@media only screen and (max-width: 576px){.pagination-container .pagination-container .not-current{display:none}.hide-item{display:none!important}}\n"] }]
14778
14784
  }], ctorParameters: () => [{ type: MultiLanguageService }], propDecorators: { currentPage$: [{
14779
14785
  type: Input
14780
14786
  }], height: [{
@@ -19069,7 +19075,7 @@ class CoreEmployeeSeekerComponent extends StaffProfileComponent {
19069
19075
  || employeeTerminatedStatusIdCamelCaseField === null
19070
19076
  || employeeTerminatedStatusIdCamelCaseField === undefined)
19071
19077
  return;
19072
- const hide = this.$hideTerminatedEmployees();
19078
+ const hide = this.$hideTerminatedEmployees ? this.$hideTerminatedEmployees() : false;
19073
19079
  // Giá trị này được truyền từ ngoài (tenant-specific),
19074
19080
  // KHÔNG hardcode trong seeker
19075
19081
  const terminatedStatusIds = [employeeTerminatedStatusId];
@@ -29199,23 +29205,192 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
29199
29205
  ], template: "<div class=\"dom-entity-token-container\">\r\n\r\n <div class=\"primary\">\r\n <span class=\"code\" [class.muted]=\"$primaryText() === 'Unnamed'\">\r\n {{ $primaryText() }}\r\n </span>\r\n </div>\r\n\r\n @if ($mode() !== 'pill' && $secondaryText()) {\r\n <div class=\"secondary\">\r\n {{ $secondaryText() }}\r\n </div>\r\n }\r\n\r\n</div>", styles: ["@charset \"UTF-8\";.dom-entity-token-container{cursor:pointer;display:inline-flex;flex-direction:column;gap:2px;padding:4px 6px;border-radius:6px;line-height:1.2;white-space:nowrap;background-color:#00000008;box-sizing:border-box}.dom-entity-token-container .primary{display:flex;align-items:center}.dom-entity-token-container .code{font-size:13px;letter-spacing:.2px}.dom-entity-token-container .code.muted{opacity:.6}.dom-entity-token-container .secondary{font-size:11.5px;opacity:.75;padding-left:1px}:host-context(.pill) .dom-entity-token-container{flex-direction:row;align-items:center;gap:6px}.dom-entity-token-container:hover{background-color:#0000000f}\n"] }]
29200
29206
  }] });
29201
29207
 
29208
+ const CreateOrganizationGrammar = {
29209
+ intentCode: EnumActionCode.CREATE_O,
29210
+ subject(ctx) {
29211
+ const name = ctx.facts['ORIGINAL_NAME'];
29212
+ return `Tạo phòng ban ${name}`;
29213
+ },
29214
+ clauses: [
29215
+ {
29216
+ when: ctx => !!ctx.temporal.localDate,
29217
+ render: ctx => `khả dụng từ ${ctx.temporal.localDate}`
29218
+ },
29219
+ {
29220
+ when: ctx => !!ctx.resolved['TREE_NAME'],
29221
+ render: ctx => `thuộc cây ${ctx.resolved['TREE_NAME']}`
29222
+ }
29223
+ ]
29224
+ };
29225
+ // narration-engine.ts
29226
+ function narrateIntent(grammar, ctx) {
29227
+ const parts = [];
29228
+ // 1) Subject (bắt buộc)
29229
+ const subject = grammar.subject(ctx);
29230
+ if (subject && subject.trim().length > 0) {
29231
+ parts.push(subject.trim());
29232
+ }
29233
+ // 2) Clauses (tuỳ chọn, theo thứ tự khai báo)
29234
+ if (grammar.clauses?.length) {
29235
+ for (const clause of grammar.clauses) {
29236
+ try {
29237
+ if (clause.when(ctx)) {
29238
+ const text = clause.render(ctx);
29239
+ if (text && text.trim().length > 0) {
29240
+ parts.push(text.trim());
29241
+ }
29242
+ }
29243
+ }
29244
+ catch {
29245
+ // ❗ Grammar error MUST NOT break projection
29246
+ // Có thể log ở đây nếu muốn
29247
+ }
29248
+ }
29249
+ }
29250
+ // 3) Join theo ngữ pháp tiếng Việt (space-based)
29251
+ return parts.join(' ');
29252
+ }
29253
+ const CREATE_TREE_GRAMMAR = {
29254
+ intentCode: EnumActionCode.CREATE_TREE,
29255
+ subject(ctx) {
29256
+ const treeName = ctx.facts['TREE_NAME'];
29257
+ const isHr = ctx.facts['IS_HR'];
29258
+ const isHrText = typeof isHr === 'boolean' ? (isHr ? "ngành ngang" : "ngành dọc") : "";
29259
+ return typeof treeName === 'string'
29260
+ ? `Tạo cây ${isHrText} ${treeName}`
29261
+ : 'Tạo cây ${isHrText}';
29262
+ },
29263
+ clauses: [
29264
+ {
29265
+ // khả dụng từ <date>
29266
+ when: ctx => !!ctx.temporal.localDate,
29267
+ render: ctx => `khả dụng từ ${ctx.temporal.localDate}`
29268
+ },
29269
+ {
29270
+ // thuộc cây <TREE_NAME>
29271
+ when: ctx => !!ctx.resolved['TREE_NAME'],
29272
+ render: ctx => `thuộc cây ${ctx.resolved['TREE_NAME']}`
29273
+ }
29274
+ ]
29275
+ };
29276
+ const CREATE_O_GRAMMAR = {
29277
+ intentCode: EnumActionCode.CREATE_O,
29278
+ subject(ctx) {
29279
+ const name = ctx.facts['ORIGINAL_NAME'];
29280
+ return typeof name === 'string'
29281
+ ? `Tạo phòng ban ${name}`
29282
+ : 'Tạo phòng ban';
29283
+ },
29284
+ clauses: [
29285
+ {
29286
+ // khả dụng từ <date>
29287
+ when: ctx => !!ctx.temporal.localDate,
29288
+ render: ctx => `khả dụng từ ${ctx.temporal.localDate}`
29289
+ },
29290
+ {
29291
+ // thuộc cây <TREE_NAME>
29292
+ when: ctx => !!ctx.resolved['TREE_NAME'],
29293
+ render: ctx => `thuộc cây ${ctx.resolved['TREE_NAME']}`
29294
+ }
29295
+ ]
29296
+ };
29297
+ const CREATE_S_GRAMMAR = {
29298
+ intentCode: EnumActionCode.CREATE_S,
29299
+ subject(ctx) {
29300
+ const name = ctx.facts['CODE'];
29301
+ return typeof name === 'string'
29302
+ ? `Tạo ghế ${name}`
29303
+ : 'Tạo ghế';
29304
+ },
29305
+ clauses: [
29306
+ {
29307
+ // khả dụng từ <date>
29308
+ when: ctx => !!ctx.temporal.localDate,
29309
+ render: ctx => `khả dụng từ ${ctx.temporal.localDate}`
29310
+ },
29311
+ {
29312
+ // thuộc cây <TREE_NAME>
29313
+ when: ctx => !!ctx.resolved['TREE_NAME'],
29314
+ render: ctx => `thuộc cây ${ctx.resolved['TREE_NAME']}`
29315
+ }
29316
+ ]
29317
+ };
29318
+ const LINK_O_O_GRAMMAR = {
29319
+ intentCode: EnumActionCode.LINK_O_O,
29320
+ rCode: EnumRCodeForward.O_IS_PART_OF_O,
29321
+ subject(ctx) {
29322
+ const a = ctx.resolved['A_ORIGINAL_NAME'];
29323
+ const b = ctx.resolved['B_ORIGINAL_NAME'];
29324
+ return a && b
29325
+ ? `Gán ${a} là đơn vị con của ${b}`
29326
+ : 'Gán quan hệ tổ chức';
29327
+ },
29328
+ clauses: [
29329
+ {
29330
+ when: ctx => !!ctx.temporal.effective?.from,
29331
+ render: ctx => {
29332
+ const { from, to } = ctx.temporal.effective;
29333
+ return to
29334
+ ? `hiệu lực từ ${from} đến ${to}`
29335
+ : `hiệu lực từ ${from}`;
29336
+ }
29337
+ },
29338
+ ]
29339
+ };
29340
+
29341
+ const INTENT_GRAMMAR_REGISTRY = [
29342
+ CREATE_TREE_GRAMMAR,
29343
+ CREATE_O_GRAMMAR,
29344
+ CREATE_S_GRAMMAR,
29345
+ LINK_O_O_GRAMMAR
29346
+ ];
29347
+
29202
29348
  class DomDecisionContextService {
29203
29349
  constructor() {
29204
29350
  this.fb = inject(FormBuilder);
29205
- this.form = this.fb.group({});
29351
+ this.$form = signal(this.fb.group({}));
29352
+ this.acs = inject(AppConfigService);
29206
29353
  this.$formRawValue = signal(null);
29207
- // Omega được cấp từ Editor
29208
- this.$omega = signal(null);
29354
+ this.$omega = signal({
29355
+ omegaVersion: '1.0',
29356
+ inputChain: []
29357
+ });
29209
29358
  this.$selectedIntentDescriptor = signal(null);
29210
- this.$activeSeq = signal(null); // null = create mode
29359
+ /**
29360
+ * chỉ dùng cho CREATE
29361
+ */
29362
+ this.$createSeq = computed(() => this.$omega().inputChain.length + 1);
29363
+ /**
29364
+ * dùng cho VIEW / EDIT LATEST
29365
+ */
29366
+ this.$viewSeq = signal(null);
29367
+ this.$projection = computed(() => {
29368
+ const omega = this.$omega();
29369
+ // Trường hợp cực đoan (chỉ khi anh vẫn cho omega nullable)
29370
+ if (!omega) {
29371
+ return {
29372
+ intentCount: 0,
29373
+ validityLabel: 'Chưa có quyết định',
29374
+ intents: [],
29375
+ outputs: [],
29376
+ };
29377
+ }
29378
+ return this.rebuildProjectionFromOmega(omega);
29379
+ });
29380
+ this.$activeInputSnapshot = computed(() => {
29381
+ const seq = this.$viewSeq();
29382
+ const omega = this.$omega();
29383
+ if (seq == null)
29384
+ return null;
29385
+ return omega.inputChain.find(i => i.seq === seq)?.inputSnapshot ?? null;
29386
+ });
29211
29387
  this.$nextSeq = computed(() => (this.$omega()?.inputChain?.length ?? 0) + 1);
29212
- this.$rehydrateSnapshot = signal(null);
29213
29388
  this.$isLastSeq = computed(() => {
29214
- const activeSeq = this.$activeSeq();
29389
+ const viewSeq = this.$viewSeq();
29215
29390
  const chainLength = this.$omega()?.inputChain?.length ?? 0;
29216
- if (activeSeq === null)
29391
+ if (viewSeq === null)
29217
29392
  return false; // ⛔ create ≠ last
29218
- return activeSeq === chainLength;
29393
+ return viewSeq === chainLength;
29219
29394
  });
29220
29395
  /**
29221
29396
  * $allTokens
@@ -29258,10 +29433,10 @@ class DomDecisionContextService {
29258
29433
  * Tập hợp các EntityToken HỢP LỆ tại thời điểm quyết định hiện tại,
29259
29434
  * được suy diễn dựa trên:
29260
29435
  * - $allTokens
29261
- * - $activeSeq (bối cảnh đang xét)
29436
+ * - seq (bối cảnh đang xét)
29262
29437
  *
29263
29438
  * Nguyên tắc:
29264
- * - Chỉ xét token có producedBySeq <= activeSeq
29439
+ * - Chỉ xét token có producedBySeq <= seq
29265
29440
  * - Với mỗi uuid, chỉ giữ token mới nhất (last-write-wins theo seq)
29266
29441
  *
29267
29442
  * Ý nghĩa nghiệp vụ:
@@ -29277,18 +29452,25 @@ class DomDecisionContextService {
29277
29452
  * khi cần suy luận hoặc cho phép người dùng chọn entity.
29278
29453
  */
29279
29454
  this.$currentTokens = computed(() => {
29280
- const activeSeq = this.$activeSeq();
29455
+ const seq = this.$viewSeq() ?? this.$createSeq();
29281
29456
  const tokens = this.$allTokens();
29282
- // Chưa ngữ cảnh → không token nào được dùng
29283
- if (activeSeq == null)
29284
- return [];
29285
- return tokens.filter(t => t.producedBySeq < activeSeq);
29457
+ return tokens.filter(t => t.producedBySeq < seq);
29286
29458
  });
29287
29459
  }
29460
+ /**
29461
+ * Build và bind lại form theo trạng thái hiện tại của decision.
29462
+ *
29463
+ * - Không giữ draft field-level
29464
+ * - Luôn render từ omega (working store)
29465
+ * - Được gọi lại khi descriptor / seq / omega thay đổi
29466
+ *
29467
+ * @param descriptor Mô tả intent đang được edit
29468
+ */
29288
29469
  buildForm(descriptor) {
29289
29470
  const controls = {};
29290
- const snapshot = this.$rehydrateSnapshot();
29291
- // Logical inputs
29471
+ const snapshot = this.$viewSeq() != null
29472
+ ? this.$activeInputSnapshot()
29473
+ : null;
29292
29474
  for (const input of descriptor.inputs) {
29293
29475
  const value = snapshot?.[input.key]
29294
29476
  ?? input.defaultValueFactory?.()
@@ -29296,16 +29478,16 @@ class DomDecisionContextService {
29296
29478
  ?? null;
29297
29479
  const control = new FormControl(value, this.buildValidators(input.validators));
29298
29480
  if (input.disabled) {
29299
- controls[input.key].disable({ emitEvent: false });
29481
+ control.disable({ emitEvent: false });
29300
29482
  }
29301
29483
  controls[input.key] = control;
29302
29484
  }
29303
29485
  // ⚠️ atomic replace
29304
- this.form = new FormGroup(controls);
29486
+ this.$form.set(new FormGroup(controls));
29305
29487
  // 🔹 snapshot ban đầu
29306
- this.$formRawValue.set(this.form.getRawValue());
29488
+ this.$formRawValue.set(this.$form().getRawValue());
29307
29489
  if (this.intentInputMode() === 'view-only') {
29308
- this.form.disable({ emitEvent: false });
29490
+ this.$form().disable({ emitEvent: false });
29309
29491
  }
29310
29492
  this.bindFormValueChanges();
29311
29493
  }
@@ -29335,15 +29517,221 @@ class DomDecisionContextService {
29335
29517
  }
29336
29518
  bindFormValueChanges() {
29337
29519
  this.formSubscription?.unsubscribe();
29338
- this.formSubscription = this.form.valueChanges.subscribe(value => {
29520
+ this.formSubscription = this.$form().valueChanges.subscribe(value => {
29339
29521
  this.$formRawValue.set(value);
29340
29522
  });
29341
29523
  }
29342
29524
  intentInputMode() {
29343
- if (!this.$activeSeq())
29525
+ if (!this.$viewSeq())
29344
29526
  return 'create';
29345
29527
  return this.$isLastSeq() ? 'edit-last' : 'view-only';
29346
29528
  }
29529
+ buildTemporalContext(facts) {
29530
+ const tzRaw = facts['TIMEZONE_ID'];
29531
+ const timezoneId = typeof tzRaw === 'string'
29532
+ ? tzRaw
29533
+ : (this.acs.CANONICAL_IANA_TIMEZONES?.[0] ?? 'Asia/Ho_Chi_Minh');
29534
+ // ---- RANGE semantics (LINK_, SET_) ----
29535
+ const vfIso = this.normalizeUtc(facts['VF_UTC']);
29536
+ const vtIso = this.normalizeUtc(facts['VT_UTC']);
29537
+ if (vfIso) {
29538
+ try {
29539
+ const fromDate = new Date(vfIso);
29540
+ if (isNaN(fromDate.getTime()))
29541
+ return {};
29542
+ const from = this.formatLocalDate(fromDate, timezoneId);
29543
+ let to;
29544
+ if (vtIso) {
29545
+ if (vtIso.includes('9999')) {
29546
+ to = ''; // 'đến khi có quyết định thay đổi'
29547
+ }
29548
+ else {
29549
+ const toDate = new Date(vtIso);
29550
+ if (!isNaN(toDate.getTime())) {
29551
+ to = this.formatLocalDate(toDate, timezoneId);
29552
+ }
29553
+ }
29554
+ }
29555
+ return {
29556
+ timezoneId,
29557
+ effective: { from, to },
29558
+ mode: 'RANGE'
29559
+ };
29560
+ }
29561
+ catch {
29562
+ return {};
29563
+ }
29564
+ }
29565
+ // ---- POINT semantics (CREATE_) ----
29566
+ const utcIso = this.normalizeUtc(facts['AVAILABLE_UTC']);
29567
+ if (!utcIso)
29568
+ return {};
29569
+ try {
29570
+ const date = new Date(utcIso);
29571
+ if (isNaN(date.getTime()))
29572
+ return {};
29573
+ const localDate = this.formatLocalDate(date, timezoneId);
29574
+ return {
29575
+ localDate,
29576
+ timezoneId,
29577
+ mode: 'POINT'
29578
+ };
29579
+ }
29580
+ catch {
29581
+ return {};
29582
+ }
29583
+ }
29584
+ normalizeUtc(raw) {
29585
+ if (typeof raw === 'string')
29586
+ return raw;
29587
+ if (raw instanceof Date)
29588
+ return raw.toISOString();
29589
+ return null;
29590
+ }
29591
+ formatLocalDate(date, timezoneId) {
29592
+ return this.acs.DEFAULT_IANA_TIMEZONE_ID === 'Asia/Ho_Chi_Minh'
29593
+ ? new Intl.DateTimeFormat('vi-VN', {
29594
+ timeZone: timezoneId,
29595
+ day: '2-digit',
29596
+ month: '2-digit',
29597
+ year: 'numeric'
29598
+ }).format(date)
29599
+ : new Intl.DateTimeFormat('en-CA', {
29600
+ timeZone: timezoneId
29601
+ }).format(date);
29602
+ }
29603
+ buildNarrationContext(intent) {
29604
+ const facts = intent.inputSnapshot ?? {};
29605
+ const temporal = this.buildTemporalContext(facts);
29606
+ const resolved = this.buildResolvedContext(facts);
29607
+ return {
29608
+ locale: 'vi',
29609
+ facts,
29610
+ resolved,
29611
+ temporal
29612
+ };
29613
+ }
29614
+ /**
29615
+ * Xây dựng Resolved Context cho Intent Narration
29616
+ *
29617
+ * Lớp này làm nhiệm vụ làm giàu (enrich) dữ liệu intent thô
29618
+ * bằng các giá trị dễ đọc, phục vụ cho việc diễn giải (narration),
29619
+ * nhưng TUYỆT ĐỐI KHÔNG thay đổi hay ghi đè lên facts gốc.
29620
+ *
29621
+ * Nguyên tắc thiết kế:
29622
+ * - facts : sự thật máy móc, bất biến (ID, mã, UTC, enum…)
29623
+ * - resolved : diễn giải bổ sung, tùy chọn, thân thiện với con người
29624
+ * - grammar : chỉ ghép câu, không tra cứu, không chứa logic nghiệp vụ
29625
+ *
29626
+ * Trách nhiệm của hàm này:
29627
+ * - Diễn giải các tham chiếu chéo (ví dụ: TREE_ID → TREE_NAME)
29628
+ * - Chuẩn hóa vai trò thành nhãn dễ đọc (ví dụ: MASTER → "vai trò chính")
29629
+ * - Lưu giữ snapshot tên hiển thị tại thời điểm tạo intent
29630
+ * (LEFT_/RIGHT_ ORIGINAL_NAME) phục vụ audit và narration
29631
+ *
29632
+ * Những gì hàm này KHÔNG làm (có chủ ý):
29633
+ * - Không gọi API / DB tại runtime
29634
+ * - Không thay đổi dữ liệu facts đầu vào
29635
+ * - Không xử lý logic ngữ pháp hay ghép câu
29636
+ *
29637
+ * Đây là lớp "diễn giải ngữ nghĩa" nằm giữa dữ liệu intent thuần
29638
+ * và lớp grammar chịu trách nhiệm kể câu chuyện cho con người.
29639
+ */
29640
+ buildResolvedContext(facts) {
29641
+ const resolved = {};
29642
+ // TREE
29643
+ if (typeof facts['TREE_ID'] === 'string') {
29644
+ resolved['TREE_NAME'] = this.resolveTreeName(facts['TREE_ID']);
29645
+ }
29646
+ // ROLE (optional)
29647
+ if (typeof facts['ROLE'] === 'string' &&
29648
+ facts['ROLE'] !== 'NONE') {
29649
+ resolved['ROLE'] = `với vai trò ${facts['ROLE']}`;
29650
+ }
29651
+ // A_ORIGINAL_NAME (optional)
29652
+ if (typeof facts['A_ORIGINAL_NAME'] === 'string') {
29653
+ resolved['A_ORIGINAL_NAME'] = facts['A_ORIGINAL_NAME'];
29654
+ }
29655
+ // B_ORIGINAL_NAME (optional)
29656
+ if (typeof facts['B_ORIGINAL_NAME'] === 'string') {
29657
+ resolved['B_ORIGINAL_NAME'] = facts['B_ORIGINAL_NAME'];
29658
+ }
29659
+ return resolved;
29660
+ }
29661
+ resolveTreeName(treeId) {
29662
+ // TODO: thay bằng snapshot / token sau
29663
+ return 'HR';
29664
+ }
29665
+ rebuildProjectionFromOmega(omega) {
29666
+ const intents = omega.inputChain.map(intent => {
29667
+ const descriptor = INTENT_DESCRIPTOR_REGISTRY
29668
+ .find(d => d.actionCode === intent.actionCode);
29669
+ const grammar = INTENT_GRAMMAR_REGISTRY
29670
+ .find(g => g.intentCode === intent.actionCode);
29671
+ const actionLabel = descriptor?.label ?? intent.actionCode;
29672
+ const narrationContext = this.buildNarrationContext(intent);
29673
+ const summary = grammar
29674
+ ? narrateIntent(grammar, narrationContext)
29675
+ : undefined;
29676
+ return {
29677
+ seq: intent.seq,
29678
+ actionLabel,
29679
+ actionCode: intent.actionCode,
29680
+ inputSnapshot: intent.inputSnapshot,
29681
+ summary
29682
+ };
29683
+ });
29684
+ return {
29685
+ intentCount: intents.length,
29686
+ intents,
29687
+ outputs: []
29688
+ };
29689
+ }
29690
+ produceOutputs(seq, draft) {
29691
+ const input = draft.inputSnapshot;
29692
+ switch (draft.actionCode) {
29693
+ case EnumActionCode.CREATE_O: {
29694
+ const id = input['ID'];
29695
+ if (typeof id !== 'string')
29696
+ return undefined;
29697
+ const originalName = input['ORIGINAL_NAME'];
29698
+ const code = input['CODE'];
29699
+ return [{
29700
+ token: `T${seq}`,
29701
+ entityType: 'O',
29702
+ uuid: id,
29703
+ producedBySeq: seq,
29704
+ humanSnapshot: {
29705
+ ORIGINAL_NAME: typeof originalName === 'string' ? originalName : undefined,
29706
+ CODE: typeof code === 'string' ? code : undefined
29707
+ }
29708
+ }];
29709
+ }
29710
+ case EnumActionCode.CREATE_TREE: {
29711
+ const treeName = input['TREE_NAME'];
29712
+ const id = input['ID'];
29713
+ if (typeof treeName !== 'string')
29714
+ return undefined;
29715
+ const uuid = typeof id === 'string'
29716
+ ? id
29717
+ : crypto.randomUUID();
29718
+ return [{
29719
+ token: `T${seq}`,
29720
+ entityType: 'O',
29721
+ uuid,
29722
+ producedBySeq: seq,
29723
+ humanSnapshot: {
29724
+ TREE_NAME: treeName
29725
+ }
29726
+ }];
29727
+ }
29728
+ case EnumActionCode.LINK_O_O:
29729
+ // quan hệ, không sinh entity
29730
+ return undefined;
29731
+ default:
29732
+ return undefined;
29733
+ }
29734
+ }
29347
29735
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DomDecisionContextService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
29348
29736
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DomDecisionContextService }); }
29349
29737
  }
@@ -29431,7 +29819,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
29431
29819
  * - KHÔNG nhận token qua @Input().
29432
29820
  *
29433
29821
  * DomOIdFactory chỉ đọc “sự thật ngữ cảnh” từ DomDecisionContextService,
29434
- * nơi tập hợp các token hợp lệ theo activeSeq hiện tại của Decision.
29822
+ * nơi tập hợp các token hợp lệ theo seq hiện tại của Decision.
29435
29823
  * Nhờ đó, component này không bao giờ cho phép người dùng
29436
29824
  * “nhắc tới tương lai” hoặc phá vỡ quan hệ nhân quả của Intent Chain.
29437
29825
  *
@@ -29706,7 +30094,7 @@ class CreateTreeInputsComponent extends BaseIntentInputsComponent {
29706
30094
  return actionCode === EnumActionCode.CREATE_TREE;
29707
30095
  }
29708
30096
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateTreeInputsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
29709
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CreateTreeInputsComponent, isStandalone: true, selector: "create-tree-inputs", usesInheritance: true, ngImport: i0, template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher\r\n [formControlName]=\"input.key\"\r\n [showOnOffText]=\"false\"\r\n [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Active Seq: {{ $context().activeSeq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CoreIosSwitcherComponent, selector: "core-ios-switcher", inputs: ["bgColor", "showOnOffText", "width", "height", "readonly"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
30097
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CreateTreeInputsComponent, isStandalone: true, selector: "create-tree-inputs", usesInheritance: true, ngImport: i0, template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher\r\n [formControlName]=\"input.key\"\r\n [showOnOffText]=\"false\"\r\n [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Seq: {{ $context().seq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CoreIosSwitcherComponent, selector: "core-ios-switcher", inputs: ["bgColor", "showOnOffText", "width", "height", "readonly"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
29710
30098
  }
29711
30099
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateTreeInputsComponent, decorators: [{
29712
30100
  type: Component,
@@ -29714,7 +30102,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
29714
30102
  ReactiveFormsModule,
29715
30103
  CoreIosSwitcherComponent,
29716
30104
  TranslatePipe,
29717
- ], template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher\r\n [formControlName]=\"input.key\"\r\n [showOnOffText]=\"false\"\r\n [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Active Seq: {{ $context().activeSeq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>" }]
30105
+ ], template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher\r\n [formControlName]=\"input.key\"\r\n [showOnOffText]=\"false\"\r\n [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Seq: {{ $context().seq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>" }]
29718
30106
  }] });
29719
30107
 
29720
30108
  class CreateOInputsComponent extends BaseIntentInputsComponent {
@@ -29750,7 +30138,7 @@ class CreateOInputsComponent extends BaseIntentInputsComponent {
29750
30138
  });
29751
30139
  }
29752
30140
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateOInputsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
29753
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CreateOInputsComponent, isStandalone: true, selector: "create-o-inputs", usesInheritance: true, ngImport: i0, template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('treeId') {\r\n <core-dropdown [options$]=\"treeIdOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('date') {\r\n <core-date-picker [formControlName]=\"input.key\" [$rangePoint]=\"'start'\"\r\n [required]=\"!!input.validators?.required\" />\r\n }\r\n\r\n @case ('timezoneId') {\r\n <core-timezone [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher [formControlName]=\"input.key\" [showOnOffText]=\"false\" [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Active Seq: {{ $context().activeSeq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>", styles: [""], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CoreDropdownComponent, selector: "core-dropdown", inputs: ["getByIdObject$", "paramMode", "shownFrom", "options$", "height", "placeholder", "loading", "warningDisable", "clearDisable", "fitHeightWithItemCount", "itemHeight", "optionApiDriven", "optionApi", "optionHttpVerb", "optionHttpPayload", "optionValueFrom", "optionTextFrom", "$disabled"] }, { kind: "component", type: CoreDatePickerComponent, selector: "core-date-picker", inputs: ["enableTimeZoneConverter", "showPlaceholder", "popupWidth", "popupXPadding", "popupAlign", "rangeLimit", "placeholder", "readonly", "disabled", "$rangePoint"] }, { kind: "component", type: CoreTimezoneComponent, selector: "core-timezone" }, { kind: "component", type: CoreIosSwitcherComponent, selector: "core-ios-switcher", inputs: ["bgColor", "showOnOffText", "width", "height", "readonly"] }] }); }
30141
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CreateOInputsComponent, isStandalone: true, selector: "create-o-inputs", usesInheritance: true, ngImport: i0, template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('treeId') {\r\n <core-dropdown [options$]=\"treeIdOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('date') {\r\n <core-date-picker [formControlName]=\"input.key\" [$rangePoint]=\"'start'\"\r\n [required]=\"!!input.validators?.required\" />\r\n }\r\n\r\n @case ('timezoneId') {\r\n <core-timezone [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher [formControlName]=\"input.key\" [showOnOffText]=\"false\" [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Active Seq: {{ $context().seq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>", styles: [""], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CoreDropdownComponent, selector: "core-dropdown", inputs: ["getByIdObject$", "paramMode", "shownFrom", "options$", "height", "placeholder", "loading", "warningDisable", "clearDisable", "fitHeightWithItemCount", "itemHeight", "optionApiDriven", "optionApi", "optionHttpVerb", "optionHttpPayload", "optionValueFrom", "optionTextFrom", "$disabled"] }, { kind: "component", type: CoreDatePickerComponent, selector: "core-date-picker", inputs: ["enableTimeZoneConverter", "showPlaceholder", "popupWidth", "popupXPadding", "popupAlign", "rangeLimit", "placeholder", "readonly", "disabled", "$rangePoint"] }, { kind: "component", type: CoreTimezoneComponent, selector: "core-timezone" }, { kind: "component", type: CoreIosSwitcherComponent, selector: "core-ios-switcher", inputs: ["bgColor", "showOnOffText", "width", "height", "readonly"] }] }); }
29754
30142
  }
29755
30143
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateOInputsComponent, decorators: [{
29756
30144
  type: Component,
@@ -29761,7 +30149,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
29761
30149
  CoreDatePickerComponent,
29762
30150
  CoreTimezoneComponent,
29763
30151
  CoreIosSwitcherComponent,
29764
- ], template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('treeId') {\r\n <core-dropdown [options$]=\"treeIdOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('date') {\r\n <core-date-picker [formControlName]=\"input.key\" [$rangePoint]=\"'start'\"\r\n [required]=\"!!input.validators?.required\" />\r\n }\r\n\r\n @case ('timezoneId') {\r\n <core-timezone [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher [formControlName]=\"input.key\" [showOnOffText]=\"false\" [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Active Seq: {{ $context().activeSeq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>" }]
30152
+ ], template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('treeId') {\r\n <core-dropdown [options$]=\"treeIdOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('date') {\r\n <core-date-picker [formControlName]=\"input.key\" [$rangePoint]=\"'start'\"\r\n [required]=\"!!input.validators?.required\" />\r\n }\r\n\r\n @case ('timezoneId') {\r\n <core-timezone [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher [formControlName]=\"input.key\" [showOnOffText]=\"false\" [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Active Seq: {{ $context().seq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>" }]
29765
30153
  }] });
29766
30154
 
29767
30155
  class IntentComposerComponent extends BaseComponent {
@@ -29785,17 +30173,17 @@ class IntentComposerComponent extends BaseComponent {
29785
30173
  this.ctx = inject(DomDecisionContextService);
29786
30174
  this.applicationHelpService = inject(ApplicationHelpService);
29787
30175
  this.$allTokens = this.ctx.$allTokens;
29788
- this.form = this.ctx.form;
29789
- this.$formRawValue = signal(null);
30176
+ this.$form = this.ctx.$form;
30177
+ this.$formRawValue = this.ctx.$formRawValue;
29790
30178
  this.isDevMode = isDevMode();
29791
30179
  this.$context = computed(() => ({
29792
- form: this.form,
30180
+ form: this.$form(),
29793
30181
  descriptor: this.$descriptor(),
29794
30182
  currentTokens: this.ctx.$currentTokens(),
29795
30183
  mode: this.ctx.intentInputMode(),
29796
- activeSeq: this.ctx.$activeSeq(),
30184
+ seq: this.ctx.$viewSeq() ?? this.ctx.$createSeq(),
29797
30185
  isLastSeq: this.ctx.$isLastSeq(),
29798
- inputSnapshot: this.ctx.$rehydrateSnapshot()
30186
+ inputSnapshot: this.ctx.$activeInputSnapshot()
29799
30187
  }));
29800
30188
  this.rCodeOptions$ = new BehaviorSubject(RCODE_FORWARD_VALUES.map(x => ({ value: x, text: x })));
29801
30189
  this.roleOptions$ = new BehaviorSubject([
@@ -29822,7 +30210,12 @@ class IntentComposerComponent extends BaseComponent {
29822
30210
  const descriptor = this.$descriptor();
29823
30211
  if (!descriptor)
29824
30212
  return;
29825
- this.buildForm(descriptor);
30213
+ const snapshot = this.ctx.$activeInputSnapshot();
30214
+ const seq = this.ctx.$viewSeq() ?? this.ctx.$createSeq();
30215
+ // 👇 CHÌA KHÓA:
30216
+ // chỉ cần đọc snapshot + seq để tạo dependency
30217
+ // không cần if(snapshot)
30218
+ this.ctx.buildForm(descriptor);
29826
30219
  });
29827
30220
  this.subscriptions.push(this.applicationHelpService.activeKey$
29828
30221
  .pipe(distinctUntilChanged())
@@ -29834,90 +30227,115 @@ class IntentComposerComponent extends BaseComponent {
29834
30227
  }
29835
30228
  }));
29836
30229
  }
29837
- // ===== Methods =====
29838
- buildForm(descriptor) {
29839
- const controls = {};
29840
- const snapshot = this.ctx.$rehydrateSnapshot();
29841
- // Logical inputs
29842
- for (const input of descriptor.inputs) {
29843
- const value = snapshot?.[input.key]
29844
- ?? input.defaultValueFactory?.()
29845
- ?? input.defaultValue
29846
- ?? null;
29847
- const control = new FormControl(value, this.buildValidators(input.validators));
29848
- if (input.disabled) {
29849
- controls[input.key].disable({ emitEvent: false });
29850
- }
29851
- controls[input.key] = control;
29852
- }
29853
- // ⚠️ atomic replace
29854
- this.form = new FormGroup(controls);
29855
- // 🔹 snapshot ban đầu
29856
- this.$formRawValue.set(this.form.getRawValue());
29857
- if (this.ctx.intentInputMode() === 'view-only') {
29858
- this.form.disable({ emitEvent: false });
30230
+ /*
30231
+ buildForm(
30232
+ descriptor: IIntentDescriptor,
30233
+ ) {
30234
+
30235
+ const controls: Record<string, FormControl> = {};
30236
+ const snapshot = this.ctx.$rehydrateSnapshot();
30237
+
30238
+ // Logical inputs
30239
+ for (const input of descriptor.inputs) {
30240
+
30241
+ const value =
30242
+ snapshot?.[input.key]
30243
+ ?? input.defaultValueFactory?.()
30244
+ ?? input.defaultValue
30245
+ ?? null;
30246
+
30247
+ const control = new FormControl(
30248
+ value,
30249
+ this.buildValidators(input.validators)
30250
+ );
30251
+
30252
+ if (input.disabled) {
30253
+ controls[input.key].disable({ emitEvent: false });
29859
30254
  }
29860
- this.bindFormValueChanges();
29861
- // TO DO: REMOVE THE REST
29862
- if (this.vfUtcSubscription)
29863
- this.vfUtcSubscription.unsubscribe();
29864
- if (this.$descriptor().actionCode === EnumActionCode.LINK_O_O) {
29865
- const vfUtc = this.form.controls['VF_UTC'];
29866
- const aId = this.form.controls['A_ID'];
29867
- if (!aId)
29868
- this.as.error('LINK_O_O form must have A_ID', noneAutoClosedAlertOptions);
29869
- const bId = this.form.controls['B_ID'];
29870
- if (!bId)
29871
- this.as.error('LINK_O_O form must have B_ID', noneAutoClosedAlertOptions);
29872
- const aOriginalName = this.form.controls['A_ORIGINAL_NAME'];
29873
- if (!aOriginalName)
29874
- this.as.error('LINK_O_O form must have A_ORIGINAL_NAME', noneAutoClosedAlertOptions);
29875
- const bOriginalName = this.form.controls['B_ORIGINAL_NAME'];
29876
- if (!bOriginalName)
29877
- this.as.error('LINK_O_O form must have B_ORIGINAL_NAME', noneAutoClosedAlertOptions);
29878
- if (vfUtc) {
29879
- this.vfUtcSubscription = vfUtc.valueChanges.subscribe(x => {
29880
- if (!x) {
29881
- aId?.reset();
29882
- aOriginalName?.reset();
29883
- bId?.reset();
29884
- bOriginalName?.reset();
29885
- aId?.disable();
29886
- aOriginalName?.disable();
29887
- bId?.disable();
29888
- bOriginalName?.disable();
29889
- }
29890
- else {
29891
- aId?.enable();
29892
- aOriginalName?.enable();
29893
- bId?.enable();
29894
- bOriginalName?.enable();
29895
- }
29896
- });
29897
- }
29898
- else {
29899
- this.as.error('LINK_O_O form must have VF_UTC', noneAutoClosedAlertOptions);
30255
+
30256
+ controls[input.key] = control;
30257
+ }
30258
+
30259
+ // ⚠️ atomic replace
30260
+ this.form = new FormGroup(controls);
30261
+
30262
+ // 🔹 snapshot ban đầu
30263
+ this.$formRawValue.set(this.form.getRawValue());
30264
+
30265
+ if (this.ctx.intentInputMode() === 'view-only') {
30266
+ this.form.disable({ emitEvent: false });
30267
+ }
30268
+
30269
+ this.bindFormValueChanges();
30270
+
30271
+ // TO DO: REMOVE THE REST
30272
+
30273
+ if (this.vfUtcSubscription) this.vfUtcSubscription.unsubscribe();
30274
+
30275
+ if (this.$descriptor().actionCode === EnumActionCode.LINK_O_O) {
30276
+
30277
+ const vfUtc = this.form.controls['VF_UTC'];
30278
+ const aId = this.form.controls['A_ID'];
30279
+ if (!aId) this.as.error('LINK_O_O form must have A_ID', noneAutoClosedAlertOptions)
30280
+ const bId = this.form.controls['B_ID'];
30281
+ if (!bId) this.as.error('LINK_O_O form must have B_ID', noneAutoClosedAlertOptions)
30282
+ const aOriginalName = this.form.controls['A_ORIGINAL_NAME'];
30283
+ if (!aOriginalName) this.as.error('LINK_O_O form must have A_ORIGINAL_NAME', noneAutoClosedAlertOptions)
30284
+ const bOriginalName = this.form.controls['B_ORIGINAL_NAME'];
30285
+ if (!bOriginalName) this.as.error('LINK_O_O form must have B_ORIGINAL_NAME', noneAutoClosedAlertOptions)
30286
+
30287
+ if (vfUtc) {
30288
+ this.vfUtcSubscription = vfUtc!.valueChanges.subscribe(x => {
30289
+ if (!x) {
30290
+
30291
+ aId?.reset();
30292
+ aOriginalName?.reset();
30293
+ bId?.reset();
30294
+ bOriginalName?.reset();
30295
+
30296
+ aId?.disable();
30297
+ aOriginalName?.disable();
30298
+ bId?.disable();
30299
+ bOriginalName?.disable();
30300
+
30301
+ } else {
30302
+ aId?.enable();
30303
+ aOriginalName?.enable();
30304
+ bId?.enable();
30305
+ bOriginalName?.enable();
29900
30306
  }
30307
+ })
30308
+ } else {
30309
+ this.as.error('LINK_O_O form must have VF_UTC', noneAutoClosedAlertOptions)
29901
30310
  }
29902
- this.applyActionSpecificBehavior(descriptor);
30311
+ }
30312
+
30313
+ this.applyActionSpecificBehavior(descriptor)
29903
30314
  }
29904
- bindFormValueChanges() {
29905
- this.formSubscription?.unsubscribe();
29906
- this.formSubscription = this.form.valueChanges.subscribe(value => {
29907
- this.$formRawValue.set(value);
29908
- });
30315
+ */
30316
+ /*
30317
+ private bindFormValueChanges(): void {
30318
+ this.formSubscription?.unsubscribe();
30319
+
30320
+ this.formSubscription = this.form.valueChanges.subscribe(value => {
30321
+ this.ctx.$formRawValue.set(value);
30322
+ });
29909
30323
  }
30324
+ */
29910
30325
  onConfirm() {
29911
- this.form.markAllAsTouched();
30326
+ this.$form().markAllAsTouched();
29912
30327
  this.rebuildErrors();
29913
30328
  if (this.$errors().length > 0)
29914
30329
  return;
29915
- const snapshot = this.form.getRawValue();
30330
+ const snapshot = this.$form().getRawValue();
30331
+ const seq = this.ctx.$viewSeq() ?? this.ctx.$createSeq();
29916
30332
  this.intentComposed.emit({
29917
30333
  actionCode: this.$descriptor().actionCode,
29918
- inputSnapshot: snapshot
30334
+ inputSnapshot: snapshot,
30335
+ seq: seq
29919
30336
  });
29920
30337
  this.ctx.$selectedIntentDescriptor.set(null);
30338
+ this.ctx.$viewSeq.set(null); // reset về create mode
29921
30339
  }
29922
30340
  onCancel() {
29923
30341
  this.cancelled.emit();
@@ -29949,13 +30367,13 @@ class IntentComposerComponent extends BaseComponent {
29949
30367
  }
29950
30368
  rebuildErrors() {
29951
30369
  this.$errors.set([]);
29952
- if (!this.form)
30370
+ if (!this.$form())
29953
30371
  return;
29954
30372
  const descriptor = this.$descriptor();
29955
30373
  if (!descriptor)
29956
30374
  return;
29957
30375
  for (const input of descriptor.inputs) {
29958
- const control = this.form.get(input.key);
30376
+ const control = this.$form().get(input.key);
29959
30377
  if (!control)
29960
30378
  continue;
29961
30379
  // Chỉ hiện lỗi khi user đã "dám chạm"
@@ -30003,8 +30421,8 @@ class IntentComposerComponent extends BaseComponent {
30003
30421
  applyActionSpecificBehavior(descriptor) {
30004
30422
  if (descriptor.actionCode !== EnumActionCode.CREATE_O)
30005
30423
  return;
30006
- const codeCtrl = this.form.get('CODE');
30007
- const shortCodeCtrl = this.form.get('SHORT_CODE');
30424
+ const codeCtrl = this.$form().get('CODE');
30425
+ const shortCodeCtrl = this.$form().get('SHORT_CODE');
30008
30426
  if (!codeCtrl || !shortCodeCtrl)
30009
30427
  return;
30010
30428
  // CODE luôn là UUID, user không nhập
@@ -30020,7 +30438,7 @@ class IntentComposerComponent extends BaseComponent {
30020
30438
  this.cancelled.emit();
30021
30439
  }
30022
30440
  setSnapshot(key, value) {
30023
- this.form.controls[key].setValue(value ?? '');
30441
+ this.$form().controls[key].setValue(value ?? '');
30024
30442
  }
30025
30443
  //
30026
30444
  onOrgResolved(e) {
@@ -30033,13 +30451,13 @@ class IntentComposerComponent extends BaseComponent {
30033
30451
  }
30034
30452
  ngOnDestroy() {
30035
30453
  this.subscriptions.forEach(x => x?.unsubscribe());
30036
- if (this.formSubscription)
30037
- this.formSubscription.unsubscribe();
30038
30454
  if (this.vfUtcSubscription)
30039
30455
  this.vfUtcSubscription.unsubscribe();
30040
30456
  }
30041
30457
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IntentComposerComponent, deps: [{ token: MultiLanguageService }], target: i0.ɵɵFactoryTarget.Component }); }
30042
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: IntentComposerComponent, isStandalone: true, selector: "intent-composer", inputs: { $descriptor: { classPropertyName: "$descriptor", publicName: "$descriptor", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { intentComposed: "intentComposed", cancelled: "cancelled" }, host: { listeners: { "keydown.escape": "onEscape($event)" } }, viewQueries: [{ propertyName: "$defaultOrgItemTpl", first: true, predicate: ["defaultOrgItemTpl"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!--\r\n IntentComposerComponent\r\n Purpose:\r\n - Collect human input for a single OM intent\r\n - Emit IntentDraft only\r\n Must NOT:\r\n - Mutate Omega\r\n - Modify IntentChain\r\n-->\r\n@if (form) {\r\n<form class=\"intent-composer-container\" [formGroup]=\"form\" (ngSubmit)=\"onConfirm()\" autocomplete=\"off\" [hotKeys]=\"hotKeys\">\r\n\r\n <!-- Header -->\r\n <div class=\"composer-header\">\r\n <core-page-header [hideButtonGroup]=\"true\" [title]=\"$descriptor().label\" />\r\n <div class=\"icon-wrapper\" (click)=\"cancelled.emit()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"composer-body\">\r\n\r\n <p class=\"desc\">{{ $descriptor().quickEmoji }} | {{ $descriptor().description }}</p>\r\n\r\n <!-- Inputs -->\r\n <div class=\"intent-inputs\">\r\n @switch ($descriptor().actionCode) {\r\n @case ('CREATE_TREE') {\r\n <create-tree-inputs [$context]=\"$context()\" />\r\n }\r\n @case ('CREATE_O') {\r\n <create-o-inputs [$context]=\"$context()\" />\r\n }\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n } \r\n }\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"composer-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\r\n Quay l\u1EA1i\r\n </button>\r\n\r\n <button type=\"submit\" class=\"btn btn-primary\">\r\n X\u00E1c nh\u1EADn\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- @if (isDevMode && $formRawValue) {\r\n <pre>{{ $formRawValue() | json }}</pre>\r\n }\r\n -->\r\n\r\n @if (isDevMode) {\r\n <label>Current Tokens</label>\r\n <pre>{{ $context().currentTokens | json }}</pre>\r\n }\r\n\r\n</form>\r\n}\r\n\r\n<ng-template #defaultOrgItemTpl let-node=\"node\" let-level=\"level\">\r\n <div class=\"test-itemTemplateRef\">\r\n {{ node.label }}\r\n </div>\r\n</ng-template>", styles: [".intent-composer-container .composer-header{position:relative}.intent-composer-container .composer-header .icon-wrapper{cursor:pointer;position:absolute;width:30px;height:30px;top:5px;right:-10px;border-radius:50%;display:flex;align-items:center;justify-content:center}.intent-composer-container .composer-header .icon-wrapper:hover{background-color:#d3d3d3}.intent-composer-container .composer-header .icon-wrapper i{font-size:18px}.intent-composer-container .intent-inputs label{color:#848484}.intent-composer-container .intent-inputs .intent-row-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:12px;margin-bottom:12px}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell{box-sizing:border-box;min-width:0}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell.hidden{display:none}.intent-composer-container .intent-inputs .intent-row-grid .intent-input{display:flex;flex-direction:column;margin-top:15px;margin-bottom:15px}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label{color:#464646}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label.required:after{content:\"*\";color:#ff040b}.intent-composer-container .composer-actions{display:flex;justify-content:space-between}.intent-composer-container .composer-actions button{font-size:13px;border-radius:0}.intent-composer-container pre{margin-top:15px}.test-itemTemplateRef{padding:15px;background-color:#6495ed;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup", "htmlTooltipRef"], outputs: ["buttonClick"] }, { kind: "directive", type: HotKeysDirective, selector: "[hotKeys]", inputs: ["hotKeys"] }, { kind: "component", type: CreateTreeInputsComponent, selector: "create-tree-inputs" }, { kind: "component", type: CreateOInputsComponent, selector: "create-o-inputs" }], encapsulation: i0.ViewEncapsulation.None }); }
30458
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: IntentComposerComponent, isStandalone: true, selector: "intent-composer", inputs: { $descriptor: { classPropertyName: "$descriptor", publicName: "$descriptor", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { intentComposed: "intentComposed", cancelled: "cancelled" }, host: { listeners: { "keydown.escape": "onEscape($event)" } }, providers: [
30459
+ DomDecisionContextService
30460
+ ], viewQueries: [{ propertyName: "$defaultOrgItemTpl", first: true, predicate: ["defaultOrgItemTpl"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!--\r\n IntentComposerComponent\r\n Purpose:\r\n - Collect human input for a single OM intent\r\n - Emit IntentDraft only\r\n Must NOT:\r\n - Mutate Omega\r\n - Modify IntentChain\r\n-->\r\n@if ($form()) {\r\n<form class=\"intent-composer-container\" [formGroup]=\"$form()\" (ngSubmit)=\"onConfirm()\" autocomplete=\"off\" [hotKeys]=\"hotKeys\">\r\n\r\n <!-- Header -->\r\n <div class=\"composer-header\">\r\n <core-page-header [hideButtonGroup]=\"true\" [title]=\"$descriptor().label\" />\r\n <div class=\"icon-wrapper\" (click)=\"cancelled.emit()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"composer-body\">\r\n\r\n <p class=\"desc\">{{ $descriptor().quickEmoji }} | {{ $descriptor().description }}</p>\r\n\r\n <!-- Inputs -->\r\n <div class=\"intent-inputs\">\r\n @switch ($descriptor().actionCode) {\r\n @case ('CREATE_TREE') {\r\n <create-tree-inputs [$context]=\"$context()\" />\r\n }\r\n @case ('CREATE_O') {\r\n <create-o-inputs [$context]=\"$context()\" />\r\n }\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n } \r\n }\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"composer-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\r\n Quay l\u1EA1i\r\n </button>\r\n\r\n <button type=\"submit\" class=\"btn btn-primary\">\r\n X\u00E1c nh\u1EADn\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n @if (isDevMode && $formRawValue) {\r\n <pre>{{ $formRawValue() | json }}</pre>\r\n }\r\n\r\n @if (isDevMode) {\r\n <label>Current Tokens</label>\r\n <pre>{{ $context().currentTokens | json }}</pre>\r\n }\r\n\r\n</form>\r\n}\r\n\r\n<ng-template #defaultOrgItemTpl let-node=\"node\" let-level=\"level\">\r\n <div class=\"test-itemTemplateRef\">\r\n {{ node.label }}\r\n </div>\r\n</ng-template>", styles: [".intent-composer-container .composer-header{position:relative}.intent-composer-container .composer-header .icon-wrapper{cursor:pointer;position:absolute;width:30px;height:30px;top:5px;right:-10px;border-radius:50%;display:flex;align-items:center;justify-content:center}.intent-composer-container .composer-header .icon-wrapper:hover{background-color:#d3d3d3}.intent-composer-container .composer-header .icon-wrapper i{font-size:18px}.intent-composer-container .intent-inputs label{color:#848484}.intent-composer-container .intent-inputs .intent-row-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:12px;margin-bottom:12px}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell{box-sizing:border-box;min-width:0}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell.hidden{display:none}.intent-composer-container .intent-inputs .intent-row-grid .intent-input{display:flex;flex-direction:column;margin-top:15px;margin-bottom:15px}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label{color:#464646}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label.required:after{content:\"*\";color:#ff040b}.intent-composer-container .composer-actions{display:flex;justify-content:space-between}.intent-composer-container .composer-actions button{font-size:13px;border-radius:0}.intent-composer-container pre{margin-top:15px}.test-itemTemplateRef{padding:15px;background-color:#6495ed;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup", "htmlTooltipRef"], outputs: ["buttonClick"] }, { kind: "directive", type: HotKeysDirective, selector: "[hotKeys]", inputs: ["hotKeys"] }, { kind: "component", type: CreateTreeInputsComponent, selector: "create-tree-inputs" }, { kind: "component", type: CreateOInputsComponent, selector: "create-o-inputs" }], encapsulation: i0.ViewEncapsulation.None }); }
30043
30461
  }
30044
30462
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IntentComposerComponent, decorators: [{
30045
30463
  type: Component,
@@ -30058,151 +30476,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
30058
30476
  HotKeysDirective,
30059
30477
  CreateTreeInputsComponent,
30060
30478
  CreateOInputsComponent,
30479
+ ], providers: [
30480
+ DomDecisionContextService
30061
30481
  ], encapsulation: ViewEncapsulation.None, host: {
30062
30482
  '(keydown.escape)': 'onEscape($event)'
30063
- }, template: "<!--\r\n IntentComposerComponent\r\n Purpose:\r\n - Collect human input for a single OM intent\r\n - Emit IntentDraft only\r\n Must NOT:\r\n - Mutate Omega\r\n - Modify IntentChain\r\n-->\r\n@if (form) {\r\n<form class=\"intent-composer-container\" [formGroup]=\"form\" (ngSubmit)=\"onConfirm()\" autocomplete=\"off\" [hotKeys]=\"hotKeys\">\r\n\r\n <!-- Header -->\r\n <div class=\"composer-header\">\r\n <core-page-header [hideButtonGroup]=\"true\" [title]=\"$descriptor().label\" />\r\n <div class=\"icon-wrapper\" (click)=\"cancelled.emit()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"composer-body\">\r\n\r\n <p class=\"desc\">{{ $descriptor().quickEmoji }} | {{ $descriptor().description }}</p>\r\n\r\n <!-- Inputs -->\r\n <div class=\"intent-inputs\">\r\n @switch ($descriptor().actionCode) {\r\n @case ('CREATE_TREE') {\r\n <create-tree-inputs [$context]=\"$context()\" />\r\n }\r\n @case ('CREATE_O') {\r\n <create-o-inputs [$context]=\"$context()\" />\r\n }\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n } \r\n }\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"composer-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\r\n Quay l\u1EA1i\r\n </button>\r\n\r\n <button type=\"submit\" class=\"btn btn-primary\">\r\n X\u00E1c nh\u1EADn\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- @if (isDevMode && $formRawValue) {\r\n <pre>{{ $formRawValue() | json }}</pre>\r\n }\r\n -->\r\n\r\n @if (isDevMode) {\r\n <label>Current Tokens</label>\r\n <pre>{{ $context().currentTokens | json }}</pre>\r\n }\r\n\r\n</form>\r\n}\r\n\r\n<ng-template #defaultOrgItemTpl let-node=\"node\" let-level=\"level\">\r\n <div class=\"test-itemTemplateRef\">\r\n {{ node.label }}\r\n </div>\r\n</ng-template>", styles: [".intent-composer-container .composer-header{position:relative}.intent-composer-container .composer-header .icon-wrapper{cursor:pointer;position:absolute;width:30px;height:30px;top:5px;right:-10px;border-radius:50%;display:flex;align-items:center;justify-content:center}.intent-composer-container .composer-header .icon-wrapper:hover{background-color:#d3d3d3}.intent-composer-container .composer-header .icon-wrapper i{font-size:18px}.intent-composer-container .intent-inputs label{color:#848484}.intent-composer-container .intent-inputs .intent-row-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:12px;margin-bottom:12px}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell{box-sizing:border-box;min-width:0}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell.hidden{display:none}.intent-composer-container .intent-inputs .intent-row-grid .intent-input{display:flex;flex-direction:column;margin-top:15px;margin-bottom:15px}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label{color:#464646}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label.required:after{content:\"*\";color:#ff040b}.intent-composer-container .composer-actions{display:flex;justify-content:space-between}.intent-composer-container .composer-actions button{font-size:13px;border-radius:0}.intent-composer-container pre{margin-top:15px}.test-itemTemplateRef{padding:15px;background-color:#6495ed;color:#fff}\n"] }]
30483
+ }, template: "<!--\r\n IntentComposerComponent\r\n Purpose:\r\n - Collect human input for a single OM intent\r\n - Emit IntentDraft only\r\n Must NOT:\r\n - Mutate Omega\r\n - Modify IntentChain\r\n-->\r\n@if ($form()) {\r\n<form class=\"intent-composer-container\" [formGroup]=\"$form()\" (ngSubmit)=\"onConfirm()\" autocomplete=\"off\" [hotKeys]=\"hotKeys\">\r\n\r\n <!-- Header -->\r\n <div class=\"composer-header\">\r\n <core-page-header [hideButtonGroup]=\"true\" [title]=\"$descriptor().label\" />\r\n <div class=\"icon-wrapper\" (click)=\"cancelled.emit()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"composer-body\">\r\n\r\n <p class=\"desc\">{{ $descriptor().quickEmoji }} | {{ $descriptor().description }}</p>\r\n\r\n <!-- Inputs -->\r\n <div class=\"intent-inputs\">\r\n @switch ($descriptor().actionCode) {\r\n @case ('CREATE_TREE') {\r\n <create-tree-inputs [$context]=\"$context()\" />\r\n }\r\n @case ('CREATE_O') {\r\n <create-o-inputs [$context]=\"$context()\" />\r\n }\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n } \r\n }\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"composer-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\r\n Quay l\u1EA1i\r\n </button>\r\n\r\n <button type=\"submit\" class=\"btn btn-primary\">\r\n X\u00E1c nh\u1EADn\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n @if (isDevMode && $formRawValue) {\r\n <pre>{{ $formRawValue() | json }}</pre>\r\n }\r\n\r\n @if (isDevMode) {\r\n <label>Current Tokens</label>\r\n <pre>{{ $context().currentTokens | json }}</pre>\r\n }\r\n\r\n</form>\r\n}\r\n\r\n<ng-template #defaultOrgItemTpl let-node=\"node\" let-level=\"level\">\r\n <div class=\"test-itemTemplateRef\">\r\n {{ node.label }}\r\n </div>\r\n</ng-template>", styles: [".intent-composer-container .composer-header{position:relative}.intent-composer-container .composer-header .icon-wrapper{cursor:pointer;position:absolute;width:30px;height:30px;top:5px;right:-10px;border-radius:50%;display:flex;align-items:center;justify-content:center}.intent-composer-container .composer-header .icon-wrapper:hover{background-color:#d3d3d3}.intent-composer-container .composer-header .icon-wrapper i{font-size:18px}.intent-composer-container .intent-inputs label{color:#848484}.intent-composer-container .intent-inputs .intent-row-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:12px;margin-bottom:12px}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell{box-sizing:border-box;min-width:0}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell.hidden{display:none}.intent-composer-container .intent-inputs .intent-row-grid .intent-input{display:flex;flex-direction:column;margin-top:15px;margin-bottom:15px}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label{color:#464646}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label.required:after{content:\"*\";color:#ff040b}.intent-composer-container .composer-actions{display:flex;justify-content:space-between}.intent-composer-container .composer-actions button{font-size:13px;border-radius:0}.intent-composer-container pre{margin-top:15px}.test-itemTemplateRef{padding:15px;background-color:#6495ed;color:#fff}\n"] }]
30064
30484
  }], ctorParameters: () => [{ type: MultiLanguageService }] });
30065
30485
 
30066
- const CreateOrganizationGrammar = {
30067
- intentCode: EnumActionCode.CREATE_O,
30068
- subject(ctx) {
30069
- const name = ctx.facts['ORIGINAL_NAME'];
30070
- return `Tạo phòng ban ${name}`;
30071
- },
30072
- clauses: [
30073
- {
30074
- when: ctx => !!ctx.temporal.localDate,
30075
- render: ctx => `khả dụng từ ${ctx.temporal.localDate}`
30076
- },
30077
- {
30078
- when: ctx => !!ctx.resolved['TREE_NAME'],
30079
- render: ctx => `thuộc cây ${ctx.resolved['TREE_NAME']}`
30080
- }
30081
- ]
30082
- };
30083
- // narration-engine.ts
30084
- function narrateIntent(grammar, ctx) {
30085
- const parts = [];
30086
- // 1) Subject (bắt buộc)
30087
- const subject = grammar.subject(ctx);
30088
- if (subject && subject.trim().length > 0) {
30089
- parts.push(subject.trim());
30090
- }
30091
- // 2) Clauses (tuỳ chọn, theo thứ tự khai báo)
30092
- if (grammar.clauses?.length) {
30093
- for (const clause of grammar.clauses) {
30094
- try {
30095
- if (clause.when(ctx)) {
30096
- const text = clause.render(ctx);
30097
- if (text && text.trim().length > 0) {
30098
- parts.push(text.trim());
30099
- }
30100
- }
30101
- }
30102
- catch {
30103
- // ❗ Grammar error MUST NOT break projection
30104
- // Có thể log ở đây nếu muốn
30105
- }
30106
- }
30107
- }
30108
- // 3) Join theo ngữ pháp tiếng Việt (space-based)
30109
- return parts.join(' ');
30110
- }
30111
- const CREATE_TREE_GRAMMAR = {
30112
- intentCode: EnumActionCode.CREATE_TREE,
30113
- subject(ctx) {
30114
- const treeName = ctx.facts['TREE_NAME'];
30115
- const isHr = ctx.facts['IS_HR'];
30116
- const isHrText = typeof isHr === 'boolean' ? (isHr ? "ngành ngang" : "ngành dọc") : "";
30117
- return typeof treeName === 'string'
30118
- ? `Tạo cây ${isHrText} ${treeName}`
30119
- : 'Tạo cây ${isHrText}';
30120
- },
30121
- clauses: [
30122
- {
30123
- // khả dụng từ <date>
30124
- when: ctx => !!ctx.temporal.localDate,
30125
- render: ctx => `khả dụng từ ${ctx.temporal.localDate}`
30126
- },
30127
- {
30128
- // thuộc cây <TREE_NAME>
30129
- when: ctx => !!ctx.resolved['TREE_NAME'],
30130
- render: ctx => `thuộc cây ${ctx.resolved['TREE_NAME']}`
30131
- }
30132
- ]
30133
- };
30134
- const CREATE_O_GRAMMAR = {
30135
- intentCode: EnumActionCode.CREATE_O,
30136
- subject(ctx) {
30137
- const name = ctx.facts['ORIGINAL_NAME'];
30138
- return typeof name === 'string'
30139
- ? `Tạo phòng ban ${name}`
30140
- : 'Tạo phòng ban';
30141
- },
30142
- clauses: [
30143
- {
30144
- // khả dụng từ <date>
30145
- when: ctx => !!ctx.temporal.localDate,
30146
- render: ctx => `khả dụng từ ${ctx.temporal.localDate}`
30147
- },
30148
- {
30149
- // thuộc cây <TREE_NAME>
30150
- when: ctx => !!ctx.resolved['TREE_NAME'],
30151
- render: ctx => `thuộc cây ${ctx.resolved['TREE_NAME']}`
30152
- }
30153
- ]
30154
- };
30155
- const CREATE_S_GRAMMAR = {
30156
- intentCode: EnumActionCode.CREATE_S,
30157
- subject(ctx) {
30158
- const name = ctx.facts['CODE'];
30159
- return typeof name === 'string'
30160
- ? `Tạo ghế ${name}`
30161
- : 'Tạo ghế';
30162
- },
30163
- clauses: [
30164
- {
30165
- // khả dụng từ <date>
30166
- when: ctx => !!ctx.temporal.localDate,
30167
- render: ctx => `khả dụng từ ${ctx.temporal.localDate}`
30168
- },
30169
- {
30170
- // thuộc cây <TREE_NAME>
30171
- when: ctx => !!ctx.resolved['TREE_NAME'],
30172
- render: ctx => `thuộc cây ${ctx.resolved['TREE_NAME']}`
30173
- }
30174
- ]
30175
- };
30176
- const LINK_O_O_GRAMMAR = {
30177
- intentCode: EnumActionCode.LINK_O_O,
30178
- rCode: EnumRCodeForward.O_IS_PART_OF_O,
30179
- subject(ctx) {
30180
- const a = ctx.resolved['A_ORIGINAL_NAME'];
30181
- const b = ctx.resolved['B_ORIGINAL_NAME'];
30182
- return a && b
30183
- ? `Gán ${a} là đơn vị con của ${b}`
30184
- : 'Gán quan hệ tổ chức';
30185
- },
30186
- clauses: [
30187
- {
30188
- when: ctx => !!ctx.temporal.effective?.from,
30189
- render: ctx => {
30190
- const { from, to } = ctx.temporal.effective;
30191
- return to
30192
- ? `hiệu lực từ ${from} đến ${to}`
30193
- : `hiệu lực từ ${from}`;
30194
- }
30195
- },
30196
- ]
30197
- };
30198
-
30199
- const INTENT_GRAMMAR_REGISTRY = [
30200
- CREATE_TREE_GRAMMAR,
30201
- CREATE_O_GRAMMAR,
30202
- CREATE_S_GRAMMAR,
30203
- LINK_O_O_GRAMMAR
30204
- ];
30205
-
30206
30486
  /**
30207
30487
  * CoreDomDecisionEditor
30208
30488
  *
@@ -30223,38 +30503,16 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
30223
30503
  this.ctx = inject(DomDecisionContextService);
30224
30504
  this.js = inject(JsonService);
30225
30505
  this.acs = inject(AppConfigService);
30226
- this.$omega = signal({
30227
- omegaVersion: '1.0',
30228
- inputChain: []
30229
- });
30230
30506
  this.$allTokens = this.ctx.$allTokens;
30507
+ this.isDevMode = isDevMode();
30231
30508
  this.value = '';
30232
30509
  this.INTENT_DESCRIPTOR_REGISTRY = INTENT_DESCRIPTOR_REGISTRY;
30233
30510
  // UI-only popup flag
30234
30511
  this.$showIntentComposer = signal(false);
30235
30512
  this.$selectedIntentDescriptor = this.ctx.$selectedIntentDescriptor;
30236
- this.$activeSeq = this.ctx.$activeSeq;
30237
- this.isDevMode = isDevMode();
30238
- this.$projection = computed(() => {
30239
- const omega = this.$omega();
30240
- // Trường hợp cực đoan (chỉ khi anh vẫn cho omega nullable)
30241
- if (!omega) {
30242
- return {
30243
- intentCount: 0,
30244
- validityLabel: 'Chưa có quyết định',
30245
- intents: [],
30246
- outputs: [],
30247
- };
30248
- }
30249
- return this.rebuildProjectionFromOmega(omega);
30250
- });
30251
- // 1️⃣ Sync omega → context
30252
- effect(() => {
30253
- this.ctx.$omega.set(this.$omega());
30254
- });
30255
30513
  // 2️⃣ Emit omega → outer form
30256
30514
  effect(() => {
30257
- const omega = this.$omega();
30515
+ const omega = this.ctx.$omega();
30258
30516
  this.onChange(JSON.stringify(omega));
30259
30517
  });
30260
30518
  }
@@ -30262,184 +30520,20 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
30262
30520
  this.value = omega ?? '';
30263
30521
  //this.$projection.set(this.rebuildProjectionFromOmega(this.value));
30264
30522
  }
30265
- buildNarrationContext(intent) {
30266
- const facts = intent.inputSnapshot ?? {};
30267
- const temporal = this.buildTemporalContext(facts);
30268
- const resolved = this.buildResolvedContext(facts);
30269
- return {
30270
- locale: 'vi',
30271
- facts,
30272
- resolved,
30273
- temporal
30274
- };
30275
- }
30276
- buildTemporalContext(facts) {
30277
- const tzRaw = facts['TIMEZONE_ID'];
30278
- const timezoneId = typeof tzRaw === 'string'
30279
- ? tzRaw
30280
- : (this.acs.CANONICAL_IANA_TIMEZONES?.[0] ?? 'Asia/Ho_Chi_Minh');
30281
- // ---- RANGE semantics (LINK_, SET_) ----
30282
- const vfIso = this.normalizeUtc(facts['VF_UTC']);
30283
- const vtIso = this.normalizeUtc(facts['VT_UTC']);
30284
- if (vfIso) {
30285
- try {
30286
- const fromDate = new Date(vfIso);
30287
- if (isNaN(fromDate.getTime()))
30288
- return {};
30289
- const from = this.formatLocalDate(fromDate, timezoneId);
30290
- let to;
30291
- if (vtIso) {
30292
- if (vtIso.includes('9999')) {
30293
- to = ''; // 'đến khi có quyết định thay đổi'
30294
- }
30295
- else {
30296
- const toDate = new Date(vtIso);
30297
- if (!isNaN(toDate.getTime())) {
30298
- to = this.formatLocalDate(toDate, timezoneId);
30299
- }
30300
- }
30301
- }
30302
- return {
30303
- timezoneId,
30304
- effective: { from, to },
30305
- mode: 'RANGE'
30306
- };
30307
- }
30308
- catch {
30309
- return {};
30310
- }
30311
- }
30312
- // ---- POINT semantics (CREATE_) ----
30313
- const utcIso = this.normalizeUtc(facts['AVAILABLE_UTC']);
30314
- if (!utcIso)
30315
- return {};
30316
- try {
30317
- const date = new Date(utcIso);
30318
- if (isNaN(date.getTime()))
30319
- return {};
30320
- const localDate = this.formatLocalDate(date, timezoneId);
30321
- return {
30322
- localDate,
30323
- timezoneId,
30324
- mode: 'POINT'
30325
- };
30326
- }
30327
- catch {
30328
- return {};
30329
- }
30330
- }
30331
- normalizeUtc(raw) {
30332
- if (typeof raw === 'string')
30333
- return raw;
30334
- if (raw instanceof Date)
30335
- return raw.toISOString();
30336
- return null;
30337
- }
30338
- formatLocalDate(date, timezoneId) {
30339
- return this.acs.DEFAULT_IANA_TIMEZONE_ID === 'Asia/Ho_Chi_Minh'
30340
- ? new Intl.DateTimeFormat('vi-VN', {
30341
- timeZone: timezoneId,
30342
- day: '2-digit',
30343
- month: '2-digit',
30344
- year: 'numeric'
30345
- }).format(date)
30346
- : new Intl.DateTimeFormat('en-CA', {
30347
- timeZone: timezoneId
30348
- }).format(date);
30349
- }
30350
- /**
30351
- * Xây dựng Resolved Context cho Intent Narration
30352
- *
30353
- * Lớp này làm nhiệm vụ làm giàu (enrich) dữ liệu intent thô
30354
- * bằng các giá trị dễ đọc, phục vụ cho việc diễn giải (narration),
30355
- * nhưng TUYỆT ĐỐI KHÔNG thay đổi hay ghi đè lên facts gốc.
30356
- *
30357
- * Nguyên tắc thiết kế:
30358
- * - facts : sự thật máy móc, bất biến (ID, mã, UTC, enum…)
30359
- * - resolved : diễn giải bổ sung, tùy chọn, thân thiện với con người
30360
- * - grammar : chỉ ghép câu, không tra cứu, không chứa logic nghiệp vụ
30361
- *
30362
- * Trách nhiệm của hàm này:
30363
- * - Diễn giải các tham chiếu chéo (ví dụ: TREE_ID → TREE_NAME)
30364
- * - Chuẩn hóa vai trò thành nhãn dễ đọc (ví dụ: MASTER → "vai trò chính")
30365
- * - Lưu giữ snapshot tên hiển thị tại thời điểm tạo intent
30366
- * (LEFT_/RIGHT_ ORIGINAL_NAME) phục vụ audit và narration
30367
- *
30368
- * Những gì hàm này KHÔNG làm (có chủ ý):
30369
- * - Không gọi API / DB tại runtime
30370
- * - Không thay đổi dữ liệu facts đầu vào
30371
- * - Không xử lý logic ngữ pháp hay ghép câu
30372
- *
30373
- * Đây là lớp "diễn giải ngữ nghĩa" nằm giữa dữ liệu intent thuần
30374
- * và lớp grammar chịu trách nhiệm kể câu chuyện cho con người.
30375
- */
30376
- buildResolvedContext(facts) {
30377
- const resolved = {};
30378
- // TREE
30379
- if (typeof facts['TREE_ID'] === 'string') {
30380
- resolved['TREE_NAME'] = this.resolveTreeName(facts['TREE_ID']);
30381
- }
30382
- // ROLE (optional)
30383
- if (typeof facts['ROLE'] === 'string' &&
30384
- facts['ROLE'] !== 'NONE') {
30385
- resolved['ROLE'] = `với vai trò ${facts['ROLE']}`;
30386
- }
30387
- // A_ORIGINAL_NAME (optional)
30388
- if (typeof facts['A_ORIGINAL_NAME'] === 'string') {
30389
- resolved['A_ORIGINAL_NAME'] = facts['A_ORIGINAL_NAME'];
30390
- }
30391
- // B_ORIGINAL_NAME (optional)
30392
- if (typeof facts['B_ORIGINAL_NAME'] === 'string') {
30393
- resolved['B_ORIGINAL_NAME'] = facts['B_ORIGINAL_NAME'];
30394
- }
30395
- return resolved;
30396
- }
30397
- resolveTreeName(treeId) {
30398
- // TODO: thay bằng snapshot / token sau
30399
- return 'HR';
30400
- }
30401
- rebuildProjectionFromOmega(omega) {
30402
- const intents = omega.inputChain.map(intent => {
30403
- const descriptor = INTENT_DESCRIPTOR_REGISTRY
30404
- .find(d => d.actionCode === intent.actionCode);
30405
- const grammar = INTENT_GRAMMAR_REGISTRY
30406
- .find(g => g.intentCode === intent.actionCode);
30407
- const actionLabel = descriptor?.label ?? intent.actionCode;
30408
- const narrationContext = this.buildNarrationContext(intent);
30409
- const summary = grammar
30410
- ? narrateIntent(grammar, narrationContext)
30411
- : undefined;
30412
- return {
30413
- seq: intent.seq,
30414
- actionLabel,
30415
- actionCode: intent.actionCode,
30416
- inputSnapshot: this.ctx.$rehydrateSnapshot(),
30417
- summary
30418
- };
30419
- });
30420
- return {
30421
- intentCount: intents.length,
30422
- intents,
30423
- outputs: []
30424
- };
30425
- }
30426
30523
  onAddIntent() {
30427
30524
  // Entry point for intent composition
30428
30525
  // This method MUST NOT mutate Omega or projection directly
30429
30526
  // Actual intent creation will happen in a dedicated composer (modal / panel)
30430
30527
  this.$showIntentComposer.set(true);
30431
- //this.$activeSeq.set(this.$omega().inputChain.length + 1);
30432
- // create mode → không active seq cũ nào cả
30433
- this.$activeSeq.set(null);
30528
+ this.ctx.$viewSeq.set(null);
30434
30529
  }
30435
30530
  onCloseIntentComposer() {
30436
30531
  this.$showIntentComposer.set(false);
30437
- this.$activeSeq.set(null);
30438
30532
  }
30439
30533
  onViewIntent(e) {
30440
30534
  }
30441
30535
  onRemoveIntent(seq) {
30442
- this.$omega.update(omega => {
30536
+ this.ctx.$omega.update(omega => {
30443
30537
  // 1️⃣ Lọc bỏ intent cần gỡ
30444
30538
  const remaining = omega.inputChain
30445
30539
  .filter(i => i.seq !== seq);
@@ -30459,58 +30553,39 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
30459
30553
  this.$selectedIntentDescriptor.set(descriptor);
30460
30554
  }
30461
30555
  onSelectEditedIntent(seq) {
30462
- const intent = this.$projection().intents.find(x => x.seq === seq);
30556
+ const intent = this.ctx.$projection().intents.find(x => x.seq === seq);
30463
30557
  if (!intent)
30464
30558
  return;
30465
30559
  const descriptor = getIntentDescriptor(intent.actionCode);
30466
30560
  if (!descriptor)
30467
30561
  return;
30562
+ // 🎯 Editor state
30563
+ this.ctx.$viewSeq.set(seq);
30468
30564
  this.$selectedIntentDescriptor.set(descriptor);
30469
- this.ctx.$rehydrateSnapshot.set(intent.inputSnapshot);
30470
- this.$activeSeq.set(seq);
30471
30565
  this.$showIntentComposer.set(true);
30472
30566
  }
30473
30567
  onCancelIntentCompose() {
30474
30568
  this.$selectedIntentDescriptor.set(null);
30475
30569
  }
30476
- /*
30477
- onIntentDrafted(draft: IIntentDraft): void {
30478
- this.$omega.update(omega => {
30479
- const nextSeq = this.ctx.$nextSeq();
30480
-
30481
- const outputs = this.produceOutputs(nextSeq, draft);
30482
-
30483
- return {
30484
- ...omega,
30485
- inputChain: [
30486
- ...omega.inputChain,
30487
- {
30488
- seq: nextSeq,
30489
- actionCode: draft.actionCode,
30490
- input: draft.inputSnapshot,
30491
- outputs
30492
- }
30493
- ]
30494
- };
30495
- });
30496
-
30497
- this.$showIntentComposer.set(false);
30498
- }
30499
- */
30570
+ /**
30571
+ * Emit intent đã được confirm từ editor.
30572
+ *
30573
+ * @param draft Thông tin intent người dùng vừa xác nhận
30574
+ */
30500
30575
  onIntentDrafted(draft) {
30501
- this.$omega.update((omega) => {
30502
- const activeSeq = this.ctx.$activeSeq();
30576
+ this.ctx.$omega.update((omega) => {
30503
30577
  const chain = omega.inputChain;
30504
- // CREATE
30505
- if (!activeSeq || activeSeq === chain.length + 1) {
30506
- const nextSeq = chain.length + 1;
30578
+ const seq = this.ctx.$viewSeq() ?? this.ctx.$createSeq();
30579
+ const exists = chain.some(i => i.seq === seq);
30580
+ // CREATE (append)
30581
+ if (!exists) {
30507
30582
  const nextChain = [
30508
30583
  ...chain,
30509
30584
  {
30510
- seq: nextSeq,
30585
+ seq,
30511
30586
  actionCode: draft.actionCode,
30512
30587
  inputSnapshot: draft.inputSnapshot,
30513
- outputs: this.produceOutputs(nextSeq, draft)
30588
+ outputs: this.ctx.produceOutputs(seq, draft)
30514
30589
  }
30515
30590
  ];
30516
30591
  return {
@@ -30518,69 +30593,21 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
30518
30593
  inputChain: nextChain
30519
30594
  };
30520
30595
  }
30521
- // EDIT LAST
30522
- if (activeSeq === chain.length) {
30523
- const nextChain = chain.map(intent => intent.seq === activeSeq
30524
- ? {
30525
- ...intent,
30526
- inputSnapshot: draft.inputSnapshot,
30527
- outputs: this.produceOutputs(activeSeq, draft)
30528
- }
30529
- : intent);
30530
- return {
30531
- ...omega,
30532
- inputChain: nextChain
30533
- };
30534
- }
30535
- return omega;
30596
+ // EDIT (update existing)
30597
+ const nextChain = chain.map(intent => intent.seq === seq
30598
+ ? {
30599
+ ...intent,
30600
+ inputSnapshot: draft.inputSnapshot,
30601
+ outputs: this.ctx.produceOutputs(seq, draft)
30602
+ }
30603
+ : intent);
30604
+ return {
30605
+ ...omega,
30606
+ inputChain: nextChain
30607
+ };
30536
30608
  });
30537
30609
  this.$showIntentComposer.set(false);
30538
- this.ctx.$activeSeq.set(null);
30539
- }
30540
- produceOutputs(seq, draft) {
30541
- const input = draft.inputSnapshot;
30542
- switch (draft.actionCode) {
30543
- case EnumActionCode.CREATE_O: {
30544
- const id = input['ID'];
30545
- if (typeof id !== 'string')
30546
- return undefined;
30547
- const originalName = input['ORIGINAL_NAME'];
30548
- const code = input['CODE'];
30549
- return [{
30550
- token: `T${seq}`,
30551
- entityType: 'O',
30552
- uuid: id,
30553
- producedBySeq: seq,
30554
- humanSnapshot: {
30555
- ORIGINAL_NAME: typeof originalName === 'string' ? originalName : undefined,
30556
- CODE: typeof code === 'string' ? code : undefined
30557
- }
30558
- }];
30559
- }
30560
- case EnumActionCode.CREATE_TREE: {
30561
- const treeName = input['TREE_NAME'];
30562
- const id = input['ID'];
30563
- if (typeof treeName !== 'string')
30564
- return undefined;
30565
- const uuid = typeof id === 'string'
30566
- ? id
30567
- : crypto.randomUUID();
30568
- return [{
30569
- token: `T${seq}`,
30570
- entityType: 'O',
30571
- uuid,
30572
- producedBySeq: seq,
30573
- humanSnapshot: {
30574
- TREE_NAME: treeName
30575
- }
30576
- }];
30577
- }
30578
- case EnumActionCode.LINK_O_O:
30579
- // quan hệ, không sinh entity
30580
- return undefined;
30581
- default:
30582
- return undefined;
30583
- }
30610
+ this.ctx.$viewSeq.set(null); // reset editor cursor
30584
30611
  }
30585
30612
  ngOnDestroy() {
30586
30613
  this.subscriptions.forEach(x => x?.unsubscribe());
@@ -30598,7 +30625,7 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
30598
30625
  multi: true,
30599
30626
  useExisting: forwardRef(() => CoreDomDecisionEditorComponent),
30600
30627
  },
30601
- ], usesInheritance: true, ngImport: i0, template: "<div class=\"core-dom-decision-editor-container\">\r\n\r\n <!-- ========================= -->\r\n <!-- Intent Chain Projection -->\r\n <!-- ========================= -->\r\n <section class=\"intent-chain\">\r\n\r\n @if ($projection().intents.length > 0) {\r\n <ol class=\"intent-list\">\r\n @for (intent of $projection().intents; track $index) {\r\n <li class=\"intent-item\">\r\n <div class=\"intent-card\">\r\n\r\n <div class=\"intent-row\">\r\n <div class=\"intent-header\" (click)=\"onSelectEditedIntent(intent.seq)\">\r\n <span class=\"intent-seq\" [appTooltip]=\"intent.actionLabel\" [showAnyway]=\"true\" [position]=\"'above'\">#{{\r\n intent.seq }}</span>\r\n <span class=\"intent-label\">{{ intent.summary }}</span>\r\n </div>\r\n\r\n <div class=\"intent-tool\">\r\n <button type=\"button\" class=\"btn btn-danger-ghost\" (click)=\"onRemoveIntent(intent.seq)\"\r\n [appTooltip]=\"'G\u1EE1'\" [showAnyway]=\"true\" [position]=\"'above'\">\r\n <i class=\"feather-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n }\r\n\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Add Intent Entry Point -->\r\n <!-- ========================= -->\r\n <section class=\"intent-actions-panel\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onAddIntent()\">\r\n + Th\u00EAm Intent\r\n </button>\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Output Preview (Derived) -->\r\n <!-- ========================= -->\r\n <section class=\"output-preview\">\r\n @if ($projection().outputs.length > 1) {\r\n <ul class=\"output-list\">\r\n @for (output of $projection().outputs; track $index) {\r\n <li class=\"output-item\">\r\n <span class=\"output-key\">{{ output.key }}</span>\r\n <span class=\"output-desc\">{{ output.description }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </section>\r\n\r\n <!-- @if (isDevMode) {\r\n\r\n <details class=\"omega-raw\">\r\n <summary>Xem Omega (raw)</summary>\r\n <pre>{{ $omega() | json }}</pre>\r\n </details>\r\n\r\n <label>allTokens</label>\r\n <pre>{{ $allTokens() | json }}</pre>\r\n\r\n } -->\r\n\r\n @if ($showIntentComposer()) {\r\n <!--\r\n Intent Composer Popup\r\n Purpose: Enter intent composition mode only.\r\n MUST NOT:\r\n - Mutate Omega\r\n - Mutate projection\r\n - Execute OM logic\r\n -->\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"intent-composer-entry\">\r\n\r\n @if ($selectedIntentDescriptor()) {\r\n\r\n <intent-composer [$descriptor]=\"$selectedIntentDescriptor()!\" (intentComposed)=\"onIntentDrafted($event)\"\r\n (cancelled)=\"onCancelIntentCompose()\">\r\n </intent-composer>\r\n\r\n } @else {\r\n\r\n <!-- N\u1ED9i dung composer s\u1EBD \u0111\u01B0\u1EE3c c\u1EAFm sau -->\r\n <ul class=\"intent-item-registry\">\r\n @for (intent of INTENT_DESCRIPTOR_REGISTRY; track $index) {\r\n <li class=\"intent-item-point\">\r\n <div class=\"intent-item\" (click)=\"onMenuSelectIntent(intent)\">\r\n <object>{{ intent.actionCode }} | {{ intent.quickEmoji }}</object>\r\n <strong>{{ intent.label }}</strong>\r\n <p>{{ intent.description }}</p>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n\r\n }\r\n @if (!$activeSeq() || true) {\r\n <hr />\r\n <div class=\"popup-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCloseIntentComposer()\">\r\n H\u1EE7y\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>", styles: [".core-dom-decision-editor-container .intent-actions-panel button{border-radius:0;font-size:13px}.core-dom-decision-editor-container .modal-container{overflow:scroll}.core-dom-decision-editor-container .modal-container .modal-content-root{overflow:visible;max-height:unset;padding:0}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry{padding:0 15px 15px}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions{display:flex;align-items:center;justify-content:flex-end}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions button{font-size:13px;border-radius:0}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry{margin-top:15px;padding-top:15px;padding-left:0;overflow-y:scroll;height:60vh}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point{cursor:pointer;padding:8px}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point:hover{color:#fff;background-color:#09f}.core-dom-decision-editor-container .intent-chain .intent-list{list-style:none;padding:0;margin:0}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item{margin-bottom:12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card{border:1px solid #d0d7de;background:#fff;padding:10px 12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card:hover{box-shadow:.4rem 0 2rem #0000002e}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row{display:flex;align-items:center;justify-content:space-between}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header{display:flex;align-items:center;gap:8px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-seq{background:#e6f0ff;color:#084298;border-radius:3px;padding:2px 6px;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label{color:#212529;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label:hover{color:#fff;color:#dd5f2a}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool{display:flex;gap:8px;padding-left:28px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn{border:none;background:none;cursor:pointer;font-size:13px;padding:2px 6px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost{color:#0d6efd}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost:hover{text-decoration:underline}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost{color:#dc3545}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost:hover{text-decoration:underline}\n"], dependencies: [{ kind: "component", type: IntentComposerComponent, selector: "intent-composer", inputs: ["$descriptor"], outputs: ["intentComposed", "cancelled"] }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "showAnyway", "color", "backgroundColor", "position"] }] }); }
30628
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"core-dom-decision-editor-container\">\r\n\r\n <!-- ========================= -->\r\n <!-- Intent Chain Projection -->\r\n <!-- ========================= -->\r\n <section class=\"intent-chain\">\r\n\r\n @if (ctx.$projection().intents.length > 0) {\r\n <ol class=\"intent-list\">\r\n @for (intent of ctx.$projection().intents; track $index) {\r\n <li class=\"intent-item\">\r\n <div class=\"intent-card\">\r\n\r\n <div class=\"intent-row\">\r\n <div class=\"intent-header\" (click)=\"onSelectEditedIntent(intent.seq)\">\r\n <span class=\"intent-seq\" [appTooltip]=\"intent.actionLabel\" [showAnyway]=\"true\" [position]=\"'above'\">#{{\r\n intent.seq }}</span>\r\n <span class=\"intent-label\">{{ intent.summary }}</span>\r\n </div>\r\n\r\n <div class=\"intent-tool\">\r\n <button type=\"button\" class=\"btn btn-danger-ghost\" (click)=\"onRemoveIntent(intent.seq)\"\r\n [appTooltip]=\"'G\u1EE1'\" [showAnyway]=\"true\" [position]=\"'above'\">\r\n <i class=\"feather-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n }\r\n\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Add Intent Entry Point -->\r\n <!-- ========================= -->\r\n <section class=\"intent-actions-panel\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onAddIntent()\">\r\n + Th\u00EAm Intent\r\n </button>\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Output Preview (Derived) -->\r\n <!-- ========================= -->\r\n <section class=\"output-preview\">\r\n @if (ctx.$projection().outputs.length > 1) {\r\n <ul class=\"output-list\">\r\n @for (output of ctx.$projection().outputs; track $index) {\r\n <li class=\"output-item\">\r\n <span class=\"output-key\">{{ output.key }}</span>\r\n <span class=\"output-desc\">{{ output.description }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </section>\r\n\r\n <!-- @if (isDevMode) {\r\n\r\n <details class=\"omega-raw\">\r\n <summary>Xem Omega (raw)</summary>\r\n <pre>{{ $omega() | json }}</pre>\r\n </details>\r\n\r\n <label>allTokens</label>\r\n <pre>{{ $allTokens() | json }}</pre>\r\n\r\n } -->\r\n\r\n @if ($showIntentComposer()) {\r\n <!--\r\n Intent Composer Popup\r\n Purpose: Enter intent composition mode only.\r\n MUST NOT:\r\n - Mutate Omega\r\n - Mutate projection\r\n - Execute OM logic\r\n -->\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"intent-composer-entry\">\r\n\r\n @if ($selectedIntentDescriptor()) {\r\n\r\n <intent-composer [$descriptor]=\"$selectedIntentDescriptor()!\" (intentComposed)=\"onIntentDrafted($event)\"\r\n (cancelled)=\"onCancelIntentCompose()\">\r\n </intent-composer>\r\n\r\n } @else {\r\n\r\n <!-- N\u1ED9i dung composer s\u1EBD \u0111\u01B0\u1EE3c c\u1EAFm sau -->\r\n <ul class=\"intent-item-registry\">\r\n @for (intent of INTENT_DESCRIPTOR_REGISTRY; track $index) {\r\n <li class=\"intent-item-point\">\r\n <div class=\"intent-item\" (click)=\"onMenuSelectIntent(intent)\">\r\n <object>{{ intent.actionCode }} | {{ intent.quickEmoji }}</object>\r\n <strong>{{ intent.label }}</strong>\r\n <p>{{ intent.description }}</p>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n\r\n }\r\n <hr />\r\n <div class=\"popup-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCloseIntentComposer()\">\r\n H\u1EE7y\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>", styles: [".core-dom-decision-editor-container .intent-actions-panel button{border-radius:0;font-size:13px}.core-dom-decision-editor-container .modal-container{overflow:scroll}.core-dom-decision-editor-container .modal-container .modal-content-root{overflow:visible;max-height:unset;padding:0}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry{padding:0 15px 15px}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions{display:flex;align-items:center;justify-content:flex-end}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions button{font-size:13px;border-radius:0}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry{margin-top:15px;padding-top:15px;padding-left:0;overflow-y:scroll;height:60vh}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point{cursor:pointer;padding:8px;color:inherit;background-color:#fff;transition:background-color .25s ease-out,color .25s ease-out}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point:hover{color:#fff;background-color:#09f}.core-dom-decision-editor-container .intent-chain .intent-list{list-style:none;padding:0;margin:0}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item{margin-bottom:12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card{border:1px solid #d0d7de;background:#fff;padding:10px 12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card:hover{box-shadow:.4rem 0 2rem #0000002e}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row{display:flex;align-items:center;justify-content:space-between}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header{display:flex;align-items:center;gap:8px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-seq{background:#e6f0ff;color:#084298;border-radius:3px;padding:2px 6px;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label{color:#212529;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label:hover{color:#fff;color:#dd5f2a}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool{display:flex;gap:8px;padding-left:28px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn{border:none;background:none;cursor:pointer;font-size:13px;padding:2px 6px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost{color:#0d6efd}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost:hover{text-decoration:underline}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost{color:#dc3545}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost:hover{text-decoration:underline}\n"], dependencies: [{ kind: "component", type: IntentComposerComponent, selector: "intent-composer", inputs: ["$descriptor"], outputs: ["intentComposed", "cancelled"] }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "showAnyway", "color", "backgroundColor", "position"] }] }); }
30602
30629
  }
30603
30630
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CoreDomDecisionEditorComponent, decorators: [{
30604
30631
  type: Component,
@@ -30619,7 +30646,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
30619
30646
  multi: true,
30620
30647
  useExisting: forwardRef(() => CoreDomDecisionEditorComponent),
30621
30648
  },
30622
- ], template: "<div class=\"core-dom-decision-editor-container\">\r\n\r\n <!-- ========================= -->\r\n <!-- Intent Chain Projection -->\r\n <!-- ========================= -->\r\n <section class=\"intent-chain\">\r\n\r\n @if ($projection().intents.length > 0) {\r\n <ol class=\"intent-list\">\r\n @for (intent of $projection().intents; track $index) {\r\n <li class=\"intent-item\">\r\n <div class=\"intent-card\">\r\n\r\n <div class=\"intent-row\">\r\n <div class=\"intent-header\" (click)=\"onSelectEditedIntent(intent.seq)\">\r\n <span class=\"intent-seq\" [appTooltip]=\"intent.actionLabel\" [showAnyway]=\"true\" [position]=\"'above'\">#{{\r\n intent.seq }}</span>\r\n <span class=\"intent-label\">{{ intent.summary }}</span>\r\n </div>\r\n\r\n <div class=\"intent-tool\">\r\n <button type=\"button\" class=\"btn btn-danger-ghost\" (click)=\"onRemoveIntent(intent.seq)\"\r\n [appTooltip]=\"'G\u1EE1'\" [showAnyway]=\"true\" [position]=\"'above'\">\r\n <i class=\"feather-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n }\r\n\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Add Intent Entry Point -->\r\n <!-- ========================= -->\r\n <section class=\"intent-actions-panel\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onAddIntent()\">\r\n + Th\u00EAm Intent\r\n </button>\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Output Preview (Derived) -->\r\n <!-- ========================= -->\r\n <section class=\"output-preview\">\r\n @if ($projection().outputs.length > 1) {\r\n <ul class=\"output-list\">\r\n @for (output of $projection().outputs; track $index) {\r\n <li class=\"output-item\">\r\n <span class=\"output-key\">{{ output.key }}</span>\r\n <span class=\"output-desc\">{{ output.description }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </section>\r\n\r\n <!-- @if (isDevMode) {\r\n\r\n <details class=\"omega-raw\">\r\n <summary>Xem Omega (raw)</summary>\r\n <pre>{{ $omega() | json }}</pre>\r\n </details>\r\n\r\n <label>allTokens</label>\r\n <pre>{{ $allTokens() | json }}</pre>\r\n\r\n } -->\r\n\r\n @if ($showIntentComposer()) {\r\n <!--\r\n Intent Composer Popup\r\n Purpose: Enter intent composition mode only.\r\n MUST NOT:\r\n - Mutate Omega\r\n - Mutate projection\r\n - Execute OM logic\r\n -->\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"intent-composer-entry\">\r\n\r\n @if ($selectedIntentDescriptor()) {\r\n\r\n <intent-composer [$descriptor]=\"$selectedIntentDescriptor()!\" (intentComposed)=\"onIntentDrafted($event)\"\r\n (cancelled)=\"onCancelIntentCompose()\">\r\n </intent-composer>\r\n\r\n } @else {\r\n\r\n <!-- N\u1ED9i dung composer s\u1EBD \u0111\u01B0\u1EE3c c\u1EAFm sau -->\r\n <ul class=\"intent-item-registry\">\r\n @for (intent of INTENT_DESCRIPTOR_REGISTRY; track $index) {\r\n <li class=\"intent-item-point\">\r\n <div class=\"intent-item\" (click)=\"onMenuSelectIntent(intent)\">\r\n <object>{{ intent.actionCode }} | {{ intent.quickEmoji }}</object>\r\n <strong>{{ intent.label }}</strong>\r\n <p>{{ intent.description }}</p>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n\r\n }\r\n @if (!$activeSeq() || true) {\r\n <hr />\r\n <div class=\"popup-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCloseIntentComposer()\">\r\n H\u1EE7y\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>", styles: [".core-dom-decision-editor-container .intent-actions-panel button{border-radius:0;font-size:13px}.core-dom-decision-editor-container .modal-container{overflow:scroll}.core-dom-decision-editor-container .modal-container .modal-content-root{overflow:visible;max-height:unset;padding:0}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry{padding:0 15px 15px}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions{display:flex;align-items:center;justify-content:flex-end}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions button{font-size:13px;border-radius:0}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry{margin-top:15px;padding-top:15px;padding-left:0;overflow-y:scroll;height:60vh}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point{cursor:pointer;padding:8px}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point:hover{color:#fff;background-color:#09f}.core-dom-decision-editor-container .intent-chain .intent-list{list-style:none;padding:0;margin:0}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item{margin-bottom:12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card{border:1px solid #d0d7de;background:#fff;padding:10px 12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card:hover{box-shadow:.4rem 0 2rem #0000002e}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row{display:flex;align-items:center;justify-content:space-between}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header{display:flex;align-items:center;gap:8px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-seq{background:#e6f0ff;color:#084298;border-radius:3px;padding:2px 6px;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label{color:#212529;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label:hover{color:#fff;color:#dd5f2a}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool{display:flex;gap:8px;padding-left:28px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn{border:none;background:none;cursor:pointer;font-size:13px;padding:2px 6px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost{color:#0d6efd}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost:hover{text-decoration:underline}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost{color:#dc3545}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost:hover{text-decoration:underline}\n"] }]
30649
+ ], template: "<div class=\"core-dom-decision-editor-container\">\r\n\r\n <!-- ========================= -->\r\n <!-- Intent Chain Projection -->\r\n <!-- ========================= -->\r\n <section class=\"intent-chain\">\r\n\r\n @if (ctx.$projection().intents.length > 0) {\r\n <ol class=\"intent-list\">\r\n @for (intent of ctx.$projection().intents; track $index) {\r\n <li class=\"intent-item\">\r\n <div class=\"intent-card\">\r\n\r\n <div class=\"intent-row\">\r\n <div class=\"intent-header\" (click)=\"onSelectEditedIntent(intent.seq)\">\r\n <span class=\"intent-seq\" [appTooltip]=\"intent.actionLabel\" [showAnyway]=\"true\" [position]=\"'above'\">#{{\r\n intent.seq }}</span>\r\n <span class=\"intent-label\">{{ intent.summary }}</span>\r\n </div>\r\n\r\n <div class=\"intent-tool\">\r\n <button type=\"button\" class=\"btn btn-danger-ghost\" (click)=\"onRemoveIntent(intent.seq)\"\r\n [appTooltip]=\"'G\u1EE1'\" [showAnyway]=\"true\" [position]=\"'above'\">\r\n <i class=\"feather-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n }\r\n\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Add Intent Entry Point -->\r\n <!-- ========================= -->\r\n <section class=\"intent-actions-panel\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onAddIntent()\">\r\n + Th\u00EAm Intent\r\n </button>\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Output Preview (Derived) -->\r\n <!-- ========================= -->\r\n <section class=\"output-preview\">\r\n @if (ctx.$projection().outputs.length > 1) {\r\n <ul class=\"output-list\">\r\n @for (output of ctx.$projection().outputs; track $index) {\r\n <li class=\"output-item\">\r\n <span class=\"output-key\">{{ output.key }}</span>\r\n <span class=\"output-desc\">{{ output.description }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </section>\r\n\r\n <!-- @if (isDevMode) {\r\n\r\n <details class=\"omega-raw\">\r\n <summary>Xem Omega (raw)</summary>\r\n <pre>{{ $omega() | json }}</pre>\r\n </details>\r\n\r\n <label>allTokens</label>\r\n <pre>{{ $allTokens() | json }}</pre>\r\n\r\n } -->\r\n\r\n @if ($showIntentComposer()) {\r\n <!--\r\n Intent Composer Popup\r\n Purpose: Enter intent composition mode only.\r\n MUST NOT:\r\n - Mutate Omega\r\n - Mutate projection\r\n - Execute OM logic\r\n -->\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"intent-composer-entry\">\r\n\r\n @if ($selectedIntentDescriptor()) {\r\n\r\n <intent-composer [$descriptor]=\"$selectedIntentDescriptor()!\" (intentComposed)=\"onIntentDrafted($event)\"\r\n (cancelled)=\"onCancelIntentCompose()\">\r\n </intent-composer>\r\n\r\n } @else {\r\n\r\n <!-- N\u1ED9i dung composer s\u1EBD \u0111\u01B0\u1EE3c c\u1EAFm sau -->\r\n <ul class=\"intent-item-registry\">\r\n @for (intent of INTENT_DESCRIPTOR_REGISTRY; track $index) {\r\n <li class=\"intent-item-point\">\r\n <div class=\"intent-item\" (click)=\"onMenuSelectIntent(intent)\">\r\n <object>{{ intent.actionCode }} | {{ intent.quickEmoji }}</object>\r\n <strong>{{ intent.label }}</strong>\r\n <p>{{ intent.description }}</p>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n\r\n }\r\n <hr />\r\n <div class=\"popup-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCloseIntentComposer()\">\r\n H\u1EE7y\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>", styles: [".core-dom-decision-editor-container .intent-actions-panel button{border-radius:0;font-size:13px}.core-dom-decision-editor-container .modal-container{overflow:scroll}.core-dom-decision-editor-container .modal-container .modal-content-root{overflow:visible;max-height:unset;padding:0}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry{padding:0 15px 15px}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions{display:flex;align-items:center;justify-content:flex-end}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions button{font-size:13px;border-radius:0}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry{margin-top:15px;padding-top:15px;padding-left:0;overflow-y:scroll;height:60vh}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point{cursor:pointer;padding:8px;color:inherit;background-color:#fff;transition:background-color .25s ease-out,color .25s ease-out}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point:hover{color:#fff;background-color:#09f}.core-dom-decision-editor-container .intent-chain .intent-list{list-style:none;padding:0;margin:0}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item{margin-bottom:12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card{border:1px solid #d0d7de;background:#fff;padding:10px 12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card:hover{box-shadow:.4rem 0 2rem #0000002e}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row{display:flex;align-items:center;justify-content:space-between}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header{display:flex;align-items:center;gap:8px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-seq{background:#e6f0ff;color:#084298;border-radius:3px;padding:2px 6px;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label{color:#212529;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label:hover{color:#fff;color:#dd5f2a}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool{display:flex;gap:8px;padding-left:28px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn{border:none;background:none;cursor:pointer;font-size:13px;padding:2px 6px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost{color:#0d6efd}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost:hover{text-decoration:underline}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost{color:#dc3545}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost:hover{text-decoration:underline}\n"] }]
30623
30650
  }], ctorParameters: () => [] });
30624
30651
 
30625
30652
  class CoreControlComponent extends BaseComponent {
@@ -33559,7 +33586,7 @@ class CoreParamControlComponent extends BaseComponent {
33559
33586
  this.ngModelSubscription?.unsubscribe();
33560
33587
  }
33561
33588
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CoreParamControlComponent, deps: [{ token: MultiLanguageService }, { token: AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
33562
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CoreParamControlComponent, isStandalone: true, selector: "core-param-control", inputs: { control: "control", enableTimeZoneConverterForDateTimePeriodParameters: "enableTimeZoneConverterForDateTimePeriodParameters" }, host: { listeners: { "window:click": "onWindowClick()" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"core-param-control-container\">\r\n\r\n <!-- START: LABEL SESSION-->\r\n <label [class]=\"'control-label'\" *ngIf=\"control.controlType==='CHECKBOX'\">\r\n </label>\r\n <!-- ('UI.COMMON_FILTER' | translate: lang) + -->\r\n <label *ngIf=\"control.name==='dateFrom'\">\r\n {{\r\n\r\n (control.label | translate: lang) +\r\n ('UI.COMMON_FROM' | translate: lang)\r\n }}\r\n </label>\r\n\r\n <label *ngIf=\"control.name==='dateTo'\">\r\n {{\r\n 'UI.COMMON_TO' | translate: lang\r\n }}\r\n </label>\r\n <label *ngIf=\"control.controlType=='DATEPICKER' && control.name!=='dateFrom' && control.name!=='dateTo'\">\r\n {{ control.label | translate: lang }}\r\n </label>\r\n\r\n <label *ngIf=\"control.controlType!=='CHECKBOX' && control.controlType!=='DATEPICKER' && control.controlType!=='REPORT_FORMAT'\">\r\n {{ control.label | translate: lang }}\r\n </label>\r\n <!-- START: LABEL SESSION-->\r\n\r\n <!-- START: FORM-CONTROL SESSION-->\r\n @switch (control.controlType) {\r\n\r\n @case ('SEEKER') {\r\n @if (control.seekerSourceType==='ORGANIZATION_UNIT_SEEK') {\r\n <core-org-param [(ngModel)]=\"control.ngModel\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-org-param>\r\n }\r\n @else {\r\n <!-- This code works,\r\n To do: Avoid hard-coding such as 'id', 'contractNo' and 300 etc -->\r\n <core-form-control-seeker \r\n [paramMode]=\"true\"\r\n [boundFrom]=\"control.boundFrom || 'id'\"\r\n [shownFrom]=\"control.shownFrom!\"\r\n [seekerSourceType]=\"control.seekerSourceType!\" \r\n [multiMode]=\"control.multiMode!\"\r\n [preDefinedOuterParam$]=\"control.preDefinedOuterParam$!\"\r\n [preDefinedOuterFilter$]=\"control.preDefinedOuterFilter$!\"\r\n [$hideTerminatedEmployees]=\"control.$hideTerminatedEmployees()\"\r\n [objectList$]=\"control.objectList$!\"\r\n [getByIdObject$]=\"control.getByIdObject$!\"\r\n [getByIdApi]=\"control.getByIdApi!\"\r\n [excludeExistingList]=\"true\"\r\n [multiModeTableHeight]=\"300\" \r\n [placeholder]=\"control.placeholder!\"\r\n [click$]=\"control.click$!\"\r\n [disabledDoubleClick]=\"control.disabledDoubleClick!\"\r\n [(ngModel)]=\"control.ngModel\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\">\r\n </core-form-control-seeker>\r\n }\r\n }\r\n\r\n @case ('TEXTBOX') {\r\n\r\n @if (control.type==='date') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\" useValueAsDate>\r\n }\r\n\r\n @if (control.type==='number') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\" [step]=\"control.step || '1'\">\r\n }\r\n\r\n @if (control.type!=='date' && control.type!=='number') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\">\r\n }\r\n\r\n }\r\n\r\n @case ('CURRENCY') {\r\n <core-currency-input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [disabled]=\"!!control.disabled!\"></core-currency-input>\r\n }\r\n\r\n @case ('CHECKBOX') {\r\n <core-checkbox [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [text]=\"control.label\" [inputValue]=\"control.value\" [disabled]=\"!!control.disabled!\"></core-checkbox>\r\n }\r\n\r\n @case ('DATEPICKER') {\r\n <core-date-picker [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [rangeLimit]=\"control.rangeLimit!\"\r\n [enableTimeZoneConverter]=\"enableTimeZoneConverterForDateTimePeriodParameters\" [disabled]=\"!!control.disabled!\"\r\n [popupAlign]=\"control.popupAlign!\"\r\n [$rangePoint]=\"control.$rangePoint!\"\r\n ></core-date-picker>\r\n }\r\n\r\n @case ('DROPDOWN') {\r\n @if (!!control.dropdownOptions$) {\r\n <core-dropdown [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [paramMode]=\"true\"\r\n [options$]=\"control.dropdownOptions$!\"></core-dropdown>\r\n }\r\n }\r\n\r\n @case ('CHECKLIST') {\r\n @if (!!control.checklistOptions$) {\r\n <core-checklist [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [paramMode]=\"true\"\r\n [options$]=\"control.checklistOptions$!\"></core-checklist>\r\n }\r\n }\r\n\r\n @case ('ORG_PARAM_DROPDOWN') {\r\n <core-org-param-dropdown [accessorMode]=\"control.accessorMode!\" [(ngModel)]=\"control.ngModel\"\r\n [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-org-param-dropdown>\r\n }\r\n\r\n @case ('MONTHSELECTOR') {\r\n <core-month-selector [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [align]=\"'left'\"></core-month-selector>\r\n }\r\n\r\n @case ('YEARSELECTOR') {\r\n <core-year-selector [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [align]=\"'left'\"></core-year-selector>\r\n }\r\n\r\n @case ('REPORT_FORMAT') {\r\n <core-file-format-picker [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-file-format-picker>\r\n }\r\n\r\n }\r\n\r\n</div>", styles: [".core-param-control-container{padding-left:0;font-size:13px}.core-param-control-container label{color:#848484}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: CoreDropdownComponent, selector: "core-dropdown", inputs: ["getByIdObject$", "paramMode", "shownFrom", "options$", "height", "placeholder", "loading", "warningDisable", "clearDisable", "fitHeightWithItemCount", "itemHeight", "optionApiDriven", "optionApi", "optionHttpVerb", "optionHttpPayload", "optionValueFrom", "optionTextFrom", "$disabled"] }, { kind: "component", type: CoreChecklistComponent, selector: "core-checklist", inputs: ["paramMode", "getByIdObject$", "shownFrom", "options$", "height", "placeholder", "loading", "readonly", "disabled"] }, { kind: "component", type: CoreCheckboxComponent, selector: "core-checkbox", inputs: ["text", "tooltipPosition", "tooltip", "inputValue", "disabled"], outputs: ["onClick"] }, { kind: "component", type: CoreDatePickerComponent, selector: "core-date-picker", inputs: ["enableTimeZoneConverter", "showPlaceholder", "popupWidth", "popupXPadding", "popupAlign", "rangeLimit", "placeholder", "readonly", "disabled", "$rangePoint"] }, { kind: "component", type: CoreOrgParamComponent, selector: "core-org-param", inputs: ["accessorMode"] }, { kind: "component", type: CoreOrgParamDropdownComponent, selector: "core-org-param-dropdown", inputs: ["accessorMode", "dropdownHeight"] }, { kind: "component", type: CoreMonthSelectorComponent, selector: "core-month-selector", inputs: ["align", "placeholder"], outputs: ["onYearClick"] }, { kind: "component", type: CoreYearSelectorComponent, selector: "core-year-selector", inputs: ["align"], outputs: ["onYearClick"] }, { kind: "component", type: CoreFormControlSeekerComponent, selector: "core-form-control-seeker", inputs: ["title", "showPageHeader", "preDefinedOuterParam$", "preDefinedOuterFilter$", "$hideTerminatedEmployees", "click$", "getByIdObject$", "getByIdApi", "paramMode", "multiMode", "objectList$", "useTheseColumns", "hideOrgTree", "excludedColumns", "excludeExistingList", "placeholder", "sourceSpaceHeight", "indirectBinding", "bindGridIdTo", "multiModeExtendedColumns", "multiModeExtendedSections", "editBufferData$", "multiModeTableHeight", "multiModeRowHeight", "seekerSourceType", "boundFrom", "shownFrom", "alsoBindTo", "seekerVerifyIgnore", "disabledDoubleClick", "selfEnrichmentApiDriven", "selfEnrichmentApi", "selfEnrichmentHttpVerb", "selfEnrichmentHttpPayload", "selfEnrichmentShownFrom"], outputs: ["onDoubleClick", "selectedDataChange", "fullValueRowChange"] }, { kind: "component", type: CoreFileFormatPickerComponent, selector: "core-file-format-picker" }, { kind: "component", type: CoreCurrencyInputComponent, selector: "core-currency-input", inputs: ["currencySign", "placeholder"], outputs: ["onLeftFocus"] }] }); }
33589
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CoreParamControlComponent, isStandalone: true, selector: "core-param-control", inputs: { control: "control", enableTimeZoneConverterForDateTimePeriodParameters: "enableTimeZoneConverterForDateTimePeriodParameters" }, host: { listeners: { "window:click": "onWindowClick()" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"core-param-control-container\">\r\n\r\n <!-- START: LABEL SESSION-->\r\n <label [class]=\"'control-label'\" *ngIf=\"control.controlType==='CHECKBOX'\">\r\n </label>\r\n <!-- ('UI.COMMON_FILTER' | translate: lang) + -->\r\n <label *ngIf=\"control.name==='dateFrom'\">\r\n {{\r\n\r\n (control.label | translate: lang) +\r\n ('UI.COMMON_FROM' | translate: lang)\r\n }}\r\n </label>\r\n\r\n <label *ngIf=\"control.name==='dateTo'\">\r\n {{\r\n 'UI.COMMON_TO' | translate: lang\r\n }}\r\n </label>\r\n <label *ngIf=\"control.controlType=='DATEPICKER' && control.name!=='dateFrom' && control.name!=='dateTo'\">\r\n {{ control.label | translate: lang }}\r\n </label>\r\n\r\n <label *ngIf=\"control.controlType!=='CHECKBOX' && control.controlType!=='DATEPICKER' && control.controlType!=='REPORT_FORMAT'\">\r\n {{ control.label | translate: lang }}\r\n </label>\r\n <!-- START: LABEL SESSION-->\r\n\r\n <!-- START: FORM-CONTROL SESSION-->\r\n @switch (control.controlType) {\r\n\r\n @case ('SEEKER') {\r\n @if (control.seekerSourceType==='ORGANIZATION_UNIT_SEEK') {\r\n <core-org-param [(ngModel)]=\"control.ngModel\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-org-param>\r\n }\r\n @else {\r\n <!-- This code works,\r\n To do: Avoid hard-coding such as 'id', 'contractNo' and 300 etc -->\r\n <core-form-control-seeker \r\n [paramMode]=\"true\"\r\n [boundFrom]=\"control.boundFrom || 'id'\"\r\n [shownFrom]=\"control.shownFrom!\"\r\n [seekerSourceType]=\"control.seekerSourceType!\" \r\n [multiMode]=\"control.multiMode!\"\r\n [preDefinedOuterParam$]=\"control.preDefinedOuterParam$!\"\r\n [preDefinedOuterFilter$]=\"control.preDefinedOuterFilter$!\"\r\n [$hideTerminatedEmployees]=\"control.$hideTerminatedEmployees ? control.$hideTerminatedEmployees() : false\"\r\n [objectList$]=\"control.objectList$!\"\r\n [getByIdObject$]=\"control.getByIdObject$!\"\r\n [getByIdApi]=\"control.getByIdApi!\"\r\n [excludeExistingList]=\"true\"\r\n [multiModeTableHeight]=\"300\" \r\n [placeholder]=\"control.placeholder!\"\r\n [click$]=\"control.click$!\"\r\n [disabledDoubleClick]=\"control.disabledDoubleClick!\"\r\n [(ngModel)]=\"control.ngModel\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\">\r\n </core-form-control-seeker>\r\n }\r\n }\r\n\r\n @case ('TEXTBOX') {\r\n\r\n @if (control.type==='date') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\" useValueAsDate>\r\n }\r\n\r\n @if (control.type==='number') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\" [step]=\"control.step || '1'\">\r\n }\r\n\r\n @if (control.type!=='date' && control.type!=='number') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\">\r\n }\r\n\r\n }\r\n\r\n @case ('CURRENCY') {\r\n <core-currency-input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [disabled]=\"!!control.disabled!\"></core-currency-input>\r\n }\r\n\r\n @case ('CHECKBOX') {\r\n <core-checkbox [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [text]=\"control.label\" [inputValue]=\"control.value\" [disabled]=\"!!control.disabled!\"></core-checkbox>\r\n }\r\n\r\n @case ('DATEPICKER') {\r\n <core-date-picker [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [rangeLimit]=\"control.rangeLimit!\"\r\n [enableTimeZoneConverter]=\"enableTimeZoneConverterForDateTimePeriodParameters\" [disabled]=\"!!control.disabled!\"\r\n [popupAlign]=\"control.popupAlign!\"\r\n [$rangePoint]=\"control.$rangePoint!\"\r\n ></core-date-picker>\r\n }\r\n\r\n @case ('DROPDOWN') {\r\n @if (!!control.dropdownOptions$) {\r\n <core-dropdown [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [paramMode]=\"true\"\r\n [options$]=\"control.dropdownOptions$!\"></core-dropdown>\r\n }\r\n }\r\n\r\n @case ('CHECKLIST') {\r\n @if (!!control.checklistOptions$) {\r\n <core-checklist [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [paramMode]=\"true\"\r\n [options$]=\"control.checklistOptions$!\"></core-checklist>\r\n }\r\n }\r\n\r\n @case ('ORG_PARAM_DROPDOWN') {\r\n <core-org-param-dropdown [accessorMode]=\"control.accessorMode!\" [(ngModel)]=\"control.ngModel\"\r\n [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-org-param-dropdown>\r\n }\r\n\r\n @case ('MONTHSELECTOR') {\r\n <core-month-selector [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [align]=\"'left'\"></core-month-selector>\r\n }\r\n\r\n @case ('YEARSELECTOR') {\r\n <core-year-selector [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [align]=\"'left'\"></core-year-selector>\r\n }\r\n\r\n @case ('REPORT_FORMAT') {\r\n <core-file-format-picker [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-file-format-picker>\r\n }\r\n\r\n }\r\n\r\n</div>", styles: [".core-param-control-container{padding-left:0;font-size:13px}.core-param-control-container label{color:#848484}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: CoreDropdownComponent, selector: "core-dropdown", inputs: ["getByIdObject$", "paramMode", "shownFrom", "options$", "height", "placeholder", "loading", "warningDisable", "clearDisable", "fitHeightWithItemCount", "itemHeight", "optionApiDriven", "optionApi", "optionHttpVerb", "optionHttpPayload", "optionValueFrom", "optionTextFrom", "$disabled"] }, { kind: "component", type: CoreChecklistComponent, selector: "core-checklist", inputs: ["paramMode", "getByIdObject$", "shownFrom", "options$", "height", "placeholder", "loading", "readonly", "disabled"] }, { kind: "component", type: CoreCheckboxComponent, selector: "core-checkbox", inputs: ["text", "tooltipPosition", "tooltip", "inputValue", "disabled"], outputs: ["onClick"] }, { kind: "component", type: CoreDatePickerComponent, selector: "core-date-picker", inputs: ["enableTimeZoneConverter", "showPlaceholder", "popupWidth", "popupXPadding", "popupAlign", "rangeLimit", "placeholder", "readonly", "disabled", "$rangePoint"] }, { kind: "component", type: CoreOrgParamComponent, selector: "core-org-param", inputs: ["accessorMode"] }, { kind: "component", type: CoreOrgParamDropdownComponent, selector: "core-org-param-dropdown", inputs: ["accessorMode", "dropdownHeight"] }, { kind: "component", type: CoreMonthSelectorComponent, selector: "core-month-selector", inputs: ["align", "placeholder"], outputs: ["onYearClick"] }, { kind: "component", type: CoreYearSelectorComponent, selector: "core-year-selector", inputs: ["align"], outputs: ["onYearClick"] }, { kind: "component", type: CoreFormControlSeekerComponent, selector: "core-form-control-seeker", inputs: ["title", "showPageHeader", "preDefinedOuterParam$", "preDefinedOuterFilter$", "$hideTerminatedEmployees", "click$", "getByIdObject$", "getByIdApi", "paramMode", "multiMode", "objectList$", "useTheseColumns", "hideOrgTree", "excludedColumns", "excludeExistingList", "placeholder", "sourceSpaceHeight", "indirectBinding", "bindGridIdTo", "multiModeExtendedColumns", "multiModeExtendedSections", "editBufferData$", "multiModeTableHeight", "multiModeRowHeight", "seekerSourceType", "boundFrom", "shownFrom", "alsoBindTo", "seekerVerifyIgnore", "disabledDoubleClick", "selfEnrichmentApiDriven", "selfEnrichmentApi", "selfEnrichmentHttpVerb", "selfEnrichmentHttpPayload", "selfEnrichmentShownFrom"], outputs: ["onDoubleClick", "selectedDataChange", "fullValueRowChange"] }, { kind: "component", type: CoreFileFormatPickerComponent, selector: "core-file-format-picker" }, { kind: "component", type: CoreCurrencyInputComponent, selector: "core-currency-input", inputs: ["currencySign", "placeholder"], outputs: ["onLeftFocus"] }] }); }
33563
33590
  }
33564
33591
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CoreParamControlComponent, decorators: [{
33565
33592
  type: Component,
@@ -33578,7 +33605,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
33578
33605
  CoreFormControlSeekerComponent,
33579
33606
  CoreFileFormatPickerComponent,
33580
33607
  CoreCurrencyInputComponent
33581
- ], template: "<div class=\"core-param-control-container\">\r\n\r\n <!-- START: LABEL SESSION-->\r\n <label [class]=\"'control-label'\" *ngIf=\"control.controlType==='CHECKBOX'\">\r\n </label>\r\n <!-- ('UI.COMMON_FILTER' | translate: lang) + -->\r\n <label *ngIf=\"control.name==='dateFrom'\">\r\n {{\r\n\r\n (control.label | translate: lang) +\r\n ('UI.COMMON_FROM' | translate: lang)\r\n }}\r\n </label>\r\n\r\n <label *ngIf=\"control.name==='dateTo'\">\r\n {{\r\n 'UI.COMMON_TO' | translate: lang\r\n }}\r\n </label>\r\n <label *ngIf=\"control.controlType=='DATEPICKER' && control.name!=='dateFrom' && control.name!=='dateTo'\">\r\n {{ control.label | translate: lang }}\r\n </label>\r\n\r\n <label *ngIf=\"control.controlType!=='CHECKBOX' && control.controlType!=='DATEPICKER' && control.controlType!=='REPORT_FORMAT'\">\r\n {{ control.label | translate: lang }}\r\n </label>\r\n <!-- START: LABEL SESSION-->\r\n\r\n <!-- START: FORM-CONTROL SESSION-->\r\n @switch (control.controlType) {\r\n\r\n @case ('SEEKER') {\r\n @if (control.seekerSourceType==='ORGANIZATION_UNIT_SEEK') {\r\n <core-org-param [(ngModel)]=\"control.ngModel\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-org-param>\r\n }\r\n @else {\r\n <!-- This code works,\r\n To do: Avoid hard-coding such as 'id', 'contractNo' and 300 etc -->\r\n <core-form-control-seeker \r\n [paramMode]=\"true\"\r\n [boundFrom]=\"control.boundFrom || 'id'\"\r\n [shownFrom]=\"control.shownFrom!\"\r\n [seekerSourceType]=\"control.seekerSourceType!\" \r\n [multiMode]=\"control.multiMode!\"\r\n [preDefinedOuterParam$]=\"control.preDefinedOuterParam$!\"\r\n [preDefinedOuterFilter$]=\"control.preDefinedOuterFilter$!\"\r\n [$hideTerminatedEmployees]=\"control.$hideTerminatedEmployees()\"\r\n [objectList$]=\"control.objectList$!\"\r\n [getByIdObject$]=\"control.getByIdObject$!\"\r\n [getByIdApi]=\"control.getByIdApi!\"\r\n [excludeExistingList]=\"true\"\r\n [multiModeTableHeight]=\"300\" \r\n [placeholder]=\"control.placeholder!\"\r\n [click$]=\"control.click$!\"\r\n [disabledDoubleClick]=\"control.disabledDoubleClick!\"\r\n [(ngModel)]=\"control.ngModel\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\">\r\n </core-form-control-seeker>\r\n }\r\n }\r\n\r\n @case ('TEXTBOX') {\r\n\r\n @if (control.type==='date') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\" useValueAsDate>\r\n }\r\n\r\n @if (control.type==='number') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\" [step]=\"control.step || '1'\">\r\n }\r\n\r\n @if (control.type!=='date' && control.type!=='number') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\">\r\n }\r\n\r\n }\r\n\r\n @case ('CURRENCY') {\r\n <core-currency-input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [disabled]=\"!!control.disabled!\"></core-currency-input>\r\n }\r\n\r\n @case ('CHECKBOX') {\r\n <core-checkbox [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [text]=\"control.label\" [inputValue]=\"control.value\" [disabled]=\"!!control.disabled!\"></core-checkbox>\r\n }\r\n\r\n @case ('DATEPICKER') {\r\n <core-date-picker [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [rangeLimit]=\"control.rangeLimit!\"\r\n [enableTimeZoneConverter]=\"enableTimeZoneConverterForDateTimePeriodParameters\" [disabled]=\"!!control.disabled!\"\r\n [popupAlign]=\"control.popupAlign!\"\r\n [$rangePoint]=\"control.$rangePoint!\"\r\n ></core-date-picker>\r\n }\r\n\r\n @case ('DROPDOWN') {\r\n @if (!!control.dropdownOptions$) {\r\n <core-dropdown [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [paramMode]=\"true\"\r\n [options$]=\"control.dropdownOptions$!\"></core-dropdown>\r\n }\r\n }\r\n\r\n @case ('CHECKLIST') {\r\n @if (!!control.checklistOptions$) {\r\n <core-checklist [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [paramMode]=\"true\"\r\n [options$]=\"control.checklistOptions$!\"></core-checklist>\r\n }\r\n }\r\n\r\n @case ('ORG_PARAM_DROPDOWN') {\r\n <core-org-param-dropdown [accessorMode]=\"control.accessorMode!\" [(ngModel)]=\"control.ngModel\"\r\n [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-org-param-dropdown>\r\n }\r\n\r\n @case ('MONTHSELECTOR') {\r\n <core-month-selector [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [align]=\"'left'\"></core-month-selector>\r\n }\r\n\r\n @case ('YEARSELECTOR') {\r\n <core-year-selector [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [align]=\"'left'\"></core-year-selector>\r\n }\r\n\r\n @case ('REPORT_FORMAT') {\r\n <core-file-format-picker [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-file-format-picker>\r\n }\r\n\r\n }\r\n\r\n</div>", styles: [".core-param-control-container{padding-left:0;font-size:13px}.core-param-control-container label{color:#848484}\n"] }]
33608
+ ], template: "<div class=\"core-param-control-container\">\r\n\r\n <!-- START: LABEL SESSION-->\r\n <label [class]=\"'control-label'\" *ngIf=\"control.controlType==='CHECKBOX'\">\r\n </label>\r\n <!-- ('UI.COMMON_FILTER' | translate: lang) + -->\r\n <label *ngIf=\"control.name==='dateFrom'\">\r\n {{\r\n\r\n (control.label | translate: lang) +\r\n ('UI.COMMON_FROM' | translate: lang)\r\n }}\r\n </label>\r\n\r\n <label *ngIf=\"control.name==='dateTo'\">\r\n {{\r\n 'UI.COMMON_TO' | translate: lang\r\n }}\r\n </label>\r\n <label *ngIf=\"control.controlType=='DATEPICKER' && control.name!=='dateFrom' && control.name!=='dateTo'\">\r\n {{ control.label | translate: lang }}\r\n </label>\r\n\r\n <label *ngIf=\"control.controlType!=='CHECKBOX' && control.controlType!=='DATEPICKER' && control.controlType!=='REPORT_FORMAT'\">\r\n {{ control.label | translate: lang }}\r\n </label>\r\n <!-- START: LABEL SESSION-->\r\n\r\n <!-- START: FORM-CONTROL SESSION-->\r\n @switch (control.controlType) {\r\n\r\n @case ('SEEKER') {\r\n @if (control.seekerSourceType==='ORGANIZATION_UNIT_SEEK') {\r\n <core-org-param [(ngModel)]=\"control.ngModel\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-org-param>\r\n }\r\n @else {\r\n <!-- This code works,\r\n To do: Avoid hard-coding such as 'id', 'contractNo' and 300 etc -->\r\n <core-form-control-seeker \r\n [paramMode]=\"true\"\r\n [boundFrom]=\"control.boundFrom || 'id'\"\r\n [shownFrom]=\"control.shownFrom!\"\r\n [seekerSourceType]=\"control.seekerSourceType!\" \r\n [multiMode]=\"control.multiMode!\"\r\n [preDefinedOuterParam$]=\"control.preDefinedOuterParam$!\"\r\n [preDefinedOuterFilter$]=\"control.preDefinedOuterFilter$!\"\r\n [$hideTerminatedEmployees]=\"control.$hideTerminatedEmployees ? control.$hideTerminatedEmployees() : false\"\r\n [objectList$]=\"control.objectList$!\"\r\n [getByIdObject$]=\"control.getByIdObject$!\"\r\n [getByIdApi]=\"control.getByIdApi!\"\r\n [excludeExistingList]=\"true\"\r\n [multiModeTableHeight]=\"300\" \r\n [placeholder]=\"control.placeholder!\"\r\n [click$]=\"control.click$!\"\r\n [disabledDoubleClick]=\"control.disabledDoubleClick!\"\r\n [(ngModel)]=\"control.ngModel\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\">\r\n </core-form-control-seeker>\r\n }\r\n }\r\n\r\n @case ('TEXTBOX') {\r\n\r\n @if (control.type==='date') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\" useValueAsDate>\r\n }\r\n\r\n @if (control.type==='number') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\" [step]=\"control.step || '1'\">\r\n }\r\n\r\n @if (control.type!=='date' && control.type!=='number') {\r\n <input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [type]=\"control.type\" [disabled]=\"!!control.disabled!\" class=\"form-control\">\r\n }\r\n\r\n }\r\n\r\n @case ('CURRENCY') {\r\n <core-currency-input [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [disabled]=\"!!control.disabled!\"></core-currency-input>\r\n }\r\n\r\n @case ('CHECKBOX') {\r\n <core-checkbox [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [text]=\"control.label\" [inputValue]=\"control.value\" [disabled]=\"!!control.disabled!\"></core-checkbox>\r\n }\r\n\r\n @case ('DATEPICKER') {\r\n <core-date-picker [(ngModel)]=\"control.ngModel\" (ngModelChange)=\"control.ngModelChange(control.name, $event)\"\r\n [rangeLimit]=\"control.rangeLimit!\"\r\n [enableTimeZoneConverter]=\"enableTimeZoneConverterForDateTimePeriodParameters\" [disabled]=\"!!control.disabled!\"\r\n [popupAlign]=\"control.popupAlign!\"\r\n [$rangePoint]=\"control.$rangePoint!\"\r\n ></core-date-picker>\r\n }\r\n\r\n @case ('DROPDOWN') {\r\n @if (!!control.dropdownOptions$) {\r\n <core-dropdown [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [paramMode]=\"true\"\r\n [options$]=\"control.dropdownOptions$!\"></core-dropdown>\r\n }\r\n }\r\n\r\n @case ('CHECKLIST') {\r\n @if (!!control.checklistOptions$) {\r\n <core-checklist [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [paramMode]=\"true\"\r\n [options$]=\"control.checklistOptions$!\"></core-checklist>\r\n }\r\n }\r\n\r\n @case ('ORG_PARAM_DROPDOWN') {\r\n <core-org-param-dropdown [accessorMode]=\"control.accessorMode!\" [(ngModel)]=\"control.ngModel\"\r\n [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-org-param-dropdown>\r\n }\r\n\r\n @case ('MONTHSELECTOR') {\r\n <core-month-selector [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [align]=\"'left'\"></core-month-selector>\r\n }\r\n\r\n @case ('YEARSELECTOR') {\r\n <core-year-selector [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\" [align]=\"'left'\"></core-year-selector>\r\n }\r\n\r\n @case ('REPORT_FORMAT') {\r\n <core-file-format-picker [(ngModel)]=\"control.ngModel\" [disabled]=\"!!control.disabled!\"\r\n (ngModelChange)=\"control.ngModelChange(control.name, $event)\"></core-file-format-picker>\r\n }\r\n\r\n }\r\n\r\n</div>", styles: [".core-param-control-container{padding-left:0;font-size:13px}.core-param-control-container label{color:#848484}\n"] }]
33582
33609
  }], ctorParameters: () => [{ type: MultiLanguageService }, { type: AlertService }], propDecorators: { control: [{
33583
33610
  type: Input
33584
33611
  }], enableTimeZoneConverterForDateTimePeriodParameters: [{
@@ -35701,7 +35728,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
35701
35728
  const hrmSchemaRoutes = [
35702
35729
  {
35703
35730
  path: '',
35704
- loadComponent: () => import('./ngx-histaff-alpha-hrm-schema.component-DuFTr8Ym.mjs').then(m => m.HrmSchemaComponent)
35731
+ loadComponent: () => import('./ngx-histaff-alpha-hrm-schema.component-COWJ2Ral.mjs').then(m => m.HrmSchemaComponent)
35705
35732
  }
35706
35733
  ];
35707
35734
 
@@ -37874,7 +37901,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
37874
37901
  const simpleChatRoutes = [
37875
37902
  {
37876
37903
  path: '',
37877
- loadComponent: () => import('./ngx-histaff-alpha-simple-chat.component-Ct043oiC.mjs').then(m => m.SimpleChatComponent)
37904
+ loadComponent: () => import('./ngx-histaff-alpha-simple-chat.component-CUG_FqKD.mjs').then(m => m.SimpleChatComponent)
37878
37905
  }
37879
37906
  ];
37880
37907
 
@@ -38540,7 +38567,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
38540
38567
  const coreSysActionRoutes = [
38541
38568
  {
38542
38569
  path: "",
38543
- loadComponent: () => import('./ngx-histaff-alpha-core-sys-action.component-BHMOJ9Wv.mjs').then(m => m.CoreSysActionComponent),
38570
+ loadComponent: () => import('./ngx-histaff-alpha-core-sys-action.component-BcbxxbiH.mjs').then(m => m.CoreSysActionComponent),
38544
38571
  children: [
38545
38572
  {
38546
38573
  path: ":id",
@@ -39933,11 +39960,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
39933
39960
  const sysSmtpClientRoutes = [
39934
39961
  {
39935
39962
  path: '',
39936
- loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client.component-jEb9g23R.mjs').then(m => m.SysSmtpClientComponent),
39963
+ loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client.component-INHDOFv_.mjs').then(m => m.SysSmtpClientComponent),
39937
39964
  children: [
39938
39965
  {
39939
39966
  path: ':id',
39940
- loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client-edit.component-CYEhx-zn.mjs').then(m => m.SysSmtpClientEditComponent),
39967
+ loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client-edit.component-ilgHs5Ow.mjs').then(m => m.SysSmtpClientEditComponent),
39941
39968
  outlet: 'corePageListAux'
39942
39969
  }
39943
39970
  ]
@@ -41123,11 +41150,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
41123
41150
  const coreDocGenRoutes = [
41124
41151
  {
41125
41152
  path: 'template-list',
41126
- loadComponent: () => import('./ngx-histaff-alpha-template-list.component-r_mRH85W.mjs').then(m => m.TemplateListComponent),
41153
+ loadComponent: () => import('./ngx-histaff-alpha-template-list.component-d-CuW__f.mjs').then(m => m.TemplateListComponent),
41127
41154
  },
41128
41155
  {
41129
41156
  path: ":id",
41130
- loadComponent: () => import('./ngx-histaff-alpha-core-template-editor.component-JepLT3Kj.mjs').then(m => m.CoreTemplateEditorComponent),
41157
+ loadComponent: () => import('./ngx-histaff-alpha-core-template-editor.component-CmlAEjel.mjs').then(m => m.CoreTemplateEditorComponent),
41131
41158
  canDeactivate: [CanDeactivateGuard]
41132
41159
  },
41133
41160
  {
@@ -41156,7 +41183,7 @@ const coreFormDesignRoutes = [
41156
41183
  },
41157
41184
  {
41158
41185
  path: ':id',
41159
- loadComponent: () => import('./ngx-histaff-alpha-core-form-design.component-gFVfWdCK.mjs').then(m => m.CoreFormDesignComponent)
41186
+ loadComponent: () => import('./ngx-histaff-alpha-core-form-design.component-COU0j6A1.mjs').then(m => m.CoreFormDesignComponent)
41160
41187
  }
41161
41188
  ];
41162
41189
 
@@ -42067,7 +42094,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
42067
42094
  const coreNavigationTrackerRoutes = [
42068
42095
  {
42069
42096
  path: '',
42070
- loadComponent: () => import('./ngx-histaff-alpha-tracker-studio.component-BcyA0mRW.mjs').then(m => m.TrackerStudioComponent)
42097
+ loadComponent: () => import('./ngx-histaff-alpha-tracker-studio.component-BtY_SG87.mjs').then(m => m.TrackerStudioComponent)
42071
42098
  }
42072
42099
  ];
42073
42100
 
@@ -45170,33 +45197,33 @@ const coreWorkflowRoutes = [
45170
45197
  {
45171
45198
  path: 'form-assign/:id',
45172
45199
  outlet: "formAssignAux",
45173
- loadComponent: () => import('./ngx-histaff-alpha-wf-form-assign.component-BVr6v49F.mjs').then(m => m.WfFormAssignComponent),
45200
+ loadComponent: () => import('./ngx-histaff-alpha-wf-form-assign.component-DvuaKC7t.mjs').then(m => m.WfFormAssignComponent),
45174
45201
  canDeactivate: [CanDeactivateGuard]
45175
45202
  }
45176
45203
  ]
45177
45204
  },
45178
45205
  {
45179
45206
  path: 'global-config',
45180
- loadComponent: () => import('./ngx-histaff-alpha-wf-global-config.component-DTuh5zdi.mjs').then(m => m.WfGlobalConfigComponent)
45207
+ loadComponent: () => import('./ngx-histaff-alpha-wf-global-config.component-CCMceLib.mjs').then(m => m.WfGlobalConfigComponent)
45181
45208
  },
45182
45209
  {
45183
45210
  path: 'db-settings',
45184
- loadComponent: () => import('./ngx-histaff-alpha-db-settings.component-C9jL42sk.mjs').then(m => m.DbSettingsComponent)
45211
+ loadComponent: () => import('./ngx-histaff-alpha-db-settings.component-B_vmJCH1.mjs').then(m => m.DbSettingsComponent)
45185
45212
  },
45186
45213
  {
45187
45214
  path: 'workflow-consume',
45188
- loadComponent: () => import('./ngx-histaff-alpha-core-workflow-consume.component-C1uTy3Fc.mjs').then(m => m.CoreWorkflowConsumeComponent),
45215
+ loadComponent: () => import('./ngx-histaff-alpha-core-workflow-consume.component-10iNOdMU.mjs').then(m => m.CoreWorkflowConsumeComponent),
45189
45216
  children: [
45190
45217
  {
45191
45218
  path: ':id',
45192
45219
  outlet: "workflowConsume",
45193
- loadComponent: () => import('./ngx-histaff-alpha-live-form.component-B7gcJMSi.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
45220
+ loadComponent: () => import('./ngx-histaff-alpha-live-form.component-Db5vGzS-.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
45194
45221
  }
45195
45222
  ]
45196
45223
  },
45197
45224
  {
45198
45225
  path: 'workflow-consume/:id',
45199
- loadComponent: () => import('./ngx-histaff-alpha-live-form.component-B7gcJMSi.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
45226
+ loadComponent: () => import('./ngx-histaff-alpha-live-form.component-Db5vGzS-.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
45200
45227
  },
45201
45228
  {
45202
45229
  path: 'workflow-group-edit/:id',
@@ -45206,21 +45233,21 @@ const coreWorkflowRoutes = [
45206
45233
  },
45207
45234
  {
45208
45235
  path: 'design/:id',
45209
- loadChildren: () => import('./ngx-histaff-alpha-design-wrapper.route-BlSny2JD.mjs').then(m => m.wfDesignWrapperRoutes),
45236
+ loadChildren: () => import('./ngx-histaff-alpha-design-wrapper.route-CQjA9Bm5.mjs').then(m => m.wfDesignWrapperRoutes),
45210
45237
  },
45211
45238
  ]
45212
45239
  },
45213
45240
  {
45214
45241
  path: 'react/:id',
45215
- loadComponent: () => import('./ngx-histaff-alpha-wf-instance-step-react.component-BwE5a99D.mjs').then(m => m.WfInstanceStepReactComponent)
45242
+ loadComponent: () => import('./ngx-histaff-alpha-wf-instance-step-react.component-Bv5QnQbm.mjs').then(m => m.WfInstanceStepReactComponent)
45216
45243
  },
45217
45244
  {
45218
45245
  path: 'status/:id',
45219
- loadComponent: () => import('./ngx-histaff-alpha-wf-instance-status.component-BKDScZSG.mjs').then(m => m.WfInstanceStatusComponent)
45246
+ loadComponent: () => import('./ngx-histaff-alpha-wf-instance-status.component-BtFXU-R-.mjs').then(m => m.WfInstanceStatusComponent)
45220
45247
  },
45221
45248
  {
45222
45249
  path: 'lab',
45223
- loadComponent: () => import('./ngx-histaff-alpha-wf-lab.component-lqKBXhBp.mjs').then(m => m.WfLabComponent)
45250
+ loadComponent: () => import('./ngx-histaff-alpha-wf-lab.component-qS2-1UVx.mjs').then(m => m.WfLabComponent)
45224
45251
  }
45225
45252
  ];
45226
45253
 
@@ -47829,4 +47856,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
47829
47856
  */
47830
47857
 
47831
47858
  export { READONLY_WORKFLOW_FIELDS as $, AppService as A, BaseComponent as B, ChatService as C, DragReorderDirective as D, EnumFormBaseContolType as E, FullscreenModalLoaderComponent as F, DomService as G, HtmlTooltipDirective as H, ImageErrorResolverDirective as I, EnumActorSourceType as J, CoreParamControlComponent as K, CoreRadioGroupComponent as L, MultiLanguageService as M, GptService as N, CoreRuleTreeService as O, CoreRuleTreeComponent as P, CoreStickerCollectionComponent as Q, ApplicationHelpService as R, StringHtmlPipe as S, TooltipDirective as T, HotKeysDirective as U, CoreDatetimeService as V, EnumCorePageEditMode as W, CoreFormComponent as X, NavigatorService as Y, JsonService as Z, EnumCoreButtonVNSCode as _, AppConfigService as a, CheckForUpdateService as a$, noneAutoClosedAlertOptions as a0, CoreButtonGroupVnsComponent as a1, CoreDropdownComponent as a2, EnumFilterOperator as a3, CoreDomDecisionEditorComponent as a4, CoreControlNoFormArrayComponent as a5, EnumFormDesignMode as a6, CoreControlComponent as a7, JsonSafePipe as a8, CoreChecklistComponent as a9, EnumDragType as aA, EnumErrorType as aB, EnumIconClass as aC, EnumProfileInfoSector as aD, EnumSignalRType as aE, EnumSortDirection as aF, EnumStyleButtonClass as aG, CanActivateFunctionUrlMapperGuard as aH, InitializationCanActivateFn as aI, InitializationCanMatchFn as aJ, httpInterceptorProviders as aK, InterceptorSkipHeader as aL, appTypeInterceptor as aM, baseUrlInterceptor as aN, authInterceptor as aO, graphInterceptor as aP, tokenInterceptor as aQ, responseInterceptor as aR, timeZoneInterceptor as aS, cachingInterceptor as aT, langInterceptor as aU, OnlineUsersComponent as aV, ActionService as aW, AppInitializationService as aX, AuthService as aY, CacheService as aZ, EnumSwUpdateVersionUpdatesEventType as a_, CoreFormControlSeekerComponent as aa, CoreAttachmentComponent as ab, CoreDatePickerComponent as ac, CoreMonthSelectorComponent as ad, CoreCurrencyInputComponent as ae, EnumImageResolverType as af, NormalizeHumanNamePipe as ag, CoreIosSwitcherComponent as ah, SunnyRotatingComponent as ai, MapAppdemoToServerPipePipe as aj, MapAttachmentToServerPipe as ak, MapNewsfeedMediaToServerPipe as al, UploadedFilenameCutoffPipe as am, DialogStateComponent as an, FooterComponent as ao, RightchatComponent as ap, WaittingScreenComponent as aq, longAlertOptions as ar, attachmentOptions as as, CORE_VNS_BUTTONS as at, defaultPaging as au, DESKTOP_SCREEN_HEDER_HEIGHT as av, MOBILE_SCREEN_HEDER_HEIGHT as aw, themeBlue as ax, DATE_VALUE_ACCESSOR as ay, DateValueAccessor as az, AlertService as b, hrmSchemaRoutes as b$, EnumDeviceType as b0, EnumBrowserType as b1, EnumOsType as b2, ClientService as b3, CommonHttpRequestService as b4, TLA_CONFIG as b5, ConfigService as b6, CoreLocalStorageService as b7, CoreTableService as b8, DndService as b9, EnumSsrsExpressFileExtension as bA, EnumSsrsExpressExportFormat as bB, SsrsExpressService as bC, StatisticService as bD, StatisticAuthService as bE, SysMenuService as bF, TimeSheetService as bG, TopicPermissionService as bH, TopicTreeService as bI, UploadedFileService as bJ, UrlService as bK, UserActivityService as bL, EvaluateDialogService as bM, EnumWorkScheduleViewMode as bN, WorkShiftDndService as bO, AtShiftPatternComponent as bP, AtShiftPatternApplyComponent as bQ, AtShiftPatternEditComponent as bR, AtWorksignComponent as bS, AtWorksignService as bT, FunctionComponent as bU, IndividualScheduleApplyComponent as bV, FunctionEditComponent as bW, FunctionIgnoreComponent as bX, FunctionIgnoreEditComponent as bY, GroupFunctionComponent as bZ, GroupFunctionEditComponent as b_, DocxMergeService as ba, FilterKitService as bb, GrpcService as bc, HeaderService as bd, HistoryService as be, HttpErrorHandler as bf, HubConnectionService as bg, IpServiceService as bh, LayoutService as bi, LiquidJsService as bj, MapService as bk, MenuService as bl, MessageService as bm, ModalService as bn, OrganizationService as bo, PkceService as bp, PositionTransferService as bq, EnumNotificationDir as br, NotificationActionType as bs, PushNotificationService as bt, RandomAvatarService as bu, RequestCache as bv, RequestCacheWithMap as bw, ResponseService as bx, RoutingService as by, DomainSocketOrchestrator as bz, CoreTerminalSpinnerComponent as c, ECoreTableToolClass as c$, InMemoryComponent as c0, LanguageComponent as c1, LanguageEditComponent as c2, MenuComponent as c3, MenuEditComponent as c4, MutationLogComponent as c5, MutationViewComponent as c6, PaSalaryPolicyComponent as c7, PaSalaryPolicyEditComponent as c8, PortalRouteComponent as c9, BaseDropdownComponent as cA, ButtonGroupModule as cB, ButtonGroupService as cC, ButtonGroupComponent as cD, EnumButtonCaptionCode as cE, CoreButtonComponent as cF, CoreAccordionComponent as cG, CoreAccordionService as cH, CoreActiveUserCountComponent as cI, NewlyCreatedTokenService as cJ, CoreApiProgressComponent as cK, CoreButtonGroupComponent as cL, EnumCoreButtonCode as cM, ActionSvgEditComponent as cN, CoreButtonGroupService as cO, CoreButtonVnsComponent as cP, CoreCommonParamKitComponent as cQ, CoreCompareDbPipelineComponent as cR, CoreCompositionState as cS, CoreCompositionService as cT, CoreCompositionComponent as cU, CoreConfirmDialogComponent as cV, ConfirmDialogStateComponent as cW, CoreLazyMountComponent as cX, CoreRootMenuItemPickerComponent as cY, CoreRootMenuItemPickerService as cZ, ECoreTableToolCode as c_, ScheduleOverviewComponent as ca, simpleChatRoutes as cb, PortalRouteEditComponent as cc, SysOtherListComponent as cd, SysOtherListEditComponent as ce, SysOtherListTypeComponent as cf, SysOtherListTypeEditComponent as cg, coreSysActionRoutes as ch, SysActionComponent as ci, SysActionEditComponent as cj, SysFunctionActionComponent as ck, SysFunctionActionEditComponent as cl, SysFunctionActionMapperComponent as cm, SysFunctionUrlMapperComponent as cn, FunctionEditService as co, SysModuleComponent as cp, SysModuleEditComponent as cq, SysRouteAccessComponent as cr, sysSmtpClientRoutes as cs, liner_to_nested_array_script as ct, blob_to_base64_script as cu, AlertComponent as cv, EnumAlertType as cw, IAlertOptions as cx, AnimatedTextService as cy, AnimatedTextComponent as cz, CorePageHeaderComponent as d, CorePageListState as d$, CoreTableComponent as d0, CoreContractSeekerComponent as d1, CoreControlNoGridBufferComponent as d2, CoreControlNoSeekerComponent as d3, coreDocGenRoutes as d4, CoreDocgenToolbarComponent as d5, CoreEmployeeScheduleComponent as d6, CoreEmployeeSeekerComponent as d7, EnumCoreFileUploaderType as d8, CoreFileUploaderComponent as d9, CoreListComponent as dA, CoreListLazyComponent as dB, CoreLoadingSurfaceComponent as dC, CoreMccComponent as dD, CoreMonthPickerComponent as dE, CoreNavigationTrackerComponent as dF, coreNavigationTrackerRoutes as dG, CoreOauthCallbackComponent as dH, CoreOauthCallbackOffice365Component as dI, EnumCoreOrgTreeaAccessorMode as dJ, EnumCoreOrgTreeaSearchMode as dK, CoreOrgTreeComponent as dL, CoreOrgTreeState as dM, CoreOrgTreeService as dN, CoreOrgUnitSeekerComponent as dO, CoreOrgchartflexComponent as dP, CARD_COLORS as dQ, CoreOrgchartflexWrapperComponent as dR, coreOrgchartflexRoutes as dS, CoreOrgParamComponent as dT, EnumCorePageEditBootstrapClass as dU, EnumCorePageEditFieldType as dV, CorePageEditService as dW, CorePageEditLiteComponent as dX, CorePageEditTabComponent as dY, EnumExType as dZ, CorePageListService as d_, CoreFilterHubComponent as da, CoreFilterHubService as db, ControlBase as dc, Textbox as dd, CoreControlService as de, CustomValidators as df, URL_PATTERN as dg, coreFormDesignRoutes as dh, CoreFormTabComponent as di, CoreFormLiteComponent as dj, CoreFormControlBaseComponent as dk, EnumCoreSeekerColumnJob as dl, EnumCoreSeekerColumnStaffProfile as dm, EnumCoreSeekerColumnContract as dn, EnumCoreSeekerColumnWorking as dp, EnumCoreSeekerColumnWage as dq, EnumCoreSeekerColumnPosition as dr, EnumCoreSeekerColumnPositionConcurrent as ds, EnumCoreSeekerColumnAutoForm as dt, SeekerService as du, CoreGridBufferComponent as dv, CoreHeaderParamsComponent as dw, CoreHelperComponent as dx, CoreLineComponent as dy, CoreLiquidWysiwygComponent as dz, TranslatePipe as e, OtpInputService as e$, CorePageListContentComponent as e0, EnumCoreViewItemType as e1, CorePageViewComponent as e2, CorePaginationComponent as e3, CorePaginationFullComponent as e4, CorePaginationFullService as e5, CoreFileFormatPickerComponent as e6, CorePermissionService as e7, EnumPermissionObjectType as e8, CorePermissionComponent as e9, CoreTreeComponent as eA, EnumCoreTreeGridEditMode as eB, CoreTreeGridComponent as eC, CoreTreeReferenceComponent as eD, CoreWageSeekerComponent as eE, CoreWorkingSeekerComponent as eF, coreWorkflowRoutes as eG, CoreWorkflowBuilderComponent as eH, CoreWorkflowGroupEditComponent as eI, CoreYearPickerComponent as eJ, CoreYearSelectorComponent as eK, EnumCoreD3ScaleType as eL, CoreD3Service as eM, CorePieComponent as eN, CoreScatterPlotComponent as eO, EnumHrComparisonCode as eP, EnumICoreStatisticWidgetDataType as eQ, CoreStatisticWidgetComponent as eR, DecisionComponent as eS, EvaluateDialogComponent as eT, HuconcurrentlyComponent as eU, JobComponent as eV, LanguageChangerComponent as eW, DEFAULT_SVG as eX, ItemComponent as eY, NavigatorComponent as eZ, OtpInputComponent as e_, CorePermissionActionsComponent as ea, CorePositionConcurrentSeekerComponent as eb, CorePositionSeekerComponent as ec, CoreQrcodeComponent as ed, EnumOparator as ee, CoreQueryBuilderComponent as ef, CoreReducerIconComponent as eg, CoreRotatingTextComponent as eh, CoreRouteAccumulatorComponent as ei, CoreRoutingHistoryComponent as ej, CoreSalaryPolicyPickerComponent as ek, CoreScrollComponent as el, CoreScrollLazyComponent as em, CoreSeenByComponent as en, CoreShiftCardComponent as eo, CoreShiftCellComponent as ep, CoreShiftCollectionComponent as eq, CoreShiftStickerComponent as er, STICKER_COLOR_SCHEMA as es, CoreSubFormGroupComponent as et, CoreTabListComponent as eu, CoreTagsComponent as ev, CoreTopicPickerComponent as ew, EnumCoreArticleCategoryTreeaAccessorMode as ex, CoreTopicTreeComponent as ey, CoreTimezoneComponent as ez, CorePageListComponent as f, PageTitleComponent as f0, PaginationComponent as f1, FilterPipe as f2, normalizeHumanName as f3, PositionComponent as f4, PositionEditService as f5, FileService as f6, LongTaskService as f7, EnumRecursiveFields as f8, RecursiveService as f9, StringService as fa, UnicodeService as fb, StaffProfileComponent as fc, ThreedotsComponent as fd, TooltipComponent as fe, UserActivityComponent as ff, WageComponent as fg, tooltip_directive as fh, coreStickerCollection_component as fi, dragReorder_directive as fj, CoreStatusStickerComponent as g, BaseEditComponent as h, DialogService as i, CorePageEditComponent as j, EnumCoreTablePipeType as k, CoreCheckboxComponent as l, CoreTabsComponent as m, CoreWorkflowService as n, EnumCoreFormControlSeekerSourceType as o, CoreFormService as p, DbService as q, AiHintForColumnComponent as r, CoreWorkflowListComponent as s, CanDeactivateGuard as t, MapAvatarToServerPipe as u, TableCellPipe as v, alertOptions as w, SocketService as x, CoreFormDesignService as y, EnumWorkflowStepType as z };
47832
- //# sourceMappingURL=ngx-histaff-alpha-ngx-histaff-alpha-B6JZNI6c.mjs.map
47859
+ //# sourceMappingURL=ngx-histaff-alpha-ngx-histaff-alpha-ahDUrQN8.mjs.map