@c8y/ngx-components 1023.85.1 → 1023.88.2
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/ai/agent-chat/index.d.ts.map +1 -1
- package/alarm-event-selector/index.d.ts +6 -0
- package/alarm-event-selector/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/fesm2022/c8y-ngx-components-ai-agent-chat.mjs +12 -2
- package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.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-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-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-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 +32 -10
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/locales/locales.pot +39 -0
- package/package.json +1 -1
- package/widgets/definitions/info-gauge/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":";;;;;;;;;;;;;;;;;;MAQa,yBAAyB,CAAA;AACpC,IAAA,WAAA,CAAoB,QAAoC,EAAA;QAApC,IAAA,CAAA,QAAQ,GAAR,QAAQ;IAA+B;AAE3D;;;;;;AAMG;AACH,IAAA,SAAS,CAAC,SAAqB,EAAA;QAM7B,OAAO,IAAI,CAAC;AACT,aAAA,iCAAiC,CAChC,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,QAAQ,EAClB,CAAC,EACD,IAAI;AAEL,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAG;YACN,IAAI,CAAC,CAAC,EAAE;gBACN,OAAO;oBACL,KAAK,EAAE,MAAM,CAAC,GAAG;AACjB,oBAAA,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE;AAC1B,oBAAA,IAAI,EAAE,EAAE;AACR,oBAAA,QAAQ,EAAE;iBACX;YACH;AAEA,YAAA,MAAM,CAAC,GAAsB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;YACpE,OAAO;gBACL,KAAK,EAAE,CAAC,CAAC,KAAK;AACd,gBAAA,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI;gBAC9B,IAAI,EAAE,CAAC,CAAC;aACT;QACH,CAAC,CAAC,EACF,UAAU,CAAC,MACT,EAAE,CAAC;YACD,KAAK,EAAE,MAAM,CAAC,GAAG;AACjB,YAAA,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE;AAC1B,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,QAAQ,EAAE;SACX,CAAC,CACH,CACF;IACL;+GAnDW,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAzB,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,yBAAyB,cADZ,MAAM,EAAA,CAAA,CAAA;;4FACnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AC4BlC;AACA,MAAM,YAAY,GAAG;AACnB,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,qBAAqB,EAAE;CACf;MAaG,2BAA2B,CAAA;AAatC,IAAA,WAAA,GAAA;QAVA,IAAA,CAAA,gBAAgB,GAAiB,EAAE;AAGnC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,+BAA+B,EAAE;AAG7B,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAO,SAAS,CAAC;AACrD,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAChD,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAG1D,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAC3C,SAAS,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,EACzC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,EAClDA,KAAG,CAAC,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,EAC/C,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAClD;IACH;AAEA,IAAA,WAAW,CAAC,CAAgB,EAAA;QAC1B,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE;AACnC,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;QAC5B;IACF;AAEA,IAAA,WAAW,CAAC,EAAW,EAAA;AACrB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;IAC3B;AAEA;;AAEG;IACK,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC;AAC1E,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAC1C,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAACA,KAAG,CAAC,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAChF;AACD,QAAA,OAAO,aAAa,CAAC,OAAO,CAAC;IAC/B;AAEA;;AAEG;IACK,mBAAmB,CACzB,SAAqB,EACrB,WAA6B,EAAA;AAE7B,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK;QAClC,OAAO;AACL,YAAA,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,EAAE;AAC5B,YAAA,KAAK,EAAE,QAAQ,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ;YAC5D,QAAQ;YACR,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,IAAI,EAAE;AAC9C,YAAA,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI;SAC3B;IACH;AAEA;;AAEG;AACK,IAAA,oBAAoB,CAAC,OAAyB,EAAA;AACpD,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AAEnB,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;AACrD,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1B;QACF;QAEA,MAAM,cAAc,GAAG;AACpB,aAAA,GAAG,CAAC,CAAC,IAAI,CAAA,EAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAC,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA,CAAE;aAChF,IAAI,CAAC,IAAI,CAAC;AAEb,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAChD,OAAO,CAAC,qEAAqE,CAAC,EAC9E,EAAE,UAAU,EAAE,cAAc,EAAE,CAC/B;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3F;AAEA;;AAEG;AACK,IAAA,iBAAiB,CAAC,UAA4B,EAAA;AACpD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE;QACtC;AACA,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC;IAC9C;AAEA;;AAEG;AACK,IAAA,YAAY,CAAC,OAAyB,EAAA;AAC5C,QAAA,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;AACzD,QAAA,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;AACzD,QAAA,OAAO,CAAC,eAAe,IAAI,CAAC,eAAe;IAC7C;AAEA;;AAEG;IACK,sBAAsB,GAAA;QAC5B,OAAO;AACL,YAAA,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE,OAAO,CAAC,oBAAoB,CAAC;AACnC,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,GAAG,EAAE,QAAQ;AACb,gBAAA,SAAS,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,qBAAqB;AAC1D,aAAA;AACD,YAAA,MAAM,EAAE;SACT;IACH;AAEA;;AAEG;AACK,IAAA,oBAAoB,CAAC,OAAyB,EAAA;AACpD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;QAE1C,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;AAClD,YAAA,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;AACvC,YAAA,MAAM,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;SAC5D;IACH;AAEA;;AAEG;AACK,IAAA,cAAc,CAAC,OAAyB,EAAA;AAC9C,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACrD;AAEA;;AAEG;IACK,kBAAkB,CACxB,OAAyB,EACzB,OAAyB,EAAA;QAEzB,OAAO;AACL,YAAA,IAAI,EAAE,OAAO,EAAE,YAAY,IAAI,KAAK;AACpC,YAAA,SAAS,EAAE,CAAC,MAA0B,KAAI;AACxC,gBAAA,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,CAAC;AACxD,gBAAA,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,EAAE;gBAC9B,MAAM,KAAK,GAAI,MAAM,CAAC,KAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,gBAAA,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAc,CAAC,KAAK,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YACvF;SACD;IACH;AAEA;;AAEG;AACK,IAAA,iBAAiB,CAAC,OAAyB,EAAA;QACjD,OAAO;YACL,GAAG,EAAE,YAAY,CAAC,UAAU;AAC5B,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,IAAI,EAAE,OAAO,EAAE,UAAU,IAAI,KAAK;AAClC,YAAA,SAAS,EAAE,CAAC,IAAY,KAAI;gBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;AACtC,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YAChC;SACD;IACH;AAEA;;AAEG;AACK,IAAA,oBAAoB,CAC1B,OAAyB,EACzB,KAAa,EACb,OAAyB,EAAA;QAEzB,OAAO;YACL,GAAG,EAAE,YAAY,CAAC,UAAU;AAC5B,YAAA,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,YAAY,CAAC,UAAU;AAC/B,YAAA,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE,OAAO,EAAE,UAAU,IAAI,KAAK;AAClC,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,SAAS,EAAE,CAAC,MAA0B,KACpC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,KAAe,EAAE,KAAK;AAC3D,aAAA;AACD,YAAA,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM;AAC/B,gBAAA,IAAI,EAAE,CAAA,EAAG,CAAC,CAAC,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;gBAC3B,KAAK,EAAE,CAAC,CAAC,KAAK;AACd,gBAAA,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK;AAC5B,aAAA,CAAC;SACH;IACH;AAEA;;AAEG;IACK,qBAAqB,CAAC,KAAa,EAAE,KAAa,EAAA;QACxD,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;AACpE,QAAA,OAAO,UAAU,KAAK,CAAC,GAAG,EAAE,GAAG,CAAA,EAAG,UAAU,GAAG;IACjD;AAEA;;AAEG;AACK,IAAA,mBAAmB,CAAC,OAAsB,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC;QAC/C;IACF;AAEA;;AAEG;AACK,IAAA,UAAU,CAAC,IAAY,EAAA;QAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;IACxC;+GA3NW,2BAA2B,EAAA,IAAA,EAAA,EAAA,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,eAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAR3B;YACT,0BAA0B;YAC1B,yBAAyB;YACzB,EAAE,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,SAAS,CAAC,EAAE,CAAC;AACxF,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClDH,+QAWA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDwCY,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,cAAA,EAAA,YAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,4BAAA,EAAA,gCAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAa,oBAAoB,4EAA/B,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAG1B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAXvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,SAAA,EAEd;wBACT,0BAA0B;wBAC1B,yBAAyB;wBACzB,EAAE,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,SAAS,CAAC,EAAE,CAAC;qBACxF,EAAA,OAAA,EACQ,CAAC,gBAAgB,EAAE,SAAS,EAAE,oBAAoB,CAAC,EAAA,eAAA,EAC3C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+QAAA,EAAA;;sBAG9C;;sBACA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;MEnC1B,6BAA6B,CAAA;AAZ1C,IAAA,WAAA,GAAA;AAemB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAW9B,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAuCnD,IAAA;IAjDC,IACI,aAAa,CAAC,QAA0B,EAAA;QAC1C,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC7C;QACF;AACA,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC;IAC3C;IAKA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE;IAClC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;AAEA,IAAA,YAAY,CAAC,MAAuB,EAAA;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AAElD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AACtC,QAAA,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI;AACjD,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,YAAY,EAAE;SACf;QACD,MAAM,CAAC,eAAe,CAAC,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC,UAAU;QACxE,MAAM,CAAC,eAAe,CAAC,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC,UAAU;QACxE,MAAM,CAAC,eAAe,CAAC,YAAY,GAAG,SAAS,CAAC,eAAe,CAAC,YAAY;AAE5E,QAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,MAAM,CAAC;AAE7C,QAAA,OAAO,IAAI;IACb;IAEQ,QAAQ,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAClC,YAAA,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;gBACtC,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,IAAI,KAAK,CAAC;gBAC9D,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,IAAI,KAAK,CAAC;gBAC9D,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,IAAI,KAAK;aAClE;AACF,SAAA,CAAC;AACF,QAAA,OAAO,IAAI;IACb;+GArDW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrB1C,83EAiFA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpEI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACV,uBAAuB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACvB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,mBAAmB,+BACnB,2BAA2B,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGlB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAZzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,OAAA,EAEvB;wBACP,YAAY;wBACZ,UAAU;wBACV,uBAAuB;wBACvB,WAAW;wBACX,mBAAmB;wBACnB;AACD,qBAAA,EAAA,QAAA,EAAA,83EAAA,EAAA;;sBAGA;;sBAIA,SAAS;uBAAC,iBAAiB;;;AE1B9B;;AAEG;;;;"}
|
|
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
|
}] } });
|