@c8y/ngx-components 1023.83.4 → 1023.88.1
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/alarm-event-selector/index.d.ts +6 -0
- package/alarm-event-selector/index.d.ts.map +1 -1
- package/api/index.d.ts.map +1 -1
- package/cockpit-config/index.d.ts +3 -0
- package/cockpit-config/index.d.ts.map +1 -1
- package/context-dashboard/index.d.ts +11 -1
- package/context-dashboard/index.d.ts.map +1 -1
- package/data-preparation/index.d.ts +10 -0
- package/data-preparation/index.d.ts.map +1 -0
- package/datapoint-selector/index.d.ts +2 -1
- package/datapoint-selector/index.d.ts.map +1 -1
- package/echart/index.d.ts +1 -0
- package/echart/index.d.ts.map +1 -1
- package/echart/models/index.d.ts +1 -0
- package/echart/models/index.d.ts.map +1 -1
- package/feature-toggles/index.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +90 -21
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-api.mjs +8 -11
- package/fesm2022/c8y-ngx-components-api.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs +43 -7
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +10 -10
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-preparation.mjs +63 -0
- package/fesm2022/c8y-ngx-components-data-preparation.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +14 -12
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +102 -44
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-feature-toggles.mjs +13 -6
- package/fesm2022/c8y-ngx-components-feature-toggles.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-global-context.mjs +2 -2
- package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs +2 -2
- package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-alarms-alarm-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-list.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-event-list.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-definitions-event-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs +30 -6
- package/fesm2022/c8y-ngx-components-widgets-definitions-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs +4 -4
- package/fesm2022/c8y-ngx-components-widgets-definitions-kpi.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-linear-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-definitions-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-pie-chart.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-pie-chart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-silo.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +6 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-events.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-pie-chart.mjs +10 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-pie-chart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +38 -16
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/locales/de.po +17 -6
- package/locales/es.po +17 -6
- package/locales/fr.po +17 -6
- package/locales/ja_JP.po +15 -6
- package/locales/ko.po +16 -6
- package/locales/locales.pot +54 -4
- package/locales/nl.po +17 -6
- package/locales/pl.po +17 -6
- package/locales/pt_BR.po +17 -6
- package/locales/zh_CN.po +17 -6
- package/locales/zh_TW.po +17 -6
- package/package.json +1 -1
- package/widgets/definitions/info-gauge/index.d.ts.map +1 -1
- package/widgets/implementations/asset-table/index.d.ts +4 -1
- package/widgets/implementations/asset-table/index.d.ts.map +1 -1
- package/widgets/implementations/pie-chart/index.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-implementations-markdown.mjs","sources":["../../widgets/implementations/markdown/markdown-widget.model.ts","../../widgets/implementations/markdown/markdown-widget.service.ts","../../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-view/markdown-widget-view.component.ts","../../widgets/implementations/markdown/markdown-widget-view/markdown-widget-view.component.html","../../widgets/implementations/markdown/c8y-ngx-components-widgets-implementations-markdown.ts"],"sourcesContent":["import { FormControl, FormGroup } from '@angular/forms';\n\nexport interface MarkdownWidgetConfig {\n markdownBinaryId: string | null;\n contentUrl: string | null;\n markdownContent: string | null;\n}\n\nexport const MarkdownSourceType = {\n WRITE: 'writeMarkdown',\n UPLOAD: 'uploadBinary',\n URL: 'uploadUrl'\n} as const;\n\nexport type MarkdownSourceType = (typeof MarkdownSourceType)[keyof typeof MarkdownSourceType];\n\nexport interface DroppedFileItem {\n file: File;\n name: string;\n}\n\nexport type MarkdownWidgetFormGroup = FormGroup<{\n contentUrl: FormControl<string>;\n droppedFile: FormControl<DroppedFileItem[] | null>;\n uploadChoice: FormControl<MarkdownSourceType>;\n}>;\n","import { Injectable } from '@angular/core';\nimport {\n FetchClient,\n IFetchOptions,\n IManagedObjectBinary,\n InventoryBinaryService,\n InventoryService\n} from '@c8y/client';\nimport { AlertService, AppStateService, FilesService } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable({ providedIn: 'root' })\nexport class MarkdownWidgetService {\n private readonly headers = { 'Content-Type': 'text/markdown' };\n\n constructor(\n private fileService: FilesService,\n private inventory: InventoryService,\n private binary: InventoryBinaryService,\n private alert: AlertService,\n private translate: TranslateService,\n private fetchClient: FetchClient,\n private appStateService: AppStateService\n ) {}\n\n /**\n * Retrieves a markdown file from the inventory by its binary ID.\n * @param markdownBinaryId - The ID of the binary managed object.\n * @returns The file if found, otherwise null.\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 /**\n * Uploads a markdown file to the inventory as a binary.\n * @param file - The file to upload.\n * @returns The ID of the created binary managed object.\n */\n async uploadFile(file: File): Promise<string> {\n const { data: mo } = await this.binary.create(file);\n return mo.id;\n }\n\n /**\n * Fetches markdown content from a URL.\n * For internal URLs (e.g., `/readme.md`), uses FetchClient with the app's context path.\n * For external URLs, uses XMLHttpRequest to avoid CORS issues with auth headers.\n * @param url - The URL to fetch content from.\n * @returns The markdown content as a string, or empty string on error.\n */\n async getContentFromUrl(url: string): Promise<string> {\n if (url?.toLowerCase() === '/readme.md') {\n return this.getContentFromInternalUrl(url);\n }\n return this.getContentFromExternalUrl(url);\n }\n\n private async getContentFromInternalUrl(url: string): Promise<string> {\n try {\n const contextPath = this.appStateService.state.app.contextPath;\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers\n };\n const response = await this.fetchClient.fetch(`/apps/${contextPath}${url}`, options);\n if (response.status === 200) {\n return response.text();\n }\n } catch {\n // ignore error, return empty string\n }\n return '';\n }\n\n private getContentFromExternalUrl(url: string): Promise<string> {\n return new Promise(resolve => {\n const req = new XMLHttpRequest();\n req.onreadystatechange = () => {\n if (req.readyState === 4) {\n if (req.status === 200) {\n resolve(req.response);\n } else {\n resolve('');\n }\n }\n };\n req.onerror = () => resolve('');\n req.open('GET', url);\n req.responseType = 'text';\n req.setRequestHeader('Accept', 'text/html');\n req.send();\n });\n }\n}\n","import { Component, inject, Input, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n C8yTranslatePipe,\n C8yValidators,\n DropAreaComponent,\n EmptyStateComponent,\n FormGroupComponent,\n IconDirective,\n MarkdownToHtmlPipe,\n OnBeforeSave\n} from '@c8y/ngx-components';\nimport {\n AbstractControl,\n FormBuilder,\n FormsModule,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport {\n DroppedFileItem,\n MarkdownSourceType,\n MarkdownWidgetConfig,\n MarkdownWidgetFormGroup\n} from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { AsyncPipe } from '@angular/common';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\n\n@Component({\n selector: 'c8y-markdown-widget-config',\n templateUrl: './markdown-widget-config.component.html',\n standalone: true,\n imports: [\n ReactiveFormsModule,\n FormsModule,\n AsyncPipe,\n C8yTranslatePipe,\n MarkdownToHtmlPipe,\n FormGroupComponent,\n DropAreaComponent,\n EmptyStateComponent,\n IconDirective,\n EditorComponent\n ]\n})\nexport class MarkdownWidgetConfigComponent implements OnInit, OnDestroy, OnBeforeSave {\n @Input() config: MarkdownWidgetConfig;\n @ViewChild('markdownPreview')\n set markdownPreviewTemplate(template: TemplateRef<any>) {\n this.widgetConfigService.setPreview(template || null);\n }\n\n readonly MarkdownSourceType = MarkdownSourceType;\n\n formGroup: MarkdownWidgetFormGroup;\n fileFromConfig: File;\n uploadChoice: MarkdownSourceType = MarkdownSourceType.URL;\n previewMarkdown$ = new BehaviorSubject<string>('');\n editorContent = '';\n\n private widgetConfigService = inject(WidgetConfigService);\n private destroy$ = new Subject<void>();\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.uploadChoice === MarkdownSourceType.WRITE) {\n Object.assign(config, {\n markdownContent: this.editorContent,\n contentUrl: null,\n markdownBinaryId: null\n });\n return true;\n }\n\n if (this.formGroup.invalid) {\n return false;\n }\n\n if (this.uploadChoice === MarkdownSourceType.URL) {\n Object.assign(config, {\n contentUrl: this.formGroup.value.contentUrl,\n markdownBinaryId: null,\n markdownContent: null\n });\n return true;\n }\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, markdownContent: 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, {\n contentUrl: '/readme.md',\n markdownBinaryId: null,\n markdownContent: null\n });\n }\n return true;\n }\n\n async ngOnInit() {\n // Determine initial mode from config\n if (this.config.markdownContent) {\n this.uploadChoice = MarkdownSourceType.WRITE;\n } else if (this.config.markdownBinaryId) {\n this.uploadChoice = MarkdownSourceType.UPLOAD;\n }\n\n this.initForm();\n\n // Load initial content based on mode\n switch (this.uploadChoice) {\n case MarkdownSourceType.WRITE:\n this.editorContent = this.config.markdownContent;\n this.previewMarkdown$.next(this.config.markdownContent);\n break;\n case MarkdownSourceType.UPLOAD:\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 await this.updatePreviewFromFile(this.fileFromConfig);\n break;\n case MarkdownSourceType.URL:\n if (this.config.contentUrl) {\n this.previewMarkdown$.next(\n await this.markdownService.getContentFromUrl(this.config.contentUrl)\n );\n }\n break;\n }\n\n this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(async value => {\n await this.updatePreview(value);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onChange(value: MarkdownSourceType) {\n this.uploadChoice = value;\n\n // Ensure dropped file has 'name' property for drop area to display filename\n const droppedFile = this.formGroup.value.droppedFile;\n if (value === MarkdownSourceType.UPLOAD && droppedFile?.[0]?.file) {\n const normalizedFile = droppedFile.map(item => ({\n ...item,\n name: item.name || item.file?.name\n }));\n this.formGroup.controls['droppedFile'].setValue(normalizedFile);\n }\n\n this.formGroup.updateValueAndValidity();\n }\n\n onEditorChange(content: string) {\n this.editorContent = content;\n this.previewMarkdown$.next(content);\n }\n\n private async updatePreview(formValue: Partial<MarkdownWidgetFormGroup['value']>): Promise<void> {\n const choice = formValue.uploadChoice || this.uploadChoice;\n switch (choice) {\n case MarkdownSourceType.WRITE:\n if (!this.editorContent) {\n this.editorContent = this.previewMarkdown$.getValue();\n }\n this.previewMarkdown$.next(this.editorContent);\n break;\n case MarkdownSourceType.UPLOAD:\n const file = this.getFileFromFormValue(formValue);\n file ? await this.updatePreviewFromFile(file) : this.previewMarkdown$.next('');\n break;\n case MarkdownSourceType.URL:\n if (formValue.contentUrl) {\n this.previewMarkdown$.next(\n await this.markdownService.getContentFromUrl(formValue.contentUrl)\n );\n } else {\n this.previewMarkdown$.next('');\n }\n break;\n }\n }\n\n private async updatePreviewFromFile(file: File): Promise<void> {\n try {\n this.previewMarkdown$.next(await file.text());\n } catch {\n this.previewMarkdown$.next('');\n }\n }\n\n private getFileFromFormValue(formValue: Partial<MarkdownWidgetFormGroup['value']>): File | null {\n const binary = formValue?.droppedFile || [];\n return binary[0]?.file || null;\n }\n\n private initForm(): void {\n this.formGroup = this.formBuilder.group(\n {\n contentUrl: this.formBuilder.nonNullable.control('', [Validators.maxLength(2000)]),\n droppedFile: this.formBuilder.control<DroppedFileItem[] | null>(null, [\n Validators.minLength(1),\n Validators.maxLength(1),\n C8yValidators.filesValidator({ maximumFileSizeInKb: 1000 })\n ]),\n uploadChoice: this.formBuilder.nonNullable.control<MarkdownSourceType>(this.uploadChoice)\n },\n { validators: this.requireValidSource() }\n ) as MarkdownWidgetFormGroup;\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n }\n\n private requireValidSource(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const url = control.get('contentUrl');\n const droppedFile = control.get('droppedFile');\n\n // Write mode - always valid, editor content handled separately\n if (this.uploadChoice === MarkdownSourceType.WRITE) {\n url.setErrors(null);\n droppedFile.setErrors(null);\n return null;\n }\n\n // Clear required errors on inactive controls, set on active if empty\n if (this.uploadChoice === MarkdownSourceType.URL) {\n this.clearRequiredError(droppedFile);\n if (!url.value) {\n url.setErrors({ ...url.errors, required: true });\n return { required: true };\n }\n this.clearRequiredError(url);\n }\n\n if (this.uploadChoice === MarkdownSourceType.UPLOAD) {\n this.clearRequiredError(url);\n if (!droppedFile.value) {\n droppedFile.setErrors({ ...droppedFile.errors, required: true });\n return { required: true };\n }\n this.clearRequiredError(droppedFile);\n }\n\n return null;\n };\n }\n\n private clearRequiredError(control: AbstractControl): void {\n if (control?.errors?.required) {\n const { required: _, ...rest } = control.errors;\n control.setErrors(Object.keys(rest).length ? rest : null);\n }\n }\n}\n","<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Source' | translate }}</legend>\n <form [formGroup]=\"formGroup\">\n <div class=\"form-group\">\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Write Markdown' | translate }}\"\n >\n <input\n name=\"uploadChoice\"\n type=\"radio\"\n [value]=\"MarkdownSourceType.WRITE\"\n formControlName=\"uploadChoice\"\n (change)=\"onChange(MarkdownSourceType.WRITE)\"\n />\n <span></span>\n <span>{{ 'Write Markdown' | translate }}</span>\n </label>\n <label\n class=\"c8y-radio radio-inline m-l-8\"\n title=\"{{ 'Upload a binary' | translate }}\"\n >\n <input\n name=\"uploadChoice\"\n type=\"radio\"\n [value]=\"MarkdownSourceType.UPLOAD\"\n formControlName=\"uploadChoice\"\n (change)=\"onChange(MarkdownSourceType.UPLOAD)\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label\n class=\"c8y-radio radio-inline m-l-8\"\n title=\"{{ 'Provide a file path' | translate }}\"\n >\n <input\n name=\"uploadChoice\"\n type=\"radio\"\n [value]=\"MarkdownSourceType.URL\"\n formControlName=\"uploadChoice\"\n (change)=\"onChange(MarkdownSourceType.URL)\"\n />\n <span></span>\n <span>{{ 'Provide a file path' | translate }}</span>\n </label>\n </div>\n @switch (uploadChoice) {\n @case (MarkdownSourceType.WRITE) {\n <c8y-editor\n class=\"d-block\"\n style=\"height: 300px\"\n [ngModel]=\"editorContent\"\n (ngModelChange)=\"onEditorChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [editorOptions]=\"{\n language: 'markdown',\n tabSize: 2,\n insertSpaces: true,\n minimap: { enabled: false },\n wordWrap: 'on'\n }\"\n ></c8y-editor>\n }\n @case (MarkdownSourceType.UPLOAD) {\n <c8y-form-group class=\"m-b-24\">\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n formControlName=\"droppedFile\"\n [maxAllowedFiles]=\"1\"\n [accept]=\"'md'\"\n ></c8y-drop-area>\n </c8y-form-group>\n }\n @case (MarkdownSourceType.URL) {\n <c8y-form-group class=\"m-b-24\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n type=\"text\"\n formControlName=\"contentUrl\"\n />\n </div>\n </c8y-form-group>\n }\n }\n </form>\n</fieldset>\n\n<ng-template #markdownPreview>\n @if (previewMarkdown$ | async; as previewMarkdown) {\n <div\n class=\"p-16 p-t-0 markdown-content fit-h overflow-auto\"\n [innerHTML]=\"previewMarkdown | markdownToHtml | async\"\n ></div>\n } @else {\n <div class=\"fit-h d-flex d-col j-c-center a-i-center\">\n <c8y-ui-empty-state\n [icon]=\"'file-text'\"\n [title]=\"'No content to preview' | translate\"\n [subtitle]=\"\n 'Write Markdown, upload a file, or provide a URL to see the preview' | translate\n \"\n [horizontal]=\"false\"\n ></c8y-ui-empty-state>\n </div>\n }\n</ng-template>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { MarkdownToHtmlPipe } from '@c8y/ngx-components';\nimport { MarkdownWidgetConfig } from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n selector: 'c8y-markdown-widget-view',\n templateUrl: './markdown-widget-view.component.html',\n standalone: true,\n imports: [MarkdownToHtmlPipe, AsyncPipe]\n})\nexport class MarkdownWidgetViewComponent implements OnInit {\n @Input() config: MarkdownWidgetConfig;\n markdown: string;\n\n constructor(private markdownWidgetService: MarkdownWidgetService) {}\n\n async ngOnInit() {\n if (this.config.markdownContent) {\n this.markdown = this.config.markdownContent;\n } else if (this.config.markdownBinaryId) {\n const file = await this.markdownWidgetService.getFile(this.config.markdownBinaryId);\n this.markdown = await file?.text();\n } else if (this.config.contentUrl) {\n this.markdown = await this.markdownWidgetService.getContentFromUrl(this.config.contentUrl);\n }\n }\n}\n","<div id=\"helpContent\" class=\"p-16 p-t-0 markdown-content\" [innerHTML]=\"markdown | markdownToHtml | async\"></div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3.MarkdownWidgetService","i1.MarkdownWidgetService"],"mappings":";;;;;;;;;;;;;;;AAQO,MAAM,kBAAkB,GAAG;AAChC,IAAA,KAAK,EAAE,eAAe;AACtB,IAAA,MAAM,EAAE,cAAc;AACtB,IAAA,GAAG,EAAE;;;MCEM,qBAAqB,CAAA;AAGhC,IAAA,WAAA,CACU,WAAyB,EACzB,SAA2B,EAC3B,MAA8B,EAC9B,KAAmB,EACnB,SAA2B,EAC3B,WAAwB,EACxB,eAAgC,EAAA;QANhC,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,eAAe,GAAf,eAAe;AATR,QAAA,IAAA,CAAA,OAAO,GAAG,EAAE,cAAc,EAAE,eAAe,EAAE;IAU3D;AAEH;;;;AAIG;IACH,MAAM,OAAO,CAAC,gBAA+B,EAAA;QAC3C,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAChF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAwC,CAAC;AACrF,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CACjC,OAAO,CAAC,2DAA2D,CAAC,EACpE,EAAE,gBAAgB,EAAE,CACrB;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC;QAClC;AAEA,QAAA,OAAO,IAAI;IACb;AAEA;;;;AAIG;IACH,MAAM,UAAU,CAAC,IAAU,EAAA;AACzB,QAAA,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACnD,OAAO,EAAE,CAAC,EAAE;IACd;AAEA;;;;;;AAMG;IACH,MAAM,iBAAiB,CAAC,GAAW,EAAA;AACjC,QAAA,IAAI,GAAG,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE;AACvC,YAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC;QAC5C;AACA,QAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC;IAC5C;IAEQ,MAAM,yBAAyB,CAAC,GAAW,EAAA;AACjD,QAAA,IAAI;YACF,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW;AAC9D,YAAA,MAAM,OAAO,GAAkB;AAC7B,gBAAA,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI,CAAC;aACf;AACD,YAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA,MAAA,EAAS,WAAW,CAAA,EAAG,GAAG,EAAE,EAAE,OAAO,CAAC;AACpF,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;AAC3B,gBAAA,OAAO,QAAQ,CAAC,IAAI,EAAE;YACxB;QACF;AAAE,QAAA,MAAM;;QAER;AACA,QAAA,OAAO,EAAE;IACX;AAEQ,IAAA,yBAAyB,CAAC,GAAW,EAAA;AAC3C,QAAA,OAAO,IAAI,OAAO,CAAC,OAAO,IAAG;AAC3B,YAAA,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE;AAChC,YAAA,GAAG,CAAC,kBAAkB,GAAG,MAAK;AAC5B,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,EAAE;AACxB,oBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;AACtB,wBAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACvB;yBAAO;wBACL,OAAO,CAAC,EAAE,CAAC;oBACb;gBACF;AACF,YAAA,CAAC;YACD,GAAG,CAAC,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC;AAC/B,YAAA,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;AACpB,YAAA,GAAG,CAAC,YAAY,GAAG,MAAM;AACzB,YAAA,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC;YAC3C,GAAG,CAAC,IAAI,EAAE;AACZ,QAAA,CAAC,CAAC;IACJ;+GAjGW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA,CAAA;;4FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCyCrB,6BAA6B,CAAA;IAExC,IACI,uBAAuB,CAAC,QAA0B,EAAA;QACpD,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvD;AAaA,IAAA,WAAA,CACU,WAAwB,EACxB,IAAY,EACZ,KAAmB,EACnB,eAAsC,EAAA;QAHtC,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,eAAe,GAAf,eAAe;QAfhB,IAAA,CAAA,kBAAkB,GAAG,kBAAkB;AAIhD,QAAA,IAAA,CAAA,YAAY,GAAuB,kBAAkB,CAAC,GAAG;AACzD,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,eAAe,CAAS,EAAE,CAAC;QAClD,IAAA,CAAA,aAAa,GAAG,EAAE;AAEV,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;IAOnC;IAEH,MAAM,YAAY,CAAC,MAA6B,EAAA;QAC9C,IAAI,IAAI,CAAC,YAAY,KAAK,kBAAkB,CAAC,KAAK,EAAE;AAClD,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;gBACpB,eAAe,EAAE,IAAI,CAAC,aAAa;AACnC,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,gBAAgB,EAAE;AACnB,aAAA,CAAC;AACF,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AAC1B,YAAA,OAAO,KAAK;QACd;QAEA,IAAI,IAAI,CAAC,YAAY,KAAK,kBAAkB,CAAC,GAAG,EAAE;AAChD,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;AACpB,gBAAA,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU;AAC3C,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,eAAe,EAAE;AAClB,aAAA,CAAC;AACF,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACpE,IAAI,YAAY,IAAI,YAAY,KAAK,IAAI,CAAC,cAAc,EAAE;AACxD,YAAA,IAAI;gBACF,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC;AAC5E,gBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;AACpF,gBAAA,OAAO,IAAI;YACb;YAAE,OAAO,CAAC,EAAE;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;AACtE,gBAAA,OAAO,KAAK;YACd;QACF;QACA,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;AACpB,gBAAA,UAAU,EAAE,YAAY;AACxB,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,eAAe,EAAE;AAClB,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,QAAQ,GAAA;;AAEZ,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;AAC/B,YAAA,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC,KAAK;QAC9C;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;AACvC,YAAA,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC,MAAM;QAC/C;QAEA,IAAI,CAAC,QAAQ,EAAE;;AAGf,QAAA,QAAQ,IAAI,CAAC,YAAY;YACvB,KAAK,kBAAkB,CAAC,KAAK;gBAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;gBAChD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;gBACvD;YACF,KAAK,kBAAkB,CAAC,MAAM;AAC5B,gBAAA,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;AACtF,gBAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AACxB,oBAAA,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AAC5E,iBAAA,CAAC;gBACF,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC;gBACrD;YACF,KAAK,kBAAkB,CAAC,GAAG;AACzB,gBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAC1B,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACxB,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CACrE;gBACH;gBACA;;QAGJ,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,OAAM,KAAK,KAAG;AACjF,YAAA,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACjC,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;AAEA,IAAA,QAAQ,CAAC,KAAyB,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;;QAGzB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW;AACpD,QAAA,IAAI,KAAK,KAAK,kBAAkB,CAAC,MAAM,IAAI,WAAW,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;YACjE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,KAAK;AAC9C,gBAAA,GAAG,IAAI;gBACP,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;AAC/B,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjE;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE;IACzC;AAEA,IAAA,cAAc,CAAC,OAAe,EAAA;AAC5B,QAAA,IAAI,CAAC,aAAa,GAAG,OAAO;AAC5B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;IACrC;IAEQ,MAAM,aAAa,CAAC,SAAoD,EAAA;QAC9E,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY;QAC1D,QAAQ,MAAM;YACZ,KAAK,kBAAkB,CAAC,KAAK;AAC3B,gBAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;oBACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE;gBACvD;gBACA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;gBAC9C;YACF,KAAK,kBAAkB,CAAC,MAAM;gBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;gBACjD,IAAI,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9E;YACF,KAAK,kBAAkB,CAAC,GAAG;AACzB,gBAAA,IAAI,SAAS,CAAC,UAAU,EAAE;AACxB,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACxB,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC,CACnE;gBACH;qBAAO;AACL,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC;gBACA;;IAEN;IAEQ,MAAM,qBAAqB,CAAC,IAAU,EAAA;AAC5C,QAAA,IAAI;YACF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC;IACF;AAEQ,IAAA,oBAAoB,CAAC,SAAoD,EAAA;AAC/E,QAAA,MAAM,MAAM,GAAG,SAAS,EAAE,WAAW,IAAI,EAAE;QAC3C,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI;IAChC;IAEQ,QAAQ,GAAA;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CACrC;AACE,YAAA,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAClF,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAA2B,IAAI,EAAE;AACpE,gBAAA,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AACvB,gBAAA,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;gBACvB,aAAa,CAAC,cAAc,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE;aAC3D,CAAC;AACF,YAAA,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAqB,IAAI,CAAC,YAAY;SACzF,EACD,EAAE,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,CACf;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;IACxC;IAEQ,kBAAkB,GAAA;QACxB,OAAO,CAAC,OAAwB,KAA6B;YAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YACrC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;;YAG9C,IAAI,IAAI,CAAC,YAAY,KAAK,kBAAkB,CAAC,KAAK,EAAE;AAClD,gBAAA,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AACnB,gBAAA,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC;AAC3B,gBAAA,OAAO,IAAI;YACb;;YAGA,IAAI,IAAI,CAAC,YAAY,KAAK,kBAAkB,CAAC,GAAG,EAAE;AAChD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;AACpC,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AACd,oBAAA,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChD,oBAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC3B;AACA,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;YAC9B;YAEA,IAAI,IAAI,CAAC,YAAY,KAAK,kBAAkB,CAAC,MAAM,EAAE;AACnD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;AAC5B,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACtB,oBAAA,WAAW,CAAC,SAAS,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChE,oBAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC3B;AACA,gBAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;YACtC;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;IACH;AAEQ,IAAA,kBAAkB,CAAC,OAAwB,EAAA;AACjD,QAAA,IAAI,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;AAC7B,YAAA,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM;YAC/C,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;QAC3D;IACF;+GAnOW,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrD1C,2mHAiHA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxEI,mBAAmB,6qCACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAIX,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,iBAAiB,4RACjB,mBAAmB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,eAAe,+GAPf,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAChB,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAQT,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAjBzC,SAAS;+BACE,4BAA4B,EAAA,UAAA,EAE1B,IAAI,EAAA,OAAA,EACP;wBACP,mBAAmB;wBACnB,WAAW;wBACX,SAAS;wBACT,gBAAgB;wBAChB,kBAAkB;wBAClB,kBAAkB;wBAClB,iBAAiB;wBACjB,mBAAmB;wBACnB,aAAa;wBACb;AACD,qBAAA,EAAA,QAAA,EAAA,2mHAAA,EAAA;;sBAGA;;sBACA,SAAS;uBAAC,iBAAiB;;;ME3CjB,2BAA2B,CAAA;AAItC,IAAA,WAAA,CAAoB,qBAA4C,EAAA;QAA5C,IAAA,CAAA,qBAAqB,GAArB,qBAAqB;IAA0B;AAEnE,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;QAC7C;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;AACvC,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;YACnF,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,EAAE,IAAI,EAAE;QACpC;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AACjC,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAC5F;IACF;+GAfW,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZxC,0HACA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EDSY,kBAAkB,kDAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE5B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBANvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,cAExB,IAAI,EAAA,OAAA,EACP,CAAC,kBAAkB,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,0HAAA,EAAA;;sBAGvC;;;AEbH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-markdown.mjs","sources":["../../widgets/implementations/markdown/markdown-widget.model.ts","../../widgets/implementations/markdown/markdown-widget.service.ts","../../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-view/markdown-widget-view.component.ts","../../widgets/implementations/markdown/markdown-widget-view/markdown-widget-view.component.html","../../widgets/implementations/markdown/c8y-ngx-components-widgets-implementations-markdown.ts"],"sourcesContent":["import { FormControl, FormGroup } from '@angular/forms';\n\nexport interface MarkdownWidgetConfig {\n markdownBinaryId: string | null;\n contentUrl: string | null;\n markdownContent: string | null;\n}\n\nexport const MarkdownSourceType = {\n WRITE: 'writeMarkdown',\n UPLOAD: 'uploadBinary',\n URL: 'uploadUrl'\n} as const;\n\nexport type MarkdownSourceType = (typeof MarkdownSourceType)[keyof typeof MarkdownSourceType];\n\nexport interface DroppedFileItem {\n file: File;\n name: string;\n}\n\nexport type MarkdownWidgetFormGroup = FormGroup<{\n contentUrl: FormControl<string>;\n droppedFile: FormControl<DroppedFileItem[] | null>;\n uploadChoice: FormControl<MarkdownSourceType>;\n}>;\n","import { Injectable } from '@angular/core';\nimport {\n FetchClient,\n IFetchOptions,\n IManagedObjectBinary,\n InventoryBinaryService,\n InventoryService\n} from '@c8y/client';\nimport { AlertService, AppStateService, FilesService } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable({ providedIn: 'root' })\nexport class MarkdownWidgetService {\n private readonly headers = { 'Content-Type': 'text/markdown' };\n\n constructor(\n private fileService: FilesService,\n private inventory: InventoryService,\n private binary: InventoryBinaryService,\n private alert: AlertService,\n private translate: TranslateService,\n private fetchClient: FetchClient,\n private appStateService: AppStateService\n ) {}\n\n /**\n * Retrieves a markdown file from the inventory by its binary ID.\n * @param markdownBinaryId - The ID of the binary managed object.\n * @returns The file if found, otherwise null.\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 /**\n * Uploads a markdown file to the inventory as a binary.\n * @param file - The file to upload.\n * @returns The ID of the created binary managed object.\n */\n async uploadFile(file: File): Promise<string> {\n const { data: mo } = await this.binary.create(file);\n return mo.id;\n }\n\n /**\n * Fetches markdown content from a URL.\n * For internal URLs (e.g., `/readme.md`), uses FetchClient with the app's context path.\n * For external URLs, uses XMLHttpRequest to avoid CORS issues with auth headers.\n * @param url - The URL to fetch content from.\n * @returns The markdown content as a string, or empty string on error.\n */\n async getContentFromUrl(url: string): Promise<string> {\n if (url?.toLowerCase() === '/readme.md') {\n return this.getContentFromInternalUrl(url);\n }\n return this.getContentFromExternalUrl(url);\n }\n\n private async getContentFromInternalUrl(url: string): Promise<string> {\n try {\n const contextPath = this.appStateService.state.app.contextPath;\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers\n };\n const response = await this.fetchClient.fetch(`/apps/${contextPath}${url}`, options);\n if (response.status === 200) {\n return response.text();\n }\n } catch {\n // ignore error, return empty string\n }\n return '';\n }\n\n private getContentFromExternalUrl(url: string): Promise<string> {\n return new Promise(resolve => {\n const req = new XMLHttpRequest();\n req.onreadystatechange = () => {\n if (req.readyState === 4) {\n if (req.status === 200) {\n resolve(req.response);\n } else {\n resolve('');\n }\n }\n };\n req.onerror = () => resolve('');\n req.open('GET', url);\n req.responseType = 'text';\n req.setRequestHeader('Accept', 'text/html');\n req.send();\n });\n }\n}\n","import { Component, inject, Input, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n C8yTranslatePipe,\n C8yValidators,\n DropAreaComponent,\n EmptyStateComponent,\n FormGroupComponent,\n IconDirective,\n MarkdownToHtmlPipe,\n OnBeforeSave\n} from '@c8y/ngx-components';\nimport {\n AbstractControl,\n FormBuilder,\n FormsModule,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport {\n DroppedFileItem,\n MarkdownSourceType,\n MarkdownWidgetConfig,\n MarkdownWidgetFormGroup\n} from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { AsyncPipe } from '@angular/common';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\n\n@Component({\n selector: 'c8y-markdown-widget-config',\n templateUrl: './markdown-widget-config.component.html',\n standalone: true,\n imports: [\n ReactiveFormsModule,\n FormsModule,\n AsyncPipe,\n C8yTranslatePipe,\n MarkdownToHtmlPipe,\n FormGroupComponent,\n DropAreaComponent,\n EmptyStateComponent,\n IconDirective,\n EditorComponent\n ]\n})\nexport class MarkdownWidgetConfigComponent implements OnInit, OnDestroy, OnBeforeSave {\n @Input() config: MarkdownWidgetConfig;\n @ViewChild('markdownPreview')\n set markdownPreviewTemplate(template: TemplateRef<any>) {\n this.widgetConfigService.setPreview(template || null);\n }\n\n readonly MarkdownSourceType = MarkdownSourceType;\n\n formGroup: MarkdownWidgetFormGroup;\n fileFromConfig: File;\n uploadChoice: MarkdownSourceType = MarkdownSourceType.URL;\n previewMarkdown$ = new BehaviorSubject<string>('');\n editorContent = '';\n\n private widgetConfigService = inject(WidgetConfigService);\n private destroy$ = new Subject<void>();\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.uploadChoice === MarkdownSourceType.WRITE) {\n Object.assign(config, {\n markdownContent: this.editorContent,\n contentUrl: null,\n markdownBinaryId: null\n });\n return true;\n }\n\n if (this.formGroup.invalid) {\n return false;\n }\n\n if (this.uploadChoice === MarkdownSourceType.URL) {\n Object.assign(config, {\n contentUrl: this.formGroup.value.contentUrl,\n markdownBinaryId: null,\n markdownContent: null\n });\n return true;\n }\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, markdownContent: 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, {\n contentUrl: '/readme.md',\n markdownBinaryId: null,\n markdownContent: null\n });\n }\n return true;\n }\n\n async ngOnInit() {\n // Determine initial mode from config\n if (this.config.markdownContent) {\n this.uploadChoice = MarkdownSourceType.WRITE;\n } else if (this.config.markdownBinaryId) {\n this.uploadChoice = MarkdownSourceType.UPLOAD;\n }\n\n this.initForm();\n\n // Load initial content based on mode\n switch (this.uploadChoice) {\n case MarkdownSourceType.WRITE:\n this.editorContent = this.config.markdownContent;\n this.previewMarkdown$.next(this.config.markdownContent);\n break;\n case MarkdownSourceType.UPLOAD:\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 await this.updatePreviewFromFile(this.fileFromConfig);\n break;\n case MarkdownSourceType.URL:\n if (this.config.contentUrl) {\n this.previewMarkdown$.next(\n await this.markdownService.getContentFromUrl(this.config.contentUrl)\n );\n }\n break;\n }\n\n this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(async value => {\n await this.updatePreview(value);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onChange(value: MarkdownSourceType) {\n this.uploadChoice = value;\n\n // Ensure dropped file has 'name' property for drop area to display filename\n const droppedFile = this.formGroup.value.droppedFile;\n if (value === MarkdownSourceType.UPLOAD && droppedFile?.[0]?.file) {\n const normalizedFile = droppedFile.map(item => ({\n ...item,\n name: item.name || item.file?.name\n }));\n this.formGroup.controls['droppedFile'].setValue(normalizedFile);\n }\n\n this.formGroup.updateValueAndValidity();\n }\n\n onEditorChange(content: string) {\n this.editorContent = content;\n this.previewMarkdown$.next(content);\n }\n\n private async updatePreview(formValue: Partial<MarkdownWidgetFormGroup['value']>): Promise<void> {\n const choice = formValue.uploadChoice || this.uploadChoice;\n switch (choice) {\n case MarkdownSourceType.WRITE:\n if (!this.editorContent) {\n this.editorContent = this.previewMarkdown$.getValue();\n }\n this.previewMarkdown$.next(this.editorContent);\n break;\n case MarkdownSourceType.UPLOAD:\n const file = this.getFileFromFormValue(formValue);\n file ? await this.updatePreviewFromFile(file) : this.previewMarkdown$.next('');\n break;\n case MarkdownSourceType.URL:\n if (formValue.contentUrl) {\n this.previewMarkdown$.next(\n await this.markdownService.getContentFromUrl(formValue.contentUrl)\n );\n } else {\n this.previewMarkdown$.next('');\n }\n break;\n }\n }\n\n private async updatePreviewFromFile(file: File): Promise<void> {\n try {\n this.previewMarkdown$.next(await file.text());\n } catch {\n this.previewMarkdown$.next('');\n }\n }\n\n private getFileFromFormValue(formValue: Partial<MarkdownWidgetFormGroup['value']>): File | null {\n const binary = formValue?.droppedFile || [];\n return binary[0]?.file || null;\n }\n\n private initForm(): void {\n this.formGroup = this.formBuilder.group(\n {\n contentUrl: this.formBuilder.nonNullable.control('', [Validators.maxLength(2000)]),\n droppedFile: this.formBuilder.control<DroppedFileItem[] | null>(null, [\n Validators.minLength(1),\n Validators.maxLength(1),\n C8yValidators.filesValidator({ maximumFileSizeInKb: 1000 })\n ]),\n uploadChoice: this.formBuilder.nonNullable.control<MarkdownSourceType>(this.uploadChoice)\n },\n { validators: this.requireValidSource() }\n ) as MarkdownWidgetFormGroup;\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n }\n\n private requireValidSource(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const url = control.get('contentUrl');\n const droppedFile = control.get('droppedFile');\n\n // Write mode - always valid, editor content handled separately\n if (this.uploadChoice === MarkdownSourceType.WRITE) {\n url.setErrors(null);\n droppedFile.setErrors(null);\n return null;\n }\n\n // Clear required errors on inactive controls, set on active if empty\n if (this.uploadChoice === MarkdownSourceType.URL) {\n this.clearRequiredError(droppedFile);\n if (!url.value) {\n url.setErrors({ ...url.errors, required: true });\n return { required: true };\n }\n this.clearRequiredError(url);\n }\n\n if (this.uploadChoice === MarkdownSourceType.UPLOAD) {\n this.clearRequiredError(url);\n if (!droppedFile.value) {\n droppedFile.setErrors({ ...droppedFile.errors, required: true });\n return { required: true };\n }\n this.clearRequiredError(droppedFile);\n }\n\n return null;\n };\n }\n\n private clearRequiredError(control: AbstractControl): void {\n if (control?.errors?.required) {\n const { required: _, ...rest } = control.errors;\n control.setErrors(Object.keys(rest).length ? rest : null);\n }\n }\n}\n","<div [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Source' | translate }}</legend>\n <div class=\"form-group\">\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Write Markdown' | translate }}\"\n >\n <input\n name=\"uploadChoice\"\n type=\"radio\"\n [value]=\"MarkdownSourceType.WRITE\"\n formControlName=\"uploadChoice\"\n (change)=\"onChange(MarkdownSourceType.WRITE)\"\n />\n <span></span>\n <span>{{ 'Write Markdown' | translate }}</span>\n </label>\n <label\n class=\"c8y-radio radio-inline m-l-8\"\n title=\"{{ 'Upload a binary' | translate }}\"\n >\n <input\n name=\"uploadChoice\"\n type=\"radio\"\n [value]=\"MarkdownSourceType.UPLOAD\"\n formControlName=\"uploadChoice\"\n (change)=\"onChange(MarkdownSourceType.UPLOAD)\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label\n class=\"c8y-radio radio-inline m-l-8\"\n title=\"{{ 'Provide a file path' | translate }}\"\n >\n <input\n name=\"uploadChoice\"\n type=\"radio\"\n [value]=\"MarkdownSourceType.URL\"\n formControlName=\"uploadChoice\"\n (change)=\"onChange(MarkdownSourceType.URL)\"\n />\n <span></span>\n <span>{{ 'Provide a file path' | translate }}</span>\n </label>\n </div>\n @switch (uploadChoice) {\n @case (MarkdownSourceType.WRITE) {\n <c8y-editor\n class=\"d-block\"\n style=\"height: 300px\"\n [ngModel]=\"editorContent\"\n (ngModelChange)=\"onEditorChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [editorOptions]=\"{\n language: 'markdown',\n tabSize: 2,\n insertSpaces: true,\n minimap: { enabled: false },\n wordWrap: 'on'\n }\"\n ></c8y-editor>\n }\n @case (MarkdownSourceType.UPLOAD) {\n <c8y-form-group class=\"m-b-24\">\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n formControlName=\"droppedFile\"\n [maxAllowedFiles]=\"1\"\n [accept]=\"'md'\"\n ></c8y-drop-area>\n </c8y-form-group>\n }\n @case (MarkdownSourceType.URL) {\n <c8y-form-group class=\"m-b-24\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/text.md\"\n type=\"text\"\n formControlName=\"contentUrl\"\n />\n </div>\n </c8y-form-group>\n }\n }\n </fieldset>\n</div>\n\n<ng-template #markdownPreview>\n @if (previewMarkdown$ | async; as previewMarkdown) {\n <div\n class=\"p-16 p-t-0 markdown-content fit-h overflow-auto\"\n [innerHTML]=\"previewMarkdown | markdownToHtml | async\"\n ></div>\n } @else {\n <div class=\"fit-h d-flex d-col j-c-center a-i-center\">\n <c8y-ui-empty-state\n [icon]=\"'file-text'\"\n [title]=\"'No content to preview' | translate\"\n [subtitle]=\"\n 'Write Markdown, upload a file, or provide a URL to see the preview' | translate\n \"\n [horizontal]=\"false\"\n ></c8y-ui-empty-state>\n </div>\n }\n</ng-template>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { MarkdownToHtmlPipe } from '@c8y/ngx-components';\nimport { MarkdownWidgetConfig } from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n selector: 'c8y-markdown-widget-view',\n templateUrl: './markdown-widget-view.component.html',\n standalone: true,\n imports: [MarkdownToHtmlPipe, AsyncPipe]\n})\nexport class MarkdownWidgetViewComponent implements OnInit {\n @Input() config: MarkdownWidgetConfig;\n markdown: string;\n\n constructor(private markdownWidgetService: MarkdownWidgetService) {}\n\n async ngOnInit() {\n if (this.config.markdownContent) {\n this.markdown = this.config.markdownContent;\n } else if (this.config.markdownBinaryId) {\n const file = await this.markdownWidgetService.getFile(this.config.markdownBinaryId);\n this.markdown = await file?.text();\n } else if (this.config.contentUrl) {\n this.markdown = await this.markdownWidgetService.getContentFromUrl(this.config.contentUrl);\n }\n }\n}\n","<div id=\"helpContent\" class=\"p-16 p-t-0 markdown-content\" [innerHTML]=\"markdown | markdownToHtml | async\"></div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3.MarkdownWidgetService","i1.MarkdownWidgetService"],"mappings":";;;;;;;;;;;;;;;AAQO,MAAM,kBAAkB,GAAG;AAChC,IAAA,KAAK,EAAE,eAAe;AACtB,IAAA,MAAM,EAAE,cAAc;AACtB,IAAA,GAAG,EAAE;;;MCEM,qBAAqB,CAAA;AAGhC,IAAA,WAAA,CACU,WAAyB,EACzB,SAA2B,EAC3B,MAA8B,EAC9B,KAAmB,EACnB,SAA2B,EAC3B,WAAwB,EACxB,eAAgC,EAAA;QANhC,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,eAAe,GAAf,eAAe;AATR,QAAA,IAAA,CAAA,OAAO,GAAG,EAAE,cAAc,EAAE,eAAe,EAAE;IAU3D;AAEH;;;;AAIG;IACH,MAAM,OAAO,CAAC,gBAA+B,EAAA;QAC3C,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAChF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAwC,CAAC;AACrF,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CACjC,OAAO,CAAC,2DAA2D,CAAC,EACpE,EAAE,gBAAgB,EAAE,CACrB;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC;QAClC;AAEA,QAAA,OAAO,IAAI;IACb;AAEA;;;;AAIG;IACH,MAAM,UAAU,CAAC,IAAU,EAAA;AACzB,QAAA,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACnD,OAAO,EAAE,CAAC,EAAE;IACd;AAEA;;;;;;AAMG;IACH,MAAM,iBAAiB,CAAC,GAAW,EAAA;AACjC,QAAA,IAAI,GAAG,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE;AACvC,YAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC;QAC5C;AACA,QAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC;IAC5C;IAEQ,MAAM,yBAAyB,CAAC,GAAW,EAAA;AACjD,QAAA,IAAI;YACF,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW;AAC9D,YAAA,MAAM,OAAO,GAAkB;AAC7B,gBAAA,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI,CAAC;aACf;AACD,YAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA,MAAA,EAAS,WAAW,CAAA,EAAG,GAAG,EAAE,EAAE,OAAO,CAAC;AACpF,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;AAC3B,gBAAA,OAAO,QAAQ,CAAC,IAAI,EAAE;YACxB;QACF;AAAE,QAAA,MAAM;;QAER;AACA,QAAA,OAAO,EAAE;IACX;AAEQ,IAAA,yBAAyB,CAAC,GAAW,EAAA;AAC3C,QAAA,OAAO,IAAI,OAAO,CAAC,OAAO,IAAG;AAC3B,YAAA,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE;AAChC,YAAA,GAAG,CAAC,kBAAkB,GAAG,MAAK;AAC5B,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,EAAE;AACxB,oBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;AACtB,wBAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACvB;yBAAO;wBACL,OAAO,CAAC,EAAE,CAAC;oBACb;gBACF;AACF,YAAA,CAAC;YACD,GAAG,CAAC,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC;AAC/B,YAAA,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;AACpB,YAAA,GAAG,CAAC,YAAY,GAAG,MAAM;AACzB,YAAA,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC;YAC3C,GAAG,CAAC,IAAI,EAAE;AACZ,QAAA,CAAC,CAAC;IACJ;+GAjGW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA,CAAA;;4FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCyCrB,6BAA6B,CAAA;IAExC,IACI,uBAAuB,CAAC,QAA0B,EAAA;QACpD,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvD;AAaA,IAAA,WAAA,CACU,WAAwB,EACxB,IAAY,EACZ,KAAmB,EACnB,eAAsC,EAAA;QAHtC,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,eAAe,GAAf,eAAe;QAfhB,IAAA,CAAA,kBAAkB,GAAG,kBAAkB;AAIhD,QAAA,IAAA,CAAA,YAAY,GAAuB,kBAAkB,CAAC,GAAG;AACzD,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,eAAe,CAAS,EAAE,CAAC;QAClD,IAAA,CAAA,aAAa,GAAG,EAAE;AAEV,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;IAOnC;IAEH,MAAM,YAAY,CAAC,MAA6B,EAAA;QAC9C,IAAI,IAAI,CAAC,YAAY,KAAK,kBAAkB,CAAC,KAAK,EAAE;AAClD,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;gBACpB,eAAe,EAAE,IAAI,CAAC,aAAa;AACnC,gBAAA,UAAU,EAAE,IAAI;AAChB,gBAAA,gBAAgB,EAAE;AACnB,aAAA,CAAC;AACF,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AAC1B,YAAA,OAAO,KAAK;QACd;QAEA,IAAI,IAAI,CAAC,YAAY,KAAK,kBAAkB,CAAC,GAAG,EAAE;AAChD,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;AACpB,gBAAA,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU;AAC3C,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,eAAe,EAAE;AAClB,aAAA,CAAC;AACF,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACpE,IAAI,YAAY,IAAI,YAAY,KAAK,IAAI,CAAC,cAAc,EAAE;AACxD,YAAA,IAAI;gBACF,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC;AAC5E,gBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;AACpF,gBAAA,OAAO,IAAI;YACb;YAAE,OAAO,CAAC,EAAE;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;AACtE,gBAAA,OAAO,KAAK;YACd;QACF;QACA,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;AACpB,gBAAA,UAAU,EAAE,YAAY;AACxB,gBAAA,gBAAgB,EAAE,IAAI;AACtB,gBAAA,eAAe,EAAE;AAClB,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,QAAQ,GAAA;;AAEZ,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;AAC/B,YAAA,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC,KAAK;QAC9C;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;AACvC,YAAA,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC,MAAM;QAC/C;QAEA,IAAI,CAAC,QAAQ,EAAE;;AAGf,QAAA,QAAQ,IAAI,CAAC,YAAY;YACvB,KAAK,kBAAkB,CAAC,KAAK;gBAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;gBAChD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;gBACvD;YACF,KAAK,kBAAkB,CAAC,MAAM;AAC5B,gBAAA,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;AACtF,gBAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AACxB,oBAAA,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AAC5E,iBAAA,CAAC;gBACF,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC;gBACrD;YACF,KAAK,kBAAkB,CAAC,GAAG;AACzB,gBAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAC1B,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACxB,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CACrE;gBACH;gBACA;;QAGJ,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,OAAM,KAAK,KAAG;AACjF,YAAA,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACjC,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;AAEA,IAAA,QAAQ,CAAC,KAAyB,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;;QAGzB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW;AACpD,QAAA,IAAI,KAAK,KAAK,kBAAkB,CAAC,MAAM,IAAI,WAAW,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE;YACjE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,KAAK;AAC9C,gBAAA,GAAG,IAAI;gBACP,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;AAC/B,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjE;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE;IACzC;AAEA,IAAA,cAAc,CAAC,OAAe,EAAA;AAC5B,QAAA,IAAI,CAAC,aAAa,GAAG,OAAO;AAC5B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;IACrC;IAEQ,MAAM,aAAa,CAAC,SAAoD,EAAA;QAC9E,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY;QAC1D,QAAQ,MAAM;YACZ,KAAK,kBAAkB,CAAC,KAAK;AAC3B,gBAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;oBACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE;gBACvD;gBACA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;gBAC9C;YACF,KAAK,kBAAkB,CAAC,MAAM;gBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;gBACjD,IAAI,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9E;YACF,KAAK,kBAAkB,CAAC,GAAG;AACzB,gBAAA,IAAI,SAAS,CAAC,UAAU,EAAE;AACxB,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACxB,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC,CACnE;gBACH;qBAAO;AACL,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC;gBACA;;IAEN;IAEQ,MAAM,qBAAqB,CAAC,IAAU,EAAA;AAC5C,QAAA,IAAI;YACF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC;IACF;AAEQ,IAAA,oBAAoB,CAAC,SAAoD,EAAA;AAC/E,QAAA,MAAM,MAAM,GAAG,SAAS,EAAE,WAAW,IAAI,EAAE;QAC3C,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI;IAChC;IAEQ,QAAQ,GAAA;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CACrC;AACE,YAAA,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAClF,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAA2B,IAAI,EAAE;AACpE,gBAAA,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AACvB,gBAAA,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;gBACvB,aAAa,CAAC,cAAc,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE;aAC3D,CAAC;AACF,YAAA,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAqB,IAAI,CAAC,YAAY;SACzF,EACD,EAAE,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,CACf;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;IACxC;IAEQ,kBAAkB,GAAA;QACxB,OAAO,CAAC,OAAwB,KAA6B;YAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YACrC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;;YAG9C,IAAI,IAAI,CAAC,YAAY,KAAK,kBAAkB,CAAC,KAAK,EAAE;AAClD,gBAAA,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;AACnB,gBAAA,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC;AAC3B,gBAAA,OAAO,IAAI;YACb;;YAGA,IAAI,IAAI,CAAC,YAAY,KAAK,kBAAkB,CAAC,GAAG,EAAE;AAChD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;AACpC,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AACd,oBAAA,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChD,oBAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC3B;AACA,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;YAC9B;YAEA,IAAI,IAAI,CAAC,YAAY,KAAK,kBAAkB,CAAC,MAAM,EAAE;AACnD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;AAC5B,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACtB,oBAAA,WAAW,CAAC,SAAS,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChE,oBAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC3B;AACA,gBAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;YACtC;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;IACH;AAEQ,IAAA,kBAAkB,CAAC,OAAwB,EAAA;AACjD,QAAA,IAAI,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;AAC7B,YAAA,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM;YAC/C,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;QAC3D;IACF;+GAnOW,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrD1C,wmHAiHA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxEI,mBAAmB,kkCACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAIX,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,iBAAiB,4RACjB,mBAAmB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,eAAe,+GAPf,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAChB,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAQT,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAjBzC,SAAS;+BACE,4BAA4B,EAAA,UAAA,EAE1B,IAAI,EAAA,OAAA,EACP;wBACP,mBAAmB;wBACnB,WAAW;wBACX,SAAS;wBACT,gBAAgB;wBAChB,kBAAkB;wBAClB,kBAAkB;wBAClB,iBAAiB;wBACjB,mBAAmB;wBACnB,aAAa;wBACb;AACD,qBAAA,EAAA,QAAA,EAAA,wmHAAA,EAAA;;sBAGA;;sBACA,SAAS;uBAAC,iBAAiB;;;ME3CjB,2BAA2B,CAAA;AAItC,IAAA,WAAA,CAAoB,qBAA4C,EAAA;QAA5C,IAAA,CAAA,qBAAqB,GAArB,qBAAqB;IAA0B;AAEnE,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;QAC7C;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;AACvC,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;YACnF,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,EAAE,IAAI,EAAE;QACpC;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AACjC,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAC5F;IACF;+GAfW,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZxC,0HACA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EDSY,kBAAkB,kDAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE5B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBANvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,cAExB,IAAI,EAAA,OAAA,EACP,CAAC,kBAAkB,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,0HAAA,EAAA;;sBAGvC;;;AEbH;;AAEG;;;;"}
|
|
@@ -62,9 +62,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
62
62
|
|
|
63
63
|
/** Chart layout constants */
|
|
64
64
|
const CHART_LAYOUT = {
|
|
65
|
-
|
|
66
|
-
SERIES_TOP: '5%',
|
|
65
|
+
PIE_CENTER: ['50%', '45%'],
|
|
67
66
|
PIE_RADIUS: '80%',
|
|
67
|
+
LEGEND_BOTTOM: '2%',
|
|
68
68
|
EMPTY_STATE_FONT_SIZE: 30
|
|
69
69
|
};
|
|
70
70
|
class PieChartWidgetViewComponent {
|
|
@@ -188,8 +188,8 @@ class PieChartWidgetViewComponent {
|
|
|
188
188
|
*/
|
|
189
189
|
buildLegendConfig(options) {
|
|
190
190
|
return {
|
|
191
|
-
|
|
192
|
-
left: '
|
|
191
|
+
bottom: CHART_LAYOUT.LEGEND_BOTTOM,
|
|
192
|
+
left: 'center',
|
|
193
193
|
show: options?.showLegend ?? false,
|
|
194
194
|
formatter: (name) => {
|
|
195
195
|
const match = name.match(/^(.+)_\d+$/);
|
|
@@ -201,8 +201,9 @@ class PieChartWidgetViewComponent {
|
|
|
201
201
|
* Builds pie series configuration.
|
|
202
202
|
*/
|
|
203
203
|
buildPieSeriesConfig(entries, total, options) {
|
|
204
|
+
const showLegend = options?.showLegend ?? false;
|
|
204
205
|
return {
|
|
205
|
-
|
|
206
|
+
center: showLegend ? CHART_LAYOUT.PIE_CENTER : ['50%', '50%'],
|
|
206
207
|
type: 'pie',
|
|
207
208
|
radius: CHART_LAYOUT.PIE_RADIUS,
|
|
208
209
|
label: {
|
|
@@ -243,7 +244,7 @@ class PieChartWidgetViewComponent {
|
|
|
243
244
|
MeasurementRealtimeService,
|
|
244
245
|
CurrentMeasurementService,
|
|
245
246
|
{ provide: NGX_ECHARTS_CONFIG, useFactory: () => ({ echarts: () => import('echarts') }) }
|
|
246
|
-
], viewQueries: [{ propertyName: "chart", first: true, predicate: ["chart"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"p-relative fit-h\">\n <div\n class=\"p-absolute fit-w fit-h\"\n #chart\n echarts\n [options]=\"chartOptions$ | async\"\n (chartInit)=\"onChartInit($event)\"\n ></div>\n\n <c8y-chart-alerts [alerts]=\"alerts\"></c8y-chart-alerts>\n</div>\n", dependencies: [{ kind: "ngmodule", type: NgxEchartsModule }, { kind: "directive", type: i1$1.NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }, { kind: "component", type: ChartAlertsComponent, selector: "c8y-chart-alerts", inputs: ["alerts"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
247
|
+
], viewQueries: [{ propertyName: "chart", first: true, predicate: ["chart"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"p-relative fit-h overflow-hidden\">\n <div\n class=\"p-absolute fit-w fit-h\"\n #chart\n echarts\n [options]=\"chartOptions$ | async\"\n (chartInit)=\"onChartInit($event)\"\n ></div>\n\n <c8y-chart-alerts [alerts]=\"alerts\"></c8y-chart-alerts>\n</div>\n", dependencies: [{ kind: "ngmodule", type: NgxEchartsModule }, { kind: "directive", type: i1$1.NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }, { kind: "component", type: ChartAlertsComponent, selector: "c8y-chart-alerts", inputs: ["alerts"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
247
248
|
}
|
|
248
249
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PieChartWidgetViewComponent, decorators: [{
|
|
249
250
|
type: Component,
|
|
@@ -251,7 +252,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
251
252
|
MeasurementRealtimeService,
|
|
252
253
|
CurrentMeasurementService,
|
|
253
254
|
{ provide: NGX_ECHARTS_CONFIG, useFactory: () => ({ echarts: () => import('echarts') }) }
|
|
254
|
-
], imports: [NgxEchartsModule, AsyncPipe, ChartAlertsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"p-relative fit-h\">\n <div\n class=\"p-absolute fit-w fit-h\"\n #chart\n echarts\n [options]=\"chartOptions$ | async\"\n (chartInit)=\"onChartInit($event)\"\n ></div>\n\n <c8y-chart-alerts [alerts]=\"alerts\"></c8y-chart-alerts>\n</div>\n" }]
|
|
255
|
+
], imports: [NgxEchartsModule, AsyncPipe, ChartAlertsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"p-relative fit-h overflow-hidden\">\n <div\n class=\"p-absolute fit-w fit-h\"\n #chart\n echarts\n [options]=\"chartOptions$ | async\"\n (chartInit)=\"onChartInit($event)\"\n ></div>\n\n <c8y-chart-alerts [alerts]=\"alerts\"></c8y-chart-alerts>\n</div>\n" }]
|
|
255
256
|
}], ctorParameters: () => [], propDecorators: { config: [{
|
|
256
257
|
type: Input
|
|
257
258
|
}], chart: [{
|
|
@@ -305,7 +306,7 @@ class PieChartWidgetConfigComponent {
|
|
|
305
306
|
return form;
|
|
306
307
|
}
|
|
307
308
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PieChartWidgetConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
308
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: PieChartWidgetConfigComponent, isStandalone: true, selector: "app-pie-chart-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMapSet", first: true, predicate: ["pieChartPreview"], descendants: true }], ngImport: i0, template: "@if (formGroup) {\n <
|
|
309
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: PieChartWidgetConfigComponent, isStandalone: true, selector: "app-pie-chart-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMapSet", first: true, predicate: ["pieChartPreview"], descendants: true }], ngImport: i0, template: "@if (formGroup) {\n <div [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Pie chart options' | translate }}</legend>\n <div\n class=\"d-flex flex-column gap-8 form-group-sm p-b-8\"\n formGroupName=\"pieChartOptions\"\n >\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLabels\"\n />\n <span></span>\n <span>\n {{ 'Show labels' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLegend\"\n />\n <span></span>\n <span>\n {{ 'Show legend' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showTooltips\"\n />\n <span></span>\n <span>\n {{ 'Show tooltips' | translate }}\n </span>\n </label>\n </div>\n </fieldset>\n </div>\n\n <ng-template #pieChartPreview>\n @if (config.datapoints?.length > 0) {\n <c8y-pie-chart\n class=\"w-100 h-100\"\n [config]=\"{\n datapoints: config.datapoints,\n pieChartOptions: {\n showLabels: formGroup.value.pieChartOptions.showLabels,\n showLegend: formGroup.value.pieChartOptions.showLegend,\n showTooltips: formGroup.value.pieChartOptions.showTooltips\n }\n }\"\n ></c8y-pie-chart>\n } @else {\n <div class=\"col-md-6 d-col a-i-start j-c-center\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render content' | translate\"\n [horizontal]=\"false\"\n data-cy=\"kpi-widget--empty-state-no-data-point-selected\"\n >\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#kpi\">user documentation</a>.\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n }\n </ng-template>\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: i1.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i1.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i1.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: PieChartWidgetViewComponent, selector: "c8y-pie-chart", inputs: ["config"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); }
|
|
309
310
|
}
|
|
310
311
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PieChartWidgetConfigComponent, decorators: [{
|
|
311
312
|
type: Component,
|
|
@@ -316,7 +317,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
316
317
|
FormsModule,
|
|
317
318
|
ReactiveFormsModule,
|
|
318
319
|
PieChartWidgetViewComponent
|
|
319
|
-
], template: "@if (formGroup) {\n <
|
|
320
|
+
], template: "@if (formGroup) {\n <div [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Pie chart options' | translate }}</legend>\n <div\n class=\"d-flex flex-column gap-8 form-group-sm p-b-8\"\n formGroupName=\"pieChartOptions\"\n >\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLabels\"\n />\n <span></span>\n <span>\n {{ 'Show labels' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLegend\"\n />\n <span></span>\n <span>\n {{ 'Show legend' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showTooltips\"\n />\n <span></span>\n <span>\n {{ 'Show tooltips' | translate }}\n </span>\n </label>\n </div>\n </fieldset>\n </div>\n\n <ng-template #pieChartPreview>\n @if (config.datapoints?.length > 0) {\n <c8y-pie-chart\n class=\"w-100 h-100\"\n [config]=\"{\n datapoints: config.datapoints,\n pieChartOptions: {\n showLabels: formGroup.value.pieChartOptions.showLabels,\n showLegend: formGroup.value.pieChartOptions.showLegend,\n showTooltips: formGroup.value.pieChartOptions.showTooltips\n }\n }\"\n ></c8y-pie-chart>\n } @else {\n <div class=\"col-md-6 d-col a-i-start j-c-center\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render content' | translate\"\n [horizontal]=\"false\"\n data-cy=\"kpi-widget--empty-state-no-data-point-selected\"\n >\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#kpi\">user documentation</a>.\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n }\n </ng-template>\n}\n" }]
|
|
320
321
|
}], propDecorators: { config: [{
|
|
321
322
|
type: Input
|
|
322
323
|
}], previewMapSet: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-implementations-pie-chart.mjs","sources":["../../widgets/implementations/pie-chart/current-measurement.service.ts","../../widgets/implementations/pie-chart/pie-chart-widget-view/pie-chart-widget-view.component.ts","../../widgets/implementations/pie-chart/pie-chart-widget-view/pie-chart-widget-view.component.html","../../widgets/implementations/pie-chart/pie-chart-widget-config/pie-chart-widget-config.component.ts","../../widgets/implementations/pie-chart/pie-chart-widget-config/pie-chart-widget-config.component.html","../../widgets/implementations/pie-chart/c8y-ngx-components-widgets-implementations-pie-chart.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { MeasurementRealtimeService } from '@c8y/ngx-components';\nimport { IMeasurementValue } from '@c8y/client';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { Observable, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class CurrentMeasurementService {\n constructor(private realtime: MeasurementRealtimeService) {}\n\n /**\n * Fetches the latest measurement value for a given datapoint.\n * Combines initial historical value with realtime updates.\n *\n * @param datapoint - The KPI datapoint configuration\n * @returns Observable emitting measurement value, unit, date, and notFound flag\n */\n getLatest(datapoint: KPIDetails): Observable<{\n value: number;\n unit: string;\n date: string;\n notFound?: boolean;\n }> {\n return this.realtime\n .latestValueOfSpecificMeasurement$(\n datapoint.fragment,\n datapoint.series,\n datapoint.__target,\n 1,\n true\n )\n .pipe(\n map(m => {\n if (!m) {\n return {\n value: Number.NaN,\n unit: datapoint.unit || '',\n date: '',\n notFound: true\n };\n }\n\n const v: IMeasurementValue = m[datapoint.fragment][datapoint.series];\n return {\n value: v.value,\n unit: v.unit || datapoint.unit,\n date: m.time\n };\n }),\n catchError(() =>\n of({\n value: Number.NaN,\n unit: datapoint.unit || '',\n date: '',\n notFound: true\n })\n )\n );\n }\n}\n","import {\n Component,\n ElementRef,\n inject,\n Input,\n OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n ViewChild\n} from '@angular/core';\nimport {\n DatapointValue,\n MeasurementValue,\n PieChartConfig,\n PieChartOptions\n} from '../pie-chart.model';\nimport { ECharts } from 'echarts/core';\nimport { BehaviorSubject, combineLatest, map, Observable, switchMap, tap } from 'rxjs';\nimport { NGX_ECHARTS_CONFIG, NgxEchartsModule } from 'ngx-echarts';\nimport { AsyncPipe } from '@angular/common';\nimport { CurrentMeasurementService } from '../current-measurement.service';\nimport {\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n MeasurementRealtimeService\n} from '@c8y/ngx-components';\nimport { ChartAlertsComponent } from '@c8y/ngx-components/echart';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport * as echarts from 'echarts';\nimport type { EChartsOption, PieSeriesOption } from 'echarts';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { CallbackDataParams } from 'echarts/types/dist/shared';\n\n/** Chart layout constants */\nconst CHART_LAYOUT = {\n LEGEND_TOP: '5%',\n SERIES_TOP: '5%',\n PIE_RADIUS: '80%',\n EMPTY_STATE_FONT_SIZE: 30\n} as const;\n\n@Component({\n selector: 'c8y-pie-chart',\n templateUrl: './pie-chart-widget-view.component.html',\n providers: [\n MeasurementRealtimeService,\n CurrentMeasurementService,\n { provide: NGX_ECHARTS_CONFIG, useFactory: () => ({ echarts: () => import('echarts') }) }\n ],\n imports: [NgxEchartsModule, AsyncPipe, ChartAlertsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PieChartWidgetViewComponent implements OnChanges, DynamicComponent {\n @Input() config!: PieChartConfig;\n @ViewChild('chart', { static: false }) chart!: ElementRef;\n activeDatapoints: KPIDetails[] = [];\n\n chartOptions$!: Observable<EChartsOption>;\n alerts = new DynamicComponentAlertAggregator();\n echartsInstance!: ECharts;\n\n private readonly configChanged$ = new BehaviorSubject<void>(undefined);\n private readonly measurements = inject(CurrentMeasurementService);\n private readonly translateService = inject(TranslateService);\n\n constructor() {\n this.chartOptions$ = this.configChanged$.pipe(\n switchMap(() => this.fetchMeasurements()),\n tap(entries => this.handleNegativeValues(entries)),\n map(entries => this.buildChartOptions(entries)),\n tap(options => this.updateChartInstance(options))\n );\n }\n\n ngOnChanges(_: SimpleChanges) {\n if (this.config?.datapoints?.length) {\n this.configChanged$.next();\n }\n }\n\n onChartInit(ec: ECharts) {\n this.echartsInstance = ec;\n }\n\n /**\n * Fetches latest measurements for all configured datapoints.\n */\n private fetchMeasurements(): Observable<DatapointValue[]> {\n this.activeDatapoints = this.config?.datapoints?.filter(dp => dp.__active);\n const streams = this.activeDatapoints.map(dp =>\n this.measurements.getLatest(dp).pipe(map(m => this.mapToDatapointValue(dp, m)))\n );\n return combineLatest(streams);\n }\n\n /**\n * Maps a datapoint and its measurement to a DatapointValue.\n */\n private mapToDatapointValue(\n datapoint: KPIDetails,\n measurement: MeasurementValue\n ): DatapointValue {\n const rawValue = measurement.value;\n return {\n label: datapoint.label || '',\n value: rawValue < 0 || Number.isNaN(rawValue) ? 0 : rawValue,\n rawValue,\n unit: datapoint.unit || measurement.unit || '',\n color: datapoint.color || ''\n };\n }\n\n /**\n * Handles negative value alerts - clears existing alerts and adds warning if needed.\n */\n private handleNegativeValues(entries: DatapointValue[]): void {\n this.alerts.clear();\n\n const negatives = entries.filter(e => e.rawValue < 0);\n if (negatives.length === 0) {\n return;\n }\n\n const negativeDpList = negatives\n .map(n => `${this.encodeHtml(n.label)}: ${n.rawValue} ${this.encodeHtml(n.unit)}`)\n .join('; ');\n\n const errorMessage = this.translateService.instant(\n gettext('Negative measurements received from data point(s): {{ datapoints }}'),\n { datapoints: negativeDpList }\n );\n\n this.alerts.addAlerts(new DynamicComponentAlert({ type: 'warning', text: errorMessage }));\n }\n\n /**\n * Builds the ECharts options based on datapoint values.\n */\n private buildChartOptions(datapoints: DatapointValue[]): EChartsOption {\n if (this.isEmptyState(datapoints)) {\n return this.buildEmptyStateOptions();\n }\n return this.buildPieChartOptions(datapoints);\n }\n\n /**\n * Checks if chart should display empty state (no positive data).\n */\n private isEmptyState(entries: DatapointValue[]): boolean {\n const hasPositiveData = entries.some(e => e.rawValue > 0);\n const hasNegativeData = entries.some(e => e.rawValue < 0);\n return !hasPositiveData && !hasNegativeData;\n }\n\n /**\n * Builds options for empty state display.\n */\n private buildEmptyStateOptions(): EChartsOption {\n return {\n title: {\n text: gettext('No data available.'),\n left: 'center',\n top: 'center',\n textStyle: { fontSize: CHART_LAYOUT.EMPTY_STATE_FONT_SIZE }\n },\n series: []\n };\n }\n\n /**\n * Builds the pie chart options with data.\n */\n private buildPieChartOptions(entries: DatapointValue[]): EChartsOption {\n const options = this.config.pieChartOptions;\n const total = this.calculateTotal(entries);\n\n return {\n tooltip: this.buildTooltipConfig(entries, options),\n legend: this.buildLegendConfig(options),\n series: [this.buildPieSeriesConfig(entries, total, options)]\n };\n }\n\n /**\n * Calculates total of all entry values.\n */\n private calculateTotal(entries: DatapointValue[]): number {\n return entries.reduce((sum, e) => sum + e.value, 0);\n }\n\n /**\n * Builds tooltip configuration.\n */\n private buildTooltipConfig(\n entries: DatapointValue[],\n options?: PieChartOptions\n ): EChartsOption['tooltip'] {\n return {\n show: options?.showTooltips ?? false,\n formatter: (params: CallbackDataParams) => {\n const entry = entries.find(e => e.label === params.name);\n const unit = entry?.unit || '';\n const value = (params.value as number).toFixed(2);\n return `${this.encodeHtml(params.name as string)}: ${value} ${this.encodeHtml(unit)}`;\n }\n };\n }\n\n /**\n * Builds legend configuration.\n */\n private buildLegendConfig(options?: PieChartOptions): EChartsOption['legend'] {\n return {\n top: CHART_LAYOUT.LEGEND_TOP,\n left: 'right',\n show: options?.showLegend ?? false,\n formatter: (name: string) => {\n const match = name.match(/^(.+)_\\d+$/);\n return match ? match[1] : name;\n }\n };\n }\n\n /**\n * Builds pie series configuration.\n */\n private buildPieSeriesConfig(\n entries: DatapointValue[],\n total: number,\n options?: PieChartOptions\n ): PieSeriesOption {\n return {\n top: CHART_LAYOUT.SERIES_TOP,\n type: 'pie',\n radius: CHART_LAYOUT.PIE_RADIUS,\n label: {\n show: options?.showLabels ?? false,\n position: 'inside',\n formatter: (params: CallbackDataParams) =>\n this.formatPercentageLabel(params.value as number, total)\n },\n data: entries.map((e, index) => ({\n name: `${e.label}_${index}`,\n value: e.value,\n itemStyle: { color: e.color }\n }))\n };\n }\n\n /**\n * Formats percentage label for pie slice.\n */\n private formatPercentageLabel(value: number, total: number): string {\n const percentage = total > 0 ? Math.round((value / total) * 100) : 0;\n return percentage === 0 ? '' : `${percentage}%`;\n }\n\n /**\n * Updates the ECharts instance with new options.\n */\n private updateChartInstance(options: EChartsOption): void {\n if (this.echartsInstance) {\n this.echartsInstance.setOption(options, true);\n }\n }\n\n /**\n * Encodes HTML to prevent XSS attacks.\n */\n private encodeHtml(text: string): string {\n return echarts.format.encodeHTML(text);\n }\n}\n","<div class=\"p-relative fit-h\">\n <div\n class=\"p-absolute fit-w fit-h\"\n #chart\n echarts\n [options]=\"chartOptions$ | async\"\n (chartInit)=\"onChartInit($event)\"\n ></div>\n\n <c8y-chart-alerts [alerts]=\"alerts\"></c8y-chart-alerts>\n</div>\n","import { Component, inject, Input, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport { PieChartConfig } from '../pie-chart.model';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { Observable, Subject } from 'rxjs';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { PieChartWidgetViewComponent } from '../pie-chart-widget-view/pie-chart-widget-view.component';\n\n@Component({\n selector: 'app-pie-chart-config',\n templateUrl: './pie-chart-widget-config.component.html',\n imports: [\n CommonModule,\n CoreModule,\n DatapointSelectorModule,\n FormsModule,\n ReactiveFormsModule,\n PieChartWidgetViewComponent\n ]\n})\nexport class PieChartWidgetConfigComponent implements OnInit, OnDestroy {\n @Input() config: PieChartConfig;\n formGroup!: ReturnType<PieChartWidgetConfigComponent['initForm']>;\n private readonly destroy$ = new Subject<void>();\n\n @ViewChild('pieChartPreview')\n set previewMapSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly formBuilder = inject(FormBuilder);\n\n ngOnInit() {\n this.formGroup = this.initForm();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onBeforeSave(config?: PieChartConfig): boolean | Promise<boolean> | Observable<boolean> {\n if (!this.formGroup.valid || !config) return false;\n\n const formValue = this.formGroup.value;\n config.pieChartOptions = config.pieChartOptions || {\n showLabels: false,\n showLegend: false,\n showTooltips: false\n };\n config.pieChartOptions.showLabels = formValue.pieChartOptions.showLabels;\n config.pieChartOptions.showLegend = formValue.pieChartOptions.showLegend;\n config.pieChartOptions.showTooltips = formValue.pieChartOptions.showTooltips;\n\n this.widgetConfigService.updateConfig(config);\n\n return true;\n }\n\n private initForm() {\n const form = this.formBuilder.group({\n pieChartOptions: this.formBuilder.group({\n showLabels: [this.config.pieChartOptions?.showLabels ?? false],\n showLegend: [this.config.pieChartOptions?.showLegend ?? false],\n showTooltips: [this.config.pieChartOptions?.showTooltips ?? false]\n })\n });\n return form;\n }\n}\n","@if (formGroup) {\n <form\n class=\"p-4\"\n [formGroup]=\"formGroup\"\n >\n <fieldset class=\"c8y-fieldset m-t-16 p-b-8\">\n <legend>{{ 'Pie chart options' | translate }}</legend>\n <div\n class=\"d-flex flex-column gap-8 form-group-sm\"\n formGroupName=\"pieChartOptions\"\n >\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLabels\"\n />\n <span></span>\n <span>\n {{ 'Show labels' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLegend\"\n />\n <span></span>\n <span>\n {{ 'Show legend' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showTooltips\"\n />\n <span></span>\n <span>\n {{ 'Show tooltips' | translate }}\n </span>\n </label>\n </div>\n </fieldset>\n </form>\n\n <ng-template #pieChartPreview>\n @if (config.datapoints?.length > 0) {\n <c8y-pie-chart\n class=\"w-100 h-100\"\n [config]=\"{\n datapoints: config.datapoints,\n pieChartOptions: {\n showLabels: formGroup.value.pieChartOptions.showLabels,\n showLegend: formGroup.value.pieChartOptions.showLegend,\n showTooltips: formGroup.value.pieChartOptions.showTooltips\n }\n }\"\n ></c8y-pie-chart>\n } @else {\n <div class=\"col-md-6 d-col a-i-start j-c-center\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render content' | translate\"\n [horizontal]=\"false\"\n data-cy=\"kpi-widget--empty-state-no-data-point-selected\"\n >\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#kpi\">user documentation</a>.\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n }\n </ng-template>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["map","i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-pie-chart.mjs","sources":["../../widgets/implementations/pie-chart/current-measurement.service.ts","../../widgets/implementations/pie-chart/pie-chart-widget-view/pie-chart-widget-view.component.ts","../../widgets/implementations/pie-chart/pie-chart-widget-view/pie-chart-widget-view.component.html","../../widgets/implementations/pie-chart/pie-chart-widget-config/pie-chart-widget-config.component.ts","../../widgets/implementations/pie-chart/pie-chart-widget-config/pie-chart-widget-config.component.html","../../widgets/implementations/pie-chart/c8y-ngx-components-widgets-implementations-pie-chart.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { MeasurementRealtimeService } from '@c8y/ngx-components';\nimport { IMeasurementValue } from '@c8y/client';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { Observable, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class CurrentMeasurementService {\n constructor(private realtime: MeasurementRealtimeService) {}\n\n /**\n * Fetches the latest measurement value for a given datapoint.\n * Combines initial historical value with realtime updates.\n *\n * @param datapoint - The KPI datapoint configuration\n * @returns Observable emitting measurement value, unit, date, and notFound flag\n */\n getLatest(datapoint: KPIDetails): Observable<{\n value: number;\n unit: string;\n date: string;\n notFound?: boolean;\n }> {\n return this.realtime\n .latestValueOfSpecificMeasurement$(\n datapoint.fragment,\n datapoint.series,\n datapoint.__target,\n 1,\n true\n )\n .pipe(\n map(m => {\n if (!m) {\n return {\n value: Number.NaN,\n unit: datapoint.unit || '',\n date: '',\n notFound: true\n };\n }\n\n const v: IMeasurementValue = m[datapoint.fragment][datapoint.series];\n return {\n value: v.value,\n unit: v.unit || datapoint.unit,\n date: m.time\n };\n }),\n catchError(() =>\n of({\n value: Number.NaN,\n unit: datapoint.unit || '',\n date: '',\n notFound: true\n })\n )\n );\n }\n}\n","import {\n Component,\n ElementRef,\n inject,\n Input,\n OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n ViewChild\n} from '@angular/core';\nimport {\n DatapointValue,\n MeasurementValue,\n PieChartConfig,\n PieChartOptions\n} from '../pie-chart.model';\nimport { ECharts } from 'echarts/core';\nimport { BehaviorSubject, combineLatest, map, Observable, switchMap, tap } from 'rxjs';\nimport { NGX_ECHARTS_CONFIG, NgxEchartsModule } from 'ngx-echarts';\nimport { AsyncPipe } from '@angular/common';\nimport { CurrentMeasurementService } from '../current-measurement.service';\nimport {\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n MeasurementRealtimeService\n} from '@c8y/ngx-components';\nimport { ChartAlertsComponent } from '@c8y/ngx-components/echart';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport * as echarts from 'echarts';\nimport type { EChartsOption, PieSeriesOption } from 'echarts';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { CallbackDataParams } from 'echarts/types/dist/shared';\n\n/** Chart layout constants */\nconst CHART_LAYOUT = {\n PIE_CENTER: ['50%', '45%'] as [string, string],\n PIE_RADIUS: '80%',\n LEGEND_BOTTOM: '2%',\n EMPTY_STATE_FONT_SIZE: 30\n} as const;\n\n@Component({\n selector: 'c8y-pie-chart',\n templateUrl: './pie-chart-widget-view.component.html',\n providers: [\n MeasurementRealtimeService,\n CurrentMeasurementService,\n { provide: NGX_ECHARTS_CONFIG, useFactory: () => ({ echarts: () => import('echarts') }) }\n ],\n imports: [NgxEchartsModule, AsyncPipe, ChartAlertsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PieChartWidgetViewComponent implements OnChanges, DynamicComponent {\n @Input() config!: PieChartConfig;\n @ViewChild('chart', { static: false }) chart!: ElementRef;\n activeDatapoints: KPIDetails[] = [];\n\n chartOptions$!: Observable<EChartsOption>;\n alerts = new DynamicComponentAlertAggregator();\n echartsInstance!: ECharts;\n\n private readonly configChanged$ = new BehaviorSubject<void>(undefined);\n private readonly measurements = inject(CurrentMeasurementService);\n private readonly translateService = inject(TranslateService);\n\n constructor() {\n this.chartOptions$ = this.configChanged$.pipe(\n switchMap(() => this.fetchMeasurements()),\n tap(entries => this.handleNegativeValues(entries)),\n map(entries => this.buildChartOptions(entries)),\n tap(options => this.updateChartInstance(options))\n );\n }\n\n ngOnChanges(_: SimpleChanges) {\n if (this.config?.datapoints?.length) {\n this.configChanged$.next();\n }\n }\n\n onChartInit(ec: ECharts) {\n this.echartsInstance = ec;\n }\n\n /**\n * Fetches latest measurements for all configured datapoints.\n */\n private fetchMeasurements(): Observable<DatapointValue[]> {\n this.activeDatapoints = this.config?.datapoints?.filter(dp => dp.__active);\n const streams = this.activeDatapoints.map(dp =>\n this.measurements.getLatest(dp).pipe(map(m => this.mapToDatapointValue(dp, m)))\n );\n return combineLatest(streams);\n }\n\n /**\n * Maps a datapoint and its measurement to a DatapointValue.\n */\n private mapToDatapointValue(\n datapoint: KPIDetails,\n measurement: MeasurementValue\n ): DatapointValue {\n const rawValue = measurement.value;\n return {\n label: datapoint.label || '',\n value: rawValue < 0 || Number.isNaN(rawValue) ? 0 : rawValue,\n rawValue,\n unit: datapoint.unit || measurement.unit || '',\n color: datapoint.color || ''\n };\n }\n\n /**\n * Handles negative value alerts - clears existing alerts and adds warning if needed.\n */\n private handleNegativeValues(entries: DatapointValue[]): void {\n this.alerts.clear();\n\n const negatives = entries.filter(e => e.rawValue < 0);\n if (negatives.length === 0) {\n return;\n }\n\n const negativeDpList = negatives\n .map(n => `${this.encodeHtml(n.label)}: ${n.rawValue} ${this.encodeHtml(n.unit)}`)\n .join('; ');\n\n const errorMessage = this.translateService.instant(\n gettext('Negative measurements received from data point(s): {{ datapoints }}'),\n { datapoints: negativeDpList }\n );\n\n this.alerts.addAlerts(new DynamicComponentAlert({ type: 'warning', text: errorMessage }));\n }\n\n /**\n * Builds the ECharts options based on datapoint values.\n */\n private buildChartOptions(datapoints: DatapointValue[]): EChartsOption {\n if (this.isEmptyState(datapoints)) {\n return this.buildEmptyStateOptions();\n }\n return this.buildPieChartOptions(datapoints);\n }\n\n /**\n * Checks if chart should display empty state (no positive data).\n */\n private isEmptyState(entries: DatapointValue[]): boolean {\n const hasPositiveData = entries.some(e => e.rawValue > 0);\n const hasNegativeData = entries.some(e => e.rawValue < 0);\n return !hasPositiveData && !hasNegativeData;\n }\n\n /**\n * Builds options for empty state display.\n */\n private buildEmptyStateOptions(): EChartsOption {\n return {\n title: {\n text: gettext('No data available.'),\n left: 'center',\n top: 'center',\n textStyle: { fontSize: CHART_LAYOUT.EMPTY_STATE_FONT_SIZE }\n },\n series: []\n };\n }\n\n /**\n * Builds the pie chart options with data.\n */\n private buildPieChartOptions(entries: DatapointValue[]): EChartsOption {\n const options = this.config.pieChartOptions;\n const total = this.calculateTotal(entries);\n\n return {\n tooltip: this.buildTooltipConfig(entries, options),\n legend: this.buildLegendConfig(options),\n series: [this.buildPieSeriesConfig(entries, total, options)]\n };\n }\n\n /**\n * Calculates total of all entry values.\n */\n private calculateTotal(entries: DatapointValue[]): number {\n return entries.reduce((sum, e) => sum + e.value, 0);\n }\n\n /**\n * Builds tooltip configuration.\n */\n private buildTooltipConfig(\n entries: DatapointValue[],\n options?: PieChartOptions\n ): EChartsOption['tooltip'] {\n return {\n show: options?.showTooltips ?? false,\n formatter: (params: CallbackDataParams) => {\n const entry = entries.find(e => e.label === params.name);\n const unit = entry?.unit || '';\n const value = (params.value as number).toFixed(2);\n return `${this.encodeHtml(params.name as string)}: ${value} ${this.encodeHtml(unit)}`;\n }\n };\n }\n\n /**\n * Builds legend configuration.\n */\n private buildLegendConfig(options?: PieChartOptions): EChartsOption['legend'] {\n return {\n bottom: CHART_LAYOUT.LEGEND_BOTTOM,\n left: 'center',\n show: options?.showLegend ?? false,\n formatter: (name: string) => {\n const match = name.match(/^(.+)_\\d+$/);\n return match ? match[1] : name;\n }\n };\n }\n\n /**\n * Builds pie series configuration.\n */\n private buildPieSeriesConfig(\n entries: DatapointValue[],\n total: number,\n options?: PieChartOptions\n ): PieSeriesOption {\n const showLegend = options?.showLegend ?? false;\n return {\n center: showLegend ? CHART_LAYOUT.PIE_CENTER : ['50%', '50%'],\n type: 'pie',\n radius: CHART_LAYOUT.PIE_RADIUS,\n label: {\n show: options?.showLabels ?? false,\n position: 'inside',\n formatter: (params: CallbackDataParams) =>\n this.formatPercentageLabel(params.value as number, total)\n },\n data: entries.map((e, index) => ({\n name: `${e.label}_${index}`,\n value: e.value,\n itemStyle: { color: e.color }\n }))\n };\n }\n\n /**\n * Formats percentage label for pie slice.\n */\n private formatPercentageLabel(value: number, total: number): string {\n const percentage = total > 0 ? Math.round((value / total) * 100) : 0;\n return percentage === 0 ? '' : `${percentage}%`;\n }\n\n /**\n * Updates the ECharts instance with new options.\n */\n private updateChartInstance(options: EChartsOption): void {\n if (this.echartsInstance) {\n this.echartsInstance.setOption(options, true);\n }\n }\n\n /**\n * Encodes HTML to prevent XSS attacks.\n */\n private encodeHtml(text: string): string {\n return echarts.format.encodeHTML(text);\n }\n}\n","<div class=\"p-relative fit-h overflow-hidden\">\n <div\n class=\"p-absolute fit-w fit-h\"\n #chart\n echarts\n [options]=\"chartOptions$ | async\"\n (chartInit)=\"onChartInit($event)\"\n ></div>\n\n <c8y-chart-alerts [alerts]=\"alerts\"></c8y-chart-alerts>\n</div>\n","import { Component, inject, Input, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport { PieChartConfig } from '../pie-chart.model';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { Observable, Subject } from 'rxjs';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { PieChartWidgetViewComponent } from '../pie-chart-widget-view/pie-chart-widget-view.component';\n\n@Component({\n selector: 'app-pie-chart-config',\n templateUrl: './pie-chart-widget-config.component.html',\n imports: [\n CommonModule,\n CoreModule,\n DatapointSelectorModule,\n FormsModule,\n ReactiveFormsModule,\n PieChartWidgetViewComponent\n ]\n})\nexport class PieChartWidgetConfigComponent implements OnInit, OnDestroy {\n @Input() config: PieChartConfig;\n formGroup!: ReturnType<PieChartWidgetConfigComponent['initForm']>;\n private readonly destroy$ = new Subject<void>();\n\n @ViewChild('pieChartPreview')\n set previewMapSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly formBuilder = inject(FormBuilder);\n\n ngOnInit() {\n this.formGroup = this.initForm();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onBeforeSave(config?: PieChartConfig): boolean | Promise<boolean> | Observable<boolean> {\n if (!this.formGroup.valid || !config) return false;\n\n const formValue = this.formGroup.value;\n config.pieChartOptions = config.pieChartOptions || {\n showLabels: false,\n showLegend: false,\n showTooltips: false\n };\n config.pieChartOptions.showLabels = formValue.pieChartOptions.showLabels;\n config.pieChartOptions.showLegend = formValue.pieChartOptions.showLegend;\n config.pieChartOptions.showTooltips = formValue.pieChartOptions.showTooltips;\n\n this.widgetConfigService.updateConfig(config);\n\n return true;\n }\n\n private initForm() {\n const form = this.formBuilder.group({\n pieChartOptions: this.formBuilder.group({\n showLabels: [this.config.pieChartOptions?.showLabels ?? false],\n showLegend: [this.config.pieChartOptions?.showLegend ?? false],\n showTooltips: [this.config.pieChartOptions?.showTooltips ?? false]\n })\n });\n return form;\n }\n}\n","@if (formGroup) {\n <div [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Pie chart options' | translate }}</legend>\n <div\n class=\"d-flex flex-column gap-8 form-group-sm p-b-8\"\n formGroupName=\"pieChartOptions\"\n >\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLabels\"\n />\n <span></span>\n <span>\n {{ 'Show labels' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLegend\"\n />\n <span></span>\n <span>\n {{ 'Show legend' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showTooltips\"\n />\n <span></span>\n <span>\n {{ 'Show tooltips' | translate }}\n </span>\n </label>\n </div>\n </fieldset>\n </div>\n\n <ng-template #pieChartPreview>\n @if (config.datapoints?.length > 0) {\n <c8y-pie-chart\n class=\"w-100 h-100\"\n [config]=\"{\n datapoints: config.datapoints,\n pieChartOptions: {\n showLabels: formGroup.value.pieChartOptions.showLabels,\n showLegend: formGroup.value.pieChartOptions.showLegend,\n showTooltips: formGroup.value.pieChartOptions.showTooltips\n }\n }\"\n ></c8y-pie-chart>\n } @else {\n <div class=\"col-md-6 d-col a-i-start j-c-center\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render content' | translate\"\n [horizontal]=\"false\"\n data-cy=\"kpi-widget--empty-state-no-data-point-selected\"\n >\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#kpi\">user documentation</a>.\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n }\n </ng-template>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["map","i1"],"mappings":"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"}
|
|
@@ -274,11 +274,11 @@ class ThreeDRotationWidgetConfigComponent {
|
|
|
274
274
|
});
|
|
275
275
|
}
|
|
276
276
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ThreeDRotationWidgetConfigComponent, deps: [{ token: i1.FormBuilder }, { token: i1.NgForm }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
277
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: ThreeDRotationWidgetConfigComponent, isStandalone: true, selector: "c8y-three-d-rotation-widget-config", inputs: { config: "config" }, ngImport: i0, template: "<fieldset class=\"c8y-fieldset\">\n
|
|
277
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: ThreeDRotationWidgetConfigComponent, isStandalone: true, selector: "c8y-three-d-rotation-widget-config", inputs: { config: "config" }, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Rendering' | translate }}</legend>\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label>{{ 'Select object model for rendering' | translate }}</label>\n <div class=\"input-group input-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"objectModel\"\n >\n <option value=\"box.min.json\">{{ 'Box model' | translate }}</option>\n <option value=\"phoneModel.min.json\">{{ 'Phone model' | translate }}</option>\n </select>\n </div>\n <span class=\"input-group-addon bg-level-0\">\n <label class=\"c8y-switch\">\n <input\n type=\"checkbox\"\n formControlName=\"isWireframe\"\n />\n <span></span>\n <span>{{ 'Wireframe' | translate }}</span>\n </label>\n </span>\n </div>\n </c8y-form-group>\n\n <c8y-form-group class=\"form-group-sm\">\n <label>{{ 'Camera type' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"cameraType\"\n >\n <option value=\"OC\">{{ 'Orthographic camera' | translate }}</option>\n <option value=\"PC\">{{ 'Perspective camera' | translate }}</option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ButtonsModule }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
|
|
278
278
|
}
|
|
279
279
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ThreeDRotationWidgetConfigComponent, decorators: [{
|
|
280
280
|
type: Component,
|
|
281
|
-
args: [{ selector: 'c8y-three-d-rotation-widget-config', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], standalone: true, imports: [CoreModule, ButtonsModule], template: "<fieldset class=\"c8y-fieldset\">\n
|
|
281
|
+
args: [{ selector: 'c8y-three-d-rotation-widget-config', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], standalone: true, imports: [CoreModule, ButtonsModule], template: "<div [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Rendering' | translate }}</legend>\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label>{{ 'Select object model for rendering' | translate }}</label>\n <div class=\"input-group input-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"objectModel\"\n >\n <option value=\"box.min.json\">{{ 'Box model' | translate }}</option>\n <option value=\"phoneModel.min.json\">{{ 'Phone model' | translate }}</option>\n </select>\n </div>\n <span class=\"input-group-addon bg-level-0\">\n <label class=\"c8y-switch\">\n <input\n type=\"checkbox\"\n formControlName=\"isWireframe\"\n />\n <span></span>\n <span>{{ 'Wireframe' | translate }}</span>\n </label>\n </span>\n </div>\n </c8y-form-group>\n\n <c8y-form-group class=\"form-group-sm\">\n <label>{{ 'Camera type' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n formControlName=\"cameraType\"\n >\n <option value=\"OC\">{{ 'Orthographic camera' | translate }}</option>\n <option value=\"PC\">{{ 'Perspective camera' | translate }}</option>\n </select>\n </div>\n </c8y-form-group>\n </fieldset>\n</div>\n" }]
|
|
282
282
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i1.NgForm }], propDecorators: { config: [{
|
|
283
283
|
type: Input
|
|
284
284
|
}] } });
|