ngx-histaff-alpha 5.3.9 → 5.4.1

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 (53) hide show
  1. package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-Cwcf1M7W.mjs → ngx-histaff-alpha-ai-hint-for-table.component-CLyzbLC7.mjs} +3 -3
  2. package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-Cwcf1M7W.mjs.map → ngx-histaff-alpha-ai-hint-for-table.component-CLyzbLC7.mjs.map} +1 -1
  3. package/fesm2022/{ngx-histaff-alpha-core-form-design.component-C85pY2wo.mjs → ngx-histaff-alpha-core-form-design.component-NPdxlvdw.mjs} +33 -14
  4. package/fesm2022/ngx-histaff-alpha-core-form-design.component-NPdxlvdw.mjs.map +1 -0
  5. package/fesm2022/{ngx-histaff-alpha-core-sticker-collection.component-CJZbjexO.mjs → ngx-histaff-alpha-core-sticker-collection.component-BxDB5uWA.mjs} +3 -3
  6. package/fesm2022/{ngx-histaff-alpha-core-sticker-collection.component-CJZbjexO.mjs.map → ngx-histaff-alpha-core-sticker-collection.component-BxDB5uWA.mjs.map} +1 -1
  7. package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-ew1UR2KC.mjs → ngx-histaff-alpha-core-toast-loading.component-BR6wSLm9.mjs} +2 -2
  8. package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-ew1UR2KC.mjs.map → ngx-histaff-alpha-core-toast-loading.component-BR6wSLm9.mjs.map} +1 -1
  9. package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-CrwvYZb4.mjs → ngx-histaff-alpha-core-workflow-consume.component-DCncWQCx.mjs} +2 -2
  10. package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-CrwvYZb4.mjs.map → ngx-histaff-alpha-core-workflow-consume.component-DCncWQCx.mjs.map} +1 -1
  11. package/fesm2022/{ngx-histaff-alpha-db-settings.component--0dikeQu.mjs → ngx-histaff-alpha-db-settings.component-1p7ke3vT.mjs} +5 -5
  12. package/fesm2022/{ngx-histaff-alpha-db-settings.component--0dikeQu.mjs.map → ngx-histaff-alpha-db-settings.component-1p7ke3vT.mjs.map} +1 -1
  13. package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-DMCmlkIr.mjs → ngx-histaff-alpha-design-wrapper.component-D37Jpz_7.mjs} +137 -46
  14. package/fesm2022/ngx-histaff-alpha-design-wrapper.component-D37Jpz_7.mjs.map +1 -0
  15. package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-DSqd0X45.mjs → ngx-histaff-alpha-design-wrapper.route-41-Uhx-c.mjs} +5 -5
  16. package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-DSqd0X45.mjs.map → ngx-histaff-alpha-design-wrapper.route-41-Uhx-c.mjs.map} +1 -1
  17. package/fesm2022/ngx-histaff-alpha-live-form.component-B2BGEY9X.mjs +592 -0
  18. package/fesm2022/ngx-histaff-alpha-live-form.component-B2BGEY9X.mjs.map +1 -0
  19. package/fesm2022/{ngx-histaff-alpha-ngx-histaff-alpha-Dnk7Lx_f.mjs → ngx-histaff-alpha-ngx-histaff-alpha-DHgOJCW6.mjs} +220 -135
  20. package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-DHgOJCW6.mjs.map +1 -0
  21. package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-B0Y7tFHv.mjs → ngx-histaff-alpha-wf-form-assign.component-Vk580Um8.mjs} +2 -2
  22. package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-B0Y7tFHv.mjs.map → ngx-histaff-alpha-wf-form-assign.component-Vk580Um8.mjs.map} +1 -1
  23. package/fesm2022/ngx-histaff-alpha.mjs +1 -1
  24. package/lib/app/libraries/core-control-value-only/core-control-value-only.component.d.ts +2 -0
  25. package/lib/app/libraries/core-employee-seeker/core-employee-seeker/core-employee-seeker.component.d.ts +1 -2
  26. package/lib/app/libraries/core-form/core-form/enum-interfaces.d.ts +2 -0
  27. package/lib/app/libraries/core-form-control-seeker/core-form-control-seeker/core-form-control-seeker.component.d.ts +2 -0
  28. package/lib/app/libraries/core-form-design/field-setting/calculated-props/calculated-props.component.d.ts +11 -8
  29. package/lib/app/libraries/core-param-control/core-param-control/core-param-control.component.d.ts +5 -2
  30. package/lib/app/libraries/core-param-control/core-param-control.service.d.ts +8 -0
  31. package/lib/app/libraries/core-table/core-table.component.d.ts +3 -2
  32. package/lib/app/libraries/core-workflow-builder/constants/FALLBACK_ACTOR_ASSIGNMENT.d.ts +2 -0
  33. package/lib/app/libraries/core-workflow-builder/core-workflow.service.d.ts +10 -5
  34. package/lib/app/libraries/core-workflow-builder/interfaces/IActorAssignment.d.ts +0 -1
  35. package/lib/app/libraries/core-workflow-builder/interfaces/ICalculatedField.d.ts +1 -0
  36. package/lib/app/libraries/core-workflow-builder/interfaces/IGenerateWorkflowRoutingRequest.d.ts +1 -1
  37. package/lib/app/libraries/core-workflow-builder/interfaces/IPlannedActor.d.ts +1 -0
  38. package/lib/app/libraries/core-workflow-builder/interfaces/IResolvedStepRouting.d.ts +7 -2
  39. package/lib/app/libraries/core-workflow-builder/interfaces/IRoutingStep.d.ts +2 -2
  40. package/lib/app/libraries/core-workflow-builder/interfaces/IStepConfig.d.ts +5 -29
  41. package/lib/app/libraries/core-workflow-builder/routing-preview/routing-preview.component.d.ts +6 -0
  42. package/lib/app/libraries/core-workflow-builder/routing-preview-panel/routing-preview-panel.component.d.ts +0 -2
  43. package/lib/app/libraries/core-workflow-builder/types/RoutingStepLogic.d.ts +1 -1
  44. package/lib/app/libraries/core-workflow-builder/types/RoutingStepType.d.ts +1 -1
  45. package/lib/app/libraries/core-workflow-builder/wf-process-design/wf-step-config-shell/wf-actor-selector/wf-actor-selector.component.d.ts +12 -3
  46. package/lib/app/libraries/staffprofile/staffprofile.component.d.ts +4 -2
  47. package/package.json +1 -1
  48. package/fesm2022/ngx-histaff-alpha-core-form-design.component-C85pY2wo.mjs.map +0 -1
  49. package/fesm2022/ngx-histaff-alpha-design-wrapper.component-DMCmlkIr.mjs.map +0 -1
  50. package/fesm2022/ngx-histaff-alpha-live-form.component-CqR81N-A.mjs +0 -601
  51. package/fesm2022/ngx-histaff-alpha-live-form.component-CqR81N-A.mjs.map +0 -1
  52. package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-Dnk7Lx_f.mjs.map +0 -1
  53. package/lib/app/libraries/core-workflow-builder/mocks/MockedRoutingSteps.d.ts +0 -2
