ngx-histaff-alpha 6.7.7 → 6.7.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-C4GlK33M.mjs → ngx-histaff-alpha-ai-hint-for-table.component-DHsa8xdU.mjs} +2 -2
  2. package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-C4GlK33M.mjs.map → ngx-histaff-alpha-ai-hint-for-table.component-DHsa8xdU.mjs.map} +1 -1
  3. package/fesm2022/{ngx-histaff-alpha-core-form-design.component-BrjykzbK.mjs → ngx-histaff-alpha-core-form-design.component-DUaLLOby.mjs} +4 -4
  4. package/fesm2022/{ngx-histaff-alpha-core-form-design.component-BrjykzbK.mjs.map → ngx-histaff-alpha-core-form-design.component-DUaLLOby.mjs.map} +1 -1
  5. package/fesm2022/{ngx-histaff-alpha-core-sys-action.component-C-NgdGye.mjs → ngx-histaff-alpha-core-sys-action.component-BSbDclen.mjs} +2 -2
  6. package/fesm2022/{ngx-histaff-alpha-core-sys-action.component-C-NgdGye.mjs.map → ngx-histaff-alpha-core-sys-action.component-BSbDclen.mjs.map} +1 -1
  7. package/fesm2022/{ngx-histaff-alpha-core-template-editor.component-CWYV1jld.mjs → ngx-histaff-alpha-core-template-editor.component-C4-e6HAY.mjs} +2 -2
  8. package/fesm2022/{ngx-histaff-alpha-core-template-editor.component-CWYV1jld.mjs.map → ngx-histaff-alpha-core-template-editor.component-C4-e6HAY.mjs.map} +1 -1
  9. package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-id2TElQn.mjs → ngx-histaff-alpha-core-toast-loading.component-ChM_IIXE.mjs} +2 -2
  10. package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-id2TElQn.mjs.map → ngx-histaff-alpha-core-toast-loading.component-ChM_IIXE.mjs.map} +1 -1
  11. package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-4CQ-jm0m.mjs → ngx-histaff-alpha-core-workflow-consume.component-WIWBCvGn.mjs} +2 -2
  12. package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-4CQ-jm0m.mjs.map → ngx-histaff-alpha-core-workflow-consume.component-WIWBCvGn.mjs.map} +1 -1
  13. package/fesm2022/{ngx-histaff-alpha-db-settings.component-BQ9xl200.mjs → ngx-histaff-alpha-db-settings.component-1hiYGimD.mjs} +5 -5
  14. package/fesm2022/{ngx-histaff-alpha-db-settings.component-BQ9xl200.mjs.map → ngx-histaff-alpha-db-settings.component-1hiYGimD.mjs.map} +1 -1
  15. package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-D88xosQd.mjs → ngx-histaff-alpha-design-wrapper.component-CRXwK5mO.mjs} +5 -5
  16. package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-D88xosQd.mjs.map → ngx-histaff-alpha-design-wrapper.component-CRXwK5mO.mjs.map} +1 -1
  17. package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-BeK6tiwQ.mjs → ngx-histaff-alpha-design-wrapper.route-Dw1u5JR1.mjs} +5 -5
  18. package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-BeK6tiwQ.mjs.map → ngx-histaff-alpha-design-wrapper.route-Dw1u5JR1.mjs.map} +1 -1
  19. package/fesm2022/{ngx-histaff-alpha-hrm-schema.component-Coz5KH1Z.mjs → ngx-histaff-alpha-hrm-schema.component-FNOzbUo_.mjs} +2 -2
  20. package/fesm2022/{ngx-histaff-alpha-hrm-schema.component-Coz5KH1Z.mjs.map → ngx-histaff-alpha-hrm-schema.component-FNOzbUo_.mjs.map} +1 -1
  21. package/fesm2022/{ngx-histaff-alpha-live-form.component-DTSF49aS.mjs → ngx-histaff-alpha-live-form.component-Cl5qbsPy.mjs} +2 -2
  22. package/fesm2022/{ngx-histaff-alpha-live-form.component-DTSF49aS.mjs.map → ngx-histaff-alpha-live-form.component-Cl5qbsPy.mjs.map} +1 -1
  23. package/fesm2022/{ngx-histaff-alpha-ngx-histaff-alpha-Bfddt3DJ.mjs → ngx-histaff-alpha-ngx-histaff-alpha-CMf5E5yd.mjs} +268 -58
  24. package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-CMf5E5yd.mjs.map +1 -0
  25. package/fesm2022/{ngx-histaff-alpha-simple-chat.component-CmdmeZkn.mjs → ngx-histaff-alpha-simple-chat.component-DNXB3MkY.mjs} +2 -2
  26. package/fesm2022/{ngx-histaff-alpha-simple-chat.component-CmdmeZkn.mjs.map → ngx-histaff-alpha-simple-chat.component-DNXB3MkY.mjs.map} +1 -1
  27. package/fesm2022/{ngx-histaff-alpha-sys-smtp-client-edit.component-yahvTLh8.mjs → ngx-histaff-alpha-sys-smtp-client-edit.component-Bdk9FxRM.mjs} +2 -2
  28. package/fesm2022/{ngx-histaff-alpha-sys-smtp-client-edit.component-yahvTLh8.mjs.map → ngx-histaff-alpha-sys-smtp-client-edit.component-Bdk9FxRM.mjs.map} +1 -1
  29. package/fesm2022/{ngx-histaff-alpha-sys-smtp-client.component-DJQOWrW_.mjs → ngx-histaff-alpha-sys-smtp-client.component-Cgk2GPJs.mjs} +2 -2
  30. package/fesm2022/{ngx-histaff-alpha-sys-smtp-client.component-DJQOWrW_.mjs.map → ngx-histaff-alpha-sys-smtp-client.component-Cgk2GPJs.mjs.map} +1 -1
  31. package/fesm2022/{ngx-histaff-alpha-template-list.component-CW1wvq-D.mjs → ngx-histaff-alpha-template-list.component-BWd3Z9Ci.mjs} +2 -2
  32. package/fesm2022/{ngx-histaff-alpha-template-list.component-CW1wvq-D.mjs.map → ngx-histaff-alpha-template-list.component-BWd3Z9Ci.mjs.map} +1 -1
  33. package/fesm2022/{ngx-histaff-alpha-tracker-studio.component-CuDeN7V9.mjs → ngx-histaff-alpha-tracker-studio.component-Bm8WljGL.mjs} +2 -2
  34. package/fesm2022/{ngx-histaff-alpha-tracker-studio.component-CuDeN7V9.mjs.map → ngx-histaff-alpha-tracker-studio.component-Bm8WljGL.mjs.map} +1 -1
  35. package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-BwbYVigV.mjs → ngx-histaff-alpha-wf-form-assign.component-CQhIM39W.mjs} +2 -2
  36. package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-BwbYVigV.mjs.map → ngx-histaff-alpha-wf-form-assign.component-CQhIM39W.mjs.map} +1 -1
  37. package/fesm2022/{ngx-histaff-alpha-wf-global-config.component-BYxq7KK5.mjs → ngx-histaff-alpha-wf-global-config.component-DpMVfjpK.mjs} +2 -2
  38. package/fesm2022/{ngx-histaff-alpha-wf-global-config.component-BYxq7KK5.mjs.map → ngx-histaff-alpha-wf-global-config.component-DpMVfjpK.mjs.map} +1 -1
  39. package/fesm2022/{ngx-histaff-alpha-wf-instance-status.component-CRxpzsUc.mjs → ngx-histaff-alpha-wf-instance-status.component-Dpd_4Hmw.mjs} +2 -2
  40. package/fesm2022/{ngx-histaff-alpha-wf-instance-status.component-CRxpzsUc.mjs.map → ngx-histaff-alpha-wf-instance-status.component-Dpd_4Hmw.mjs.map} +1 -1
  41. package/fesm2022/{ngx-histaff-alpha-wf-instance-step-react.component-GtdbtqYU.mjs → ngx-histaff-alpha-wf-instance-step-react.component-DrhSJX5e.mjs} +3 -3
  42. package/fesm2022/{ngx-histaff-alpha-wf-instance-step-react.component-GtdbtqYU.mjs.map → ngx-histaff-alpha-wf-instance-step-react.component-DrhSJX5e.mjs.map} +1 -1
  43. package/fesm2022/{ngx-histaff-alpha-wf-lab.component-BLleTFyw.mjs → ngx-histaff-alpha-wf-lab.component-CeBrXSSf.mjs} +2 -2
  44. package/fesm2022/{ngx-histaff-alpha-wf-lab.component-BLleTFyw.mjs.map → ngx-histaff-alpha-wf-lab.component-CeBrXSSf.mjs.map} +1 -1
  45. package/fesm2022/ngx-histaff-alpha.mjs +1 -1
  46. package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/narration-engine.d.ts +1 -0
  47. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/_base/intent-input-behavior.base.d.ts +9 -0
  48. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/_base/intent-input-context.d.ts +6 -0
  49. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/_base/intent-input-group.d.ts +4 -0
  50. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/base-intent-inputs/base-intent-inputs.component.d.ts +23 -0
  51. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/create-o-inputs/create-o-inputs.component.d.ts +18 -0
  52. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/create-tree-inputs/create-tree-inputs.component.d.ts +8 -0
  53. package/lib/app/libraries/core-dom-decision-editor/intent-composer/intent-composer.component.d.ts +4 -3
  54. package/lib/app/services/dynamic-style.service.d.ts +1 -0
  55. package/package.json +2 -2
  56. package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-Bfddt3DJ.mjs.map +0 -1
@@ -3194,6 +3194,26 @@ class DynamicStyleService {
3194
3194
  transform: rotate(90deg);
3195
3195
  }
