{"version":3,"file":"ajf-core-barcode.mjs","sources":["../../../projects/core/barcode/src/barcode.ts","../../../projects/core/barcode/src/public_api.ts","../../../projects/core/barcode/src/ajf-core-barcode.ts"],"sourcesContent":["/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nimport {\n  ChangeDetectorRef,\n  Directive,\n  ElementRef,\n  EventEmitter,\n  Renderer2,\n  ViewChild,\n} from '@angular/core';\nimport {ControlValueAccessor} from '@angular/forms';\nimport {MatSelect} from '@angular/material/select';\nimport {BrowserMultiFormatReader, IScannerControls} from '@zxing/browser';\nimport {Observable, from, throwError} from 'rxjs';\nimport {catchError, map, take, tap} from 'rxjs/operators';\n\n@Directive()\nexport abstract class AjfBarcode implements ControlValueAccessor {\n  resetEvt: EventEmitter<void> = new EventEmitter<void>();\n  @ViewChild('barcodeVideo', {read: ElementRef}) barcodeVideo:\n    | ElementRef<HTMLVideoElement>\n    | undefined;\n  @ViewChild('barcodeVideoPreview', {read: ElementRef})\n  barcodeVideoPreview!: ElementRef<HTMLDivElement>;\n  @ViewChild('barcodeImagePreview', {read: ElementRef})\n  barcodeImagePreview!: ElementRef<HTMLImageElement>;\n  /**\n   * The Mat select component for choosing the preferred video source\n   */\n  @ViewChild('videoSourceSelect') videoSourceSelect!: MatSelect;\n\n  /**\n   * A html video element created at runtime\n   *\n   * @memberof AjfBarcode\n   */\n  private _video?: HTMLVideoElement;\n  get videoSource(): HTMLVideoElement | undefined {\n    return this._video;\n  }\n\n  /**\n   * implement the control form value.\n   * rappresent the barcode value.\n   *\n   * @memberof AjfBarcode\n   */\n  private _barcodeValue = '';\n  get value(): string {\n    return this._barcodeValue;\n  }\n  set value(value: string) {\n    if (this._barcodeValue !== value) {\n      this._barcodeValue = value;\n      this._cdr.detectChanges();\n      this._onChangeCallback(value);\n    }\n  }\n\n  private _supportsVideoStream = false;\n  get supportsVideoStream(): boolean {\n    return this._supportsVideoStream;\n  }\n\n  private _toggle = 'drop';\n  get toggle() {\n    return this._toggle;\n  }\n  set toggle(val: string) {\n    this._toggle = val;\n    this._cdr.markForCheck();\n  }\n\n  private _showSwitchButton = false;\n  get showSwitchButton(): boolean {\n    return this._showSwitchButton;\n  }\n\n  /**\n   * An observable of all video mediaDevices\n   */\n  private _videoDevices: Observable<MediaDeviceInfo[]>;\n  get videoDevices() {\n    return this._videoDevices;\n  }\n\n  /**\n   * The mediastream currently being streamed\n   */\n  private _currentVideoStream: MediaStream | null = null;\n  get currentVideoStream() {\n    return this._currentVideoStream;\n  }\n\n  private _scannerControls?: IScannerControls;\n  private _codeReader = new BrowserMultiFormatReader();\n\n  private _onChangeCallback = (_: any) => {};\n  private _onTouchedCallback = () => {};\n\n  constructor(protected _cdr: ChangeDetectorRef, private _renderer: Renderer2) {\n    this._supportsVideoStream =\n      navigator.mediaDevices != null && navigator.mediaDevices.enumerateDevices != null;\n    this._videoDevices = this._getVideoDevices();\n  }\n\n  reset(): void {\n    this.value = '';\n    const video = this.barcodeVideo?.nativeElement ?? null;\n    this.resetEvt.emit();\n    this.initVideoStreams();\n    if (video) {\n      video.play();\n    }\n    this._onTouchedCallback();\n  }\n\n  onSelectFile(evt: Event): void {\n    if (evt == null || evt.target == null) {\n      return;\n    }\n    const target = evt.target as HTMLInputElement;\n    const files = target.files as FileList;\n    this._onSelect(files);\n  }\n\n  onSelectDrop(files: FileList): void {\n    if (files == null) {\n      return;\n    }\n    this._onSelect(files);\n  }\n\n  onTabChange(idx: number): void {\n    if (this._scannerControls != null) {\n      this._scannerControls.stop();\n      this._scannerControls = undefined;\n    }\n    if (idx === 1) {\n      this.initVideoStreams();\n      if (this.barcodeVideo == null || this.barcodeVideoPreview == null) {\n        return;\n      }\n      const video = this.barcodeVideo.nativeElement;\n      const preview = this.barcodeVideoPreview.nativeElement;\n      this._renderer.addClass(preview, 'ajf-video-preview-hidden');\n      this._codeReader\n        .decodeFromVideoElement(video, result => {\n          if (result == null) {\n            return;\n          }\n          if (this._scannerControls != null) {\n            this._scannerControls.stop();\n          }\n\n          const points = result.getResultPoints();\n          const nw = points[0];\n          const se = points[1];\n          const lx = Math.max((nw.getX() / video.videoWidth) * video.clientWidth, -10, 0);\n          const ly = Math.max((nw.getY() / video.videoHeight) * video.clientHeight - 10, 0);\n          const rx = Math.min(\n            (se.getX() / video.videoWidth) * video.clientWidth + 10,\n            video.clientWidth,\n          );\n          const ry = Math.min(\n            (se.getY() / video.videoHeight) * video.clientHeight + 10,\n            video.clientHeight,\n          );\n          this._renderer.setStyle(preview, 'top', `${ly}px`);\n          this._renderer.setStyle(preview, 'left', `${lx}px`);\n          this._renderer.setStyle(preview, 'width', `${rx - lx}px`);\n          this._renderer.setStyle(preview, 'height', `${ry - ly}px`);\n          this._renderer.removeClass(preview, 'ajf-video-preview-hidden');\n          this.value = result.getText();\n        })\n        .then(controls => {\n          this._scannerControls = controls;\n          this.stopCurrentStream();\n          video.pause();\n        });\n    }\n  }\n\n  switchCamera(): void {\n    this.initVideoStreams();\n  }\n\n  /** ControlValueAccessor implements */\n  writeValue(value: string) {\n    this._barcodeValue = value;\n  }\n\n  registerOnChange(fn: (value: any) => void): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this._onTouchedCallback = fn;\n  }\n\n  private _onSelect(files: FileList): void {\n    if (files != null && files.length > 0 && files[0]) {\n      let reader = new FileReader();\n\n      reader.readAsDataURL(files[0]);\n      reader.onload = (ev: ProgressEvent) => {\n        if (!ev.loaded) {\n          return;\n        }\n        const data = reader.result as string;\n        this._setImagePreview(`url(${data})`);\n        this._codeReader\n          .decodeFromImageUrl(data)\n          .then(res => {\n            this.value = res.getText();\n          })\n          .catch(() => {});\n      };\n    }\n  }\n\n  private _setImagePreview(img: string): void {\n    if (this.barcodeImagePreview != null) {\n      this._renderer.setStyle(this.barcodeImagePreview.nativeElement, 'background-image', img);\n    }\n  }\n\n  protected initVideoStreams(): void {\n    this.getStream().pipe(take(1)).subscribe();\n  }\n\n  /**\n   * Gets all video mediaDevices (cameras)\n   * @returns An observable with all video mediaDevices\n   */\n  private _getVideoDevices(): Observable<MediaDeviceInfo[]> {\n    return from(navigator.mediaDevices.enumerateDevices()).pipe(\n      map(devices => devices.filter(device => device.kind === 'videoinput')),\n    );\n  }\n\n  /**\n   * Gets the current video stream and updates the video element source\n   * @returns An observable of the current media stream\n   */\n  protected getStream(): Observable<MediaStream> {\n    if (this._currentVideoStream) {\n      this._currentVideoStream.getTracks().forEach(track => {\n        track.stop();\n      });\n    }\n    const videoSource: string | undefined = this.videoSourceSelect?.value as string | undefined;\n    const constraints = {\n      video: {deviceId: videoSource ? {exact: videoSource} : undefined},\n    };\n    return from(navigator.mediaDevices.getUserMedia(constraints)).pipe(\n      tap(stream => {\n        this._gotStream(stream);\n      }),\n      catchError(err => throwError(() => err)),\n    );\n  }\n\n  /**\n   * Updates the video element source with the current video stream\n   * @param stream The video stream\n   */\n  private _gotStream(stream: MediaStream | null) {\n    this._currentVideoStream = stream;\n    if (this.barcodeVideo) {\n      this.barcodeVideo.nativeElement.srcObject = stream;\n    }\n    this._cdr.markForCheck();\n  }\n\n  stopCurrentStream(): void {\n    if (this.barcodeVideo == undefined) {\n      return;\n    }\n    const video = this.barcodeVideo.nativeElement;\n    const stream: MediaStream | null = video.srcObject as MediaStream | null;\n    if (stream == null) return;\n    const tracks = stream.getVideoTracks();\n    tracks.forEach(track => track.stop());\n  }\n}\n","/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nexport * from './barcode';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}