{"version":3,"file":"ngx-t-forms-file-upload-input-element.component-BF7KbSPb.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/file-upload-input-element/core/file-uploader/file-uploader.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/file-upload-input-element/core/file-uploader/file-uploader.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/file-upload-input-element/file-upload-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/file-upload-input-element/file-upload-input-element.component.html"],"sourcesContent":["import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  ElementRef,\r\n  PLATFORM_ID,\r\n  computed,\r\n  inject,\r\n  input,\r\n  viewChild,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\nimport {\r\n  AllDocumentFileExtensions,\r\n  AllImageFileExtensions,\r\n  FileUploadInputValueInterface,\r\n  IFileUploadInput,\r\n  ITowerStepColumn,\r\n  InputFileType,\r\n  UploadTypes,\r\n} from 'ngx-t-forms-types';\r\n\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\n\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n  controlType: 'app-file-uploader',\r\n  nextId: 0,\r\n};\r\n\r\n@Component({\r\n  selector: 'lib-file-uploader',\r\n  templateUrl: './file-uploader.component.html',\r\n  styleUrls: ['./file-uploader.component.css'],\r\n  imports: [\r\n    MatProgressBarModule,\r\n    MatIconModule,\r\n    MatToolbarModule,\r\n    MatButtonModule,\r\n  ],\r\n  host: {\r\n    '[class.floating]': 'shouldLabelFloat',\r\n    '[id]': 'id',\r\n  },\r\n  providers: [{ provide: MatFormFieldControl, useExisting: FileUploaderComponent }],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FileUploaderComponent extends BaseCustomInput<FileUploadInputValueInterface | object | null> {\r\n  readonly inputConfig = input.required<ITowerStepColumn>();\r\n\r\n  protected readonly uploader = viewChild.required<ElementRef<HTMLInputElement>>('uploader');\r\n\r\n  /**\r\n   * True when the descriptor marks the field `readonly` or `disabled`. Blocks the\r\n   * upload/drop/clear interactions so the file picker honours the same\r\n   * `readonly || disabled` contract as the reference text input.\r\n   */\r\n  protected readonly isReadOnly = computed<boolean>(() => {\r\n    const cfg = this.inputConfig();\r\n    return !!cfg?.readonly || !!cfg?.disabled;\r\n  });\r\n\r\n  protected readonly uploadAccept = computed<string>(() => {\r\n    const cfg = this.inputConfig() as IFileUploadInput | undefined;\r\n    const fileType = cfg?.fileType;\r\n    if (!fileType) {\r\n      return InputFileType.file;\r\n    }\r\n    return (UploadTypes as Record<string, string>)[String(fileType)] ?? InputFileType.file;\r\n  });\r\n\r\n  protected readonly previewSrc = computed(() => {\r\n    const cfg = this.inputConfig() as IFileUploadInput | undefined;\r\n    const fileType = cfg?.fileType;\r\n    switch (fileType) {\r\n      case InputFileType.file:\r\n        return 'https://res.cloudinary.com/afrob/image/upload/v1676973154/Flows/Icons/iPhone_14_-_1_tx1scw.png';\r\n      default:\r\n        return (this.value as FileUploadInputValueInterface | null)?.base64 ?? undefined;\r\n    }\r\n  });\r\n\r\n  protected fileName: string | null = null;\r\n  protected loading: number | null = null;\r\n  protected dragOver = false;\r\n\r\n  readonly #platformId = inject(PLATFORM_ID);\r\n\r\n  constructor() {\r\n    super(\r\n      inject(NgControl, { optional: true, self: true }) as NgControl,\r\n      inject<ElementRef<HTMLElement>>(ElementRef),\r\n      customInputConfig,\r\n    );\r\n  }\r\n\r\n  override get value(): FileUploadInputValueInterface | object | null {\r\n    return this._value;\r\n  }\r\n  override set value(file: FileUploadInputValueInterface | object | null) {\r\n    const fileType = this.inputConfig()?.fileType;\r\n    if (!file || typeof file !== 'object') {\r\n      this._value = file;\r\n      this.stateChanges.next();\r\n      return;\r\n    }\r\n\r\n    const { base64, fileExtension } = file as FileUploadInputValueInterface;\r\n\r\n    if (!base64) {\r\n      this._value = file;\r\n      this.stateChanges.next();\r\n      return;\r\n    }\r\n\r\n    const allDocExtensions = Object.values(AllDocumentFileExtensions);\r\n    const allImageExtensions = Object.values(AllImageFileExtensions);\r\n    const isFile = allDocExtensions.includes(fileExtension as AllDocumentFileExtensions);\r\n    const isImage = allImageExtensions.includes(fileExtension as AllImageFileExtensions);\r\n    if (\r\n      (fileType === InputFileType.file && !isFile) ||\r\n      ((fileType === InputFileType.Image || fileType === InputFileType.CaptureImage) && !isImage)\r\n    ) {\r\n      this._value = null;\r\n      this.temporaryError(`Invalid file type. Expected ${fileType} file`);\r\n      this.stateChanges.next();\r\n      return;\r\n    } else {\r\n      this._value = file;\r\n      this.stateChanges.next();\r\n      return;\r\n    }\r\n  }\r\n\r\n  override get empty(): boolean {\r\n    return !this.value;\r\n  }\r\n\r\n  override get shouldLabelFloat(): boolean {\r\n    return this.focused || !this.empty;\r\n  }\r\n\r\n  override onContainerClick(event: MouseEvent): void {\r\n    if (this.isReadOnly()) return;\r\n    this.uploader().nativeElement.click();\r\n    if (event.target !== this._elementRef.nativeElement) {\r\n      this.markAsTouched();\r\n      this.stateChanges.next();\r\n    }\r\n  }\r\n\r\n  protected triggerUploader(): void {\r\n    if (this.isReadOnly()) return;\r\n    this.uploader().nativeElement.click();\r\n  }\r\n\r\n  protected onFileSelected(event: Event): void {\r\n    const files = (event.target as HTMLInputElement).files;\r\n    if (files && files.length > 0) {\r\n      const file = files[0];\r\n      if (!file) return;\r\n      this.assignFile(file);\r\n    }\r\n  }\r\n\r\n  protected assignFile(file: File): void {\r\n    // FileReader is a browser-only API; gate by isPlatformBrowser to keep SSR-safe.\r\n    if (!isPlatformBrowser(this.#platformId)) {\r\n      return;\r\n    }\r\n    const reader = new FileReader();\r\n    reader.onload = () => {\r\n      this.fileName = file.name;\r\n      const nameSplit = file.name.split('.');\r\n      const fileExtension = nameSplit[nameSplit.length - 1];\r\n      this.value = {\r\n        fileName: file.name,\r\n        base64: reader.result as string,\r\n        type: this.inputConfig()?.fileType,\r\n        blob: file,\r\n        fileExtension,\r\n      };\r\n      this.onChange(this.value);\r\n    };\r\n    reader.readAsDataURL(file);\r\n  }\r\n\r\n  protected onDragOver(event: DragEvent): void {\r\n    this.dragOver = true;\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n  }\r\n\r\n  protected onDrop(event: DragEvent): void {\r\n    this.dragOver = false;\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    if (this.isReadOnly()) return;\r\n    const files = event.dataTransfer?.files;\r\n    if (files && files.length > 0) {\r\n      const file = files[0];\r\n      if (!file) return;\r\n      this.assignFile(file);\r\n    }\r\n  }\r\n\r\n  protected onDragLeave(event: DragEvent): void {\r\n    this.dragOver = false;\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n  }\r\n\r\n  protected clearFile(event: MouseEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    if (this.isReadOnly()) return;\r\n    this.value = null;\r\n    this.stateChanges.next();\r\n  }\r\n}\r\n","@if (loading) {\r\n  <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n}\r\n\r\n@if (!shouldLabelFloat) {\r\n  <section>\r\n    <br>\r\n    <div\r\n      [style.border-color]=\"dragOver ? ' var(--mat-stepper-header-selected-state-icon-background-color)' : '#ccc;'\"\r\n      (dragover)=\"onDragOver($event)\"\r\n      (drop)=\"onDrop($event)\"\r\n      (dragleave)=\"onDragLeave($event)\"\r\n      class=\"drop-zone\">\r\n      <div>\r\n        <mat-icon>\r\n          cloud_upload\r\n        </mat-icon>\r\n      </div>\r\n      <div>\r\n        @if (!!errorMessage) {\r\n          <span class=\"mat-mdc-form-field-error\">\r\n            {{ errorMessage }}\r\n          </span>\r\n        } @else {\r\n          Drag and drop files or click to upload\r\n        }\r\n      </div>\r\n    </div>\r\n  </section>\r\n}\r\n\r\n<input\r\n  style=\"display: none\"\r\n  hidden\r\n  [readonly]=\"isReadOnly()\"\r\n  [disabled]=\"isReadOnly()\"\r\n  [type]=\"inputConfig().type || 'file'\"\r\n  [accept]=\"uploadAccept()\"\r\n  (change)=\"onFileSelected($event)\"\r\n  #uploader\r\n/>\r\n\r\n@if (!!shouldLabelFloat) {\r\n  <div\r\n    [style.border-color]=\"dragOver ? 'var(--mat-stepper-header-selected-state-icon-background-color)' : '#ccc;'\"\r\n    class=\"drop-zone\"\r\n    (dragover)=\"onDragOver($event)\"\r\n    (drop)=\"onDrop($event)\"\r\n    (dragleave)=\"onDragLeave($event)\">\r\n    <img style=\"width: 100%;\" [src]=\"previewSrc()\" alt=\"\">\r\n    <mat-toolbar style=\"    height: min-content !important;\">\r\n      <mat-icon\r\n        [style.color]=\"dragOver ? 'var(--mat-stepper-header-selected-state-icon-background-color)' : ''\">\r\n        cloud_upload\r\n      </mat-icon>\r\n      <span class=\"spacer\"></span>\r\n      <div style=\"padding: 8px;\">\r\n        @if (!!fileName) {\r\n          <div style=\"\r\n            line-height: normal;width: 100%;\r\n            white-space:normal;overflow: hidden;text-overflow: ellipsis;\r\n            font-size: 0.75em;color:var(--mat-stepper-header-selected-state-icon-background-color);\">\r\n            {{ fileName }}\r\n          </div>\r\n        }\r\n        <div style=\"font-size: 0.875em;\">\r\n          Drag and drop files or click to upload\r\n        </div>\r\n      </div>\r\n\r\n      <span class=\"spacer\"></span>\r\n      <button (click)=\"clearFile($event)\" [disabled]=\"isReadOnly()\" mat-icon-button>\r\n        <mat-icon>close</mat-icon>\r\n      </button>\r\n    </mat-toolbar>\r\n  </div>\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule, ValidationErrors } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { FileUploaderComponent } from './core/file-uploader/file-uploader.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n/** Wraps a reactive file-uploader control inside a `mat-form-field`. */\r\n@Component({\r\n  selector: 'lib-file-upload-input-element',\r\n  templateUrl: './file-upload-input-element.component.html',\r\n  styleUrl: './file-upload-input-element.component.css',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  imports: [\r\n    ReactiveFormsModule,\r\n    MatFormFieldModule,\r\n    MatIconModule,\r\n    MatButtonModule,\r\n    MatTooltipModule,\r\n    FileUploaderComponent,\r\n    TFormInputStatusComponent,\r\n  ],\r\n})\r\nexport class FileUploadInputElementComponent {\r\n  readonly inputConfig = input.required<ITowerStepColumn>();\r\n  readonly formGroup = input.required<FormGroup>();\r\n  readonly reload = output<void>();\r\n\r\n  protected readonly errorMessage = computed(() =>\r\n    getInputErrorMessage(this.inputConfig(), this.formGroup()),\r\n  );\r\n\r\n  protected getErrors(): ValidationErrors | null | undefined {\r\n    return this.formGroup().controls[this.inputConfig().id]?.errors;\r\n  }\r\n}\r\n","<form [formGroup]=\"formGroup()\">\r\n  @if (inputConfig(); as inputConfig) {\r\n    <mat-form-field [appearance]=\"inputConfig.appearance || 'fill'\" subscriptSizing=\"dynamic\">\r\n      <mat-label>\r\n        {{ inputConfig.label }}\r\n        <lib-t-form-input-status [inputConfig]=\"inputConfig\"></lib-t-form-input-status>\r\n      </mat-label>\r\n\r\n      <lib-file-uploader\r\n        [inputConfig]=\"inputConfig\"\r\n        [formControlName]=\"inputConfig.id\"\r\n        [required]=\"inputConfig.required\"\r\n      ></lib-file-uploader>\r\n\r\n      @if (inputConfig.hintLabel || inputConfig.temporaryHint) {\r\n        <mat-hint class=\"inputHint\">\r\n          {{ inputConfig.temporaryHint || inputConfig.hintLabel }}\r\n        </mat-hint>\r\n      }\r\n\r\n      @if (!!errorMessage()) {\r\n        <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{ errorMessage() }}</mat-error>\r\n      }\r\n\r\n      @if (inputConfig.prefixIcon) {\r\n        <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n      }\r\n\r\n      @if (inputConfig.canReload?.canReload) {\r\n        <button\r\n          mat-icon-button\r\n          style=\"margin-right: 4px;\"\r\n          matTooltip=\"Click to refresh this field.\"\r\n          class=\"input-sync-button\"\r\n          (click)=\"inputConfig.canReload.emit()\"\r\n          matSuffix\r\n        >\r\n          <mat-icon style=\"color: var(--mat-sys-primary)\">sync</mat-icon>\r\n        </button>\r\n      }\r\n\r\n      @if (inputConfig.suffixIcon && inputConfig.id !== 'password') {\r\n        <mat-icon matSuffix>{{ inputConfig.suffixIcon }}</mat-icon>\r\n      }\r\n\r\n      @if (inputConfig.prefixText) {\r\n        <span matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n      }\r\n      @if (inputConfig.suffixText) {\r\n        <span matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText }}</span>\r\n      }\r\n\r\n      @if (inputConfig.maxLength && formGroup()) {\r\n        <mat-hint align=\"end\">\r\n          {{ (formGroup().controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength }}\r\n        </mat-hint>\r\n      }\r\n    </mat-form-field>\r\n  }\r\n</form>\r\n"],"names":["i2","i3","i4"],"mappings":"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"}