{"version":3,"file":"c8y-ngx-components-static-assets.mjs","sources":["../../static-assets/static-assets-modal.service.ts","../../static-assets/static-assets-file-picker/static-assets-file-picker.component.ts","../../static-assets/static-assets-file-picker/static-assets-file-picker.component.html","../../static-assets/c8y-ngx-components-static-assets.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport type { StaticAsset } from '@c8y/ngx-components/static-assets/data';\nimport type { StaticAssetsModalComponent } from '@c8y/ngx-components/static-assets/modal';\nimport { BsModalService } from 'ngx-bootstrap/modal';\n\n@Injectable({ providedIn: 'root' })\nexport class StaticAssetsModalService {\n  constructor(private modal: BsModalService) {}\n\n  async pickStaticAsset(\n    options?: Partial<\n      Pick<StaticAssetsModalComponent, 'supportedFileExtensions' | 'assetType' | 'layout'>\n    >\n  ): Promise<StaticAsset> {\n    const component = await import('@c8y/ngx-components/static-assets/modal').then(\n      m => m.StaticAssetsModalComponent\n    );\n    const initialState: Partial<StaticAssetsModalComponent> = options || {};\n    const modalRef = this.modal.show(component, {\n      class: 'modal-lg',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      ignoreBackdropClick: true,\n      initialState,\n      keyboard: false\n    });\n    return modalRef.content.result;\n  }\n}\n","import { Component, forwardRef, Input } from '@angular/core';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StaticAssetsModalService } from '../static-assets-modal.service';\nimport { StaticAsset, StaticAssetsService } from '@c8y/ngx-components/static-assets/data';\nimport { CoreModule } from '@c8y/ngx-components';\nimport type { StaticAssetsModalComponent } from '@c8y/ngx-components/static-assets/modal';\n\n@Component({\n  selector: 'c8y-static-assets-file-picker',\n  templateUrl: './static-assets-file-picker.component.html',\n  standalone: true,\n  imports: [CoreModule, TooltipModule],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => StaticAssetsFilePickerComponent),\n      multi: true\n    }\n  ]\n})\nexport class StaticAssetsFilePickerComponent implements ControlValueAccessor {\n  @Input() isCSSURL = false;\n  @Input() staticAssetType: StaticAssetsModalComponent['assetType'] = 'branding';\n  @Input() supportedFileExtensions: StaticAssetsModalComponent['supportedFileExtensions'] = [];\n  @Input() layout: StaticAssetsModalComponent['layout'] = 'grid';\n  @Input() size = 48;\n  loading = false;\n  currentFile: StaticAsset | undefined = undefined;\n  currentValue: string;\n\n  private onChange: (value: string) => void;\n  private onTouched: () => void;\n\n  constructor(\n    private staticAssetsModal: StaticAssetsModalService,\n    private staticAssets: StaticAssetsService\n  ) {}\n\n  writeValue(value: string): void {\n    if (/^url\\('.*'\\)$/.test(value)) {\n      value = value.replace(/^url\\('/, '').replace(/'\\)$/, '');\n    }\n    if (/^url\\(.*\\)$/.test(value)) {\n      value = value.replace(/^url\\(/, '').replace(/\\)$/, '');\n    }\n    this.currentValue = value;\n    this.loadFileDetails(value);\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  async loadFileDetails(currentUrl: string) {\n    if (!currentUrl) {\n      this.currentFile = undefined;\n      return;\n    }\n    this.loading = true;\n    try {\n      const fileList = await this.staticAssets.listFilesCached(this.staticAssetType);\n      const foundFile = fileList.find(file => currentUrl.includes(file.path));\n      this.currentFile = foundFile;\n      if (!foundFile) {\n        const filePresent = await this.ensureFileExists(currentUrl);\n        if (filePresent) {\n          this.currentFile = {\n            path: currentUrl,\n            fileName: currentUrl.split('/').pop(),\n            originalFileName: currentUrl.split('/').pop()\n          } as any;\n        }\n      }\n    } catch (e) {}\n\n    this.loading = false;\n  }\n\n  clear() {\n    this.onChange('');\n    this.currentFile = undefined;\n    this.currentValue = '';\n    this.onTouched();\n  }\n\n  async openFilePicker() {\n    try {\n      const res = await this.staticAssetsModal.pickStaticAsset({\n        layout: this.layout,\n        assetType: this.staticAssetType,\n        supportedFileExtensions: this.supportedFileExtensions\n      });\n      const value = this.isCSSURL ? `url(${res.path})` : res.path;\n      this.onChange(value);\n      this.currentFile = res;\n      this.currentValue = value;\n      this.onTouched();\n    } catch (e) {\n      // modal closed\n    }\n  }\n\n  private async ensureFileExists(url: string): Promise<boolean> {\n    const response = await fetch(url);\n    return response.status === 200;\n  }\n}\n","\n<div class=\"d-flex a-i-center gap-8\">\n  <div *ngIf=\"!currentValue else fileSelected\" class=\"d-contents\">\n    <i c8yIcon=\"no-image\" class=\"icon-48 text-muted\"></i>\n    <p class=\"m-r-auto text-muted\"><em translate>No file selected.</em></p>\n  </div>\n\n  <ng-template #fileSelected>\n    <c8y-loading *ngIf=\"loading\"></c8y-loading>\n    <div *ngIf=\"!loading && !currentFile\">\n      <p translate>Unable to locate file: \"{{ currentValue }}\"</p>\n    </div>\n\n    <div *ngIf=\"!loading && currentFile\" style=\"min-height: 48px\" class=\"d-flex a-i-center\">\n      <img *ngIf=\"currentFile\" [src]=\"currentFile.path\" class=\"img-responsive\" [ngStyle]=\"{'width.px': size}\" alt=\"{{currentFile?.fileName }}\">\n    </div>\n    <span class=\"text-truncate\" title=\"{{ currentFile?.fileName || currentValue }}\">{{ currentFile?.fileName || currentValue }}</span>\n    <button class=\" m-l-auto btn btn-dot btn-dot--danger\"\n      type=\"button\" (click)=\"clear()\"\n      [delay]=\"500\"\n      [attr.aria-label]=\"'Remove' | translate\"\n      placement=\"top\"\n      tooltip=\"{{'Remove' | translate}}\">\n      <i c8yIcon=\"minus-circle\"></i>\n    </button>\n  </ng-template>\n\n  <button (click)=\"openFilePicker()\" class=\"btn btn-default btn-sm\">\n    <span *ngIf=\"!currentFile\">\n      {{'Select' | translate}}\n    </span>\n    <span *ngIf=\"currentFile\">\n      {{'Replace' | translate}}\n    </span>\n  </button>\n</div>\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.StaticAssetsModalService"],"mappings":"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"}