@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
152 lines (147 loc) • 10.6 kB
JavaScript
import * as i0 from '@angular/core';
import { Injectable, forwardRef, Input, Component } from '@angular/core';
import * as i1 from 'ngx-bootstrap/modal';
import * as i5 from 'ngx-bootstrap/tooltip';
import { TooltipModule } from 'ngx-bootstrap/tooltip';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import * as i2 from '@c8y/ngx-components/static-assets/data';
import * as i3 from '@c8y/ngx-components';
import { CoreModule } from '@c8y/ngx-components';
import * as i4 from '@angular/common';
class StaticAssetsModalService {
constructor(modal) {
this.modal = modal;
}
async pickStaticAsset(options) {
const component = await import('@c8y/ngx-components/static-assets/modal').then(m => m.StaticAssetsModalComponent);
const initialState = options || {};
const modalRef = this.modal.show(component, {
class: 'modal-lg',
ariaDescribedby: 'modal-body',
ariaLabelledBy: 'modal-title',
ignoreBackdropClick: true,
initialState,
keyboard: false
});
return modalRef.content.result;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StaticAssetsModalService, deps: [{ token: i1.BsModalService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StaticAssetsModalService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StaticAssetsModalService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: () => [{ type: i1.BsModalService }] });
class StaticAssetsFilePickerComponent {
constructor(staticAssetsModal, staticAssets) {
this.staticAssetsModal = staticAssetsModal;
this.staticAssets = staticAssets;
this.isCSSURL = false;
this.staticAssetType = 'branding';
this.supportedFileExtensions = [];
this.layout = 'grid';
this.size = 48;
this.loading = false;
this.currentFile = undefined;
}
writeValue(value) {
if (/^url\('.*'\)$/.test(value)) {
value = value.replace(/^url\('/, '').replace(/'\)$/, '');
}
if (/^url\(.*\)$/.test(value)) {
value = value.replace(/^url\(/, '').replace(/\)$/, '');
}
this.currentValue = value;
this.loadFileDetails(value);
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
async loadFileDetails(currentUrl) {
if (!currentUrl) {
this.currentFile = undefined;
return;
}
this.loading = true;
try {
const fileList = await this.staticAssets.listFilesCached(this.staticAssetType);
const foundFile = fileList.find(file => currentUrl.includes(file.path));
this.currentFile = foundFile;
if (!foundFile) {
const filePresent = await this.ensureFileExists(currentUrl);
if (filePresent) {
this.currentFile = {
path: currentUrl,
fileName: currentUrl.split('/').pop(),
originalFileName: currentUrl.split('/').pop()
};
}
}
}
catch (e) { }
this.loading = false;
}
clear() {
this.onChange('');
this.currentFile = undefined;
this.currentValue = '';
this.onTouched();
}
async openFilePicker() {
try {
const res = await this.staticAssetsModal.pickStaticAsset({
layout: this.layout,
assetType: this.staticAssetType,
supportedFileExtensions: this.supportedFileExtensions
});
const value = this.isCSSURL ? `url(${res.path})` : res.path;
this.onChange(value);
this.currentFile = res;
this.currentValue = value;
this.onTouched();
}
catch (e) {
// modal closed
}
}
async ensureFileExists(url) {
const response = await fetch(url);
return response.status === 200;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StaticAssetsFilePickerComponent, deps: [{ token: StaticAssetsModalService }, { token: i2.StaticAssetsService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: StaticAssetsFilePickerComponent, isStandalone: true, selector: "c8y-static-assets-file-picker", inputs: { isCSSURL: "isCSSURL", staticAssetType: "staticAssetType", supportedFileExtensions: "supportedFileExtensions", layout: "layout", size: "size" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => StaticAssetsFilePickerComponent),
multi: true
}
], ngImport: i0, template: "\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", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: StaticAssetsFilePickerComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-static-assets-file-picker', standalone: true, imports: [CoreModule, TooltipModule], providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => StaticAssetsFilePickerComponent),
multi: true
}
], template: "\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" }]
}], ctorParameters: () => [{ type: StaticAssetsModalService }, { type: i2.StaticAssetsService }], propDecorators: { isCSSURL: [{
type: Input
}], staticAssetType: [{
type: Input
}], supportedFileExtensions: [{
type: Input
}], layout: [{
type: Input
}], size: [{
type: Input
}] } });
/**
* Generated bundle index. Do not edit.
*/
export { StaticAssetsFilePickerComponent, StaticAssetsModalService };
//# sourceMappingURL=c8y-ngx-components-static-assets.mjs.map