@@ -2,8 +2,8 @@ import * as i0 from '@angular/core';
2
2
  import { input, signal, inject, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import * as i1 from '@angular/forms';
4
4
  import { FormControl, ReactiveFormsModule } from '@angular/forms';
5
- import { c as BaseComponent, C as CoreWorkflowService, T as TranslatePipe, f as TooltipDirective } from './ngx-histaff-alpha-ngx-histaff-alpha-Dnk7Lx_f.mjs';
6
- import { D as DbService } from './ngx-histaff-alpha-core-toast-loading.component-ew1UR2KC.mjs';
5
+ import { c as BaseComponent, C as CoreWorkflowService, T as TranslatePipe, f as TooltipDirective } from './ngx-histaff-alpha-ngx-histaff-alpha-DHgOJCW6.mjs';
6
+ import { D as DbService } from './ngx-histaff-alpha-core-toast-loading.component-BR6wSLm9.mjs';
7
7
  import { take } from 'rxjs';
8
8
 
9
9
  class AiHintForTableComponent extends BaseComponent {
@@ -51,4 +51,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
51
51
  }] });
52
52
 
53
53
  export { AiHintForTableComponent };
54
- //# sourceMappingURL=ngx-histaff-alpha-ai-hint-for-table.component-Cwcf1M7W.mjs.map
54
+ //# sourceMappingURL=ngx-histaff-alpha-ai-hint-for-table.component-CLyzbLC7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-histaff-alpha-ai-hint-for-table.component-Cwcf1M7W.mjs","sources":["../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/db-settings/ai-hint-for-table/ai-hint-for-table.component.ts","../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/db-settings/ai-hint-for-table/ai-hint-for-table.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject, input, signal } from '@angular/core';\r\nimport { IWorkflowSchemaTable } from '../../interfaces/IWorkflowSchema';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslatePipe } from '../../../../app-pipes/translate.pipe';\r\nimport { TooltipDirective } from '../../../tooltip/tooltip.directive';\r\nimport { BaseComponent } from '../../../base-component/base/base.component';\r\nimport { DbService } from '../../../../services/db.service';\r\nimport { CoreWorkflowService } from '../../core-workflow.service';\r\nimport { take } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'ai-hint-for-table',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n TranslatePipe,\r\n TooltipDirective,\r\n ReactiveFormsModule,\r\n ],\r\n templateUrl: './ai-hint-for-table.component.html',\r\n styleUrl: './ai-hint-for-table.component.scss'\r\n})\r\nexport class AiHintForTableComponent extends BaseComponent {\r\n $table = input.required<IWorkflowSchemaTable>()\r\n\r\n $editing = signal(false);\r\n hintControl = new FormControl('');\r\n\r\n dbs = inject(DbService);\r\n wfs = inject(CoreWorkflowService);\r\n\r\n override ngOnInit() {\r\n this.subscriptions.push(\r\n this.mls.lang$.subscribe(x => this.lang = x)\r\n )\r\n this.hintControl.setValue(this.$table().hintForAi || '');\r\n }\r\n\r\n startEditing(): void {\r\n this.$editing.set(true);\r\n }\r\n\r\n save(): void {\r\n this.$editing.set(false);\r\n this.wfs.$workflowDbSchema.update(current => {\r\n const founds = current.filter(x => x.id === this.$table().id);\r\n if (founds) {\r\n founds[0].hintForAi = this.hintControl.getRawValue() ?? ''\r\n }\r\n return [...current];\r\n })\r\n this.dbs.updateTableHint(this.$table().table, this.hintControl.getRawValue() ?? '')\r\n .pipe(take(1))\r\n .subscribe({\r\n next: () => console.log('Hint saved'),\r\n error: err => console.error('Failed to save hint', err)\r\n });\r\n }\r\n}\r\n","<span class=\"ai-table-hint-wrapper\">\r\n @if (!$editing()) {\r\n <i\r\n class=\"feather feather-more-vertical ai-table-icon\"\r\n [appTooltip]=\"'Edit Hint for AI' | translate : lang\" [showAnyway]=\"true\"\r\n (click)=\"startEditing()\">\r\n </i>\r\n } @else {\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm ai-table-hint-input\"\r\n [formControl]=\"hintControl\"\r\n (blur)=\"save()\"\r\n (keydown.enter)=\"save()\" />\r\n }\r\n</span>\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-histaff-alpha-ai-hint-for-table.component-CLyzbLC7.mjs","sources":["../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/db-settings/ai-hint-for-table/ai-hint-for-table.component.ts","../../../projects/ngx-histaff-alpha/src/lib/app/libraries/core-workflow-builder/db-settings/ai-hint-for-table/ai-hint-for-table.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject, input, signal } from '@angular/core';\r\nimport { IWorkflowSchemaTable } from '../../interfaces/IWorkflowSchema';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslatePipe } from '../../../../app-pipes/translate.pipe';\r\nimport { TooltipDirective } from '../../../tooltip/tooltip.directive';\r\nimport { BaseComponent } from '../../../base-component/base/base.component';\r\nimport { DbService } from '../../../../services/db.service';\r\nimport { CoreWorkflowService } from '../../core-workflow.service';\r\nimport { take } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'ai-hint-for-table',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n TranslatePipe,\r\n TooltipDirective,\r\n ReactiveFormsModule,\r\n ],\r\n templateUrl: './ai-hint-for-table.component.html',\r\n styleUrl: './ai-hint-for-table.component.scss'\r\n})\r\nexport class AiHintForTableComponent extends BaseComponent {\r\n $table = input.required<IWorkflowSchemaTable>()\r\n\r\n $editing = signal(false);\r\n hintControl = new FormControl('');\r\n\r\n dbs = inject(DbService);\r\n wfs = inject(CoreWorkflowService);\r\n\r\n override ngOnInit() {\r\n this.subscriptions.push(\r\n this.mls.lang$.subscribe(x => this.lang = x)\r\n )\r\n this.hintControl.setValue(this.$table().hintForAi || '');\r\n }\r\n\r\n startEditing(): void {\r\n this.$editing.set(true);\r\n }\r\n\r\n save(): void {\r\n this.$editing.set(false);\r\n this.wfs.$workflowDbSchema.update(current => {\r\n const founds = current.filter(x => x.id === this.$table().id);\r\n if (founds) {\r\n founds[0].hintForAi = this.hintControl.getRawValue() ?? ''\r\n }\r\n return [...current];\r\n })\r\n this.dbs.updateTableHint(this.$table().table, this.hintControl.getRawValue() ?? '')\r\n .pipe(take(1))\r\n .subscribe({\r\n next: () => console.log('Hint saved'),\r\n error: err => console.error('Failed to save hint', err)\r\n });\r\n }\r\n}\r\n","<span class=\"ai-table-hint-wrapper\">\r\n @if (!$editing()) {\r\n <i\r\n class=\"feather feather-more-vertical ai-table-icon\"\r\n [appTooltip]=\"'Edit Hint for AI' | translate : lang\" [showAnyway]=\"true\"\r\n (click)=\"startEditing()\">\r\n </i>\r\n } @else {\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm ai-table-hint-input\"\r\n [formControl]=\"hintControl\"\r\n (blur)=\"save()\"\r\n (keydown.enter)=\"save()\" />\r\n }\r\n</span>\r\n"],"names":[],"mappings":"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"}
@@ -1,16 +1,16 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, ChangeDetectorRef, Component, signal, effect, HostListener, ChangeDetectionStrategy, Injectable, computed, ViewContainerRef, Input, EventEmitter, Output, Renderer2, input, viewChild, isDevMode } from '@angular/core';
3
3
  import { trigger, state, transition, style, animate } from '@angular/animations';
