{"version":3,"file":"ngx-t-forms-forms-builder-menu.component-DisrOv5x.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/form-builder/elements/select-form-template/select-form-template.component.ts","../../../projects/ngx-t-forms/src/lib/components/form-builder/elements/select-form-template/select-form-template.component.html","../../../projects/ngx-t-forms/src/lib/components/form-builder/elements/form-submissions-config/config.ts","../../../projects/ngx-t-forms/src/lib/components/form-builder/elements/form-submissions-config/form-submissions-config.component.ts","../../../projects/ngx-t-forms/src/lib/components/form-builder/elements/form-submissions-config/form-submissions-config.component.html","../../../projects/ngx-t-forms/src/lib/components/form-builder/elements/forms-builder-menu/forms-builder-menu.component.ts","../../../projects/ngx-t-forms/src/lib/components/form-builder/elements/forms-builder-menu/forms-builder-menu.component.html"],"sourcesContent":["import { AsyncPipe, TitleCasePipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, OnInit, inject } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { FormsStoreService } from '../../../forms/store/forms-store.service';\r\nimport { getAvatar } from '../../../../shared/functions/getAvatar';\r\n\r\nimport { DaysAgoPipe } from '../../../../../lib/shared/pipes/date/days-ago.pipe';\r\nimport type { FormInterface } from 'ngx-t-forms-types';\r\n\r\n@Component({\r\n  selector: 'lib-select-form-template',\r\n  imports: [\r\n    AsyncPipe,\r\n    TitleCasePipe,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatProgressSpinnerModule,\r\n    MatTooltipModule,\r\n    DaysAgoPipe,\r\n  ],\r\n  templateUrl: './select-form-template.component.html',\r\n  styleUrl: './select-form-template.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SelectFormTemplateComponent implements OnInit {\r\n  readonly #store = inject(FormsStoreService);\r\n  readonly #dialogRef = inject(MatDialogRef<SelectFormTemplateComponent>);\r\n  // TODO(phase-3): MAT_DIALOG_DATA payload shape is not typed by callers; keep `unknown` here.\r\n  protected readonly data = inject<unknown>(MAT_DIALOG_DATA);\r\n\r\n  protected readonly selectForms$ = this.#store.selectors.selectForms$;\r\n  protected readonly selectLoadingForms$ = this.#store.selectors.selectLoadingForms$;\r\n\r\n  ngOnInit(): void {\r\n    this.#store.effects.loadForms$();\r\n  }\r\n\r\n  protected close(): void {\r\n    this.#dialogRef.close();\r\n  }\r\n\r\n  protected selectForm(form: FormInterface): void {\r\n    this.#store.actionsFormBuilder.applyFormTemplate(form);\r\n    this.#dialogRef.close(form);\r\n  }\r\n\r\n  protected getFormAvatar(formTitle: string): string {\r\n    return getAvatar(formTitle);\r\n  }\r\n}\r\n","<div class=\"template-select-dialog\">\r\n  <!-- Header: icon + title + subtitle per design rule §4 -->\r\n  <header class=\"dialog-header\">\r\n    <div class=\"header-icon\" aria-hidden=\"true\">\r\n      <mat-icon>description</mat-icon>\r\n    </div>\r\n    <div class=\"header-text\">\r\n      <h1 class=\"header-title\">Choose a Form Template</h1>\r\n      <p class=\"header-subtitle\">\r\n        Select a pre-built form template to start with. You can customize and save it as your own form after copying it to the editor.\r\n      </p>\r\n    </div>\r\n  </header>\r\n\r\n  <section class=\"dialog-content\">\r\n    @if (selectLoadingForms$ | async) {\r\n      <div class=\"loading-state\">\r\n        <mat-spinner diameter=\"40\" aria-label=\"Loading form templates\"></mat-spinner>\r\n        <span class=\"loading-text\">Loading form templates...</span>\r\n      </div>\r\n    } @else {\r\n      <ul class=\"form-template-list\" aria-label=\"Available form templates\">\r\n        @for (form of selectForms$ | async; track form._id) {\r\n          <li>\r\n          <button\r\n            type=\"button\"\r\n            class=\"form-list-item\"\r\n            (click)=\"selectForm(form)\"\r\n            [matTooltip]=\"'Click to select this template'\"\r\n            [attr.aria-label]=\"'Select template: ' + form.formTitle\">\r\n            <img\r\n              class=\"form-avatar\"\r\n              [class.form-avatar--error]=\"form.errors.length > 0\"\r\n              [src]=\"getFormAvatar(form.formTitle)\"\r\n              [alt]=\"''\"\r\n              aria-hidden=\"true\">\r\n            <div class=\"form-item-content\">\r\n              <span class=\"form-title\">{{ form.formTitle | titlecase }}</span>\r\n              <div class=\"form-metadata\">\r\n                @if (form.errors.length > 0) {\r\n                  <span class=\"metadata-item\">\r\n                    <mat-icon color=\"warn\" aria-hidden=\"true\">error</mat-icon>\r\n                    <small>{{ form.errors.length }}</small>\r\n                  </span>\r\n                  <span class=\"metadata-divider\" aria-hidden=\"true\">•</span>\r\n                }\r\n                <span class=\"metadata-item\">\r\n                  <mat-icon aria-hidden=\"true\">add_circle_outline</mat-icon>\r\n                  <small>{{ form.createdAt | daysAgo }}</small>\r\n                </span>\r\n                <span class=\"metadata-divider\" aria-hidden=\"true\">•</span>\r\n                <span class=\"metadata-item\">\r\n                  <mat-icon aria-hidden=\"true\">update</mat-icon>\r\n                  <small>{{ form.updatedAt | daysAgo }}</small>\r\n                </span>\r\n              </div>\r\n            </div>\r\n          </button>\r\n          </li>\r\n        }\r\n      </ul>\r\n\r\n      @if ((selectForms$ | async)?.length === 0) {\r\n        <div class=\"empty-state\">\r\n          <mat-icon class=\"empty-state-icon\" aria-hidden=\"true\">folder_off</mat-icon>\r\n          <p>No form templates available.</p>\r\n        </div>\r\n      }\r\n    }\r\n  </section>\r\n\r\n  <footer class=\"dialog-actions\">\r\n    <button mat-button (click)=\"close()\" aria-label=\"Close dialog\">\r\n      Close\r\n    </button>\r\n  </footer>\r\n</div>\r\n","\r\n\r\nimport { ConfigurationValidTestInterface, ElementEditorInnerSectionElementInterface, ElementEditorTypes, NgxTFormsConfig, SpecialElementKeys } from \"ngx-t-forms-types\"\r\n\r\n\r\n\r\n\r\nexport function  SubmissionAPIListItemConfig (environment: NgxTFormsConfig): ElementEditorInnerSectionElementInterface[]{\r\n  return [\r\n\r\n      {\r\n        id: '16140923-0542-4d5d-9b63-186c1e91b1a7',\r\n        name: SpecialElementKeys.MatOptionsApiCall,\r\n        editType: ElementEditorTypes.ApiCall,\r\n        required: true,\r\n        postmanCollectionConfig: {\r\n          collectionUrl: environment['POSTMAN_COLLECTION_URL'] as string,\r\n          collectionKey: environment['POSTMAN_COLLECTION_KEY'] as string\r\n        },\r\n        hint: `APIs are loaded from Postman collection. Configure required headers, payload format, and response mapping before use. Ensure API is documented in Postman.`,\r\n        deepBind: ['data'],\r\n        label: 'Select form submission api',\r\n      },\r\n      \r\n      {\r\n        name: SpecialElementKeys.Default,\r\n        deepBind: [\r\n\r\n          'data',\r\n          'backEndConfig',\r\n          'minimumInputRequired',\r\n        ],\r\n        additionalTest: [\r\n          {\r\n            testType: 'exists',\r\n            deepBind: [\r\n\r\n              'data',\r\n              'backEndConfig',\r\n              'minimumInputRequired',\r\n            ],\r\n          } as ConfigurationValidTestInterface\r\n\r\n        ],\r\n        hint: `These are payload fields that are required to be filled in order to fetch data from the selected source`,\r\n        editType: ElementEditorTypes.RequiredInputs,\r\n        label: 'Set up required inputs',\r\n        id: \"2d0f1e18-897b-4c28-97bc-3078be09f8ee\"\r\n      },\r\n      {\r\n        name: SpecialElementKeys.Default,\r\n        deepBind: ['data','projectFormData'],\r\n        editType: ElementEditorTypes.FormPayloadProjection,\r\n        label: 'Project form data',\r\n        defaultValue: `data:{$formValue}`,\r\n        hint: 'Choose how the submitted form is shaped before it is sent — sent flat, or wrapped under one or more keys.',\r\n        id: \"$2d0f1e18-897b-4c28-97bc-3078be09f8ee\"\r\n    },\r\n    ]}\r\nexport const SubmissionAPIOtherConfig : ElementEditorInnerSectionElementInterface[] = [\r\n    {\r\n        id:\"7acaa5d1-fb37-4dc0-9f1a-53b6f36534e0\",\r\n        name:SpecialElementKeys.Default,\r\n        deepBind:['submissionHandle','submissionMessage'],\r\n        editType:ElementEditorTypes.Input,\r\n        label:\"Submission Message\",\r\n        hint:\"Message shown to the user after successful form submission.\",\r\n    },\r\n    {\r\n        id:\"5636c16c-be58-48d9-b701-81fe05573a39\",\r\n        name:SpecialElementKeys.Default,\r\n        deepBind:['submissionHandle','innerComponentShowSubmitButton'],\r\n        editType:ElementEditorTypes.Toggle,\r\n        label:\"Show submit button in inner component form\",\r\n    },\r\n    {\r\n      id:\"c9103faa-eeba-4cf3-b3d0-f25fd05ccb3c\",\r\n      name:SpecialElementKeys.Default,\r\n      deepBind:['systemDefault'],\r\n      editType:ElementEditorTypes.Toggle,\r\n      label:\"Is system default\",\r\n  }\r\n] \r\n  \r\n export const SubmissionDialogConfig = [\r\n    {\r\n        titleIcon:'send',\r\n        id:'44023662-7343-4c93-999d-fc03c54438c3',\r\n        title:'Form Submission Endpoint',\r\n        description:`Choose where to send your form data after submission. Connect to your database, data pipeline, or\r\n            third-party service.`,\r\n        primaryKey:'submissionAPI',\r\n        sectionLabel:'Submission Endpoints',\r\n        emptyMessage:'No submission endpoints configured. Add one to send form data.',\r\n        elements : SubmissionAPIOtherConfig\r\n    },\r\n    {\r\n        titleIcon:'rule',\r\n        title:'Data Validation Rules',\r\n        description:`Define validation rules to ensure data quality before form submission.\r\n            <br>\r\n            <strong>Note:</strong> All validation endpoints must return a boolean value -\r\n            <code>true</code> indicates valid data that will be submitted.`,\r\n        primaryKey:'canSubmitAPI',\r\n        sectionLabel:'Validation Endpoints',\r\n        emptyMessage:'No validation endpoints configured. Add one to validate data before submission.',\r\n        id:'acac6045-5b13-4c8d-a7ee-da194ebbad41',\r\n    }\r\n ]","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\r\n\r\nimport { ClipboardModule } from '@angular/cdk/clipboard';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { SubmissionAPIListItemConfig, SubmissionDialogConfig } from './config';\r\nimport { FormsStoreService } from '../../../forms/store/forms-store.service';\r\nimport { testAgainstItem } from '../../../t-dynamic-data-edit/functions/testData';\r\n\r\nimport { TDynamicDataEditComponent } from '../../../t-dynamic-data-edit/t-dynamic-data-edit.component';\r\n\r\nimport { assignDeepPropertyToObject } from '../../../../../lib/shared';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../lib/injection-tokens';\r\n\r\nimport {\r\n  APIDataFetchingConfigurationInterface,\r\n  ElementEditorInnerSectionElementInterface,\r\n  validateApiDataFetchingConfiguration,\r\n} from 'ngx-t-forms-types';\r\n\r\ntype SubmissionApiKey = 'submissionAPI' | 'canSubmitAPI';\r\n\r\n@Component({\r\n  selector: 'lib-form-submissions-config',\r\n  imports: [\r\n    ClipboardModule,\r\n    MatButtonModule,\r\n    MatDialogModule,\r\n    MatDividerModule,\r\n    MatExpansionModule,\r\n    MatFormFieldModule,\r\n    MatIconModule,\r\n    MatTooltipModule,\r\n    TDynamicDataEditComponent,\r\n  ],\r\n  templateUrl: './form-submissions-config.component.html',\r\n  styleUrl: './form-submissions-config.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormSubmissionsConfigComponent {\r\n  // TODO: NGX_T_FORMS_CONFIG should be #private; kept accessible due to template/getter usage.\r\n  protected readonly NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n\r\n  readonly #data: { store: FormsStoreService } = inject(MAT_DIALOG_DATA);\r\n  readonly store: FormsStoreService = this.#data.store;\r\n  readonly #matDialog = inject(MatDialog);\r\n\r\n  protected readonly form = computed(\r\n    () => this.store.signalSelectors.selectFormInEdit()?.form,\r\n  );\r\n\r\n  protected readonly formInputs = this.store.formBuilderSignalSelectors.getAllFormInputs;\r\n\r\n  protected readonly formValidationError = this.store.formBuilderSignalSelectors.formErrors;\r\n\r\n  /** The endpoint currently open in the inline editor (one panel at a time). */\r\n  protected readonly keyInEdit = signal<SubmissionApiKey | undefined>(undefined);\r\n\r\n  /** Draft endpoint being added or edited; `undefined` when the editor is closed. */\r\n  protected readonly dataPlaceholder = signal<\r\n    { data: APIDataFetchingConfigurationInterface } | undefined\r\n  >(undefined);\r\n\r\n  /** True when the inline editor is updating an existing endpoint rather than adding one. */\r\n  protected readonly isEditingExisting = computed(\r\n    () => this.dataPlaceholder()?.data?._id != null,\r\n  );\r\n\r\n  /**\r\n   * Panels enriched with their live endpoint list and required-state error.\r\n   * Driven entirely from {@link SubmissionDialogConfig}, so adding a panel is a\r\n   * config-only change — no template branching on `primaryKey`.\r\n   */\r\n  protected readonly panels = computed(() => {\r\n    const form = this.form();\r\n    return SubmissionDialogConfig.map((panel) => {\r\n      const apis = form?.submissionHandle?.[panel.primaryKey as SubmissionApiKey] ?? [];\r\n      const error =\r\n        panel.primaryKey === 'submissionAPI' && apis.length === 0\r\n          ? 'At least one submission API is required'\r\n          : undefined;\r\n      return { ...panel, apis, error };\r\n    });\r\n  });\r\n\r\n  /** Editor elements for the inline endpoint form, gated by their `additionalTest`. */\r\n  protected readonly submissionApiElements = computed(() => {\r\n    const placeholder = this.dataPlaceholder() ?? { data: {} };\r\n    return SubmissionAPIListItemConfig(this.NGX_T_FORMS_CONFIG).filter(\r\n      (el) =>\r\n        !el.additionalTest ||\r\n        el.additionalTest.every((test) => testAgainstItem(test, placeholder)),\r\n    );\r\n  });\r\n\r\n  /** Validation errors for the draft endpoint, computed once per change. */\r\n  readonly #placeholderErrors = computed(() =>\r\n    validateApiDataFetchingConfiguration(this.dataPlaceholder() ?? {}).map((error) => ({\r\n      message: error.message,\r\n      key: 'data.' + error.key,\r\n    })),\r\n  );\r\n\r\n  /** Store-level validation errors bound to a given panel element. */\r\n  errorsFor(\r\n    element: ElementEditorInnerSectionElementInterface,\r\n  ): { key: string; message: string }[] {\r\n    const bind = element.deepBind?.join('.');\r\n    return this.formValidationError()?.filter((error) => error.key === bind) ?? [];\r\n  }\r\n\r\n  /** Draft-endpoint validation errors bound to a given inline-editor element. */\r\n  validationErrors(\r\n    element: ElementEditorInnerSectionElementInterface,\r\n  ): { key: string; message: string }[] {\r\n    const bind = element.deepBind?.join('.');\r\n    return this.#placeholderErrors().filter((error) => error.key === bind);\r\n  }\r\n\r\n  /**\r\n   * Event payload types from `lib-t-dynamic-data-edit` are heterogeneous (per\r\n   * element kind). Until that emission contract is narrowed via a discriminated\r\n   * union, accept `unknown` and forward through; element-level handlers narrow.\r\n   */\r\n  elementBlur(_event: unknown, _element: ElementEditorInnerSectionElementInterface): void {\r\n    // intentional no-op\r\n  }\r\n\r\n  formInputChange(value: unknown, ele: ElementEditorInnerSectionElementInterface): void {\r\n    this.store.actionsFormBuilder.formInputChange(ele, value);\r\n  }\r\n\r\n  elementConfigurationChanged(\r\n    value: unknown,\r\n    ele: ElementEditorInnerSectionElementInterface,\r\n  ): void {\r\n    const applyTo = { ...this.dataPlaceholder() };\r\n    if (ele.clearOnChange) {\r\n      ele.clearOnChange.forEach((clear: string[]) => {\r\n        assignDeepPropertyToObject(applyTo, clear, undefined);\r\n      });\r\n    }\r\n    if (ele.deepBind) {\r\n      assignDeepPropertyToObject(applyTo, ele.deepBind, value);\r\n    }\r\n    // Placeholder shape is dynamic — `applyTo` is built from a partial spread plus\r\n    // deep-bind assignments. The data field is known to be the API configuration\r\n    // type by contract with the element editor.\r\n    this.dataPlaceholder.set({ ...applyTo } as { data: APIDataFetchingConfigurationInterface });\r\n  }\r\n\r\n  addNewSubmitApi(key: string): void {\r\n    this.dataPlaceholder.set({ data: {} as APIDataFetchingConfigurationInterface });\r\n    this.keyInEdit.set(key as SubmissionApiKey);\r\n  }\r\n\r\n  editSubmitApi(api: APIDataFetchingConfigurationInterface, key: string): void {\r\n    this.dataPlaceholder.set({ data: { ...api } });\r\n    this.keyInEdit.set(key as SubmissionApiKey);\r\n  }\r\n\r\n  saveSubmitApi(): void {\r\n    this.store.actionsFormBuilder.saveSubmitApi(this.dataPlaceholder(), this.keyInEdit());\r\n    this.#closeEditor();\r\n  }\r\n\r\n  removeSubmissionApi(api: APIDataFetchingConfigurationInterface, key: string): void {\r\n    this.store.actionsFormBuilder.removeSubmissionApi(api, key as SubmissionApiKey);\r\n    this.#closeEditor();\r\n  }\r\n\r\n  cancelSubmitApi(): void {\r\n    this.#closeEditor();\r\n  }\r\n\r\n  close(): void {\r\n    this.#matDialog.closeAll();\r\n  }\r\n\r\n  #closeEditor(): void {\r\n    this.dataPlaceholder.set(undefined);\r\n    this.keyInEdit.set(undefined);\r\n  }\r\n}\r\n","<div class=\"submissions-dialog\">\r\n  <!-- Header: icon + title + subtitle per design rule §4 -->\r\n  <header class=\"dialog-header\">\r\n    <div class=\"header-icon\" aria-hidden=\"true\">\r\n      <mat-icon>settings</mat-icon>\r\n    </div>\r\n    <div class=\"header-text\">\r\n      <h1 class=\"header-title\">Form Submission Configuration</h1>\r\n      <p class=\"header-subtitle\">Configure how your form is submitted and validated before submission.</p>\r\n    </div>\r\n    <button mat-icon-button mat-dialog-close [attr.aria-label]=\"'Close dialog'\" class=\"header-close\">\r\n      <mat-icon>close</mat-icon>\r\n    </button>\r\n  </header>\r\n\r\n  <section class=\"dialog-content\">\r\n    <mat-accordion multi>\r\n      @for (panel of panels(); track panel.id) {\r\n        <mat-expansion-panel [expanded]=\"true\" class=\"config-panel\">\r\n          <mat-expansion-panel-header class=\"panel-header\">\r\n            <mat-panel-title class=\"panel-title\">\r\n              <mat-icon class=\"panel-icon\" [color]=\"'primary'\">{{ panel.titleIcon }}</mat-icon>\r\n              {{ panel.title }}\r\n            </mat-panel-title>\r\n          </mat-expansion-panel-header>\r\n\r\n          <div class=\"panel-content\">\r\n            <p class=\"panel-description\" [innerHTML]=\"panel.description\"></p>\r\n\r\n            <!-- Dynamic form elements (submission message, toggles, etc.) -->\r\n            @if ((panel?.elements || []).length > 0) {\r\n              <div class=\"edit-section\">\r\n                @for (edit of (panel?.elements || []); track edit.id) {\r\n                  <div class=\"edit-field\">\r\n                    <lib-t-dynamic-data-edit\r\n                      [editorConfig]=\"edit\"\r\n                      [data]=\"form()\"\r\n                      [validationErrors]=\"errorsFor(edit)\"\r\n                      (valueChange)=\"formInputChange($event, edit)\"\r\n                      [formInputs]=\"(formInputs()) || []\"\r\n                      (blur)=\"elementBlur($event, edit)\">\r\n                    </lib-t-dynamic-data-edit>\r\n                  </div>\r\n                }\r\n              </div>\r\n            }\r\n\r\n            <!-- API endpoints list -->\r\n            <div class=\"api-section\">\r\n              <h3 class=\"api-section-header\" [class.api-section-header--error]=\"panel.error\">\r\n                {{ panel.sectionLabel }}\r\n              </h3>\r\n\r\n              @if (panel.apis.length === 0) {\r\n                <div class=\"empty-state\" [class.empty-state--error]=\"panel.error\">\r\n                  <mat-icon class=\"empty-state-icon\">add_link</mat-icon>\r\n                  <p>{{ panel.emptyMessage }}</p>\r\n                </div>\r\n              }\r\n\r\n              @for (api of panel.apis; track api._id) {\r\n                <div\r\n                  class=\"api-list-item\"\r\n                  [class.api-list-item--active]=\"keyInEdit() === panel.primaryKey && dataPlaceholder()?.data?._id === api._id\">\r\n                  <span class=\"api-method-tag\" [class.api-method-tag--post]=\"api.httpMethod === 'POST'\">\r\n                    {{ api.httpMethod }}\r\n                  </span>\r\n                  <div class=\"api-details\">\r\n                    <span class=\"api-name\">{{ api.name }}</span>\r\n                    <span class=\"api-endpoint\" [matTooltip]=\"api.httpEndPoint\" matTooltipPosition=\"above\">\r\n                      {{ api.httpEndPoint }}\r\n                    </span>\r\n                  </div>\r\n                  <div class=\"api-item-actions\">\r\n                    <button\r\n                      (click)=\"editSubmitApi(api, panel.primaryKey)\"\r\n                      mat-icon-button\r\n                      matTooltip=\"Edit endpoint\"\r\n                      [attr.aria-label]=\"'Edit endpoint ' + api.name\"\r\n                      class=\"api-edit-btn\">\r\n                      <mat-icon>edit</mat-icon>\r\n                    </button>\r\n                    <button\r\n                      [cdkCopyToClipboard]=\"api.httpEndPoint || ''\"\r\n                      mat-icon-button\r\n                      matTooltip=\"Copy URL\"\r\n                      [attr.aria-label]=\"'Copy endpoint URL'\"\r\n                      class=\"api-copy-btn\"\r\n                      (click)=\"$event.stopPropagation()\">\r\n                      <mat-icon>content_copy</mat-icon>\r\n                    </button>\r\n                    <button\r\n                      (click)=\"removeSubmissionApi(api, panel.primaryKey)\"\r\n                      mat-icon-button\r\n                      matTooltip=\"Remove endpoint\"\r\n                      [attr.aria-label]=\"'Remove endpoint ' + api.name\"\r\n                      class=\"api-remove-btn\">\r\n                      <mat-icon>delete</mat-icon>\r\n                    </button>\r\n                  </div>\r\n                </div>\r\n                <mat-divider></mat-divider>\r\n              }\r\n\r\n              @if (keyInEdit() !== panel.primaryKey) {\r\n                <div class=\"api-actions\">\r\n                  <button\r\n                    (click)=\"addNewSubmitApi(panel.primaryKey)\"\r\n                    mat-stroked-button\r\n                    color=\"primary\"\r\n                    class=\"add-endpoint-btn\">\r\n                    <mat-icon>add</mat-icon>\r\n                    Add new endpoint\r\n                  </button>\r\n                </div>\r\n              }\r\n\r\n              @if (panel.error) {\r\n                <mat-error class=\"panel-error\">{{ panel.error }}</mat-error>\r\n              }\r\n            </div>\r\n\r\n            <!-- Inline edit form for new/editing endpoint -->\r\n            @if (keyInEdit() === panel.primaryKey) {\r\n              <div class=\"edit-section edit-section--inline\">\r\n                <h4 class=\"inline-edit-title\">\r\n                  {{ isEditingExisting() ? 'Edit endpoint' : 'New endpoint' }}\r\n                </h4>\r\n                @for (element of submissionApiElements(); track element.id) {\r\n                  <div class=\"edit-field\">\r\n                    <lib-t-dynamic-data-edit\r\n                      [editorConfig]=\"element\"\r\n                      [data]=\"dataPlaceholder()\"\r\n                      [validationErrors]=\"validationErrors(element)\"\r\n                      (valueChange)=\"elementConfigurationChanged($event, element)\"\r\n                      [formInputs]=\"(formInputs()) || []\"\r\n                      (blur)=\"elementBlur($event, element)\">\r\n                    </lib-t-dynamic-data-edit>\r\n                  </div>\r\n                }\r\n                <mat-divider></mat-divider>\r\n                <div class=\"inline-edit-actions\">\r\n                  <button mat-flat-button (click)=\"saveSubmitApi()\" color=\"primary\">\r\n                    {{ isEditingExisting() ? 'Update' : 'Save' }}\r\n                  </button>\r\n                  <button mat-button (click)=\"cancelSubmitApi()\" color=\"warn\">Cancel</button>\r\n                </div>\r\n              </div>\r\n            }\r\n          </div>\r\n        </mat-expansion-panel>\r\n      }\r\n    </mat-accordion>\r\n  </section>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, DestroyRef, Signal, computed, inject } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { CdkDrag } from '@angular/cdk/drag-drop';\r\nimport { ClipboardModule } from '@angular/cdk/clipboard';\r\n\r\nimport { FormJsonViewComponent } from '../form-json-view/form-json-view.component';\r\nimport { SelectFormTemplateComponent } from '../select-form-template/select-form-template.component';\r\nimport { FormSubmissionsConfigComponent } from '../form-submissions-config/form-submissions-config.component';\r\nimport { FormsStoreService } from '../../../forms/store/forms-store.service';\r\n\r\nimport { take } from 'rxjs';\r\nimport type { FormInterface, ValidationError } from 'ngx-t-forms-types';\r\n\r\ninterface FormsBuilderMenuItem {\r\n  label: string;\r\n  icon: string;\r\n  hint: string;\r\n  errors?: boolean;\r\n  action: () => void;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-forms-builder-menu',\r\n  imports: [\r\n    MatBadgeModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatMenuModule,\r\n    MatTooltipModule,\r\n    MatCardModule,\r\n    MatToolbarModule,\r\n    MatDividerModule,\r\n    MatProgressSpinnerModule,\r\n    MatFormFieldModule,\r\n    CdkDrag,\r\n    ClipboardModule,\r\n    FormJsonViewComponent,\r\n  ],\r\n  templateUrl: './forms-builder-menu.component.html',\r\n  styleUrl: './forms-builder-menu.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormsBuilderMenuComponent {\r\n  readonly #store = inject(FormsStoreService);\r\n  readonly #destroyRef = inject(DestroyRef);\r\n  protected readonly snackBar = inject(MatSnackBar);\r\n  protected readonly dialog = inject(MatDialog);\r\n\r\n  protected showJson = false;\r\n\r\n  protected readonly form: Signal<FormInterface | undefined> = computed(\r\n    () => this.#store.signalSelectors.selectFormInEdit()?.form,\r\n  );\r\n\r\n  protected readonly formCopy: Signal<string> = computed(() => JSON.stringify(this.form() || {}));\r\n\r\n  protected readonly errors: Signal<ReadonlyArray<ValidationError>> =\r\n    this.#store.formBuilderSignalSelectors.formErrors;\r\n\r\n  protected readonly configHasErrors: Signal<boolean> = computed(() =>\r\n    this.errors().some((error) => error.key.split('.')?.[0] === 'submissionHandle'),\r\n  );\r\n\r\n  protected readonly items: Signal<ReadonlyArray<FormsBuilderMenuItem>> = computed(() => [\r\n    {\r\n      label: 'Templates',\r\n      icon: 'content_copy',\r\n      hint: 'Select a form to apply as a template',\r\n      action: (): void => this.openDialog(),\r\n    },\r\n    {\r\n      label: 'Submission Config',\r\n      hint: 'Setup form submission api and other configurations',\r\n      icon: 'api',\r\n      errors: this.configHasErrors(),\r\n      action: (): void => this.openFormSubmissionDialog(),\r\n    },\r\n  ]);\r\n\r\n  protected openDialog(): void {\r\n    const dialogRef = this.dialog.open(SelectFormTemplateComponent);\r\n    dialogRef\r\n      .afterClosed()\r\n      .pipe(take(1), takeUntilDestroyed(this.#destroyRef))\r\n      .subscribe((form) => {\r\n        if (form) {\r\n          this.applyFormTemplate(form);\r\n        }\r\n      });\r\n  }\r\n\r\n  protected applyFormTemplate = (form: FormInterface): void =>\r\n    this.#store.actionsFormBuilder.applyFormTemplate(form);\r\n\r\n  protected openFormSubmissionDialog(): void {\r\n    const dialogRef = this.dialog.open(FormSubmissionsConfigComponent, {\r\n      data: { store: this.#store },\r\n    });\r\n\r\n    dialogRef\r\n      .afterClosed()\r\n      .pipe(take(1), takeUntilDestroyed(this.#destroyRef))\r\n      .subscribe(() => {\r\n        // no-op\r\n      });\r\n  }\r\n\r\n  protected toggleJson(): void {\r\n    this.showJson = !this.showJson;\r\n  }\r\n}\r\n","<button [matBadge]=\"'!'\" matBadgeColor=\"warn\" [matTooltip]=\"configHasErrors() === false?'\r\nClick to view form configuration\r\n':'Click to fix or add missing form configurations'\" [matBadgeHidden]=\"!!(configHasErrors()) === false\"\r\n    [matMenuTriggerFor]=\"configMenu\" mat-flat-button>\r\n    Config\r\n    <mat-icon>\r\n        settings_suggest\r\n    </mat-icon>\r\n</button>\r\n\r\n<mat-menu #configMenu=\"matMenu\">\r\n\r\n\r\n    <div mat-subheader style=\"padding-left: 16px;\">Form edit options</div>\r\n    @for (item of items(); track item.label) {\r\n    <button [matTooltip]=\"item.hint\" matTooltipPosition=\"right\" style=\"padding-top:4px;padding-bottom:4px\"\r\n        (click)=\"item?.action()\" mat-menu-item>\r\n        <mat-icon>{{item.icon}}</mat-icon>\r\n\r\n        <span>\r\n            @if (item.errors) {\r\n            <div style=\"line-height: normal;\">\r\n                {{item.label}}\r\n            </div>\r\n            <div style=\"line-height: normal;\">\r\n\r\n                <mat-error>\r\n                    <small>\r\n                        Invalid configurations\r\n                    </small>\r\n\r\n                </mat-error>\r\n            </div>\r\n            }@else {\r\n\r\n            {{item.label}}\r\n\r\n            }\r\n\r\n\r\n        </span>\r\n\r\n    </button>\r\n    <mat-divider></mat-divider>\r\n    }\r\n    <button [matTooltip]=\"showJson?'Hide json':'Show json'\" (click)=\"toggleJson()\" mat-menu-item>\r\n        <mat-icon>data_object</mat-icon>\r\n\r\n        <span>\r\n            <div>\r\n                Show json\r\n            </div>\r\n\r\n\r\n\r\n        </span>\r\n    </button>\r\n\r\n</mat-menu>\r\n\r\n@if (showJson) {\r\n<div class=\"DragBoundary\">\r\n    @defer (on viewport) {\r\n    <mat-card cdkDragBoundary=\"DragBoundary\" cdkDrag class=\"menuCard\">\r\n        <mat-toolbar\r\n            style=\"background: var(--mat-sidenav-content-background-color);color:var(--mdc-filled-button-label-text-color, var(--mat-app-on-primary))\">\r\n            <span>\r\n                Json Form Value\r\n            </span>\r\n            <span class=\"spacer\"></span>\r\n\r\n            <mat-icon cdkDragHandle style=\"\r\n            margin:8px;\r\n            color:var(--mat-divider-color, var(--mat-app-outline))\">\r\n                drag_indicator\r\n            </mat-icon>\r\n        </mat-toolbar>\r\n        <mat-divider style=\"margin-bottom: 12px;\"></mat-divider>\r\n\r\n\r\n        <mat-card-content style=\" overflow-y: auto;\r\n    max-height: calc(100vh - 150px);\">\r\n            <lib-form-json-view></lib-form-json-view>\r\n        </mat-card-content>\r\n        <mat-card-actions>\r\n            <span class=\"spacer\"></span>\r\n            <button (click)=\"toggleJson()\" mat-flat-button>\r\n                Close\r\n            </button>\r\n            <button color=\"primary\" [cdkCopyToClipboard]=\"(formCopy())||''\" matTooltip=\"Copy json to clipboard\"\r\n                mat-flat-button>\r\n                Copy\r\n            </button>\r\n\r\n        </mat-card-actions>\r\n\r\n\r\n    </mat-card>\r\n   }@placeholder {\r\n    <div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n        <mat-spinner diameter=\"20\" />\r\n      </div>\r\n\r\n    }\r\n</div>\r\n}\r\n"],"names":["i2","i3","i4","i6","i7","i8","i9","i10","i11"],"mappings":"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"}