ngx-t-forms 2.0.23 → 2.0.24

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 (60) hide show
  1. package/fesm2022/{ngx-t-forms-calculated-field-rules.component-BdDN7YwK.mjs → ngx-t-forms-calculated-field-rules.component-BUKzXsXn.mjs} +12 -12
  2. package/fesm2022/{ngx-t-forms-calculated-field-rules.component-BdDN7YwK.mjs.map → ngx-t-forms-calculated-field-rules.component-BUKzXsXn.mjs.map} +1 -1
  3. package/fesm2022/{ngx-t-forms-chip-options-creator-editor.component-DVhV4izc.mjs → ngx-t-forms-chip-options-creator-editor.component-C00n6tFs.mjs} +4 -4
  4. package/fesm2022/{ngx-t-forms-chip-options-creator-editor.component-DVhV4izc.mjs.map → ngx-t-forms-chip-options-creator-editor.component-C00n6tFs.mjs.map} +1 -1
  5. package/fesm2022/{ngx-t-forms-config-mscoa-additional-inputs.component-BTUnZ1q1.mjs → ngx-t-forms-config-mscoa-additional-inputs.component-DtfUKZL-.mjs} +8 -8
  6. package/fesm2022/{ngx-t-forms-config-mscoa-additional-inputs.component-BTUnZ1q1.mjs.map → ngx-t-forms-config-mscoa-additional-inputs.component-DtfUKZL-.mjs.map} +1 -1
  7. package/fesm2022/{ngx-t-forms-data-source-picker.component-DcpGy7kq.mjs → ngx-t-forms-data-source-picker.component-BBEQuzn2.mjs} +7 -7
  8. package/fesm2022/{ngx-t-forms-data-source-picker.component-DcpGy7kq.mjs.map → ngx-t-forms-data-source-picker.component-BBEQuzn2.mjs.map} +1 -1
  9. package/fesm2022/{ngx-t-forms-document-list-label-config-editor.component-Bdfd5ik4.mjs → ngx-t-forms-document-list-label-config-editor.component-D6kwe89h.mjs} +7 -7
  10. package/fesm2022/{ngx-t-forms-document-list-label-config-editor.component-Bdfd5ik4.mjs.map → ngx-t-forms-document-list-label-config-editor.component-D6kwe89h.mjs.map} +1 -1
  11. package/fesm2022/{ngx-t-forms-form-input-selector.component-n88ExFxv.mjs → ngx-t-forms-form-input-selector.component-CniLZN1h.mjs} +6 -6
  12. package/fesm2022/{ngx-t-forms-form-input-selector.component-n88ExFxv.mjs.map → ngx-t-forms-form-input-selector.component-CniLZN1h.mjs.map} +1 -1
  13. package/fesm2022/{ngx-t-forms-form-json-view.component-Bm-k704L.mjs → ngx-t-forms-form-json-view.component-bnjkxqgV.mjs} +2 -2
  14. package/fesm2022/{ngx-t-forms-form-json-view.component-Bm-k704L.mjs.map → ngx-t-forms-form-json-view.component-bnjkxqgV.mjs.map} +1 -1
  15. package/fesm2022/{ngx-t-forms-form-section-stepper.component-BGu2CX3r.mjs → ngx-t-forms-form-section-stepper.component-DFbYNeAi.mjs} +6 -6
  16. package/fesm2022/{ngx-t-forms-form-section-stepper.component-BGu2CX3r.mjs.map → ngx-t-forms-form-section-stepper.component-DFbYNeAi.mjs.map} +1 -1
  17. package/fesm2022/{ngx-t-forms-forms-builder-menu.component-Brj72jZP.mjs → ngx-t-forms-forms-builder-menu.component-DBEgmcSi.mjs} +12 -12
  18. package/fesm2022/{ngx-t-forms-forms-builder-menu.component-Brj72jZP.mjs.map → ngx-t-forms-forms-builder-menu.component-DBEgmcSi.mjs.map} +1 -1
  19. package/fesm2022/{ngx-t-forms-input-editor.component-BqRBvrQe.mjs → ngx-t-forms-input-editor.component-BBP90B_e.mjs} +8 -8
  20. package/fesm2022/{ngx-t-forms-input-editor.component-BqRBvrQe.mjs.map → ngx-t-forms-input-editor.component-BBP90B_e.mjs.map} +1 -1
  21. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-CQ76110I.mjs +103 -0
  22. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-CQ76110I.mjs.map +1 -0
  23. package/fesm2022/{ngx-t-forms-mat-slider-editor.component-CnnC8-nJ.mjs → ngx-t-forms-mat-slider-editor.component-CIiYyxkb.mjs} +2 -2
  24. package/fesm2022/{ngx-t-forms-mat-slider-editor.component-CnnC8-nJ.mjs.map → ngx-t-forms-mat-slider-editor.component-CIiYyxkb.mjs.map} +1 -1
  25. package/fesm2022/{ngx-t-forms-mat-slider-toggle-editor.component-B8O9Xn4R.mjs → ngx-t-forms-mat-slider-toggle-editor.component-DDR2JurF.mjs} +2 -2
  26. package/fesm2022/{ngx-t-forms-mat-slider-toggle-editor.component-B8O9Xn4R.mjs.map → ngx-t-forms-mat-slider-toggle-editor.component-DDR2JurF.mjs.map} +1 -1
  27. package/fesm2022/{ngx-t-forms-missing-form-configs.component-CXIOm7OT.mjs → ngx-t-forms-missing-form-configs.component-CYN9mVz9.mjs} +6 -6
  28. package/fesm2022/{ngx-t-forms-missing-form-configs.component-CXIOm7OT.mjs.map → ngx-t-forms-missing-form-configs.component-CYN9mVz9.mjs.map} +1 -1
  29. package/fesm2022/{ngx-t-forms-mscoa-segment-config.component-B0I2X92a.mjs → ngx-t-forms-mscoa-segment-config.component-C9zKzzzX.mjs} +9 -9
  30. package/fesm2022/{ngx-t-forms-mscoa-segment-config.component-B0I2X92a.mjs.map → ngx-t-forms-mscoa-segment-config.component-C9zKzzzX.mjs.map} +1 -1
  31. package/fesm2022/{ngx-t-forms-ngx-t-forms-BYmto56R.mjs → ngx-t-forms-ngx-t-forms-DwsbmVlY.mjs} +622 -154
  32. package/fesm2022/ngx-t-forms-ngx-t-forms-DwsbmVlY.mjs.map +1 -0
  33. package/fesm2022/{ngx-t-forms-pipeline-generator.component-T4_0xqeE.mjs → ngx-t-forms-pipeline-generator.component-CGKxfvvC.mjs} +14 -14
  34. package/fesm2022/{ngx-t-forms-pipeline-generator.component-T4_0xqeE.mjs.map → ngx-t-forms-pipeline-generator.component-CGKxfvvC.mjs.map} +1 -1
  35. package/fesm2022/{ngx-t-forms-required-inputs.component-C5iwMGil.mjs → ngx-t-forms-required-inputs.component-Bktx1QGr.mjs} +9 -9
  36. package/fesm2022/{ngx-t-forms-required-inputs.component-C5iwMGil.mjs.map → ngx-t-forms-required-inputs.component-Bktx1QGr.mjs.map} +1 -1
  37. package/fesm2022/{ngx-t-forms-rest-api-call-setup.component-C4zwQqzh.mjs → ngx-t-forms-rest-api-call-setup.component-BcItch1n.mjs} +8 -8
  38. package/fesm2022/{ngx-t-forms-rest-api-call-setup.component-C4zwQqzh.mjs.map → ngx-t-forms-rest-api-call-setup.component-BcItch1n.mjs.map} +1 -1
  39. package/fesm2022/{ngx-t-forms-section-report.component-B5TrrkeO.mjs → ngx-t-forms-section-report.component-Cn_oWXBX.mjs} +5 -5
  40. package/fesm2022/{ngx-t-forms-section-report.component-B5TrrkeO.mjs.map → ngx-t-forms-section-report.component-Cn_oWXBX.mjs.map} +1 -1
  41. package/fesm2022/{ngx-t-forms-selection-options-editor.component-ClzCcmlC.mjs → ngx-t-forms-selection-options-editor.component-Cc41XG4s.mjs} +8 -8
  42. package/fesm2022/{ngx-t-forms-selection-options-editor.component-ClzCcmlC.mjs.map → ngx-t-forms-selection-options-editor.component-Cc41XG4s.mjs.map} +1 -1
  43. package/fesm2022/ngx-t-forms-t-workflow-picker.component-CezFgp2z.mjs +171 -0
  44. package/fesm2022/ngx-t-forms-t-workflow-picker.component-CezFgp2z.mjs.map +1 -0
  45. package/fesm2022/{ngx-t-forms-validators-config.component-B9kfcaSm.mjs → ngx-t-forms-validators-config.component-4Iy5uJj3.mjs} +9 -9
  46. package/fesm2022/{ngx-t-forms-validators-config.component-B9kfcaSm.mjs.map → ngx-t-forms-validators-config.component-4Iy5uJj3.mjs.map} +1 -1
  47. package/fesm2022/ngx-t-forms.mjs +1 -1
  48. package/lib/components/forms/forms.component.d.ts +1 -1
  49. package/lib/components/t-dynamic-data-edit/elements/mat-chip-list-editor/mat-chip-list-editor.component.d.ts +3 -0
  50. package/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/elements/point-assignment-dialog/point-assignment-dialog.component.d.ts +41 -0
  51. package/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/point-assignment.component.d.ts +40 -28
  52. package/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/elements/submission-review-dialog/submission-review-dialog.component.d.ts +27 -0
  53. package/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/submission-review.component.d.ts +6 -11
  54. package/lib/components/t-form-input/elements/workflow-adjudication/elements/supplier-selection/supplier-selection.component.d.ts +33 -0
  55. package/package.json +2 -2
  56. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DRMTdPwU.mjs +0 -95
  57. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DRMTdPwU.mjs.map +0 -1
  58. package/fesm2022/ngx-t-forms-ngx-t-forms-BYmto56R.mjs.map +0 -1
  59. package/fesm2022/ngx-t-forms-t-workflow-picker.component-C1t8oH9s.mjs +0 -171
  60. package/fesm2022/ngx-t-forms-t-workflow-picker.component-C1t8oH9s.mjs.map +0 -1