4
- import { h as CoreFormDesignService, C as CoreWorkflowService, B as BaseEditComponent, A as AlertService, w as AppConfigService, x as EnumCorePageEditMode, y as EnumCoreButtonVNSCode, R as READONLY_WORKFLOW_FIELDS, z as noneAutoClosedAlertOptions, k as DialogService, M as MultiLanguageService, d as CorePageHeaderComponent, I as CoreFormComponent, K as CoreButtonGroupVnsComponent, T as TranslatePipe, E as EnumFormBaseContolType, c as BaseComponent, L as EnumCoreTablePipeType, O as CoreCheckboxComponent, n as CoreDropdownComponent, f as TooltipDirective, G as GptService, j as alertOptions, u as CoreRadioGroupComponent, P as HtmlTooltipDirective, Q as EnumFormDesignMode, m as DomService, v as ApplicationHelpService, a as EnumCoreFormControlSeekerSourceType, H as HotKeysDirective, S as CoreControlComponent, U as TableCellPipe, o as CoreChecklistComponent, q as CoreFormControlSeekerComponent, V as CoreAttachmentComponent, p as CoreDatePickerComponent, W as CoreMonthSelectorComponent, r as CoreCurrencyInputComponent } from './ngx-histaff-alpha-ngx-histaff-alpha-Dnk7Lx_f.mjs';
4
+ import { h as CoreFormDesignService, C as CoreWorkflowService, B as BaseEditComponent, A as AlertService, w as AppConfigService, x as EnumCorePageEditMode, y as EnumCoreButtonVNSCode, R as READONLY_WORKFLOW_FIELDS, z as noneAutoClosedAlertOptions, k as DialogService, M as MultiLanguageService, d as CorePageHeaderComponent, I as CoreFormComponent, K as CoreButtonGroupVnsComponent, T as TranslatePipe, E as EnumFormBaseContolType, c as BaseComponent, L as EnumCoreTablePipeType, O as CoreCheckboxComponent, n as CoreDropdownComponent, f as TooltipDirective, G as GptService, j as alertOptions, u as CoreRadioGroupComponent, P as HtmlTooltipDirective, Q as EnumFormDesignMode, m as DomService, v as ApplicationHelpService, a as EnumCoreFormControlSeekerSourceType, H as HotKeysDirective, S as CoreControlComponent, U as TableCellPipe, o as CoreChecklistComponent, q as CoreFormControlSeekerComponent, V as CoreAttachmentComponent, p as CoreDatePickerComponent, W as CoreMonthSelectorComponent, r as CoreCurrencyInputComponent } from './ngx-histaff-alpha-ngx-histaff-alpha-DHgOJCW6.mjs';
5
5
  import * as i1 from '@angular/forms';
