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.
- package/fesm2022/{ngx-histaff-alpha-ai-hint-for-table.component-Cwcf1M7W.mjs → ngx-histaff-alpha-ai-hint-for-table.component-CLyzbLC7.mjs} +3 -3
- 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
- package/fesm2022/{ngx-histaff-alpha-core-form-design.component-C85pY2wo.mjs → ngx-histaff-alpha-core-form-design.component-NPdxlvdw.mjs} +33 -14
- package/fesm2022/ngx-histaff-alpha-core-form-design.component-NPdxlvdw.mjs.map +1 -0
- package/fesm2022/{ngx-histaff-alpha-core-sticker-collection.component-CJZbjexO.mjs → ngx-histaff-alpha-core-sticker-collection.component-BxDB5uWA.mjs} +3 -3
- package/fesm2022/{ngx-histaff-alpha-core-sticker-collection.component-CJZbjexO.mjs.map → ngx-histaff-alpha-core-sticker-collection.component-BxDB5uWA.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-ew1UR2KC.mjs → ngx-histaff-alpha-core-toast-loading.component-BR6wSLm9.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-core-toast-loading.component-ew1UR2KC.mjs.map → ngx-histaff-alpha-core-toast-loading.component-BR6wSLm9.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-CrwvYZb4.mjs → ngx-histaff-alpha-core-workflow-consume.component-DCncWQCx.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-core-workflow-consume.component-CrwvYZb4.mjs.map → ngx-histaff-alpha-core-workflow-consume.component-DCncWQCx.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-db-settings.component--0dikeQu.mjs → ngx-histaff-alpha-db-settings.component-1p7ke3vT.mjs} +5 -5
- package/fesm2022/{ngx-histaff-alpha-db-settings.component--0dikeQu.mjs.map → ngx-histaff-alpha-db-settings.component-1p7ke3vT.mjs.map} +1 -1
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.component-DMCmlkIr.mjs → ngx-histaff-alpha-design-wrapper.component-D37Jpz_7.mjs} +137 -46
- package/fesm2022/ngx-histaff-alpha-design-wrapper.component-D37Jpz_7.mjs.map +1 -0
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-DSqd0X45.mjs → ngx-histaff-alpha-design-wrapper.route-41-Uhx-c.mjs} +5 -5
- package/fesm2022/{ngx-histaff-alpha-design-wrapper.route-DSqd0X45.mjs.map → ngx-histaff-alpha-design-wrapper.route-41-Uhx-c.mjs.map} +1 -1
- package/fesm2022/ngx-histaff-alpha-live-form.component-B2BGEY9X.mjs +592 -0
- package/fesm2022/ngx-histaff-alpha-live-form.component-B2BGEY9X.mjs.map +1 -0
- package/fesm2022/{ngx-histaff-alpha-ngx-histaff-alpha-Dnk7Lx_f.mjs → ngx-histaff-alpha-ngx-histaff-alpha-DHgOJCW6.mjs} +220 -135
- package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-DHgOJCW6.mjs.map +1 -0
- package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-B0Y7tFHv.mjs → ngx-histaff-alpha-wf-form-assign.component-Vk580Um8.mjs} +2 -2
- package/fesm2022/{ngx-histaff-alpha-wf-form-assign.component-B0Y7tFHv.mjs.map → ngx-histaff-alpha-wf-form-assign.component-Vk580Um8.mjs.map} +1 -1
- package/fesm2022/ngx-histaff-alpha.mjs +1 -1
- package/lib/app/libraries/core-control-value-only/core-control-value-only.component.d.ts +2 -0
- package/lib/app/libraries/core-employee-seeker/core-employee-seeker/core-employee-seeker.component.d.ts +1 -2
- package/lib/app/libraries/core-form/core-form/enum-interfaces.d.ts +2 -0
- package/lib/app/libraries/core-form-control-seeker/core-form-control-seeker/core-form-control-seeker.component.d.ts +2 -0
- package/lib/app/libraries/core-form-design/field-setting/calculated-props/calculated-props.component.d.ts +11 -8
- package/lib/app/libraries/core-param-control/core-param-control/core-param-control.component.d.ts +5 -2
- package/lib/app/libraries/core-param-control/core-param-control.service.d.ts +8 -0
- package/lib/app/libraries/core-table/core-table.component.d.ts +3 -2
- package/lib/app/libraries/core-workflow-builder/constants/FALLBACK_ACTOR_ASSIGNMENT.d.ts +2 -0
- package/lib/app/libraries/core-workflow-builder/core-workflow.service.d.ts +10 -5
- package/lib/app/libraries/core-workflow-builder/interfaces/IActorAssignment.d.ts +0 -1
- package/lib/app/libraries/core-workflow-builder/interfaces/ICalculatedField.d.ts +1 -0
- package/lib/app/libraries/core-workflow-builder/interfaces/IGenerateWorkflowRoutingRequest.d.ts +1 -1
- package/lib/app/libraries/core-workflow-builder/interfaces/IPlannedActor.d.ts +1 -0
- package/lib/app/libraries/core-workflow-builder/interfaces/IResolvedStepRouting.d.ts +7 -2
- package/lib/app/libraries/core-workflow-builder/interfaces/IRoutingStep.d.ts +2 -2
- package/lib/app/libraries/core-workflow-builder/interfaces/IStepConfig.d.ts +5 -29
- package/lib/app/libraries/core-workflow-builder/routing-preview/routing-preview.component.d.ts +6 -0
- package/lib/app/libraries/core-workflow-builder/routing-preview-panel/routing-preview-panel.component.d.ts +0 -2
- package/lib/app/libraries/core-workflow-builder/types/RoutingStepLogic.d.ts +1 -1
- package/lib/app/libraries/core-workflow-builder/types/RoutingStepType.d.ts +1 -1
- 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
- package/lib/app/libraries/staffprofile/staffprofile.component.d.ts +4 -2
- package/package.json +1 -1
- package/fesm2022/ngx-histaff-alpha-core-form-design.component-C85pY2wo.mjs.map +0 -1
- package/fesm2022/ngx-histaff-alpha-design-wrapper.component-DMCmlkIr.mjs.map +0 -1
- package/fesm2022/ngx-histaff-alpha-live-form.component-CqR81N-A.mjs +0 -601
- package/fesm2022/ngx-histaff-alpha-live-form.component-CqR81N-A.mjs.map +0 -1
- package/fesm2022/ngx-histaff-alpha-ngx-histaff-alpha-Dnk7Lx_f.mjs.map +0 -1
- 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-
|
|
6
|
-
import { D as DbService } from './ngx-histaff-alpha-core-toast-loading.component-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
11
|
-
import { D as DbService, C as CoreToastLoadingComponent } from './ngx-histaff-alpha-core-toast-loading.component-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)=\"
|
|
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)=\"
|
|
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-
|
|
1911
|
+
//# sourceMappingURL=ngx-histaff-alpha-core-form-design.component-NPdxlvdw.mjs.map
|