{"version":3,"file":"ngx-t-forms-image-capture-input-element.component-CoJTXMbL.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/file-upload-input-element/core/file-uploader/camera-functions.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/image-capture-input-element/core/camera-capture/camera-capture.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/image-capture-input-element/core/camera-capture/camera-capture.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/image-capture-input-element/image-capture-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/image-capture-input-element/image-capture-input-element.component.html"],"sourcesContent":["// Image capture\r\n\r\nimport { AbstractControl, ValidationErrors } from \"@angular/forms\";\r\nimport { FileUploadInputValueInterface } from \"ngx-t-forms-types\";\r\n\r\n\r\nexport async function setupDevices(\r\n  cameraCallback: (stream: MediaStream) => void\r\n): Promise<MediaStream | string | unknown | undefined> {\r\n  // SSR guard (Trap 14): free helper has no DI context. Returning `undefined`\r\n  // matches the existing \"no media device\" branch — caller contract preserved.\r\n  if (typeof navigator === 'undefined') return undefined;\r\n\r\n  if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\r\n    try {\r\n      const stream = await navigator.mediaDevices.getUserMedia({\r\n        video: true,\r\n      });\r\n      if (stream) {\r\n        cameraCallback(stream);\r\n        return stream;\r\n      } else {\r\n        return 'You have no output video device';\r\n      }\r\n    } catch (e) {\r\n      return e;\r\n    }\r\n  }\r\n  return undefined;\r\n}\r\n\r\n\r\nexport function fileUploaderValidator(control: AbstractControl): ValidationErrors | null {\r\n  // Implement your validation logic here\r\n  const file: FileUploadInputValueInterface= control.value;\r\n\r\n  // Example validation: Check if file is provided\r\n  if (!file || !file.base64) {\r\n    return { requiredFile: 'You must upload a file.' };\r\n  }\r\n\r\n  // Add more validation logic as needed\r\n  // ...\r\n\r\n  return null; // Return null if no validation errors\r\n}","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 { NgControl } from '@angular/forms';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\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 { FileUploadInputValueInterface, IFileUploadInput, ITowerStepColumn } from 'ngx-t-forms-types';\r\n\r\nimport { setupDevices } from '../../../file-upload-input-element/core/file-uploader/camera-functions';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\n\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n  controlType: 'app-camera-capture',\r\n  nextId: 0,\r\n};\r\n\r\n@Component({\r\n  selector: 'lib-camera-capture',\r\n  templateUrl: './camera-capture.component.html',\r\n  styleUrls: ['./camera-capture.component.scss'],\r\n  imports: [MatIconModule, MatToolbarModule, MatButtonModule],\r\n  providers: [{ provide: MatFormFieldControl, useExisting: CameraCaptureComponent }],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CameraCaptureComponent extends BaseCustomInput<FileUploadInputValueInterface | object | null> {\r\n  readonly inputConfig = input.required<ITowerStepColumn>();\r\n\r\n  protected readonly video = viewChild.required<ElementRef<HTMLVideoElement>>('video');\r\n  protected readonly canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\r\n\r\n  /**\r\n   * True when the descriptor marks the field `readonly` or `disabled`. Blocks the\r\n   * capture/recapture actions so the camera honours the same `readonly || disabled`\r\n   * 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 WIDTH = 640;\r\n  protected readonly HEIGHT = 480;\r\n  protected captures: string[] = [];\r\n  protected isCaptured = false;\r\n  protected videoMode = 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 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  protected recapture(): void {\r\n    if (this.isReadOnly()) return;\r\n    if (!isPlatformBrowser(this.#platformId)) return;\r\n    const videoEl = this.video()?.nativeElement;\r\n    if (!videoEl) return;\r\n    videoEl.srcObject = null;\r\n    this.isCaptured = false;\r\n    setupDevices(this.setup);\r\n    this.value = null;\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  protected readonly setup = (stream: MediaStream): void => {\r\n    if (!isPlatformBrowser(this.#platformId)) return;\r\n    const videoEl = this.video()?.nativeElement;\r\n    if (!videoEl) return;\r\n    try {\r\n      videoEl.srcObject = stream;\r\n      void videoEl.play();\r\n    } catch {\r\n      // Ignored: play() may reject if the element is detached or autoplay is blocked.\r\n    }\r\n  };\r\n\r\n  protected touch(): void {\r\n    this.markAsTouched();\r\n  }\r\n\r\n  protected capture(): void {\r\n    if (this.isReadOnly()) return;\r\n    if (!isPlatformBrowser(this.#platformId)) return;\r\n    const videoEl = this.video()?.nativeElement;\r\n    const canvasEl = this.canvas()?.nativeElement;\r\n    if (!videoEl || !canvasEl) return;\r\n\r\n    this.touch();\r\n    this.drawImageToCanvas(videoEl);\r\n    const fileType = (this.inputConfig() as IFileUploadInput | undefined)?.fileType;\r\n    this.value = {\r\n      fileName: new Date(),\r\n      type: fileType,\r\n      base64: canvasEl.toDataURL('image/png'),\r\n    };\r\n\r\n    this.captures.push(canvasEl.toDataURL('image/png'));\r\n    this.isCaptured = true;\r\n    this.stopVideo();\r\n    this.onChange(this.value);\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  protected stopVideo(): void {\r\n    if (!isPlatformBrowser(this.#platformId)) return;\r\n    const videoEl = this.video()?.nativeElement;\r\n    const src = videoEl?.srcObject;\r\n    if (src && src instanceof MediaStream) {\r\n      src.getTracks().forEach(track => track.stop());\r\n    }\r\n  }\r\n\r\n  private drawImageToCanvas(image: HTMLVideoElement): void {\r\n    if (!isPlatformBrowser(this.#platformId)) return;\r\n    const canvasEl = this.canvas()?.nativeElement;\r\n    const ctx = canvasEl?.getContext('2d');\r\n    if (!ctx) return;\r\n    ctx.drawImage(image, 0, 0, this.WIDTH, this.HEIGHT);\r\n  }\r\n}\r\n","<br>\r\n<div class=\"video-container\">\r\n  <video\r\n  style=\"margin: auto;\"\r\n    [style.display]=\"!isCaptured ? 'block' : 'none'\"\r\n    #video\r\n    id=\"video\"\r\n    [width]=\"WIDTH\"\r\n    [height]=\"HEIGHT\"\r\n    autoplay\r\n  ></video>\r\n  <canvas\r\n    [style.display]=\"isCaptured ? 'block' : 'none'\"\r\n    #canvas\r\n    id=\"canvas\"\r\n    [width]=\"WIDTH\"\r\n    [height]=\"HEIGHT\"\r\n  ></canvas>\r\n</div>\r\n<mat-toolbar style=\"background: none;\">\r\n  <span class=\"spacer\"></span>\r\n  <button (click)=\"isCaptured ? recapture() : capture()\" [disabled]=\"isReadOnly()\" [color]=\"isCaptured?'primary':'warn'\"  mat-icon-button>\r\n    <mat-icon>\r\n      photo_camera\r\n    </mat-icon>\r\n\r\n  </button>\r\n  @if (!isCaptured) {\r\n    <button (click)=\"stopVideo()\" mat-icon-button>\r\n      <mat-icon>\r\n        stop\r\n      </mat-icon>\r\n\r\n    </button>\r\n  }\r\n  <span class=\"spacer\"></span>\r\n</mat-toolbar>\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } 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 { CameraCaptureComponent } from './core/camera-capture/camera-capture.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n/** Wraps the camera-capture control inside a `mat-form-field`. */\r\n@Component({\r\n  selector: 'lib-image-capture-input-element',\r\n  templateUrl: './image-capture-input-element.component.html',\r\n  styleUrl: './image-capture-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    TFormInputStatusComponent,\r\n    CameraCaptureComponent,\r\n  ],\r\n})\r\nexport class ImageCaptureInputElementComponent {\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","<ng-container [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-camera-capture\r\n        [required]=\"inputConfig.required\"\r\n        [inputConfig]=\"inputConfig\"\r\n        [formControlName]=\"inputConfig.id\"\r\n      ></lib-camera-capture>\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.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.prefixIcon) {\r\n        <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\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</ng-container>\r\n"],"names":["i1","i3","i2","i4"],"mappings":"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"}