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.
- package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-BqjboYjv.mjs → ngx-histaff-alpha-ai-hint-for-table.component-DNzp1e4r.mjs} +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
- package/fesm2022/{ngx-histaff-alpha-core-form-design.component-gFVfWdCK.mjs → ngx-histaff-alpha-core-form-design.component-COU0j6A1.mjs} +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
- package/fesm2022/{ngx-histaff-alpha-core-sys-action.component-BHMOJ9Wv.mjs → ngx-histaff-alpha-core-sys-action.component-BcbxxbiH.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-core-sys-action.component-BHMOJ9Wv.mjs.map → ngx-histaff-alpha-core-sys-action.component-BcbxxbiH.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-core-template-editor.component-JepLT3Kj.mjs → ngx-histaff-alpha-core-template-editor.component-CmlAEjel.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-core-template-editor.component-JepLT3Kj.mjs.map → ngx-histaff-alpha-core-template-editor.component-CmlAEjel.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-Ci5mPC3a.mjs → ngx-histaff-alpha-core-toast-loading.component-ChI14kG6.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-Ci5mPC3a.mjs.map → ngx-histaff-alpha-core-toast-loading.component-ChI14kG6.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-C1uTy3Fc.mjs → ngx-histaff-alpha-core-workflow-consume.component-10iNOdMU.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-C1uTy3Fc.mjs.map → ngx-histaff-alpha-core-workflow-consume.component-10iNOdMU.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-db-settings.component-C9jL42sk.mjs → ngx-histaff-alpha-db-settings.component-B_vmJCH1.mjs} +5 -5
- package/fesm2022/{ngx-histaff-alpha-db-settings.component-C9jL42sk.mjs.map → ngx-histaff-alpha-db-settings.component-B_vmJCH1.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-sAxUjDDo.mjs → ngx-histaff-alpha-design-wrapper.component-D69aMbnU.mjs} +5 -5
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-sAxUjDDo.mjs.map → ngx-histaff-alpha-design-wrapper.component-D69aMbnU.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-BlSny2JD.mjs → ngx-histaff-alpha-design-wrapper.route-CQjA9Bm5.mjs} +5 -5
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-BlSny2JD.mjs.map → ngx-histaff-alpha-design-wrapper.route-CQjA9Bm5.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-hrm-schema.component-DuFTr8Ym.mjs → ngx-histaff-alpha-hrm-schema.component-COWJ2Ral.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-hrm-schema.component-DuFTr8Ym.mjs.map → ngx-histaff-alpha-hrm-schema.component-COWJ2Ral.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-live-form.component-B7gcJMSi.mjs → ngx-histaff-alpha-live-form.component-Db5vGzS-.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-live-form.component-B7gcJMSi.mjs.map → ngx-histaff-alpha-live-form.component-Db5vGzS-.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-ngx-histaff-alpha-B6JZNI6c.mjs → ngx-histaff-alpha-ngx-histaff-alpha-ahDUrQN8.mjs} +593 -566
- package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-ahDUrQN8.mjs.map +1 -0
- package/fesm2022/{ngx-histaff-alpha-simple-chat.component-Ct043oiC.mjs → ngx-histaff-alpha-simple-chat.component-CUG_FqKD.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-simple-chat.component-Ct043oiC.mjs.map → ngx-histaff-alpha-simple-chat.component-CUG_FqKD.mjs.map} +1 -1
- 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
- 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
- package/fesm2022/{ngx-histaff-alpha-sys-smtp-client.component-jEb9g23R.mjs → ngx-histaff-alpha-sys-smtp-client.component-INHDOFv_.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-sys-smtp-client.component-jEb9g23R.mjs.map → ngx-histaff-alpha-sys-smtp-client.component-INHDOFv_.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-template-list.component-r_mRH85W.mjs → ngx-histaff-alpha-template-list.component-d-CuW__f.mjs} +2 -2
- 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
- package/fesm2022/{ngx-histaff-alpha-tracker-studio.component-BcyA0mRW.mjs → ngx-histaff-alpha-tracker-studio.component-BtY_SG87.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-tracker-studio.component-BcyA0mRW.mjs.map → ngx-histaff-alpha-tracker-studio.component-BtY_SG87.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-BVr6v49F.mjs → ngx-histaff-alpha-wf-form-assign.component-DvuaKC7t.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-BVr6v49F.mjs.map → ngx-histaff-alpha-wf-form-assign.component-DvuaKC7t.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-wf-global-config.component-DTuh5zdi.mjs → ngx-histaff-alpha-wf-global-config.component-CCMceLib.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-wf-global-config.component-DTuh5zdi.mjs.map → ngx-histaff-alpha-wf-global-config.component-CCMceLib.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-wf-instance-status.component-BKDScZSG.mjs → ngx-histaff-alpha-wf-instance-status.component-BtFXU-R-.mjs} +2 -2
- 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
- package/fesm2022/{ngx-histaff-alpha-wf-instance-step-react.component-BwE5a99D.mjs → ngx-histaff-alpha-wf-instance-step-react.component-Bv5QnQbm.mjs} +3 -3
- 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
- package/fesm2022/{ngx-histaff-alpha-wf-lab.component-lqKBXhBp.mjs → ngx-histaff-alpha-wf-lab.component-qS2-1UVx.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-wf-lab.component-lqKBXhBp.mjs.map → ngx-histaff-alpha-wf-lab.component-qS2-1UVx.mjs.map} +1 -1
- package/fesm2022/ngx-histaff-alpha.mjs +1 -1
- package/lib/app/libraries/core-dom-decision-editor/core-dom-decision-editor.component.d.ts +7 -42
- package/lib/app/libraries/core-dom-decision-editor/dom-decision-context.service.d.ts +64 -9
- package/lib/app/libraries/core-dom-decision-editor/dom-oid-factory/dom-oid-factory.component.d.ts +1 -1
- package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/intent-draft.model.d.ts +1 -0
- package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/omega-intent.d.ts +6 -0
- package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/_base/intent-input-context.d.ts +1 -1
- package/lib/app/libraries/core-dom-decision-editor/intent-composer/intent-composer.component.d.ts +2 -7
- package/lib/app/libraries/core-pagination-full/core-pagination-full/core-pagination-full.component.d.ts +3 -0
- package/lib/app/services/socket.service.d.ts +1 -0
- package/package.json +2 -2
- 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 }} </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\"> /{{innerBodyCount$.value}} {{\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 }} </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\"> /{{innerBodyCount$.value}} {{\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 }} </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\"> /{{innerBodyCount$.value}} {{\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: ["
|
|
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 }} </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\"> /{{innerBodyCount$.value}} {{\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
|
|
29351
|
+
this.$form = signal(this.fb.group({}));
|
|
29352
|
+
this.acs = inject(AppConfigService);
|
|
29206
29353
|
this.$formRawValue = signal(null);
|
|
29207
|
-
|
|
29208
|
-
|
|
29354
|
+
this.$omega = signal({
|
|
29355
|
+
omegaVersion: '1.0',
|
|
29356
|
+
inputChain: []
|
|
29357
|
+
});
|
|
29209
29358
|
this.$selectedIntentDescriptor = signal(null);
|
|
29210
|
-
|
|
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
|
|
29389
|
+
const viewSeq = this.$viewSeq();
|
|
29215
29390
|
const chainLength = this.$omega()?.inputChain?.length ?? 0;
|
|
29216
|
-
if (
|
|
29391
|
+
if (viewSeq === null)
|
|
29217
29392
|
return false; // ⛔ create ≠ last
|
|
29218
|
-
return
|
|
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
|
-
* -
|
|
29436
|
+
* - seq (bối cảnh đang xét)
|
|
29262
29437
|
*
|
|
29263
29438
|
* Nguyên tắc:
|
|
29264
|
-
* - Chỉ xét token có producedBySeq <=
|
|
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
|
|
29455
|
+
const seq = this.$viewSeq() ?? this.$createSeq();
|
|
29281
29456
|
const tokens = this.$allTokens();
|
|
29282
|
-
|
|
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.$
|
|
29291
|
-
|
|
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
|
-
|
|
29481
|
+
control.disable({ emitEvent: false });
|
|
29300
29482
|
}
|
|
29301
29483
|
controls[input.key] = control;
|
|
29302
29484
|
}
|
|
29303
29485
|
// ⚠️ atomic replace
|
|
29304
|
-
this.
|
|
29486
|
+
this.$form.set(new FormGroup(controls));
|
|
29305
29487
|
// 🔹 snapshot ban đầu
|
|
29306
|
-
this.$formRawValue.set(this
|
|
29488
|
+
this.$formRawValue.set(this.$form().getRawValue());
|
|
29307
29489
|
if (this.intentInputMode() === 'view-only') {
|
|
29308
|
-
this
|
|
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
|
|
29520
|
+
this.formSubscription = this.$form().valueChanges.subscribe(value => {
|
|
29339
29521
|
this.$formRawValue.set(value);
|
|
29340
29522
|
});
|
|
29341
29523
|
}
|
|
29342
29524
|
intentInputMode() {
|
|
29343
|
-
if (!this.$
|
|
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
|
|
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> </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>
|
|
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> </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> </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>
|
|
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> </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> </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().
|
|
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> </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> </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().
|
|
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> </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
|
|
29789
|
-
this.$formRawValue =
|
|
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
|
|
30180
|
+
form: this.$form(),
|
|
29793
30181
|
descriptor: this.$descriptor(),
|
|
29794
30182
|
currentTokens: this.ctx.$currentTokens(),
|
|
29795
30183
|
mode: this.ctx.intentInputMode(),
|
|
29796
|
-
|
|
30184
|
+
seq: this.ctx.$viewSeq() ?? this.ctx.$createSeq(),
|
|
29797
30185
|
isLastSeq: this.ctx.$isLastSeq(),
|
|
29798
|
-
inputSnapshot: this.ctx.$
|
|
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.
|
|
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
|
-
|
|
29838
|
-
buildForm(
|
|
29839
|
-
|
|
29840
|
-
|
|
29841
|
-
|
|
29842
|
-
|
|
29843
|
-
|
|
29844
|
-
|
|
29845
|
-
|
|
29846
|
-
|
|
29847
|
-
|
|
29848
|
-
|
|
29849
|
-
|
|
29850
|
-
|
|
29851
|
-
|
|
29852
|
-
|
|
29853
|
-
|
|
29854
|
-
|
|
29855
|
-
|
|
29856
|
-
|
|
29857
|
-
|
|
29858
|
-
|
|
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
|
-
|
|
29861
|
-
|
|
29862
|
-
|
|
29863
|
-
|
|
29864
|
-
|
|
29865
|
-
|
|
29866
|
-
|
|
29867
|
-
|
|
29868
|
-
|
|
29869
|
-
|
|
29870
|
-
|
|
29871
|
-
|
|
29872
|
-
|
|
29873
|
-
|
|
29874
|
-
|
|
29875
|
-
|
|
29876
|
-
|
|
29877
|
-
|
|
29878
|
-
|
|
29879
|
-
|
|
29880
|
-
|
|
29881
|
-
|
|
29882
|
-
|
|
29883
|
-
|
|
29884
|
-
|
|
29885
|
-
|
|
29886
|
-
|
|
29887
|
-
|
|
29888
|
-
|
|
29889
|
-
|
|
29890
|
-
|
|
29891
|
-
|
|
29892
|
-
|
|
29893
|
-
|
|
29894
|
-
|
|
29895
|
-
|
|
29896
|
-
|
|
29897
|
-
|
|
29898
|
-
|
|
29899
|
-
|
|
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
|
-
|
|
30311
|
+
}
|
|
30312
|
+
|
|
30313
|
+
this.applyActionSpecificBehavior(descriptor)
|
|
29903
30314
|
}
|
|
29904
|
-
|
|
29905
|
-
|
|
29906
|
-
|
|
29907
|
-
|
|
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
|
|
30326
|
+
this.$form().markAllAsTouched();
|
|
29912
30327
|
this.rebuildErrors();
|
|
29913
30328
|
if (this.$errors().length > 0)
|
|
29914
30329
|
return;
|
|
29915
|
-
const snapshot = this
|
|
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
|
|
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
|
|
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
|
|
30007
|
-
const shortCodeCtrl = this
|
|
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
|
|
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)" } },
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
30478
|
-
|
|
30479
|
-
|
|
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
|
-
|
|
30505
|
-
|
|
30506
|
-
|
|
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
|
|
30585
|
+
seq,
|
|
30511
30586
|
actionCode: draft.actionCode,
|
|
30512
30587
|
inputSnapshot: draft.inputSnapshot,
|
|
30513
|
-
outputs: this.produceOutputs(
|
|
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
|
|
30522
|
-
|
|
30523
|
-
|
|
30524
|
-
|
|
30525
|
-
|
|
30526
|
-
|
|
30527
|
-
|
|
30528
|
-
|
|
30529
|
-
|
|
30530
|
-
|
|
30531
|
-
|
|
30532
|
-
|
|
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.$
|
|
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 (
|
|
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 (
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
47859
|
+
//# sourceMappingURL=ngx-histaff-alpha-ngx-histaff-alpha-ahDUrQN8.mjs.map
|