6
6
  import { FormsModule, FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
7
7
  import { NgStyle, NgTemplateOutlet } from '@angular/common';
8
8
  import { BehaviorSubject, catchError, of, filter, distinctUntilChanged, tap, switchMap } from 'rxjs';
9
9
  import { Router, ActivatedRoute } from '@angular/router';
10
- import { CoreStickerCollectionComponent } from './ngx-histaff-alpha-core-sticker-collection.component-CJZbjexO.mjs';
11
- import { D as DbService, C as CoreToastLoadingComponent } from './ngx-histaff-alpha-core-toast-loading.component-ew1UR2KC.mjs';
10
+ import { CoreStickerCollectionComponent } from './ngx-histaff-alpha-core-sticker-collection.component-BxDB5uWA.mjs';
11
+ import { D as DbService, C as CoreToastLoadingComponent } from './ngx-histaff-alpha-core-toast-loading.component-BR6wSLm9.mjs';
12
12
  import { EnumTranslateKey } from 'alpha-global-constants';
13
- import { L as LiveFormComponent } from './ngx-histaff-alpha-live-form.component-CqR81N-A.mjs';
13
+ import { L as LiveFormComponent } from './ngx-histaff-alpha-live-form.component-B2BGEY9X.mjs';
14
14
 
15
15
  const slideFromTopFadeIn = trigger('slideFromTopFadeIn', [
16
16
  state('in', style({ opacity: 1, transform: 'translateY(0)' })),
@@ -783,6 +783,7 @@ class CalculatedPropsComponent extends BasePropsComponent {
783
783
  this.gpt = inject(GptService);
784
784
  this.alertService = inject(AlertService);
785
785
  this.$currentControl = this.fds.$currentControl;
786
+ this.$sqlScriptError = signal(null);
786
787
  this.$aiGeneratorOn = signal(false);
787
788
  this.$selectedTables = signal([]);
788
789
  this.$generatedScript = signal('');
@@ -952,22 +953,24 @@ class CalculatedPropsComponent extends BasePropsComponent {
952
953
  getContextByMode(mode) {
953
954
  if (mode === 'sql-query') {
954
955
  return [
955
- `You use language "${this.mls.lang$.value.toUpperCase()}" for answer`,
956
+ `You use ${this.mls.lang$.value.toUpperCase() === 'VI' ? 'Vietnamese' : 'English'} for answer`,
956
957
  "You are a SQL validator for a workflow engine.",
957
958
  "User input must be a full SQL SELECT statement compatible with Dapper.",
959
+ "User input must not modify database schema",
958
960
  "It must contain a FROM clause with a real table name.",
961
+ "It must contain a UPDATE, DELETE or DROP clause.",
959
962
  "It must contain a WHERE clause.",
960
- "It must return exactly one value: either 1 (true) or 0 (false).",
963
+ "It must return exactly one value",
961
964
  "Examples of valid patterns include:",
962
965
  " SELECT CASE WHEN EXISTS (SELECT 1 FROM Users WHERE IsActive = 1) THEN 1 ELSE 0 END",
963
- " SELECT CASE WHEN Amount > 1000 THEN 1 ELSE 0 END -- when Amount is a parameter",
966
+ " SELECT CASE WHEN @Amount > 1000 THEN @Amount ELSE 0 END -- when Amount is a parameter",
964
967
  "The query must be syntactically complete, no partial expressions or clauses.",
965
968
  "Do not wrap your output in triple backticks or markdown.",
966
969
  "Respond with only the raw SQL script.",
967
970
  ];
968
971
  }
969
972
  return [
970
- `You use language "${this.mls.lang$.value.toUpperCase()}" for answer`,
973
+ `You use ${this.mls.lang$.value.toUpperCase() === 'VI' ? 'Vietnamese' : 'English'} for answer`,
971
974
  'You are a C# expression validator.',
972
975
  'Validate whether the expression returns a true/false result using C# syntax.',
973
976
  'The result will be used inside an if-statement or condition tree.'
@@ -976,11 +979,10 @@ class CalculatedPropsComponent extends BasePropsComponent {
976
979
  getValidationContextByMode(mode) {
977
980
  if (mode === 'sql-query') {
978
981
  return [
979
- `You use language "${this.mls.lang$.value.toUpperCase()}" for answer`,
982
+ `You use ${this.mls.lang$.value.toUpperCase() === 'VI' ? 'Vietnamese' : 'English'} for answer`,
980
983
  "You're a SQL validator for a business rule engine.",
981
984
  "The input is a full SQL SELECT statement written by a human.",
982
985
  "Analyze if it meets these criteria:",
983
- "- Returns exactly one value: 1 or 0.",
984
986
  "- Compatible with SQL Server and Dapper parameter style.",
985
987
  "- Has FROM clause with table name.",
986
988
  "- Has WHERE clause.",
@@ -989,18 +991,35 @@ class CalculatedPropsComponent extends BasePropsComponent {
989
991
  ];
990
992
  }
991
993
  return [
992
- `You use language "${this.mls.lang$.value.toUpperCase()}" for answer`,
994
+ `You use ${this.mls.lang$.value.toUpperCase() === 'VI' ? 'Vietnamese' : 'English'} for answer`,
993
995
  "You're a validator for simple C# boolean expressions.",
994
996
  "Analyze whether this expression is valid syntax and returns a boolean.",
995
997
  "Only accept expressions that would work inside an 'if (...)' statement.",
996
998
  "If valid, say 'Valid ✅'. If not, explain the syntax issue.",
997
999
  ];
998
1000
  }
1001
+ validateSqlScript(input) {
1002
+ const trimmed = input.trim();
1003
+ if (!/^SELECT\b/i.test(trimmed)) {
1004
+ return 'Only SELECT queries are allowed.';
1005
+ }
1006
+ const destructivePattern = /^\s*(DELETE|DROP|UPDATE|INSERT|ALTER|TRUNCATE|EXEC|MERGE)\b/gi;
1007
+ if (destructivePattern.test(trimmed)) {
1008
+ return 'Dangerous SQL operations (DELETE, DROP, etc.) are not allowed.';
1009
+ }
1010
+ return null;
1011
+ }
1012
+ onScriptChange(script) {
1013
+ const error = this.validateSqlScript(script);
1014
+ this.setControlProp('isUnsafe', !!error);
1015
+ this.$sqlScriptError.set(error);
1016
+ this.setControlProp('script', script);
1017
+ }
999
1018
  ngAfterViewInit() {
1000
1019
  setTimeout(() => this.loadDbSchema());
1001
1020
  }
1002
1021
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CalculatedPropsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1003
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CalculatedPropsComponent, isStandalone: true, selector: "calculated-props", usesInheritance: true, ngImport: i0, template: "<div class=\"setting-group calculated-group\" [ngStyle]=\"{ padding: '15px' }\">\r\n\r\n <div class=\"setting-row evaluation-mode-row\">\r\n <label class=\"setting-label\">Evaluation Mode</label>\r\n <core-radio-group\r\n [options$]=\"radioOptions$\"\r\n [vertical]=\"true\"\r\n [gapY]=\"8\"\r\n [ngModel]=\"$currentControl()?.evaluationMode\"\r\n (ngModelChange)=\"setControlProp('evaluationMode', $event)\">\r\n </core-radio-group>\r\n </div>\r\n\r\n <div class=\"setting-row script-row\">\r\n <label class=\"setting-label\">Script {{ $beingValidated() ? 'is being validated...' : '' }}</label>\r\n <textarea\r\n [ngStyle]=\"{ minHeight: '150px', borderRadius: '8px' }\"\r\n [readonly]=\"!$currentControl()?.evaluationMode\"\r\n [disabled]=\"!$currentControl()?.evaluationMode\"\r\n class=\"form-control\"\r\n [class.form-control-disabled]=\"!$currentControl()?.evaluationMode\"\r\n rows=\"20\"\r\n [ngModel]=\"$currentControl()?.script\"\r\n (ngModelChange)=\"setControlProp('script', $event)\"\r\n [placeholder]=\"$placeholderForScriptInput()\">\r\n </textarea>\r\n\r\n @if (!!$currentControl()?.evaluationMode) {\r\n <div class=\"button-group\">\r\n <button class=\"btn btn-secondary validate-btn\" (click)=\"validateScript($event)\">Validate with AI</button>\r\n <button class=\"btn btn-primary validate-btn\" (click)=\"generateScript()\">\r\n {{ $aiGeneratorOn() ? 'Hide AI Prompt Editor' : 'Show AI Prompt Editor' }}\r\n </button>\r\n </div>\r\n }\r\n\r\n @if ($aiGeneratorOn()) {\r\n <div class=\"sql-generator-panel\">\r\n <div class=\"alert alert-info\" style=\"margin-top: 1rem;\">\r\n <strong>SQL Generator:</strong> Describe what you want the script to do, and AI will generate SQL for you.\r\n </div>\r\n\r\n @if ($currentControl()?.evaluationMode==='sql-query') {\r\n <div class=\"sql-generator-panel mt-4\">\r\n <label class=\"fw-bold mb-2\">Select Related Tables</label>\r\n\r\n <core-sticker-collection\r\n [$enableFilter]=\"true\"\r\n [$items]=\"wfs.$workflowDbSchema()\"\r\n [$shownFrom]=\"'table'\"\r\n [$tooltipFrom]=\"'hintForAi'\"\r\n [$initialChecked]=\"[]\"\r\n ($checkedChange)=\"tableCheckedChange($event)\">\r\n </core-sticker-collection>\r\n\r\n </div>\r\n }\r\n\r\n @if (!!$currentControl()?.evaluationMode) {\r\n <textarea\r\n class=\"form-control\"\r\n style=\"min-height: 100px; margin-top: 0.5rem; border-radius: 8px;\"\r\n [(ngModel)]=\"$sqlPrompt\"\r\n placeholder=\"e.g., Calculate leave days between FROM_DATE and TO_DATE\">\r\n </textarea>\r\n\r\n <div class=\"mt-2 d-flex gap-2 justify-content-end\">\r\n <button class=\"btn btn-success\" (click)=\"submitScriptPrompt()\">\r\n Generate Script\r\n </button>\r\n </div>\r\n }\r\n\r\n @if ($generatedScript()) {\r\n <div class=\"generated-sql-box mt-3\">\r\n <label class=\"fw-bold\">Generated by AI:</label>\r\n <pre class=\"bg-light p-3 rounded\" style=\"white-space: pre-wrap;\">{{$generatedScript()}}</pre>\r\n <button class=\"btn btn-sm btn-primary mt-2\" (click)=\"applyGeneratedSql()\">Apply to Script</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"setting-row depends-on-row\">\r\n <label class=\"setting-label\">Depends On</label>\r\n <core-sticker-collection\r\n [$items]=\"$fields()\"\r\n [$shownFrom]=\"'field'\"\r\n [$initialChecked]=\"$currentControl()?.dependsOn || []\"\r\n ($checkedChange)=\"setControlProp('dependsOn', $event)\">\r\n </core-sticker-collection>\r\n </div>\r\n\r\n</div>\r\n\r\n", styles: [".setting-row{padding-bottom:50px}.button-group{margin-top:15px}.button-group button{height:35px;border-radius:17.5px;margin-right:8px}.setting-divider{margin:1.5rem 0 .75rem;color:#555;border-top:1px dashed #ccc;padding-top:.5rem}.evaluation-mode-row{background-color:#ffecb3;border-radius:8px;width:180px;height:110px;padding:15px}.evaluation-mode-row label{margin-bottom:8px}.script-row{margin-top:30px}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CoreStickerCollectionComponent, selector: "core-sticker-collection", inputs: ["$items", "$shownFrom", "$tooltipFrom", "$initialChecked", "$showMore", "$showMoreTooltip", "$hideShowMoreIfNotSelected", "$enableFilter"], outputs: ["$checkedChange", "$onShowMore"] }, { kind: "component", type: CoreRadioGroupComponent, selector: "core-radio-group", inputs: ["options$", "vertical", "columnCount", "gapY"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1022
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.5", type: CalculatedPropsComponent, isStandalone: true, selector: "calculated-props", usesInheritance: true, ngImport: i0, template: "<div class=\"setting-group calculated-group\" [ngStyle]=\"{ padding: '15px' }\">\r\n\r\n <div class=\"setting-row evaluation-mode-row\">\r\n <label class=\"setting-label\">Evaluation Mode</label>\r\n <core-radio-group\r\n [options$]=\"radioOptions$\"\r\n [vertical]=\"true\"\r\n [gapY]=\"8\"\r\n [ngModel]=\"$currentControl()?.evaluationMode\"\r\n (ngModelChange)=\"setControlProp('evaluationMode', $event)\">\r\n </core-radio-group>\r\n </div>\r\n\r\n <div class=\"setting-row script-row\">\r\n <label class=\"setting-label\">Script {{ $beingValidated() ? 'is being validated...' : '' }}</label>\r\n <textarea\r\n [ngStyle]=\"{ minHeight: '150px', borderRadius: '8px' }\"\r\n [readonly]=\"!$currentControl()?.evaluationMode\"\r\n [disabled]=\"!$currentControl()?.evaluationMode\"\r\n class=\"form-control\"\r\n [class.form-control-disabled]=\"!$currentControl()?.evaluationMode\"\r\n rows=\"20\"\r\n [ngModel]=\"$currentControl()?.script\"\r\n (ngModelChange)=\"onScriptChange($event)\"\r\n [placeholder]=\"$placeholderForScriptInput()\">\r\n </textarea>\r\n @if (!!$sqlScriptError()) {\r\n <small class=\"text-danger\">{{ $sqlScriptError() }}</small>\r\n }\r\n \r\n\r\n @if (!!$currentControl()?.evaluationMode) {\r\n <div class=\"button-group\">\r\n <button class=\"btn btn-secondary validate-btn\" (click)=\"validateScript($event)\">Validate with AI</button>\r\n <button class=\"btn btn-primary validate-btn\" (click)=\"generateScript()\">\r\n {{ $aiGeneratorOn() ? 'Hide AI Prompt Editor' : 'Show AI Prompt Editor' }}\r\n </button>\r\n </div>\r\n }\r\n\r\n @if ($aiGeneratorOn()) {\r\n <div class=\"sql-generator-panel\">\r\n <div class=\"alert alert-info\" style=\"margin-top: 1rem;\">\r\n <strong>SQL Generator:</strong> Describe what you want the script to do, and AI will generate SQL for you.\r\n </div>\r\n\r\n @if ($currentControl()?.evaluationMode==='sql-query') {\r\n <div class=\"sql-generator-panel mt-4\">\r\n <label class=\"fw-bold mb-2\">Select Related Tables</label>\r\n\r\n <core-sticker-collection\r\n [$enableFilter]=\"true\"\r\n [$items]=\"wfs.$workflowDbSchema()\"\r\n [$shownFrom]=\"'table'\"\r\n [$tooltipFrom]=\"'hintForAi'\"\r\n [$initialChecked]=\"[]\"\r\n ($checkedChange)=\"tableCheckedChange($event)\">\r\n </core-sticker-collection>\r\n\r\n </div>\r\n }\r\n\r\n @if (!!$currentControl()?.evaluationMode) {\r\n <textarea\r\n class=\"form-control\"\r\n style=\"min-height: 100px; margin-top: 0.5rem; border-radius: 8px;\"\r\n [(ngModel)]=\"$sqlPrompt\"\r\n placeholder=\"e.g., Calculate leave days between FROM_DATE and TO_DATE\">\r\n </textarea>\r\n\r\n <div class=\"mt-2 d-flex gap-2 justify-content-end\">\r\n <button class=\"btn btn-success\" (click)=\"submitScriptPrompt()\">\r\n Generate Script\r\n </button>\r\n </div>\r\n }\r\n\r\n @if ($generatedScript()) {\r\n <div class=\"generated-sql-box mt-3\">\r\n <label class=\"fw-bold\">Generated by AI:</label>\r\n <pre class=\"bg-light p-3 rounded\" style=\"white-space: pre-wrap;\">{{$generatedScript()}}</pre>\r\n <button class=\"btn btn-sm btn-primary mt-2\" (click)=\"applyGeneratedSql()\">Apply to Script</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"setting-row depends-on-row\">\r\n <label class=\"setting-label\">Depends On</label>\r\n <core-sticker-collection\r\n [$items]=\"$fields()\"\r\n [$shownFrom]=\"'field'\"\r\n [$initialChecked]=\"$currentControl()?.dependsOn || []\"\r\n ($checkedChange)=\"setControlProp('dependsOn', $event)\">\r\n </core-sticker-collection>\r\n </div>\r\n\r\n <div class=\"setting-row return-type-row\">\r\n <label class=\"setting-label\">Return Type</label>\r\n <select\r\n class=\"form-control setting-input\"\r\n [ngModel]=\"$currentControl()?.returnType || 'number'\"\r\n (ngModelChange)=\"setControlProp('returnType', $event)\"\r\n >\r\n <option value=\"boolean\">Boolean</option>\r\n <option value=\"number\">Number</option>\r\n <option value=\"string\">String</option>\r\n <option value=\"number[]\">Number[]</option>\r\n <option value=\"string[]\">String[]</option>\r\n <!-- Omitting 'Date' and 'object' -->\r\n </select>\r\n </div>\r\n\r\n</div>\r\n\r\n", styles: [".setting-row{padding-bottom:50px}.button-group{margin-top:15px}.button-group button{height:35px;border-radius:17.5px;margin-right:8px}.setting-divider{margin:1.5rem 0 .75rem;color:#555;border-top:1px dashed #ccc;padding-top:.5rem}.evaluation-mode-row{background-color:#ffecb3;border-radius:8px;width:180px;height:110px;padding:15px}.evaluation-mode-row label{margin-bottom:8px}.script-row{margin-top:30px}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CoreStickerCollectionComponent, selector: "core-sticker-collection", inputs: ["$items", "$shownFrom", "$tooltipFrom", "$initialChecked", "$showMore", "$showMoreTooltip", "$hideShowMoreIfNotSelected", "$enableFilter"], outputs: ["$checkedChange", "$onShowMore"] }, { kind: "component", type: CoreRadioGroupComponent, selector: "core-radio-group", inputs: ["options$", "vertical", "columnCount", "gapY"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1004
1023
  }
1005
1024
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImport: i0, type: CalculatedPropsComponent, decorators: [{
1006
1025
  type: Component,
@@ -1009,7 +1028,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
1009
1028
  FormsModule,
1010
1029
  CoreStickerCollectionComponent,
1011
1030
  CoreRadioGroupComponent,
1012
- ], template: "<div class=\"setting-group calculated-group\" [ngStyle]=\"{ padding: '15px' }\">\r\n\r\n <div class=\"setting-row evaluation-mode-row\">\r\n <label class=\"setting-label\">Evaluation Mode</label>\r\n <core-radio-group\r\n [options$]=\"radioOptions$\"\r\n [vertical]=\"true\"\r\n [gapY]=\"8\"\r\n [ngModel]=\"$currentControl()?.evaluationMode\"\r\n (ngModelChange)=\"setControlProp('evaluationMode', $event)\">\r\n </core-radio-group>\r\n </div>\r\n\r\n <div class=\"setting-row script-row\">\r\n <label class=\"setting-label\">Script {{ $beingValidated() ? 'is being validated...' : '' }}</label>\r\n <textarea\r\n [ngStyle]=\"{ minHeight: '150px', borderRadius: '8px' }\"\r\n [readonly]=\"!$currentControl()?.evaluationMode\"\r\n [disabled]=\"!$currentControl()?.evaluationMode\"\r\n class=\"form-control\"\r\n [class.form-control-disabled]=\"!$currentControl()?.evaluationMode\"\r\n rows=\"20\"\r\n [ngModel]=\"$currentControl()?.script\"\r\n (ngModelChange)=\"setControlProp('script', $event)\"\r\n [placeholder]=\"$placeholderForScriptInput()\">\r\n </textarea>\r\n\r\n @if (!!$currentControl()?.evaluationMode) {\r\n <div class=\"button-group\">\r\n <button class=\"btn btn-secondary validate-btn\" (click)=\"validateScript($event)\">Validate with AI</button>\r\n <button class=\"btn btn-primary validate-btn\" (click)=\"generateScript()\">\r\n {{ $aiGeneratorOn() ? 'Hide AI Prompt Editor' : 'Show AI Prompt Editor' }}\r\n </button>\r\n </div>\r\n }\r\n\r\n @if ($aiGeneratorOn()) {\r\n <div class=\"sql-generator-panel\">\r\n <div class=\"alert alert-info\" style=\"margin-top: 1rem;\">\r\n <strong>SQL Generator:</strong> Describe what you want the script to do, and AI will generate SQL for you.\r\n </div>\r\n\r\n @if ($currentControl()?.evaluationMode==='sql-query') {\r\n <div class=\"sql-generator-panel mt-4\">\r\n <label class=\"fw-bold mb-2\">Select Related Tables</label>\r\n\r\n <core-sticker-collection\r\n [$enableFilter]=\"true\"\r\n [$items]=\"wfs.$workflowDbSchema()\"\r\n [$shownFrom]=\"'table'\"\r\n [$tooltipFrom]=\"'hintForAi'\"\r\n [$initialChecked]=\"[]\"\r\n ($checkedChange)=\"tableCheckedChange($event)\">\r\n </core-sticker-collection>\r\n\r\n </div>\r\n }\r\n\r\n @if (!!$currentControl()?.evaluationMode) {\r\n <textarea\r\n class=\"form-control\"\r\n style=\"min-height: 100px; margin-top: 0.5rem; border-radius: 8px;\"\r\n [(ngModel)]=\"$sqlPrompt\"\r\n placeholder=\"e.g., Calculate leave days between FROM_DATE and TO_DATE\">\r\n </textarea>\r\n\r\n <div class=\"mt-2 d-flex gap-2 justify-content-end\">\r\n <button class=\"btn btn-success\" (click)=\"submitScriptPrompt()\">\r\n Generate Script\r\n </button>\r\n </div>\r\n }\r\n\r\n @if ($generatedScript()) {\r\n <div class=\"generated-sql-box mt-3\">\r\n <label class=\"fw-bold\">Generated by AI:</label>\r\n <pre class=\"bg-light p-3 rounded\" style=\"white-space: pre-wrap;\">{{$generatedScript()}}</pre>\r\n <button class=\"btn btn-sm btn-primary mt-2\" (click)=\"applyGeneratedSql()\">Apply to Script</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"setting-row depends-on-row\">\r\n <label class=\"setting-label\">Depends On</label>\r\n <core-sticker-collection\r\n [$items]=\"$fields()\"\r\n [$shownFrom]=\"'field'\"\r\n [$initialChecked]=\"$currentControl()?.dependsOn || []\"\r\n ($checkedChange)=\"setControlProp('dependsOn', $event)\">\r\n </core-sticker-collection>\r\n </div>\r\n\r\n</div>\r\n\r\n", styles: [".setting-row{padding-bottom:50px}.button-group{margin-top:15px}.button-group button{height:35px;border-radius:17.5px;margin-right:8px}.setting-divider{margin:1.5rem 0 .75rem;color:#555;border-top:1px dashed #ccc;padding-top:.5rem}.evaluation-mode-row{background-color:#ffecb3;border-radius:8px;width:180px;height:110px;padding:15px}.evaluation-mode-row label{margin-bottom:8px}.script-row{margin-top:30px}\n"] }]
1031
+ ], template: "<div class=\"setting-group calculated-group\" [ngStyle]=\"{ padding: '15px' }\">\r\n\r\n <div class=\"setting-row evaluation-mode-row\">\r\n <label class=\"setting-label\">Evaluation Mode</label>\r\n <core-radio-group\r\n [options$]=\"radioOptions$\"\r\n [vertical]=\"true\"\r\n [gapY]=\"8\"\r\n [ngModel]=\"$currentControl()?.evaluationMode\"\r\n (ngModelChange)=\"setControlProp('evaluationMode', $event)\">\r\n </core-radio-group>\r\n </div>\r\n\r\n <div class=\"setting-row script-row\">\r\n <label class=\"setting-label\">Script {{ $beingValidated() ? 'is being validated...' : '' }}</label>\r\n <textarea\r\n [ngStyle]=\"{ minHeight: '150px', borderRadius: '8px' }\"\r\n [readonly]=\"!$currentControl()?.evaluationMode\"\r\n [disabled]=\"!$currentControl()?.evaluationMode\"\r\n class=\"form-control\"\r\n [class.form-control-disabled]=\"!$currentControl()?.evaluationMode\"\r\n rows=\"20\"\r\n [ngModel]=\"$currentControl()?.script\"\r\n (ngModelChange)=\"onScriptChange($event)\"\r\n [placeholder]=\"$placeholderForScriptInput()\">\r\n </textarea>\r\n @if (!!$sqlScriptError()) {\r\n <small class=\"text-danger\">{{ $sqlScriptError() }}</small>\r\n }\r\n \r\n\r\n @if (!!$currentControl()?.evaluationMode) {\r\n <div class=\"button-group\">\r\n <button class=\"btn btn-secondary validate-btn\" (click)=\"validateScript($event)\">Validate with AI</button>\r\n <button class=\"btn btn-primary validate-btn\" (click)=\"generateScript()\">\r\n {{ $aiGeneratorOn() ? 'Hide AI Prompt Editor' : 'Show AI Prompt Editor' }}\r\n </button>\r\n </div>\r\n }\r\n\r\n @if ($aiGeneratorOn()) {\r\n <div class=\"sql-generator-panel\">\r\n <div class=\"alert alert-info\" style=\"margin-top: 1rem;\">\r\n <strong>SQL Generator:</strong> Describe what you want the script to do, and AI will generate SQL for you.\r\n </div>\r\n\r\n @if ($currentControl()?.evaluationMode==='sql-query') {\r\n <div class=\"sql-generator-panel mt-4\">\r\n <label class=\"fw-bold mb-2\">Select Related Tables</label>\r\n\r\n <core-sticker-collection\r\n [$enableFilter]=\"true\"\r\n [$items]=\"wfs.$workflowDbSchema()\"\r\n [$shownFrom]=\"'table'\"\r\n [$tooltipFrom]=\"'hintForAi'\"\r\n [$initialChecked]=\"[]\"\r\n ($checkedChange)=\"tableCheckedChange($event)\">\r\n </core-sticker-collection>\r\n\r\n </div>\r\n }\r\n\r\n @if (!!$currentControl()?.evaluationMode) {\r\n <textarea\r\n class=\"form-control\"\r\n style=\"min-height: 100px; margin-top: 0.5rem; border-radius: 8px;\"\r\n [(ngModel)]=\"$sqlPrompt\"\r\n placeholder=\"e.g., Calculate leave days between FROM_DATE and TO_DATE\">\r\n </textarea>\r\n\r\n <div class=\"mt-2 d-flex gap-2 justify-content-end\">\r\n <button class=\"btn btn-success\" (click)=\"submitScriptPrompt()\">\r\n Generate Script\r\n </button>\r\n </div>\r\n }\r\n\r\n @if ($generatedScript()) {\r\n <div class=\"generated-sql-box mt-3\">\r\n <label class=\"fw-bold\">Generated by AI:</label>\r\n <pre class=\"bg-light p-3 rounded\" style=\"white-space: pre-wrap;\">{{$generatedScript()}}</pre>\r\n <button class=\"btn btn-sm btn-primary mt-2\" (click)=\"applyGeneratedSql()\">Apply to Script</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n <div class=\"setting-row depends-on-row\">\r\n <label class=\"setting-label\">Depends On</label>\r\n <core-sticker-collection\r\n [$items]=\"$fields()\"\r\n [$shownFrom]=\"'field'\"\r\n [$initialChecked]=\"$currentControl()?.dependsOn || []\"\r\n ($checkedChange)=\"setControlProp('dependsOn', $event)\">\r\n </core-sticker-collection>\r\n </div>\r\n\r\n <div class=\"setting-row return-type-row\">\r\n <label class=\"setting-label\">Return Type</label>\r\n <select\r\n class=\"form-control setting-input\"\r\n [ngModel]=\"$currentControl()?.returnType || 'number'\"\r\n (ngModelChange)=\"setControlProp('returnType', $event)\"\r\n >\r\n <option value=\"boolean\">Boolean</option>\r\n <option value=\"number\">Number</option>\r\n <option value=\"string\">String</option>\r\n <option value=\"number[]\">Number[]</option>\r\n <option value=\"string[]\">String[]</option>\r\n <!-- Omitting 'Date' and 'object' -->\r\n </select>\r\n </div>\r\n\r\n</div>\r\n\r\n", styles: [".setting-row{padding-bottom:50px}.button-group{margin-top:15px}.button-group button{height:35px;border-radius:17.5px;margin-right:8px}.setting-divider{margin:1.5rem 0 .75rem;color:#555;border-top:1px dashed #ccc;padding-top:.5rem}.evaluation-mode-row{background-color:#ffecb3;border-radius:8px;width:180px;height:110px;padding:15px}.evaluation-mode-row label{margin-bottom:8px}.script-row{margin-top:30px}\n"] }]
1013
1032
  }] });
1014
1033
 
1015
1034
  class FieldSettingComponent extends BaseComponent {
@@ -1889,4 +1908,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.5", ngImpor
1889
1908
  }], ctorParameters: () => [{ type: MultiLanguageService }] });
1890
1909
 
1891
1910
  export { CoreFormDesignComponent };
1892
- //# sourceMappingURL=ngx-histaff-alpha-core-form-design.component-C85pY2wo.mjs.map
1911
+ //# sourceMappingURL=ngx-histaff-alpha-core-form-design.component-NPdxlvdw.mjs.map