ngx-histaff-alpha 6.7.7 → 6.7.9

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 (65) hide show
  1. package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-C4GlK33M.mjs → ngx-histaff-alpha-ai-hint-for-table.component-CMSR6Hvl.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-CMSR6Hvl.mjs.map} +1 -1
  3. package/fesm2022/{ngx-histaff-alpha-core-form-design.component-BrjykzbK.mjs → ngx-histaff-alpha-core-form-design.component-BNIDGKDm.mjs} +4 -4
  4. package/fesm2022/{ngx-histaff-alpha-core-form-design.component-BrjykzbK.mjs.map → ngx-histaff-alpha-core-form-design.component-BNIDGKDm.mjs.map} +1 -1
  5. package/fesm2022/{ngx-histaff-alpha-core-sys-action.component-C-NgdGye.mjs → ngx-histaff-alpha-core-sys-action.component-D5zxtvyP.mjs} +2 -2
  6. package/fesm2022/{ngx-histaff-alpha-core-sys-action.component-C-NgdGye.mjs.map → ngx-histaff-alpha-core-sys-action.component-D5zxtvyP.mjs.map} +1 -1
  7. package/fesm2022/{ngx-histaff-alpha-core-template-editor.component-CWYV1jld.mjs → ngx-histaff-alpha-core-template-editor.component-BR0ZVik4.mjs} +2 -2
  8. package/fesm2022/{ngx-histaff-alpha-core-template-editor.component-CWYV1jld.mjs.map → ngx-histaff-alpha-core-template-editor.component-BR0ZVik4.mjs.map} +1 -1
  9. package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-id2TElQn.mjs → ngx-histaff-alpha-core-toast-loading.component-Czqtepd8.mjs} +2 -2
  10. package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-id2TElQn.mjs.map → ngx-histaff-alpha-core-toast-loading.component-Czqtepd8.mjs.map} +1 -1
  11. package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-4CQ-jm0m.mjs → ngx-histaff-alpha-core-workflow-consume.component-B0x1MLQX.mjs} +2 -2
  12. package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-4CQ-jm0m.mjs.map → ngx-histaff-alpha-core-workflow-consume.component-B0x1MLQX.mjs.map} +1 -1
  13. package/fesm2022/{ngx-histaff-alpha-db-settings.component-BQ9xl200.mjs → ngx-histaff-alpha-db-settings.component-CCQLmJTw.mjs} +5 -5
  14. package/fesm2022/{ngx-histaff-alpha-db-settings.component-BQ9xl200.mjs.map → ngx-histaff-alpha-db-settings.component-CCQLmJTw.mjs.map} +1 -1
  15. package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-D88xosQd.mjs → ngx-histaff-alpha-design-wrapper.component-Dluwu00K.mjs} +5 -5
  16. package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-D88xosQd.mjs.map → ngx-histaff-alpha-design-wrapper.component-Dluwu00K.mjs.map} +1 -1
  17. package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-BeK6tiwQ.mjs → ngx-histaff-alpha-design-wrapper.route-CTnWCpVz.mjs} +5 -5
  18. package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-BeK6tiwQ.mjs.map → ngx-histaff-alpha-design-wrapper.route-CTnWCpVz.mjs.map} +1 -1
  19. package/fesm2022/{ngx-histaff-alpha-hrm-schema.component-Coz5KH1Z.mjs → ngx-histaff-alpha-hrm-schema.component-B4vDuuXE.mjs} +2 -2
  20. package/fesm2022/{ngx-histaff-alpha-hrm-schema.component-Coz5KH1Z.mjs.map → ngx-histaff-alpha-hrm-schema.component-B4vDuuXE.mjs.map} +1 -1
  21. package/fesm2022/{ngx-histaff-alpha-live-form.component-DTSF49aS.mjs → ngx-histaff-alpha-live-form.component-losMBBZ9.mjs} +2 -2
  22. package/fesm2022/{ngx-histaff-alpha-live-form.component-DTSF49aS.mjs.map → ngx-histaff-alpha-live-form.component-losMBBZ9.mjs.map} +1 -1
  23. package/fesm2022/{ngx-histaff-alpha-ngx-histaff-alpha-Bfddt3DJ.mjs → ngx-histaff-alpha-ngx-histaff-alpha-DTx4Tmxu.mjs} +450 -107
  24. package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-DTx4Tmxu.mjs.map +1 -0
  25. package/fesm2022/{ngx-histaff-alpha-simple-chat.component-CmdmeZkn.mjs → ngx-histaff-alpha-simple-chat.component-Bcx7iKbD.mjs} +2 -2
  26. package/fesm2022/{ngx-histaff-alpha-simple-chat.component-CmdmeZkn.mjs.map → ngx-histaff-alpha-simple-chat.component-Bcx7iKbD.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-1UxoYqvL.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-1UxoYqvL.mjs.map} +1 -1
  29. package/fesm2022/{ngx-histaff-alpha-sys-smtp-client.component-DJQOWrW_.mjs → ngx-histaff-alpha-sys-smtp-client.component-DTc9NmGX.mjs} +2 -2
  30. package/fesm2022/{ngx-histaff-alpha-sys-smtp-client.component-DJQOWrW_.mjs.map → ngx-histaff-alpha-sys-smtp-client.component-DTc9NmGX.mjs.map} +1 -1
  31. package/fesm2022/{ngx-histaff-alpha-template-list.component-CW1wvq-D.mjs → ngx-histaff-alpha-template-list.component-DeIk9yaX.mjs} +2 -2
  32. package/fesm2022/{ngx-histaff-alpha-template-list.component-CW1wvq-D.mjs.map → ngx-histaff-alpha-template-list.component-DeIk9yaX.mjs.map} +1 -1
  33. package/fesm2022/{ngx-histaff-alpha-tracker-studio.component-CuDeN7V9.mjs → ngx-histaff-alpha-tracker-studio.component-D2fXht9F.mjs} +2 -2
  34. package/fesm2022/{ngx-histaff-alpha-tracker-studio.component-CuDeN7V9.mjs.map → ngx-histaff-alpha-tracker-studio.component-D2fXht9F.mjs.map} +1 -1
  35. package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-BwbYVigV.mjs → ngx-histaff-alpha-wf-form-assign.component-autPwDhJ.mjs} +2 -2
  36. package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-BwbYVigV.mjs.map → ngx-histaff-alpha-wf-form-assign.component-autPwDhJ.mjs.map} +1 -1
  37. package/fesm2022/{ngx-histaff-alpha-wf-global-config.component-BYxq7KK5.mjs → ngx-histaff-alpha-wf-global-config.component-EfTrufWt.mjs} +2 -2
  38. package/fesm2022/{ngx-histaff-alpha-wf-global-config.component-BYxq7KK5.mjs.map → ngx-histaff-alpha-wf-global-config.component-EfTrufWt.mjs.map} +1 -1
  39. package/fesm2022/{ngx-histaff-alpha-wf-instance-status.component-CRxpzsUc.mjs → ngx-histaff-alpha-wf-instance-status.component-CqTg9wOl.mjs} +2 -2
  40. package/fesm2022/{ngx-histaff-alpha-wf-instance-status.component-CRxpzsUc.mjs.map → ngx-histaff-alpha-wf-instance-status.component-CqTg9wOl.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-B51fXgjI.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-B51fXgjI.mjs.map} +1 -1
  43. package/fesm2022/{ngx-histaff-alpha-wf-lab.component-BLleTFyw.mjs → ngx-histaff-alpha-wf-lab.component-56r-UN3Q.mjs} +2 -2
  44. package/fesm2022/{ngx-histaff-alpha-wf-lab.component-BLleTFyw.mjs.map → ngx-histaff-alpha-wf-lab.component-56r-UN3Q.mjs.map} +1 -1
  45. package/fesm2022/ngx-histaff-alpha.mjs +1 -1
  46. package/lib/app/libraries/core-dom-decision-editor/core-dom-decision-editor.component.d.ts +2 -1
  47. package/lib/app/libraries/core-dom-decision-editor/dom-decision-context.service.d.ts +17 -1
  48. package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/intent-descriptor.registry.d.ts +2 -0
  49. package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/intent-draft.model.d.ts +1 -1
  50. package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/intent-input-mode.d.ts +1 -0
  51. package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/narration-engine.d.ts +1 -0
  52. package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/omega-intent.d.ts +4 -2
  53. package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/omega-projection.vm.d.ts +7 -0
  54. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/_base/intent-input-behavior.base.d.ts +9 -0
  55. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/_base/intent-input-context.d.ts +15 -0
  56. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/_base/intent-input-group.d.ts +4 -0
  57. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/base-intent-inputs/base-intent-inputs.component.d.ts +22 -0
  58. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/create-o-inputs/create-o-inputs.component.d.ts +18 -0
  59. package/lib/app/libraries/core-dom-decision-editor/intent-composer/input-groups/create-tree-inputs/create-tree-inputs.component.d.ts +8 -0
  60. package/lib/app/libraries/core-dom-decision-editor/intent-composer/intent-composer.component.d.ts +9 -6
  61. package/lib/app/libraries/core-table/core-table.component.d.ts +1 -1
  62. package/lib/app/services/dynamic-style.service.d.ts +1 -0
  63. package/package.json +2 -2
  64. package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-Bfddt3DJ.mjs.map +0 -1
  65. package/lib/app/libraries/core-dom-decision-editor/enum-interfaces/registries/DECLARE_SNAPSHOT.d.ts +0 -2
