{"version":3,"file":"ngx-t-forms-data-source-picker.component-CN51SdCK.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/data-source-picker/data-source-picker.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/data-source-picker/data-source-picker.component.html"],"sourcesContent":["import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  ElementRef,\r\n  Input,\r\n  ViewEncapsulation,\r\n  computed,\r\n  inject,\r\n  input,\r\n  output,\r\n  signal,\r\n} from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { Subject } from 'rxjs';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n  APIDataFetchingConfigurationInterface,\r\n  DataSources,\r\n  ElementEditorInnerSectionElementInterface,\r\n  FormColumnInputs,\r\n  IReportDataSources,\r\n  MinimumInputRequiredInterface,\r\n  MongoDbPipeLineConfigInterface,\r\n} from 'ngx-t-forms-types';\r\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { EmptyStateComponent } from '../_shared/empty-state/empty-state.component';\r\nimport { MatChipListEditorComponent } from '../mat-chip-list-editor/mat-chip-list-editor.component';\r\nimport { PipelineGeneratorComponent } from '../pipeline-generator/pipeline-generator.component';\r\nimport { RequiredInputsComponent } from '../required-inputs/required-inputs.component';\r\nimport { RestApiCallSetupComponent } from '../rest-api-call-setup/rest-api-call-setup.component';\r\n\r\n/** Source-type option rendered in the chip selector. */\r\ninterface DataSourceOption {\r\n  label: string;\r\n  value: DataSources;\r\n}\r\n\r\n/** A configured data source decorated with the derived fields the list row renders. */\r\ninterface DataSourceRow {\r\n  readonly source: IReportDataSources;\r\n  readonly name: string;\r\n  readonly icon: string;\r\n  readonly endpoint: string;\r\n  readonly isApi: boolean;\r\n}\r\n\r\n/** The in-edit working draft: a partial source being composed before save. */\r\ntype DataSourceDraft = Partial<IReportDataSources>;\r\n\r\n/**\r\n * Internal editor element for configuring a report's data sources (API calls and\r\n * MongoDB pipelines). It is a real `MatFormFieldControl`, rendered by\r\n * `t-dynamic-data-edit` inside a `<mat-form-field>` — so the parent owns the\r\n * surrounding label, hint, and validation errors, and this component owns only\r\n * the source list, the inline editor card, and the add affordance.\r\n *\r\n * NOTE: `MatFormFieldControl<T>` mandates plain mutable `value` / `disabled` /\r\n * `required` / `placeholder` / `id` members, `@Input()` decorators, the\r\n * `focused` / `touched` / `stateChanges` members, and the `useExisting`\r\n * provider. These are framework wiring, not defects — the CLAUDE.md bans on\r\n * `@Input()` / `useExisting` do not apply to MatFormFieldControl integration.\r\n */\r\n@Component({\r\n  selector: 'lib-data-source-picker',\r\n  imports: [\r\n    MatButtonModule,\r\n    MatCardModule,\r\n    MatIconModule,\r\n    MatListModule,\r\n    MatTooltipModule,\r\n    EmptyStateComponent,\r\n    MatChipListEditorComponent,\r\n    PipelineGeneratorComponent,\r\n    RequiredInputsComponent,\r\n    RestApiCallSetupComponent,\r\n  ],\r\n  templateUrl: './data-source-picker.component.html',\r\n  styleUrl: './data-source-picker.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  providers: [{ provide: MatFormFieldControl, useExisting: DataSourcePickerComponent }],\r\n  host: {\r\n    'class': 'lib-data-source-picker',\r\n    '[attr.id]': 'id',\r\n    '[class.lib-data-source-picker--focused]': 'focused',\r\n    '[class.lib-data-source-picker--disabled]': 'disabled',\r\n  },\r\n})\r\nexport class DataSourcePickerComponent\r\n  implements MatFormFieldControl<Array<IReportDataSources> | undefined>\r\n{\r\n  static nextId = 0;\r\n\r\n  /** Emits whenever a piece of `MatFormFieldControl` state changes. */\r\n  readonly stateChanges = new Subject<void>();\r\n  readonly controlType = 'lib-data-source-picker';\r\n\r\n  id = `lib-data-source-picker-${DataSourcePickerComponent.nextId++}`;\r\n  placeholder = '';\r\n  focused = false;\r\n  touched = false;\r\n  required = false;\r\n  describedBy = '';\r\n  autofilled = false;\r\n  userAriaDescribedBy: string | undefined = undefined;\r\n  disableAutomaticLabeling: boolean | undefined = undefined;\r\n\r\n  /** Validation errors surfaced by the parent for error-state derivation. */\r\n  @Input() errors: IConfigElementError[] | undefined = [];\r\n\r\n  #disabled = false;\r\n  /** Whether the control is inert. */\r\n  @Input()\r\n  get disabled(): boolean {\r\n    return this.#disabled;\r\n  }\r\n  set disabled(value: boolean) {\r\n    this.#disabled = value;\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  // Mirror of the plain MFC `value` member, so the template + computeds react.\r\n  readonly #value = signal<Array<IReportDataSources> | undefined>(undefined);\r\n\r\n  /** Current list of configured data sources. */\r\n  @Input()\r\n  get value(): Array<IReportDataSources> | undefined {\r\n    return this.#value();\r\n  }\r\n  set value(value: Array<IReportDataSources> | undefined) {\r\n    if (this.#value() === value) {\r\n      return;\r\n    }\r\n    this.#value.set(value);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  // Mirror of the plain `editorConfig` member, so the template reacts.\r\n  readonly #editorConfig = signal<ElementEditorInnerSectionElementInterface | undefined>(\r\n    undefined,\r\n  );\r\n\r\n  /** Editor configuration supplying postman / workflow option providers. */\r\n  @Input()\r\n  get editorConfig(): ElementEditorInnerSectionElementInterface | undefined {\r\n    return this.#editorConfig();\r\n  }\r\n  set editorConfig(config: ElementEditorInnerSectionElementInterface | undefined) {\r\n    this.#editorConfig.set(config);\r\n  }\r\n\r\n  /** All available form inputs the user can map a required input to. */\r\n  readonly formInputs = input<Array<FormColumnInputs>>([]);\r\n\r\n  /** Emits the mutated data-source list whenever the user adds or removes a source. */\r\n  readonly valueChange = output<Array<IReportDataSources> | undefined>();\r\n\r\n  readonly ngControl = inject(NgControl, { self: true, optional: true });\r\n  readonly #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n  /** Source-type enum, exposed to the template. */\r\n  protected readonly dataSources = DataSources;\r\n\r\n  /** The selectable source types in the chip selector. */\r\n  protected readonly dataSourceOptions: DataSourceOption[] = [\r\n    { label: 'API', value: DataSources.Api },\r\n    { label: 'MongoDB', value: DataSources.MongoDb },\r\n  ];\r\n\r\n  /** The in-edit draft, or `undefined` when the editor card is closed. */\r\n  protected readonly draft = signal<DataSourceDraft | undefined>(undefined);\r\n\r\n  /** Decorated rows for the configured-source list. */\r\n  protected readonly rows = computed<readonly DataSourceRow[]>(() =>\r\n    (this.#value() ?? []).map((source, index) => ({\r\n      source,\r\n      name: this.#name(source, index),\r\n      icon: source.source === DataSources.Api ? 'api' : 'storage',\r\n      endpoint: this.#endpoint(source),\r\n      isApi: source.source === DataSources.Api,\r\n    })),\r\n  );\r\n\r\n  /** Whether any data source is configured. */\r\n  protected readonly hasSources = computed<boolean>(() => (this.#value() ?? []).length > 0);\r\n\r\n  /** The `minimumInputRequired` list of the draft's API config, or `undefined`. */\r\n  protected readonly draftMinimumInputRequired = computed<\r\n    readonly MinimumInputRequiredInterface[] | undefined\r\n  >(() => {\r\n    const config = this.draft()?.config;\r\n    if (!config || !this.#isApiConfig(config)) {\r\n      return undefined;\r\n    }\r\n    return config.backEndConfig?.minimumInputRequired;\r\n  });\r\n\r\n  // ---- MatFormFieldControl getters (read during the framework's CD) --------\r\n\r\n  get empty(): boolean {\r\n    return (this.#value() ?? []).length === 0;\r\n  }\r\n\r\n  get shouldLabelFloat(): boolean {\r\n    return this.focused || !this.empty;\r\n  }\r\n\r\n  get errorState(): boolean {\r\n    const requiredUnset = this.empty && this.required;\r\n    const ngControlError = this.ngControl?.errors != null;\r\n    const externalError = (this.errors?.length ?? 0) > 0 && this.touched;\r\n    return requiredUnset || ngControlError || externalError;\r\n  }\r\n\r\n  setDescribedByIds(ids: string[]): void {\r\n    this.describedBy = ids.join(' ');\r\n    const el = this.#elementRef.nativeElement;\r\n    const control = el.querySelector('.lib-data-source-picker__list');\r\n    control?.setAttribute('aria-describedby', this.describedBy);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  onContainerClick(): void {\r\n    this.markAsTouched();\r\n    if (!this.focused) {\r\n      this.focused = true;\r\n    }\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  onTouched: () => void = () => {};\r\n\r\n  markAsTouched(): void {\r\n    if (!this.touched) {\r\n      this.touched = true;\r\n      this.onTouched();\r\n      this.stateChanges.next();\r\n    }\r\n  }\r\n\r\n  // ---- Draft editing -------------------------------------------------------\r\n\r\n  /** Open the editor card with an empty draft. */\r\n  protected startEditing(): void {\r\n    this.draft.set({});\r\n  }\r\n\r\n  /** Discard the draft and close the editor card. */\r\n  protected cancelEditing(): void {\r\n    this.draft.set(undefined);\r\n  }\r\n\r\n  /** Set the draft's source type. Child chip editor emits an unknown payload. */\r\n  protected sourceTypeChanged(source: unknown): void {\r\n    this.draft.update((current) =>\r\n      current ? { ...current, source: source as DataSources | undefined } : current,\r\n    );\r\n  }\r\n\r\n  /** Set the draft's source config (API setup or pipeline). */\r\n  protected sourceConfigChanged(\r\n    config: APIDataFetchingConfigurationInterface | MongoDbPipeLineConfigInterface | undefined,\r\n  ): void {\r\n    this.draft.update((current) => (current ? { ...current, config } : current));\r\n  }\r\n\r\n  /** Merge the required-input list into the draft's API config. */\r\n  protected minimumInputRequiredValueChanged(\r\n    value: Array<MinimumInputRequiredInterface>,\r\n  ): void {\r\n    this.draft.update((current) => {\r\n      if (!current?.config || !this.#isApiConfig(current.config)) {\r\n        return current;\r\n      }\r\n      const config: APIDataFetchingConfigurationInterface = {\r\n        ...current.config,\r\n        backEndConfig: { ...current.config.backEndConfig, minimumInputRequired: value },\r\n      };\r\n      return { ...current, config };\r\n    });\r\n  }\r\n\r\n  /** Commit the draft as a new source (assigning a fresh id) and emit. */\r\n  protected saveNewSource(): void {\r\n    const current = this.draft();\r\n    if (!current) {\r\n      return;\r\n    }\r\n    const data: IReportDataSources = { ...current, id: crypto.randomUUID() } as IReportDataSources;\r\n    const next = [...(this.#value() ?? []), data];\r\n    this.value = next;\r\n    this.draft.set(undefined);\r\n    this.markAsTouched();\r\n    this.valueChange.emit(next);\r\n  }\r\n\r\n  /** Remove a configured source by id and emit. */\r\n  protected removeSource(source: IReportDataSources): void {\r\n    const current = this.#value();\r\n    if (!current) {\r\n      return;\r\n    }\r\n    const next = current.filter((item) => item.id !== source.id);\r\n    this.value = next;\r\n    this.markAsTouched();\r\n    this.valueChange.emit(next);\r\n  }\r\n\r\n  #name(value: IReportDataSources, index: number): string {\r\n    if (this.#isApiConfig(value.config) && value.config.name) {\r\n      return value.config.name;\r\n    }\r\n    return value.source === DataSources.Api ? `API ${index + 1}` : `MongoDB ${index + 1}`;\r\n  }\r\n\r\n  #endpoint(value: IReportDataSources): string {\r\n    if (this.#isApiConfig(value.config)) {\r\n      return value.config.httpEndPoint ?? '';\r\n    }\r\n    return value.config.workflowId ?? '';\r\n  }\r\n\r\n  #isApiConfig(\r\n    config: APIDataFetchingConfigurationInterface | MongoDbPipeLineConfigInterface | undefined,\r\n  ): config is APIDataFetchingConfigurationInterface {\r\n    return config?.source === DataSources.Api;\r\n  }\r\n}\r\n","<div class=\"lib-data-source-picker__list\">\r\n  @if (hasSources()) {\r\n    <mat-list class=\"lib-data-source-picker__sources\">\r\n      @for (row of rows(); track row.source.id) {\r\n        <mat-list-item\r\n          class=\"lib-data-source-picker__source\"\r\n          matTooltipPosition=\"before\"\r\n          [matTooltip]=\"row.source.source + ' ' + row.endpoint\">\r\n          <mat-icon\r\n            matListItemIcon\r\n            class=\"lib-data-source-picker__icon\"\r\n            [class.lib-data-source-picker__icon--api]=\"row.isApi\">\r\n            {{ row.icon }}\r\n          </mat-icon>\r\n          <span matListItemTitle class=\"lib-data-source-picker__name\">{{ row.name }}</span>\r\n          <span matListItemLine class=\"lib-data-source-picker__endpoint\">{{ row.endpoint }}</span>\r\n          <button\r\n            matListItemMeta\r\n            mat-icon-button\r\n            type=\"button\"\r\n            [attr.aria-label]=\"'Remove ' + row.name\"\r\n            [disabled]=\"disabled\"\r\n            (click)=\"removeSource(row.source)\">\r\n            <mat-icon>delete</mat-icon>\r\n          </button>\r\n        </mat-list-item>\r\n      }\r\n    </mat-list>\r\n  } @else {\r\n    <lib-empty-state icon=\"storage\" message=\"No data sources configured. Add one to get started.\" />\r\n  }\r\n</div>\r\n\r\n@if (draft(); as draft) {\r\n  <mat-card appearance=\"outlined\" class=\"lib-data-source-picker__editor\">\r\n    <mat-card-content>\r\n      <label [attr.for]=\"id + '-type'\" class=\"lib-data-source-picker__label\">Select source type</label>\r\n      <lib-mat-chip-list-editor\r\n        [id]=\"id + '-type'\"\r\n        [value]=\"draft.source\"\r\n        [options]=\"dataSourceOptions\"\r\n        (valueChange)=\"sourceTypeChanged($event)\" />\r\n\r\n      @if (draft.source !== undefined) {\r\n        @switch (draft.source) {\r\n          @case (dataSources.Api) {\r\n            <label [attr.for]=\"id + '-api'\" class=\"lib-data-source-picker__label\">Select API</label>\r\n            <lib-rest-api-call-setup\r\n              [id]=\"id + '-api'\"\r\n              [postmanCollectionConfig]=\"editorConfig?.postmanCollectionConfig\"\r\n              [httpGetDataFunction]=\"editorConfig?.httpGetDataFunction\"\r\n              [value]=\"$any(draft.config)\"\r\n              (valueChanged)=\"sourceConfigChanged($event)\" />\r\n\r\n            @if (draftMinimumInputRequired(); as minimumInputRequired) {\r\n              <lib-required-inputs\r\n                [id]=\"id + '-required-inputs'\"\r\n                [formInputs]=\"formInputs() || []\"\r\n                [value]=\"minimumInputRequired\"\r\n                [errors]=\"[]\"\r\n                (valueChanged)=\"minimumInputRequiredValueChanged($event)\" />\r\n            }\r\n          }\r\n          @case (dataSources.MongoDb) {\r\n            <label [attr.for]=\"id + '-pipeline'\" class=\"lib-data-source-picker__label\">Add a MongoDB pipeline</label>\r\n            <lib-pipeline-generator\r\n              [id]=\"id + '-pipeline'\"\r\n              [value]=\"$any(draft.config)\"\r\n              [getWorkflowOptions]=\"editorConfig?.getWorkflowOptions\"\r\n              (valueChanged)=\"sourceConfigChanged($event)\" />\r\n          }\r\n        }\r\n      }\r\n    </mat-card-content>\r\n\r\n    <mat-card-actions class=\"lib-data-source-picker__actions\">\r\n      <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"saveNewSource()\">Save source</button>\r\n      <span class=\"lib-data-source-picker__spacer\"></span>\r\n      <button mat-button color=\"warn\" type=\"button\" (click)=\"cancelEditing()\">Cancel</button>\r\n    </mat-card-actions>\r\n  </mat-card>\r\n} @else {\r\n  <button\r\n    mat-stroked-button\r\n    color=\"primary\"\r\n    type=\"button\"\r\n    class=\"lib-data-source-picker__add\"\r\n    [disabled]=\"disabled\"\r\n    (click)=\"startEditing()\">\r\n    <mat-icon>add</mat-icon>\r\n    Add data source\r\n  </button>\r\n}\r\n"],"names":["i1","i2","i3"],"mappings":"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"}