@c8y/ngx-components 1018.0.82 → 1018.0.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/common/files.service.d.ts +1 -1
- package/core/drop-area/drop-area.component.d.ts +3 -1
- package/esm2020/core/common/bytes.pipe.mjs +3 -3
- package/esm2020/core/common/files.service.mjs +4 -4
- package/esm2020/core/drop-area/drop-area.component.mjs +16 -5
- package/esm2020/core/dynamic-forms/file/file.type.component.mjs +4 -3
- package/esm2020/core/dynamic-forms/json-schema/c8y-json-schema.service.mjs +12 -1
- package/esm2020/core/file-picker/file-picker.component.mjs +1 -1
- package/esm2020/ecosystem/shared/add-application.component.mjs +1 -1
- package/esm2020/ecosystem/shared/upload-archive.component.mjs +1 -1
- package/esm2020/protocol-opcua/opcua-server-config.component.mjs +1 -1
- package/esm2020/sub-assets/asset-properties-item.component.mjs +3 -3
- package/esm2020/trusted-certificates/add-trusted-certificate.component.mjs +1 -1
- package/esm2020/widgets/implementations/image/image-widget-config/image-widget-config.component.mjs +2 -2
- package/esm2020/widgets/implementations/markdown/markdown-widget-config/markdown-widget-config.component.mjs +1 -1
- package/fesm2015/c8y-ngx-components-ecosystem-shared.mjs +2 -2
- package/fesm2015/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-protocol-opcua.mjs +1 -1
- package/fesm2015/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-sub-assets.mjs +2 -2
- package/fesm2015/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-trusted-certificates.mjs +1 -1
- package/fesm2015/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-widgets-implementations-image.mjs +1 -1
- package/fesm2015/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-widgets-implementations-markdown.mjs +1 -1
- package/fesm2015/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components.mjs +27 -11
- package/fesm2015/c8y-ngx-components.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-ecosystem-shared.mjs +2 -2
- package/fesm2020/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-protocol-opcua.mjs +1 -1
- package/fesm2020/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-sub-assets.mjs +2 -2
- package/fesm2020/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-trusted-certificates.mjs +1 -1
- package/fesm2020/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-widgets-implementations-image.mjs +1 -1
- package/fesm2020/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-widgets-implementations-markdown.mjs +1 -1
- package/fesm2020/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components.mjs +34 -11
- package/fesm2020/c8y-ngx-components.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-implementations-image.mjs","sources":["../../widgets/implementations/image/image-widget.model.ts","../../widgets/implementations/image/image-widget.service.ts","../../widgets/implementations/image/image-widget-view/image-widget-view.component.ts","../../widgets/implementations/image/image-widget-view/image-widget-view.component.html","../../widgets/implementations/image/image-widget-config/image-widget-config.component.ts","../../widgets/implementations/image/image-widget-config/image-widget-config.component.html","../../widgets/implementations/image/image-widget.module.ts","../../widgets/implementations/image/c8y-ngx-components-widgets-implementations-image.ts"],"sourcesContent":["export interface ImageWidgetConfig {\n imageBinaryId: string;\n styling?: ImageWidgetConfigStyling;\n}\n\nexport interface ImageWidgetConfigStyling {\n objectFit: string;\n objectPositionX: string;\n objectPositionY: string;\n}\n\nexport interface ImageWidgetStyle {\n [key: string]: string;\n}\n\nexport const defaultObjectFitValue = 'contain';\nexport const defaultObjectPositionValue = 'center';\n","import { Injectable } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { InventoryBinaryService } from '@c8y/client';\nimport { IManagedObjectBinary, InventoryService } from '@c8y/client';\nimport { AlertService, FilesService, gettext } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n defaultObjectPositionValue,\n ImageWidgetConfig,\n ImageWidgetStyle\n} from './image-widget.model';\n\n@Injectable({ providedIn: 'root' })\nexport class ImageWidgetService {\n constructor(\n private inventory: InventoryService,\n private fileService: FilesService,\n private alert: AlertService,\n private translate: TranslateService,\n private binary: InventoryBinaryService\n ) {}\n\n async getImageDetails(imageBinaryId: string | null): Promise<{ file: File; base64: string }> {\n if (!imageBinaryId) {\n return null;\n }\n\n try {\n const { data: imageBinaryMo } = await this.inventory.detail(imageBinaryId);\n const file = await this.fileService.getFile(imageBinaryMo as IManagedObjectBinary);\n const base64 = await this.fileService.toBase64(file);\n return {\n file,\n base64: base64 as string\n };\n } catch (e) {\n const text = this.translate.instant(\n gettext('Unable to retrieve image with id: {{ imageBinaryId }}'),\n { imageBinaryId }\n );\n this.alert.danger(text, e?.data);\n }\n\n return null;\n }\n\n async uploadFile(\n file: File,\n options: {\n dashboardMoId?: string;\n isDeviceTypeDashboard?: boolean;\n } = {}\n ): Promise<string> {\n const hash = await this.fileService.getHashSumOfFile(file);\n const fileDetails = { c8y_SHA256: hash };\n const globalImage = !options?.dashboardMoId || options?.isDeviceTypeDashboard;\n const partialBinaryMo: Partial<IManagedObject> = !globalImage\n ? { ...fileDetails }\n : { ...fileDetails, c8y_Global: {} };\n const { data: mo } = await this.binary.create(file, partialBinaryMo);\n if (options?.dashboardMoId) {\n await this.inventory.childAdditionsAdd(mo, options?.dashboardMoId);\n }\n return mo.id;\n }\n\n getStyling(config: ImageWidgetConfig): ImageWidgetStyle | null {\n if (!config.styling?.objectFit || config.styling?.objectFit === 'full-width') {\n return null;\n }\n return {\n 'object-fit': config.styling.objectFit,\n 'object-position': `${config.styling?.objectPositionX || defaultObjectPositionValue} ${\n config.styling?.objectPositionY || defaultObjectPositionValue\n }`\n };\n }\n}\n","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { distinctUntilChanged, shareReplay, switchMap, tap } from 'rxjs/operators';\nimport { ImageWidgetConfig, ImageWidgetStyle } from '../image-widget.model';\nimport { ImageWidgetService } from '../image-widget.service';\n\n@Component({\n selector: 'c8y-image-widget-view',\n templateUrl: './image-widget-view.component.html'\n})\nexport class ImageWidgetViewComponent implements OnChanges {\n @Input() config: ImageWidgetConfig;\n imageBinaryId$ = new BehaviorSubject<string>(null);\n imageDetails$: Observable<{\n file: File;\n base64: string;\n }>;\n styling: ImageWidgetStyle | null;\n loading = true;\n\n constructor(private imageWidget: ImageWidgetService) {\n this.imageDetails$ = this.imageBinaryId$.pipe(\n distinctUntilChanged(),\n tap(() => (this.loading = true)),\n switchMap(imageBinaryId => this.imageWidget.getImageDetails(imageBinaryId)),\n tap(() => (this.loading = false)),\n shareReplay(1)\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.config) {\n const value = changes.config.currentValue as ImageWidgetConfig;\n this.imageBinaryId$.next(value.imageBinaryId);\n this.setStyling(value);\n }\n }\n\n private setStyling(config: ImageWidgetConfig): void {\n this.styling = this.imageWidget.getStyling(config);\n }\n}\n","<ng-container *ngIf=\"imageDetails$ | async as details; else empty\">\n <img\n [src]=\"details.base64\"\n [title]=\"details.file.name\"\n [ngClass]=\"styling ? 'fit-h fit-w' : 'img-responsive'\"\n [ngStyle]=\"styling\"\n />\n</ng-container>\n\n<ng-template #empty>\n <div class=\"d-flex fit-h fit-w j-c-center a-i-center\" *ngIf=\"!loading\">\n <c8y-ui-empty-state\n class=\"fit-w\"\n [icon]=\"'no-image'\"\n [title]=\"'No image to display.' | translate\"\n [subtitle]=\"'Upload an image.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n<div class=\"d-flex fit-h fit-w j-c-center a-i-center\" *ngIf=\"loading\">\n <c8y-loading></c8y-loading>\n</div>\n","import { Component, Input, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { WidgetConfigComponent } from '@c8y/ngx-components/context-dashboard';\nimport {\n C8yValidators,\n OnBeforeSave,\n FilesService,\n AlertService,\n gettext\n} from '@c8y/ngx-components';\nimport { get } from 'lodash-es';\nimport {\n defaultObjectFitValue,\n defaultObjectPositionValue,\n ImageWidgetConfig,\n ImageWidgetConfigStyling,\n ImageWidgetStyle\n} from '../image-widget.model';\nimport { ControlContainer, FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms';\nimport { BehaviorSubject, Observable, merge, Subject } from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n map,\n shareReplay,\n switchMap,\n takeUntil,\n tap\n} from 'rxjs/operators';\nimport { ImageWidgetService } from '../image-widget.service';\n\n@Component({\n selector: 'c8y-image-widget-config',\n templateUrl: './image-widget-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class ImageWidgetConfigComponent implements OnInit, OnDestroy, OnBeforeSave {\n @Input() config: ImageWidgetConfig;\n imageBinaryId$ = new BehaviorSubject<string>(null);\n imageSrc$: Observable<string>;\n loading = false;\n formGroup: FormGroup;\n fileFromConfig: File;\n styling: ImageWidgetStyle | null;\n destroyed$ = new Subject<void>();\n objectFitOptions = [\n {\n label: gettext('Contain`verb, image fitting option`'),\n value: 'contain',\n description: gettext(\n 'The image is entirely displayed within the widget while preserving the aspect ratio.'\n )\n },\n {\n label: gettext('Cover`verb, image fitting option`'),\n value: 'cover',\n description: gettext(\n 'The image is resized to fill the widget while preserving the aspect ratio. Overflowing areas are clipped.'\n )\n },\n {\n label: gettext('Fill`verb, image fitting option`'),\n value: 'fill',\n description: gettext(\n 'The image is stretched to fill the widget, overriding the aspect-ratio.'\n )\n },\n {\n label: gettext('Full width`image fitting option`'),\n value: 'full-width',\n description: gettext(\n `The image is resized to fit the widget's width while preserving the aspect ratio. Overflowing area is scrollable.`\n )\n }\n ];\n\n constructor(\n private formBuilder: FormBuilder,\n private form: NgForm,\n private fileService: FilesService,\n private alert: AlertService,\n private imageWidget: ImageWidgetService,\n @Optional() private widgetConfig: WidgetConfigComponent\n ) {}\n\n async onBeforeSave(config?: ImageWidgetConfig): Promise<boolean> {\n if (this.formGroup.invalid) {\n return false;\n }\n\n const fileFromForm = this.getFileFromFormValue(this.formGroup.value);\n if (fileFromForm && fileFromForm !== this.fileFromConfig) {\n try {\n const imageBinaryId = await this.imageWidget.uploadFile(fileFromForm, {\n dashboardMoId: this.getDashboardMoId(),\n isDeviceTypeDashboard: this.widgetConfig?.isDeviceTypeDashboard\n });\n Object.assign(config, { imageBinaryId });\n } catch (e) {\n this.alert.danger(gettext('Unable to upload image.'), e?.data);\n return false;\n }\n }\n const styling: ImageWidgetConfigStyling = this.formGroup.value.styling;\n Object.assign(config, { styling });\n\n return true;\n }\n\n ngOnInit() {\n this.initForm();\n const imageFromConfig = this.imageBinaryId$.pipe(\n filter(id => !!id),\n distinctUntilChanged(),\n tap(() => (this.loading = true)),\n switchMap(imageBinaryId => this.imageWidget.getImageDetails(imageBinaryId)),\n tap(details => {\n this.loading = false;\n this.fileFromConfig = details.file;\n if (details) {\n this.formGroup.patchValue({ images: [{ file: details.file, name: details.file.name }] });\n }\n }),\n map(details => details?.base64),\n shareReplay(1)\n );\n const selectedFile = this.formGroup.valueChanges.pipe(\n map(value => this.getFileFromFormValue(value)),\n distinctUntilChanged(),\n switchMap(file => (file ? this.fileService.toBase64(file) : Promise.resolve('')))\n );\n this.imageSrc$ = merge(imageFromConfig, selectedFile).pipe(\n map(base64 => (base64 ? (base64 as string) : ''))\n );\n this.imageBinaryId$.next(this.config?.imageBinaryId);\n }\n\n ngOnDestroy(): void {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n\n private getDashboardMoId(): string | null {\n return get(this.widgetConfig, 'mo.id', null);\n }\n\n private async initForm(): Promise<void> {\n const stylingFormGroup = this.formBuilder.group({\n objectFit: [\n // fallback to 'full-width' for old legacy widgets, newly created widgets should use defaultObjectFitValue\n this.config.imageBinaryId && !this.config.styling ? 'full-width' : defaultObjectFitValue,\n [Validators.required]\n ],\n objectPositionX: [defaultObjectPositionValue, [Validators.required]],\n objectPositionY: [defaultObjectPositionValue, [Validators.required]]\n });\n this.formGroup = this.formBuilder.group({\n images: [\n null,\n [\n Validators.required,\n Validators.minLength(1),\n Validators.maxLength(1),\n C8yValidators.filesValidator({ maximumFileSizeInKb: 1000, typePrefix: 'image/' })\n ]\n ],\n styling: stylingFormGroup\n });\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n this.formGroup.valueChanges\n .pipe(takeUntil(this.destroyed$))\n .subscribe(changes => this.setStyling(changes));\n }\n\n private getFileFromFormValue(formValue: any): File | null {\n const images: any[] = formValue?.images || [];\n return images[0]?.file || null;\n }\n\n private setStyling(config: ImageWidgetConfig): void {\n this.styling = this.imageWidget.getStyling(config);\n }\n}\n","<div class=\"p-l-24 p-r-24\">\n <div [formGroup]=\"formGroup\" class=\"row p-t-8\">\n <div class=\"col-md-12\">\n <c8y-form-group>\n <label>{{ 'Image' | translate }}</label>\n <c8y-drop-area\n formControlName=\"images\"\n class=\"drop-area-sm\"\n [icon]=\"'upload'\"\n [accept]=\"'image'\"\n [maxAllowedFiles]=\"1\"\n ></c8y-drop-area>\n <c8y-messages>\n <c8y-message\n name=\"maxFileSizeReached\"\n [text]=\"\n 'The maximum image size is {{ maxFileSize }} kB. The selected image has a size of {{ actualFileSize }} kB.'\n | translate\n \"\n ></c8y-message>\n <c8y-message\n name=\"wrongFileType\"\n [text]=\"'Wrong file type, select an image.' | translate\"\n ></c8y-message>\n <c8y-message name=\"maxlength\" [text]=\"'Only select one image.' | translate\"></c8y-message>\n <c8y-message name=\"required\" [text]=\"'An image is required.' | translate\"></c8y-message>\n <c8y-message name=\"minlength\" [text]=\"'An image is required.' | translate\"></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n <ng-container *ngIf=\"imageSrc$ | async as src\">\n <div class=\"col-md-6\">\n <div class=\"legend form-block\">\n {{ 'Size and alignment' | translate }}\n </div>\n <div [formGroupName]=\"'styling'\">\n <c8y-form-group>\n <label>\n {{ 'Image display' | translate }}\n </label>\n <ul class=\"list-group separator-top-bottom\">\n <li\n class=\"list-group-item d-flex a-i-center p-l-0\"\n *ngFor=\"let objectFitOption of objectFitOptions; let i = index\"\n >\n <label class=\"c8y-radio\">\n <input\n type=\"radio\"\n [id]=\"'groupradiocontentclass' + i\"\n formControlName=\"objectFit\"\n [value]=\"objectFitOption.value\"\n />\n <span></span>\n <span class=\"l-h-1\">\n {{ objectFitOption.label | translate }}\n <br />\n <small class=\"text-muted\">\n {{ objectFitOption.description | translate }}\n </small>\n </span>\n </label>\n </li>\n </ul>\n </c8y-form-group>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label>{{ 'Horizontal alignment' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select class=\"form-control\" formControlName=\"objectPositionX\">\n <option [ngValue]=\"'left'\">\n {{ 'left`horizontal alignment`' | translate }}\n </option>\n <option [ngValue]=\"'center'\">\n {{ 'center`horizontal alignment`' | translate }}\n </option>\n <option [ngValue]=\"'right'\">\n {{ 'right`horizontal alignment`' | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label>{{ 'Vertical alignment' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select class=\"form-control\" formControlName=\"objectPositionY\">\n <option [ngValue]=\"'top'\">\n {{ 'top`vertical alignment`' | translate }}\n </option>\n <option [ngValue]=\"'center'\">\n {{ 'center`vertical alignment`' | translate }}\n </option>\n <option [ngValue]=\"'bottom'\">\n {{ 'bottom`vertical alignment`' | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"legend form-block\">{{ 'Preview' | translate }}</div>\n <div class=\"form-group\">\n <div\n class=\"border-top border-right border-bottom border-left inner-scroll\"\n style=\"height: 300px\"\n >\n <img\n [src]=\"src\"\n [ngClass]=\"styling ? 'fit-h fit-w' : 'img-responsive'\"\n [ngStyle]=\"styling\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"col-md-12 d-flex j-c-center\" *ngIf=\"loading\">\n <c8y-loading></c8y-loading>\n </div>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { ImageWidgetViewComponent } from './image-widget-view/image-widget-view.component';\nimport { ImageWidgetConfigComponent } from './image-widget-config/image-widget-config.component';\nimport { ReactiveFormsModule } from '@angular/forms';\n\n@NgModule({\n imports: [CoreModule, ReactiveFormsModule],\n declarations: [ImageWidgetViewComponent, ImageWidgetConfigComponent]\n})\nexport class ImageWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ImageWidgetService","i3","i1","i3.ImageWidgetService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-image.mjs","sources":["../../widgets/implementations/image/image-widget.model.ts","../../widgets/implementations/image/image-widget.service.ts","../../widgets/implementations/image/image-widget-view/image-widget-view.component.ts","../../widgets/implementations/image/image-widget-view/image-widget-view.component.html","../../widgets/implementations/image/image-widget-config/image-widget-config.component.ts","../../widgets/implementations/image/image-widget-config/image-widget-config.component.html","../../widgets/implementations/image/image-widget.module.ts","../../widgets/implementations/image/c8y-ngx-components-widgets-implementations-image.ts"],"sourcesContent":["export interface ImageWidgetConfig {\n imageBinaryId: string;\n styling?: ImageWidgetConfigStyling;\n}\n\nexport interface ImageWidgetConfigStyling {\n objectFit: string;\n objectPositionX: string;\n objectPositionY: string;\n}\n\nexport interface ImageWidgetStyle {\n [key: string]: string;\n}\n\nexport const defaultObjectFitValue = 'contain';\nexport const defaultObjectPositionValue = 'center';\n","import { Injectable } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { InventoryBinaryService } from '@c8y/client';\nimport { IManagedObjectBinary, InventoryService } from '@c8y/client';\nimport { AlertService, FilesService, gettext } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n defaultObjectPositionValue,\n ImageWidgetConfig,\n ImageWidgetStyle\n} from './image-widget.model';\n\n@Injectable({ providedIn: 'root' })\nexport class ImageWidgetService {\n constructor(\n private inventory: InventoryService,\n private fileService: FilesService,\n private alert: AlertService,\n private translate: TranslateService,\n private binary: InventoryBinaryService\n ) {}\n\n async getImageDetails(imageBinaryId: string | null): Promise<{ file: File; base64: string }> {\n if (!imageBinaryId) {\n return null;\n }\n\n try {\n const { data: imageBinaryMo } = await this.inventory.detail(imageBinaryId);\n const file = await this.fileService.getFile(imageBinaryMo as IManagedObjectBinary);\n const base64 = await this.fileService.toBase64(file);\n return {\n file,\n base64: base64 as string\n };\n } catch (e) {\n const text = this.translate.instant(\n gettext('Unable to retrieve image with id: {{ imageBinaryId }}'),\n { imageBinaryId }\n );\n this.alert.danger(text, e?.data);\n }\n\n return null;\n }\n\n async uploadFile(\n file: File,\n options: {\n dashboardMoId?: string;\n isDeviceTypeDashboard?: boolean;\n } = {}\n ): Promise<string> {\n const hash = await this.fileService.getHashSumOfFile(file);\n const fileDetails = { c8y_SHA256: hash };\n const globalImage = !options?.dashboardMoId || options?.isDeviceTypeDashboard;\n const partialBinaryMo: Partial<IManagedObject> = !globalImage\n ? { ...fileDetails }\n : { ...fileDetails, c8y_Global: {} };\n const { data: mo } = await this.binary.create(file, partialBinaryMo);\n if (options?.dashboardMoId) {\n await this.inventory.childAdditionsAdd(mo, options?.dashboardMoId);\n }\n return mo.id;\n }\n\n getStyling(config: ImageWidgetConfig): ImageWidgetStyle | null {\n if (!config.styling?.objectFit || config.styling?.objectFit === 'full-width') {\n return null;\n }\n return {\n 'object-fit': config.styling.objectFit,\n 'object-position': `${config.styling?.objectPositionX || defaultObjectPositionValue} ${\n config.styling?.objectPositionY || defaultObjectPositionValue\n }`\n };\n }\n}\n","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { distinctUntilChanged, shareReplay, switchMap, tap } from 'rxjs/operators';\nimport { ImageWidgetConfig, ImageWidgetStyle } from '../image-widget.model';\nimport { ImageWidgetService } from '../image-widget.service';\n\n@Component({\n selector: 'c8y-image-widget-view',\n templateUrl: './image-widget-view.component.html'\n})\nexport class ImageWidgetViewComponent implements OnChanges {\n @Input() config: ImageWidgetConfig;\n imageBinaryId$ = new BehaviorSubject<string>(null);\n imageDetails$: Observable<{\n file: File;\n base64: string;\n }>;\n styling: ImageWidgetStyle | null;\n loading = true;\n\n constructor(private imageWidget: ImageWidgetService) {\n this.imageDetails$ = this.imageBinaryId$.pipe(\n distinctUntilChanged(),\n tap(() => (this.loading = true)),\n switchMap(imageBinaryId => this.imageWidget.getImageDetails(imageBinaryId)),\n tap(() => (this.loading = false)),\n shareReplay(1)\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.config) {\n const value = changes.config.currentValue as ImageWidgetConfig;\n this.imageBinaryId$.next(value.imageBinaryId);\n this.setStyling(value);\n }\n }\n\n private setStyling(config: ImageWidgetConfig): void {\n this.styling = this.imageWidget.getStyling(config);\n }\n}\n","<ng-container *ngIf=\"imageDetails$ | async as details; else empty\">\n <img\n [src]=\"details.base64\"\n [title]=\"details.file.name\"\n [ngClass]=\"styling ? 'fit-h fit-w' : 'img-responsive'\"\n [ngStyle]=\"styling\"\n />\n</ng-container>\n\n<ng-template #empty>\n <div class=\"d-flex fit-h fit-w j-c-center a-i-center\" *ngIf=\"!loading\">\n <c8y-ui-empty-state\n class=\"fit-w\"\n [icon]=\"'no-image'\"\n [title]=\"'No image to display.' | translate\"\n [subtitle]=\"'Upload an image.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n<div class=\"d-flex fit-h fit-w j-c-center a-i-center\" *ngIf=\"loading\">\n <c8y-loading></c8y-loading>\n</div>\n","import { Component, Input, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { WidgetConfigComponent } from '@c8y/ngx-components/context-dashboard';\nimport {\n C8yValidators,\n OnBeforeSave,\n FilesService,\n AlertService,\n gettext\n} from '@c8y/ngx-components';\nimport { get } from 'lodash-es';\nimport {\n defaultObjectFitValue,\n defaultObjectPositionValue,\n ImageWidgetConfig,\n ImageWidgetConfigStyling,\n ImageWidgetStyle\n} from '../image-widget.model';\nimport { ControlContainer, FormBuilder, FormGroup, NgForm, Validators } from '@angular/forms';\nimport { BehaviorSubject, Observable, merge, Subject } from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n map,\n shareReplay,\n switchMap,\n takeUntil,\n tap\n} from 'rxjs/operators';\nimport { ImageWidgetService } from '../image-widget.service';\n\n@Component({\n selector: 'c8y-image-widget-config',\n templateUrl: './image-widget-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]\n})\nexport class ImageWidgetConfigComponent implements OnInit, OnDestroy, OnBeforeSave {\n @Input() config: ImageWidgetConfig;\n imageBinaryId$ = new BehaviorSubject<string>(null);\n imageSrc$: Observable<string>;\n loading = false;\n formGroup: FormGroup;\n fileFromConfig: File;\n styling: ImageWidgetStyle | null;\n destroyed$ = new Subject<void>();\n objectFitOptions = [\n {\n label: gettext('Contain`verb, image fitting option`'),\n value: 'contain',\n description: gettext(\n 'The image is entirely displayed within the widget while preserving the aspect ratio.'\n )\n },\n {\n label: gettext('Cover`verb, image fitting option`'),\n value: 'cover',\n description: gettext(\n 'The image is resized to fill the widget while preserving the aspect ratio. Overflowing areas are clipped.'\n )\n },\n {\n label: gettext('Fill`verb, image fitting option`'),\n value: 'fill',\n description: gettext(\n 'The image is stretched to fill the widget, overriding the aspect-ratio.'\n )\n },\n {\n label: gettext('Full width`image fitting option`'),\n value: 'full-width',\n description: gettext(\n `The image is resized to fit the widget's width while preserving the aspect ratio. Overflowing area is scrollable.`\n )\n }\n ];\n\n constructor(\n private formBuilder: FormBuilder,\n private form: NgForm,\n private fileService: FilesService,\n private alert: AlertService,\n private imageWidget: ImageWidgetService,\n @Optional() private widgetConfig: WidgetConfigComponent\n ) {}\n\n async onBeforeSave(config?: ImageWidgetConfig): Promise<boolean> {\n if (this.formGroup.invalid) {\n return false;\n }\n\n const fileFromForm = this.getFileFromFormValue(this.formGroup.value);\n if (fileFromForm && fileFromForm !== this.fileFromConfig) {\n try {\n const imageBinaryId = await this.imageWidget.uploadFile(fileFromForm, {\n dashboardMoId: this.getDashboardMoId(),\n isDeviceTypeDashboard: this.widgetConfig?.isDeviceTypeDashboard\n });\n Object.assign(config, { imageBinaryId });\n } catch (e) {\n this.alert.danger(gettext('Unable to upload image.'), e?.data);\n return false;\n }\n }\n const styling: ImageWidgetConfigStyling = this.formGroup.value.styling;\n Object.assign(config, { styling });\n\n return true;\n }\n\n ngOnInit() {\n this.initForm();\n const imageFromConfig = this.imageBinaryId$.pipe(\n filter(id => !!id),\n distinctUntilChanged(),\n tap(() => (this.loading = true)),\n switchMap(imageBinaryId => this.imageWidget.getImageDetails(imageBinaryId)),\n tap(details => {\n this.loading = false;\n this.fileFromConfig = details.file;\n if (details) {\n this.formGroup.patchValue({ images: [{ file: details.file, name: details.file.name }] });\n }\n }),\n map(details => details?.base64),\n shareReplay(1)\n );\n const selectedFile = this.formGroup.valueChanges.pipe(\n map(value => this.getFileFromFormValue(value)),\n distinctUntilChanged(),\n switchMap(file => (file ? this.fileService.toBase64(file) : Promise.resolve('')))\n );\n this.imageSrc$ = merge(imageFromConfig, selectedFile).pipe(\n map(base64 => (base64 ? (base64 as string) : ''))\n );\n this.imageBinaryId$.next(this.config?.imageBinaryId);\n }\n\n ngOnDestroy(): void {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n\n private getDashboardMoId(): string | null {\n return get(this.widgetConfig, 'mo.id', null);\n }\n\n private async initForm(): Promise<void> {\n const stylingFormGroup = this.formBuilder.group({\n objectFit: [\n // fallback to 'full-width' for old legacy widgets, newly created widgets should use defaultObjectFitValue\n this.config.imageBinaryId && !this.config.styling ? 'full-width' : defaultObjectFitValue,\n [Validators.required]\n ],\n objectPositionX: [defaultObjectPositionValue, [Validators.required]],\n objectPositionY: [defaultObjectPositionValue, [Validators.required]]\n });\n this.formGroup = this.formBuilder.group({\n images: [\n null,\n [\n Validators.required,\n Validators.minLength(1),\n Validators.maxLength(1),\n C8yValidators.filesValidator({ maximumFileSizeInKb: 1000, typePrefix: 'image/' })\n ]\n ],\n styling: stylingFormGroup\n });\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n this.formGroup.valueChanges\n .pipe(takeUntil(this.destroyed$))\n .subscribe(changes => this.setStyling(changes));\n }\n\n private getFileFromFormValue(formValue: any): File | null {\n const images: any[] = formValue?.images || [];\n return images[0]?.file || null;\n }\n\n private setStyling(config: ImageWidgetConfig): void {\n this.styling = this.imageWidget.getStyling(config);\n }\n}\n","<div class=\"p-l-24 p-r-24\">\n <div [formGroup]=\"formGroup\" class=\"row p-t-8\">\n <div class=\"col-md-12\">\n <c8y-form-group>\n <label>{{ 'Image' | translate }}</label>\n <c8y-drop-area\n formControlName=\"images\"\n class=\"drop-area-sm\"\n [icon]=\"'upload'\"\n [accept]=\"'image'\"\n [maxAllowedFiles]=\"1\"\n ></c8y-drop-area>\n <c8y-messages>\n <c8y-message\n name=\"maxFileSizeReached\"\n [text]=\"\n 'The maximum image size is {{ maxFileSize }} kB. The selected image has a size of {{ actualFileSize }} kB.'\n | translate\n \"\n ></c8y-message>\n <c8y-message\n name=\"wrongFileType\"\n [text]=\"'Wrong file type, select an image.' | translate\"\n ></c8y-message>\n <c8y-message name=\"maxlength\" [text]=\"'Only select one image.' | translate\"></c8y-message>\n <c8y-message name=\"required\" [text]=\"'An image is required.' | translate\"></c8y-message>\n <c8y-message name=\"minlength\" [text]=\"'An image is required.' | translate\"></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n <ng-container *ngIf=\"imageSrc$ | async as src\">\n <div class=\"col-md-6\">\n <div class=\"legend form-block\">\n {{ 'Size and alignment' | translate }}\n </div>\n <div [formGroupName]=\"'styling'\">\n <c8y-form-group>\n <label>\n {{ 'Image display' | translate }}\n </label>\n <ul class=\"list-group separator-top-bottom\">\n <li\n class=\"list-group-item d-flex a-i-center p-l-0\"\n *ngFor=\"let objectFitOption of objectFitOptions; let i = index\"\n >\n <label class=\"c8y-radio\">\n <input\n type=\"radio\"\n [id]=\"'groupradiocontentclass' + i\"\n formControlName=\"objectFit\"\n [value]=\"objectFitOption.value\"\n />\n <span></span>\n <span class=\"l-h-1\">\n {{ objectFitOption.label | translate }}\n <br />\n <small class=\"text-muted\">\n {{ objectFitOption.description | translate }}\n </small>\n </span>\n </label>\n </li>\n </ul>\n </c8y-form-group>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label>{{ 'Horizontal alignment' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select class=\"form-control\" formControlName=\"objectPositionX\">\n <option [ngValue]=\"'left'\">\n {{ 'left`horizontal alignment`' | translate }}\n </option>\n <option [ngValue]=\"'center'\">\n {{ 'center`horizontal alignment`' | translate }}\n </option>\n <option [ngValue]=\"'right'\">\n {{ 'right`horizontal alignment`' | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label>{{ 'Vertical alignment' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select class=\"form-control\" formControlName=\"objectPositionY\">\n <option [ngValue]=\"'top'\">\n {{ 'top`vertical alignment`' | translate }}\n </option>\n <option [ngValue]=\"'center'\">\n {{ 'center`vertical alignment`' | translate }}\n </option>\n <option [ngValue]=\"'bottom'\">\n {{ 'bottom`vertical alignment`' | translate }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"legend form-block\">{{ 'Preview' | translate }}</div>\n <div class=\"form-group\">\n <div\n class=\"border-top border-right border-bottom border-left inner-scroll\"\n style=\"height: 300px\"\n >\n <img\n [src]=\"src\"\n [ngClass]=\"styling ? 'fit-h fit-w' : 'img-responsive'\"\n [ngStyle]=\"styling\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"col-md-12 d-flex j-c-center\" *ngIf=\"loading\">\n <c8y-loading></c8y-loading>\n </div>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { ImageWidgetViewComponent } from './image-widget-view/image-widget-view.component';\nimport { ImageWidgetConfigComponent } from './image-widget-config/image-widget-config.component';\nimport { ReactiveFormsModule } from '@angular/forms';\n\n@NgModule({\n imports: [CoreModule, ReactiveFormsModule],\n declarations: [ImageWidgetViewComponent, ImageWidgetConfigComponent]\n})\nexport class ImageWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ImageWidgetService","i3","i1","i3.ImageWidgetService"],"mappings":"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"}
|
|
@@ -240,7 +240,7 @@ class MarkdownWidgetConfigComponent {
|
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
242
|
MarkdownWidgetConfigComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: MarkdownWidgetConfigComponent, deps: [{ token: i1$1.FormBuilder }, { token: i1$1.NgForm }, { token: i1.AlertService }, { token: MarkdownWidgetService }], target: i0.ɵɵFactoryTarget.Component });
|
|
243
|
-
MarkdownWidgetConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: MarkdownWidgetConfigComponent, selector: "c8y-markdown-widget-config", inputs: { config: "config" }, ngImport: i0, template: "<form [formGroup]=\"formGroup\" class=\"p-l-24 p-r-24 p-t-16\">\n <div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label title=\"{{ 'Provide a file path' | translate }}\" class=\"c8y-radio radio-inline m-l-8\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n </label>\n </div>\n\n <ng-container [ngSwitch]=\"uploadChoice\">\n <div *ngSwitchCase=\"'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n formControlName=\"droppedFile\"\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"1\"\n [accept]=\"'md'\"\n ></c8y-drop-area>\n </c8y-form-group>\n </div>\n <div *ngSwitchCase=\"'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n formControlName=\"contentUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n />\n </div>\n </div>\n </c8y-form-group>\n </div>\n </ng-container>\n</form>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i1.DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "accept"], outputs: ["dropped"] }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] });
|
|
243
|
+
MarkdownWidgetConfigComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: MarkdownWidgetConfigComponent, selector: "c8y-markdown-widget-config", inputs: { config: "config" }, ngImport: i0, template: "<form [formGroup]=\"formGroup\" class=\"p-l-24 p-r-24 p-t-16\">\n <div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label title=\"{{ 'Provide a file path' | translate }}\" class=\"c8y-radio radio-inline m-l-8\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n </label>\n </div>\n\n <ng-container [ngSwitch]=\"uploadChoice\">\n <div *ngSwitchCase=\"'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n formControlName=\"droppedFile\"\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"1\"\n [accept]=\"'md'\"\n ></c8y-drop-area>\n </c8y-form-group>\n </div>\n <div *ngSwitchCase=\"'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n formControlName=\"contentUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n />\n </div>\n </div>\n </c8y-form-group>\n </div>\n </ng-container>\n</form>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i1.DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] });
|
|
244
244
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: MarkdownWidgetConfigComponent, decorators: [{
|
|
245
245
|
type: Component,
|
|
246
246
|
args: [{ selector: 'c8y-markdown-widget-config', template: "<form [formGroup]=\"formGroup\" class=\"p-l-24 p-r-24 p-t-16\">\n <div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label title=\"{{ 'Provide a file path' | translate }}\" class=\"c8y-radio radio-inline m-l-8\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n </label>\n </div>\n\n <ng-container [ngSwitch]=\"uploadChoice\">\n <div *ngSwitchCase=\"'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n formControlName=\"droppedFile\"\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"1\"\n [accept]=\"'md'\"\n ></c8y-drop-area>\n </c8y-form-group>\n </div>\n <div *ngSwitchCase=\"'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n formControlName=\"contentUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n />\n </div>\n </div>\n </c8y-form-group>\n </div>\n </ng-container>\n</form>\n" }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-implementations-markdown.mjs","sources":["../../widgets/implementations/markdown/markdown-widget.service.ts","../../widgets/implementations/markdown/markdown-widget-view/markdown-widget-view.component.ts","../../widgets/implementations/markdown/markdown-widget-view/markdown-widget-view.component.html","../../widgets/implementations/markdown/markdown-widget-config/markdown-widget-config.component.ts","../../widgets/implementations/markdown/markdown-widget-config/markdown-widget-config.component.html","../../widgets/implementations/markdown/markdown-widget.module.ts","../../widgets/implementations/markdown/c8y-ngx-components-widgets-implementations-markdown.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { IManagedObjectBinary, InventoryBinaryService, InventoryService } from '@c8y/client';\nimport { FilesService, gettext, AlertService } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable({ providedIn: 'root' })\nexport class MarkdownWidgetService {\n constructor(\n private fileService: FilesService,\n private inventory: InventoryService,\n private binary: InventoryBinaryService,\n private alert: AlertService,\n private translate: TranslateService\n ) {}\n\n async getFile(markdownBinaryId: string | null): Promise<File> {\n if (!markdownBinaryId) {\n return null;\n }\n\n try {\n const { data: markdownBinaryMo } = await this.inventory.detail(markdownBinaryId);\n const file = await this.fileService.getFile(markdownBinaryMo as IManagedObjectBinary);\n return file;\n } catch (e) {\n const text = this.translate.instant(\n gettext('Unable to retrieve binary with ID: {{ markdownBinaryId }}'),\n { markdownBinaryId }\n );\n this.alert.danger(text, e?.data);\n }\n\n return null;\n }\n\n async uploadFile(file: File): Promise<string> {\n const { data: mo } = await this.binary.create(file);\n return mo.id;\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { IFetchOptions, FetchClient, IFetchResponse } from '@c8y/client';\nimport { AppStateService } from '@c8y/ngx-components';\nimport { MarkdownWidgetConfig } from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\n\n@Component({\n selector: 'c8y-markdown-widget-view',\n templateUrl: './markdown-widget-view.component.html'\n})\nexport class MarkdownWidgetViewComponent implements OnInit {\n @Input() config: MarkdownWidgetConfig;\n loading: boolean;\n markdown: string;\n contextPath: string;\n private readonly headers: any = { 'Content-Type': 'text/markdown', responseType: 'blob' };\n\n constructor(\n private appState: AppStateService,\n private client: FetchClient,\n private markdownWidgetService: MarkdownWidgetService\n ) {}\n\n async ngOnInit() {\n this.contextPath = this.appState.getCurrentContextPath();\n if (this.config.markdownBinaryId) {\n const readmeContent = await (\n await this.markdownWidgetService.getFile(this.config.markdownBinaryId)\n ).text();\n this.markdown = readmeContent;\n } else if (this.config.contentUrl?.toLowerCase() === '/readme.md') {\n this.markdown = await this.getReadmeFileContent();\n } else {\n this.setContentFromUrl(this.config.contentUrl);\n }\n }\n\n setContentFromUrl(url: string) {\n const req = new XMLHttpRequest();\n\n req.onreadystatechange = () => this.render(req);\n req.addEventListener('load', () => this.render(req));\n req.open('GET', url);\n req.responseType = 'text';\n req.setRequestHeader('Accept', 'text/html');\n req.send();\n }\n\n private async render(req: XMLHttpRequest) {\n if (req.readyState === 4 && req.status === 200) {\n this.markdown = req.response;\n }\n }\n\n private async getReadmeFileContent(): Promise<string> {\n const readmeFile = await this.getReadmeFile();\n\n if (readmeFile.status === 200) {\n return await readmeFile.text();\n }\n return '';\n }\n\n private async getReadmeFile(): Promise<IFetchResponse> {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers\n };\n const result: IFetchResponse = await this.client.fetch(\n `/apps/${this.contextPath}${this.config.contentUrl}`,\n options\n );\n return result;\n }\n}\n","<div id=\"helpContent\" class=\"p-16 p-t-0 markdown-content\" [innerHTML]=\"markdown | markdownToHtml | async\"></div>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { AlertService, C8yValidators, gettext, OnBeforeSave } from '@c8y/ngx-components';\nimport {\n AbstractControl,\n FormBuilder,\n FormGroup,\n NgForm,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport { MarkdownWidgetConfig } from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\n\n@Component({\n selector: 'c8y-markdown-widget-config',\n templateUrl: './markdown-widget-config.component.html'\n})\nexport class MarkdownWidgetConfigComponent implements OnInit, OnBeforeSave {\n @Input() config: MarkdownWidgetConfig;\n formGroup: FormGroup;\n fileFromConfig: File;\n uploadChoice: 'uploadBinary' | 'uploadUrl' = 'uploadUrl';\n loading = false;\n\n constructor(\n private formBuilder: FormBuilder,\n private form: NgForm,\n private alert: AlertService,\n private markdownService: MarkdownWidgetService\n ) {}\n\n async onBeforeSave(config?: MarkdownWidgetConfig): Promise<boolean> {\n if (this.formGroup.invalid) {\n return false;\n }\n if (this.uploadChoice === 'uploadUrl') {\n Object.assign(config, {\n contentUrl: this.formGroup.value.contentUrl,\n markdownBinaryId: null\n });\n return true;\n }\n const fileFromForm = this.getFileFromFormValue(this.formGroup.value);\n if (fileFromForm && fileFromForm !== this.fileFromConfig) {\n try {\n const markdownBinaryId = await this.markdownService.uploadFile(fileFromForm);\n Object.assign(config, { markdownBinaryId, contentUrl: null });\n return true;\n } catch (e) {\n this.alert.danger(gettext('Unable to upload Markdown file.'), e?.data);\n return false;\n }\n }\n if (!fileFromForm) {\n Object.assign(config, { contentUrl: '/readme.md', markdownBinaryId: null });\n }\n return true;\n }\n\n async ngOnInit() {\n this.initForm();\n if (this.config.markdownBinaryId) {\n this.uploadChoice = 'uploadBinary';\n this.fileFromConfig = await this.markdownService.getFile(this.config.markdownBinaryId);\n this.formGroup.patchValue({\n droppedFile: [{ file: this.fileFromConfig, name: this.fileFromConfig.name }]\n });\n }\n }\n\n onChange(value: 'uploadBinary' | 'uploadUrl') {\n this.uploadChoice = value;\n this.formGroup.controls['uploadChoice'].patchValue(value);\n }\n\n private getFileFromFormValue(formValue: any): File | null {\n const binary: any[] = formValue?.droppedFile || [];\n return binary[0]?.file || null;\n }\n\n private initForm(): void {\n this.formGroup = this.formBuilder.group(\n {\n contentUrl: ['', [Validators.maxLength(2000)]],\n droppedFile: [\n null,\n [\n Validators.minLength(1),\n Validators.maxLength(1),\n C8yValidators.filesValidator({ maximumFileSizeInKb: 1000 })\n ]\n ],\n uploadChoice: [this.config.markdownBinaryId ? 'uploadBinary' : 'uploadUrl', []]\n },\n { validators: this.requireEitherBinaryOrUrl() }\n );\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n }\n\n private requireEitherBinaryOrUrl(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const url = control.get(`contentUrl`);\n const uploadBinary = control.get(`droppedFile`);\n\n const urlDefined = url && url.value !== undefined && url.value !== null;\n const uploadBinaryDefined =\n uploadBinary && uploadBinary.value !== undefined && uploadBinary.value !== null;\n\n const errors = {};\n if (this.uploadChoice === 'uploadBinary' && !uploadBinaryDefined) {\n // sets error\n const error = { required: true };\n uploadBinary.setErrors(Object.assign({}, uploadBinary.errors || {}, error));\n Object.assign(errors, error);\n } else {\n // remove previous error\n this.removeErrors(uploadBinary, ['required']);\n }\n\n if (this.uploadChoice === 'uploadUrl' && (!urlDefined || url.value === '')) {\n // sets error\n const error = { required: true };\n url.setErrors(Object.assign({}, url.errors || {}, error));\n Object.assign(errors, error);\n } else {\n // remove previous error\n this.removeErrors(url, ['required']);\n }\n\n return Object.keys(errors).length ? errors : null;\n };\n }\n\n private removeErrors(control: AbstractControl, errors: string[]): boolean {\n if (!control || !control.errors) {\n return false;\n }\n let removedError = false;\n for (const error of errors) {\n if (control.errors[error]) {\n removedError = true;\n delete control.errors[error];\n }\n }\n if (removedError) {\n control.setErrors(\n Object.keys(control.errors).length ? Object.assign({}, control.errors) : null\n );\n }\n return removedError;\n }\n}\n","<form [formGroup]=\"formGroup\" class=\"p-l-24 p-r-24 p-t-16\">\n <div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label title=\"{{ 'Provide a file path' | translate }}\" class=\"c8y-radio radio-inline m-l-8\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n </label>\n </div>\n\n <ng-container [ngSwitch]=\"uploadChoice\">\n <div *ngSwitchCase=\"'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n formControlName=\"droppedFile\"\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"1\"\n [accept]=\"'md'\"\n ></c8y-drop-area>\n </c8y-form-group>\n </div>\n <div *ngSwitchCase=\"'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n formControlName=\"contentUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n />\n </div>\n </div>\n </c8y-form-group>\n </div>\n </ng-container>\n</form>\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MarkdownWidgetViewComponent } from './markdown-widget-view/markdown-widget-view.component';\nimport { MarkdownWidgetConfigComponent } from './markdown-widget-config/markdown-widget-config.component';\n\n@NgModule({\n imports: [CoreModule, ReactiveFormsModule],\n declarations: [MarkdownWidgetViewComponent, MarkdownWidgetConfigComponent]\n})\nexport class MarkdownWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3.MarkdownWidgetService","i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-markdown.mjs","sources":["../../widgets/implementations/markdown/markdown-widget.service.ts","../../widgets/implementations/markdown/markdown-widget-view/markdown-widget-view.component.ts","../../widgets/implementations/markdown/markdown-widget-view/markdown-widget-view.component.html","../../widgets/implementations/markdown/markdown-widget-config/markdown-widget-config.component.ts","../../widgets/implementations/markdown/markdown-widget-config/markdown-widget-config.component.html","../../widgets/implementations/markdown/markdown-widget.module.ts","../../widgets/implementations/markdown/c8y-ngx-components-widgets-implementations-markdown.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { IManagedObjectBinary, InventoryBinaryService, InventoryService } from '@c8y/client';\nimport { FilesService, gettext, AlertService } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable({ providedIn: 'root' })\nexport class MarkdownWidgetService {\n constructor(\n private fileService: FilesService,\n private inventory: InventoryService,\n private binary: InventoryBinaryService,\n private alert: AlertService,\n private translate: TranslateService\n ) {}\n\n async getFile(markdownBinaryId: string | null): Promise<File> {\n if (!markdownBinaryId) {\n return null;\n }\n\n try {\n const { data: markdownBinaryMo } = await this.inventory.detail(markdownBinaryId);\n const file = await this.fileService.getFile(markdownBinaryMo as IManagedObjectBinary);\n return file;\n } catch (e) {\n const text = this.translate.instant(\n gettext('Unable to retrieve binary with ID: {{ markdownBinaryId }}'),\n { markdownBinaryId }\n );\n this.alert.danger(text, e?.data);\n }\n\n return null;\n }\n\n async uploadFile(file: File): Promise<string> {\n const { data: mo } = await this.binary.create(file);\n return mo.id;\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { IFetchOptions, FetchClient, IFetchResponse } from '@c8y/client';\nimport { AppStateService } from '@c8y/ngx-components';\nimport { MarkdownWidgetConfig } from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\n\n@Component({\n selector: 'c8y-markdown-widget-view',\n templateUrl: './markdown-widget-view.component.html'\n})\nexport class MarkdownWidgetViewComponent implements OnInit {\n @Input() config: MarkdownWidgetConfig;\n loading: boolean;\n markdown: string;\n contextPath: string;\n private readonly headers: any = { 'Content-Type': 'text/markdown', responseType: 'blob' };\n\n constructor(\n private appState: AppStateService,\n private client: FetchClient,\n private markdownWidgetService: MarkdownWidgetService\n ) {}\n\n async ngOnInit() {\n this.contextPath = this.appState.getCurrentContextPath();\n if (this.config.markdownBinaryId) {\n const readmeContent = await (\n await this.markdownWidgetService.getFile(this.config.markdownBinaryId)\n ).text();\n this.markdown = readmeContent;\n } else if (this.config.contentUrl?.toLowerCase() === '/readme.md') {\n this.markdown = await this.getReadmeFileContent();\n } else {\n this.setContentFromUrl(this.config.contentUrl);\n }\n }\n\n setContentFromUrl(url: string) {\n const req = new XMLHttpRequest();\n\n req.onreadystatechange = () => this.render(req);\n req.addEventListener('load', () => this.render(req));\n req.open('GET', url);\n req.responseType = 'text';\n req.setRequestHeader('Accept', 'text/html');\n req.send();\n }\n\n private async render(req: XMLHttpRequest) {\n if (req.readyState === 4 && req.status === 200) {\n this.markdown = req.response;\n }\n }\n\n private async getReadmeFileContent(): Promise<string> {\n const readmeFile = await this.getReadmeFile();\n\n if (readmeFile.status === 200) {\n return await readmeFile.text();\n }\n return '';\n }\n\n private async getReadmeFile(): Promise<IFetchResponse> {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers\n };\n const result: IFetchResponse = await this.client.fetch(\n `/apps/${this.contextPath}${this.config.contentUrl}`,\n options\n );\n return result;\n }\n}\n","<div id=\"helpContent\" class=\"p-16 p-t-0 markdown-content\" [innerHTML]=\"markdown | markdownToHtml | async\"></div>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { AlertService, C8yValidators, gettext, OnBeforeSave } from '@c8y/ngx-components';\nimport {\n AbstractControl,\n FormBuilder,\n FormGroup,\n NgForm,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport { MarkdownWidgetConfig } from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\n\n@Component({\n selector: 'c8y-markdown-widget-config',\n templateUrl: './markdown-widget-config.component.html'\n})\nexport class MarkdownWidgetConfigComponent implements OnInit, OnBeforeSave {\n @Input() config: MarkdownWidgetConfig;\n formGroup: FormGroup;\n fileFromConfig: File;\n uploadChoice: 'uploadBinary' | 'uploadUrl' = 'uploadUrl';\n loading = false;\n\n constructor(\n private formBuilder: FormBuilder,\n private form: NgForm,\n private alert: AlertService,\n private markdownService: MarkdownWidgetService\n ) {}\n\n async onBeforeSave(config?: MarkdownWidgetConfig): Promise<boolean> {\n if (this.formGroup.invalid) {\n return false;\n }\n if (this.uploadChoice === 'uploadUrl') {\n Object.assign(config, {\n contentUrl: this.formGroup.value.contentUrl,\n markdownBinaryId: null\n });\n return true;\n }\n const fileFromForm = this.getFileFromFormValue(this.formGroup.value);\n if (fileFromForm && fileFromForm !== this.fileFromConfig) {\n try {\n const markdownBinaryId = await this.markdownService.uploadFile(fileFromForm);\n Object.assign(config, { markdownBinaryId, contentUrl: null });\n return true;\n } catch (e) {\n this.alert.danger(gettext('Unable to upload Markdown file.'), e?.data);\n return false;\n }\n }\n if (!fileFromForm) {\n Object.assign(config, { contentUrl: '/readme.md', markdownBinaryId: null });\n }\n return true;\n }\n\n async ngOnInit() {\n this.initForm();\n if (this.config.markdownBinaryId) {\n this.uploadChoice = 'uploadBinary';\n this.fileFromConfig = await this.markdownService.getFile(this.config.markdownBinaryId);\n this.formGroup.patchValue({\n droppedFile: [{ file: this.fileFromConfig, name: this.fileFromConfig.name }]\n });\n }\n }\n\n onChange(value: 'uploadBinary' | 'uploadUrl') {\n this.uploadChoice = value;\n this.formGroup.controls['uploadChoice'].patchValue(value);\n }\n\n private getFileFromFormValue(formValue: any): File | null {\n const binary: any[] = formValue?.droppedFile || [];\n return binary[0]?.file || null;\n }\n\n private initForm(): void {\n this.formGroup = this.formBuilder.group(\n {\n contentUrl: ['', [Validators.maxLength(2000)]],\n droppedFile: [\n null,\n [\n Validators.minLength(1),\n Validators.maxLength(1),\n C8yValidators.filesValidator({ maximumFileSizeInKb: 1000 })\n ]\n ],\n uploadChoice: [this.config.markdownBinaryId ? 'uploadBinary' : 'uploadUrl', []]\n },\n { validators: this.requireEitherBinaryOrUrl() }\n );\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n }\n\n private requireEitherBinaryOrUrl(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const url = control.get(`contentUrl`);\n const uploadBinary = control.get(`droppedFile`);\n\n const urlDefined = url && url.value !== undefined && url.value !== null;\n const uploadBinaryDefined =\n uploadBinary && uploadBinary.value !== undefined && uploadBinary.value !== null;\n\n const errors = {};\n if (this.uploadChoice === 'uploadBinary' && !uploadBinaryDefined) {\n // sets error\n const error = { required: true };\n uploadBinary.setErrors(Object.assign({}, uploadBinary.errors || {}, error));\n Object.assign(errors, error);\n } else {\n // remove previous error\n this.removeErrors(uploadBinary, ['required']);\n }\n\n if (this.uploadChoice === 'uploadUrl' && (!urlDefined || url.value === '')) {\n // sets error\n const error = { required: true };\n url.setErrors(Object.assign({}, url.errors || {}, error));\n Object.assign(errors, error);\n } else {\n // remove previous error\n this.removeErrors(url, ['required']);\n }\n\n return Object.keys(errors).length ? errors : null;\n };\n }\n\n private removeErrors(control: AbstractControl, errors: string[]): boolean {\n if (!control || !control.errors) {\n return false;\n }\n let removedError = false;\n for (const error of errors) {\n if (control.errors[error]) {\n removedError = true;\n delete control.errors[error];\n }\n }\n if (removedError) {\n control.setErrors(\n Object.keys(control.errors).length ? Object.assign({}, control.errors) : null\n );\n }\n return removedError;\n }\n}\n","<form [formGroup]=\"formGroup\" class=\"p-l-24 p-r-24 p-t-16\">\n <div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label title=\"{{ 'Provide a file path' | translate }}\" class=\"c8y-radio radio-inline m-l-8\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n </label>\n </div>\n\n <ng-container [ngSwitch]=\"uploadChoice\">\n <div *ngSwitchCase=\"'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n formControlName=\"droppedFile\"\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"1\"\n [accept]=\"'md'\"\n ></c8y-drop-area>\n </c8y-form-group>\n </div>\n <div *ngSwitchCase=\"'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n formControlName=\"contentUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n />\n </div>\n </div>\n </c8y-form-group>\n </div>\n </ng-container>\n</form>\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MarkdownWidgetViewComponent } from './markdown-widget-view/markdown-widget-view.component';\nimport { MarkdownWidgetConfigComponent } from './markdown-widget-config/markdown-widget-config.component';\n\n@NgModule({\n imports: [CoreModule, ReactiveFormsModule],\n declarations: [MarkdownWidgetViewComponent, MarkdownWidgetConfigComponent]\n})\nexport class MarkdownWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3.MarkdownWidgetService","i1","i2"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Pipe, Injectable, InjectFlags, InjectionToken, Optional, Inject, isDevMode, EventEmitter, Directive, NgModule, LOCALE_ID, HostListener, Input, Component, Output, HostBinding, forwardRef, TemplateRef, SecurityContext, APP_INITIALIZER, Self, SkipSelf, NgModuleRef, createNgModuleRef, ViewChild, ContentChild, Attribute, ViewContainerRef, ContentChildren, ElementRef, Host, ViewChildren, Injector, importProvidersFrom, ChangeDetectionStrategy, SimpleChange, Type } from '@angular/core';
|
|
3
|
-
import { isNaN as isNaN$1, isFinite, castArray, flatten, uniq, sortBy, groupBy, camelCase, isUndefined, throttle as throttle$1, keys, get, each, mapValues, mapKeys, isString, forEach, assign, memoize as memoize$1, find, negate, upperFirst, property as property$1, some, entries, omitBy, every, first as first$1, map as map$1, orderBy, flatMap, isEmpty, reduce, union, filter as filter$1, isEqual, snakeCase, matches, cloneDeep, uniqBy, clone, toNumber, isEqualWith, escape as escape$1, escapeRegExp, assignWith, set, findIndex, omit, pick, flow, isNil, chunk, transform, identity, without, indexOf, parseInt as parseInt$1, kebabCase, forOwn } from 'lodash-es';
|
|
3
|
+
import { isNaN as isNaN$1, isFinite, castArray, flatten, uniq, sortBy, groupBy, camelCase, isUndefined, throttle as throttle$1, keys, get, each, mapValues, mapKeys, isString, forEach, assign, memoize as memoize$1, find, negate, upperFirst, property as property$1, some, entries, omitBy, min, every, first as first$1, map as map$1, orderBy, flatMap, isEmpty, reduce, union, filter as filter$1, isEqual, snakeCase, matches, cloneDeep, uniqBy, clone, toNumber, isEqualWith, escape as escape$1, escapeRegExp, assignWith, set, findIndex, omit, pick, flow, isNil, chunk, transform, identity, without, indexOf, parseInt as parseInt$1, kebabCase, forOwn } from 'lodash-es';
|
|
4
4
|
import { merge, of, defer, combineLatest, race, isObservable, from, Subject, BehaviorSubject, fromEvent, pipe, NEVER, concat, throwError, Observable, EMPTY, timer, fromEventPattern, empty, forkJoin, ReplaySubject } from 'rxjs';
|
|
5
5
|
import { map, distinctUntilChanged, filter, startWith, switchMap, scan, take, shareReplay, debounceTime, tap, catchError, takeUntil, mergeMap, first, share, retryWhen, delay, concatMap, debounce, sample, withLatestFrom, every as every$1, toArray, merge as merge$1, expand, finalize } from 'rxjs/operators';
|
|
6
6
|
import { __awaiter, __decorate, __metadata } from 'tslib';
|
|
@@ -94,9 +94,9 @@ class BytesPipe {
|
|
|
94
94
|
return 0;
|
|
95
95
|
}
|
|
96
96
|
const units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];
|
|
97
|
-
const num = Math.floor(Math.log(bytes) / Math.log(
|
|
97
|
+
const num = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
98
98
|
// eslint-disable-next-line no-mixed-operators
|
|
99
|
-
const result = (bytes / Math.pow(
|
|
99
|
+
const result = (bytes / Math.pow(1024, Math.floor(num))).toFixed(precision);
|
|
100
100
|
return `${result} ${units[num]}`;
|
|
101
101
|
}
|
|
102
102
|
transform(value, precision = 1) {
|
|
@@ -6124,9 +6124,9 @@ class FilesService {
|
|
|
6124
6124
|
* @param files Files to check.
|
|
6125
6125
|
* @returns Returns true if each file has the correct size.
|
|
6126
6126
|
*/
|
|
6127
|
-
haveValidSizes(files) {
|
|
6127
|
+
haveValidSizes(files, maxFileSizeInBytes) {
|
|
6128
6128
|
return __awaiter(this, void 0, void 0, function* () {
|
|
6129
|
-
const limit = yield this.loadBytesSizeLimit();
|
|
6129
|
+
const limit = min([maxFileSizeInBytes, yield this.loadBytesSizeLimit()]);
|
|
6130
6130
|
return every(files, (f) => {
|
|
6131
6131
|
return this.size(f) <= limit;
|
|
6132
6132
|
});
|
|
@@ -19851,7 +19851,10 @@ class DropAreaComponent {
|
|
|
19851
19851
|
this.onFileInvalidType();
|
|
19852
19852
|
return;
|
|
19853
19853
|
}
|
|
19854
|
-
const
|
|
19854
|
+
const maxFileSizeInBytes = this.maxFileSizeInMegaBytes
|
|
19855
|
+
? this.convertMegaBytesToBytes(this.maxFileSizeInMegaBytes)
|
|
19856
|
+
: null;
|
|
19857
|
+
const haveValidSizes = yield this.filesService.haveValidSizes(files, maxFileSizeInBytes);
|
|
19855
19858
|
if (!haveValidSizes) {
|
|
19856
19859
|
yield this.onFileInvalidSize();
|
|
19857
19860
|
return;
|
|
@@ -19892,13 +19895,19 @@ class DropAreaComponent {
|
|
|
19892
19895
|
onFileInvalidSize() {
|
|
19893
19896
|
var _a;
|
|
19894
19897
|
return __awaiter(this, void 0, void 0, function* () {
|
|
19898
|
+
const maxFileSizeInBytes = this.maxFileSizeInMegaBytes
|
|
19899
|
+
? this.convertMegaBytesToBytes(this.maxFileSizeInMegaBytes)
|
|
19900
|
+
: null;
|
|
19895
19901
|
const msg = gettext('The selected file is too large. The size limit is {{ limit }}.');
|
|
19896
|
-
const limit = this.bytes.transform(yield this.filesService.loadBytesSizeLimit());
|
|
19902
|
+
const limit = this.bytes.transform(min([maxFileSizeInBytes, yield this.filesService.loadBytesSizeLimit()]));
|
|
19897
19903
|
this.errors = true;
|
|
19898
19904
|
(_a = this.formControl) === null || _a === void 0 ? void 0 : _a.setErrors({ invalidSize: true });
|
|
19899
19905
|
this.errorMessage = this.translate.instant(msg, { limit });
|
|
19900
19906
|
});
|
|
19901
19907
|
}
|
|
19908
|
+
convertMegaBytesToBytes(maxFileSizeInMegaBytes) {
|
|
19909
|
+
return maxFileSizeInMegaBytes * 1048576;
|
|
19910
|
+
}
|
|
19902
19911
|
getFilesNamesAsString(files) {
|
|
19903
19912
|
return map$1(files, ({ name }) => name).join(', ');
|
|
19904
19913
|
}
|
|
@@ -19979,7 +19988,7 @@ class DropAreaComponent {
|
|
|
19979
19988
|
}
|
|
19980
19989
|
}
|
|
19981
19990
|
DropAreaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DropAreaComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: FilesService }, { token: i1$2.TranslateService }, { token: BytesPipe }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
19982
|
-
DropAreaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DropAreaComponent, selector: "c8y-drop-area", inputs: { formControl: "formControl", title: "title", message: "message", icon: "icon", loadingMessage: "loadingMessage", forceHideList: "forceHideList", alwaysShow: "alwaysShow", clickToOpen: "clickToOpen", loading: "loading", progress: "progress", maxAllowedFiles: "maxAllowedFiles", files: "files", accept: "accept" }, outputs: { dropped: "dropped" }, host: { listeners: { "keyup": "onkeyup($event)" } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: DropAreaComponent, multi: true }], viewQueries: [{ propertyName: "area", first: true, predicate: ["area"], descendants: true, static: true }, { propertyName: "zone", first: true, predicate: ["zone"], descendants: true }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }], ngImport: i0, template: "<div\n class=\"drop-zone\"\n *ngIf=\"!shouldShowFilesList()\"\n [ngClass]=\"{ 'has-errors': errors }\"\n [style.pointerEvents]=\"loading ? 'none' : 'auto'\"\n #zone\n (dragleave)=\"stopDragging()\"\n (drop)=\"onDrop($event)\"\n (dragover)=\"onOver()\"\n [style.display]=\"isOver || alwaysShow || loading ? 'block' : 'none'\"\n (click)=\"showPicker($event)\"\n tabindex=\"0\"\n>\n <div class=\"file-placeholder\" [ngClass]=\"{ 'drag-over': isOver }\">\n <div *ngIf=\"loading\" class=\"d-flex d-col p-4 flex-center\">\n <div\n class=\"progress progress-striped active m-0\"\n *ngIf=\"progress !== -1\"\n style=\"min-width: 50%\"\n >\n <div\n [attr.aria-label]=\"progress + '%'\"\n class=\"progress-bar\"\n role=\"progressbar\"\n aria-valuenow=\"0\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [style.width]=\"progress + '%'\"\n ></div>\n </div>\n <div class=\"spinner-snake\" *ngIf=\"progress === -1\"></div>\n <p *ngIf=\"!hasDropAreaSmallClass\" class=\"m-t-auto m-b-auto m-r-8\">\n {{ loadingMessage | translate }}\n </p>\n </div>\n\n <div *ngIf=\"!loading\" class=\"hint-placeholder pointer\">\n <i class=\"dlt-c8y-icon-{{ icon }}\"></i>\n <p *ngIf=\"!errors\">\n <b>{{ message | translate }}</b>\n <br />\n <span *ngIf=\"alwaysShow && clickToOpen\" translate></span>\n </p>\n <div *ngIf=\"errors\" class=\"has-errors\">\n <p class=\"form-control-feedback-message\">\n {{ errorMessage | translate }}\n </p>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"drop-zone\"\n *ngIf=\"shouldShowFilesList()\"\n [style.display]=\"isOver || alwaysShow || loading ? 'block' : 'none'\"\n tabindex=\"0\"\n>\n <div *ngIf=\"loading\" class=\"p-absolute p-4 fit-w fit-h d-flex d-col j-c-center a-i-center\">\n <div\n class=\"progress progress-striped active m-0\"\n *ngIf=\"progress !== -1\"\n style=\"min-width: 80%\"\n >\n <div\n [attr.aria-label]=\"progress + '%'\"\n class=\"progress-bar\"\n role=\"progressbar\"\n aria-valuenow=\"0\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [style.width]=\"progress + '%'\"\n ></div>\n </div>\n <div *ngIf=\"progress === -1\">\n <c8y-loading></c8y-loading>\n </div>\n <p *ngIf=\"!hasDropAreaSmallClass\" class=\"m-b-8\">\n <strong>\n {{ loadingMessage | translate }}\n </strong>\n </p>\n </div>\n <div *ngIf=\"!loading\" class=\"file-placeholder p-4\">\n <div class=\"d-flex p-4 a-i-center\">\n <i c8yIcon=\"file-o\" class=\"icon-20 m-r-8\"></i>\n <span title=\"{{ filesNameString }}\" class=\"text-truncate\">\n {{ filesNameString }}\n </span>\n <button\n title=\"{{ 'Remove' | translate }}\"\n [attr.aria-label]=\"'Remove' | translate\"\n type=\"button\"\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto\"\n >\n <i c8yIcon=\"minus-circle\" (click)=\"onDelete()\"></i>\n </button>\n </div>\n </div>\n</div>\n<label for=\"file\" class=\"sr-only\">{{ 'Select file' | translate }}</label>\n<input\n #picker\n *ngIf=\"clickToOpen\"\n (change)=\"onPick($event)\"\n (click)=\"picker.focus()\"\n (blur)=\"onTouched()\"\n [accept]=\"acceptedExts\"\n [multiple]=\"maxAllowedFiles > 1\"\n type=\"file\"\n class=\"hidden\"\n id=\"file\"\n/>\n<div #area [hidden]=\"isOver || loading\" (dragover)=\"toggle()\">\n <ng-content></ng-content>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] });
|
|
19991
|
+
DropAreaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DropAreaComponent, selector: "c8y-drop-area", inputs: { formControl: "formControl", title: "title", message: "message", icon: "icon", loadingMessage: "loadingMessage", forceHideList: "forceHideList", alwaysShow: "alwaysShow", clickToOpen: "clickToOpen", loading: "loading", progress: "progress", maxAllowedFiles: "maxAllowedFiles", files: "files", maxFileSizeInMegaBytes: "maxFileSizeInMegaBytes", accept: "accept" }, outputs: { dropped: "dropped" }, host: { listeners: { "keyup": "onkeyup($event)" } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: DropAreaComponent, multi: true }], viewQueries: [{ propertyName: "area", first: true, predicate: ["area"], descendants: true, static: true }, { propertyName: "zone", first: true, predicate: ["zone"], descendants: true }, { propertyName: "picker", first: true, predicate: ["picker"], descendants: true }], ngImport: i0, template: "<div\n class=\"drop-zone\"\n *ngIf=\"!shouldShowFilesList()\"\n [ngClass]=\"{ 'has-errors': errors }\"\n [style.pointerEvents]=\"loading ? 'none' : 'auto'\"\n #zone\n (dragleave)=\"stopDragging()\"\n (drop)=\"onDrop($event)\"\n (dragover)=\"onOver()\"\n [style.display]=\"isOver || alwaysShow || loading ? 'block' : 'none'\"\n (click)=\"showPicker($event)\"\n tabindex=\"0\"\n>\n <div class=\"file-placeholder\" [ngClass]=\"{ 'drag-over': isOver }\">\n <div *ngIf=\"loading\" class=\"d-flex d-col p-4 flex-center\">\n <div\n class=\"progress progress-striped active m-0\"\n *ngIf=\"progress !== -1\"\n style=\"min-width: 50%\"\n >\n <div\n [attr.aria-label]=\"progress + '%'\"\n class=\"progress-bar\"\n role=\"progressbar\"\n aria-valuenow=\"0\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [style.width]=\"progress + '%'\"\n ></div>\n </div>\n <div class=\"spinner-snake\" *ngIf=\"progress === -1\"></div>\n <p *ngIf=\"!hasDropAreaSmallClass\" class=\"m-t-auto m-b-auto m-r-8\">\n {{ loadingMessage | translate }}\n </p>\n </div>\n\n <div *ngIf=\"!loading\" class=\"hint-placeholder pointer\">\n <i class=\"dlt-c8y-icon-{{ icon }}\"></i>\n <p *ngIf=\"!errors\">\n <b>{{ message | translate }}</b>\n <br />\n <span *ngIf=\"alwaysShow && clickToOpen\" translate></span>\n </p>\n <div *ngIf=\"errors\" class=\"has-errors\">\n <p class=\"form-control-feedback-message\">\n {{ errorMessage | translate }}\n </p>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"drop-zone\"\n *ngIf=\"shouldShowFilesList()\"\n [style.display]=\"isOver || alwaysShow || loading ? 'block' : 'none'\"\n tabindex=\"0\"\n>\n <div *ngIf=\"loading\" class=\"p-absolute p-4 fit-w fit-h d-flex d-col j-c-center a-i-center\">\n <div\n class=\"progress progress-striped active m-0\"\n *ngIf=\"progress !== -1\"\n style=\"min-width: 80%\"\n >\n <div\n [attr.aria-label]=\"progress + '%'\"\n class=\"progress-bar\"\n role=\"progressbar\"\n aria-valuenow=\"0\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [style.width]=\"progress + '%'\"\n ></div>\n </div>\n <div *ngIf=\"progress === -1\">\n <c8y-loading></c8y-loading>\n </div>\n <p *ngIf=\"!hasDropAreaSmallClass\" class=\"m-b-8\">\n <strong>\n {{ loadingMessage | translate }}\n </strong>\n </p>\n </div>\n <div *ngIf=\"!loading\" class=\"file-placeholder p-4\">\n <div class=\"d-flex p-4 a-i-center\">\n <i c8yIcon=\"file-o\" class=\"icon-20 m-r-8\"></i>\n <span title=\"{{ filesNameString }}\" class=\"text-truncate\">\n {{ filesNameString }}\n </span>\n <button\n title=\"{{ 'Remove' | translate }}\"\n [attr.aria-label]=\"'Remove' | translate\"\n type=\"button\"\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto\"\n >\n <i c8yIcon=\"minus-circle\" (click)=\"onDelete()\"></i>\n </button>\n </div>\n </div>\n</div>\n<label for=\"file\" class=\"sr-only\">{{ 'Select file' | translate }}</label>\n<input\n #picker\n *ngIf=\"clickToOpen\"\n (change)=\"onPick($event)\"\n (click)=\"picker.focus()\"\n (blur)=\"onTouched()\"\n [accept]=\"acceptedExts\"\n [multiple]=\"maxAllowedFiles > 1\"\n type=\"file\"\n class=\"hidden\"\n id=\"file\"\n/>\n<div #area [hidden]=\"isOver || loading\" (dragover)=\"toggle()\">\n <ng-content></ng-content>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] });
|
|
19983
19992
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DropAreaComponent, decorators: [{
|
|
19984
19993
|
type: Component,
|
|
19985
19994
|
args: [{ selector: 'c8y-drop-area', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: DropAreaComponent, multi: true }], template: "<div\n class=\"drop-zone\"\n *ngIf=\"!shouldShowFilesList()\"\n [ngClass]=\"{ 'has-errors': errors }\"\n [style.pointerEvents]=\"loading ? 'none' : 'auto'\"\n #zone\n (dragleave)=\"stopDragging()\"\n (drop)=\"onDrop($event)\"\n (dragover)=\"onOver()\"\n [style.display]=\"isOver || alwaysShow || loading ? 'block' : 'none'\"\n (click)=\"showPicker($event)\"\n tabindex=\"0\"\n>\n <div class=\"file-placeholder\" [ngClass]=\"{ 'drag-over': isOver }\">\n <div *ngIf=\"loading\" class=\"d-flex d-col p-4 flex-center\">\n <div\n class=\"progress progress-striped active m-0\"\n *ngIf=\"progress !== -1\"\n style=\"min-width: 50%\"\n >\n <div\n [attr.aria-label]=\"progress + '%'\"\n class=\"progress-bar\"\n role=\"progressbar\"\n aria-valuenow=\"0\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [style.width]=\"progress + '%'\"\n ></div>\n </div>\n <div class=\"spinner-snake\" *ngIf=\"progress === -1\"></div>\n <p *ngIf=\"!hasDropAreaSmallClass\" class=\"m-t-auto m-b-auto m-r-8\">\n {{ loadingMessage | translate }}\n </p>\n </div>\n\n <div *ngIf=\"!loading\" class=\"hint-placeholder pointer\">\n <i class=\"dlt-c8y-icon-{{ icon }}\"></i>\n <p *ngIf=\"!errors\">\n <b>{{ message | translate }}</b>\n <br />\n <span *ngIf=\"alwaysShow && clickToOpen\" translate></span>\n </p>\n <div *ngIf=\"errors\" class=\"has-errors\">\n <p class=\"form-control-feedback-message\">\n {{ errorMessage | translate }}\n </p>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"drop-zone\"\n *ngIf=\"shouldShowFilesList()\"\n [style.display]=\"isOver || alwaysShow || loading ? 'block' : 'none'\"\n tabindex=\"0\"\n>\n <div *ngIf=\"loading\" class=\"p-absolute p-4 fit-w fit-h d-flex d-col j-c-center a-i-center\">\n <div\n class=\"progress progress-striped active m-0\"\n *ngIf=\"progress !== -1\"\n style=\"min-width: 80%\"\n >\n <div\n [attr.aria-label]=\"progress + '%'\"\n class=\"progress-bar\"\n role=\"progressbar\"\n aria-valuenow=\"0\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [style.width]=\"progress + '%'\"\n ></div>\n </div>\n <div *ngIf=\"progress === -1\">\n <c8y-loading></c8y-loading>\n </div>\n <p *ngIf=\"!hasDropAreaSmallClass\" class=\"m-b-8\">\n <strong>\n {{ loadingMessage | translate }}\n </strong>\n </p>\n </div>\n <div *ngIf=\"!loading\" class=\"file-placeholder p-4\">\n <div class=\"d-flex p-4 a-i-center\">\n <i c8yIcon=\"file-o\" class=\"icon-20 m-r-8\"></i>\n <span title=\"{{ filesNameString }}\" class=\"text-truncate\">\n {{ filesNameString }}\n </span>\n <button\n title=\"{{ 'Remove' | translate }}\"\n [attr.aria-label]=\"'Remove' | translate\"\n type=\"button\"\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto\"\n >\n <i c8yIcon=\"minus-circle\" (click)=\"onDelete()\"></i>\n </button>\n </div>\n </div>\n</div>\n<label for=\"file\" class=\"sr-only\">{{ 'Select file' | translate }}</label>\n<input\n #picker\n *ngIf=\"clickToOpen\"\n (change)=\"onPick($event)\"\n (click)=\"picker.focus()\"\n (blur)=\"onTouched()\"\n [accept]=\"acceptedExts\"\n [multiple]=\"maxAllowedFiles > 1\"\n type=\"file\"\n class=\"hidden\"\n id=\"file\"\n/>\n<div #area [hidden]=\"isOver || loading\" (dragover)=\"toggle()\">\n <ng-content></ng-content>\n</div>\n" }]
|
|
@@ -20009,6 +20018,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
20009
20018
|
type: Input
|
|
20010
20019
|
}], files: [{
|
|
20011
20020
|
type: Input
|
|
20021
|
+
}], maxFileSizeInMegaBytes: [{
|
|
20022
|
+
type: Input
|
|
20012
20023
|
}], accept: [{
|
|
20013
20024
|
type: Input
|
|
20014
20025
|
}], area: [{
|
|
@@ -20122,7 +20133,7 @@ class FilePickerComponent {
|
|
|
20122
20133
|
}
|
|
20123
20134
|
}
|
|
20124
20135
|
FilePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: FilePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
20125
|
-
FilePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: FilePickerComponent, selector: "c8y-file-picker", inputs: { maxAllowedFiles: "maxAllowedFiles", uploadChoice: "uploadChoice", fileUrl: "fileUrl", fileBinary: "fileBinary", config: "config", fileUrlPopover: "fileUrlPopover" }, outputs: { onFilesPicked: "onFilesPicked" }, viewQueries: [{ propertyName: "dropArea", first: true, predicate: DropAreaComponent, descendants: true, static: true }], ngImport: i0, template: "<div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice\"\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearInputFromUrl()\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label\n title=\"{{ 'Provide a file path' | translate }}\"\n class=\"c8y-radio radio-inline m-l-8\"\n data-cy=\"file-picker--file-path-input\"\n >\n <input\n #radio\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice\"\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearSelectedFiles()\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ fileUrlPopover | translate }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"top\"\n *ngIf=\"isPopoverUsed()\"\n ></button>\n </label>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"onFileDropped($event)\"\n [title]=\"'Drop file or click to browse' | translate\"\n [attr.aria-label]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n [files]=\"droppedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"fileUrl\"\n data-cy=\"file-picker--fileUrl\"\n [(ngModel)]=\"fileUrl\"\n (ngModelChange)=\"onFileUrlChange($event)\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n maxlength=\"{{ config.maxlength }}\"\n required\n />\n </div>\n </div>\n </c8y-form-group>\n</div>\n", dependencies: [{ kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "accept"], outputs: ["dropped"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2$1.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] });
|
|
20136
|
+
FilePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: FilePickerComponent, selector: "c8y-file-picker", inputs: { maxAllowedFiles: "maxAllowedFiles", uploadChoice: "uploadChoice", fileUrl: "fileUrl", fileBinary: "fileBinary", config: "config", fileUrlPopover: "fileUrlPopover" }, outputs: { onFilesPicked: "onFilesPicked" }, viewQueries: [{ propertyName: "dropArea", first: true, predicate: DropAreaComponent, descendants: true, static: true }], ngImport: i0, template: "<div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice\"\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearInputFromUrl()\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label\n title=\"{{ 'Provide a file path' | translate }}\"\n class=\"c8y-radio radio-inline m-l-8\"\n data-cy=\"file-picker--file-path-input\"\n >\n <input\n #radio\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice\"\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearSelectedFiles()\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ fileUrlPopover | translate }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"top\"\n *ngIf=\"isPopoverUsed()\"\n ></button>\n </label>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"onFileDropped($event)\"\n [title]=\"'Drop file or click to browse' | translate\"\n [attr.aria-label]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n [files]=\"droppedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"fileUrl\"\n data-cy=\"file-picker--fileUrl\"\n [(ngModel)]=\"fileUrl\"\n (ngModelChange)=\"onFileUrlChange($event)\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n maxlength=\"{{ config.maxlength }}\"\n required\n />\n </div>\n </div>\n </c8y-form-group>\n</div>\n", dependencies: [{ kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2$1.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] });
|
|
20126
20137
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: FilePickerComponent, decorators: [{
|
|
20127
20138
|
type: Component,
|
|
20128
20139
|
args: [{ selector: 'c8y-file-picker', template: "<div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice\"\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearInputFromUrl()\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label\n title=\"{{ 'Provide a file path' | translate }}\"\n class=\"c8y-radio radio-inline m-l-8\"\n data-cy=\"file-picker--file-path-input\"\n >\n <input\n #radio\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice\"\n [(ngModel)]=\"uploadChoice\"\n (click)=\"clearSelectedFiles()\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ fileUrlPopover | translate }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"top\"\n *ngIf=\"isPopoverUsed()\"\n ></button>\n </label>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadBinary'\">\n <c8y-form-group class=\"m-0\">\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"onFileDropped($event)\"\n [title]=\"'Drop file or click to browse' | translate\"\n [attr.aria-label]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n [files]=\"droppedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n</div>\n\n<div [hidden]=\"uploadChoice !== 'uploadUrl'\">\n <c8y-form-group class=\"m-0\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n name=\"fileUrl\"\n data-cy=\"file-picker--fileUrl\"\n [(ngModel)]=\"fileUrl\"\n (ngModelChange)=\"onFileUrlChange($event)\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n maxlength=\"{{ config.maxlength }}\"\n required\n />\n </div>\n </div>\n </c8y-form-group>\n</div>\n" }]
|
|
@@ -21735,7 +21746,8 @@ class FieldFile extends FieldType {
|
|
|
21735
21746
|
'progress',
|
|
21736
21747
|
'maxAllowedFiles',
|
|
21737
21748
|
'files',
|
|
21738
|
-
'accept'
|
|
21749
|
+
'accept',
|
|
21750
|
+
'maxFileSizeInMegaBytes'
|
|
21739
21751
|
];
|
|
21740
21752
|
}
|
|
21741
21753
|
ngOnInit() {
|
|
@@ -21756,7 +21768,7 @@ FieldFile.CONFIG = {
|
|
|
21756
21768
|
]
|
|
21757
21769
|
};
|
|
21758
21770
|
FieldFile.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: FieldFile, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
21759
|
-
FieldFile.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: FieldFile, selector: "c8y-field-file", viewQueries: [{ propertyName: "dropArea", first: true, predicate: ["dropArea"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\" role=\"group\" [attr.aria-labelledby]=\"id + '-fieldset'\">\n <label id=\"{{ id + '-fieldset' }}\" *ngIf=\"to.label || to.description\">\n {{ to.label | humanize }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"to.description\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"to.description\"\n ></button>\n </label>\n\n <c8y-drop-area #dropArea class=\"drop-area-sm\" [formControl]=\"formControl\"></c8y-drop-area>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "accept"], outputs: ["dropped"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: HumanizePipe, name: "humanize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
21771
|
+
FieldFile.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: FieldFile, selector: "c8y-field-file", viewQueries: [{ propertyName: "dropArea", first: true, predicate: ["dropArea"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\" role=\"group\" [attr.aria-labelledby]=\"id + '-fieldset'\">\n <label id=\"{{ id + '-fieldset' }}\" *ngIf=\"to.label || to.description\">\n {{ to.label | humanize }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"to.description\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"to.description\"\n ></button>\n </label>\n\n <c8y-drop-area #dropArea class=\"drop-area-sm\" [formControl]=\"formControl\"></c8y-drop-area>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: HumanizePipe, name: "humanize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
21760
21772
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: FieldFile, decorators: [{
|
|
21761
21773
|
type: Component,
|
|
21762
21774
|
args: [{ selector: 'c8y-field-file', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\" role=\"group\" [attr.aria-labelledby]=\"id + '-fieldset'\">\n <label id=\"{{ id + '-fieldset' }}\" *ngIf=\"to.label || to.description\">\n {{ to.label | humanize }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"to.description\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"to.description\"\n ></button>\n </label>\n\n <c8y-drop-area #dropArea class=\"drop-area-sm\" [formControl]=\"formControl\"></c8y-drop-area>\n</div>\n" }]
|
|
@@ -22565,6 +22577,10 @@ class C8yJSONSchema extends FormlyJsonschema {
|
|
|
22565
22577
|
accept: mapSource.allowedFileTypes.join(',')
|
|
22566
22578
|
})) });
|
|
22567
22579
|
}
|
|
22580
|
+
/** max size file validation` */
|
|
22581
|
+
if (mapSource.maxSize) {
|
|
22582
|
+
result = Object.assign(Object.assign({}, result), { type: 'file', props: Object.assign(Object.assign({}, (result.props || {})), { maxFileSizeInMegaBytes: mapSource.maxSize }) });
|
|
22583
|
+
}
|
|
22568
22584
|
/** Provides a way to use templateOptions in JSONSchema forms */
|
|
22569
22585
|
if (mapSource.templateOptions) {
|
|
22570
22586
|
result = Object.assign(Object.assign({}, result), { props: Object.assign(Object.assign({}, mapSource.templateOptions), result.props) });
|