@@ -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;
@@ -9578,31 +9599,26 @@ class SocketService {
9578
9599
  console.warn("No user logged in");
9579
9600
  return;
9580
9601
  }
9581
- // const connection: HubConnection = new HubConnectionBuilder()
9582
- // .withUrl(this.appConfigService.BASE_URL + '/hubs/signal', {
9583
- // accessTokenFactory: () => token,
9584
- // transport: this.appConfigService.BASE_URL?.includes('localhost')
9585
- // ? undefined
9586
- // : HttpTransportType.WebSockets | HttpTransportType.ServerSentEvents | HttpTransportType.LongPolling
9587
- // })
9588
- // .configureLogging(LogLevel/~*.None~*/.Information) // experimental
9589
- // .build()
9590
- // const connection: HubConnection = new HubConnectionBuilder()
9591
- // .withUrl(this.appConfigService.BASE_URL + '/hubs/signal', {
9592
- // accessTokenFactory: () => token,
9593
- // skipNegotiation: !(this.appConfigService.BASE_URL?.includes('localhost')),
9594
- // transport: this.appConfigService.BASE_URL?.includes('localhost')
9595
- // ? undefined
9596
- // : HttpTransportType.WebSockets
9597
- // })
9598
- // .configureLogging(LogLevel.Information)
9599
- // .build()
9600
9602
  // Connects with skipNegotiation: true, forcing pure WebSockets and sending a JWT token on connect.
9603
+ // IMPORTANT:
9604
+ // Do NOT use skipNegotiation when connecting through Nginx/Ocelot.
9605
+ // SignalR requires negotiate step to work correctly behind proxies.
9601
9606
  const connection = new HubConnectionBuilder()
9602
9607
  .withUrl(this.appConfigService.BASE_URL + '/hubs/signal', {
9603
9608
  accessTokenFactory: () => token,
9604
- skipNegotiation: true,
9605
- transport: HttpTransportType.WebSockets || HttpTransportType.ServerSentEvents || HttpTransportType.LongPolling
9609
+ // skipNegotiation: true,
9610
+ transport: HttpTransportType.WebSockets | HttpTransportType.ServerSentEvents | HttpTransportType.LongPolling
9611
+ })
9612
+ .withAutomaticReconnect({
9613
+ nextRetryDelayInMilliseconds: ctx => {
9614
+ if (ctx.previousRetryCount === 0)
9615
+ return 1000;
9616
+ if (ctx.previousRetryCount === 1)
9617
+ return 2000;
9618
+ if (ctx.previousRetryCount === 2)
9619
+ return 5000;
9620
+ return 10000;
9621
+ }
9606
9622
  })
9607
9623
  .configureLogging(LogLevel.Information)
9608
9624
  .build();
@@ -28748,6 +28764,9 @@ const INTENT_DESCRIPTOR_REGISTRY = [
28748
28764
  * ========================= */
28749
28765
  //DECLARE_SNAPSHOT
28750
28766
  ];
28767
+ function getIntentDescriptor(actionCode) {
28768
+ return INTENT_DESCRIPTOR_REGISTRY.find(d => d.actionCode === actionCode) ?? null;
28769
+ }
28751
28770
 