@@ -6,23 +6,23 @@ import * as i1 from '@angular/forms';
6
6
  import { Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
7
7
  import { Subscription, debounceTime, BehaviorSubject, switchMap, map, take, catchError, finalize, throwError, tap, combineLatest, filter, Subject, takeUntil, distinctUntilChanged } from 'rxjs';
8
8
  import PipelineBuilder from 'db-aggregation-pipeline-builder';
9
- import { M as MatModulesModule, N as NGX_T_FORMS_CONFIG_TOKEN, b as TDynamicDataViewComponent, D as DaysAgoPipe } from './ngx-t-forms-ngx-t-forms-BYmto56R.mjs';
10
- import * as i5 from '@angular/material/icon';
11
- import * as i1$1 from '@angular/material/autocomplete';
12
- import * as i2$1 from '@angular/material/button';
13
- import * as i3 from '@angular/material/card';
9
+ import { M as MatModulesModule, N as NGX_T_FORMS_CONFIG_TOKEN, b as TDynamicDataViewComponent, D as DaysAgoPipe } from './ngx-t-forms-ngx-t-forms-DwsbmVlY.mjs';
10
+ import * as i3 from '@angular/material/icon';
11
+ import * as i2$1 from '@angular/material/autocomplete';
12
+ import * as i2$2 from '@angular/material/button';
13
+ import * as i3$1 from '@angular/material/card';
14
14
  import * as i4 from '@angular/material/divider';
15
- import * as i3$1 from '@angular/material/select';
15
+ import * as i3$2 from '@angular/material/select';
16
16
  import * as i8 from '@angular/material/tooltip';
17
- import { TWorkflowPickerComponent } from './ngx-t-forms-t-workflow-picker.component-C1t8oH9s.mjs';
17
+ import { TWorkflowPickerComponent } from './ngx-t-forms-t-workflow-picker.component-CezFgp2z.mjs';
18
18
  import { MatFormFieldControl } from '@angular/material/form-field';
19
19
  import { HttpClient } from '@angular/common/http';
20
- import * as i11 from '@angular/cdk/overlay';
20
+ import * as i10 from '@angular/cdk/overlay';
21
21
  import { OverlayModule } from '@angular/cdk/overlay';
22
- import * as i5$1 from '@angular/material/expansion';
22
+ import * as i5 from '@angular/material/expansion';
23
23
  import * as i6 from '@angular/material/list';
24
24
  import * as i7 from '@angular/material/progress-spinner';
25
- import * as i9 from '@angular/material/toolbar';
25
+ import * as i8$1 from '@angular/material/toolbar';
26
26
 
27
27
  class JsonEditorComponent {
28
28
  constructor(fb) {
@@ -102,7 +102,7 @@ class JsonEditorComponent {
102
102
  return value.substring(start, end);
103
103
  }
104
104
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JsonEditorComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
105
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: JsonEditorComponent, isStandalone: true, selector: "app-json-editor", inputs: { value: "value" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"json-editor-container\">\n <div *ngIf=\"jsonForm.invalid\" \n style=\"margin-top: 16px;\"\n class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span> Paste or type JSON below. The editor will auto-beautify the text.</span>\n </div>\n\n\n \n <!-- Error message if JSON is invalid -->\n <div *ngIf=\"errorMessage\" \n \n style=\"\" class=\"tree-instructions json-error \">\n <span> {{errorMessage}}</span>\n </div>\n \n <form [formGroup]=\"jsonForm\">\n <textarea\n formControlName=\"jsonText\"\n class=\"json-textarea\"\n [class.error-message]=\"errorMessage\"\n rows=\"15\"\n placeholder=\"Enter your JSON here...\"></textarea>\n </form>\n <!-- JSON Textarea -->\n\n</div>\n", styles: [".json-editor-container{max-width:800px;margin:0 auto;border-radius:5px}.json-editor-container h1{font-size:24px;color:#333}.json-editor-container .lead{font-size:.9 rem;margin-bottom:10px;padding-left:16px}.json-editor-container .json-textarea{width:calc(100% - 24px);padding:12px;font-size:14px;color:#333;background-color:#fff;border:1px solid #ccc;border-radius:5px;font-family:Courier New,Courier,monospace}.json-editor-container .json-textarea:focus{outline:none;border-color:var(--ion-color-primary)}.error-message{border:solid 1px #e74c3c!important}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;border-radius:4px;margin-bottom:0;background:azure}.json-error{background:inherit;color:#e74c3c;margin-bottom:4px}.info-icon{width:38px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
105
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: JsonEditorComponent, isStandalone: true, selector: "app-json-editor", inputs: { value: "value" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"json-editor-container\">\n <div *ngIf=\"jsonForm.invalid\" \n style=\"margin-top: 16px;\"\n class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span> Paste or type JSON below. The editor will auto-beautify the text.</span>\n </div>\n\n\n \n <!-- Error message if JSON is invalid -->\n <div *ngIf=\"errorMessage\" \n \n style=\"\" class=\"tree-instructions json-error \">\n <span> {{errorMessage}}</span>\n </div>\n \n <form [formGroup]=\"jsonForm\">\n <textarea\n formControlName=\"jsonText\"\n class=\"json-textarea\"\n [class.error-message]=\"errorMessage\"\n rows=\"15\"\n placeholder=\"Enter your JSON here...\"></textarea>\n </form>\n <!-- JSON Textarea -->\n\n</div>\n", styles: [".json-editor-container{max-width:800px;margin:0 auto;border-radius:5px}.json-editor-container h1{font-size:24px;color:#333}.json-editor-container .lead{font-size:.9 rem;margin-bottom:10px;padding-left:16px}.json-editor-container .json-textarea{width:calc(100% - 24px);padding:12px;font-size:14px;color:#333;background-color:#fff;border:1px solid #ccc;border-radius:5px;font-family:Courier New,Courier,monospace}.json-editor-container .json-textarea:focus{outline:none;border-color:var(--ion-color-primary)}.error-message{border:solid 1px #e74c3c!important}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;border-radius:4px;margin-bottom:0;background:azure}.json-error{background:inherit;color:#e74c3c;margin-bottom:4px}.info-icon{width:38px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
106
106
  }
107
107
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JsonEditorComponent, decorators: [{
108
108
  type: Component,
@@ -212,7 +212,7 @@ class AggregateStageEditorComponent {
212
212
  this.deleteStage.emit();
213
213
  }
214
214
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AggregateStageEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
215
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: AggregateStageEditorComponent, isStandalone: true, selector: "app-aggregate-stage-editor", inputs: { selectedStage: "selectedStage", isRunningPipeline: "isRunningPipeline" }, outputs: { saveStage: "saveStage", deleteStage: "deleteStage" }, ngImport: i0, template: "<mat-card style=\"margin-bottom:8px\">\n <mat-card-content>\n\n <h5>\n Aggregate Pipeline Stage Configuration\n </h5>\n\n\n\n <mat-form-field style=\" margin-bottom: 8px;\" appearance=\"outline\" subscriptSizing=\"dynamic\" >\n <mat-label>Select Aggregate Stage</mat-label>\n <mat-select matNativeControl [value]=\"selectedStage?.name\" (selectionChange)=\"handleChange($event)\"\n placeholder=\"ChooseFunctionToRun\">\n <mat-option *ngFor=\"let stage of allowedStages; trackBy: trackByStage\" [value]=\"stage.stage\">\n {{stage.stage}}</mat-option>\n\n\n\n </mat-select>\n <mat-hint>\n {{activeDescription ?\n 'Hover over the info icon to view stage details .'\n : 'Please select an aggregation function from the list.'}}\n </mat-hint>\n <mat-hint *ngIf=\"activeDescription\" align=\"end\">\n <mat-icon matTooltipHideDelay=\"1000\" [matTooltip]=\"activeDescription\" matSuffix>info</mat-icon>\n </mat-hint>\n </mat-form-field>\n\n\n\n <div class=\"tree-instructions\" style=\"background: cornsilk;\" *ngIf=\"configValidationError\">\n <mat-icon style=\"margin-top: 4px;margin-bottom:auto\" class=\"info-icon\" color=\"warn\">warning</mat-icon>\n <span>{{ configValidationError }}</span>\n </div>\n\n\n\n\n\n <div class=\"config-container\" *ngIf=\"activeStage ||selectedStage?.config\">\n <app-json-editor [value]=\"selectedStage?.config\" (valueChange)=\"handleConfigChange($event)\"></app-json-editor>\n </div>\n\n <br>\n\n\n\n </mat-card-content>\n <mat-divider>\n </mat-divider>\n <mat-card-actions>\n\n <span class=\"spacer\"></span>\n <button color=\"warn\" [disabled]=\"isRunningPipeline\" mat-button (click)=\"deleteActive()\">\n Delete\n <mat-icon >delete</mat-icon>\n </button>\n <button style=\"margin-left:8px;\" color=\"primary\" mat-flat-button (click)=\"saveConfiguration()\"\n [disabled]=\"isRunningPipeline ||!activeStage?.valid \">\n Save\n <mat-icon> save</mat-icon>\n </button>\n </mat-card-actions>\n</mat-card>", styles: [".title-icon{margin-right:8px;vertical-align:middle}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:var(--mdc-elevated-card-container-color, var(--mat-app-surface-container-low));border-radius:4px;margin-bottom:16px}.info-icon{min-width:38px!important;display:block}mat-form-field{min-width:100%;background:azure}.stageDescription{background:azure}.stage-button-container{display:flex;gap:4px;width:fit-content;align-items:center}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:azure;border-radius:4px;margin-bottom:16px}.info-icon{min-width:38px;margin:8px auto auto}\n"], dependencies: [{ kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i1$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i2$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i3$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: JsonEditorComponent, selector: "app-json-editor", inputs: ["value"], outputs: ["valueChange"] }] }); }
215
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: AggregateStageEditorComponent, isStandalone: true, selector: "app-aggregate-stage-editor", inputs: { selectedStage: "selectedStage", isRunningPipeline: "isRunningPipeline" }, outputs: { saveStage: "saveStage", deleteStage: "deleteStage" }, ngImport: i0, template: "<mat-card style=\"margin-bottom:8px\">\n <mat-card-content>\n\n <h5>\n Aggregate Pipeline Stage Configuration\n </h5>\n\n\n\n <mat-form-field style=\" margin-bottom: 8px;\" appearance=\"outline\" subscriptSizing=\"dynamic\" >\n <mat-label>Select Aggregate Stage</mat-label>\n <mat-select matNativeControl [value]=\"selectedStage?.name\" (selectionChange)=\"handleChange($event)\"\n placeholder=\"ChooseFunctionToRun\">\n <mat-option *ngFor=\"let stage of allowedStages; trackBy: trackByStage\" [value]=\"stage.stage\">\n {{stage.stage}}</mat-option>\n\n\n\n </mat-select>\n <mat-hint>\n {{activeDescription ?\n 'Hover over the info icon to view stage details .'\n : 'Please select an aggregation function from the list.'}}\n </mat-hint>\n <mat-hint *ngIf=\"activeDescription\" align=\"end\">\n <mat-icon matTooltipHideDelay=\"1000\" [matTooltip]=\"activeDescription\" matSuffix>info</mat-icon>\n </mat-hint>\n </mat-form-field>\n\n\n\n <div class=\"tree-instructions\" style=\"background: cornsilk;\" *ngIf=\"configValidationError\">\n <mat-icon style=\"margin-top: 4px;margin-bottom:auto\" class=\"info-icon\" color=\"warn\">warning</mat-icon>\n <span>{{ configValidationError }}</span>\n </div>\n\n\n\n\n\n <div class=\"config-container\" *ngIf=\"activeStage ||selectedStage?.config\">\n <app-json-editor [value]=\"selectedStage?.config\" (valueChange)=\"handleConfigChange($event)\"></app-json-editor>\n </div>\n\n <br>\n\n\n\n </mat-card-content>\n <mat-divider>\n </mat-divider>\n <mat-card-actions>\n\n <span class=\"spacer\"></span>\n <button color=\"warn\" [disabled]=\"isRunningPipeline\" mat-button (click)=\"deleteActive()\">\n Delete\n <mat-icon >delete</mat-icon>\n </button>\n <button style=\"margin-left:8px;\" color=\"primary\" mat-flat-button (click)=\"saveConfiguration()\"\n [disabled]=\"isRunningPipeline ||!activeStage?.valid \">\n Save\n <mat-icon> save</mat-icon>\n </button>\n </mat-card-actions>\n</mat-card>", styles: [".title-icon{margin-right:8px;vertical-align:middle}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:var(--mdc-elevated-card-container-color, var(--mat-app-surface-container-low));border-radius:4px;margin-bottom:16px}.info-icon{min-width:38px!important;display:block}mat-form-field{min-width:100%;background:azure}.stageDescription{background:azure}.stage-button-container{display:flex;gap:4px;width:fit-content;align-items:center}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:azure;border-radius:4px;margin-bottom:16px}.info-icon{min-width:38px;margin:8px auto auto}\n"], dependencies: [{ kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i2$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i2$2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3$1.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i3$1.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i3$2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: JsonEditorComponent, selector: "app-json-editor", inputs: ["value"], outputs: ["valueChange"] }] }); }
216
216
  }
217
217
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AggregateStageEditorComponent, decorators: [{
218
218
  type: Component,
@@ -686,7 +686,7 @@ class PipelineGeneratorComponent {
686
686
  this.setActiveStage(undefined);
687
687
  }
688
688
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PipelineGeneratorComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
689
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: PipelineGeneratorComponent, isStandalone: true, selector: "app-pipeline-generator", inputs: { disabled: "disabled", value: "value", getWorkflowOptions: "getWorkflowOptions", userName: "userName", errors: "errors" }, outputs: { valueChanged: "valueChanged" }, host: { properties: { "id": "this.id" } }, providers: [{ provide: MatFormFieldControl, useExisting: PipelineGeneratorComponent }], viewQueries: [{ propertyName: "textareaElementRef", first: true, predicate: ["textarea"], descendants: true, read: ElementRef }], ngImport: i0, template: "\n\n\n<section class=\"ion-margin\">\n <p>MongoDB aggregation pipeline builder for selected workflows. </p>\n</section>\n<lib-t-workflow-picker \n(valueChanged)=\"workflowChanged($event)\" \n[getWorkflowOptions]=\" workflows$\"\n [value]=\"(workflowId|async)||undefined\">\n</lib-t-workflow-picker>\n<mat-accordion multi *ngIf=\"workflowId|async\">\n <!-- Pipeline Accordion -->\n <mat-expansion-panel value=\"pipeline\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner color=\"accent\" *ngIf=\"isRunningPipeline\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">\n dynamic_form\n </mat-icon>\n {{isRunningPipeline?'Executing current Data pipeline...':'Data retrieval pipeline'}}\n </mat-panel-title>\n\n </mat-expansion-panel-header>\n <div class=\"content\">\n <!-- Mongodb aggregate pipelione stages management and edit start-->\n <div *ngIf=\"((stages | async)?.length || 0) ===0\" class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>\n Add stages to the pipeline below.<br>\n Each stage processes input documents by filtering, grouping, or calculating values. The output documents from\n one stage are passed to the next stage in the pipeline.\n </span>\n </div>\n\n <mat-nav-list style=\" background: var(--mat-tree-container-background-color);padding:0px;border-radius:8px\">\n\n\n <ng-container *ngFor=\"let stage of stages | async; trackBy: trackById;index as $index;last as isLast\">\n <mat-list-item [style.margin-top]=\"(activeStageIndex|async) ===$index?'4px':'0px'\"\n [class.mat-elevation-z8]=\"(activeStageIndex|async) ===$index\" class=\"stage-item\"\n (click)=\"setActiveStage($index)\" [activated]=\" (activeStageIndex|async) ===$index\">\n <span class=\"stage-index\" matListItemAvatar>{{$index + 1}} </span>\n <div matListItemTitle>\n <div style=\"line-height: normal;\">\n {{ stage.name || 'Stage ' }}\n </div>\n <div class=\"stage-inner-message\" *ngIf=\"!stage.name && (activeStageIndex|async) !==$index \">\n Incomplete , click to edit\n </div>\n\n </div>\n\n <button *ngIf=\"(activeStageIndex|async) ===$index||!stage.valid && (activeStageIndex|async) !==$index\"\n mat-icon-button matListItemMeta>\n <mat-icon color=\"primary\" *ngIf=\"(activeStageIndex|async) ===$index\">check_circle</mat-icon>\n\n <mat-icon color=\"warn\" *ngIf=\"!stage.valid && (activeStageIndex|async) !==$index\">\n warning\n </mat-icon>\n </button>\n </mat-list-item>\n <mat-divider></mat-divider>\n\n <app-aggregate-stage-editor [selectedStage]=\"stage\" [isRunningPipeline]=\"isRunningPipeline\"\n (deleteStage)=\"deleteStage($index)\" (saveStage)=\"saveStage($index,$event)\"\n *ngIf=\"(activeStageIndex|async) ===$index\"></app-aggregate-stage-editor>\n\n\n </ng-container>\n\n <mat-toolbar style=\"padding: 0px;\">\n\n <span class=\"spacer\"></span>\n <button class=\"stage-button\" [disabled]=\"isRunningPipeline\" color=\"primary\" (click)=\"addStage()\"\n mat-raised-button>\n Add\n <mat-icon>add</mat-icon>\n </button>\n </mat-toolbar>\n </mat-nav-list>\n\n <!-- Mongodb aggregate pipelione stages management and edit end -->\n </div>\n </mat-expansion-panel>\n\n <!-- Results Accordion -->\n <mat-expansion-panel value=\"results\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner color=\"accent\" *ngIf=\"isRunningPipeline\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">dataset</mat-icon>\n {{isRunningPipeline?'Running pipeline...':'Data Results'}}\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"content\">\n <ng-container *ngIf=\"pipeLineResults | async as results; else noResults\">\n\n <lib-t-dynamic-data-view *ngIf=\"results\" [data]=\"results\"></lib-t-dynamic-data-view>\n <p *ngIf=\"!results\" color=\"medium\">\n\n No results available\n\n </p>\n\n </ng-container>\n <ng-template #noResults>\n <p color=\"medium\">No results available</p>\n </ng-template>\n </div>\n </mat-expansion-panel>\n\n <!-- AI Agent Accordion -->\n <mat-expansion-panel value=\"ai\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner *ngIf=\" aiIsGeneratingPipeline \" style=\"position: absolute;\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">tips_and_updates</mat-icon>\n {{ aiIsGeneratingPipeline ? 'Agent busy ...' : 'AI AGENT prompt' }}\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n @if( schemaLoadError$ | async){\n <div class=\"tree-instructions\" style=\"background: antiquewhite !important;\">\n <mat-icon class=\"info-icon\" color=\"warn\">error</mat-icon>\n <span> {{ schemaLoadError$ | async }}</span>\n </div>\n \n }\n <mat-list *ngFor=\"let chat of chatHistory|async;\">\n\n <mat-list-item class=\"chatContent chatItem\">\n <div class=\"chat\" style=\"background:bisque;text-align:end;\n border-radius: 18px 18px 0px 18px;\" matListItemTitle>\n <div>\n {{chat.user}}\n </div>\n <div style=\"opacity:0.6;line-height: normal;display: flex;align-items: center;justify-content: flex-end;\">\n {{chat.date|daysAgo}}\n <mat-icon class=\"sent-icon\">\n done_all\n </mat-icon>\n </div>\n </div>\n </mat-list-item>\n\n <mat-list-item style=\"margin-top: 16px;\" class=\"chatContent chatItem\" color=\"light\" lines=\"full\">\n <mat-icon style=\" margin-left: 0px;\n margin-top: 16px;\n margin-bottom: auto;\" matListItemIcon>smart_toy</mat-icon>\n <div class=\"chat\" style=\"text-align: left; \n padding-left: 16px; \n background: azure;\n border-radius: 0px 18px 18px 18px;\" *ngIf=\"!chat.assistance?.error\" matListItemTitle>\n <pre>\n {{chat. assistance.pipeline |json}}\n </pre>\n </div>\n <div *ngIf=\"chat.assistance?.error\" matListItemTitle>\n {{chat.assistance.error}}\n </div>\n </mat-list-item>\n\n\n </mat-list>\n <mat-list>\n <mat-list-item class=\"chatContent chatItem\">\n <textarea matListItemTitle #textarea style=\" width: calc(100% - 13px);\n border-radius: 14px;\n padding-right: 3px;\n padding-left: 8px;\" class=\"chat\" [value]=\" prompt|async\" (input)=\"onTextChange($event)\"\n placeholder=\"Provide a pipeline generation prompt\"></textarea>\n <button matListItemMeta style=\" margin-left: 4px;\n margin-right: 0px;\" color=\"primary\" mat-mini-fab [disabled]=\"aiIsGeneratingPipeline\" (click)=\"promptSubmit()\">\n\n <mat-icon style=\"margin: 0px !important;color:white\">send</mat-icon>\n <mat-spinner color=\"accent\" *ngIf=\" aiIsGeneratingPipeline \" \n class=\"submit-spinner\" ></mat-spinner>\n </button>\n \n </mat-list-item>\n\n </mat-list>\n\n\n <section *ngIf=\"showSuggestions\" class=\"showSuggestionContainer\">\n <!-- <mat-toolbar class=\"search-container\" style=\"background: inherit;\">\n\n\n <input type=\"search\" placeholder=\"Search options\" class=\"search-field\" (change)=\"onSearchChange($event)\">\n\n <mat-icon>\n search\n </mat-icon>\n </mat-toolbar> -->\n <mat-divider></mat-divider>\n <div style=\"padding: 8px;\">\n <div class=\"suggestion-container\">\n <div class=\"suggestion-column\">\n <h5>Collection document properties</h5>\n <div class=\"button-container\">\n <button *ngFor=\"let method of getSchemaProperties | async;trackBy: trackById\"\n (click)=\"selectSuggestionInput(method.value)\" color=\"accent\" mat-flat-button\n class=\"suggestion-button\">\n {{ method.label | titlecase }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n </div>\n </section>\n\n\n\n\n\n\n\n </div>\n </mat-expansion-panel>\n</mat-accordion>\n\n\n\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOpen]=\"disabled\"\n>\n<div style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5);\">\n\n\n</div>\n</ng-template>\n", styles: ["ion-card{margin:0 auto}.head{font-weight:500;font-size:.9rem;padding-left:8px}.chat{margin-top:0;padding-bottom:8px;padding-top:9px;padding-right:16px;white-space:normal;font-size:.8rem}.icon{margin-top:auto;margin-bottom:auto;margin-right:16px}.container{max-width:600px;margin:0 auto}ion-accordion-group{margin:16px}ion-icon{margin-right:16PX}.suggestion-container{display:flex;width:100%;gap:14px}.suggestion-column{flex:1;min-width:0}.button-container{display:flex;flex-wrap:wrap}.suggestion-button{height:auto;text-transform:capitalize;margin:2px;padding:8px;line-height:normal;text-align:left;font-size:.8em}h5{margin-bottom:8px;font-size:1em}mat-expansion-panel-header{padding-left:16px;padding-right:16px}mat-expansion-panel{background:var(--mat-sys-surface-container, var(--mat-app-surface))}mat-form-field{width:100%;background:azure}.chatItem{padding:0}.chatItem mat-icon{margin-left:16px;margin-right:16px}.chatContent{height:fit-content!important}.stage-button{margin:4px}.stage-index{font-size:14px;display:flex;width:28px;height:28px;justify-content:center;background:azure;align-items:center;border:solid var(--mat-divider-color, var(--mat-app-outline)) 1px}.stage-inner-message{font-size:14px;display:flex;line-height:normal;opacity:.6}.stage-item{height:54px!important}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:azure;border-radius:4px;margin-bottom:16px}.info-icon{min-width:38px!important;display:block}.title-icon{margin-right:8px;vertical-align:middle}.header-spinner{position:absolute;width:24px!important;height:24px!important}.sent-icon{font-size:14px;height:14px;margin-right:0!important;margin-left:0!important}.submit-spinner{position:absolute;width:40px!important;right:-8px;top:-20px;height:40px!important;--mdc-circular-progress-size: 40px !important;--mdc-circular-progress-active-indicator-width: 40px !important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.JsonPipe, name: "json" }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }, { kind: "component", type: TWorkflowPickerComponent, selector: "lib-t-workflow-picker", inputs: ["disabled", "errors", "required", "value", "placeholder", "getWorkflowOptions"], outputs: ["valueChange", "valueChanged"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: TDynamicDataViewComponent, selector: "lib-t-dynamic-data-view", inputs: ["data"] }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i2$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i2$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i2$1.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i5$1.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i6.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i6.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i6.MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "directive", type: i6.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i6.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i6.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i9.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i11.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: AggregateStageEditorComponent, selector: "app-aggregate-stage-editor", inputs: ["selectedStage", "isRunningPipeline"], outputs: ["saveStage", "deleteStage"] }, { kind: "pipe", type: DaysAgoPipe, name: "daysAgo" }, { kind: "ngmodule", type: OverlayModule }] }); }
689
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: PipelineGeneratorComponent, isStandalone: true, selector: "app-pipeline-generator", inputs: { disabled: "disabled", value: "value", getWorkflowOptions: "getWorkflowOptions", userName: "userName", errors: "errors" }, outputs: { valueChanged: "valueChanged" }, host: { properties: { "id": "this.id" } }, providers: [{ provide: MatFormFieldControl, useExisting: PipelineGeneratorComponent }], viewQueries: [{ propertyName: "textareaElementRef", first: true, predicate: ["textarea"], descendants: true, read: ElementRef }], ngImport: i0, template: "\n\n\n<section class=\"ion-margin\">\n <p>MongoDB aggregation pipeline builder for selected workflows. </p>\n</section>\n<lib-t-workflow-picker \n(valueChanged)=\"workflowChanged($event)\" \n[getWorkflowOptions]=\" workflows$\"\n [value]=\"(workflowId|async)||undefined\">\n</lib-t-workflow-picker>\n<mat-accordion multi *ngIf=\"workflowId|async\">\n <!-- Pipeline Accordion -->\n <mat-expansion-panel value=\"pipeline\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner color=\"accent\" *ngIf=\"isRunningPipeline\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">\n dynamic_form\n </mat-icon>\n {{isRunningPipeline?'Executing current Data pipeline...':'Data retrieval pipeline'}}\n </mat-panel-title>\n\n </mat-expansion-panel-header>\n <div class=\"content\">\n <!-- Mongodb aggregate pipelione stages management and edit start-->\n <div *ngIf=\"((stages | async)?.length || 0) ===0\" class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>\n Add stages to the pipeline below.<br>\n Each stage processes input documents by filtering, grouping, or calculating values. The output documents from\n one stage are passed to the next stage in the pipeline.\n </span>\n </div>\n\n <mat-nav-list style=\" background: var(--mat-tree-container-background-color);padding:0px;border-radius:8px\">\n\n\n <ng-container *ngFor=\"let stage of stages | async; trackBy: trackById;index as $index;last as isLast\">\n <mat-list-item [style.margin-top]=\"(activeStageIndex|async) ===$index?'4px':'0px'\"\n [class.mat-elevation-z8]=\"(activeStageIndex|async) ===$index\" class=\"stage-item\"\n (click)=\"setActiveStage($index)\" [activated]=\" (activeStageIndex|async) ===$index\">\n <span class=\"stage-index\" matListItemAvatar>{{$index + 1}} </span>\n <div matListItemTitle>\n <div style=\"line-height: normal;\">\n {{ stage.name || 'Stage ' }}\n </div>\n <div class=\"stage-inner-message\" *ngIf=\"!stage.name && (activeStageIndex|async) !==$index \">\n Incomplete , click to edit\n </div>\n\n </div>\n\n <button *ngIf=\"(activeStageIndex|async) ===$index||!stage.valid && (activeStageIndex|async) !==$index\"\n mat-icon-button matListItemMeta>\n <mat-icon color=\"primary\" *ngIf=\"(activeStageIndex|async) ===$index\">check_circle</mat-icon>\n\n <mat-icon color=\"warn\" *ngIf=\"!stage.valid && (activeStageIndex|async) !==$index\">\n warning\n </mat-icon>\n </button>\n </mat-list-item>\n <mat-divider></mat-divider>\n\n <app-aggregate-stage-editor [selectedStage]=\"stage\" [isRunningPipeline]=\"isRunningPipeline\"\n (deleteStage)=\"deleteStage($index)\" (saveStage)=\"saveStage($index,$event)\"\n *ngIf=\"(activeStageIndex|async) ===$index\"></app-aggregate-stage-editor>\n\n\n </ng-container>\n\n <mat-toolbar style=\"padding: 0px;\">\n\n <span class=\"spacer\"></span>\n <button class=\"stage-button\" [disabled]=\"isRunningPipeline\" color=\"primary\" (click)=\"addStage()\"\n mat-raised-button>\n Add\n <mat-icon>add</mat-icon>\n </button>\n </mat-toolbar>\n </mat-nav-list>\n\n <!-- Mongodb aggregate pipelione stages management and edit end -->\n </div>\n </mat-expansion-panel>\n\n <!-- Results Accordion -->\n <mat-expansion-panel value=\"results\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner color=\"accent\" *ngIf=\"isRunningPipeline\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">dataset</mat-icon>\n {{isRunningPipeline?'Running pipeline...':'Data Results'}}\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"content\">\n <ng-container *ngIf=\"pipeLineResults | async as results; else noResults\">\n\n <lib-t-dynamic-data-view *ngIf=\"results\" [data]=\"results\"></lib-t-dynamic-data-view>\n <p *ngIf=\"!results\" color=\"medium\">\n\n No results available\n\n </p>\n\n </ng-container>\n <ng-template #noResults>\n <p color=\"medium\">No results available</p>\n </ng-template>\n </div>\n </mat-expansion-panel>\n\n <!-- AI Agent Accordion -->\n <mat-expansion-panel value=\"ai\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner *ngIf=\" aiIsGeneratingPipeline \" style=\"position: absolute;\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">tips_and_updates</mat-icon>\n {{ aiIsGeneratingPipeline ? 'Agent busy ...' : 'AI AGENT prompt' }}\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n @if( schemaLoadError$ | async){\n <div class=\"tree-instructions\" style=\"background: antiquewhite !important;\">\n <mat-icon class=\"info-icon\" color=\"warn\">error</mat-icon>\n <span> {{ schemaLoadError$ | async }}</span>\n </div>\n \n }\n <mat-list *ngFor=\"let chat of chatHistory|async;\">\n\n <mat-list-item class=\"chatContent chatItem\">\n <div class=\"chat\" style=\"background:bisque;text-align:end;\n border-radius: 18px 18px 0px 18px;\" matListItemTitle>\n <div>\n {{chat.user}}\n </div>\n <div style=\"opacity:0.6;line-height: normal;display: flex;align-items: center;justify-content: flex-end;\">\n {{chat.date|daysAgo}}\n <mat-icon class=\"sent-icon\">\n done_all\n </mat-icon>\n </div>\n </div>\n </mat-list-item>\n\n <mat-list-item style=\"margin-top: 16px;\" class=\"chatContent chatItem\" color=\"light\" lines=\"full\">\n <mat-icon style=\" margin-left: 0px;\n margin-top: 16px;\n margin-bottom: auto;\" matListItemIcon>smart_toy</mat-icon>\n <div class=\"chat\" style=\"text-align: left; \n padding-left: 16px; \n background: azure;\n border-radius: 0px 18px 18px 18px;\" *ngIf=\"!chat.assistance?.error\" matListItemTitle>\n <pre>\n {{chat. assistance.pipeline |json}}\n </pre>\n </div>\n <div *ngIf=\"chat.assistance?.error\" matListItemTitle>\n {{chat.assistance.error}}\n </div>\n </mat-list-item>\n\n\n </mat-list>\n <mat-list>\n <mat-list-item class=\"chatContent chatItem\">\n <textarea matListItemTitle #textarea style=\" width: calc(100% - 13px);\n border-radius: 14px;\n padding-right: 3px;\n padding-left: 8px;\" class=\"chat\" [value]=\" prompt|async\" (input)=\"onTextChange($event)\"\n placeholder=\"Provide a pipeline generation prompt\"></textarea>\n <button matListItemMeta style=\" margin-left: 4px;\n margin-right: 0px;\" color=\"primary\" mat-mini-fab [disabled]=\"aiIsGeneratingPipeline\" (click)=\"promptSubmit()\">\n\n <mat-icon style=\"margin: 0px !important;color:white\">send</mat-icon>\n <mat-spinner color=\"accent\" *ngIf=\" aiIsGeneratingPipeline \" \n class=\"submit-spinner\" ></mat-spinner>\n </button>\n \n </mat-list-item>\n\n </mat-list>\n\n\n <section *ngIf=\"showSuggestions\" class=\"showSuggestionContainer\">\n <!-- <mat-toolbar class=\"search-container\" style=\"background: inherit;\">\n\n\n <input type=\"search\" placeholder=\"Search options\" class=\"search-field\" (change)=\"onSearchChange($event)\">\n\n <mat-icon>\n search\n </mat-icon>\n </mat-toolbar> -->\n <mat-divider></mat-divider>\n <div style=\"padding: 8px;\">\n <div class=\"suggestion-container\">\n <div class=\"suggestion-column\">\n <h5>Collection document properties</h5>\n <div class=\"button-container\">\n <button *ngFor=\"let method of getSchemaProperties | async;trackBy: trackById\"\n (click)=\"selectSuggestionInput(method.value)\" color=\"accent\" mat-flat-button\n class=\"suggestion-button\">\n {{ method.label | titlecase }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n </div>\n </section>\n\n\n\n\n\n\n\n </div>\n </mat-expansion-panel>\n</mat-accordion>\n\n\n\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOpen]=\"disabled\"\n>\n<div style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5);\">\n\n\n</div>\n</ng-template>\n", styles: ["ion-card{margin:0 auto}.head{font-weight:500;font-size:.9rem;padding-left:8px}.chat{margin-top:0;padding-bottom:8px;padding-top:9px;padding-right:16px;white-space:normal;font-size:.8rem}.icon{margin-top:auto;margin-bottom:auto;margin-right:16px}.container{max-width:600px;margin:0 auto}ion-accordion-group{margin:16px}ion-icon{margin-right:16PX}.suggestion-container{display:flex;width:100%;gap:14px}.suggestion-column{flex:1;min-width:0}.button-container{display:flex;flex-wrap:wrap}.suggestion-button{height:auto;text-transform:capitalize;margin:2px;padding:8px;line-height:normal;text-align:left;font-size:.8em}h5{margin-bottom:8px;font-size:1em}mat-expansion-panel-header{padding-left:16px;padding-right:16px}mat-expansion-panel{background:var(--mat-sys-surface-container, var(--mat-app-surface))}mat-form-field{width:100%;background:azure}.chatItem{padding:0}.chatItem mat-icon{margin-left:16px;margin-right:16px}.chatContent{height:fit-content!important}.stage-button{margin:4px}.stage-index{font-size:14px;display:flex;width:28px;height:28px;justify-content:center;background:azure;align-items:center;border:solid var(--mat-divider-color, var(--mat-app-outline)) 1px}.stage-inner-message{font-size:14px;display:flex;line-height:normal;opacity:.6}.stage-item{height:54px!important}.tree-instructions{display:flex;align-items:center;gap:8px;padding:12px;background:azure;border-radius:4px;margin-bottom:16px}.info-icon{min-width:38px!important;display:block}.title-icon{margin-right:8px;vertical-align:middle}.header-spinner{position:absolute;width:24px!important;height:24px!important}.sent-icon{font-size:14px;height:14px;margin-right:0!important;margin-left:0!important}.submit-spinner{position:absolute;width:40px!important;right:-8px;top:-20px;height:40px!important;--mdc-circular-progress-size: 40px !important;--mdc-circular-progress-active-indicator-width: 40px !important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.JsonPipe, name: "json" }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }, { kind: "component", type: TWorkflowPickerComponent, selector: "lib-t-workflow-picker", inputs: ["disabled", "errors", "required", "value", "placeholder", "getWorkflowOptions"], outputs: ["valueChange", "valueChanged"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: TDynamicDataViewComponent, selector: "lib-t-dynamic-data-view", inputs: ["data"] }, { kind: "ngmodule", type: MatModulesModule }, { kind: "component", type: i2$2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i2$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i2$2.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i5.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i6.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i6.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i6.MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "directive", type: i6.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i6.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i6.MatListItemMeta, selector: "[matListItemMeta]" }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i8$1.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i10.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: AggregateStageEditorComponent, selector: "app-aggregate-stage-editor", inputs: ["selectedStage", "isRunningPipeline"], outputs: ["saveStage", "deleteStage"] }, { kind: "pipe", type: DaysAgoPipe, name: "daysAgo" }, { kind: "ngmodule", type: OverlayModule }] }); }
690
690
  }
691
691
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PipelineGeneratorComponent, decorators: [{
692
692
  type: Component,
@@ -724,4 +724,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
724
724
  }] } });
725
725
 
726
726
  export { PipelineGeneratorComponent };
727
- //# sourceMappingURL=ngx-t-forms-pipeline-generator.component-T4_0xqeE.mjs.map
727
+ //# sourceMappingURL=ngx-t-forms-pipeline-generator.component-CGKxfvvC.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-t-forms-pipeline-generator.component-T4_0xqeE.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/json-editor/json-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/json-editor/json-editor.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/elements/aggregate-stage-editor/aggregate-stage-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/elements/aggregate-stage-editor/aggregate-stage-editor.component.html","../../../projects/ngx-t-forms/src/lib/services/hhtpResources/Pipeline/pipeline.service.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/pipeline-generator.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/pipeline-generator.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChanges } from '@angular/core';\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\n\nimport { debounceTime, Subscription } from 'rxjs';\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\n\n\n@Component({\n selector: 'app-json-editor',\n templateUrl: './json-editor.component.html',\n styleUrls: ['./json-editor.component.scss'],\n standalone: true,\n imports: [\n CommonModule,\n MatModulesModule,\n FormsModule,\n ReactiveFormsModule\n ]\n})\nexport class JsonEditorComponent implements OnChanges ,OnDestroy{\n jsonForm: FormGroup;\n subscriptions = new Subscription();\n constructor(private fb: FormBuilder){\n this.jsonForm = this.fb.group({\n jsonText: ['', Validators.required]\n });\n this.init()\n }\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe()\n }\n private _value:any\n ngOnChanges(changes: SimpleChanges,): void {\n if (changes['value']&& changes['value'].currentValue !==this._value){\n this._value = changes['value'].currentValue\n this.parseAndBeautifyJson(this._value ,true)\n\n }\n }\n@Input() value!:Object \n@Output() valueChange = new EventEmitter<{\n value: Object|Array<any>,\n valid: boolean\n}>()\n jsonText: string = ''; // Placeholder for the JSON text\n errorMessage: string | null = null;\n\n\n init(){\n this.subscriptions.add( this.jsonForm.get('jsonText')!.valueChanges\n .pipe(\n debounceTime(1000)\n )\n .subscribe(value => {\n this.parseAndBeautifyJson(value);\n })) \n \n }\n \n private parseAndBeautifyJson(value: string,hardSet?:boolean): void {\n try {\n\n // Attempt to parse the JSON\n const parsedJson = typeof value === 'object' && value !==null? value: JSON.parse(value);\n \n // If valid, beautify the JSON\n const beautifiedJson = JSON.stringify(parsedJson, null, 4);\n \n // Update form control value with beautified JSON\n const form = this.jsonForm.get('jsonText');\n if (!form) {\n this.errorMessage = 'Form control not found.';\n return;\n }\n \n // Set beautified JSON without emitting another change event\n form.setValue(beautifiedJson, { emitEvent: false });\n this.errorMessage = null;\n this.valueChange.emit({value:parsedJson,valid:true})\n } catch (error) {\n if (error instanceof SyntaxError) {\n // Extract the position of the error from the error message\n const errorMessage = this.getDetailedJsonError(value, error.message);\n this.errorMessage = `JSON Syntax Error: ${errorMessage}`;\n } else {\n this.errorMessage = 'Unexpected error occurred while parsing JSON.';\n }\n if(hardSet){\n console.log('hardset',value)\n this.jsonForm.get('jsonText')?.setValue(value, { emitEvent: false });\n }\n this.valueChange.emit({value:value,valid:false})\n \n }\n }\n\n // Function to give detailed JSON error information\n private getDetailedJsonError(value: string, message: string): string {\n const positionMatch = message.match(/position (\\d+)/);\n if (!!positionMatch?.[1]) {\n const position = parseInt(positionMatch[1], 10);\n const excerpt = this.getErrorExcerpt(value, position);\n return `at position ${position}: near \"${excerpt}\". Check for missing commas, brackets, or quotes.`;\n }\n return message;\n }\n\n // Helper function to extract a portion of the string around the error position\n private getErrorExcerpt(value: string, position: number, excerptLength: number = 20): string {\n const start = Math.max(0, position - excerptLength);\n const end = Math.min(value.length, position + excerptLength);\n return value.substring(start, end);\n }\n\n\n}\n","<div class=\"json-editor-container\">\n <div *ngIf=\"jsonForm.invalid\" \n style=\"margin-top: 16px;\"\n class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span> Paste or type JSON below. The editor will auto-beautify the text.</span>\n </div>\n\n\n \n <!-- Error message if JSON is invalid -->\n <div *ngIf=\"errorMessage\" \n \n style=\"\" class=\"tree-instructions json-error \">\n <span> {{errorMessage}}</span>\n </div>\n \n <form [formGroup]=\"jsonForm\">\n <textarea\n formControlName=\"jsonText\"\n class=\"json-textarea\"\n [class.error-message]=\"errorMessage\"\n rows=\"15\"\n placeholder=\"Enter your JSON here...\"></textarea>\n </form>\n <!-- JSON Textarea -->\n\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport PipelineBuilder from \"db-aggregation-pipeline-builder\"\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { JsonEditorComponent } from '../../../json-editor/json-editor.component';\nimport { IAllowedStage } from '../../../../../../services/hhtpResources/Pipeline/pipeline.service';\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\n\nimport { MatSelectChange } from '@angular/material/select';\n\n@Component({\n selector: 'app-aggregate-stage-editor',\n templateUrl: './aggregate-stage-editor.component.html',\n styleUrls: ['./aggregate-stage-editor.component.scss'],\n standalone: true,\n\n imports: [\n MatModulesModule,\n CommonModule,\n FormsModule,\n JsonEditorComponent\n ]\n})\nexport class AggregateStageEditorComponent implements OnInit {\n subscription = new Subscription();\n @Input() selectedStage:any\n @Input() isRunningPipeline: boolean = false\n @Output() saveStage = new EventEmitter<IAllowedStage | undefined>()\n @Output() deleteStage = new EventEmitter<void>()\n ngOnDestroy(): void {\n this.subscription.unsubscribe()\n }\n\n constructor() {\n\n }\n activeStage: IAllowedStage | undefined = undefined; // Define the type appropriately if possible\n allowedStages: { stage: string; description: string; config: any }[] = [];\n configValidationError: string | undefined\n\n\n ngOnInit() {\n // Debounce the config change to optimize performance\n\n this.allowedStages = PipelineBuilder.getViewOnlyStages() as any\n }\n\n handleChange(event: MatSelectChange): void {\n \n const selectedStage = event.value\n if (this.activeStage === undefined) {\n this.activeStage = {\n stage: selectedStage,\n ...this.selectedStage || {},\n\n } as IAllowedStage\n } else {\n this.activeStage = {\n config : this.activeStage?.config|| this.selectedStage ?.config,\n stage: selectedStage\n } as IAllowedStage\n\n }\n { }\n if (this.activeStage?.config as any && !!this.activeStage?.stage) {\n\n this.validateConfig();\n\n }\n }\n\n handleConfigChange(event: any): void {\n if (!this.activeStage) {\n this.activeStage = {\n ...this.selectedStage || {},\n } as IAllowedStage\n }\n this.activeStage = {\n stage:this.activeStage?.stage || this.selectedStage ?.name,\n config: event.value\n } as IAllowedStage\n this.validateConfig();\n\n }\n validateConfig(): void {\n this.configValidationError = undefined\n const { config, stage } = this.activeStage || {} as IAllowedStage;\n\n // Check if config and stage are defined\n if (!config && config !== 0 || !stage) {\n console.error('Config or stage is not defined', config, stage);\n this.activeStage!.valid = false;\n return; // Early exit if validation fails\n }\n\n try {\n const valid = PipelineBuilder.validateStageConfig(stage as any, config);\n this.activeStage!.valid = valid;\n\n // Set error message if config is invalid\n if (!valid) {\n this.configValidationError = undefined\n return;\n }\n } catch (error: any) {\n // Catch and handle errors from validation\n this.configValidationError = error.message || JSON.stringify(error) || 'An unknown error occurred';\n this.activeStage!.valid = false;\n console.error('Validation Error:', this.configValidationError);\n }\n }\n\n canSaveConfig(): boolean {\n return !!this.activeStage && !this.configValidationError;\n }\n\n saveConfiguration(): void {\n // Logic for saving the configuration\n if (this.canSaveConfig()) {\n this.saveStage.emit(this.activeStage as IAllowedStage);\n \n }\n }\n\n trackByStage(index: number, stage: any): string {\n return stage.stage;\n }\n\n get allowedStageNames(): string[] {\n return this.allowedStages.map(stage => stage.stage);\n }\n\n\n get activeDescription() {\n return this.allowedStages.find(stage => stage.stage === this.activeStage?.stage)?.description\n\n\n }\n\n deleteActive() {\n this.deleteStage.emit()\n }\n // close() {\n // this.pipeline.setActiveStage(undefined)\n // }\n\n}\n","<mat-card style=\"margin-bottom:8px\">\n <mat-card-content>\n\n <h5>\n Aggregate Pipeline Stage Configuration\n </h5>\n\n\n\n <mat-form-field style=\" margin-bottom: 8px;\" appearance=\"outline\" subscriptSizing=\"dynamic\" >\n <mat-label>Select Aggregate Stage</mat-label>\n <mat-select matNativeControl [value]=\"selectedStage?.name\" (selectionChange)=\"handleChange($event)\"\n placeholder=\"ChooseFunctionToRun\">\n <mat-option *ngFor=\"let stage of allowedStages; trackBy: trackByStage\" [value]=\"stage.stage\">\n {{stage.stage}}</mat-option>\n\n\n\n </mat-select>\n <mat-hint>\n {{activeDescription ?\n 'Hover over the info icon to view stage details .'\n : 'Please select an aggregation function from the list.'}}\n </mat-hint>\n <mat-hint *ngIf=\"activeDescription\" align=\"end\">\n <mat-icon matTooltipHideDelay=\"1000\" [matTooltip]=\"activeDescription\" matSuffix>info</mat-icon>\n </mat-hint>\n </mat-form-field>\n\n\n\n <div class=\"tree-instructions\" style=\"background: cornsilk;\" *ngIf=\"configValidationError\">\n <mat-icon style=\"margin-top: 4px;margin-bottom:auto\" class=\"info-icon\" color=\"warn\">warning</mat-icon>\n <span>{{ configValidationError }}</span>\n </div>\n\n\n\n\n\n <div class=\"config-container\" *ngIf=\"activeStage ||selectedStage?.config\">\n <app-json-editor [value]=\"selectedStage?.config\" (valueChange)=\"handleConfigChange($event)\"></app-json-editor>\n </div>\n\n <br>\n\n\n\n </mat-card-content>\n <mat-divider>\n </mat-divider>\n <mat-card-actions>\n\n <span class=\"spacer\"></span>\n <button color=\"warn\" [disabled]=\"isRunningPipeline\" mat-button (click)=\"deleteActive()\">\n Delete\n <mat-icon >delete</mat-icon>\n </button>\n <button style=\"margin-left:8px;\" color=\"primary\" mat-flat-button (click)=\"saveConfiguration()\"\n [disabled]=\"isRunningPipeline ||!activeStage?.valid \">\n Save\n <mat-icon> save</mat-icon>\n </button>\n </mat-card-actions>\n</mat-card>","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { BehaviorSubject, catchError, combineLatest, filter, finalize, map, Observable, switchMap, take, tap, throwError } from 'rxjs';\r\nimport { PipelineStage } from 'mongoose'\r\n\r\nimport PipelineBuilder from \"db-aggregation-pipeline-builder\"\r\nimport { IPipelineGenerationError, IPipelineGenerationResponse, IRunPipelineResponse, PipelineStageEnum } from 'ngx-t-forms-types';\r\nexport interface IAllowedStage {\r\n stage: PipelineStageEnum,\r\n description: string,\r\n config: any,\r\n valid?:boolean\r\n\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PipelineService {\r\n //LOADING INDICATORS\r\n isRunningPipeline: boolean = false\r\n aiIsGeneratingPipeline: boolean = false\r\n isLoadingAllowedStages: boolean = false\r\n isLoadingWorkflowSchema: boolean = false\r\n\r\n //States \r\n workflowId$ = new BehaviorSubject<string|undefined>(undefined)\r\n activeStage$ = new BehaviorSubject<number|undefined>(undefined)\r\n prompt$ = new BehaviorSubject<string|undefined>(undefined)\r\n schemaLoadError$ = new BehaviorSubject<string|undefined>(undefined)\r\n \r\n\r\n pipeline$ = new BehaviorSubject<PipelineStage[]>([])\r\n threadId$ = new BehaviorSubject<string|undefined>(undefined)\r\n schema$ = new BehaviorSubject<Object|undefined>(undefined)\r\n allowedStages$ = new BehaviorSubject<IAllowedStage[]>([])\r\n pipeLineResult$ = new BehaviorSubject<unknown>([])\r\n chatHistory$ = new BehaviorSubject<{\r\n user: string,\r\n assistance:IPipelineGenerationResponse,\r\n date:Date\r\n }[]>([])\r\n http = inject(HttpClient)\r\n constructor() { \r\n //Set local storage threadId\r\n const threadId = localStorage.getItem('threadId')\r\n if(threadId){\r\n this.threadId$.next(threadId)\r\n }\r\n }\r\n\r\n get config$() {\r\n return this.workflowId$.pipe(\r\n switchMap(workflowId => this.pipeline$.pipe(\r\n switchMap(pipeline => this.pipeLineResult$.pipe(\r\n map(responseBody => ({ workflowId, pipeline, responseBody }))\r\n ))\r\n ))\r\n );\r\n }\r\n /**\r\n * Fetch available pipeline stages for the user to select and generate pipelines.\r\n * Ideally, this could be static or fetched from a backend.\r\n */\r\n runPipeLine(pipeline: PipelineStage[],workflowId:string): Observable<IRunPipelineResponse> {\r\n const url = \"http://localhost:5000/api/v1/pipelineBuilder/runPipeline\"\r\n // For now, returning a static list of pipeline stages. In a real application, you can fetch from an API.\r\n\r\n this.isRunningPipeline = true\r\n return this.http.post<IRunPipelineResponse>(\r\n url,\r\n { pipeline,workflowId }\r\n ).pipe(\r\n take(1),\r\n catchError(this.handleError), // Error handling for the HTTP request,\r\n finalize(() => this.isRunningPipeline = false)\r\n );\r\n }\r\n\r\n /**\r\n * Generate a MongoDB pipeline based on the given user prompt.\r\n * \r\n * @param prompt The user's input or description of the desired pipeline.\r\n */\r\n private generatePipeline(query: string, schema: Object | undefined,\r\n threadId:string|undefined, existingPipeline: PipelineStage[],previousError:string): Observable<IPipelineGenerationResponse> {\r\n if (!schema) {\r\n throw new Error(\"Schema is required\")\r\n }\r\n const payload = { query, schema ,threadId, existingPipeline ,previousError};\r\n const url = \"http://localhost:5000/api/v1/pipelineBuilder/generatePipeline\";\r\n this.aiIsGeneratingPipeline = true\r\n return this.http.post<IPipelineGenerationResponse>(`${url}`, payload)\r\n .pipe(\r\n take(1),\r\n catchError(this.handleError),// Error handling for the HTTP request,\r\n finalize(() => this.aiIsGeneratingPipeline = false)\r\n );\r\n }\r\n\r\n /**\r\n * Handle any errors from the HTTP request.\r\n * \r\n * @param error The error response from the HTTP request\r\n */\r\n private handleError(error: any): Observable<never> {\r\n console.error('An error occurred', error);\r\n // Return an observable with a user-facing error message\r\n return throwError(() => new Error('Something went wrong with the pipeline generation; please try again later.'));\r\n\r\n }\r\n\r\n\r\n private getSchema(workflowId: string): Observable<{\r\n schema: object\r\n }> {\r\n if(!workflowId){\r\n throw new Error(\"WorkflowId is required\")\r\n }\r\n const url = \"http://localhost:5000/api/v1/pipelineBuilder/getSchema\";\r\n return this.http.get<{ schema: object }>(`${url}`, { params: { workflowId: workflowId } }).pipe(\r\n take(1),\r\n catchError(this.handleError) // Error handling for the HTTP request\r\n )\r\n }\r\n/** OPERATIONS */\r\nisSchemaEmpty(object:object){\r\n\r\n}\r\n workflowChanged(event: any) {\r\n this.workflowId$.next(event)\r\n if(!event){\r\n return \r\n }\r\n this.getSchema(event).pipe(\r\n take(1),\r\n tap(({ schema }) => {\r\n this.schema$.next(schema)\r\n const isEmptySchema = Object.keys( schema)[0] === \"\" && Object.values(schema)[0] === \"Array<>\"\r\n const error = isEmptySchema \r\n ? \"Document schema is missing. Please ensure at least one document exists for the selected workflow.\" \r\n : undefined\r\n this.schemaLoadError$.next(error)\r\n console.log(\"Workflow schema loaded,run pipeline\")\r\n this.runActivePipeline()\r\n }),\r\n catchError((error) => {\r\n this.schemaLoadError$.next(\"Error loading schema\");\r\n return this.handleError(error);\r\n })\r\n ).subscribe()\r\n }\r\n\r\n \r\n setActiveStage(i:number|undefined){\r\n const index = this.activeStage$.getValue()\r\n if(index === i){\r\n this.activeStage$.next(undefined)\r\n return\r\n }\r\n this.activeStage$.next(i)\r\n\r\n \r\n }\r\n addStage(){\r\n const newPipeline = this.pipeline$.getValue().concat({} as any)\r\n this.pipeline$.next(newPipeline)\r\n }\r\n onTextChange(event: any) {\r\n this.prompt$.next(event)\r\n console.log(event)\r\n }\r\n promptSubmit() {\r\n // Use combineLatest to fetch the latest values from multiple sources\r\n combineLatest([this.schema$, this.threadId$, this.pipeline$,this.prompt$,this.chatHistory$])\r\n .pipe(\r\n take(1),\r\n tap(([schema, threadId, pipeline,prompt,history]) => {\r\n if (!schema || !prompt) {\r\n console.warn(`Missing values: schema ${schema} prompt ${prompt}`);\r\n }\r\n }),\r\n filter(([schema,,,prompt]) => !!schema && !!prompt ),\r\n switchMap(([schema, threadId, pipeline,prompt,history]) => {\r\n // Use a shallow copy of the pipeline\r\n const previousError = (history[history.length-1]?.assistance as any )?.error\r\n const pipelineCopy = pipeline.map(stage => JSON.parse(JSON.stringify(stage))) || [];\r\n console.info('Generating pipeline with prompt:',\r\n prompt, 'schema:', schema, 'threadId:', threadId, 'pipeline:', pipeline)\r\n return this.generatePipeline(prompt!, schema, threadId, pipelineCopy,previousError).pipe(\r\n map((response) => ({ ...response,history,prompt}))\r\n )\r\n }),\r\n tap((response) => {\r\n const { pipeline, threadId,history,prompt } = response;\r\n const historyRecord = {\r\n user: prompt as any,\r\n assistance: response,\r\n date:new Date()\r\n };\r\n \r\n // Use next with a concatenated value for chat history\r\n this.chatHistory$.next([...(history||[]), historyRecord]);\r\n this.pipeline$.next(pipeline);\r\n this.threadId$.next(threadId);\r\n \r\n // Store threadID locally\r\n localStorage.setItem('threadId', threadId);\r\n \r\n // Run the active pipeline after all state updates are complete\r\n console.log(\"prompt submitted run pipeline\")\r\n this.runActivePipeline();\r\n }),\r\n catchError((error:IPipelineGenerationError) => {\r\n \r\n console.error('Error response:', error.message || error);\r\n return this.handleError(error);\r\n })\r\n ).subscribe();\r\n\r\n }\r\n \r\n runActivePipeline() {\r\n const pipeline = [...(this.pipeline$.getValue().map(stage => (JSON.parse(JSON.stringify(stage))))||[])]\r\n const someAreNotValid = pipeline.some(stage=>Object.keys(stage).length ===0)\r\n if(pipeline.length === 0 || someAreNotValid ){\r\n return\r\n }\r\n try {\r\n PipelineBuilder.validatePipeline(pipeline)\r\n } catch (error) {\r\n console.error(error,pipeline)\r\n return\r\n }\r\n const workflowId = this.workflowId$.getValue()\r\n if (!workflowId) {\r\n return\r\n }\r\n \r\n this.runPipeLine(pipeline,workflowId).pipe(\r\n take(1),\r\n tap(({ results }) => {\r\n this.pipeLineResult$.next(results)\r\n }),\r\n catchError((error) => {\r\n console.error('Error response:', error);\r\n const err = JSON.parse(JSON.stringify(error))\r\n const errorMessage = err.error\r\n if(errorMessage){\r\n this.pipelineErrorLogAndRetry(errorMessage)\r\n }\r\n return this.handleError(error);\r\n })\r\n ).subscribe()\r\n }\r\n\r\n pipelineErrorLogAndRetry(message:string){\r\n const history = this.chatHistory$.getValue() \r\n const prompt = this.prompt$.getValue ()\r\n const historyRecord = {\r\n user: prompt as any,\r\n assistance: {\r\n message\r\n } as any,\r\n date:new Date()\r\n };\r\n this.chatHistory$.next([...(history||[]), historyRecord]);\r\n\r\n }\r\n get activeStage():Observable<{name:string,config:PipelineStage}|undefined>{\r\n return this.pipeline$.asObservable().pipe(\r\n switchMap(pipeline=>this.activeStage$.pipe(\r\n map(activeIndex=>activeIndex === undefined ? undefined : {\r\n name:Object.keys(pipeline[activeIndex]||{})[0] || '',\r\n config:(pipeline[activeIndex] as any)[Object.keys(pipeline[activeIndex]||{})?.[0]||'']\r\n })\r\n ))\r\n )\r\n \r\n }\r\n saveStage(index:number,stage: IAllowedStage | undefined) {\r\n const pipeline = this.pipeline$.getValue()\r\n if(index === undefined){\r\n return\r\n }\r\n const newPipeline = pipeline.map((s, i) => {\r\n if (i === index) {\r\n return stage ? {\r\n [stage.stage]: stage.config\r\n } : s;\r\n }\r\n return s;\r\n });\r\n\r\n console.log(\"newPipeline\",newPipeline)\r\n this.pipeline$.next(newPipeline as any)\r\n this.activeStage$.next(undefined)\r\n console.log(\"stage saved run pipeline\")\r\n this.runActivePipeline()\r\n \r\n }\r\n deleteStage(index:number){\r\n const pipeline = this.pipeline$.getValue()\r\n\r\n if(index === undefined){\r\n return\r\n }\r\n const newPipeline = pipeline.filter((s, i) => i !== index);\r\n console.log(\"newPipeline\",newPipeline)\r\n this.pipeline$.next(newPipeline as any)\r\n this.activeStage$.next(undefined)\r\n console.log(\"stage deleted run pipeline\")\r\n this.runActivePipeline()\r\n }\r\n get pipelineGeneralValid(){\r\n return this.pipeline$.asObservable().pipe(\r\n map(pipeline=>{\r\n const allHaveTypes = pipeline.every(stage=>Object.keys(stage).length === 1)\r\n if(!allHaveTypes){\r\n return {\r\n valid:false,\r\n message:\"All stages must be a valid pipeline stage\"\r\n }\r\n }\r\n const AllStagesMustHaveConfig = pipeline.every((stage: { [key: string]: any }) => stage[Object.keys(stage)?.[0]||''] !== undefined)\r\n if(!AllStagesMustHaveConfig){\r\n return {\r\n valid:false,\r\n message:\"All stages must have a configuration\"\r\n }\r\n }\r\n return {\r\n valid:true\r\n }\r\n })\r\n )\r\n }\r\n}","import { CommonModule } from '@angular/common';\r\n\r\nimport { Component, ElementRef, EventEmitter, HostBinding, inject, Input, OnDestroy, OnInit, Optional, Output, Self, ViewChild } from '@angular/core';\r\nimport { FormsModule, NgControl } from '@angular/forms';\r\n\r\n\r\n\r\n\r\nimport { AggregateStageEditorComponent } from './elements/aggregate-stage-editor/aggregate-stage-editor.component';\r\nimport { map, Subject, takeUntil, take, tap, Observable, distinctUntilChanged } from 'rxjs';\r\nimport { MongoDbPipeLineConfigInterface } from \"ngx-t-forms-types\";\r\n\r\nimport { TDynamicDataViewComponent } from '../../../t-dynamic-data-view/t-dynamic-data-view.component';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TWorkflowPickerComponent } from '../t-workflow-picker/t-workflow-picker.component';\r\nimport { IWorkflowOption } from \"ngx-t-forms-types\";\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../lib/injection-tokens';\r\nimport { PipelineService } from '../../../../../lib/services/hhtpResources/Pipeline/pipeline.service';\r\nimport { DaysAgoPipe } from '../../../../../lib/shared/pipes/date/days-ago.pipe';\r\n\r\nimport {OverlayModule} from '@angular/cdk/overlay';\r\n@Component({\r\n selector: 'app-pipeline-generator',\r\n templateUrl: './pipeline-generator.component.html',\r\n styleUrls: ['./pipeline-generator.component.scss'],\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TWorkflowPickerComponent,\r\n FormsModule,\r\n TDynamicDataViewComponent,\r\n MatModulesModule,\r\n AggregateStageEditorComponent,\r\n DaysAgoPipe,\r\n OverlayModule\r\n\r\n ],\r\n providers: [{ provide: MatFormFieldControl, useExisting:PipelineGeneratorComponent}],\r\n})\r\nexport class PipelineGeneratorComponent implements OnInit, OnDestroy,MatFormFieldControl< MongoDbPipeLineConfigInterface> {\r\n static nextId = 0;\r\n stateChanges = new Subject<void>();\r\n NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN)\r\n @HostBinding() id = `app-pipeline-generator-${ PipelineGeneratorComponent.nextId++}`;\r\n constructor(@Optional() @Self() public ngControl: NgControl, private _elementRef: ElementRef<HTMLElement>,) {\r\n }\r\n placeholder: string = ''\r\n\r\n focused: boolean = false;\r\n get empty() {\r\n return !this.value\r\n }\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n required: boolean = false;\r\n @Input() disabled: boolean = false;\r\nget errorState(): boolean {\r\n const hasError = !!this.ngControl?.control?.errors || (this.errors||[]).length > 0 && this.touched\r\n\r\n return !this.value && !!this.required || hasError\r\n }\r\n\r\n controlType?: string | undefined;\r\n autofilled?: boolean | undefined;\r\n userAriaDescribedBy?: string | undefined;\r\n disableAutomaticLabeling?: boolean | undefined;\r\n setDescribedByIds(ids: string[]) {\r\n // Ensure the component view is initialized\r\n if (this._elementRef && this._elementRef.nativeElement) {\r\n const controlElement = this._elementRef.nativeElement.querySelector('.app-pipeline-generator');\r\n // Check if the controlElement exists before attempting to set its attribute\r\n if (controlElement) {\r\n controlElement.setAttribute('aria-describedby', ids.join(' '));\r\n }\r\n }\r\n }\r\n onContainerClick(event: MouseEvent): void {\r\n this.markAsTouched();\r\n this.stateChanges.next();\r\n }\r\n\r\n touched: boolean = false;\r\n onTouched = () => {};\r\n markAsTouched() {\r\n console.log('markAsTouched') \r\n if (!this.touched) {\r\n this.onTouched();\r\n this.touched = true;\r\n }\r\n } \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n //@ViewChild('textarea', { static: false }) textareaRef!: HTMLTextAreaElement\r\n @ViewChild('textarea', { read: ElementRef, static: false }) textareaElementRef!: ElementRef;\r\n @Input() set value(value: MongoDbPipeLineConfigInterface) {\r\n const workflowIdChanged = this._value?.workflowId !== value?.workflowId\r\n const pipelineLengthChanged = this._value?.pipeline?.length !== value?.pipeline?.length\r\n const pipeLineContentChanged = JSON.stringify(this._value?.pipeline) !== JSON.stringify(value?.pipeline)\r\n if (workflowIdChanged ||pipelineLengthChanged || pipeLineContentChanged) {\r\n\r\n this._value = value\r\n if(value?.workflowId){\r\n this.workflowChanged(value?.workflowId)\r\n }\r\n\r\n console.log('Pipeline value changed', value,this.pipeline.pipeline$.value)\r\n if(value?.pipeline){\r\n this.pipeline.pipeline$.next(value?.pipeline || [])\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n \r\n\r\n workflows$:Observable<IWorkflowOption[] | undefined> | undefined\r\n @Input() set getWorkflowOptions(options$: Observable<IWorkflowOption[]|undefined> | undefined) {\r\n this.workflows$ = options$\r\n \r\n }\r\n @Input() userName: string | undefined\r\n _value!: MongoDbPipeLineConfigInterface\r\n @Output() valueChanged = new EventEmitter<MongoDbPipeLineConfigInterface>()\r\n\r\n @Input() errors:IConfigElementError[] |undefined = [];\r\n destroy$ = new Subject<void>()\r\n private pipeline: PipelineService = new PipelineService()\r\n\r\n ngOnInit(): void {\r\n this.initiateSubscription()\r\n\r\n\r\n }\r\n initiated: boolean = false\r\n initiateSubscription = () => {\r\n this.pipeline.config$.pipe(\r\n takeUntil(this.destroy$),\r\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr))\r\n ).subscribe(config => {\r\n if (!this.initiated) {\r\n this.initiated = true\r\n return\r\n }\r\n\r\n const newConfig: any = {\r\n ...this._value,\r\n ...config,\r\n \"source\": \"mongoPipeline\",\r\n\r\n }\r\n console.log('Pipeline config changed', newConfig)\r\n this.valueChanged.emit(newConfig)\r\n })\r\n\r\n \r\n }\r\n ngOnDestroy(): void {\r\n this.destroy$.next()\r\n this.destroy$.complete()\r\n }\r\n workflowChanged(event: any) {\r\n this.pipeline.workflowChanged(event)\r\n }\r\n get workflowId() {\r\n return this.pipeline.workflowId$.asObservable()\r\n }\r\n get stages() {\r\n return this.pipeline.pipeline$.asObservable().pipe(\r\n map(stages => stages.map(stage => ({\r\n name: Object.keys(stage)[0],\r\n stage: Object.keys(stage)[0],\r\n config: (stage as any)[Object.keys(stage)?.[0]||''],\r\n valid: !!Object.keys(stage)[0] && !!(stage as any)[Object.keys(stage)?.[0]||'']\r\n })))\r\n )\r\n }\r\n get pipeLineResults() {\r\n return this.pipeline.pipeLineResult$.asObservable()\r\n }\r\n get prompt() {\r\n return this.pipeline.prompt$.asObservable()\r\n }\r\n get aiIsGeneratingPipeline() {\r\n return this.pipeline.aiIsGeneratingPipeline\r\n }\r\n get activeStageIndex() {\r\n return this.pipeline.activeStage$.asObservable()\r\n }\r\n get activeStage() {\r\n console.log(this.pipeline.activeStage)\r\n return this.pipeline.activeStage\r\n }\r\n get isRunningPipeline() {\r\n return this.pipeline.isRunningPipeline\r\n }\r\n get cannotAddStage() {\r\n return this.pipeline.pipelineGeneralValid.pipe(\r\n map(valid => !valid)\r\n )\r\n }\r\nget schemaLoadError$() {\r\n return this.pipeline.schemaLoadError$.asObservable()\r\n}\r\n get chatHistory() {\r\n return this.pipeline.chatHistory$.asObservable()\r\n }\r\n cursorPosition = 0\r\n showSuggestions = false;\r\n onTextChange(event: Event) {\r\n if (!this.textareaElementRef?.nativeElement) {\r\n return;\r\n }\r\n console.log('onTextChange',event)\r\n const newValue =(event.target as HTMLInputElement).value;\r\n const textarea = this.textareaElementRef.nativeElement;\r\n this.cursorPosition = textarea.selectionStart || 0;\r\n\r\n const lastChar = newValue[this.cursorPosition - 1];\r\n const match = newValue.slice(0, this.cursorPosition).match(/\\$(\\w*)$/);\r\n\r\n if (lastChar === '$' || (match && match[1] !== undefined)) {\r\n this.showSuggestions = true;\r\n this.optionsSearch = match ? match?.[1] ||'' : '';\r\n } else {\r\n this.showSuggestions = false;\r\n this.optionsSearch = '';\r\n }\r\n\r\n this.pipeline.onTextChange(newValue);\r\n }\r\n selectSuggestionInput(suggestion: string) {\r\n this.pipeline.prompt$.asObservable().pipe(\r\n take(1),\r\n tap(prompt => {\r\n const match = prompt?.slice(0, this.cursorPosition).match(/\\$(\\w*)$/);\r\n const beforeCursor = prompt?.slice(0, match ? match.index : this.cursorPosition - 1);\r\n const afterCursor = prompt?.slice(this.cursorPosition);\r\n prompt = beforeCursor + suggestion + ' ' + afterCursor;\r\n this.pipeline.prompt$.next(prompt);\r\n this.applyNewValueToPrompt(suggestion);\r\n })\r\n ).subscribe();\r\n }\r\n applyNewValueToPrompt(suggestion: any) {\r\n this.showSuggestions = false;\r\n\r\n const textarea = this.textareaElementRef.nativeElement;\r\n textarea.focus();\r\n const newCursorPosition = this.cursorPosition + suggestion.length;\r\n setTimeout(() => {\r\n textarea.setSelectionRange(newCursorPosition, newCursorPosition);\r\n }, 0);\r\n }\r\n optionsSearch = ''\r\n onSearchChange(event: any) {\r\n this.optionsSearch = event.detail.value\r\n\r\n }\r\n promptSubmit() {\r\n this.pipeline.promptSubmit()\r\n console.log('promptSubmit')\r\n }\r\n trackById = (index: number, stage: any) => index\r\n\r\n setActiveStage(index: number | undefined) {\r\n\r\n this.pipeline.setActiveStage(index)\r\n }\r\n addStage() {\r\n this.pipeline.addStage()\r\n }\r\n get getSchemaProperties() {\r\n return this.pipeline.schema$.asObservable().pipe(\r\n map(schema =>\r\n Object.keys(schema || {}).map(key => ({ label: key, value: key, })).filter(key => this.optionsSearch ? key.label.toLowerCase().includes(this.optionsSearch.toLowerCase()) : true)\r\n )\r\n )\r\n }\r\n deleteStage(index: number) {\r\n this.pipeline.deleteStage(index)\r\n }\r\n saveStage(index: number, stage: any) {\r\n this.pipeline.saveStage(index, stage)\r\n this.setActiveStage(undefined)\r\n }\r\n}\r\n","\n\n\n<section class=\"ion-margin\">\n <p>MongoDB aggregation pipeline builder for selected workflows. </p>\n</section>\n<lib-t-workflow-picker \n(valueChanged)=\"workflowChanged($event)\" \n[getWorkflowOptions]=\" workflows$\"\n [value]=\"(workflowId|async)||undefined\">\n</lib-t-workflow-picker>\n<mat-accordion multi *ngIf=\"workflowId|async\">\n <!-- Pipeline Accordion -->\n <mat-expansion-panel value=\"pipeline\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner color=\"accent\" *ngIf=\"isRunningPipeline\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">\n dynamic_form\n </mat-icon>\n {{isRunningPipeline?'Executing current Data pipeline...':'Data retrieval pipeline'}}\n </mat-panel-title>\n\n </mat-expansion-panel-header>\n <div class=\"content\">\n <!-- Mongodb aggregate pipelione stages management and edit start-->\n <div *ngIf=\"((stages | async)?.length || 0) ===0\" class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>\n Add stages to the pipeline below.<br>\n Each stage processes input documents by filtering, grouping, or calculating values. The output documents from\n one stage are passed to the next stage in the pipeline.\n </span>\n </div>\n\n <mat-nav-list style=\" background: var(--mat-tree-container-background-color);padding:0px;border-radius:8px\">\n\n\n <ng-container *ngFor=\"let stage of stages | async; trackBy: trackById;index as $index;last as isLast\">\n <mat-list-item [style.margin-top]=\"(activeStageIndex|async) ===$index?'4px':'0px'\"\n [class.mat-elevation-z8]=\"(activeStageIndex|async) ===$index\" class=\"stage-item\"\n (click)=\"setActiveStage($index)\" [activated]=\" (activeStageIndex|async) ===$index\">\n <span class=\"stage-index\" matListItemAvatar>{{$index + 1}} </span>\n <div matListItemTitle>\n <div style=\"line-height: normal;\">\n {{ stage.name || 'Stage ' }}\n </div>\n <div class=\"stage-inner-message\" *ngIf=\"!stage.name && (activeStageIndex|async) !==$index \">\n Incomplete , click to edit\n </div>\n\n </div>\n\n <button *ngIf=\"(activeStageIndex|async) ===$index||!stage.valid && (activeStageIndex|async) !==$index\"\n mat-icon-button matListItemMeta>\n <mat-icon color=\"primary\" *ngIf=\"(activeStageIndex|async) ===$index\">check_circle</mat-icon>\n\n <mat-icon color=\"warn\" *ngIf=\"!stage.valid && (activeStageIndex|async) !==$index\">\n warning\n </mat-icon>\n </button>\n </mat-list-item>\n <mat-divider></mat-divider>\n\n <app-aggregate-stage-editor [selectedStage]=\"stage\" [isRunningPipeline]=\"isRunningPipeline\"\n (deleteStage)=\"deleteStage($index)\" (saveStage)=\"saveStage($index,$event)\"\n *ngIf=\"(activeStageIndex|async) ===$index\"></app-aggregate-stage-editor>\n\n\n </ng-container>\n\n <mat-toolbar style=\"padding: 0px;\">\n\n <span class=\"spacer\"></span>\n <button class=\"stage-button\" [disabled]=\"isRunningPipeline\" color=\"primary\" (click)=\"addStage()\"\n mat-raised-button>\n Add\n <mat-icon>add</mat-icon>\n </button>\n </mat-toolbar>\n </mat-nav-list>\n\n <!-- Mongodb aggregate pipelione stages management and edit end -->\n </div>\n </mat-expansion-panel>\n\n <!-- Results Accordion -->\n <mat-expansion-panel value=\"results\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner color=\"accent\" *ngIf=\"isRunningPipeline\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">dataset</mat-icon>\n {{isRunningPipeline?'Running pipeline...':'Data Results'}}\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"content\">\n <ng-container *ngIf=\"pipeLineResults | async as results; else noResults\">\n\n <lib-t-dynamic-data-view *ngIf=\"results\" [data]=\"results\"></lib-t-dynamic-data-view>\n <p *ngIf=\"!results\" color=\"medium\">\n\n No results available\n\n </p>\n\n </ng-container>\n <ng-template #noResults>\n <p color=\"medium\">No results available</p>\n </ng-template>\n </div>\n </mat-expansion-panel>\n\n <!-- AI Agent Accordion -->\n <mat-expansion-panel value=\"ai\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner *ngIf=\" aiIsGeneratingPipeline \" style=\"position: absolute;\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">tips_and_updates</mat-icon>\n {{ aiIsGeneratingPipeline ? 'Agent busy ...' : 'AI AGENT prompt' }}\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n @if( schemaLoadError$ | async){\n <div class=\"tree-instructions\" style=\"background: antiquewhite !important;\">\n <mat-icon class=\"info-icon\" color=\"warn\">error</mat-icon>\n <span> {{ schemaLoadError$ | async }}</span>\n </div>\n \n }\n <mat-list *ngFor=\"let chat of chatHistory|async;\">\n\n <mat-list-item class=\"chatContent chatItem\">\n <div class=\"chat\" style=\"background:bisque;text-align:end;\n border-radius: 18px 18px 0px 18px;\" matListItemTitle>\n <div>\n {{chat.user}}\n </div>\n <div style=\"opacity:0.6;line-height: normal;display: flex;align-items: center;justify-content: flex-end;\">\n {{chat.date|daysAgo}}\n <mat-icon class=\"sent-icon\">\n done_all\n </mat-icon>\n </div>\n </div>\n </mat-list-item>\n\n <mat-list-item style=\"margin-top: 16px;\" class=\"chatContent chatItem\" color=\"light\" lines=\"full\">\n <mat-icon style=\" margin-left: 0px;\n margin-top: 16px;\n margin-bottom: auto;\" matListItemIcon>smart_toy</mat-icon>\n <div class=\"chat\" style=\"text-align: left; \n padding-left: 16px; \n background: azure;\n border-radius: 0px 18px 18px 18px;\" *ngIf=\"!chat.assistance?.error\" matListItemTitle>\n <pre>\n {{chat. assistance.pipeline |json}}\n </pre>\n </div>\n <div *ngIf=\"chat.assistance?.error\" matListItemTitle>\n {{chat.assistance.error}}\n </div>\n </mat-list-item>\n\n\n </mat-list>\n <mat-list>\n <mat-list-item class=\"chatContent chatItem\">\n <textarea matListItemTitle #textarea style=\" width: calc(100% - 13px);\n border-radius: 14px;\n padding-right: 3px;\n padding-left: 8px;\" class=\"chat\" [value]=\" prompt|async\" (input)=\"onTextChange($event)\"\n placeholder=\"Provide a pipeline generation prompt\"></textarea>\n <button matListItemMeta style=\" margin-left: 4px;\n margin-right: 0px;\" color=\"primary\" mat-mini-fab [disabled]=\"aiIsGeneratingPipeline\" (click)=\"promptSubmit()\">\n\n <mat-icon style=\"margin: 0px !important;color:white\">send</mat-icon>\n <mat-spinner color=\"accent\" *ngIf=\" aiIsGeneratingPipeline \" \n class=\"submit-spinner\" ></mat-spinner>\n </button>\n \n </mat-list-item>\n\n </mat-list>\n\n\n <section *ngIf=\"showSuggestions\" class=\"showSuggestionContainer\">\n <!-- <mat-toolbar class=\"search-container\" style=\"background: inherit;\">\n\n\n <input type=\"search\" placeholder=\"Search options\" class=\"search-field\" (change)=\"onSearchChange($event)\">\n\n <mat-icon>\n search\n </mat-icon>\n </mat-toolbar> -->\n <mat-divider></mat-divider>\n <div style=\"padding: 8px;\">\n <div class=\"suggestion-container\">\n <div class=\"suggestion-column\">\n <h5>Collection document properties</h5>\n <div class=\"button-container\">\n <button *ngFor=\"let method of getSchemaProperties | async;trackBy: trackById\"\n (click)=\"selectSuggestionInput(method.value)\" color=\"accent\" mat-flat-button\n class=\"suggestion-button\">\n {{ method.label | titlecase }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n </div>\n </section>\n\n\n\n\n\n\n\n </div>\n </mat-expansion-panel>\n</mat-accordion>\n\n\n\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOpen]=\"disabled\"\n>\n<div style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5);\">\n\n\n</div>\n</ng-template>\n"],"names":["i3","i8","i5","i6","i7","i10"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;MAoBa,mBAAmB,CAAA;AAG9B,IAAA,WAAA,CAAoB,EAAe,EAAA;QAAf,IAAE,CAAA,EAAA,GAAF,EAAE;AADtB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAE;AAmB1B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAGpC;AACF,QAAA,IAAA,CAAA,QAAQ,GAAW,EAAE,CAAC;QACtB,IAAY,CAAA,YAAA,GAAkB,IAAI;QAtBhC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;AAC5B,YAAA,QAAQ,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ;AACnC,SAAA,CAAC;QACF,IAAI,CAAC,IAAI,EAAE;;IAEb,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;;AAGlC,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,IAAG,OAAO,CAAC,OAAO,CAAC,CAAC,YAAY,KAAI,IAAI,CAAC,MAAM,EAAC;YAClE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,YAAY;YAC3C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;;;IAahD,IAAI,GAAA;AACH,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;AACtD,aAAA,IAAI,CACH,YAAY,CAAC,IAAI,CAAC;aAEnB,SAAS,CAAC,KAAK,IAAG;AACjB,YAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;SACjC,CAAC,CAAC;;IAII,oBAAoB,CAAC,KAAa,EAAC,OAAgB,EAAA;AACzD,QAAA,IAAI;;YAGF,MAAM,UAAU,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAI,IAAI,GAAE,KAAK,GAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;AAGvF,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;;YAG1D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;YAC1C,IAAI,CAAC,IAAI,EAAE;AACT,gBAAA,IAAI,CAAC,YAAY,GAAG,yBAAyB;gBAC7C;;;YAIF,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACnD,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,UAAU,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC;;QACpD,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,YAAY,WAAW,EAAE;;AAEhC,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;AACpE,gBAAA,IAAI,CAAC,YAAY,GAAG,CAAsB,mBAAA,EAAA,YAAY,EAAE;;iBACnD;AACL,gBAAA,IAAI,CAAC,YAAY,GAAG,+CAA+C;;YAErE,IAAG,OAAO,EAAC;AACT,gBAAA,OAAO,CAAC,GAAG,CAAC,SAAS,EAAC,KAAK,CAAC;AAC5B,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;AAEtE,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,CAAC;;;;IAM5C,oBAAoB,CAAC,KAAa,EAAE,OAAe,EAAA;QACzD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACrD,IAAI,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE;YACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC;AACrD,YAAA,OAAO,CAAe,YAAA,EAAA,QAAQ,CAAW,QAAA,EAAA,OAAO,mDAAmD;;AAErG,QAAA,OAAO,OAAO;;;AAIR,IAAA,eAAe,CAAC,KAAa,EAAE,QAAgB,EAAE,gBAAwB,EAAE,EAAA;AACjF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;AACnD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,aAAa,CAAC;QAC5D,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;;+GA5FzB,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBhC,wwBA4BA,EDdI,MAAA,EAAA,CAAA,gwBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,kIACZ,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGV,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAZ/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EAGf,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,gBAAgB;wBAChB,WAAW;wBACX;AACD,qBAAA,EAAA,QAAA,EAAA,wwBAAA,EAAA,MAAA,EAAA,CAAA,gwBAAA,CAAA,EAAA;gFAsBM,KAAK,EAAA,CAAA;sBAAb;gBACS,WAAW,EAAA,CAAA;sBAApB;;;MEjBY,6BAA6B,CAAA;IAMxC,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;;AAGjC,IAAA,WAAA,GAAA;AATA,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAE;QAExB,IAAiB,CAAA,iBAAA,GAAY,KAAK;AACjC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAA6B;AACzD,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAQ;AAQhD,QAAA,IAAA,CAAA,WAAW,GAA8B,SAAS,CAAC;QACnD,IAAa,CAAA,aAAA,GAA0D,EAAE;;IAIzE,QAAQ,GAAA;;AAGN,QAAA,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,iBAAiB,EAAS;;AAGjE,IAAA,YAAY,CAAC,KAAsB,EAAA;AAE/B,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK;AACjC,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE;YAClC,IAAI,CAAC,WAAW,GAAG;AACjB,gBAAA,KAAK,EAAE,aAAa;AACpB,gBAAA,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE;aAEX;;aACb;YACL,IAAI,CAAC,WAAW,GAAG;gBACjB,MAAM,EAAG,IAAI,CAAC,WAAW,EAAE,MAAM,IAAG,IAAI,CAAC,aAAc,EAAE,MAAM;AAC/D,gBAAA,KAAK,EAAE;aACS;;AAGpB,QAAA;AACA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,MAAa,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE;YAEhE,IAAI,CAAC,cAAc,EAAE;;;AAK3B,IAAA,kBAAkB,CAAC,KAAU,EAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,IAAI,CAAC,WAAW,GAAG;AACjB,gBAAA,GAAG,IAAI,CAAC,aAAa,IAAK,EAAE;aACZ;;QAEpB,IAAI,CAAC,WAAW,GAAG;YACjB,KAAK,EAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAK,IAAI,CAAC,aAAc,EAAE,IAAI;YAC3D,MAAM,EAAE,KAAK,CAAC;SACE;QAClB,IAAI,CAAC,cAAc,EAAE;;IAGvB,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;QACtC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,IAAI,EAAmB;;QAGjE,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE;YACrC,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,MAAM,EAAE,KAAK,CAAC;AAC9D,YAAA,IAAI,CAAC,WAAY,CAAC,KAAK,GAAG,KAAK;AAC/B,YAAA,OAAO;;AAGT,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,eAAe,CAAC,mBAAmB,CAAC,KAAY,EAAE,MAAM,CAAC;AACvE,YAAA,IAAI,CAAC,WAAY,CAAC,KAAK,GAAG,KAAK;;YAG/B,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,IAAI,CAAC,qBAAqB,GAAG,SAAS;gBACtC;;;QAEF,OAAO,KAAU,EAAE;;AAEnB,YAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,2BAA2B;AAClG,YAAA,IAAI,CAAC,WAAY,CAAC,KAAK,GAAG,KAAK;YAC/B,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,qBAAqB,CAAC;;;IAIlE,aAAa,GAAA;QACX,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,qBAAqB;;IAG1D,iBAAiB,GAAA;;AAEf,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAA4B,CAAC;;;IAK1D,YAAY,CAAC,KAAa,EAAE,KAAU,EAAA;QACpC,OAAO,KAAK,CAAC,KAAK;;AAGpB,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;;AAIrD,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,WAAW;;IAK/F,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;;+GArHd,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxB1C,okEAgEW,ED9CP,MAAA,EAAA,CAAA,ioBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,gBAAgB,itEAChB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGV,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAbzC,SAAS;+BACE,4BAA4B,EAAA,UAAA,EAG1B,IAAI,EAEP,OAAA,EAAA;wBACP,gBAAgB;wBAChB,YAAY;wBACZ,WAAW;wBACX;AACD,qBAAA,EAAA,QAAA,EAAA,okEAAA,EAAA,MAAA,EAAA,CAAA,ioBAAA,CAAA,EAAA;wDAIQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,iBAAiB,EAAA,CAAA;sBAAzB;gBACS,SAAS,EAAA,CAAA;sBAAlB;gBACS,WAAW,EAAA,CAAA;sBAApB;;;MEXU,eAAe,CAAA;AAyB1B,IAAA,WAAA,GAAA;;QAvBA,IAAiB,CAAA,iBAAA,GAAY,KAAK;QAClC,IAAsB,CAAA,sBAAA,GAAY,KAAK;QACvC,IAAsB,CAAA,sBAAA,GAAY,KAAK;QACvC,IAAuB,CAAA,uBAAA,GAAY,KAAK;;AAGxC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,eAAe,CAAmB,SAAS,CAAC;AAC9D,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,eAAe,CAAmB,SAAS,CAAC;AAC/D,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,eAAe,CAAmB,SAAS,CAAC;AAC1D,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,eAAe,CAAmB,SAAS,CAAC;AAGnE,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,eAAe,CAAkB,EAAE,CAAC;AACpD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,eAAe,CAAmB,SAAS,CAAC;AAC5D,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,eAAe,CAAmB,SAAS,CAAC;AAC1D,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAkB,EAAE,CAAC;AACzD,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,eAAe,CAAU,EAAE,CAAC;AAClD,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,eAAe,CAI7B,EAAE,CAAC;AACR,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;;QAGvB,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;QACjD,IAAG,QAAQ,EAAC;AACV,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;;;AAIjC,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAC1B,SAAS,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CACzC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAC7C,GAAG,CAAC,YAAY,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAC9D,CAAC,CACH,CAAC,CACH;;AAEH;;;AAGG;IACH,WAAW,CAAC,QAAyB,EAAC,UAAiB,EAAA;QACrD,MAAM,GAAG,GAAG,0DAA0D;;AAGtE,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,GAAG,EACH,EAAE,QAAQ,EAAC,UAAU,EAAE,CACxB,CAAC,IAAI,CACJ,IAAI,CAAC,CAAC,CAAC,EACP,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;QAC5B,QAAQ,CAAC,MAAM,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAC/C;;AAGH;;;;AAIG;IACK,gBAAgB,CAAC,KAAa,EAAE,MAA0B,EAChE,QAAyB,EAAE,gBAAiC,EAAC,aAAoB,EAAA;QACjF,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;;AAEvC,QAAA,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAC;QAC3E,MAAM,GAAG,GAAG,+DAA+D;AAC3E,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAA8B,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,OAAO;AACjE,aAAA,IAAI,CACH,IAAI,CAAC,CAAC,CAAC,EACP,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;QAC5B,QAAQ,CAAC,MAAM,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC,CACpD;;AAGL;;;;AAIG;AACK,IAAA,WAAW,CAAC,KAAU,EAAA;AAC5B,QAAA,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC;;QAEzC,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;;AAK1G,IAAA,SAAS,CAAC,UAAkB,EAAA;QAGlC,IAAG,CAAC,UAAU,EAAC;AACb,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;;QAE3C,MAAM,GAAG,GAAG,wDAAwD;AACpE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAqB,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAC7F,IAAI,CAAC,CAAC,CAAC,EACP,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;SAC7B;;;AAGL,IAAA,aAAa,CAAC,MAAa,EAAA;;AAGzB,IAAA,eAAe,CAAC,KAAU,EAAA;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAG,CAAC,KAAK,EAAC;YACR;;QAEF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CACtB,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAI;AACjB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACvB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;YAC9F,MAAM,KAAK,GAAG;AACd,kBAAE;kBACA,SAAS;AACb,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;AACjC,YAAA,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC;YAClD,IAAI,CAAC,iBAAiB,EAAE;AAC1B,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC;AAClD,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAChC,SAAC,CAAC,CACL,CAAC,SAAS,EAAE;;AAIf,IAAA,cAAc,CAAC,CAAkB,EAAA;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC1C,QAAA,IAAG,KAAK,KAAK,CAAC,EAAC;AACb,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;YACjC;;AAEF,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;;IAI3B,QAAQ,GAAA;AACN,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAS,CAAC;AAC/D,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;;AAElC,IAAA,YAAY,CAAC,KAAU,EAAA;AACrB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACxB,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;IAEpB,YAAY,GAAA;;QAEV,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAC,IAAI,CAAC,OAAO,EAAC,IAAI,CAAC,YAAY,CAAC;aACxF,IAAI,CACH,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,MAAM,EAAC,OAAO,CAAC,KAAI;AAClD,YAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE;gBACtB,OAAO,CAAC,IAAI,CAAC,CAAA,uBAAA,EAA0B,MAAM,CAAW,QAAA,EAAA,MAAM,CAAE,CAAA,CAAC;;AAErE,SAAC,CAAC,EACF,MAAM,CAAC,CAAC,CAAC,MAAM,MAAG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,IAAK,CAAC,CAAC,MAAM,CAAE,EACrD,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,MAAM,EAAC,OAAO,CAAC,KAAI;;AAExD,YAAA,MAAM,aAAa,GAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAC,CAAC,CAAC,EAAE,UAAmB,EAAE,KAAK;YAC5E,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;AACnF,YAAA,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAC7C,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC;AAC1E,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAC,aAAa,CAAC,CAAC,IAAI,CACtF,GAAG,CAAC,CAAC,QAAQ,MAAM,EAAE,GAAG,QAAQ,EAAC,OAAO,EAAC,MAAM,EAAC,CAAC,CAAC,CACnD;AACH,SAAC,CAAC,EACF,GAAG,CAAC,CAAC,QAAQ,KAAI;YACf,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,OAAO,EAAC,MAAM,EAAE,GAAG,QAAQ;AACtD,YAAA,MAAM,aAAa,GAAG;AACpB,gBAAA,IAAI,EAAE,MAAa;AACnB,gBAAA,UAAU,EAAE,QAAQ;gBACpB,IAAI,EAAC,IAAI,IAAI;aACd;;AAGD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,IAAE,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7B,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAG7B,YAAA,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC;;AAG1C,YAAA,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;YAC5C,IAAI,CAAC,iBAAiB,EAAE;AAC1B,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAA8B,KAAI;YAE5C,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;AACxD,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAChC,SAAC,CAAC,CACH,CAAC,SAAS,EAAE;;IAIjB,iBAAiB,GAAA;AACf,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAE,EAAE,CAAC,CAAC;QACvG,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAI,CAAC,CAAC;QAC5E,IAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,eAAe,EAAE;YAC3C;;AAEF,QAAA,IAAI;AACD,YAAA,eAAe,CAAC,gBAAgB,CAAC,QAAQ,CAAC;;QAC3C,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,EAAC,QAAQ,CAAC;YAC7B;;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;QAC9C,IAAI,CAAC,UAAU,EAAE;YACf;;QAGF,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAC,UAAU,CAAC,CAAC,IAAI,CACxC,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAI;AAClB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC;AACvC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC7C,YAAA,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK;YAC9B,IAAG,YAAY,EAAC;AACd,gBAAA,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC;;AAE7C,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAChC,SAAC,CAAC,CACH,CAAC,SAAS,EAAE;;AAGf,IAAA,wBAAwB,CAAC,OAAc,EAAA;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAG;AACvC,QAAA,MAAM,aAAa,GAAG;AACpB,YAAA,IAAI,EAAE,MAAa;AACnB,YAAA,UAAU,EAAE;gBACV;AACM,aAAA;YACR,IAAI,EAAC,IAAI,IAAI;SACd;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,IAAE,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;;AAG3D,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,IAAI,CACvC,SAAS,CAAC,QAAQ,IAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CACxC,GAAG,CAAC,WAAW,IAAE,WAAW,KAAK,SAAS,GAAG,SAAS,GAAG;AACvD,YAAA,IAAI,EAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACpD,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAE,EAAE;SACtF,CAAC,CACH,CAAC,CACH;;IAGH,SAAS,CAAC,KAAY,EAAC,KAAgC,EAAA;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;AAC1C,QAAA,IAAG,KAAK,KAAK,SAAS,EAAC;YACrB;;QAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACxC,YAAA,IAAI,CAAC,KAAK,KAAK,EAAE;gBACf,OAAO,KAAK,GAAG;AACb,oBAAA,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;iBACtB,GAAG,CAAC;;AAEP,YAAA,OAAO,CAAC;AACV,SAAC,CAAC;AAEF,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAC,WAAW,CAAC;AACtC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAkB,CAAC;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AACjC,QAAA,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;QACxC,IAAI,CAAC,iBAAiB,EAAE;;AAGzB,IAAA,WAAW,CAAC,KAAY,EAAA;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;AAE1C,QAAA,IAAG,KAAK,KAAK,SAAS,EAAC;YACrB;;AAEF,QAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AAC1D,QAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAC,WAAW,CAAC;AACtC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAkB,CAAC;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AACjC,QAAA,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;QACzC,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,IAAI,CACvC,GAAG,CAAC,QAAQ,IAAE;YACX,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;YAC3E,IAAG,CAAC,YAAY,EAAC;gBACf,OAAO;AACJ,oBAAA,KAAK,EAAC,KAAK;AACX,oBAAA,OAAO,EAAC;iBACV;;AAEH,YAAA,MAAM,uBAAuB,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,KAA6B,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAE,EAAE,CAAC,KAAK,SAAS,CAAC;YAClI,IAAG,CAAC,uBAAuB,EAAC;gBAC1B,OAAO;AACL,oBAAA,KAAK,EAAC,KAAK;AACX,oBAAA,OAAO,EAAC;iBACT;;YAEH,OAAO;AACL,gBAAA,KAAK,EAAC;aACP;SACJ,CAAC,CACH;;+GA7TQ,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCwBY,0BAA0B,CAAA;aAC9B,IAAM,CAAA,MAAA,GAAG,CAAH,CAAK;IAIlB,WAAuC,CAAA,SAAoB,EAAU,WAAoC,EAAA;QAAlE,IAAS,CAAA,SAAA,GAAT,SAAS;QAAqB,IAAW,CAAA,WAAA,GAAX,WAAW;AAHhF,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;AAClC,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,wBAAwB,CAAC;AACtC,QAAA,IAAA,CAAA,EAAE,GAAG,CAA2B,uBAAA,EAAA,0BAA0B,CAAC,MAAM,EAAE,EAAE;QAGpF,IAAW,CAAA,WAAA,GAAW,EAAE;QAExB,IAAO,CAAA,OAAA,GAAY,KAAK;QAOxB,IAAQ,CAAA,QAAA,GAAY,KAAK;QACjB,IAAQ,CAAA,QAAA,GAAY,KAAK;QA0BjC,IAAO,CAAA,OAAA,GAAY,KAAK;AACxB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAK,GAAG;AA8CV,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAkC;QAElE,IAAM,CAAA,MAAA,GAAoC,EAAE;AACrD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AACtB,QAAA,IAAA,CAAA,QAAQ,GAAoB,IAAI,eAAe,EAAE;QAOzD,IAAS,CAAA,SAAA,GAAY,KAAK;QAC1B,IAAoB,CAAA,oBAAA,GAAG,MAAK;AAC1B,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CACxB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CACpF,CAAC,SAAS,CAAC,MAAM,IAAG;AACnB,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,oBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;oBACrB;;AAGF,gBAAA,MAAM,SAAS,GAAQ;oBACrB,GAAG,IAAI,CAAC,MAAM;AACd,oBAAA,GAAG,MAAM;AACT,oBAAA,QAAQ,EAAE,eAAe;iBAE1B;AACD,gBAAA,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,SAAS,CAAC;AACjD,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AACnC,aAAC,CAAC;AAGJ,SAAC;QAmDD,IAAc,CAAA,cAAA,GAAG,CAAC;QAClB,IAAe,CAAA,eAAA,GAAG,KAAK;QA8CvB,IAAa,CAAA,aAAA,GAAG,EAAE;QASlB,IAAS,CAAA,SAAA,GAAG,CAAC,KAAa,EAAE,KAAU,KAAK,KAAK;;AA5NhD,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK;;AAEpB,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK;;AAItC,IAAA,IAAI,UAAU,GAAA;QACT,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,IAAE,EAAE,EAAE,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO;AAElG,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAK,QAAQ;;AAOrD,IAAA,iBAAiB,CAAC,GAAa,EAAA;;QAE7B,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;AACtD,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,yBAAyB,CAAC;;YAE9F,IAAI,cAAc,EAAE;AAClB,gBAAA,cAAc,CAAC,YAAY,CAAC,kBAAkB,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;;;AAIpE,IAAA,gBAAgB,CAAC,KAAiB,EAAA;QAChC,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;;IAK1B,aAAa,GAAA;AACX,QAAA,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;;;IAYvB,IAAa,KAAK,CAAC,KAAqC,EAAA;QACtD,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,KAAK,EAAE,UAAU;AACvE,QAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,MAAM;QACvF,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC;AACxG,QAAA,IAAI,iBAAiB,IAAG,qBAAqB,IAAI,sBAAsB,EAAE;AAEvE,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,YAAA,IAAG,KAAK,EAAE,UAAU,EAAC;AACnB,gBAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC;;AAGzC,YAAA,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,KAAK,EAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;AAC1E,YAAA,IAAG,KAAK,EAAE,QAAQ,EAAC;AACjB,gBAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC;;;;IAUzD,IAAa,kBAAkB,CAAC,QAA6D,EAAA;AAC3F,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ;;IAW5B,QAAQ,GAAA;QACN,IAAI,CAAC,oBAAoB,EAAE;;IA2B7B,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;;AAE1B,IAAA,eAAe,CAAC,KAAU,EAAA;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC;;AAEtC,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,EAAE;;AAEjD,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,IAAI,CAChD,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;YACjC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5B,YAAA,MAAM,EAAG,KAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAE,EAAE,CAAC;AACnD,YAAA,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAE,KAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAE,EAAE;SAC/E,CAAC,CAAC,CAAC,CACL;;AAEH,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,EAAE;;AAErD,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE;;AAE7C,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,sBAAsB;;AAE7C,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE;;AAElD,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;AACtC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW;;AAElC,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB;;AAExC,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAC5C,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CACrB;;AAEL,IAAA,IAAI,gBAAgB,GAAA;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE;;AAEtD,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE;;AAIlD,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,aAAa,EAAE;YAC3C;;AAEF,QAAA,OAAO,CAAC,GAAG,CAAC,cAAc,EAAC,KAAK,CAAC;AACjC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAA2B,CAAC,KAAK;AACxD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa;QACtD,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,CAAC;QAElD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;AAClD,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;AAEtE,QAAA,IAAI,QAAQ,KAAK,GAAG,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,EAAE;AACzD,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,IAAG,EAAE,GAAG,EAAE;;aAC5C;AACL,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE;;AAGzB,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC;;AAEtC,IAAA,qBAAqB,CAAC,UAAkB,EAAA;AACtC,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,IAAI,CACvC,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MAAM,IAAG;AACX,YAAA,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;YACrE,MAAM,YAAY,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;YACpF,MAAM,WAAW,GAAG,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;YACtD,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,GAAG,GAAG,WAAW;YACtD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AAClC,YAAA,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC;AACxC,SAAC,CAAC,CACH,CAAC,SAAS,EAAE;;AAEf,IAAA,qBAAqB,CAAC,UAAe,EAAA;AACnC,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAE5B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa;QACtD,QAAQ,CAAC,KAAK,EAAE;QAChB,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAM;QACjE,UAAU,CAAC,MAAK;AACd,YAAA,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;SACjE,EAAE,CAAC,CAAC;;AAGP,IAAA,cAAc,CAAC,KAAU,EAAA;QACvB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK;;IAGzC,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;AAC5B,QAAA,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;;AAI7B,IAAA,cAAc,CAAC,KAAyB,EAAA;AAEtC,QAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC;;IAErC,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;;AAE1B,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,IAAI,CAC9C,GAAG,CAAC,MAAM,IACR,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,CAClL,CACF;;AAEH,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;;IAElC,SAAS,CAAC,KAAa,EAAE,KAAU,EAAA;QACjC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;AACrC,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;;+GA3PrB,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,IAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,EAF1B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,SAAA,EAAA,EAAA,EAAA,SAAA,EAAA,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAC,0BAA0B,EAAC,CAAC,qHA8DrD,UAAU,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrG3C,q1RA8OA,EAAA,MAAA,EAAA,CAAA,k2DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjNI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,wBAAwB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,aAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACxB,WAAW,EACX,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,yBAAyB,EACzB,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,gBAAgB,EAChB,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,GAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,qEAAA,EAAA,MAAA,EAAA,CAAA,2BAAA,EAAA,8BAAA,EAAA,qCAAA,EAAA,4BAAA,EAAA,4BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,8BAAA,EAAA,kCAAA,EAAA,+BAAA,EAAA,mCAAA,EAAA,mCAAA,EAAA,yBAAA,EAAA,iCAAA,EAAA,sCAAA,EAAA,gCAAA,EAAA,iCAAA,EAAA,uCAAA,EAAA,kCAAA,EAAA,yBAAA,EAAA,wCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,6BAA6B,EAC7B,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,WAAW,+CACX,aAAa,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKJ,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAlBtC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EAGtB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,wBAAwB;wBACxB,WAAW;wBACX,yBAAyB;wBACzB,gBAAgB;wBAChB,6BAA6B;wBAC7B,WAAW;wBACX;qBAED,EACU,SAAA,EAAA,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAA2B,0BAAA,EAAC,CAAC,EAAA,QAAA,EAAA,q1RAAA,EAAA,MAAA,EAAA,CAAA,k2DAAA,CAAA,EAAA;;0BAOvE;;0BAAY;kEADV,EAAE,EAAA,CAAA;sBAAhB;gBAaO,QAAQ,EAAA,CAAA;sBAAhB;gBA2C4D,kBAAkB,EAAA,CAAA;sBAA7E,SAAS;uBAAC,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;gBAC7C,KAAK,EAAA,CAAA;sBAAjB;gBAuBY,kBAAkB,EAAA,CAAA;sBAA9B;gBAIQ,QAAQ,EAAA,CAAA;sBAAhB;gBAES,YAAY,EAAA,CAAA;sBAArB;gBAEQ,MAAM,EAAA,CAAA;sBAAd;;;;;"}
1
+ {"version":3,"file":"ngx-t-forms-pipeline-generator.component-CGKxfvvC.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/json-editor/json-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/json-editor/json-editor.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/elements/aggregate-stage-editor/aggregate-stage-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/elements/aggregate-stage-editor/aggregate-stage-editor.component.html","../../../projects/ngx-t-forms/src/lib/services/hhtpResources/Pipeline/pipeline.service.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/pipeline-generator.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/pipeline-generator/pipeline-generator.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChanges } from '@angular/core';\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\n\nimport { debounceTime, Subscription } from 'rxjs';\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\n\n\n@Component({\n selector: 'app-json-editor',\n templateUrl: './json-editor.component.html',\n styleUrls: ['./json-editor.component.scss'],\n standalone: true,\n imports: [\n CommonModule,\n MatModulesModule,\n FormsModule,\n ReactiveFormsModule\n ]\n})\nexport class JsonEditorComponent implements OnChanges ,OnDestroy{\n jsonForm: FormGroup;\n subscriptions = new Subscription();\n constructor(private fb: FormBuilder){\n this.jsonForm = this.fb.group({\n jsonText: ['', Validators.required]\n });\n this.init()\n }\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe()\n }\n private _value:any\n ngOnChanges(changes: SimpleChanges,): void {\n if (changes['value']&& changes['value'].currentValue !==this._value){\n this._value = changes['value'].currentValue\n this.parseAndBeautifyJson(this._value ,true)\n\n }\n }\n@Input() value!:Object \n@Output() valueChange = new EventEmitter<{\n value: Object|Array<any>,\n valid: boolean\n}>()\n jsonText: string = ''; // Placeholder for the JSON text\n errorMessage: string | null = null;\n\n\n init(){\n this.subscriptions.add( this.jsonForm.get('jsonText')!.valueChanges\n .pipe(\n debounceTime(1000)\n )\n .subscribe(value => {\n this.parseAndBeautifyJson(value);\n })) \n \n }\n \n private parseAndBeautifyJson(value: string,hardSet?:boolean): void {\n try {\n\n // Attempt to parse the JSON\n const parsedJson = typeof value === 'object' && value !==null? value: JSON.parse(value);\n \n // If valid, beautify the JSON\n const beautifiedJson = JSON.stringify(parsedJson, null, 4);\n \n // Update form control value with beautified JSON\n const form = this.jsonForm.get('jsonText');\n if (!form) {\n this.errorMessage = 'Form control not found.';\n return;\n }\n \n // Set beautified JSON without emitting another change event\n form.setValue(beautifiedJson, { emitEvent: false });\n this.errorMessage = null;\n this.valueChange.emit({value:parsedJson,valid:true})\n } catch (error) {\n if (error instanceof SyntaxError) {\n // Extract the position of the error from the error message\n const errorMessage = this.getDetailedJsonError(value, error.message);\n this.errorMessage = `JSON Syntax Error: ${errorMessage}`;\n } else {\n this.errorMessage = 'Unexpected error occurred while parsing JSON.';\n }\n if(hardSet){\n console.log('hardset',value)\n this.jsonForm.get('jsonText')?.setValue(value, { emitEvent: false });\n }\n this.valueChange.emit({value:value,valid:false})\n \n }\n }\n\n // Function to give detailed JSON error information\n private getDetailedJsonError(value: string, message: string): string {\n const positionMatch = message.match(/position (\\d+)/);\n if (!!positionMatch?.[1]) {\n const position = parseInt(positionMatch[1], 10);\n const excerpt = this.getErrorExcerpt(value, position);\n return `at position ${position}: near \"${excerpt}\". Check for missing commas, brackets, or quotes.`;\n }\n return message;\n }\n\n // Helper function to extract a portion of the string around the error position\n private getErrorExcerpt(value: string, position: number, excerptLength: number = 20): string {\n const start = Math.max(0, position - excerptLength);\n const end = Math.min(value.length, position + excerptLength);\n return value.substring(start, end);\n }\n\n\n}\n","<div class=\"json-editor-container\">\n <div *ngIf=\"jsonForm.invalid\" \n style=\"margin-top: 16px;\"\n class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span> Paste or type JSON below. The editor will auto-beautify the text.</span>\n </div>\n\n\n \n <!-- Error message if JSON is invalid -->\n <div *ngIf=\"errorMessage\" \n \n style=\"\" class=\"tree-instructions json-error \">\n <span> {{errorMessage}}</span>\n </div>\n \n <form [formGroup]=\"jsonForm\">\n <textarea\n formControlName=\"jsonText\"\n class=\"json-textarea\"\n [class.error-message]=\"errorMessage\"\n rows=\"15\"\n placeholder=\"Enter your JSON here...\"></textarea>\n </form>\n <!-- JSON Textarea -->\n\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport PipelineBuilder from \"db-aggregation-pipeline-builder\"\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { JsonEditorComponent } from '../../../json-editor/json-editor.component';\nimport { IAllowedStage } from '../../../../../../services/hhtpResources/Pipeline/pipeline.service';\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\n\nimport { MatSelectChange } from '@angular/material/select';\n\n@Component({\n selector: 'app-aggregate-stage-editor',\n templateUrl: './aggregate-stage-editor.component.html',\n styleUrls: ['./aggregate-stage-editor.component.scss'],\n standalone: true,\n\n imports: [\n MatModulesModule,\n CommonModule,\n FormsModule,\n JsonEditorComponent\n ]\n})\nexport class AggregateStageEditorComponent implements OnInit {\n subscription = new Subscription();\n @Input() selectedStage:any\n @Input() isRunningPipeline: boolean = false\n @Output() saveStage = new EventEmitter<IAllowedStage | undefined>()\n @Output() deleteStage = new EventEmitter<void>()\n ngOnDestroy(): void {\n this.subscription.unsubscribe()\n }\n\n constructor() {\n\n }\n activeStage: IAllowedStage | undefined = undefined; // Define the type appropriately if possible\n allowedStages: { stage: string; description: string; config: any }[] = [];\n configValidationError: string | undefined\n\n\n ngOnInit() {\n // Debounce the config change to optimize performance\n\n this.allowedStages = PipelineBuilder.getViewOnlyStages() as any\n }\n\n handleChange(event: MatSelectChange): void {\n \n const selectedStage = event.value\n if (this.activeStage === undefined) {\n this.activeStage = {\n stage: selectedStage,\n ...this.selectedStage || {},\n\n } as IAllowedStage\n } else {\n this.activeStage = {\n config : this.activeStage?.config|| this.selectedStage ?.config,\n stage: selectedStage\n } as IAllowedStage\n\n }\n { }\n if (this.activeStage?.config as any && !!this.activeStage?.stage) {\n\n this.validateConfig();\n\n }\n }\n\n handleConfigChange(event: any): void {\n if (!this.activeStage) {\n this.activeStage = {\n ...this.selectedStage || {},\n } as IAllowedStage\n }\n this.activeStage = {\n stage:this.activeStage?.stage || this.selectedStage ?.name,\n config: event.value\n } as IAllowedStage\n this.validateConfig();\n\n }\n validateConfig(): void {\n this.configValidationError = undefined\n const { config, stage } = this.activeStage || {} as IAllowedStage;\n\n // Check if config and stage are defined\n if (!config && config !== 0 || !stage) {\n console.error('Config or stage is not defined', config, stage);\n this.activeStage!.valid = false;\n return; // Early exit if validation fails\n }\n\n try {\n const valid = PipelineBuilder.validateStageConfig(stage as any, config);\n this.activeStage!.valid = valid;\n\n // Set error message if config is invalid\n if (!valid) {\n this.configValidationError = undefined\n return;\n }\n } catch (error: any) {\n // Catch and handle errors from validation\n this.configValidationError = error.message || JSON.stringify(error) || 'An unknown error occurred';\n this.activeStage!.valid = false;\n console.error('Validation Error:', this.configValidationError);\n }\n }\n\n canSaveConfig(): boolean {\n return !!this.activeStage && !this.configValidationError;\n }\n\n saveConfiguration(): void {\n // Logic for saving the configuration\n if (this.canSaveConfig()) {\n this.saveStage.emit(this.activeStage as IAllowedStage);\n \n }\n }\n\n trackByStage(index: number, stage: any): string {\n return stage.stage;\n }\n\n get allowedStageNames(): string[] {\n return this.allowedStages.map(stage => stage.stage);\n }\n\n\n get activeDescription() {\n return this.allowedStages.find(stage => stage.stage === this.activeStage?.stage)?.description\n\n\n }\n\n deleteActive() {\n this.deleteStage.emit()\n }\n // close() {\n // this.pipeline.setActiveStage(undefined)\n // }\n\n}\n","<mat-card style=\"margin-bottom:8px\">\n <mat-card-content>\n\n <h5>\n Aggregate Pipeline Stage Configuration\n </h5>\n\n\n\n <mat-form-field style=\" margin-bottom: 8px;\" appearance=\"outline\" subscriptSizing=\"dynamic\" >\n <mat-label>Select Aggregate Stage</mat-label>\n <mat-select matNativeControl [value]=\"selectedStage?.name\" (selectionChange)=\"handleChange($event)\"\n placeholder=\"ChooseFunctionToRun\">\n <mat-option *ngFor=\"let stage of allowedStages; trackBy: trackByStage\" [value]=\"stage.stage\">\n {{stage.stage}}</mat-option>\n\n\n\n </mat-select>\n <mat-hint>\n {{activeDescription ?\n 'Hover over the info icon to view stage details .'\n : 'Please select an aggregation function from the list.'}}\n </mat-hint>\n <mat-hint *ngIf=\"activeDescription\" align=\"end\">\n <mat-icon matTooltipHideDelay=\"1000\" [matTooltip]=\"activeDescription\" matSuffix>info</mat-icon>\n </mat-hint>\n </mat-form-field>\n\n\n\n <div class=\"tree-instructions\" style=\"background: cornsilk;\" *ngIf=\"configValidationError\">\n <mat-icon style=\"margin-top: 4px;margin-bottom:auto\" class=\"info-icon\" color=\"warn\">warning</mat-icon>\n <span>{{ configValidationError }}</span>\n </div>\n\n\n\n\n\n <div class=\"config-container\" *ngIf=\"activeStage ||selectedStage?.config\">\n <app-json-editor [value]=\"selectedStage?.config\" (valueChange)=\"handleConfigChange($event)\"></app-json-editor>\n </div>\n\n <br>\n\n\n\n </mat-card-content>\n <mat-divider>\n </mat-divider>\n <mat-card-actions>\n\n <span class=\"spacer\"></span>\n <button color=\"warn\" [disabled]=\"isRunningPipeline\" mat-button (click)=\"deleteActive()\">\n Delete\n <mat-icon >delete</mat-icon>\n </button>\n <button style=\"margin-left:8px;\" color=\"primary\" mat-flat-button (click)=\"saveConfiguration()\"\n [disabled]=\"isRunningPipeline ||!activeStage?.valid \">\n Save\n <mat-icon> save</mat-icon>\n </button>\n </mat-card-actions>\n</mat-card>","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { BehaviorSubject, catchError, combineLatest, filter, finalize, map, Observable, switchMap, take, tap, throwError } from 'rxjs';\r\nimport { PipelineStage } from 'mongoose'\r\n\r\nimport PipelineBuilder from \"db-aggregation-pipeline-builder\"\r\nimport { IPipelineGenerationError, IPipelineGenerationResponse, IRunPipelineResponse, PipelineStageEnum } from 'ngx-t-forms-types';\r\nexport interface IAllowedStage {\r\n stage: PipelineStageEnum,\r\n description: string,\r\n config: any,\r\n valid?:boolean\r\n\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PipelineService {\r\n //LOADING INDICATORS\r\n isRunningPipeline: boolean = false\r\n aiIsGeneratingPipeline: boolean = false\r\n isLoadingAllowedStages: boolean = false\r\n isLoadingWorkflowSchema: boolean = false\r\n\r\n //States \r\n workflowId$ = new BehaviorSubject<string|undefined>(undefined)\r\n activeStage$ = new BehaviorSubject<number|undefined>(undefined)\r\n prompt$ = new BehaviorSubject<string|undefined>(undefined)\r\n schemaLoadError$ = new BehaviorSubject<string|undefined>(undefined)\r\n \r\n\r\n pipeline$ = new BehaviorSubject<PipelineStage[]>([])\r\n threadId$ = new BehaviorSubject<string|undefined>(undefined)\r\n schema$ = new BehaviorSubject<Object|undefined>(undefined)\r\n allowedStages$ = new BehaviorSubject<IAllowedStage[]>([])\r\n pipeLineResult$ = new BehaviorSubject<unknown>([])\r\n chatHistory$ = new BehaviorSubject<{\r\n user: string,\r\n assistance:IPipelineGenerationResponse,\r\n date:Date\r\n }[]>([])\r\n http = inject(HttpClient)\r\n constructor() { \r\n //Set local storage threadId\r\n const threadId = localStorage.getItem('threadId')\r\n if(threadId){\r\n this.threadId$.next(threadId)\r\n }\r\n }\r\n\r\n get config$() {\r\n return this.workflowId$.pipe(\r\n switchMap(workflowId => this.pipeline$.pipe(\r\n switchMap(pipeline => this.pipeLineResult$.pipe(\r\n map(responseBody => ({ workflowId, pipeline, responseBody }))\r\n ))\r\n ))\r\n );\r\n }\r\n /**\r\n * Fetch available pipeline stages for the user to select and generate pipelines.\r\n * Ideally, this could be static or fetched from a backend.\r\n */\r\n runPipeLine(pipeline: PipelineStage[],workflowId:string): Observable<IRunPipelineResponse> {\r\n const url = \"http://localhost:5000/api/v1/pipelineBuilder/runPipeline\"\r\n // For now, returning a static list of pipeline stages. In a real application, you can fetch from an API.\r\n\r\n this.isRunningPipeline = true\r\n return this.http.post<IRunPipelineResponse>(\r\n url,\r\n { pipeline,workflowId }\r\n ).pipe(\r\n take(1),\r\n catchError(this.handleError), // Error handling for the HTTP request,\r\n finalize(() => this.isRunningPipeline = false)\r\n );\r\n }\r\n\r\n /**\r\n * Generate a MongoDB pipeline based on the given user prompt.\r\n * \r\n * @param prompt The user's input or description of the desired pipeline.\r\n */\r\n private generatePipeline(query: string, schema: Object | undefined,\r\n threadId:string|undefined, existingPipeline: PipelineStage[],previousError:string): Observable<IPipelineGenerationResponse> {\r\n if (!schema) {\r\n throw new Error(\"Schema is required\")\r\n }\r\n const payload = { query, schema ,threadId, existingPipeline ,previousError};\r\n const url = \"http://localhost:5000/api/v1/pipelineBuilder/generatePipeline\";\r\n this.aiIsGeneratingPipeline = true\r\n return this.http.post<IPipelineGenerationResponse>(`${url}`, payload)\r\n .pipe(\r\n take(1),\r\n catchError(this.handleError),// Error handling for the HTTP request,\r\n finalize(() => this.aiIsGeneratingPipeline = false)\r\n );\r\n }\r\n\r\n /**\r\n * Handle any errors from the HTTP request.\r\n * \r\n * @param error The error response from the HTTP request\r\n */\r\n private handleError(error: any): Observable<never> {\r\n console.error('An error occurred', error);\r\n // Return an observable with a user-facing error message\r\n return throwError(() => new Error('Something went wrong with the pipeline generation; please try again later.'));\r\n\r\n }\r\n\r\n\r\n private getSchema(workflowId: string): Observable<{\r\n schema: object\r\n }> {\r\n if(!workflowId){\r\n throw new Error(\"WorkflowId is required\")\r\n }\r\n const url = \"http://localhost:5000/api/v1/pipelineBuilder/getSchema\";\r\n return this.http.get<{ schema: object }>(`${url}`, { params: { workflowId: workflowId } }).pipe(\r\n take(1),\r\n catchError(this.handleError) // Error handling for the HTTP request\r\n )\r\n }\r\n/** OPERATIONS */\r\nisSchemaEmpty(object:object){\r\n\r\n}\r\n workflowChanged(event: any) {\r\n this.workflowId$.next(event)\r\n if(!event){\r\n return \r\n }\r\n this.getSchema(event).pipe(\r\n take(1),\r\n tap(({ schema }) => {\r\n this.schema$.next(schema)\r\n const isEmptySchema = Object.keys( schema)[0] === \"\" && Object.values(schema)[0] === \"Array<>\"\r\n const error = isEmptySchema \r\n ? \"Document schema is missing. Please ensure at least one document exists for the selected workflow.\" \r\n : undefined\r\n this.schemaLoadError$.next(error)\r\n console.log(\"Workflow schema loaded,run pipeline\")\r\n this.runActivePipeline()\r\n }),\r\n catchError((error) => {\r\n this.schemaLoadError$.next(\"Error loading schema\");\r\n return this.handleError(error);\r\n })\r\n ).subscribe()\r\n }\r\n\r\n \r\n setActiveStage(i:number|undefined){\r\n const index = this.activeStage$.getValue()\r\n if(index === i){\r\n this.activeStage$.next(undefined)\r\n return\r\n }\r\n this.activeStage$.next(i)\r\n\r\n \r\n }\r\n addStage(){\r\n const newPipeline = this.pipeline$.getValue().concat({} as any)\r\n this.pipeline$.next(newPipeline)\r\n }\r\n onTextChange(event: any) {\r\n this.prompt$.next(event)\r\n console.log(event)\r\n }\r\n promptSubmit() {\r\n // Use combineLatest to fetch the latest values from multiple sources\r\n combineLatest([this.schema$, this.threadId$, this.pipeline$,this.prompt$,this.chatHistory$])\r\n .pipe(\r\n take(1),\r\n tap(([schema, threadId, pipeline,prompt,history]) => {\r\n if (!schema || !prompt) {\r\n console.warn(`Missing values: schema ${schema} prompt ${prompt}`);\r\n }\r\n }),\r\n filter(([schema,,,prompt]) => !!schema && !!prompt ),\r\n switchMap(([schema, threadId, pipeline,prompt,history]) => {\r\n // Use a shallow copy of the pipeline\r\n const previousError = (history[history.length-1]?.assistance as any )?.error\r\n const pipelineCopy = pipeline.map(stage => JSON.parse(JSON.stringify(stage))) || [];\r\n console.info('Generating pipeline with prompt:',\r\n prompt, 'schema:', schema, 'threadId:', threadId, 'pipeline:', pipeline)\r\n return this.generatePipeline(prompt!, schema, threadId, pipelineCopy,previousError).pipe(\r\n map((response) => ({ ...response,history,prompt}))\r\n )\r\n }),\r\n tap((response) => {\r\n const { pipeline, threadId,history,prompt } = response;\r\n const historyRecord = {\r\n user: prompt as any,\r\n assistance: response,\r\n date:new Date()\r\n };\r\n \r\n // Use next with a concatenated value for chat history\r\n this.chatHistory$.next([...(history||[]), historyRecord]);\r\n this.pipeline$.next(pipeline);\r\n this.threadId$.next(threadId);\r\n \r\n // Store threadID locally\r\n localStorage.setItem('threadId', threadId);\r\n \r\n // Run the active pipeline after all state updates are complete\r\n console.log(\"prompt submitted run pipeline\")\r\n this.runActivePipeline();\r\n }),\r\n catchError((error:IPipelineGenerationError) => {\r\n \r\n console.error('Error response:', error.message || error);\r\n return this.handleError(error);\r\n })\r\n ).subscribe();\r\n\r\n }\r\n \r\n runActivePipeline() {\r\n const pipeline = [...(this.pipeline$.getValue().map(stage => (JSON.parse(JSON.stringify(stage))))||[])]\r\n const someAreNotValid = pipeline.some(stage=>Object.keys(stage).length ===0)\r\n if(pipeline.length === 0 || someAreNotValid ){\r\n return\r\n }\r\n try {\r\n PipelineBuilder.validatePipeline(pipeline)\r\n } catch (error) {\r\n console.error(error,pipeline)\r\n return\r\n }\r\n const workflowId = this.workflowId$.getValue()\r\n if (!workflowId) {\r\n return\r\n }\r\n \r\n this.runPipeLine(pipeline,workflowId).pipe(\r\n take(1),\r\n tap(({ results }) => {\r\n this.pipeLineResult$.next(results)\r\n }),\r\n catchError((error) => {\r\n console.error('Error response:', error);\r\n const err = JSON.parse(JSON.stringify(error))\r\n const errorMessage = err.error\r\n if(errorMessage){\r\n this.pipelineErrorLogAndRetry(errorMessage)\r\n }\r\n return this.handleError(error);\r\n })\r\n ).subscribe()\r\n }\r\n\r\n pipelineErrorLogAndRetry(message:string){\r\n const history = this.chatHistory$.getValue() \r\n const prompt = this.prompt$.getValue ()\r\n const historyRecord = {\r\n user: prompt as any,\r\n assistance: {\r\n message\r\n } as any,\r\n date:new Date()\r\n };\r\n this.chatHistory$.next([...(history||[]), historyRecord]);\r\n\r\n }\r\n get activeStage():Observable<{name:string,config:PipelineStage}|undefined>{\r\n return this.pipeline$.asObservable().pipe(\r\n switchMap(pipeline=>this.activeStage$.pipe(\r\n map(activeIndex=>activeIndex === undefined ? undefined : {\r\n name:Object.keys(pipeline[activeIndex]||{})[0] || '',\r\n config:(pipeline[activeIndex] as any)[Object.keys(pipeline[activeIndex]||{})?.[0]||'']\r\n })\r\n ))\r\n )\r\n \r\n }\r\n saveStage(index:number,stage: IAllowedStage | undefined) {\r\n const pipeline = this.pipeline$.getValue()\r\n if(index === undefined){\r\n return\r\n }\r\n const newPipeline = pipeline.map((s, i) => {\r\n if (i === index) {\r\n return stage ? {\r\n [stage.stage]: stage.config\r\n } : s;\r\n }\r\n return s;\r\n });\r\n\r\n console.log(\"newPipeline\",newPipeline)\r\n this.pipeline$.next(newPipeline as any)\r\n this.activeStage$.next(undefined)\r\n console.log(\"stage saved run pipeline\")\r\n this.runActivePipeline()\r\n \r\n }\r\n deleteStage(index:number){\r\n const pipeline = this.pipeline$.getValue()\r\n\r\n if(index === undefined){\r\n return\r\n }\r\n const newPipeline = pipeline.filter((s, i) => i !== index);\r\n console.log(\"newPipeline\",newPipeline)\r\n this.pipeline$.next(newPipeline as any)\r\n this.activeStage$.next(undefined)\r\n console.log(\"stage deleted run pipeline\")\r\n this.runActivePipeline()\r\n }\r\n get pipelineGeneralValid(){\r\n return this.pipeline$.asObservable().pipe(\r\n map(pipeline=>{\r\n const allHaveTypes = pipeline.every(stage=>Object.keys(stage).length === 1)\r\n if(!allHaveTypes){\r\n return {\r\n valid:false,\r\n message:\"All stages must be a valid pipeline stage\"\r\n }\r\n }\r\n const AllStagesMustHaveConfig = pipeline.every((stage: { [key: string]: any }) => stage[Object.keys(stage)?.[0]||''] !== undefined)\r\n if(!AllStagesMustHaveConfig){\r\n return {\r\n valid:false,\r\n message:\"All stages must have a configuration\"\r\n }\r\n }\r\n return {\r\n valid:true\r\n }\r\n })\r\n )\r\n }\r\n}","import { CommonModule } from '@angular/common';\r\n\r\nimport { Component, ElementRef, EventEmitter, HostBinding, inject, Input, OnDestroy, OnInit, Optional, Output, Self, ViewChild } from '@angular/core';\r\nimport { FormsModule, NgControl } from '@angular/forms';\r\n\r\n\r\n\r\n\r\nimport { AggregateStageEditorComponent } from './elements/aggregate-stage-editor/aggregate-stage-editor.component';\r\nimport { map, Subject, takeUntil, take, tap, Observable, distinctUntilChanged } from 'rxjs';\r\nimport { MongoDbPipeLineConfigInterface } from \"ngx-t-forms-types\";\r\n\r\nimport { TDynamicDataViewComponent } from '../../../t-dynamic-data-view/t-dynamic-data-view.component';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TWorkflowPickerComponent } from '../t-workflow-picker/t-workflow-picker.component';\r\nimport { IWorkflowOption } from \"ngx-t-forms-types\";\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../lib/injection-tokens';\r\nimport { PipelineService } from '../../../../../lib/services/hhtpResources/Pipeline/pipeline.service';\r\nimport { DaysAgoPipe } from '../../../../../lib/shared/pipes/date/days-ago.pipe';\r\n\r\nimport {OverlayModule} from '@angular/cdk/overlay';\r\n@Component({\r\n selector: 'app-pipeline-generator',\r\n templateUrl: './pipeline-generator.component.html',\r\n styleUrls: ['./pipeline-generator.component.scss'],\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TWorkflowPickerComponent,\r\n FormsModule,\r\n TDynamicDataViewComponent,\r\n MatModulesModule,\r\n AggregateStageEditorComponent,\r\n DaysAgoPipe,\r\n OverlayModule\r\n\r\n ],\r\n providers: [{ provide: MatFormFieldControl, useExisting:PipelineGeneratorComponent}],\r\n})\r\nexport class PipelineGeneratorComponent implements OnInit, OnDestroy,MatFormFieldControl< MongoDbPipeLineConfigInterface> {\r\n static nextId = 0;\r\n stateChanges = new Subject<void>();\r\n NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN)\r\n @HostBinding() id = `app-pipeline-generator-${ PipelineGeneratorComponent.nextId++}`;\r\n constructor(@Optional() @Self() public ngControl: NgControl, private _elementRef: ElementRef<HTMLElement>,) {\r\n }\r\n placeholder: string = ''\r\n\r\n focused: boolean = false;\r\n get empty() {\r\n return !this.value\r\n }\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n required: boolean = false;\r\n @Input() disabled: boolean = false;\r\nget errorState(): boolean {\r\n const hasError = !!this.ngControl?.control?.errors || (this.errors||[]).length > 0 && this.touched\r\n\r\n return !this.value && !!this.required || hasError\r\n }\r\n\r\n controlType?: string | undefined;\r\n autofilled?: boolean | undefined;\r\n userAriaDescribedBy?: string | undefined;\r\n disableAutomaticLabeling?: boolean | undefined;\r\n setDescribedByIds(ids: string[]) {\r\n // Ensure the component view is initialized\r\n if (this._elementRef && this._elementRef.nativeElement) {\r\n const controlElement = this._elementRef.nativeElement.querySelector('.app-pipeline-generator');\r\n // Check if the controlElement exists before attempting to set its attribute\r\n if (controlElement) {\r\n controlElement.setAttribute('aria-describedby', ids.join(' '));\r\n }\r\n }\r\n }\r\n onContainerClick(event: MouseEvent): void {\r\n this.markAsTouched();\r\n this.stateChanges.next();\r\n }\r\n\r\n touched: boolean = false;\r\n onTouched = () => {};\r\n markAsTouched() {\r\n console.log('markAsTouched') \r\n if (!this.touched) {\r\n this.onTouched();\r\n this.touched = true;\r\n }\r\n } \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n //@ViewChild('textarea', { static: false }) textareaRef!: HTMLTextAreaElement\r\n @ViewChild('textarea', { read: ElementRef, static: false }) textareaElementRef!: ElementRef;\r\n @Input() set value(value: MongoDbPipeLineConfigInterface) {\r\n const workflowIdChanged = this._value?.workflowId !== value?.workflowId\r\n const pipelineLengthChanged = this._value?.pipeline?.length !== value?.pipeline?.length\r\n const pipeLineContentChanged = JSON.stringify(this._value?.pipeline) !== JSON.stringify(value?.pipeline)\r\n if (workflowIdChanged ||pipelineLengthChanged || pipeLineContentChanged) {\r\n\r\n this._value = value\r\n if(value?.workflowId){\r\n this.workflowChanged(value?.workflowId)\r\n }\r\n\r\n console.log('Pipeline value changed', value,this.pipeline.pipeline$.value)\r\n if(value?.pipeline){\r\n this.pipeline.pipeline$.next(value?.pipeline || [])\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n \r\n\r\n workflows$:Observable<IWorkflowOption[] | undefined> | undefined\r\n @Input() set getWorkflowOptions(options$: Observable<IWorkflowOption[]|undefined> | undefined) {\r\n this.workflows$ = options$\r\n \r\n }\r\n @Input() userName: string | undefined\r\n _value!: MongoDbPipeLineConfigInterface\r\n @Output() valueChanged = new EventEmitter<MongoDbPipeLineConfigInterface>()\r\n\r\n @Input() errors:IConfigElementError[] |undefined = [];\r\n destroy$ = new Subject<void>()\r\n private pipeline: PipelineService = new PipelineService()\r\n\r\n ngOnInit(): void {\r\n this.initiateSubscription()\r\n\r\n\r\n }\r\n initiated: boolean = false\r\n initiateSubscription = () => {\r\n this.pipeline.config$.pipe(\r\n takeUntil(this.destroy$),\r\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr))\r\n ).subscribe(config => {\r\n if (!this.initiated) {\r\n this.initiated = true\r\n return\r\n }\r\n\r\n const newConfig: any = {\r\n ...this._value,\r\n ...config,\r\n \"source\": \"mongoPipeline\",\r\n\r\n }\r\n console.log('Pipeline config changed', newConfig)\r\n this.valueChanged.emit(newConfig)\r\n })\r\n\r\n \r\n }\r\n ngOnDestroy(): void {\r\n this.destroy$.next()\r\n this.destroy$.complete()\r\n }\r\n workflowChanged(event: any) {\r\n this.pipeline.workflowChanged(event)\r\n }\r\n get workflowId() {\r\n return this.pipeline.workflowId$.asObservable()\r\n }\r\n get stages() {\r\n return this.pipeline.pipeline$.asObservable().pipe(\r\n map(stages => stages.map(stage => ({\r\n name: Object.keys(stage)[0],\r\n stage: Object.keys(stage)[0],\r\n config: (stage as any)[Object.keys(stage)?.[0]||''],\r\n valid: !!Object.keys(stage)[0] && !!(stage as any)[Object.keys(stage)?.[0]||'']\r\n })))\r\n )\r\n }\r\n get pipeLineResults() {\r\n return this.pipeline.pipeLineResult$.asObservable()\r\n }\r\n get prompt() {\r\n return this.pipeline.prompt$.asObservable()\r\n }\r\n get aiIsGeneratingPipeline() {\r\n return this.pipeline.aiIsGeneratingPipeline\r\n }\r\n get activeStageIndex() {\r\n return this.pipeline.activeStage$.asObservable()\r\n }\r\n get activeStage() {\r\n console.log(this.pipeline.activeStage)\r\n return this.pipeline.activeStage\r\n }\r\n get isRunningPipeline() {\r\n return this.pipeline.isRunningPipeline\r\n }\r\n get cannotAddStage() {\r\n return this.pipeline.pipelineGeneralValid.pipe(\r\n map(valid => !valid)\r\n )\r\n }\r\nget schemaLoadError$() {\r\n return this.pipeline.schemaLoadError$.asObservable()\r\n}\r\n get chatHistory() {\r\n return this.pipeline.chatHistory$.asObservable()\r\n }\r\n cursorPosition = 0\r\n showSuggestions = false;\r\n onTextChange(event: Event) {\r\n if (!this.textareaElementRef?.nativeElement) {\r\n return;\r\n }\r\n console.log('onTextChange',event)\r\n const newValue =(event.target as HTMLInputElement).value;\r\n const textarea = this.textareaElementRef.nativeElement;\r\n this.cursorPosition = textarea.selectionStart || 0;\r\n\r\n const lastChar = newValue[this.cursorPosition - 1];\r\n const match = newValue.slice(0, this.cursorPosition).match(/\\$(\\w*)$/);\r\n\r\n if (lastChar === '$' || (match && match[1] !== undefined)) {\r\n this.showSuggestions = true;\r\n this.optionsSearch = match ? match?.[1] ||'' : '';\r\n } else {\r\n this.showSuggestions = false;\r\n this.optionsSearch = '';\r\n }\r\n\r\n this.pipeline.onTextChange(newValue);\r\n }\r\n selectSuggestionInput(suggestion: string) {\r\n this.pipeline.prompt$.asObservable().pipe(\r\n take(1),\r\n tap(prompt => {\r\n const match = prompt?.slice(0, this.cursorPosition).match(/\\$(\\w*)$/);\r\n const beforeCursor = prompt?.slice(0, match ? match.index : this.cursorPosition - 1);\r\n const afterCursor = prompt?.slice(this.cursorPosition);\r\n prompt = beforeCursor + suggestion + ' ' + afterCursor;\r\n this.pipeline.prompt$.next(prompt);\r\n this.applyNewValueToPrompt(suggestion);\r\n })\r\n ).subscribe();\r\n }\r\n applyNewValueToPrompt(suggestion: any) {\r\n this.showSuggestions = false;\r\n\r\n const textarea = this.textareaElementRef.nativeElement;\r\n textarea.focus();\r\n const newCursorPosition = this.cursorPosition + suggestion.length;\r\n setTimeout(() => {\r\n textarea.setSelectionRange(newCursorPosition, newCursorPosition);\r\n }, 0);\r\n }\r\n optionsSearch = ''\r\n onSearchChange(event: any) {\r\n this.optionsSearch = event.detail.value\r\n\r\n }\r\n promptSubmit() {\r\n this.pipeline.promptSubmit()\r\n console.log('promptSubmit')\r\n }\r\n trackById = (index: number, stage: any) => index\r\n\r\n setActiveStage(index: number | undefined) {\r\n\r\n this.pipeline.setActiveStage(index)\r\n }\r\n addStage() {\r\n this.pipeline.addStage()\r\n }\r\n get getSchemaProperties() {\r\n return this.pipeline.schema$.asObservable().pipe(\r\n map(schema =>\r\n Object.keys(schema || {}).map(key => ({ label: key, value: key, })).filter(key => this.optionsSearch ? key.label.toLowerCase().includes(this.optionsSearch.toLowerCase()) : true)\r\n )\r\n )\r\n }\r\n deleteStage(index: number) {\r\n this.pipeline.deleteStage(index)\r\n }\r\n saveStage(index: number, stage: any) {\r\n this.pipeline.saveStage(index, stage)\r\n this.setActiveStage(undefined)\r\n }\r\n}\r\n","\n\n\n<section class=\"ion-margin\">\n <p>MongoDB aggregation pipeline builder for selected workflows. </p>\n</section>\n<lib-t-workflow-picker \n(valueChanged)=\"workflowChanged($event)\" \n[getWorkflowOptions]=\" workflows$\"\n [value]=\"(workflowId|async)||undefined\">\n</lib-t-workflow-picker>\n<mat-accordion multi *ngIf=\"workflowId|async\">\n <!-- Pipeline Accordion -->\n <mat-expansion-panel value=\"pipeline\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner color=\"accent\" *ngIf=\"isRunningPipeline\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">\n dynamic_form\n </mat-icon>\n {{isRunningPipeline?'Executing current Data pipeline...':'Data retrieval pipeline'}}\n </mat-panel-title>\n\n </mat-expansion-panel-header>\n <div class=\"content\">\n <!-- Mongodb aggregate pipelione stages management and edit start-->\n <div *ngIf=\"((stages | async)?.length || 0) ===0\" class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>\n Add stages to the pipeline below.<br>\n Each stage processes input documents by filtering, grouping, or calculating values. The output documents from\n one stage are passed to the next stage in the pipeline.\n </span>\n </div>\n\n <mat-nav-list style=\" background: var(--mat-tree-container-background-color);padding:0px;border-radius:8px\">\n\n\n <ng-container *ngFor=\"let stage of stages | async; trackBy: trackById;index as $index;last as isLast\">\n <mat-list-item [style.margin-top]=\"(activeStageIndex|async) ===$index?'4px':'0px'\"\n [class.mat-elevation-z8]=\"(activeStageIndex|async) ===$index\" class=\"stage-item\"\n (click)=\"setActiveStage($index)\" [activated]=\" (activeStageIndex|async) ===$index\">\n <span class=\"stage-index\" matListItemAvatar>{{$index + 1}} </span>\n <div matListItemTitle>\n <div style=\"line-height: normal;\">\n {{ stage.name || 'Stage ' }}\n </div>\n <div class=\"stage-inner-message\" *ngIf=\"!stage.name && (activeStageIndex|async) !==$index \">\n Incomplete , click to edit\n </div>\n\n </div>\n\n <button *ngIf=\"(activeStageIndex|async) ===$index||!stage.valid && (activeStageIndex|async) !==$index\"\n mat-icon-button matListItemMeta>\n <mat-icon color=\"primary\" *ngIf=\"(activeStageIndex|async) ===$index\">check_circle</mat-icon>\n\n <mat-icon color=\"warn\" *ngIf=\"!stage.valid && (activeStageIndex|async) !==$index\">\n warning\n </mat-icon>\n </button>\n </mat-list-item>\n <mat-divider></mat-divider>\n\n <app-aggregate-stage-editor [selectedStage]=\"stage\" [isRunningPipeline]=\"isRunningPipeline\"\n (deleteStage)=\"deleteStage($index)\" (saveStage)=\"saveStage($index,$event)\"\n *ngIf=\"(activeStageIndex|async) ===$index\"></app-aggregate-stage-editor>\n\n\n </ng-container>\n\n <mat-toolbar style=\"padding: 0px;\">\n\n <span class=\"spacer\"></span>\n <button class=\"stage-button\" [disabled]=\"isRunningPipeline\" color=\"primary\" (click)=\"addStage()\"\n mat-raised-button>\n Add\n <mat-icon>add</mat-icon>\n </button>\n </mat-toolbar>\n </mat-nav-list>\n\n <!-- Mongodb aggregate pipelione stages management and edit end -->\n </div>\n </mat-expansion-panel>\n\n <!-- Results Accordion -->\n <mat-expansion-panel value=\"results\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner color=\"accent\" *ngIf=\"isRunningPipeline\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">dataset</mat-icon>\n {{isRunningPipeline?'Running pipeline...':'Data Results'}}\n </mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"content\">\n <ng-container *ngIf=\"pipeLineResults | async as results; else noResults\">\n\n <lib-t-dynamic-data-view *ngIf=\"results\" [data]=\"results\"></lib-t-dynamic-data-view>\n <p *ngIf=\"!results\" color=\"medium\">\n\n No results available\n\n </p>\n\n </ng-container>\n <ng-template #noResults>\n <p color=\"medium\">No results available</p>\n </ng-template>\n </div>\n </mat-expansion-panel>\n\n <!-- AI Agent Accordion -->\n <mat-expansion-panel value=\"ai\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-spinner *ngIf=\" aiIsGeneratingPipeline \" style=\"position: absolute;\" class=\"header-spinner\"></mat-spinner>\n <mat-icon class=\"title-icon\">tips_and_updates</mat-icon>\n {{ aiIsGeneratingPipeline ? 'Agent busy ...' : 'AI AGENT prompt' }}\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n @if( schemaLoadError$ | async){\n <div class=\"tree-instructions\" style=\"background: antiquewhite !important;\">\n <mat-icon class=\"info-icon\" color=\"warn\">error</mat-icon>\n <span> {{ schemaLoadError$ | async }}</span>\n </div>\n \n }\n <mat-list *ngFor=\"let chat of chatHistory|async;\">\n\n <mat-list-item class=\"chatContent chatItem\">\n <div class=\"chat\" style=\"background:bisque;text-align:end;\n border-radius: 18px 18px 0px 18px;\" matListItemTitle>\n <div>\n {{chat.user}}\n </div>\n <div style=\"opacity:0.6;line-height: normal;display: flex;align-items: center;justify-content: flex-end;\">\n {{chat.date|daysAgo}}\n <mat-icon class=\"sent-icon\">\n done_all\n </mat-icon>\n </div>\n </div>\n </mat-list-item>\n\n <mat-list-item style=\"margin-top: 16px;\" class=\"chatContent chatItem\" color=\"light\" lines=\"full\">\n <mat-icon style=\" margin-left: 0px;\n margin-top: 16px;\n margin-bottom: auto;\" matListItemIcon>smart_toy</mat-icon>\n <div class=\"chat\" style=\"text-align: left; \n padding-left: 16px; \n background: azure;\n border-radius: 0px 18px 18px 18px;\" *ngIf=\"!chat.assistance?.error\" matListItemTitle>\n <pre>\n {{chat. assistance.pipeline |json}}\n </pre>\n </div>\n <div *ngIf=\"chat.assistance?.error\" matListItemTitle>\n {{chat.assistance.error}}\n </div>\n </mat-list-item>\n\n\n </mat-list>\n <mat-list>\n <mat-list-item class=\"chatContent chatItem\">\n <textarea matListItemTitle #textarea style=\" width: calc(100% - 13px);\n border-radius: 14px;\n padding-right: 3px;\n padding-left: 8px;\" class=\"chat\" [value]=\" prompt|async\" (input)=\"onTextChange($event)\"\n placeholder=\"Provide a pipeline generation prompt\"></textarea>\n <button matListItemMeta style=\" margin-left: 4px;\n margin-right: 0px;\" color=\"primary\" mat-mini-fab [disabled]=\"aiIsGeneratingPipeline\" (click)=\"promptSubmit()\">\n\n <mat-icon style=\"margin: 0px !important;color:white\">send</mat-icon>\n <mat-spinner color=\"accent\" *ngIf=\" aiIsGeneratingPipeline \" \n class=\"submit-spinner\" ></mat-spinner>\n </button>\n \n </mat-list-item>\n\n </mat-list>\n\n\n <section *ngIf=\"showSuggestions\" class=\"showSuggestionContainer\">\n <!-- <mat-toolbar class=\"search-container\" style=\"background: inherit;\">\n\n\n <input type=\"search\" placeholder=\"Search options\" class=\"search-field\" (change)=\"onSearchChange($event)\">\n\n <mat-icon>\n search\n </mat-icon>\n </mat-toolbar> -->\n <mat-divider></mat-divider>\n <div style=\"padding: 8px;\">\n <div class=\"suggestion-container\">\n <div class=\"suggestion-column\">\n <h5>Collection document properties</h5>\n <div class=\"button-container\">\n <button *ngFor=\"let method of getSchemaProperties | async;trackBy: trackById\"\n (click)=\"selectSuggestionInput(method.value)\" color=\"accent\" mat-flat-button\n class=\"suggestion-button\">\n {{ method.label | titlecase }}\n </button>\n </div>\n </div>\n\n </div>\n\n\n </div>\n </section>\n\n\n\n\n\n\n\n </div>\n </mat-expansion-panel>\n</mat-accordion>\n\n\n\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOpen]=\"disabled\"\n>\n<div style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5);\">\n\n\n</div>\n</ng-template>\n"],"names":["i8","i3","i6","i7","i9"],"mappings":"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"}