{"version":3,"file":"file-selector.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/src/angular/file-selector/file-selector-base.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/src/angular/file-selector/file-selector-types.service.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/src/angular/file-selector/file-selector.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/src/angular/file-selector/file-selector.html","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/src/angular/file-selector/file-selector.module.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const SBB_FILE_SELECTOR_OPTIONS = new InjectionToken<SbbFileSelectorOptions>(\n  'FILE_SELECTOR_OPTIONS',\n);\n\nexport interface SbbFileSelectorOptions {\n  /**\n   * Categories of file types accepted by sbb-file-selector component.\n   * It is optional.\n   */\n  accept?: string;\n  /**\n   * Attribute whose state specifies the preferred facing mode for the media capture mechanism.\n   * The attribute's keywords are user and environment, which map to the respective states user and environment.\n   * It is optional.\n   */\n  capture?: 'user' | 'environment';\n  /**\n   * Mode on file selector component to chose more files to upload.\n   * It is optional.\n   */\n  multiple?: boolean;\n  /** Set if the component should add files on top of the already selected ones or keep default input file behaviour */\n  multipleMode?: 'default' | 'persistent';\n}\n\nexport type FileTypeCategory = 'generic' | 'doc' | 'image' | 'pdf' | 'audio' | 'video' | 'zip';\n\nexport const SBB_FILE_TYPES = {\n  TEXT: ['text/*'],\n\n  IMAGE: ['image/*'],\n  IMAGE_JPG: ['image/jpeg', 'image/pjpeg'],\n  IMAGE_PNG: ['image/png'],\n  IMAGE_SVG: ['image/svg+xml'],\n  IMAGE_GIF: ['image/gif'],\n\n  AUDIO: ['audio/*'],\n  AUDIO_MP4: ['audio/mp4'],\n  AUDIO_MP3: ['audio/mpeg', 'audio/mp3'],\n  AUDIO_OGG: ['audio/ogg'],\n  AUDIO_WAVE: ['audio/wave'],\n  AUDIO_WAV: ['audio/wav', 'audio/x-wav', 'audio/x-pn-wav', 'audio/webm'],\n\n  VIDEO: ['video/*'],\n  VIDEO_MP4: ['video/mp4'],\n  VIDEO_MPEG: ['video/mpeg'],\n  VIDEO_OGG: ['video/ogg'],\n  VIDEO_MOV: ['video/quicktime'],\n  VIDEO_WEBM: ['video/webm'],\n  VIDEO_AVI: ['video/x-msvideo'],\n  VIDEO_WMV: ['video/x-ms-wmv'],\n\n  PDF: ['application/pdf'],\n\n  MS_WORD_DOC: [\n    'application/msword',\n    'application/msword',\n    'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n    'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n    'application/vnd.ms-word.document.macroEnabled.12',\n    'application/vnd.ms-word.template.macroEnabled.12',\n  ],\n\n  MS_EXCEL: [\n    'application/vnd.ms-excel',\n    'application/vnd.ms-excel',\n    'application/vnd.ms-excel',\n    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n    'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n    'application/vnd.ms-excel.sheet.macroEnabled.12',\n    'application/vnd.ms-excel.template.macroEnabled.12',\n    'application/vnd.ms-excel.addin.macroEnabled.12',\n    'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\n  ],\n\n  MS_POWERPOINT: [\n    'application/vnd.ms-powerpoint',\n    'application/vnd.ms-powerpoint',\n    'application/vnd.ms-powerpoint',\n    'application/vnd.ms-powerpoint',\n    'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n    'application/vnd.openxmlformats-officedocument.presentationml.template',\n    'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n    'application/vnd.ms-powerpoint.addin.macroEnabled.12',\n    'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\n    'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\n    'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\n  ],\n\n  ZIP: [\n    'application/x-gtar',\n    'application/x-gcompress',\n    'application/compress',\n    'application/x-tar',\n    'application/x-rar-compressed',\n    'application/octet-stream',\n    'application/x-zip-compressed',\n    'application/zip-compressed',\n    'application/x-7z-compressed',\n    'application/gzip',\n    'application/zip',\n    'application/x-bzip2',\n  ],\n};\n\nexport const SBB_CATEGORY_MIME_TYPES = new Map<FileTypeCategory, string[]>()\n  .set('doc', [\n    ...SBB_FILE_TYPES.MS_WORD_DOC,\n    ...SBB_FILE_TYPES.MS_EXCEL,\n    ...SBB_FILE_TYPES.MS_POWERPOINT,\n  ])\n  .set('audio', [\n    ...SBB_FILE_TYPES.AUDIO_MP4,\n    ...SBB_FILE_TYPES.AUDIO_MP3,\n    ...SBB_FILE_TYPES.AUDIO_OGG,\n    ...SBB_FILE_TYPES.AUDIO_WAVE,\n    ...SBB_FILE_TYPES.AUDIO_WAV,\n  ])\n  .set('image', [\n    ...SBB_FILE_TYPES.IMAGE_GIF,\n    ...SBB_FILE_TYPES.IMAGE_JPG,\n    ...SBB_FILE_TYPES.IMAGE_PNG,\n    ...SBB_FILE_TYPES.IMAGE_SVG,\n  ])\n  .set('pdf', SBB_FILE_TYPES.PDF)\n  .set('video', [\n    ...SBB_FILE_TYPES.VIDEO_MP4,\n    ...SBB_FILE_TYPES.VIDEO_MPEG,\n    ...SBB_FILE_TYPES.VIDEO_OGG,\n    ...SBB_FILE_TYPES.VIDEO_MOV,\n    ...SBB_FILE_TYPES.VIDEO_WEBM,\n    ...SBB_FILE_TYPES.VIDEO_AVI,\n    ...SBB_FILE_TYPES.VIDEO_WMV,\n  ])\n  .set('zip', SBB_FILE_TYPES.ZIP);\n","import { Injectable } from '@angular/core';\n\nimport { FileTypeCategory, SBB_CATEGORY_MIME_TYPES, SBB_FILE_TYPES } from './file-selector-base';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class SbbFileSelectorTypesService {\n  /**\n   * Returns the file type category/ies from given mime type.\n   * @param mimeType Mime type of a file.\n   * @returns File type category/ies.\n   */\n  getFileTypeCategoryByMimeType(mimeType: string): FileTypeCategory {\n    return (\n      Array.from(SBB_CATEGORY_MIME_TYPES).find(\n        ([_f, mimeTypes]) => mimeTypes.indexOf(mimeType) >= 0,\n      )?.[0] ?? 'generic'\n    );\n  }\n\n  /**\n   * Returns all accepted formats.\n   * @param typeCats File type category/ies.\n   * @returns All formats accepted.\n   */\n  getAcceptString(...typeCats: FileTypeCategory[] | FileTypeCategory[][]): string {\n    return (typeCats as FileTypeCategory[][])\n      .reduce((current, next) => current.concat(next), [] as FileTypeCategory[])\n      .map((t) => this._buildAcceptString(t))\n      .filter((a) => !!a)\n      .join(',');\n  }\n\n  /**\n   * Returns the file extension from the given file name.\n   * Returns empty string, if the file name has no extension or has the pattern '.name'.\n   * @param fileName File name.\n   * @return File with the name in input.\n   */\n  fileExtension(fileName: string): string {\n    const res = fileName.split('.');\n    return res.length === 1 || (res.length === 2 && res[0] === '') ? '' : res.pop()!;\n  }\n\n  /**\n   * Returns the file extension of the file with name in input.\n   * @param fileName File name.\n   * @returns File extension.\n   */\n  removeFileExtension(fileName: string): string {\n    const extension = this.fileExtension(fileName);\n    return !extension ? fileName : fileName.substring(0, fileName.length - extension.length - 1);\n  }\n\n  /**\n   * Returns the file size with the correct unit of measure.\n   * @param bytes File size in bytes.\n   * @returns File size with the correct unit of measure.\n   */\n  formatFileSize(bytes: number): string {\n    if (bytes === 0) {\n      return '0 B';\n    }\n\n    const k = 1024;\n    const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(0)) + ' ' + sizes[i];\n  }\n\n  private _buildAcceptString(fileTypeCategory: FileTypeCategory): string {\n    switch (fileTypeCategory) {\n      case 'doc':\n        return SBB_FILE_TYPES.MS_WORD_DOC.concat(\n          SBB_FILE_TYPES.MS_EXCEL,\n          SBB_FILE_TYPES.MS_POWERPOINT,\n        ).join(',');\n      case 'image':\n        return SBB_FILE_TYPES.IMAGE.join(',');\n      case 'pdf':\n        return SBB_FILE_TYPES.PDF.join(',');\n      case 'video':\n        return SBB_FILE_TYPES.VIDEO.join(',');\n      case 'audio':\n        return SBB_FILE_TYPES.AUDIO.join(',');\n      case 'zip':\n        return SBB_FILE_TYPES.ZIP.join(',');\n      default:\n        return '';\n    }\n  }\n}\n","// Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265\n/// <reference types=\"@angular/localize/init\" />\n\nimport {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Input,\n  Output,\n  Renderer2,\n  ViewChild,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SbbIconModule } from '@sbb-esta/angular/icon';\n\nimport {\n  FileTypeCategory,\n  SbbFileSelectorOptions,\n  SBB_FILE_SELECTOR_OPTIONS,\n} from './file-selector-base';\nimport { SbbFileSelectorTypesService } from './file-selector-types.service';\n\nlet nextId = 0;\n\n@Component({\n  selector: 'sbb-file-selector',\n  exportAs: 'sbbFileSelector',\n  templateUrl: './file-selector.html',\n  styleUrls: ['./file-selector.css'],\n  host: {\n    class: 'sbb-file-selector',\n    '[attr.id]': 'this.id',\n  },\n  inputs: ['disabled'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => SbbFileSelector),\n      multi: true,\n    },\n  ],\n  imports: [SbbIconModule],\n})\nexport class SbbFileSelector implements ControlValueAccessor, SbbFileSelectorOptions {\n  private _fileTypeService = inject(SbbFileSelectorTypesService);\n  private _renderer = inject(Renderer2);\n  private _changeDetector = inject(ChangeDetectorRef);\n\n  _labelUploadFile: string = $localize`:Button label to select files for upload@@sbbFileSelectorUploadFile:Upload file`;\n\n  _labelRemoveFile: string = $localize`:Hidden button label to remove a file from the selection list@@sbbFileSelectorRemoveFile:Remove file`;\n\n  private _uniqueId = `sbb-file-selector-${++nextId}`;\n\n  /** Whether the file selector is disabled. */\n  @Input({ transform: booleanAttribute }) disabled: boolean = false;\n\n  /** Unique id of the element. */\n  @Input() id: string = this._uniqueId;\n\n  /** Id for the inner input field. */\n  get inputId() {\n    return `${this.id || this._uniqueId}-input`;\n  }\n\n  /** Categories of file types accepted by sbb-file-selector component. */\n  @Input() accept?: string;\n  /** Attribute whose state specifies the preferred facing mode for the media capture mechanism. */\n  @Input() capture?: 'user' | 'environment';\n\n  /** Mode on file selector component to chose more files to upload. */\n  @Input({ transform: booleanAttribute })\n  multiple: boolean = false;\n\n  /** Set if the component should add files on top of the already selected ones or keep default input file behaviour. */\n  @Input() multipleMode: 'default' | 'persistent' = 'default';\n\n  /** Event emitted to a change on file selector component (for example the uploading of files). */\n  @Output() fileChanged: EventEmitter<File[]> = new EventEmitter<File[]>();\n  /** @docs-private */\n  @ViewChild('fileInput', { static: true }) fileInput: ElementRef<HTMLInputElement>;\n\n  /** List of files uploaded. */\n  filesList: File[];\n\n  /** Property that listens changes on file selector. */\n  _onChange: (_: any) => void = (_) => {};\n\n  /** Property that catches the interaction with user. */\n  _onTouched: () => void = () => {};\n\n  constructor(...args: unknown[]);\n  constructor() {\n    const options = inject<SbbFileSelectorOptions>(SBB_FILE_SELECTOR_OPTIONS, { optional: true })!;\n\n    if (options) {\n      this.accept = options.accept;\n      this.capture = options.capture;\n      this.multiple = !!options.multiple;\n      this.multipleMode = options.multipleMode || this.multipleMode;\n    }\n  }\n\n  /**\n   * Applies changes on the list of files uploaded.\n   * @param files Files uploaded.\n   */\n  fileChange(files: FileList | Event) {\n    if (!files) {\n      return;\n    }\n    if (files instanceof FileList) {\n      this.applyChanges(Array.from(files));\n      return;\n    }\n\n    const target: HTMLInputElement | null = files.target as any;\n    if (target && target.files) {\n      this.applyChanges(Array.from(target.files));\n    }\n  }\n\n  /**\n   * Applies changes on sbb-file-selector.\n   * @param files Files uploaded.\n   * @param action add or remove\n   */\n  applyChanges(files: File[], action: 'add' | 'remove' = 'add'): void {\n    const filesToAdd = action === 'add' ? this._getFileListByMode(files) : files;\n    this._renderer.setProperty(this.fileInput.nativeElement, 'value', null);\n    this._onChange(filesToAdd);\n    this.writeValue(filesToAdd);\n    this.fileChanged.emit(filesToAdd);\n  }\n\n  /**\n   * Returns the list of files without the file deleted.\n   * @param file File to delete.\n   * @returns List of files without the file deleted.\n   */\n  removeFile(file: File): void {\n    const filteredList = this.filesList.filter((f) => !this._checkFileEquality(f, file));\n    this.applyChanges(filteredList, 'remove');\n  }\n\n  // Implemented as part of ControlValueAccessor.\n  writeValue(value: any) {\n    this.filesList = value;\n    this._changeDetector.detectChanges();\n  }\n\n  // Implemented as part of ControlValueAccessor.\n  registerOnChange(fn: any) {\n    this._onChange = fn;\n  }\n\n  // Implemented as part of ControlValueAccessor.\n  registerOnTouched(fn: any) {\n    this._onTouched = fn;\n  }\n\n  // Implemented as part of ControlValueAccessor.\n  setDisabledState(isDisabled: boolean) {\n    this.disabled = isDisabled;\n    this._changeDetector.markForCheck();\n  }\n\n  /** Returns the file type category by the file type in input. */\n  _resolveFileTypeCategory(file: File): FileTypeCategory {\n    return this._fileTypeService.getFileTypeCategoryByMimeType(file.type);\n  }\n\n  /** Get the file name without the extension. */\n  _fileNameNoExtension(file: File): string {\n    return this._fileTypeService.removeFileExtension(file.name);\n  }\n\n  /** Get the file extension of the given file. */\n  _fileExtension(file: File): string {\n    return this._fileTypeService.fileExtension(file.name);\n  }\n\n  /** Returns the formatted file size of the given file. */\n  _fileSizeFormatted(file: File): string {\n    return this._fileTypeService.formatFileSize(file.size);\n  }\n\n  private _getFileListByMode(incomingFiles: File[]): File[] {\n    if (this.multiple && this.multipleMode === 'persistent') {\n      return incomingFiles\n        .filter(\n          (f) => this.filesList.findIndex((flItem) => this._checkFileEquality(f, flItem)) === -1,\n        )\n        .concat(this.filesList);\n    }\n\n    return incomingFiles;\n  }\n\n  private _checkFileEquality(file1: File, file2: File): boolean {\n    return (\n      file1.name === file2.name &&\n      file1.size === file2.size &&\n      file1.lastModified === file2.lastModified\n    );\n  }\n}\n","<label\n  class=\"sbb-file-selector-label sbb-secondary-button\"\n  [class.sbb-disabled]=\"disabled\"\n  [for]=\"inputId\"\n>\n  <input\n    type=\"file\"\n    class=\"cdk-visually-hidden\"\n    #fileInput\n    [attr.id]=\"inputId\"\n    [attr.accept]=\"accept\"\n    [attr.capture]=\"capture\"\n    [attr.multiple]=\"multiple || null\"\n    [disabled]=\"disabled\"\n    (change)=\"fileChange($event)\"\n    (blur)=\"_onTouched()\"\n  />\n  {{ _labelUploadFile }}\n  <span class=\"sbb-file-selector-upload-icon\">\n    <sbb-icon class=\"sbb-icon-scaled\" svgIcon=\"upload-small\"></sbb-icon>\n  </span>\n</label>\n\n@if (filesList && filesList.length) {\n  <ul class=\"sbb-file-selector-list sbb-clean-list sbb-icon-scaled\">\n    @for (file of filesList; track file) {\n      <li>\n        <div role=\"presentation\" class=\"sbb-file-selector-list-type-icon\">\n          @switch (_resolveFileTypeCategory(file)) {\n            @case ('doc') {\n              <sbb-icon svgIcon=\"document-text-small\"></sbb-icon>\n            }\n            @case ('image') {\n              <sbb-icon svgIcon=\"document-image-small\"></sbb-icon>\n            }\n            @case ('pdf') {\n              <sbb-icon svgIcon=\"document-pdf-small\"></sbb-icon>\n            }\n            @case ('audio') {\n              <sbb-icon svgIcon=\"document-sound-small\"></sbb-icon>\n            }\n            @case ('video') {\n              <sbb-icon svgIcon=\"document-video-small\"></sbb-icon>\n            }\n            @case ('zip') {\n              <sbb-icon svgIcon=\"document-zip-small\"></sbb-icon>\n            }\n            @default {\n              <sbb-icon svgIcon=\"document-standard-small\"></sbb-icon>\n            }\n          }\n        </div>\n        <span class=\"sbb-file-selector-list-desc\"\n          >{{ _fileNameNoExtension(file) }} (<span class=\"sbb-file-selector-list-file-ext\">{{\n            _fileExtension(file)\n          }}</span\n          >, {{ _fileSizeFormatted(file) }})</span\n        >\n        <button\n          type=\"button\"\n          class=\"sbb-file-selector-list-remove-icon sbb-button-reset-frameless\"\n          (click)=\"removeFile(file)\"\n        >\n          <span class=\"cdk-visually-hidden\">{{ _labelRemoveFile }}</span>\n          <sbb-icon svgIcon=\"trash-small\"></sbb-icon>\n        </button>\n      </li>\n    }\n  </ul>\n}\n","import { NgModule } from '@angular/core';\nimport { SbbCommonModule } from '@sbb-esta/angular/core';\nimport { SbbIconModule } from '@sbb-esta/angular/icon';\n\nimport { SbbFileSelector } from './file-selector';\n\n@NgModule({\n  imports: [SbbCommonModule, SbbIconModule, SbbFileSelector],\n  exports: [SbbFileSelector],\n})\nexport class SbbFileSelectorModule {}\n"],"names":["SBB_FILE_SELECTOR_OPTIONS","InjectionToken","SBB_FILE_TYPES","TEXT","IMAGE","IMAGE_JPG","IMAGE_PNG","IMAGE_SVG","IMAGE_GIF","AUDIO","AUDIO_MP4","AUDIO_MP3","AUDIO_OGG","AUDIO_WAVE","AUDIO_WAV","VIDEO","VIDEO_MP4","VIDEO_MPEG","VIDEO_OGG","VIDEO_MOV","VIDEO_WEBM","VIDEO_AVI","VIDEO_WMV","PDF","MS_WORD_DOC","MS_EXCEL","MS_POWERPOINT","ZIP","SBB_CATEGORY_MIME_TYPES","Map","set","SbbFileSelectorTypesService","getFileTypeCategoryByMimeType","mimeType","Array","from","find","_f","mimeTypes","indexOf","getAcceptString","typeCats","reduce","current","next","concat","map","t","_buildAcceptString","filter","a","join","fileExtension","fileName","res","split","length","pop","removeFileExtension","extension","substring","formatFileSize","bytes","k","sizes","i","Math","floor","log","parseFloat","pow","toFixed","fileTypeCategory","deps","target","i0","ɵɵFactoryTarget","Injectable","ɵprov","ɵɵngDeclareInjectable","minVersion","version","ngImport","type","decorators","args","providedIn","nextId","SbbFileSelector","_fileTypeService","inject","_renderer","Renderer2","_changeDetector","ChangeDetectorRef","_labelUploadFile","$localize","_labelRemoveFile","_uniqueId","disabled","id","inputId","accept","capture","multiple","multipleMode","fileChanged","EventEmitter","fileInput","filesList","_onChange","_","_onTouched","constructor","options","optional","fileChange","files","FileList","applyChanges","action","filesToAdd","_getFileListByMode","setProperty","nativeElement","writeValue","emit","removeFile","file","filteredList","f","_checkFileEquality","value","detectChanges","registerOnChange","fn","registerOnTouched","setDisabledState","isDisabled","markForCheck","_resolveFileTypeCategory","_fileNameNoExtension","name","_fileExtension","_fileSizeFormatted","size","incomingFiles","findIndex","flItem","file1","file2","lastModified","Component","ɵcmp","ɵɵngDeclareComponent","isStandalone","selector","inputs","booleanAttribute","outputs","host","properties","classAttribute","providers","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","viewQueries","propertyName","first","predicate","descendants","static","exportAs","template","SbbIconModule","kind","i1","SbbIcon","changeDetection","ChangeDetectionStrategy","OnPush","encapsulation","ViewEncapsulation","None","class","imports","styles","Input","transform","Output","ViewChild","SbbFileSelectorModule","NgModule","ɵmod","ɵɵngDeclareNgModule","SbbCommonModule","ɵinj","ɵɵngDeclareInjector","exports"],"mappings":"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"}