28752
28771
  class CoreTimezoneComponent extends CoreFormControlBaseComponent {
28753
28772
  constructor() {
@@ -28994,10 +29013,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
28994
29013
 
28995
29014
  class DomDecisionContextService {
28996
29015
  constructor() {
29016
+ this.fb = inject(FormBuilder);
29017
+ this.form = this.fb.group({});
29018
+ this.$formRawValue = signal(null);
28997
29019
  // Omega được cấp từ Editor
28998
29020
  this.$omega = signal(null);
28999
29021
  this.$selectedIntentDescriptor = signal(null);
29000
- this.$activeSeq = signal(null);
29022
+ this.$activeSeq = signal(null); // null = create mode
29023
+ this.$nextSeq = computed(() => (this.$omega()?.inputChain?.length ?? 0) + 1);
29024
+ this.$rehydrateSnapshot = signal(null);
29025
+ this.$isLastSeq = computed(() => {
29026
+ const activeSeq = this.$activeSeq();
29027
+ const chainLength = this.$omega()?.inputChain?.length ?? 0;
29028
+ if (activeSeq === null)
29029
+ return false; // ⛔ create ≠ last
29030
+ return activeSeq === chainLength;
29031
+ });
29001
29032
  /**
29002
29033
  * $allTokens
29003
29034
  * ----------------------------------------
@@ -29066,6 +29097,65 @@ class DomDecisionContextService {
29066
29097
  return tokens.filter(t => t.producedBySeq < activeSeq);
29067
29098
  });
29068
29099
  }
29100
+ buildForm(descriptor) {
29101
+ const controls = {};
29102
+ const snapshot = this.$rehydrateSnapshot();
29103
+ // Logical inputs
29104
+ for (const input of descriptor.inputs) {
29105
+ const value = snapshot?.[input.key]
29106
+ ?? input.defaultValueFactory?.()
29107
+ ?? input.defaultValue
29108
+ ?? null;
29109
+ const control = new FormControl(value, this.buildValidators(input.validators));
29110
+ if (input.disabled) {
29111
+ controls[input.key].disable({ emitEvent: false });
29112
+ }
29113
+ controls[input.key] = control;
29114
+ }
29115
+ // ⚠️ atomic replace
29116
+ this.form = new FormGroup(controls);
29117
+ // 🔹 snapshot ban đầu
29118
+ this.$formRawValue.set(this.form.getRawValue());
29119
+ if (this.intentInputMode() === 'view-only') {
29120
+ this.form.disable({ emitEvent: false });
29121
+ }
29122
+ this.bindFormValueChanges();
29123
+ }
29124
+ buildValidators(schema) {
29125
+ if (!schema)
29126
+ return [];
29127
+ const validators = [];
29128
+ if (schema.required) {
29129
+ validators.push(Validators.required);
29130
+ }
29131
+ if (schema.minLength !== undefined) {
29132
+ validators.push(Validators.minLength(schema.minLength));
29133
+ }
29134
+ if (schema.maxLength !== undefined) {
29135
+ validators.push(Validators.maxLength(schema.maxLength));
29136
+ }
29137
+ if (schema.min !== undefined) {
29138
+ validators.push(Validators.min(schema.min));
29139
+ }
29140
+ if (schema.max !== undefined) {
29141
+ validators.push(Validators.max(schema.max));
29142
+ }
29143
+ if (schema.pattern) {
29144
+ validators.push(Validators.pattern(schema.pattern));
29145
+ }
29146
+ return validators;
29147
+ }
29148
+ bindFormValueChanges() {
29149
+ this.formSubscription?.unsubscribe();
29150
+ this.formSubscription = this.form.valueChanges.subscribe(value => {
29151
+ this.$formRawValue.set(value);
29152
+ });
29153
+ }
29154
+ intentInputMode() {
29155
+ if (!this.$activeSeq())
29156
+ return 'create';
29157
+ return this.$isLastSeq() ? 'edit-last' : 'view-only';
29158
+ }
29069
29159
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DomDecisionContextService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
29070
29160
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: DomDecisionContextService }); }
29071
29161
  }
@@ -29308,6 +29398,184 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
29308
29398
  ], 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
29399
  }], ctorParameters: () => [] });
29310
29400
 
29401
+ class IntentInputBehaviorBase {
29402
+ constructor() {
29403
+ this.$errors = signal([]);
29404
+ }
29405
+ onInputChange(fieldKey, value) {
29406
+ const ctx = this.ctx;
29407
+ if (!ctx?.form)
29408
+ return;
29409
+ const ctrl = ctx.form.get(fieldKey);
29410
+ if (!ctrl)
29411
+ return;
29412
+ ctrl.setValue(value);
29413
+ ctrl.markAsTouched();
29414
+ this.rebuildErrors();
29415
+ }
29416
+ rebuildErrors() {
29417
+ const { form, descriptor } = this.ctx;
29418
+ if (!form || !descriptor)
29419
+ return;
29420
+ this.$errors.set([]);
29421
+ for (const input of descriptor.inputs) {
29422
+ const control = form.get(input.key);
29423
+ if (!control || !control.touched || !control.errors)
29424
+ continue;
29425
+ for (const errorCode of Object.keys(control.errors)) {
29426
+ const policyMessage = input.errorMessages?.[errorCode];
29427
+ const fallbackMessage = this.buildFallbackErrorMessage(input, errorCode, control.errors[errorCode]);
29428
+ this.$errors.update(c => [
29429
+ ...c,
29430
+ {
29431
+ fieldKey: input.key,
29432
+ fieldLabel: input.label,
29433
+ errorCode,
29434
+ errorMessage: policyMessage ?? fallbackMessage
29435
+ }
29436
+ ]);
29437
+ }
29438
+ }
29439
+ }
29440
+ // Fallback message (phòng khi descriptor không khai báo)
29441
+ buildFallbackErrorMessage(input, errorCode, errorData) {
29442
+ switch (errorCode) {
29443
+ case 'required':
29444
+ return `${input.label} là bắt buộc`;
29445
+ case 'minLength':
29446
+ case 'minlength':
29447
+ return `${input.label} phải có ít nhất ${errorData.requiredLength} ký tự`;
29448
+ case 'maxLength':
29449
+ case 'maxlength':
29450
+ return `${input.label} không được vượt quá ${errorData.requiredLength} ký tự`;
29451
+ case 'min':
29452
+ return `${input.label} phải ≥ ${errorData.min}`;
29453
+ case 'max':
29454
+ return `${input.label} phải ≤ ${errorData.max}`;
29455
+ case 'pattern':
29456
+ return `${input.label} không đúng định dạng`;
29457
+ default:
29458
+ return `${input.label} không hợp lệ`;
29459
+ }
29460
+ }
29461
+ }
29462
+
29463
+ class BaseIntentInputsComponent extends IntentInputBehaviorBase {
29464
+ isTouched(key) {
29465
+ return !!this.$form()?.get(key)?.touched;
29466
+ }
29467
+ onContextReady(ctx) {
29468
+ // safe: ctx.form + ctx.descriptor đã tồn tại
29469
+ }
29470
+ constructor() {
29471
+ super();
29472
+ this.$context = input.required();
29473
+ this.$form = computed(() => this.$context()?.form ?? null);
29474
+ this.$loading = signal(false);
29475
+ this.$rowableInputs = computed(() => {
29476
+ const inputs = this.$context().descriptor.inputs ?? [];
29477
+ const rows = new Map();
29478
+ for (const input of inputs) {
29479
+ const row = input.row ?? 1;
29480
+ if (!rows.has(row))
29481
+ rows.set(row, []);
29482
+ rows.get(row).push(input);
29483
+ }
29484
+ return Array.from(rows.entries())
29485
+ .sort(([a], [b]) => a - b)
29486
+ .map(([_, inputs]) => ({ inputs }));
29487
+ });
29488
+ //$errors = signal<IIntentInputError[]>([]);
29489
+ this.$draftInput = signal({});
29490
+ effect(() => {
29491
+ this.ctx = this.$context();
29492
+ });
29493
+ effect(() => {
29494
+ const ctx = this.$context(); // ✅ dependency
29495
+ if (!ctx)
29496
+ return;
29497
+ this.onContextReady(ctx);
29498
+ });
29499
+ }
29500
+ supports(_) {
29501
+ return true;
29502
+ }
29503
+ getErrorsOfField(fieldKey) {
29504
+ return this.$errors().filter(e => e.fieldKey === fieldKey);
29505
+ }
29506
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: BaseIntentInputsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29507
+ 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 }); }
29508
+ }
29509
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: BaseIntentInputsComponent, decorators: [{
29510
+ type: Component,
29511
+ args: [{ selector: 'lib-base-intent-inputs', imports: [
29512
+ ReactiveFormsModule
29513
+ ], encapsulation: ViewEncapsulation.None, template: "" }]
29514
+ }], ctorParameters: () => [] });
29515
+
29516
+ class CreateTreeInputsComponent extends BaseIntentInputsComponent {
29517
+ supports(actionCode) {
29518
+ return actionCode === EnumActionCode.CREATE_TREE;
29519
+ }
29520
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateTreeInputsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
29521
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CreateTreeInputsComponent, isStandalone: true, selector: "create-tree-inputs", usesInheritance: true, ngImport: i0, template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher\r\n [formControlName]=\"input.key\"\r\n [showOnOffText]=\"false\"\r\n [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Active Seq: {{ $context().activeSeq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CoreIosSwitcherComponent, selector: "core-ios-switcher", inputs: ["bgColor", "showOnOffText", "width", "height", "readonly"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
29522
+ }
29523
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateTreeInputsComponent, decorators: [{
29524
+ type: Component,
29525
+ args: [{ selector: 'create-tree-inputs', imports: [
29526
+ ReactiveFormsModule,
29527
+ CoreIosSwitcherComponent,
29528
+ TranslatePipe,
29529
+ ], template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher\r\n [formControlName]=\"input.key\"\r\n [showOnOffText]=\"false\"\r\n [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Active Seq: {{ $context().activeSeq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>" }]
29530
+ }] });
29531
+
29532
+ class CreateOInputsComponent extends BaseIntentInputsComponent {
29533
+ constructor() {
29534
+ super(...arguments);
29535
+ this.treeIdOptions$ = new BehaviorSubject([]);
29536
+ this.appService = inject(AppService);
29537
+ this.subscriptions = [];
29538
+ }
29539
+ supports(actionCode) {
29540
+ return actionCode === EnumActionCode.CREATE_O;
29541
+ }
29542
+ onContextReady(ctx) {
29543
+ const form = ctx.form;
29544
+ if (!form)
29545
+ return;
29546
+ const codeCtrl = form.get('CODE');
29547
+ const shortCodeCtrl = form.get('SHORT_CODE');
29548
+ if (!codeCtrl || !shortCodeCtrl)
29549
+ return;
29550
+ const code = crypto.randomUUID();
29551
+ codeCtrl.setValue(code, { emitEvent: false });
29552
+ codeCtrl.disable({ emitEvent: false });
29553
+ shortCodeCtrl.setValue(code.substring(0, 8).toUpperCase(), { emitEvent: false });
29554
+ }
29555
+ ngAfterViewInit() {
29556
+ setTimeout(() => {
29557
+ this.subscriptions.push(this.appService.get('/api/DomTree/GetAll').pipe(tap$1(_ => this.$loading.set(true)), finalize$1(() => this.$loading.set(false))).subscribe(x => {
29558
+ if (x.ok && x.status === 200 && x.body?.statusCode === 200) {
29559
+ this.treeIdOptions$.next((x.body?.innerBody ?? []).map((i) => ({ value: i.id, text: i.treeName + (i.isHr ? ' (HR)' : '') })));
29560
+ }
29561
+ }));
29562
+ });
29563
+ }
29564
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateOInputsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
29565
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CreateOInputsComponent, isStandalone: true, selector: "create-o-inputs", usesInheritance: true, ngImport: i0, template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('treeId') {\r\n <core-dropdown [options$]=\"treeIdOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('date') {\r\n <core-date-picker [formControlName]=\"input.key\" [$rangePoint]=\"'start'\"\r\n [required]=\"!!input.validators?.required\" />\r\n }\r\n\r\n @case ('timezoneId') {\r\n <core-timezone [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher [formControlName]=\"input.key\" [showOnOffText]=\"false\" [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Active Seq: {{ $context().activeSeq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>", styles: [""], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CoreDropdownComponent, selector: "core-dropdown", inputs: ["getByIdObject$", "paramMode", "shownFrom", "options$", "height", "placeholder", "loading", "warningDisable", "clearDisable", "fitHeightWithItemCount", "itemHeight", "optionApiDriven", "optionApi", "optionHttpVerb", "optionHttpPayload", "optionValueFrom", "optionTextFrom", "$disabled"] }, { kind: "component", type: CoreDatePickerComponent, selector: "core-date-picker", inputs: ["enableTimeZoneConverter", "showPlaceholder", "popupWidth", "popupXPadding", "popupAlign", "rangeLimit", "placeholder", "readonly", "disabled", "$rangePoint"] }, { kind: "component", type: CoreTimezoneComponent, selector: "core-timezone" }, { kind: "component", type: CoreIosSwitcherComponent, selector: "core-ios-switcher", inputs: ["bgColor", "showOnOffText", "width", "height", "readonly"] }] }); }
29566
+ }
29567
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CreateOInputsComponent, decorators: [{
29568
+ type: Component,
29569
+ args: [{ selector: 'create-o-inputs', imports: [
29570
+ TranslatePipe,
29571
+ ReactiveFormsModule,
29572
+ CoreDropdownComponent,
29573
+ CoreDatePickerComponent,
29574
+ CoreTimezoneComponent,
29575
+ CoreIosSwitcherComponent,
29576
+ ], template: "@if ($context().form) {\r\n<div [formGroup]=\"$context().form\">\r\n@if ($context()?.descriptor?.inputs?.length) {\r\n@for (row of $rowableInputs(); track $index) {\r\n\r\n<div class=\"intent-row-grid\">\r\n @for (input of row.inputs; track $index) {\r\n <div class=\"intent-cell\" [class.hidden]=\"input.hidden\" [style.gridColumn]=\"'span ' + (input.flexSize ?? 1)\">\r\n\r\n <div class=\"intent-input\">\r\n\r\n <label [class.required]=\"input.validators?.required\">\r\n {{ input.label }}\r\n\r\n @if (input.hint && input.hint !== '') {\r\n <i class=\"feather-help-circle\" [appTooltip]=\"input.hint!\" [showAnyway]=\"true\"\r\n [style.display]=\"'inline-block'\" [style.marginLeft]=\"'2px'\"></i>\r\n }\r\n </label>\r\n\r\n @switch (input.kind) {\r\n\r\n @case ('string') {\r\n <input class=\"form-control\" [formControlName]=\"input.key\" type=\"text\"\r\n (input)=\"onInputChange(input.key, $event.target.value)\" />\r\n }\r\n\r\n @case ('treeId') {\r\n <core-dropdown [options$]=\"treeIdOptions$\" [warningDisable]=\"true\" [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('date') {\r\n <core-date-picker [formControlName]=\"input.key\" [$rangePoint]=\"'start'\"\r\n [required]=\"!!input.validators?.required\" />\r\n }\r\n\r\n @case ('timezoneId') {\r\n <core-timezone [formControlName]=\"input.key\" />\r\n }\r\n\r\n @case ('boolean') {\r\n <core-ios-switcher [formControlName]=\"input.key\" [showOnOffText]=\"false\" [width]=\"66\" />\r\n }\r\n\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n }\r\n\r\n }\r\n\r\n @for (error of getErrorsOfField(input.key); track $index) {\r\n <div class=\"form-control-error\">\r\n {{ error.errorMessage | translate: lang }}\r\n </div>\r\n }\r\n @if (!getErrorsOfField(input.key).length && isTouched(input.key)) {\r\n <div>&nbsp;</div>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n }\r\n</div>\r\n\r\n}\r\n}\r\n</div>\r\n}\r\n\r\n<p>Mode: {{ $context().mode }}</p>\r\n<p>Active Seq: {{ $context().activeSeq }}</p>\r\n<p>Is Last Seq: {{ $context().isLastSeq }}</p>" }]
29577
+ }] });
29578
+
29311
29579
  class IntentComposerComponent extends BaseComponent {
29312
29580
  constructor(mls) {
29313
29581
  super(mls);
@@ -29328,30 +29596,19 @@ class IntentComposerComponent extends BaseComponent {
29328
29596
  this.as = inject(AlertService);
29329
29597
  this.ctx = inject(DomDecisionContextService);
29330
29598
  this.applicationHelpService = inject(ApplicationHelpService);
29331
- this.$tokens = this.ctx.$allTokens;
29332
- this.form = this.fb.group({});
29599
+ this.$allTokens = this.ctx.$allTokens;
29600
+ this.form = this.ctx.form;
29333
29601
  this.$formRawValue = signal(null);
29334
29602
  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
- });
29603
+ this.$context = computed(() => ({
29604
+ form: this.form,
29605
+ descriptor: this.$descriptor(),
29606
+ currentTokens: this.ctx.$currentTokens(),
29607
+ mode: this.ctx.intentInputMode(),
29608
+ activeSeq: this.ctx.$activeSeq(),
29609
+ isLastSeq: this.ctx.$isLastSeq(),
29610
+ inputSnapshot: this.ctx.$rehydrateSnapshot()
29611
+ }));
29355
29612
  this.rCodeOptions$ = new BehaviorSubject(RCODE_FORWARD_VALUES.map(x => ({ value: x, text: x })));
29356
29613
  this.roleOptions$ = new BehaviorSubject([
29357
29614
  {
@@ -29392,21 +29649,28 @@ class IntentComposerComponent extends BaseComponent {
29392
29649
  // ===== Methods =====
29393
29650
  buildForm(descriptor) {
29394
29651
  const controls = {};
29652
+ const snapshot = this.ctx.$rehydrateSnapshot();
29395
29653
  // Logical inputs
29396
29654
  for (const input of descriptor.inputs) {
29397
- controls[input.key] = new FormControl(input.defaultValueFactory ? input.defaultValueFactory() : input.defaultValue ?? null, this.buildValidators(input.validators));
29655
+ const value = snapshot?.[input.key]
29656
+ ?? input.defaultValueFactory?.()
29657
+ ?? input.defaultValue
29658
+ ?? null;
29659
+ const control = new FormControl(value, this.buildValidators(input.validators));
29398
29660
  if (input.disabled) {
29399
- controls[input.key].disable();
29661
+ controls[input.key].disable({ emitEvent: false });
29400
29662
  }
29663
+ controls[input.key] = control;
29401
29664
  }
29665
+ // ⚠️ atomic replace
29402
29666
  this.form = new FormGroup(controls);
29403
29667
  // 🔹 snapshot ban đầu
29404
29668
  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
- });
29669
+ if (this.ctx.intentInputMode() === 'view-only') {
29670
+ this.form.disable({ emitEvent: false });
29671
+ }
29672
+ this.bindFormValueChanges();
29673
+ // TO DO: REMOVE THE REST
29410
29674
  if (this.vfUtcSubscription)
29411
29675
  this.vfUtcSubscription.unsubscribe();
29412
29676
  if (this.$descriptor().actionCode === EnumActionCode.LINK_O_O) {
@@ -29449,21 +29713,21 @@ class IntentComposerComponent extends BaseComponent {
29449
29713
  }
29450
29714
  this.applyActionSpecificBehavior(descriptor);
29451
29715
  }
29452
- onInputChange(key, value) {
29453
- this.$draftInput.update(prev => ({
29454
- ...prev,
29455
- [key]: value,
29456
- }));
29716
+ bindFormValueChanges() {
29717
+ this.formSubscription?.unsubscribe();
29718
+ this.formSubscription = this.form.valueChanges.subscribe(value => {
29719
+ this.$formRawValue.set(value);
29720
+ });
29457
29721
  }
29458
29722
  onConfirm() {
29459
29723
  this.form.markAllAsTouched();
29460
29724
  this.rebuildErrors();
29461
- if (this.$errors().length > 0) {
29725
+ if (this.$errors().length > 0)
29462
29726
  return;
29463
- }
29727
+ const snapshot = this.form.getRawValue();
29464
29728
  this.intentComposed.emit({
29465
29729
  actionCode: this.$descriptor().actionCode,
29466
- input: this.form.getRawValue()
29730
+ inputSnapshot: snapshot
29467
29731
  });
29468
29732
  this.ctx.$selectedIntentDescriptor.set(null);
29469
29733
  }
@@ -29587,7 +29851,7 @@ class IntentComposerComponent extends BaseComponent {
29587
29851
  this.vfUtcSubscription.unsubscribe();
29588
29852
  }
29589
29853
  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"] }] }); }
29854
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: IntentComposerComponent, isStandalone: true, selector: "intent-composer", inputs: { $descriptor: { classPropertyName: "$descriptor", publicName: "$descriptor", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { intentComposed: "intentComposed", cancelled: "cancelled" }, host: { listeners: { "keydown.escape": "onEscape($event)" } }, viewQueries: [{ propertyName: "$defaultOrgItemTpl", first: true, predicate: ["defaultOrgItemTpl"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!--\r\n IntentComposerComponent\r\n Purpose:\r\n - Collect human input for a single OM intent\r\n - Emit IntentDraft only\r\n Must NOT:\r\n - Mutate Omega\r\n - Modify IntentChain\r\n-->\r\n@if (form) {\r\n<form class=\"intent-composer-container\" [formGroup]=\"form\" (ngSubmit)=\"onConfirm()\" autocomplete=\"off\" [hotKeys]=\"hotKeys\">\r\n\r\n <!-- Header -->\r\n <div class=\"composer-header\">\r\n <core-page-header [hideButtonGroup]=\"true\" [title]=\"$descriptor().label\" />\r\n <div class=\"icon-wrapper\" (click)=\"cancelled.emit()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"composer-body\">\r\n\r\n <p class=\"desc\">{{ $descriptor().quickEmoji }} | {{ $descriptor().description }}</p>\r\n\r\n <!-- Inputs -->\r\n <div class=\"intent-inputs\">\r\n @switch ($descriptor().actionCode) {\r\n @case ('CREATE_TREE') {\r\n <create-tree-inputs [$context]=\"$context()\" />\r\n }\r\n @case ('CREATE_O') {\r\n <create-o-inputs [$context]=\"$context()\" />\r\n }\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n } \r\n }\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"composer-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\r\n Quay l\u1EA1i\r\n </button>\r\n\r\n <button type=\"submit\" class=\"btn btn-primary\">\r\n X\u00E1c nh\u1EADn\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- @if (isDevMode && $formRawValue) {\r\n <pre>{{ $formRawValue() | json }}</pre>\r\n }\r\n -->\r\n\r\n @if (isDevMode) {\r\n <label>Current Tokens</label>\r\n <pre>{{ $context().currentTokens | json }}</pre>\r\n }\r\n\r\n</form>\r\n}\r\n\r\n<ng-template #defaultOrgItemTpl let-node=\"node\" let-level=\"level\">\r\n <div class=\"test-itemTemplateRef\">\r\n {{ node.label }}\r\n </div>\r\n</ng-template>", styles: [".intent-composer-container .composer-header{position:relative}.intent-composer-container .composer-header .icon-wrapper{cursor:pointer;position:absolute;width:30px;height:30px;top:5px;right:-10px;border-radius:50%;display:flex;align-items:center;justify-content:center}.intent-composer-container .composer-header .icon-wrapper:hover{background-color:#d3d3d3}.intent-composer-container .composer-header .icon-wrapper i{font-size:18px}.intent-composer-container .intent-inputs label{color:#848484}.intent-composer-container .intent-inputs .intent-row-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:12px;margin-bottom:12px}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell{box-sizing:border-box;min-width:0}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell.hidden{display:none}.intent-composer-container .intent-inputs .intent-row-grid .intent-input{display:flex;flex-direction:column;margin-top:15px;margin-bottom:15px}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label{color:#464646}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label.required:after{content:\"*\";color:#ff040b}.intent-composer-container .composer-actions{display:flex;justify-content:space-between}.intent-composer-container .composer-actions button{font-size:13px;border-radius:0}.intent-composer-container pre{margin-top:15px}.test-itemTemplateRef{padding:15px;background-color:#6495ed;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "component", type: CorePageHeaderComponent, selector: "core-page-header", inputs: ["instanceNumber", "shownItems", "title", "hideButtonGroup", "htmlTooltipRef"], outputs: ["buttonClick"] }, { kind: "directive", type: HotKeysDirective, selector: "[hotKeys]", inputs: ["hotKeys"] }, { kind: "component", type: CreateTreeInputsComponent, selector: "create-tree-inputs" }, { kind: "component", type: CreateOInputsComponent, selector: "create-o-inputs" }], encapsulation: i0.ViewEncapsulation.None }); }
29591
29855
  }
29592
29856
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: IntentComposerComponent, decorators: [{
29593
29857
  type: Component,
@@ -29603,10 +29867,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
29603
29867
  TranslatePipe,
29604
29868
  JsonPipe,
29605
29869
  CorePageHeaderComponent,
29606
- HotKeysDirective
29607
- ], host: {
29870
+ HotKeysDirective,
29871
+ CreateTreeInputsComponent,
29872
+ CreateOInputsComponent,
29873
+ ], encapsulation: ViewEncapsulation.None, host: {
29608
29874
  '(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"] }]
29875
+ }, template: "<!--\r\n IntentComposerComponent\r\n Purpose:\r\n - Collect human input for a single OM intent\r\n - Emit IntentDraft only\r\n Must NOT:\r\n - Mutate Omega\r\n - Modify IntentChain\r\n-->\r\n@if (form) {\r\n<form class=\"intent-composer-container\" [formGroup]=\"form\" (ngSubmit)=\"onConfirm()\" autocomplete=\"off\" [hotKeys]=\"hotKeys\">\r\n\r\n <!-- Header -->\r\n <div class=\"composer-header\">\r\n <core-page-header [hideButtonGroup]=\"true\" [title]=\"$descriptor().label\" />\r\n <div class=\"icon-wrapper\" (click)=\"cancelled.emit()\">\r\n <i class=\"feather-x\"></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"composer-body\">\r\n\r\n <p class=\"desc\">{{ $descriptor().quickEmoji }} | {{ $descriptor().description }}</p>\r\n\r\n <!-- Inputs -->\r\n <div class=\"intent-inputs\">\r\n @switch ($descriptor().actionCode) {\r\n @case ('CREATE_TREE') {\r\n <create-tree-inputs [$context]=\"$context()\" />\r\n }\r\n @case ('CREATE_O') {\r\n <create-o-inputs [$context]=\"$context()\" />\r\n }\r\n @default {\r\n <em class=\"unsupported\">\r\n Ki\u1EC3u input ch\u01B0a \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3\r\n </em>\r\n } \r\n }\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"composer-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\r\n Quay l\u1EA1i\r\n </button>\r\n\r\n <button type=\"submit\" class=\"btn btn-primary\">\r\n X\u00E1c nh\u1EADn\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- @if (isDevMode && $formRawValue) {\r\n <pre>{{ $formRawValue() | json }}</pre>\r\n }\r\n -->\r\n\r\n @if (isDevMode) {\r\n <label>Current Tokens</label>\r\n <pre>{{ $context().currentTokens | json }}</pre>\r\n }\r\n\r\n</form>\r\n}\r\n\r\n<ng-template #defaultOrgItemTpl let-node=\"node\" let-level=\"level\">\r\n <div class=\"test-itemTemplateRef\">\r\n {{ node.label }}\r\n </div>\r\n</ng-template>", styles: [".intent-composer-container .composer-header{position:relative}.intent-composer-container .composer-header .icon-wrapper{cursor:pointer;position:absolute;width:30px;height:30px;top:5px;right:-10px;border-radius:50%;display:flex;align-items:center;justify-content:center}.intent-composer-container .composer-header .icon-wrapper:hover{background-color:#d3d3d3}.intent-composer-container .composer-header .icon-wrapper i{font-size:18px}.intent-composer-container .intent-inputs label{color:#848484}.intent-composer-container .intent-inputs .intent-row-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:12px;margin-bottom:12px}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell{box-sizing:border-box;min-width:0}.intent-composer-container .intent-inputs .intent-row-grid .intent-cell.hidden{display:none}.intent-composer-container .intent-inputs .intent-row-grid .intent-input{display:flex;flex-direction:column;margin-top:15px;margin-bottom:15px}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label{color:#464646}.intent-composer-container .intent-inputs .intent-row-grid .intent-input label.required:after{content:\"*\";color:#ff040b}.intent-composer-container .composer-actions{display:flex;justify-content:space-between}.intent-composer-container .composer-actions button{font-size:13px;border-radius:0}.intent-composer-container pre{margin-top:15px}.test-itemTemplateRef{padding:15px;background-color:#6495ed;color:#fff}\n"] }]
29610
29876
  }], ctorParameters: () => [{ type: MultiLanguageService }] });
29611
29877
 
29612
29878
  const CreateOrganizationGrammar = {
@@ -29654,6 +29920,29 @@ function narrateIntent(grammar, ctx) {
29654
29920
  // 3) Join theo ngữ pháp tiếng Việt (space-based)
29655
29921
  return parts.join(' ');
29656
29922
  }
29923
+ const CREATE_TREE_GRAMMAR = {
29924
+ intentCode: EnumActionCode.CREATE_TREE,
29925
+ subject(ctx) {
29926
+ const treeName = ctx.facts['TREE_NAME'];
29927
+ const isHr = ctx.facts['IS_HR'];
29928
+ const isHrText = typeof isHr === 'boolean' ? (isHr ? "ngành ngang" : "ngành dọc") : "";
29929
+ return typeof treeName === 'string'
29930
+ ? `Tạo cây ${isHrText} ${treeName}`
29931
+ : 'Tạo cây ${isHrText}';
29932
+ },
29933
+ clauses: [
29934
+ {
29935
+ // khả dụng từ <date>
29936
+ when: ctx => !!ctx.temporal.localDate,
29937
+ render: ctx => `khả dụng từ ${ctx.temporal.localDate}`
29938
+ },
29939
+ {
29940
+ // thuộc cây <TREE_NAME>
29941
+ when: ctx => !!ctx.resolved['TREE_NAME'],
29942
+ render: ctx => `thuộc cây ${ctx.resolved['TREE_NAME']}`
29943
+ }
29944
+ ]
29945
+ };
29657
29946
  const CREATE_O_GRAMMAR = {
29658
29947
  intentCode: EnumActionCode.CREATE_O,
29659
29948
  subject(ctx) {
@@ -29720,6 +30009,7 @@ const LINK_O_O_GRAMMAR = {
29720
30009
  };
29721
30010
 
29722
30011
  const INTENT_GRAMMAR_REGISTRY = [
30012
+ CREATE_TREE_GRAMMAR,
29723
30013
  CREATE_O_GRAMMAR,
29724
30014
  CREATE_S_GRAMMAR,
29725
30015
  LINK_O_O_GRAMMAR
@@ -29785,7 +30075,7 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
29785
30075
  //this.$projection.set(this.rebuildProjectionFromOmega(this.value));
29786
30076
  }
29787
30077
  buildNarrationContext(intent) {
29788
- const facts = intent.input ?? {};
30078
+ const facts = intent.inputSnapshot ?? {};
29789
30079
  const temporal = this.buildTemporalContext(facts);
29790
30080
  const resolved = this.buildResolvedContext(facts);
29791
30081
  return {
@@ -29934,6 +30224,8 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
29934
30224
  return {
29935
30225
  seq: intent.seq,
29936
30226
  actionLabel,
30227
+ actionCode: intent.actionCode,
30228
+ inputSnapshot: this.ctx.$rehydrateSnapshot(),
29937
30229
  summary
29938
30230
  };
29939
30231
  });
@@ -29948,7 +30240,9 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
29948
30240
  // This method MUST NOT mutate Omega or projection directly
29949
30241
  // Actual intent creation will happen in a dedicated composer (modal / panel)
29950
30242
  this.$showIntentComposer.set(true);
29951
- this.$activeSeq.set(this.$omega().inputChain.length + 1);
30243
+ //this.$activeSeq.set(this.$omega().inputChain.length + 1);
30244
+ // create mode → không active seq cũ nào cả
30245
+ this.$activeSeq.set(null);
29952
30246
  }
29953
30247
  onCloseIntentComposer() {
29954
30248
  this.$showIntentComposer.set(false);
@@ -29973,41 +30267,90 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
29973
30267
  };
29974
30268
  });
29975
30269
  }
29976
- onSelectIntent(descriptor) {
30270
+ onMenuSelectIntent(descriptor) {
29977
30271
  this.$selectedIntentDescriptor.set(descriptor);
29978
- const omega = this.$omega();
29979
- if (!omega || omega.inputChain.length === 0) {
29980
- this.$activeSeq.set(1);
30272
+ }
30273
+ onSelectEditedIntent(seq) {
30274
+ const intent = this.$projection().intents.find(x => x.seq === seq);
30275
+ if (!intent)
29981
30276
  return;
29982
- }
29983
- const nextSeq = Math.max(...omega.inputChain.map(i => i.seq)) + 1;
29984
- this.$activeSeq.set(nextSeq);
30277
+ const descriptor = getIntentDescriptor(intent.actionCode);
30278
+ if (!descriptor)
30279
+ return;
30280
+ this.$selectedIntentDescriptor.set(descriptor);
30281
+ this.ctx.$rehydrateSnapshot.set(intent.inputSnapshot);
30282
+ this.$activeSeq.set(seq);
30283
+ this.$showIntentComposer.set(true);
29985
30284
  }
29986
30285
  onCancelIntentCompose() {
29987
30286
  this.$selectedIntentDescriptor.set(null);
29988
- this.$activeSeq.set(null);
29989
30287
  }
30288
+ /*
30289
+ onIntentDrafted(draft: IIntentDraft): void {
30290
+ this.$omega.update(omega => {
30291
+ const nextSeq = this.ctx.$nextSeq();
30292
+
30293
+ const outputs = this.produceOutputs(nextSeq, draft);
30294
+
30295
+ return {
30296
+ ...omega,
30297
+ inputChain: [
30298
+ ...omega.inputChain,
30299
+ {
30300
+ seq: nextSeq,
30301
+ actionCode: draft.actionCode,
30302
+ input: draft.inputSnapshot,
30303
+ outputs
30304
+ }
30305
+ ]
30306
+ };
30307
+ });
30308
+
30309
+ this.$showIntentComposer.set(false);
30310
+ }
30311
+ */
29990
30312
  onIntentDrafted(draft) {
29991
- this.$omega.update(omega => {
29992
- const nextSeq = omega.inputChain.length + 1;
29993
- const outputs = this.produceOutputs(nextSeq, draft);
29994
- return {
29995
- ...omega,
29996
- inputChain: [
29997
- ...omega.inputChain,
30313
+ this.$omega.update((omega) => {
30314
+ const activeSeq = this.ctx.$activeSeq();
30315
+ const chain = omega.inputChain;
30316
+ // CREATE
30317
+ if (!activeSeq || activeSeq === chain.length + 1) {
30318
+ const nextSeq = chain.length + 1;
30319
+ const nextChain = [
30320
+ ...chain,
29998
30321
  {
29999
30322
  seq: nextSeq,
30000
30323
  actionCode: draft.actionCode,
30001
- input: draft.input,
30002
- outputs
30324
+ inputSnapshot: draft.inputSnapshot,
30325
+ outputs: this.produceOutputs(nextSeq, draft)
30003
30326
  }
30004
- ]
30005
- };
30327
+ ];
30328
+ return {
30329
+ ...omega,
30330
+ inputChain: nextChain
30331
+ };
30332
+ }
30333
+ // EDIT LAST
30334
+ if (activeSeq === chain.length) {
30335
+ const nextChain = chain.map(intent => intent.seq === activeSeq
30336
+ ? {
30337
+ ...intent,
30338
+ inputSnapshot: draft.inputSnapshot,
30339
+ outputs: this.produceOutputs(activeSeq, draft)
30340
+ }
30341
+ : intent);
30342
+ return {
30343
+ ...omega,
30344
+ inputChain: nextChain
30345
+ };
30346
+ }
30347
+ return omega;
30006
30348
  });
30007
30349
  this.$showIntentComposer.set(false);
30350
+ this.ctx.$activeSeq.set(null);
30008
30351
  }
30009
30352
  produceOutputs(seq, draft) {
30010
- const input = draft.input;
30353
+ const input = draft.inputSnapshot;
30011
30354
  switch (draft.actionCode) {
30012
30355
  case EnumActionCode.CREATE_O: {
30013
30356
  const id = input['ID'];
@@ -30067,7 +30410,7 @@ class CoreDomDecisionEditorComponent extends CoreFormControlBaseComponent {
30067
30410
  multi: true,
30068
30411
  useExisting: forwardRef(() => CoreDomDecisionEditorComponent),
30069
30412
  },
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"] }] }); }
30413
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"core-dom-decision-editor-container\">\r\n\r\n <!-- ========================= -->\r\n <!-- Intent Chain Projection -->\r\n <!-- ========================= -->\r\n <section class=\"intent-chain\">\r\n\r\n @if ($projection().intents.length > 0) {\r\n <ol class=\"intent-list\">\r\n @for (intent of $projection().intents; track $index) {\r\n <li class=\"intent-item\">\r\n <div class=\"intent-card\">\r\n\r\n <div class=\"intent-row\">\r\n <div class=\"intent-header\" (click)=\"onSelectEditedIntent(intent.seq)\">\r\n <span class=\"intent-seq\" [appTooltip]=\"intent.actionLabel\" [showAnyway]=\"true\" [position]=\"'above'\">#{{\r\n intent.seq }}</span>\r\n <span class=\"intent-label\">{{ intent.summary }}</span>\r\n </div>\r\n\r\n <div class=\"intent-tool\">\r\n <button type=\"button\" class=\"btn btn-danger-ghost\" (click)=\"onRemoveIntent(intent.seq)\"\r\n [appTooltip]=\"'G\u1EE1'\" [showAnyway]=\"true\" [position]=\"'above'\">\r\n <i class=\"feather-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n }\r\n\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Add Intent Entry Point -->\r\n <!-- ========================= -->\r\n <section class=\"intent-actions-panel\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onAddIntent()\">\r\n + Th\u00EAm Intent\r\n </button>\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Output Preview (Derived) -->\r\n <!-- ========================= -->\r\n <section class=\"output-preview\">\r\n @if ($projection().outputs.length > 1) {\r\n <ul class=\"output-list\">\r\n @for (output of $projection().outputs; track $index) {\r\n <li class=\"output-item\">\r\n <span class=\"output-key\">{{ output.key }}</span>\r\n <span class=\"output-desc\">{{ output.description }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </section>\r\n\r\n <!-- @if (isDevMode) {\r\n\r\n <details class=\"omega-raw\">\r\n <summary>Xem Omega (raw)</summary>\r\n <pre>{{ $omega() | json }}</pre>\r\n </details>\r\n\r\n <label>allTokens</label>\r\n <pre>{{ $allTokens() | json }}</pre>\r\n\r\n } -->\r\n\r\n @if ($showIntentComposer()) {\r\n <!--\r\n Intent Composer Popup\r\n Purpose: Enter intent composition mode only.\r\n MUST NOT:\r\n - Mutate Omega\r\n - Mutate projection\r\n - Execute OM logic\r\n -->\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"intent-composer-entry\">\r\n\r\n @if ($selectedIntentDescriptor()) {\r\n\r\n <intent-composer [$descriptor]=\"$selectedIntentDescriptor()!\" (intentComposed)=\"onIntentDrafted($event)\"\r\n (cancelled)=\"onCancelIntentCompose()\">\r\n </intent-composer>\r\n\r\n } @else {\r\n\r\n <!-- N\u1ED9i dung composer s\u1EBD \u0111\u01B0\u1EE3c c\u1EAFm sau -->\r\n <ul class=\"intent-item-registry\">\r\n @for (intent of INTENT_DESCRIPTOR_REGISTRY; track $index) {\r\n <li class=\"intent-item-point\">\r\n <div class=\"intent-item\" (click)=\"onMenuSelectIntent(intent)\">\r\n <object>{{ intent.actionCode }} | {{ intent.quickEmoji }}</object>\r\n <strong>{{ intent.label }}</strong>\r\n <p>{{ intent.description }}</p>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n\r\n }\r\n @if (!$activeSeq() || true) {\r\n <hr />\r\n <div class=\"popup-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCloseIntentComposer()\">\r\n H\u1EE7y\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>", styles: [".core-dom-decision-editor-container .intent-actions-panel button{border-radius:0;font-size:13px}.core-dom-decision-editor-container .modal-container{overflow:scroll}.core-dom-decision-editor-container .modal-container .modal-content-root{overflow:visible;max-height:unset;padding:0}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry{padding:0 15px 15px}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions{display:flex;align-items:center;justify-content:flex-end}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions button{font-size:13px;border-radius:0}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry{margin-top:15px;padding-top:15px;padding-left:0;overflow-y:scroll;height:60vh}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point{cursor:pointer;padding:8px}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point:hover{color:#fff;background-color:#09f}.core-dom-decision-editor-container .intent-chain .intent-list{list-style:none;padding:0;margin:0}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item{margin-bottom:12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card{border:1px solid #d0d7de;background:#fff;padding:10px 12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card:hover{box-shadow:.4rem 0 2rem #0000002e}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row{display:flex;align-items:center;justify-content:space-between}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header{display:flex;align-items:center;gap:8px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-seq{background:#e6f0ff;color:#084298;border-radius:3px;padding:2px 6px;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label{color:#212529;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label:hover{color:#fff;color:#dd5f2a}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool{display:flex;gap:8px;padding-left:28px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn{border:none;background:none;cursor:pointer;font-size:13px;padding:2px 6px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost{color:#0d6efd}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost:hover{text-decoration:underline}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost{color:#dc3545}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost:hover{text-decoration:underline}\n"], dependencies: [{ kind: "component", type: IntentComposerComponent, selector: "intent-composer", inputs: ["$descriptor"], outputs: ["intentComposed", "cancelled"] }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "showAnyway", "color", "backgroundColor", "position"] }] }); }
30071
30414
  }
30072
30415
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CoreDomDecisionEditorComponent, decorators: [{
30073
30416
  type: Component,
@@ -30088,7 +30431,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
30088
30431
  multi: true,
30089
30432
  useExisting: forwardRef(() => CoreDomDecisionEditorComponent),
30090
30433
  },
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"] }]
30434
+ ], template: "<div class=\"core-dom-decision-editor-container\">\r\n\r\n <!-- ========================= -->\r\n <!-- Intent Chain Projection -->\r\n <!-- ========================= -->\r\n <section class=\"intent-chain\">\r\n\r\n @if ($projection().intents.length > 0) {\r\n <ol class=\"intent-list\">\r\n @for (intent of $projection().intents; track $index) {\r\n <li class=\"intent-item\">\r\n <div class=\"intent-card\">\r\n\r\n <div class=\"intent-row\">\r\n <div class=\"intent-header\" (click)=\"onSelectEditedIntent(intent.seq)\">\r\n <span class=\"intent-seq\" [appTooltip]=\"intent.actionLabel\" [showAnyway]=\"true\" [position]=\"'above'\">#{{\r\n intent.seq }}</span>\r\n <span class=\"intent-label\">{{ intent.summary }}</span>\r\n </div>\r\n\r\n <div class=\"intent-tool\">\r\n <button type=\"button\" class=\"btn btn-danger-ghost\" (click)=\"onRemoveIntent(intent.seq)\"\r\n [appTooltip]=\"'G\u1EE1'\" [showAnyway]=\"true\" [position]=\"'above'\">\r\n <i class=\"feather-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n }\r\n\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Add Intent Entry Point -->\r\n <!-- ========================= -->\r\n <section class=\"intent-actions-panel\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"onAddIntent()\">\r\n + Th\u00EAm Intent\r\n </button>\r\n </section>\r\n\r\n <!-- ========================= -->\r\n <!-- Output Preview (Derived) -->\r\n <!-- ========================= -->\r\n <section class=\"output-preview\">\r\n @if ($projection().outputs.length > 1) {\r\n <ul class=\"output-list\">\r\n @for (output of $projection().outputs; track $index) {\r\n <li class=\"output-item\">\r\n <span class=\"output-key\">{{ output.key }}</span>\r\n <span class=\"output-desc\">{{ output.description }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n </section>\r\n\r\n <!-- @if (isDevMode) {\r\n\r\n <details class=\"omega-raw\">\r\n <summary>Xem Omega (raw)</summary>\r\n <pre>{{ $omega() | json }}</pre>\r\n </details>\r\n\r\n <label>allTokens</label>\r\n <pre>{{ $allTokens() | json }}</pre>\r\n\r\n } -->\r\n\r\n @if ($showIntentComposer()) {\r\n <!--\r\n Intent Composer Popup\r\n Purpose: Enter intent composition mode only.\r\n MUST NOT:\r\n - Mutate Omega\r\n - Mutate projection\r\n - Execute OM logic\r\n -->\r\n <div class=\"modal-container\">\r\n <div class=\"modal-content-root\">\r\n <div class=\"intent-composer-entry\">\r\n\r\n @if ($selectedIntentDescriptor()) {\r\n\r\n <intent-composer [$descriptor]=\"$selectedIntentDescriptor()!\" (intentComposed)=\"onIntentDrafted($event)\"\r\n (cancelled)=\"onCancelIntentCompose()\">\r\n </intent-composer>\r\n\r\n } @else {\r\n\r\n <!-- N\u1ED9i dung composer s\u1EBD \u0111\u01B0\u1EE3c c\u1EAFm sau -->\r\n <ul class=\"intent-item-registry\">\r\n @for (intent of INTENT_DESCRIPTOR_REGISTRY; track $index) {\r\n <li class=\"intent-item-point\">\r\n <div class=\"intent-item\" (click)=\"onMenuSelectIntent(intent)\">\r\n <object>{{ intent.actionCode }} | {{ intent.quickEmoji }}</object>\r\n <strong>{{ intent.label }}</strong>\r\n <p>{{ intent.description }}</p>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n\r\n }\r\n @if (!$activeSeq() || true) {\r\n <hr />\r\n <div class=\"popup-actions\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCloseIntentComposer()\">\r\n H\u1EE7y\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>", styles: [".core-dom-decision-editor-container .intent-actions-panel button{border-radius:0;font-size:13px}.core-dom-decision-editor-container .modal-container{overflow:scroll}.core-dom-decision-editor-container .modal-container .modal-content-root{overflow:visible;max-height:unset;padding:0}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry{padding:0 15px 15px}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions{display:flex;align-items:center;justify-content:flex-end}.core-dom-decision-editor-container .modal-container .modal-content-root .intent-composer-entry .popup-actions button{font-size:13px;border-radius:0}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry{margin-top:15px;padding-top:15px;padding-left:0;overflow-y:scroll;height:60vh}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point{cursor:pointer;padding:8px}.core-dom-decision-editor-container .modal-container .modal-content-root ul.intent-item-registry li.intent-item-point:hover{color:#fff;background-color:#09f}.core-dom-decision-editor-container .intent-chain .intent-list{list-style:none;padding:0;margin:0}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item{margin-bottom:12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card{border:1px solid #d0d7de;background:#fff;padding:10px 12px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card:hover{box-shadow:.4rem 0 2rem #0000002e}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row{display:flex;align-items:center;justify-content:space-between}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header{display:flex;align-items:center;gap:8px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-seq{background:#e6f0ff;color:#084298;border-radius:3px;padding:2px 6px;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label{color:#212529;cursor:pointer}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-header .intent-label:hover{color:#fff;color:#dd5f2a}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool{display:flex;gap:8px;padding-left:28px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn{border:none;background:none;cursor:pointer;font-size:13px;padding:2px 6px}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost{color:#0d6efd}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-ghost:hover{text-decoration:underline}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost{color:#dc3545}.core-dom-decision-editor-container .intent-chain .intent-list .intent-item .intent-card .intent-row .intent-tool .btn-danger-ghost:hover{text-decoration:underline}\n"] }]
30092
30435
  }], ctorParameters: () => [] });