3196
3196
  `;
3197
+ }
3198
+ ensureFormControlStyleContract() {
3199
+ const STYLE_ID = 'core-form-control-style-contract';
3200
+ if (document.getElementById(STYLE_ID))
3201
+ return;
3202
+ const styleEl = this.renderer.createElement('style');
3203
+ this.renderer.setAttribute(styleEl, 'id', STYLE_ID);
3204
+ this.renderer.appendChild(document.head, styleEl);
3205
+ styleEl.innerHTML = `
3206
+ /* =========================================
3207
+ CORE FORM CONTROL STYLE CONTRACT
3208
+ ========================================= */
3209
+
3210
+ /* Base contract: KHÔNG dùng border shorthand */
3211
+ .form-control {
3212
+ border-width: 1px;
3213
+ border-style: solid;
3214
+ border-color: #ced4da;
3215
+ }
3216
+ `;
3197
3217
  }
3198
3218
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicStyleService, deps: [{ token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable }); }
3199
3219
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DynamicStyleService, providedIn: 'root' }); }
@@ -4031,6 +4051,7 @@ class AppInitializationService {
4031
4051
  if (!!(FORM_CONTROL_REQUIRED_HIGHLIGHT_COLOR?.length)) {
4032
4052
  this.dynamicStyleService.setRequiredHighlight(FORM_CONTROL_REQUIRED_HIGHLIGHT_COLOR);
4033
4053
  }
4054
+ this.dynamicStyleService.ensureFormControlStyleContract();
4034
4055
  });
4035
4056
  this.appConfigService.OAUTH2_OIDC_ENABLED = OAUTH2_OIDC_ENABLED;
4036
4057
  this.appConfigService.OAUTH2_OIDC_CLIENT_ID = OAUTH2_OIDC_CLIENT_ID;
@@ -29308,6 +29329,184 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
29308
29329
  ], template: "@if ($loading()) {\r\n<core-rotating-text />\r\n} @else {\r\n\r\n<div class=\"dom-oid-factory-container\" [class.form-control-disabled]=\"disabled\">\r\n\r\n <!-- DISPLAY -->\r\n <div class=\"oid-display-name\" [class.form-control-disabled]=\"disabled\">\r\n <input type=\"text\" class=\"oid-name-input form-control\" [class.form-control-disabled]=\"disabled\"\r\n [class.required-highlight]=\"!!required\" [value]=\"$displayName()\" [disabled]=\"disabled\" />\r\n <div class=\"icon\" (click)=\"onPopupToggle()\">\r\n <i class=\"feather-chevron-down\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"factory-popup\" [class.open]=\"$open()\">\r\n\r\n <div class=\"popup-content\">\r\n\r\n <!-- SEARCH -->\r\n @if ($showSearch()) {\r\n <div class=\"oid-search\">\r\n <input type=\"text\" class=\"oid-search-input\" placeholder=\"T\u00ECm ki\u1EBFm\u2026\" [value]=\"$searchText()\"\r\n (input)=\"onSearchTextChange($any($event.target).value)\" />\r\n </div>\r\n }\r\n\r\n @if ($currentTokens().length > 0) {\r\n <!-- \uD83C\uDD95 ACCORDION 1: C\u00E1c \u0111\u01A1n v\u1ECB v\u1EEBa t\u1EA1o -->\r\n <section class=\"oid-accordion\" coreAccordion #accCreated=\"coreAccordion\">\r\n <header class=\"core-accordion-header highlight\" (click)=\"accCreated.toggle()\">\r\n <span>\uD83C\uDD95 C\u00E1c \u0111\u01A1n v\u1ECB v\u1EEBa t\u1EA1o</span>\r\n <i class=\"feather-chevron-right core-accordion-rotate\" [class.rotated]=\"accCreated.$open()\"></i>\r\n </header>\r\n\r\n <div class=\"core-accordion-viewport\">\r\n <div class=\"core-accordion-body\">\r\n <div #coreAccordionBody>\r\n <div class=\"oid-token-strip\">\r\n @for (t of $currentTokens(); track $index) {\r\n <dom-entity-token [$token]=\"t\" [$mode]=\"'compact'\" (click)=\"onTokenPicked(t)\">\r\n </dom-entity-token>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n }\r\n\r\n <!-- \uD83C\uDF33 ACCORDION 2: C\u00E2y t\u1ED5 ch\u1EE9c -->\r\n <section class=\"oid-accordion\" coreAccordion [$externalOpen]=\"true\" #accTree=\"coreAccordion\">\r\n <header class=\"core-accordion-header\" (click)=\"accTree.toggle()\">\r\n <span>\uD83C\uDF33 C\u00E2y t\u1ED5 ch\u1EE9c</span>\r\n <i class=\"feather-chevron-right core-accordion-rotate\" [class.rotated]=\"accTree.$open()\"></i>\r\n </header>\r\n\r\n <div class=\"core-accordion-viewport\">\r\n <div class=\"core-accordion-body\">\r\n <div #coreAccordionBody>\r\n <div #treeBody>\r\n <core-tree-reference [$data]=\"MOCK_DATA\" (selected)=\"onTreeItemSelected($event)\">\r\n </core-tree-reference>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- \u25AB\uFE0F ACCORDION 3: Ngo\u00E0i c\u00E2y t\u1ED5 ch\u1EE9c -->\r\n <section class=\"oid-accordion\" coreAccordion #accOutside=\"coreAccordion\">\r\n <header class=\"core-accordion-header\" (click)=\"accOutside.toggle()\">\r\n <span>\u25AB\uFE0F Ngo\u00E0i c\u00E2y t\u1ED5 ch\u1EE9c</span>\r\n <i class=\"feather-chevron-right core-accordion-rotate\" [class.rotated]=\"accOutside.$open()\"></i>\r\n </header>\r\n\r\n <div class=\"core-accordion-viewport\">\r\n <div class=\"core-accordion-body\">\r\n <div #coreAccordionBody></div>\r\n <div #outsideBody>\r\n <em class=\"muted\">Ch\u01B0a c\u00F3 n\u1ED9i dung</em>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n </div>\r\n </div>\r\n</div>\r\n}", styles: [".dom-oid-factory-container{display:flex;flex-direction:column;gap:8px;position:relative}.dom-oid-factory-container .oid-display-name{position:relative}.dom-oid-factory-container .oid-display-name .icon{display:flex;align-items:center;justify-content:center;width:35px;height:35px;cursor:pointer;position:absolute;right:0;top:0;border-left:1px solid #ced4da;z-index:1}.dom-oid-factory-container .oid-display-name input.form-control-disabled{-webkit-user-select:none;user-select:none}.dom-oid-factory-container .factory-popup{height:0;overflow:hidden;position:absolute;background-color:#fff;width:320px;box-shadow:.4rem 0 2rem #4d2e2e2e;z-index:1;top:35px;transition:height .25s ease-out}.dom-oid-factory-container .factory-popup.open{height:400px}.dom-oid-factory-container .factory-popup .popup-content{padding:15px}.dom-oid-factory-container .factory-popup .popup-content .oid-accordion .core-accordion-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;height:35px}.dom-oid-factory-container .oid-search-input{width:100%;padding:6px 10px;border:1px solid #ccc}.dom-oid-factory-container .oid-tree{max-height:320px;overflow:auto}\n"] }]
29309
29330
  }], ctorParameters: () => [] });
29310
29331
 
29332
+ class IntentInputBehaviorBase {
29333
+ constructor() {
29334
+ this.$errors = signal([]);
29335
+ }
29336
+ onInputChange(fieldKey, value) {
29337
+ const ctx = this.ctx;
29338
+ if (!ctx?.form)
29339
+ return;
29340
+ const ctrl = ctx.form.get(fieldKey);
29341
+ if (!ctrl)
29342
+ return;
29343
+ ctrl.setValue(value);
29344
+ ctrl.markAsTouched();
29345
+ this.rebuildErrors();
29346
+ }
29347
+ rebuildErrors() {
29348
+ const { form, descriptor } = this.ctx;
29349
+ if (!form || !descriptor)
29350
+ return;
29351
+ this.$errors.set([]);
29352
+ for (const input of descriptor.inputs) {
29353
+ const control = form.get(input.key);
29354
+ if (!control || !control.touched || !control.errors)
29355
+ continue;
29356
+ for (const errorCode of Object.keys(control.errors)) {
29357
+ const policyMessage = input.errorMessages?.[errorCode];
29358
+ const fallbackMessage = this.buildFallbackErrorMessage(input, errorCode, control.errors[errorCode]);
29359
+ this.$errors.update(c => [
29360
+ ...c,
29361
+ {
29362
+ fieldKey: input.key,
29363
+ fieldLabel: input.label,
29364
+ errorCode,
29365
+ errorMessage: policyMessage ?? fallbackMessage
29366
+ }
29367
+ ]);
29368
+ }
29369
+ }
29370
+ }
29371
+ // Fallback message (phòng khi descriptor không khai báo)
29372
+ buildFallbackErrorMessage(input, errorCode, errorData) {
29373
+ switch (errorCode) {
29374
+ case 'required':
29375
+ return `${input.label} là bắt buộc`;
29376
+ case 'minLength':
29377
+ case 'minlength':
29378
+ return `${input.label} phải có ít nhất ${errorData.requiredLength} ký tự`;
29379
+ case 'maxLength':
29380
+ case 'maxlength':
29381
+ return `${input.label} không được vượt quá ${errorData.requiredLength} ký tự`;
29382
+ case 'min':
29383
+ return `${input.label} phải ≥ ${errorData.min}`;
29384
+ case 'max':
29385
+ return `${input.label} phải ≤ ${errorData.max}`;
29386
+ case 'pattern':
29387
+ return `${input.label} không đúng định dạng`;
29388
+ default:
29389
+ return `${input.label} không hợp lệ`;
29390
+ }
29391
+ }
29392
+ }
29393
+
29394
+ class BaseIntentInputsComponent extends IntentInputBehaviorBase {
29395
+ isTouched(key) {
29396
+ return !!this.$form()?.get(key)?.touched;
29397
+ }
29398
+ onContextReady(ctx) {
29399
+ // safe: ctx.form + ctx.descriptor đã tồn tại
29400
+ }
29401
+ constructor() {
29402
+ super();
29403
+ this.$context = input.required();
29404
+ this.$form = computed(() => this.$context()?.form ?? null);
29405
+ this.$loading = signal(false);
29406
+ this.$rowableInputs = computed(() => {
29407
+ const inputs = this.$context().descriptor.inputs ?? [];
29408
+ const rows = new Map();
29409
+ for (const input of inputs) {
29410
+ const row = input.row ?? 1;
29411
+ if (!rows.has(row))
29412
+ rows.set(row, []);
29413
+ rows.get(row).push(input);
29414
+ }
29415
+ return Array.from(rows.entries())
29416
+ .sort(([a], [b]) => a - b)
29417
+ .map(([_, inputs]) => ({ inputs }));
29418
+ });
29419
+ //$errors = signal<IIntentInputError[]>([]);
29420
+ this.$draftInput = signal({});
29421
+ effect(() => {
29422
+ this.ctx = this.$context();
29423
+ });
29424
+ effect(() => {
29425
+ const ctx = this.$context(); // ✅ dependency
29426
+ if (!ctx)
29427
+ return;
29428
+ this.onContextReady(ctx);
29429
+ });
29430
+ }
29431
+ supports(_) {
29432
+ return true;
29433
+ }
29434
+ getErrorsOfField(fieldKey) {
29435
+ return this.$errors().filter(e => e.fieldKey === fieldKey);
29436
+ }
29437
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: BaseIntentInputsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29438
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.5", type: BaseIntentInputsComponent, isStandalone: true, selector: "lib-base-intent-inputs", inputs: { $context: { classPropertyName: "$context", publicName: "$context", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }], encapsulation: i0.ViewEncapsulation.None }); }
29439
+ }
29440
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: BaseIntentInputsComponent, decorators: [{
29441
+ type: Component,
29442
+ args: [{ selector: 'lib-base-intent-inputs', imports: [
29443
+ ReactiveFormsModule
29444
+ ], encapsulation: ViewEncapsulation.None, template: "" }]
29445
+ }], ctorParameters: () => [] });
29446
+
29447
+ class CreateTreeInputsComponent extends BaseIntentInputsComponent {
29448
+ supports(actionCode) {
29449
+ return actionCode === EnumActionCode.CREATE_TREE;
29450
+ }
29451
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateTreeInputsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
29452
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CreateTreeInputsComponent, isStandalone: true, selector: "create-tree-inputs", usesInheritance: true, ngImport: i0, template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher\r\n [formControlName]=\"input.key\"\r\n [showOnOffText]=\"false\"\r\n [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n}\r\n}\r\n</div>\r\n}", 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" }] }); }
29453
+ }
29454
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateTreeInputsComponent, decorators: [{
29455
+ type: Component,
29456
+ args: [{ selector: 'create-tree-inputs', imports: [
29457
+ ReactiveFormsModule,
29458
+ CoreIosSwitcherComponent,
29459
+ TranslatePipe,
29460
+ ], template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher\r\n [formControlName]=\"input.key\"\r\n [showOnOffText]=\"false\"\r\n [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n}\r\n}\r\n</div>\r\n}" }]
29461
+ }] });
29462
+
29463
+ class CreateOInputsComponent extends BaseIntentInputsComponent {
29464
+ constructor() {
29465
+ super(...arguments);
29466
+ this.treeIdOptions$ = new BehaviorSubject([]);
29467
+ this.appService = inject(AppService);
29468
+ this.subscriptions = [];
29469
+ }
29470
+ supports(actionCode) {
29471
+ return actionCode === EnumActionCode.CREATE_O;
29472
+ }
29473
+ onContextReady(ctx) {
29474
+ const form = ctx.form;
29475
+ if (!form)
29476
+ return;
29477
+ const codeCtrl = form.get('CODE');
29478
+ const shortCodeCtrl = form.get('SHORT_CODE');
29479
+ if (!codeCtrl || !shortCodeCtrl)
29480
+ return;
29481
+ const code = crypto.randomUUID();
29482
+ codeCtrl.setValue(code, { emitEvent: false });
29483
+ codeCtrl.disable({ emitEvent: false });
29484
+ shortCodeCtrl.setValue(code.substring(0, 8).toUpperCase(), { emitEvent: false });
29485
+ }
29486
+ ngAfterViewInit() {
29487
+ setTimeout(() => {
29488
+ this.subscriptions.push(this.appService.get('/api/DomTree/GetAll').pipe(tap$1(_ => this.$loading.set(true)), finalize$1(() => this.$loading.set(false))).subscribe(x => {
29489
+ if (x.ok && x.status === 200 && x.body?.statusCode === 200) {
29490
+ this.treeIdOptions$.next((x.body?.innerBody ?? []).map((i) => ({ value: i.id, text: i.treeName + (i.isHr ? ' (HR)' : '') })));
29491
+ }
29492
+ }));
29493
+ });
29494
+ }
29495
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateOInputsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
29496
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CreateOInputsComponent, isStandalone: true, selector: "create-o-inputs", usesInheritance: true, ngImport: i0, template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('treeId') {\r\n <core-dropdown [options$]=\"treeIdOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('date') {\r\n <core-date-picker [formControlName]=\"input.key\" [$rangePoint]=\"'start'\"\r\n [required]=\"!!input.validators?.required\" />\r\n }\r\n\r\n @case ('timezoneId') {\r\n <core-timezone [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher [formControlName]=\"input.key\" [showOnOffText]=\"false\" [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n\r\n}\r\n}\r\n</div>\r\n}", 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"] }] }); }
29497
+ }
29498
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateOInputsComponent, decorators: [{
29499
+ type: Component,
29500
+ args: [{ selector: 'create-o-inputs', imports: [
29501
+ TranslatePipe,
29502
+ ReactiveFormsModule,
29503
+ CoreDropdownComponent,
29504
+ CoreDatePickerComponent,
29505
+ CoreTimezoneComponent,
29506
+ CoreIosSwitcherComponent,
29507
+ ], template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('treeId') {\r\n <core-dropdown [options$]=\"treeIdOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('date') {\r\n <core-date-picker [formControlName]=\"input.key\" [$rangePoint]=\"'start'\"\r\n [required]=\"!!input.validators?.required\" />\r\n }\r\n\r\n @case ('timezoneId') {\r\n <core-timezone [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher [formControlName]=\"input.key\" [showOnOffText]=\"false\" [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n\r\n}\r\n}\r\n</div>\r\n}" }]
29508
+ }] });
29509
+
29311
29510
  class IntentComposerComponent extends BaseComponent {
29312
29511
  constructor(mls) {
29313
29512
  super(mls);
@@ -29332,26 +29531,10 @@ class IntentComposerComponent extends BaseComponent {
29332
29531
  this.form = this.fb.group({});
29333
29532
  this.$formRawValue = signal(null);
29334
29533
  this.isDevMode = isDevMode();
29335
- this.$rowableInputs = computed(() => {
29336
- const inputs = this.$descriptor().inputs ?? [];
29337
- // Map<row, inputs[]>
29338
- const rowMap = new Map();
29339
- for (const input of inputs) {
29340
- const row = input.row ?? 0;
29341
- if (!rowMap.has(row)) {
29342
- rowMap.set(row, []);
29343
- }
29344
- rowMap.get(row).push(input);
29345
- }
29346
- // Preserve row order (ascending)
29347
- return Array
29348
- .from(rowMap.entries())
29349
- .sort(([a], [b]) => a - b)
29350
- .map(([row, inputs]) => ({
29351
- row,
29352
- inputs
29353
- }));
29354
- });
29534
+ this.$context = computed(() => ({
29535
+ form: this.form,
29536
+ descriptor: this.$descriptor(),
29537
+ }));
29355
29538
  this.rCodeOptions$ = new BehaviorSubject(RCODE_FORWARD_VALUES.map(x => ({ value: x, text: x })));
29356
29539
  this.roleOptions$ = new BehaviorSubject([
29357
29540
  {
@@ -29394,19 +29577,20 @@ class IntentComposerComponent extends BaseComponent {
29394
29577
  const controls = {};
29395
29578
  // Logical inputs
29396
29579
  for (const input of descriptor.inputs) {
29397
- controls[input.key] = new FormControl(input.defaultValueFactory ? input.defaultValueFactory() : input.defaultValue ?? null, this.buildValidators(input.validators));
29580
+ const control = new FormControl(input.defaultValueFactory
29581
+ ? input.defaultValueFactory()
29582
+ : input.defaultValue ?? null, this.buildValidators(input.validators));
29398
29583
  if (input.disabled) {
29399
- controls[input.key].disable();
29584
+ controls[input.key].disable({ emitEvent: false });
29400
29585
  }
29586
+ controls[input.key] = control;
29401
29587
  }
29588
+ // ⚠️ atomic replace
29402
29589
  this.form = new FormGroup(controls);
29403
29590
  // 🔹 snapshot ban đầu
29404
29591
  this.$formRawValue.set(this.form.getRawValue());
29405
- if (this.formSubscription)
29406
- this.formSubscription.unsubscribe();
29407
- this.formSubscription = this.form.valueChanges.subscribe(x => {
29408
- this.$formRawValue.set(x);
29409
- });
29592
+ this.bindFormValueChanges();
29593
+ // TO DO: REMOVE THE REST
29410
29594
  if (this.vfUtcSubscription)
29411
29595
  this.vfUtcSubscription.unsubscribe();
29412
29596
  if (this.$descriptor().actionCode === EnumActionCode.LINK_O_O) {
@@ -29449,11 +29633,11 @@ class IntentComposerComponent extends BaseComponent {
29449
29633
  }
29450
29634
  this.applyActionSpecificBehavior(descriptor);
29451
29635
  }
29452
- onInputChange(key, value) {
29453
- this.$draftInput.update(prev => ({
29454
- ...prev,
29455
- [key]: value,
29456
- }));
29636
+ bindFormValueChanges() {
29637
+ this.formSubscription?.unsubscribe();
29638
+ this.formSubscription = this.form.valueChanges.subscribe(value => {
29639
+ this.$formRawValue.set(value);
29640
+ });
29457
29641
  }
29458
29642
  onConfirm() {
29459
29643
  this.form.markAllAsTouched();
@@ -29587,7 +29771,7 @@ class IntentComposerComponent extends BaseComponent {
29587
29771
  this.vfUtcSubscription.unsubscribe();
29588
29772
  }
29589
29773
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IntentComposerComponent, deps: [{ token: MultiLanguageService }], target: i0.ɵɵFactoryTarget.Component }); }
29590
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: IntentComposerComponent, isStandalone: true, selector: "intent-composer", inputs: { $descriptor: { classPropertyName: "$descriptor", publicName: "$descriptor", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { intentComposed: "intentComposed", cancelled: "cancelled" }, host: { listeners: { "keydown.escape": "onEscape($event)" } }, viewQueries: [{ propertyName: "$defaultOrgItemTpl", first: true, predicate: ["defaultOrgItemTpl"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!--\r\n IntentComposerComponent\r\n Purpose:\r\n - Collect human input for a single OM intent\r\n - Emit IntentDraft only\r\n Must NOT:\r\n - Mutate Omega\r\n - Modify IntentChain\r\n-->\r\n@if (form) {\r\n<form class=\"intent-composer-container\" [formGroup]=\"form\" (ngSubmit)=\"onConfirm()\" autocomplete=\"off\" [hotKeys]=\"hotKeys\">\r\n\r\n <!-- Header -->\r\n <div class=\"composer-header\">\r\n <core-page-header [hideButtonGroup]=\"true\" [title]=\"$descriptor().label\" />\r\n <div class=\"icon-wrapper\" (click)=\"cancelled.emit()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"composer-body\">\r\n\r\n <p class=\"desc\">{{ $descriptor().quickEmoji }} | {{ $descriptor().description }}</p>\r\n\r\n <!-- Inputs -->\r\n <div class=\"intent-inputs\">\r\n\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\" [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 ('boolean') {\r\n <core-ios-switcher [formControlName]=\"input.key\" [showOnOffText]=\"false\" [width]=\"66\" />\r\n <!-- <input\r\n type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" /> -->\r\n }\r\n\r\n @case ('number') {\r\n <input [formControlName]=\"input.key\" type=\"number\"\r\n (input)=\"onInputChange(input.key, $event.target.valueAsNumber)\" />\r\n }\r\n\r\n @case ('date') {\r\n <core-date-picker \r\n [formControlName]=\"input.key\" [$rangePoint]=\"'start'\" \r\n [required]=\"!!input.validators?.required\"\r\n />\r\n }\r\n\r\n @case ('dropdown') {\r\n <core-date-picker [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('timezoneId') {\r\n <core-timezone [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('orgGardenReference') {\r\n <dom-oid-factory \r\n [formControlName]=\"input.key\" \r\n (resolved)=\"onOrgResolved($event)\"\r\n />\r\n }\r\n\r\n @case ('rCode') {\r\n <core-dropdown [options$]=\"rCodeOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('role') {\r\n <core-dropdown [options$]=\"roleOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('reference') {\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onInputChange(input.key, '__REF__')\">\r\n Ch\u1ECDn \u0111\u1ED1i t\u01B0\u1EE3ng\u2026\r\n </button>\r\n }\r\n\r\n @case ('object') {\r\n <textarea [formControlName]=\"input.key\" rows=\"3\" (input)=\"onInputChange(input.key, $event.target.value)\">\r\n </textarea>\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 <!-- START: ERROR SESSION -->\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 && !!$checkError()) {\r\n <div>&nbsp;</div>\r\n }\r\n <!-- END: ERROR SESSION -->\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 <!-- 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>Tokens</label>\r\n <pre>{{ $tokens() | 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.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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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: CoreIosSwitcherComponent, selector: "core-ios-switcher", inputs: ["bgColor", "showOnOffText", "width", "height", "readonly"] }, { kind: "component", type: CoreDatePickerComponent, selector: "core-date-picker", inputs: ["enableTimeZoneConverter", "showPlaceholder", "popupWidth", "popupXPadding", "popupAlign", "rangeLimit", "placeholder", "readonly", "disabled", "$rangePoint"] }, { 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: CoreTimezoneComponent, selector: "core-timezone" }, { kind: "component", type: DomOIdFactoryComponent, selector: "dom-oid-factory", inputs: ["$showSearch"], outputs: ["resolved"] }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "showAnyway", "color", "backgroundColor", "position"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup", "htmlTooltipRef"], outputs: ["buttonClick"] }, { kind: "directive", type: HotKeysDirective, selector: "[hotKeys]", inputs: ["hotKeys"] }] }); }
29774
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: IntentComposerComponent, isStandalone: true, selector: "intent-composer", inputs: { $descriptor: { classPropertyName: "$descriptor", publicName: "$descriptor", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { intentComposed: "intentComposed", cancelled: "cancelled" }, host: { listeners: { "keydown.escape": "onEscape($event)" } }, viewQueries: [{ propertyName: "$defaultOrgItemTpl", first: true, predicate: ["defaultOrgItemTpl"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!--\r\n IntentComposerComponent\r\n Purpose:\r\n - Collect human input for a single OM intent\r\n - Emit IntentDraft only\r\n Must NOT:\r\n - Mutate Omega\r\n - Modify IntentChain\r\n-->\r\n@if (form) {\r\n<form class=\"intent-composer-container\" [formGroup]=\"form\" (ngSubmit)=\"onConfirm()\" autocomplete=\"off\" [hotKeys]=\"hotKeys\">\r\n\r\n <!-- Header -->\r\n <div class=\"composer-header\">\r\n <core-page-header [hideButtonGroup]=\"true\" [title]=\"$descriptor().label\" />\r\n <div class=\"icon-wrapper\" (click)=\"cancelled.emit()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"composer-body\">\r\n\r\n <p class=\"desc\">{{ $descriptor().quickEmoji }} | {{ $descriptor().description }}</p>\r\n\r\n <!-- Inputs -->\r\n <div class=\"intent-inputs\">\r\n @switch ($descriptor().actionCode) {\r\n @case ('CREATE_TREE') {\r\n <create-tree-inputs [$context]=\"$context()\" />\r\n }\r\n @case ('CREATE_O') {\r\n <create-o-inputs [$context]=\"$context()\" />\r\n }\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n } \r\n }\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"composer-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\r\n Quay l\u1EA1i\r\n </button>\r\n\r\n <button type=\"submit\" class=\"btn btn-primary\">\r\n X\u00E1c nh\u1EADn\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- @if (isDevMode && $formRawValue) {\r\n <pre>{{ $formRawValue() | json }}</pre>\r\n }\r\n\r\n @if (isDevMode) {\r\n <label>Tokens</label>\r\n <pre>{{ $tokens() | 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: "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 }); }
29591
29775
  }
29592
29776
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IntentComposerComponent, decorators: [{
29593
29777
  type: Component,
@@ -29603,10 +29787,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
29603
29787
  TranslatePipe,
29604
29788
  JsonPipe,
29605
29789
  CorePageHeaderComponent,
29606
- HotKeysDirective
29607
- ], host: {
29790
+ HotKeysDirective,
29791
+ CreateTreeInputsComponent,
29792
+ CreateOInputsComponent,
29793
+ ], encapsulation: ViewEncapsulation.None, host: {
29608
29794
  '(keydown.escape)': 'onEscape($event)'
29609
- }, 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\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\" [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 ('boolean') {\r\n <core-ios-switcher [formControlName]=\"input.key\" [showOnOffText]=\"false\" [width]=\"66\" />\r\n <!-- <input\r\n type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" /> -->\r\n }\r\n\r\n @case ('number') {\r\n <input [formControlName]=\"input.key\" type=\"number\"\r\n (input)=\"onInputChange(input.key, $event.target.valueAsNumber)\" />\r\n }\r\n\r\n @case ('date') {\r\n <core-date-picker \r\n [formControlName]=\"input.key\" [$rangePoint]=\"'start'\" \r\n [required]=\"!!input.validators?.required\"\r\n />\r\n }\r\n\r\n @case ('dropdown') {\r\n <core-date-picker [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('timezoneId') {\r\n <core-timezone [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('orgGardenReference') {\r\n <dom-oid-factory \r\n [formControlName]=\"input.key\" \r\n (resolved)=\"onOrgResolved($event)\"\r\n />\r\n }\r\n\r\n @case ('rCode') {\r\n <core-dropdown [options$]=\"rCodeOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('role') {\r\n <core-dropdown [options$]=\"roleOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('reference') {\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onInputChange(input.key, '__REF__')\">\r\n Ch\u1ECDn \u0111\u1ED1i t\u01B0\u1EE3ng\u2026\r\n </button>\r\n }\r\n\r\n @case ('object') {\r\n <textarea [formControlName]=\"input.key\" rows=\"3\" (input)=\"onInputChange(input.key, $event.target.value)\">\r\n </textarea>\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 <!-- START: ERROR SESSION -->\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 && !!$checkError()) {\r\n <div>&nbsp;</div>\r\n }\r\n <!-- END: ERROR SESSION -->\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 <!-- 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>Tokens</label>\r\n <pre>{{ $tokens() | 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"] }]
29795
+ }, 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>Tokens</label>\r\n <pre>{{ $tokens() | 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"] }]
29610
29796
  }], ctorParameters: () => [{ type: MultiLanguageService }] });
29611
29797
 
29612
29798
  const CreateOrganizationGrammar = {
@@ -29654,6 +29840,29 @@ function narrateIntent(grammar, ctx) {
29654
29840
  // 3) Join theo ngữ pháp tiếng Việt (space-based)
29655
29841
  return parts.join(' ');
29656
29842
  }
29843
+ const CREATE_TREE_GRAMMAR = {
29844
+ intentCode: EnumActionCode.CREATE_TREE,
29845
+ subject(ctx) {
29846
+ const treeName = ctx.facts['TREE_NAME'];
29847
+ const isHr = ctx.facts['IS_HR'];
29848
+ const isHrText = typeof isHr === 'boolean' ? (isHr ? "ngành ngang" : "ngành dọc") : "";
29849
+ return typeof treeName === 'string'
29850
+ ? `Tạo cây ${isHrText} ${treeName}`
29851
+ : 'Tạo cây ${isHrText}';
29852
+ },
29853
+ clauses: [
29854
+ {
29855
+ // khả dụng từ <date>
29856
+ when: ctx => !!ctx.temporal.localDate,
29857
+ render: ctx => `khả dụng từ ${ctx.temporal.localDate}`
29858
+ },
29859
+ {
29860
+ // thuộc cây <TREE_NAME>
29861
+ when: ctx => !!ctx.resolved['TREE_NAME'],
29862
+ render: ctx => `thuộc cây ${ctx.resolved['TREE_NAME']}`
29863
+ }
29864
+ ]
29865
+ };
29657
29866
  const CREATE_O_GRAMMAR = {
29658
29867
  intentCode: EnumActionCode.CREATE_O,
29659
29868
  subject(ctx) {
@@ -29720,6 +29929,7 @@ const LINK_O_O_GRAMMAR = {
29720
29929
  };
29721
29930
 
29722
29931
  const INTENT_GRAMMAR_REGISTRY = [
29932
+ CREATE_TREE_GRAMMAR,
29723
29933
  CREATE_O_GRAMMAR,
29724
29934
  CREATE_S_GRAMMAR,
29725
29935
  LINK_O_O_GRAMMAR
@@ -30067,7 +30277,7 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
30067
30277
  multi: true,
30068
30278
  useExisting: forwardRef(() => CoreDomDecisionEditorComponent),
30069
30279
  },
30070
- ], usesInheritance: true, ngImport: i0, template: "<div class=\"core-dom-decision-editor-container\">\r\n\r\n <!-- ========================= -->\r\n <!-- Intent Chain Projection -->\r\n <!-- ========================= -->\r\n <section class=\"intent-chain\">\r\n\r\n @if ($projection().intents.length > 0) {\r\n <ol class=\"intent-list\">\r\n @for (intent of $projection().intents; track $index) {\r\n <li class=\"intent-item\">\r\n <div class=\"intent-card\">\r\n\r\n <div class=\"intent-row\">\r\n <div class=\"intent-header\">\r\n <span class=\"intent-seq\" [appTooltip]=\"intent.actionLabel\" [showAnyway]=\"true\" [position]=\"'above'\">#{{\r\n intent.seq }}</span>\r\n <span class=\"intent-label\">{{ intent.summary }}</span>\r\n </div>\r\n\r\n <div class=\"intent-tool\">\r\n <button type=\"button\" class=\"btn btn-danger-ghost\" (click)=\"onRemoveIntent(intent.seq)\"\r\n [appTooltip]=\"'G\u1EE1'\" [showAnyway]=\"true\" [position]=\"'above'\">\r\n <i class=\"feather-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n }\r\n\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Add Intent Entry Point -->\r\n <!-- ========================= -->\r\n <section class=\"intent-actions-panel\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onAddIntent()\">\r\n + Th\u00EAm Intent\r\n </button>\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Output Preview (Derived) -->\r\n <!-- ========================= -->\r\n <section class=\"output-preview\">\r\n @if ($projection().outputs.length > 1) {\r\n <ul class=\"output-list\">\r\n @for (output of $projection().outputs; track $index) {\r\n <li class=\"output-item\">\r\n <span class=\"output-key\">{{ output.key }}</span>\r\n <span class=\"output-desc\">{{ output.description }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </section>\r\n\r\n <!-- @if (isDevMode) {\r\n\r\n <details class=\"omega-raw\">\r\n <summary>Xem Omega (raw)</summary>\r\n <pre>{{ $omega() | json }}</pre>\r\n </details>\r\n\r\n <label>allTokens</label>\r\n <pre>{{ $allTokens() | json }}</pre>\r\n\r\n } -->\r\n\r\n @if ($showIntentComposer()) {\r\n <!--\r\n Intent Composer Popup\r\n Purpose: Enter intent composition mode only.\r\n MUST NOT:\r\n - Mutate Omega\r\n - Mutate projection\r\n - Execute OM logic\r\n -->\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"intent-composer-entry\">\r\n\r\n @if ($selectedIntentDescriptor()) {\r\n\r\n <intent-composer [$descriptor]=\"$selectedIntentDescriptor()!\" (intentComposed)=\"onIntentDrafted($event)\"\r\n (cancelled)=\"onCancelIntentCompose()\">\r\n </intent-composer>\r\n\r\n } @else {\r\n\r\n <!-- N\u1ED9i dung composer s\u1EBD \u0111\u01B0\u1EE3c c\u1EAFm sau -->\r\n <ul class=\"intent-item-registry\">\r\n @for (intent of INTENT_DESCRIPTOR_REGISTRY; track $index) {\r\n <li class=\"intent-item-point\">\r\n <div class=\"intent-item\" (click)=\"onSelectIntent(intent)\">\r\n <object>{{ intent.actionCode }} | {{ intent.quickEmoji }}</object>\r\n <strong>{{ intent.label }}</strong>\r\n <p>{{ intent.description }}</p>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n\r\n }\r\n @if (!$activeSeq()) {\r\n <hr />\r\n <div class=\"popup-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCloseIntentComposer()\">\r\n H\u1EE7y\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>", styles: [".core-dom-decision-editor-container .intent-actions-panel button{border-radius:0;font-size:13px}.core-dom-decision-editor-container .modal-container{overflow:scroll}.core-dom-decision-editor-container .modal-container .modal-content-root{overflow:visible;max-height:unset;padding:0}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry{padding:0 15px 15px}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions{display:flex;align-items:center;justify-content:flex-end}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions button{font-size:13px;border-radius:0}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry{margin-top:15px;padding-top:15px;padding-left:0;overflow-y:scroll;height:60vh}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point{cursor:pointer;padding:8px}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point:hover{color:#fff;background-color:#09f}.core-dom-decision-editor-container .intent-chain .intent-list{list-style:none;padding:0;margin:0}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item{margin-bottom:12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card{border:1px solid #d0d7de;background:#fff;padding:10px 12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card:hover{box-shadow:.4rem 0 2rem #0000002e}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row{display:flex;align-items:center;justify-content:space-between}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header{display:flex;align-items:center;gap:8px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-seq{background:#e6f0ff;color:#084298;border-radius:3px;padding:2px 6px;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label{color:#212529;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label:hover{color:#fff;color:#dd5f2a}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool{display:flex;gap:8px;padding-left:28px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn{border:none;background:none;cursor:pointer;font-size:13px;padding:2px 6px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost{color:#0d6efd}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost:hover{text-decoration:underline}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost{color:#dc3545}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost:hover{text-decoration:underline}\n"], dependencies: [{ kind: "component", type: IntentComposerComponent, selector: "intent-composer", inputs: ["$descriptor"], outputs: ["intentComposed", "cancelled"] }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "showAnyway", "color", "backgroundColor", "position"] }] }); }
30280
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"core-dom-decision-editor-container\">\r\n\r\n <!-- ========================= -->\r\n <!-- Intent Chain Projection -->\r\n <!-- ========================= -->\r\n <section class=\"intent-chain\">\r\n\r\n @if ($projection().intents.length > 0) {\r\n <ol class=\"intent-list\">\r\n @for (intent of $projection().intents; track $index) {\r\n <li class=\"intent-item\">\r\n <div class=\"intent-card\">\r\n\r\n <div class=\"intent-row\">\r\n <div class=\"intent-header\">\r\n <span class=\"intent-seq\" [appTooltip]=\"intent.actionLabel\" [showAnyway]=\"true\" [position]=\"'above'\">#{{\r\n intent.seq }}</span>\r\n <span class=\"intent-label\">{{ intent.summary }}</span>\r\n </div>\r\n\r\n <div class=\"intent-tool\">\r\n <button type=\"button\" class=\"btn btn-danger-ghost\" (click)=\"onRemoveIntent(intent.seq)\"\r\n [appTooltip]=\"'G\u1EE1'\" [showAnyway]=\"true\" [position]=\"'above'\">\r\n <i class=\"feather-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n }\r\n\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Add Intent Entry Point -->\r\n <!-- ========================= -->\r\n <section class=\"intent-actions-panel\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onAddIntent()\">\r\n + Th\u00EAm Intent\r\n </button>\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Output Preview (Derived) -->\r\n <!-- ========================= -->\r\n <section class=\"output-preview\">\r\n @if ($projection().outputs.length > 1) {\r\n <ul class=\"output-list\">\r\n @for (output of $projection().outputs; track $index) {\r\n <li class=\"output-item\">\r\n <span class=\"output-key\">{{ output.key }}</span>\r\n <span class=\"output-desc\">{{ output.description }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </section>\r\n\r\n <!-- @if (isDevMode) {\r\n\r\n <details class=\"omega-raw\">\r\n <summary>Xem Omega (raw)</summary>\r\n <pre>{{ $omega() | json }}</pre>\r\n </details>\r\n\r\n <label>allTokens</label>\r\n <pre>{{ $allTokens() | json }}</pre>\r\n\r\n } -->\r\n\r\n @if ($showIntentComposer()) {\r\n <!--\r\n Intent Composer Popup\r\n Purpose: Enter intent composition mode only.\r\n MUST NOT:\r\n - Mutate Omega\r\n - Mutate projection\r\n - Execute OM logic\r\n -->\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"intent-composer-entry\">\r\n\r\n @if ($selectedIntentDescriptor()) {\r\n\r\n <intent-composer [$descriptor]=\"$selectedIntentDescriptor()!\" (intentComposed)=\"onIntentDrafted($event)\"\r\n (cancelled)=\"onCancelIntentCompose()\">\r\n </intent-composer>\r\n\r\n } @else {\r\n\r\n <!-- N\u1ED9i dung composer s\u1EBD \u0111\u01B0\u1EE3c c\u1EAFm sau -->\r\n <ul class=\"intent-item-registry\">\r\n @for (intent of INTENT_DESCRIPTOR_REGISTRY; track $index) {\r\n <li class=\"intent-item-point\">\r\n <div class=\"intent-item\" (click)=\"onSelectIntent(intent)\">\r\n <object>{{ intent.actionCode }} | {{ intent.quickEmoji }}</object>\r\n <strong>{{ intent.label }}</strong>\r\n <p>{{ intent.description }}</p>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n\r\n }\r\n @if (!$activeSeq()) {\r\n <hr />\r\n <div class=\"popup-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCloseIntentComposer()\">\r\n H\u1EE7y\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>", styles: [".core-dom-decision-editor-container .intent-actions-panel button{border-radius:0;font-size:13px}.core-dom-decision-editor-container .modal-container{overflow:scroll}.core-dom-decision-editor-container .modal-container .modal-content-root{overflow:visible;max-height:unset;padding:0}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry{padding:0 15px 15px}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions{display:flex;align-items:center;justify-content:flex-end}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions button{font-size:13px;border-radius:0}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry{margin-top:15px;padding-top:15px;padding-left:0;overflow-y:scroll;height:60vh}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point{cursor:pointer;padding:8px}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point:hover{color:#fff;background-color:#09f}.core-dom-decision-editor-container .intent-chain .intent-list{list-style:none;padding:0;margin:0}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item{margin-bottom:12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card{border:1px solid #d0d7de;background:#fff;padding:10px 12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card:hover{box-shadow:.4rem 0 2rem #0000002e}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row{display:flex;align-items:center;justify-content:space-between}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header{display:flex;align-items:center;gap:8px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-seq{background:#e6f0ff;color:#084298;border-radius:3px;padding:2px 6px;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label{color:#212529;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label:hover{color:#fff;color:#dd5f2a}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool{display:flex;gap:8px;padding-left:28px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn{border:none;background:none;cursor:pointer;font-size:13px;padding:2px 6px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost{color:#0d6efd}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost:hover{text-decoration:underline}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost{color:#dc3545}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost:hover{text-decoration:underline}\n"], dependencies: [{ kind: "component", type: IntentComposerComponent, selector: "intent-composer", inputs: ["$descriptor"], outputs: ["intentComposed", "cancelled"] }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "showAnyway", "color", "backgroundColor", "position"] }] }); }
30071
30281
  }
30072
30282
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CoreDomDecisionEditorComponent, decorators: [{
30073
30283
  type: Component,
@@ -30088,7 +30298,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
30088
30298
  multi: true,
30089
30299
  useExisting: forwardRef(() => CoreDomDecisionEditorComponent),
30090
30300
  },
30091
- ], template: "<div class=\"core-dom-decision-editor-container\">\r\n\r\n <!-- ========================= -->\r\n <!-- Intent Chain Projection -->\r\n <!-- ========================= -->\r\n <section class=\"intent-chain\">\r\n\r\n @if ($projection().intents.length > 0) {\r\n <ol class=\"intent-list\">\r\n @for (intent of $projection().intents; track $index) {\r\n <li class=\"intent-item\">\r\n <div class=\"intent-card\">\r\n\r\n <div class=\"intent-row\">\r\n <div class=\"intent-header\">\r\n <span class=\"intent-seq\" [appTooltip]=\"intent.actionLabel\" [showAnyway]=\"true\" [position]=\"'above'\">#{{\r\n intent.seq }}</span>\r\n <span class=\"intent-label\">{{ intent.summary }}</span>\r\n </div>\r\n\r\n <div class=\"intent-tool\">\r\n <button type=\"button\" class=\"btn btn-danger-ghost\" (click)=\"onRemoveIntent(intent.seq)\"\r\n [appTooltip]=\"'G\u1EE1'\" [showAnyway]=\"true\" [position]=\"'above'\">\r\n <i class=\"feather-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n }\r\n\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Add Intent Entry Point -->\r\n <!-- ========================= -->\r\n <section class=\"intent-actions-panel\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onAddIntent()\">\r\n + Th\u00EAm Intent\r\n </button>\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Output Preview (Derived) -->\r\n <!-- ========================= -->\r\n <section class=\"output-preview\">\r\n @if ($projection().outputs.length > 1) {\r\n <ul class=\"output-list\">\r\n @for (output of $projection().outputs; track $index) {\r\n <li class=\"output-item\">\r\n <span class=\"output-key\">{{ output.key }}</span>\r\n <span class=\"output-desc\">{{ output.description }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </section>\r\n\r\n <!-- @if (isDevMode) {\r\n\r\n <details class=\"omega-raw\">\r\n <summary>Xem Omega (raw)</summary>\r\n <pre>{{ $omega() | json }}</pre>\r\n </details>\r\n\r\n <label>allTokens</label>\r\n <pre>{{ $allTokens() | json }}</pre>\r\n\r\n } -->\r\n\r\n @if ($showIntentComposer()) {\r\n <!--\r\n Intent Composer Popup\r\n Purpose: Enter intent composition mode only.\r\n MUST NOT:\r\n - Mutate Omega\r\n - Mutate projection\r\n - Execute OM logic\r\n -->\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"intent-composer-entry\">\r\n\r\n @if ($selectedIntentDescriptor()) {\r\n\r\n <intent-composer [$descriptor]=\"$selectedIntentDescriptor()!\" (intentComposed)=\"onIntentDrafted($event)\"\r\n (cancelled)=\"onCancelIntentCompose()\">\r\n </intent-composer>\r\n\r\n } @else {\r\n\r\n <!-- N\u1ED9i dung composer s\u1EBD \u0111\u01B0\u1EE3c c\u1EAFm sau -->\r\n <ul class=\"intent-item-registry\">\r\n @for (intent of INTENT_DESCRIPTOR_REGISTRY; track $index) {\r\n <li class=\"intent-item-point\">\r\n <div class=\"intent-item\" (click)=\"onSelectIntent(intent)\">\r\n <object>{{ intent.actionCode }} | {{ intent.quickEmoji }}</object>\r\n <strong>{{ intent.label }}</strong>\r\n <p>{{ intent.description }}</p>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n\r\n }\r\n @if (!$activeSeq()) {\r\n <hr />\r\n <div class=\"popup-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCloseIntentComposer()\">\r\n H\u1EE7y\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>", styles: [".core-dom-decision-editor-container .intent-actions-panel button{border-radius:0;font-size:13px}.core-dom-decision-editor-container .modal-container{overflow:scroll}.core-dom-decision-editor-container .modal-container .modal-content-root{overflow:visible;max-height:unset;padding:0}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry{padding:0 15px 15px}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions{display:flex;align-items:center;justify-content:flex-end}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions button{font-size:13px;border-radius:0}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry{margin-top:15px;padding-top:15px;padding-left:0;overflow-y:scroll;height:60vh}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point{cursor:pointer;padding:8px}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point:hover{color:#fff;background-color:#09f}.core-dom-decision-editor-container .intent-chain .intent-list{list-style:none;padding:0;margin:0}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item{margin-bottom:12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card{border:1px solid #d0d7de;background:#fff;padding:10px 12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card:hover{box-shadow:.4rem 0 2rem #0000002e}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row{display:flex;align-items:center;justify-content:space-between}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header{display:flex;align-items:center;gap:8px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-seq{background:#e6f0ff;color:#084298;border-radius:3px;padding:2px 6px;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label{color:#212529;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label:hover{color:#fff;color:#dd5f2a}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool{display:flex;gap:8px;padding-left:28px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn{border:none;background:none;cursor:pointer;font-size:13px;padding:2px 6px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost{color:#0d6efd}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost:hover{text-decoration:underline}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost{color:#dc3545}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost:hover{text-decoration:underline}\n"] }]
30301
+ ], template: "<div class=\"core-dom-decision-editor-container\">\r\n\r\n <!-- ========================= -->\r\n <!-- Intent Chain Projection -->\r\n <!-- ========================= -->\r\n <section class=\"intent-chain\">\r\n\r\n @if ($projection().intents.length > 0) {\r\n <ol class=\"intent-list\">\r\n @for (intent of $projection().intents; track $index) {\r\n <li class=\"intent-item\">\r\n <div class=\"intent-card\">\r\n\r\n <div class=\"intent-row\">\r\n <div class=\"intent-header\">\r\n <span class=\"intent-seq\" [appTooltip]=\"intent.actionLabel\" [showAnyway]=\"true\" [position]=\"'above'\">#{{\r\n intent.seq }}</span>\r\n <span class=\"intent-label\">{{ intent.summary }}</span>\r\n </div>\r\n\r\n <div class=\"intent-tool\">\r\n <button type=\"button\" class=\"btn btn-danger-ghost\" (click)=\"onRemoveIntent(intent.seq)\"\r\n [appTooltip]=\"'G\u1EE1'\" [showAnyway]=\"true\" [position]=\"'above'\">\r\n <i class=\"feather-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n }\r\n\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Add Intent Entry Point -->\r\n <!-- ========================= -->\r\n <section class=\"intent-actions-panel\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onAddIntent()\">\r\n + Th\u00EAm Intent\r\n </button>\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Output Preview (Derived) -->\r\n <!-- ========================= -->\r\n <section class=\"output-preview\">\r\n @if ($projection().outputs.length > 1) {\r\n <ul class=\"output-list\">\r\n @for (output of $projection().outputs; track $index) {\r\n <li class=\"output-item\">\r\n <span class=\"output-key\">{{ output.key }}</span>\r\n <span class=\"output-desc\">{{ output.description }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </section>\r\n\r\n <!-- @if (isDevMode) {\r\n\r\n <details class=\"omega-raw\">\r\n <summary>Xem Omega (raw)</summary>\r\n <pre>{{ $omega() | json }}</pre>\r\n </details>\r\n\r\n <label>allTokens</label>\r\n <pre>{{ $allTokens() | json }}</pre>\r\n\r\n } -->\r\n\r\n @if ($showIntentComposer()) {\r\n <!--\r\n Intent Composer Popup\r\n Purpose: Enter intent composition mode only.\r\n MUST NOT:\r\n - Mutate Omega\r\n - Mutate projection\r\n - Execute OM logic\r\n -->\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"intent-composer-entry\">\r\n\r\n @if ($selectedIntentDescriptor()) {\r\n\r\n <intent-composer [$descriptor]=\"$selectedIntentDescriptor()!\" (intentComposed)=\"onIntentDrafted($event)\"\r\n (cancelled)=\"onCancelIntentCompose()\">\r\n </intent-composer>\r\n\r\n } @else {\r\n\r\n <!-- N\u1ED9i dung composer s\u1EBD \u0111\u01B0\u1EE3c c\u1EAFm sau -->\r\n <ul class=\"intent-item-registry\">\r\n @for (intent of INTENT_DESCRIPTOR_REGISTRY; track $index) {\r\n <li class=\"intent-item-point\">\r\n <div class=\"intent-item\" (click)=\"onSelectIntent(intent)\">\r\n <object>{{ intent.actionCode }} | {{ intent.quickEmoji }}</object>\r\n <strong>{{ intent.label }}</strong>\r\n <p>{{ intent.description }}</p>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n\r\n }\r\n @if (!$activeSeq()) {\r\n <hr />\r\n <div class=\"popup-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCloseIntentComposer()\">\r\n H\u1EE7y\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>", styles: [".core-dom-decision-editor-container .intent-actions-panel button{border-radius:0;font-size:13px}.core-dom-decision-editor-container .modal-container{overflow:scroll}.core-dom-decision-editor-container .modal-container .modal-content-root{overflow:visible;max-height:unset;padding:0}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry{padding:0 15px 15px}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions{display:flex;align-items:center;justify-content:flex-end}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions button{font-size:13px;border-radius:0}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry{margin-top:15px;padding-top:15px;padding-left:0;overflow-y:scroll;height:60vh}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point{cursor:pointer;padding:8px}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point:hover{color:#fff;background-color:#09f}.core-dom-decision-editor-container .intent-chain .intent-list{list-style:none;padding:0;margin:0}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item{margin-bottom:12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card{border:1px solid #d0d7de;background:#fff;padding:10px 12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card:hover{box-shadow:.4rem 0 2rem #0000002e}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row{display:flex;align-items:center;justify-content:space-between}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header{display:flex;align-items:center;gap:8px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-seq{background:#e6f0ff;color:#084298;border-radius:3px;padding:2px 6px;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label{color:#212529;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label:hover{color:#fff;color:#dd5f2a}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool{display:flex;gap:8px;padding-left:28px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn{border:none;background:none;cursor:pointer;font-size:13px;padding:2px 6px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost{color:#0d6efd}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost:hover{text-decoration:underline}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost{color:#dc3545}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost:hover{text-decoration:underline}\n"] }]
30092
30302
  }], ctorParameters: () => [] });
30093
30303
 
30094
30304
  class CoreControlComponent extends BaseComponent {
@@ -35170,7 +35380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
35170
35380
  const hrmSchemaRoutes = [
35171
35381
  {
35172
35382
  path: '',
35173
- loadComponent: () => import('./ngx-histaff-alpha-hrm-schema.component-Coz5KH1Z.mjs').then(m => m.HrmSchemaComponent)
35383
+ loadComponent: () => import('./ngx-histaff-alpha-hrm-schema.component-FNOzbUo_.mjs').then(m => m.HrmSchemaComponent)
35174
35384
  }
35175
35385
  ];
35176
35386
 
@@ -37343,7 +37553,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
37343
37553
  const simpleChatRoutes = [
37344
37554
  {
37345
37555
  path: '',
37346
- loadComponent: () => import('./ngx-histaff-alpha-simple-chat.component-CmdmeZkn.mjs').then(m => m.SimpleChatComponent)
37556
+ loadComponent: () => import('./ngx-histaff-alpha-simple-chat.component-DNXB3MkY.mjs').then(m => m.SimpleChatComponent)
37347
37557
  }
37348
37558
  ];
37349
37559
 
@@ -38009,7 +38219,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
38009
38219
  const coreSysActionRoutes = [
38010
38220
  {
38011
38221
  path: "",
38012
- loadComponent: () => import('./ngx-histaff-alpha-core-sys-action.component-C-NgdGye.mjs').then(m => m.CoreSysActionComponent),
38222
+ loadComponent: () => import('./ngx-histaff-alpha-core-sys-action.component-BSbDclen.mjs').then(m => m.CoreSysActionComponent),
38013
38223
  children: [
38014
38224
  {
38015
38225
  path: ":id",
@@ -39402,11 +39612,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
39402
39612
  const sysSmtpClientRoutes = [
39403
39613
  {
39404
39614
  path: '',
39405
- loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client.component-DJQOWrW_.mjs').then(m => m.SysSmtpClientComponent),
39615
+ loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client.component-Cgk2GPJs.mjs').then(m => m.SysSmtpClientComponent),
39406
39616
  children: [
39407
39617
  {
39408
39618
  path: ':id',
39409
- loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client-edit.component-yahvTLh8.mjs').then(m => m.SysSmtpClientEditComponent),
39619
+ loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client-edit.component-Bdk9FxRM.mjs').then(m => m.SysSmtpClientEditComponent),
39410
39620
  outlet: 'corePageListAux'
39411
39621
  }
39412
39622
  ]
@@ -40592,11 +40802,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
40592
40802
  const coreDocGenRoutes = [
40593
40803
  {
40594
40804
  path: 'template-list',
40595
- loadComponent: () => import('./ngx-histaff-alpha-template-list.component-CW1wvq-D.mjs').then(m => m.TemplateListComponent),
40805
+ loadComponent: () => import('./ngx-histaff-alpha-template-list.component-BWd3Z9Ci.mjs').then(m => m.TemplateListComponent),
40596
40806
  },
40597
40807
  {
40598
40808
  path: ":id",
40599
- loadComponent: () => import('./ngx-histaff-alpha-core-template-editor.component-CWYV1jld.mjs').then(m => m.CoreTemplateEditorComponent),
40809
+ loadComponent: () => import('./ngx-histaff-alpha-core-template-editor.component-C4-e6HAY.mjs').then(m => m.CoreTemplateEditorComponent),
40600
40810
  canDeactivate: [CanDeactivateGuard]
40601
40811
  },
40602
40812
  {
@@ -40625,7 +40835,7 @@ const coreFormDesignRoutes = [
40625
40835
  },
40626
40836
  {
40627
40837
  path: ':id',
40628
- loadComponent: () => import('./ngx-histaff-alpha-core-form-design.component-BrjykzbK.mjs').then(m => m.CoreFormDesignComponent)
40838
+ loadComponent: () => import('./ngx-histaff-alpha-core-form-design.component-DUaLLOby.mjs').then(m => m.CoreFormDesignComponent)
40629
40839
  }
40630
40840
  ];
40631
40841
 
@@ -41536,7 +41746,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
41536
41746
  const coreNavigationTrackerRoutes = [
41537
41747
  {
41538
41748
  path: '',
41539
- loadComponent: () => import('./ngx-histaff-alpha-tracker-studio.component-CuDeN7V9.mjs').then(m => m.TrackerStudioComponent)
41749
+ loadComponent: () => import('./ngx-histaff-alpha-tracker-studio.component-Bm8WljGL.mjs').then(m => m.TrackerStudioComponent)
41540
41750
  }
41541
41751
  ];
41542
41752
 
@@ -44639,33 +44849,33 @@ const coreWorkflowRoutes = [
44639
44849
  {
44640
44850
  path: 'form-assign/:id',
44641
44851
  outlet: "formAssignAux",
44642
- loadComponent: () => import('./ngx-histaff-alpha-wf-form-assign.component-BwbYVigV.mjs').then(m => m.WfFormAssignComponent),
44852
+ loadComponent: () => import('./ngx-histaff-alpha-wf-form-assign.component-CQhIM39W.mjs').then(m => m.WfFormAssignComponent),
44643
44853
  canDeactivate: [CanDeactivateGuard]
44644
44854
  }
44645
44855
  ]
44646
44856
  },
44647
44857
  {
44648
44858
  path: 'global-config',
44649
- loadComponent: () => import('./ngx-histaff-alpha-wf-global-config.component-BYxq7KK5.mjs').then(m => m.WfGlobalConfigComponent)
44859
+ loadComponent: () => import('./ngx-histaff-alpha-wf-global-config.component-DpMVfjpK.mjs').then(m => m.WfGlobalConfigComponent)
44650
44860
  },
44651
44861
  {
44652
44862
  path: 'db-settings',
44653
- loadComponent: () => import('./ngx-histaff-alpha-db-settings.component-BQ9xl200.mjs').then(m => m.DbSettingsComponent)
44863
+ loadComponent: () => import('./ngx-histaff-alpha-db-settings.component-1hiYGimD.mjs').then(m => m.DbSettingsComponent)
44654
44864
  },
44655
44865
  {
44656
44866
  path: 'workflow-consume',
44657
- loadComponent: () => import('./ngx-histaff-alpha-core-workflow-consume.component-4CQ-jm0m.mjs').then(m => m.CoreWorkflowConsumeComponent),
44867
+ loadComponent: () => import('./ngx-histaff-alpha-core-workflow-consume.component-WIWBCvGn.mjs').then(m => m.CoreWorkflowConsumeComponent),
44658
44868
  children: [
44659
44869
  {
44660
44870
  path: ':id',
44661
44871
  outlet: "workflowConsume",
44662
- loadComponent: () => import('./ngx-histaff-alpha-live-form.component-DTSF49aS.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
44872
+ loadComponent: () => import('./ngx-histaff-alpha-live-form.component-Cl5qbsPy.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
44663
44873
  }
44664
44874
  ]
44665
44875
  },
44666
44876
  {
44667
44877
  path: 'workflow-consume/:id',
44668
- loadComponent: () => import('./ngx-histaff-alpha-live-form.component-DTSF49aS.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
44878
+ loadComponent: () => import('./ngx-histaff-alpha-live-form.component-Cl5qbsPy.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
44669
44879
  },
44670
44880
  {
44671
44881
  path: 'workflow-group-edit/:id',
@@ -44675,21 +44885,21 @@ const coreWorkflowRoutes = [
44675
44885
  },
44676
44886
  {
44677
44887
  path: 'design/:id',
44678
- loadChildren: () => import('./ngx-histaff-alpha-design-wrapper.route-BeK6tiwQ.mjs').then(m => m.wfDesignWrapperRoutes),
44888
+ loadChildren: () => import('./ngx-histaff-alpha-design-wrapper.route-Dw1u5JR1.mjs').then(m => m.wfDesignWrapperRoutes),
44679
44889
  },
44680
44890
  ]
44681
44891
  },
44682
44892
  {
44683
44893
  path: 'react/:id',
44684
- loadComponent: () => import('./ngx-histaff-alpha-wf-instance-step-react.component-GtdbtqYU.mjs').then(m => m.WfInstanceStepReactComponent)
44894
+ loadComponent: () => import('./ngx-histaff-alpha-wf-instance-step-react.component-DrhSJX5e.mjs').then(m => m.WfInstanceStepReactComponent)
44685
44895
  },
44686
44896
  {
44687
44897
  path: 'status/:id',
44688
- loadComponent: () => import('./ngx-histaff-alpha-wf-instance-status.component-CRxpzsUc.mjs').then(m => m.WfInstanceStatusComponent)
44898
+ loadComponent: () => import('./ngx-histaff-alpha-wf-instance-status.component-Dpd_4Hmw.mjs').then(m => m.WfInstanceStatusComponent)
44689
44899
  },
44690
44900
  {
44691
44901
  path: 'lab',
44692
- loadComponent: () => import('./ngx-histaff-alpha-wf-lab.component-BLleTFyw.mjs').then(m => m.WfLabComponent)
44902
+ loadComponent: () => import('./ngx-histaff-alpha-wf-lab.component-CeBrXSSf.mjs').then(m => m.WfLabComponent)
44693
44903
  }
44694
44904
  ];
44695
44905
 
@@ -47298,4 +47508,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
47298
47508
  */
47299
47509
 
47300
47510
  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, InMemoryComponent 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, EnumSsrsExpressExportFormat as bA, SsrsExpressService as bB, StatisticService as bC, StatisticAuthService as bD, SysMenuService as bE, TimeSheetService as bF, TopicPermissionService as bG, TopicTreeService as bH, UploadedFileService as bI, UrlService as bJ, UserActivityService as bK, EvaluateDialogService as bL, EnumWorkScheduleViewMode as bM, WorkShiftDndService as bN, AtShiftPatternComponent as bO, AtShiftPatternApplyComponent as bP, AtShiftPatternEditComponent as bQ, AtWorksignComponent as bR, AtWorksignService as bS, FunctionComponent as bT, IndividualScheduleApplyComponent as bU, FunctionEditComponent as bV, FunctionIgnoreComponent as bW, FunctionIgnoreEditComponent as bX, GroupFunctionComponent as bY, GroupFunctionEditComponent as bZ, hrmSchemaRoutes 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, EnumSsrsExpressFileExtension as bz, CoreTerminalSpinnerComponent as c, CoreTableComponent as c$, LanguageComponent as c0, LanguageEditComponent as c1, MenuComponent as c2, MenuEditComponent as c3, MutationLogComponent as c4, MutationViewComponent as c5, PaSalaryPolicyComponent as c6, PaSalaryPolicyEditComponent as c7, PortalRouteComponent as c8, ScheduleOverviewComponent as c9, ButtonGroupModule as cA, ButtonGroupService as cB, ButtonGroupComponent as cC, EnumButtonCaptionCode as cD, CoreButtonComponent as cE, CoreAccordionComponent as cF, CoreAccordionService as cG, CoreActiveUserCountComponent as cH, NewlyCreatedTokenService as cI, CoreApiProgressComponent as cJ, CoreButtonGroupComponent as cK, EnumCoreButtonCode as cL, ActionSvgEditComponent as cM, CoreButtonGroupService as cN, CoreButtonVnsComponent as cO, CoreCommonParamKitComponent as cP, CoreCompareDbPipelineComponent as cQ, CoreCompositionState as cR, CoreCompositionService as cS, CoreCompositionComponent as cT, CoreConfirmDialogComponent as cU, ConfirmDialogStateComponent as cV, CoreLazyMountComponent as cW, CoreRootMenuItemPickerComponent as cX, CoreRootMenuItemPickerService as cY, ECoreTableToolCode as cZ, ECoreTableToolClass as c_, simpleChatRoutes as ca, PortalRouteEditComponent as cb, SysOtherListComponent as cc, SysOtherListEditComponent as cd, SysOtherListTypeComponent as ce, SysOtherListTypeEditComponent as cf, coreSysActionRoutes as cg, SysActionComponent as ch, SysActionEditComponent as ci, SysFunctionActionComponent as cj, SysFunctionActionEditComponent as ck, SysFunctionActionMapperComponent as cl, SysFunctionUrlMapperComponent as cm, FunctionEditService as cn, SysModuleComponent as co, SysModuleEditComponent as cp, SysRouteAccessComponent as cq, sysSmtpClientRoutes as cr, liner_to_nested_array_script as cs, blob_to_base64_script as ct, AlertComponent as cu, EnumAlertType as cv, IAlertOptions as cw, AnimatedTextService as cx, AnimatedTextComponent as cy, BaseDropdownComponent as cz, CorePageHeaderComponent as d, CorePageListContentComponent as d$, CoreContractSeekerComponent as d0, CoreControlNoGridBufferComponent as d1, CoreControlNoSeekerComponent as d2, coreDocGenRoutes as d3, CoreDocgenToolbarComponent as d4, CoreEmployeeScheduleComponent as d5, CoreEmployeeSeekerComponent as d6, EnumCoreFileUploaderType as d7, CoreFileUploaderComponent as d8, CoreFilterHubComponent as d9, CoreListLazyComponent as dA, CoreLoadingSurfaceComponent as dB, CoreMccComponent as dC, CoreMonthPickerComponent as dD, CoreNavigationTrackerComponent as dE, coreNavigationTrackerRoutes as dF, CoreOauthCallbackComponent as dG, CoreOauthCallbackOffice365Component as dH, EnumCoreOrgTreeaAccessorMode as dI, EnumCoreOrgTreeaSearchMode as dJ, CoreOrgTreeComponent as dK, CoreOrgTreeState as dL, CoreOrgTreeService as dM, CoreOrgUnitSeekerComponent as dN, CoreOrgchartflexComponent as dO, CARD_COLORS as dP, CoreOrgchartflexWrapperComponent as dQ, coreOrgchartflexRoutes as dR, CoreOrgParamComponent as dS, EnumCorePageEditBootstrapClass as dT, EnumCorePageEditFieldType as dU, CorePageEditService as dV, CorePageEditLiteComponent as dW, CorePageEditTabComponent as dX, EnumExType as dY, CorePageListService as dZ, CorePageListState as d_, CoreFilterHubService as da, ControlBase as db, Textbox as dc, CoreControlService as dd, CustomValidators as de, URL_PATTERN as df, coreFormDesignRoutes as dg, CoreFormTabComponent as dh, CoreFormLiteComponent as di, CoreFormControlBaseComponent as dj, EnumCoreSeekerColumnJob as dk, EnumCoreSeekerColumnStaffProfile as dl, EnumCoreSeekerColumnContract as dm, EnumCoreSeekerColumnWorking as dn, EnumCoreSeekerColumnWage as dp, EnumCoreSeekerColumnPosition as dq, EnumCoreSeekerColumnPositionConcurrent as dr, EnumCoreSeekerColumnAutoForm as ds, SeekerService as dt, CoreGridBufferComponent as du, CoreHeaderParamsComponent as dv, CoreHelperComponent as dw, CoreLineComponent as dx, CoreLiquidWysiwygComponent as dy, CoreListComponent as dz, TranslatePipe as e, PageTitleComponent as e$, EnumCoreViewItemType as e0, CorePageViewComponent as e1, CorePaginationComponent as e2, CorePaginationFullComponent as e3, CorePaginationFullService as e4, CoreFileFormatPickerComponent as e5, CorePermissionService as e6, EnumPermissionObjectType as e7, CorePermissionComponent as e8, CorePermissionActionsComponent as e9, EnumCoreTreeGridEditMode as eA, CoreTreeGridComponent as eB, CoreTreeReferenceComponent as eC, CoreWageSeekerComponent as eD, CoreWorkingSeekerComponent as eE, coreWorkflowRoutes as eF, CoreWorkflowBuilderComponent as eG, CoreWorkflowGroupEditComponent as eH, CoreYearPickerComponent as eI, CoreYearSelectorComponent as eJ, EnumCoreD3ScaleType as eK, CoreD3Service as eL, CorePieComponent as eM, CoreScatterPlotComponent as eN, EnumHrComparisonCode as eO, EnumICoreStatisticWidgetDataType as eP, CoreStatisticWidgetComponent as eQ, DecisionComponent as eR, EvaluateDialogComponent as eS, HuconcurrentlyComponent as eT, JobComponent as eU, LanguageChangerComponent as eV, DEFAULT_SVG as eW, ItemComponent as eX, NavigatorComponent as eY, OtpInputComponent as eZ, OtpInputService as e_, CorePositionConcurrentSeekerComponent as ea, CorePositionSeekerComponent as eb, CoreQrcodeComponent as ec, EnumOparator as ed, CoreQueryBuilderComponent as ee, CoreReducerIconComponent as ef, CoreRotatingTextComponent as eg, CoreRouteAccumulatorComponent as eh, CoreRoutingHistoryComponent as ei, CoreSalaryPolicyPickerComponent as ej, CoreScrollComponent as ek, CoreScrollLazyComponent as el, CoreSeenByComponent as em, CoreShiftCardComponent as en, CoreShiftCellComponent as eo, CoreShiftCollectionComponent as ep, CoreShiftStickerComponent as eq, STICKER_COLOR_SCHEMA as er, CoreSubFormGroupComponent as es, CoreTabListComponent as et, CoreTagsComponent as eu, CoreTopicPickerComponent as ev, EnumCoreArticleCategoryTreeaAccessorMode as ew, CoreTopicTreeComponent as ex, CoreTimezoneComponent as ey, CoreTreeComponent as ez, CorePageListComponent as f, PaginationComponent as f0, FilterPipe as f1, normalizeHumanName as f2, PositionComponent as f3, PositionEditService as f4, FileService as f5, LongTaskService as f6, EnumRecursiveFields as f7, RecursiveService as f8, StringService as f9, UnicodeService as fa, StaffProfileComponent as fb, ThreedotsComponent as fc, TooltipComponent as fd, UserActivityComponent as fe, WageComponent as ff, tooltip_directive as fg, coreStickerCollection_component as fh, dragReorder_directive as fi, 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 };
47301
- //# sourceMappingURL=ngx-histaff-alpha-ngx-histaff-alpha-Bfddt3DJ.mjs.map
47511
+ //# sourceMappingURL=ngx-histaff-alpha-ngx-histaff-alpha-CMf5E5yd.mjs.map