30093
30436
 
30094
30437
  class CoreControlComponent extends BaseComponent {
@@ -35170,7 +35513,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
35170
35513
  const hrmSchemaRoutes = [
35171
35514
  {
35172
35515
  path: '',
35173
- loadComponent: () => import('./ngx-histaff-alpha-hrm-schema.component-Coz5KH1Z.mjs').then(m => m.HrmSchemaComponent)
35516
+ loadComponent: () => import('./ngx-histaff-alpha-hrm-schema.component-B4vDuuXE.mjs').then(m => m.HrmSchemaComponent)
35174
35517
  }
35175
35518
  ];
35176
35519
 
@@ -37343,7 +37686,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
37343
37686
  const simpleChatRoutes = [
37344
37687
  {
37345
37688
  path: '',
37346
- loadComponent: () => import('./ngx-histaff-alpha-simple-chat.component-CmdmeZkn.mjs').then(m => m.SimpleChatComponent)
37689
+ loadComponent: () => import('./ngx-histaff-alpha-simple-chat.component-Bcx7iKbD.mjs').then(m => m.SimpleChatComponent)
37347
37690
  }
37348
37691
  ];
37349
37692
 
@@ -38009,7 +38352,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
38009
38352
  const coreSysActionRoutes = [
38010
38353
  {
38011
38354
  path: "",
38012
- loadComponent: () => import('./ngx-histaff-alpha-core-sys-action.component-C-NgdGye.mjs').then(m => m.CoreSysActionComponent),
38355
+ loadComponent: () => import('./ngx-histaff-alpha-core-sys-action.component-D5zxtvyP.mjs').then(m => m.CoreSysActionComponent),
38013
38356
  children: [
38014
38357
  {
38015
38358
  path: ":id",
@@ -39402,11 +39745,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
39402
39745
  const sysSmtpClientRoutes = [
39403
39746
  {
39404
39747
  path: '',
39405
- loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client.component-DJQOWrW_.mjs').then(m => m.SysSmtpClientComponent),
39748
+ loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client.component-DTc9NmGX.mjs').then(m => m.SysSmtpClientComponent),
39406
39749
  children: [
39407
39750
  {
39408
39751
  path: ':id',
39409
- loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client-edit.component-yahvTLh8.mjs').then(m => m.SysSmtpClientEditComponent),
39752
+ loadComponent: () => import('./ngx-histaff-alpha-sys-smtp-client-edit.component-1UxoYqvL.mjs').then(m => m.SysSmtpClientEditComponent),
39410
39753
  outlet: 'corePageListAux'
39411
39754
  }
39412
39755
  ]
@@ -40592,11 +40935,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
40592
40935
  const coreDocGenRoutes = [
40593
40936
  {
40594
40937
  path: 'template-list',
40595
- loadComponent: () => import('./ngx-histaff-alpha-template-list.component-CW1wvq-D.mjs').then(m => m.TemplateListComponent),
40938
+ loadComponent: () => import('./ngx-histaff-alpha-template-list.component-DeIk9yaX.mjs').then(m => m.TemplateListComponent),
40596
40939
  },
40597
40940
  {
40598
40941
  path: ":id",
40599
- loadComponent: () => import('./ngx-histaff-alpha-core-template-editor.component-CWYV1jld.mjs').then(m => m.CoreTemplateEditorComponent),
40942
+ loadComponent: () => import('./ngx-histaff-alpha-core-template-editor.component-BR0ZVik4.mjs').then(m => m.CoreTemplateEditorComponent),
40600
40943
  canDeactivate: [CanDeactivateGuard]
40601
40944
  },
40602
40945
  {
@@ -40625,7 +40968,7 @@ const coreFormDesignRoutes = [
40625
40968
  },
40626
40969
  {
40627
40970
  path: ':id',
40628
- loadComponent: () => import('./ngx-histaff-alpha-core-form-design.component-BrjykzbK.mjs').then(m => m.CoreFormDesignComponent)
40971
+ loadComponent: () => import('./ngx-histaff-alpha-core-form-design.component-BNIDGKDm.mjs').then(m => m.CoreFormDesignComponent)
40629
40972
  }
40630
40973
  ];
40631
40974
 
@@ -41536,7 +41879,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
41536
41879
  const coreNavigationTrackerRoutes = [
41537
41880
  {
41538
41881
  path: '',
41539
- loadComponent: () => import('./ngx-histaff-alpha-tracker-studio.component-CuDeN7V9.mjs').then(m => m.TrackerStudioComponent)
41882
+ loadComponent: () => import('./ngx-histaff-alpha-tracker-studio.component-D2fXht9F.mjs').then(m => m.TrackerStudioComponent)
41540
41883
  }
41541
41884
  ];
41542
41885
 
@@ -44639,33 +44982,33 @@ const coreWorkflowRoutes = [
44639
44982
  {
44640
44983
  path: 'form-assign/:id',
44641
44984
  outlet: "formAssignAux",
44642
- loadComponent: () => import('./ngx-histaff-alpha-wf-form-assign.component-BwbYVigV.mjs').then(m => m.WfFormAssignComponent),
44985
+ loadComponent: () => import('./ngx-histaff-alpha-wf-form-assign.component-autPwDhJ.mjs').then(m => m.WfFormAssignComponent),
44643
44986
  canDeactivate: [CanDeactivateGuard]
44644
44987
  }
44645
44988
  ]
44646
44989
  },
44647
44990
  {
44648
44991
  path: 'global-config',
44649
- loadComponent: () => import('./ngx-histaff-alpha-wf-global-config.component-BYxq7KK5.mjs').then(m => m.WfGlobalConfigComponent)
44992
+ loadComponent: () => import('./ngx-histaff-alpha-wf-global-config.component-EfTrufWt.mjs').then(m => m.WfGlobalConfigComponent)
44650
44993
  },
44651
44994
  {
44652
44995
  path: 'db-settings',
44653
- loadComponent: () => import('./ngx-histaff-alpha-db-settings.component-BQ9xl200.mjs').then(m => m.DbSettingsComponent)
44996
+ loadComponent: () => import('./ngx-histaff-alpha-db-settings.component-CCQLmJTw.mjs').then(m => m.DbSettingsComponent)
44654
44997
  },
44655
44998
  {
44656
44999
  path: 'workflow-consume',
44657
- loadComponent: () => import('./ngx-histaff-alpha-core-workflow-consume.component-4CQ-jm0m.mjs').then(m => m.CoreWorkflowConsumeComponent),
45000
+ loadComponent: () => import('./ngx-histaff-alpha-core-workflow-consume.component-B0x1MLQX.mjs').then(m => m.CoreWorkflowConsumeComponent),
44658
45001
  children: [
44659
45002
  {
44660
45003
  path: ':id',
44661
45004
  outlet: "workflowConsume",
44662
- loadComponent: () => import('./ngx-histaff-alpha-live-form.component-DTSF49aS.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
45005
+ loadComponent: () => import('./ngx-histaff-alpha-live-form.component-losMBBZ9.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
44663
45006
  }
44664
45007
  ]
44665
45008
  },
44666
45009
  {
44667
45010
  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),
45011
+ loadComponent: () => import('./ngx-histaff-alpha-live-form.component-losMBBZ9.mjs').then(function (n) { return n.l; }).then(m => m.LiveFormComponent),
44669
45012
  },
44670
45013
  {
44671
45014
  path: 'workflow-group-edit/:id',
@@ -44675,21 +45018,21 @@ const coreWorkflowRoutes = [
44675
45018
  },
44676
45019
  {
44677
45020
  path: 'design/:id',
44678
- loadChildren: () => import('./ngx-histaff-alpha-design-wrapper.route-BeK6tiwQ.mjs').then(m => m.wfDesignWrapperRoutes),
45021
+ loadChildren: () => import('./ngx-histaff-alpha-design-wrapper.route-CTnWCpVz.mjs').then(m => m.wfDesignWrapperRoutes),
44679
45022
  },
44680
45023
  ]
44681
45024
  },
44682
45025
  {
44683
45026
  path: 'react/:id',
44684
- loadComponent: () => import('./ngx-histaff-alpha-wf-instance-step-react.component-GtdbtqYU.mjs').then(m => m.WfInstanceStepReactComponent)
45027
+ loadComponent: () => import('./ngx-histaff-alpha-wf-instance-step-react.component-B51fXgjI.mjs').then(m => m.WfInstanceStepReactComponent)
44685
45028
  },
44686
45029
  {
44687
45030
  path: 'status/:id',
44688
- loadComponent: () => import('./ngx-histaff-alpha-wf-instance-status.component-CRxpzsUc.mjs').then(m => m.WfInstanceStatusComponent)
45031
+ loadComponent: () => import('./ngx-histaff-alpha-wf-instance-status.component-CqTg9wOl.mjs').then(m => m.WfInstanceStatusComponent)
44689
45032
  },
44690
45033
  {
44691
45034
  path: 'lab',
44692
- loadComponent: () => import('./ngx-histaff-alpha-wf-lab.component-BLleTFyw.mjs').then(m => m.WfLabComponent)
45035
+ loadComponent: () => import('./ngx-histaff-alpha-wf-lab.component-56r-UN3Q.mjs').then(m => m.WfLabComponent)
44693
45036
  }
44694
45037
  ];
44695
45038
 
@@ -47298,4 +47641,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
47298
47641
  */
47299
47642
 
47300
47643
  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
47644
+ //# sourceMappingURL=ngx-histaff-alpha-ngx-histaff-alpha-DTx4Tmxu.mjs.map