@c8y/ngx-components 1023.6.3 → 1023.7.0

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.
Files changed (117) hide show
  1. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.map +1 -1
  2. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +1 -1
  3. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs.map +1 -1
  4. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  5. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  6. package/fesm2022/c8y-ngx-components-app-logs.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-asset-properties.mjs +2 -2
  8. package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-asset-property-grid.component-B1q7kXRu.mjs.map +1 -1
  10. package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  12. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  13. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs.map +1 -1
  14. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  15. package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
  16. package/fesm2022/c8y-ngx-components-computed-asset-properties-alarm-count-config.component-Bl18pHcM.mjs.map +1 -1
  17. package/fesm2022/c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-C5QMFdX1.mjs.map +1 -1
  18. package/fesm2022/c8y-ngx-components-computed-asset-properties-event-count-config.component-C-Lc5Ble.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-BXfM7hTQ.mjs.map +1 -1
  20. package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DN-f35bA.mjs.map +1 -1
  22. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +1 -1
  23. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  24. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-m7YeEj9R.mjs.map +1 -1
  25. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
  26. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  27. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  28. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  29. package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
  30. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  31. package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs.map +1 -1
  32. package/fesm2022/c8y-ngx-components-device-protocols.mjs.map +1 -1
  33. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
  34. package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
  35. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  36. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  37. package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
  38. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  39. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  40. package/fesm2022/c8y-ngx-components-editor.mjs.map +1 -1
  41. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +1 -1
  42. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs.map +1 -1
  43. package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
  44. package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
  45. package/fesm2022/c8y-ngx-components-global-context.mjs +12 -12
  46. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  47. package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
  48. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
  49. package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
  50. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  51. package/fesm2022/c8y-ngx-components-messaging-management.mjs +1 -1
  52. package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
  53. package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
  54. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
  55. package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs.map +1 -1
  56. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
  57. package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs.map +1 -1
  58. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
  59. package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs.map +1 -1
  60. package/fesm2022/c8y-ngx-components-operations-device-selector.mjs.map +1 -1
  61. package/fesm2022/c8y-ngx-components-operations-operation-details.mjs.map +1 -1
  62. package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs.map +1 -1
  63. package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs.map +1 -1
  64. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +1 -1
  65. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
  66. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
  67. package/fesm2022/c8y-ngx-components-operations-status-filter.mjs.map +1 -1
  68. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
  69. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
  70. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
  71. package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs.map +1 -1
  72. package/fesm2022/c8y-ngx-components-platform-configuration.mjs.map +1 -1
  73. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
  74. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  75. package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
  76. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +1 -1
  77. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
  78. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
  79. package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
  80. package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
  81. package/fesm2022/c8y-ngx-components-reports.mjs.map +1 -1
  82. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  83. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  84. package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
  85. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  86. package/fesm2022/c8y-ngx-components-search.mjs.map +1 -1
  87. package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs.map +1 -1
  88. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +1 -1
  89. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
  90. package/fesm2022/c8y-ngx-components-static-assets.mjs.map +1 -1
  91. package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
  92. package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
  93. package/fesm2022/c8y-ngx-components-time-context.mjs +1 -1
  94. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
  95. package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
  96. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  97. package/fesm2022/c8y-ngx-components-user-roles.mjs.map +1 -1
  98. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  99. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs +1 -1
  100. package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs.map +1 -1
  101. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  102. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  103. package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs.map +1 -1
  104. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +1 -1
  105. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
  106. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
  107. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
  108. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
  109. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
  110. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  111. package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
  112. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +4 -4
  113. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs.map +1 -1
  114. package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs.map +1 -1
  115. package/fesm2022/c8y-ngx-components.mjs +2 -2
  116. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  117. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-widgets-implementations-markdown.mjs","sources":["../../widgets/implementations/markdown/markdown-widget.service.ts","../../widgets/implementations/markdown/markdown-widget-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 { Injectable } from '@angular/core';\nimport { IManagedObjectBinary, InventoryBinaryService, InventoryService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { FilesService, AlertService } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable({ providedIn: 'root' })\nexport class MarkdownWidgetService {\n constructor(\n private fileService: FilesService,\n private inventory: InventoryService,\n private binary: InventoryBinaryService,\n private alert: AlertService,\n private translate: TranslateService\n ) {}\n\n async getFile(markdownBinaryId: string | null): Promise<File> {\n if (!markdownBinaryId) {\n return null;\n }\n\n try {\n const { data: markdownBinaryMo } = await this.inventory.detail(markdownBinaryId);\n const file = await this.fileService.getFile(markdownBinaryMo as IManagedObjectBinary);\n return file;\n } catch (e) {\n const text = this.translate.instant(\n gettext('Unable to retrieve binary with ID: {{ markdownBinaryId }}'),\n { markdownBinaryId }\n );\n this.alert.danger(text, e?.data);\n }\n\n return null;\n }\n\n async uploadFile(file: File): Promise<string> {\n const { data: mo } = await this.binary.create(file);\n return mo.id;\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlertService, C8yValidators, CoreModule, OnBeforeSave } from '@c8y/ngx-components';\nimport {\n AbstractControl,\n FormBuilder,\n FormGroup,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport { MarkdownWidgetConfig } from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\n\n@Component({\n selector: 'c8y-markdown-widget-config',\n templateUrl: './markdown-widget-config.component.html',\n standalone: true,\n imports: [CoreModule, ReactiveFormsModule]\n})\nexport class MarkdownWidgetConfigComponent implements OnInit, OnBeforeSave {\n @Input() config: MarkdownWidgetConfig;\n formGroup: FormGroup;\n fileFromConfig: File;\n uploadChoice: 'uploadBinary' | 'uploadUrl' = 'uploadUrl';\n loading = false;\n\n constructor(\n private formBuilder: FormBuilder,\n private form: NgForm,\n private alert: AlertService,\n private markdownService: MarkdownWidgetService\n ) {}\n\n async onBeforeSave(config?: MarkdownWidgetConfig): Promise<boolean> {\n if (this.formGroup.invalid) {\n return false;\n }\n if (this.uploadChoice === 'uploadUrl') {\n Object.assign(config, {\n contentUrl: this.formGroup.value.contentUrl,\n markdownBinaryId: null\n });\n return true;\n }\n const fileFromForm = this.getFileFromFormValue(this.formGroup.value);\n if (fileFromForm && fileFromForm !== this.fileFromConfig) {\n try {\n const markdownBinaryId = await this.markdownService.uploadFile(fileFromForm);\n Object.assign(config, { markdownBinaryId, contentUrl: null });\n return true;\n } catch (e) {\n this.alert.danger(gettext('Unable to upload Markdown file.'), e?.data);\n return false;\n }\n }\n if (!fileFromForm) {\n Object.assign(config, { contentUrl: '/readme.md', markdownBinaryId: null });\n }\n return true;\n }\n\n async ngOnInit() {\n this.initForm();\n if (this.config.markdownBinaryId) {\n this.uploadChoice = 'uploadBinary';\n this.fileFromConfig = await this.markdownService.getFile(this.config.markdownBinaryId);\n this.formGroup.patchValue({\n droppedFile: [{ file: this.fileFromConfig, name: this.fileFromConfig.name }]\n });\n }\n }\n\n onChange(value: 'uploadBinary' | 'uploadUrl') {\n this.uploadChoice = value;\n this.formGroup.controls['uploadChoice'].patchValue(value);\n }\n\n private getFileFromFormValue(formValue: any): File | null {\n const binary: any[] = formValue?.droppedFile || [];\n return binary[0]?.file || null;\n }\n\n private initForm(): void {\n this.formGroup = this.formBuilder.group(\n {\n contentUrl: ['', [Validators.maxLength(2000)]],\n droppedFile: [\n null,\n [\n Validators.minLength(1),\n Validators.maxLength(1),\n C8yValidators.filesValidator({ maximumFileSizeInKb: 1000 })\n ]\n ],\n uploadChoice: [this.config.markdownBinaryId ? 'uploadBinary' : 'uploadUrl', []]\n },\n { validators: this.requireEitherBinaryOrUrl() }\n );\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n }\n\n private requireEitherBinaryOrUrl(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const url = control.get(`contentUrl`);\n const uploadBinary = control.get(`droppedFile`);\n\n const urlDefined = url && url.value !== undefined && url.value !== null;\n const uploadBinaryDefined =\n uploadBinary && uploadBinary.value !== undefined && uploadBinary.value !== null;\n\n const errors = {};\n if (this.uploadChoice === 'uploadBinary' && !uploadBinaryDefined) {\n // sets error\n const error = { required: true };\n uploadBinary.setErrors(Object.assign({}, uploadBinary.errors || {}, error));\n Object.assign(errors, error);\n } else {\n // remove previous error\n this.removeErrors(uploadBinary, ['required']);\n }\n\n if (this.uploadChoice === 'uploadUrl' && (!urlDefined || url.value === '')) {\n // sets error\n const error = { required: true };\n url.setErrors(Object.assign({}, url.errors || {}, error));\n Object.assign(errors, error);\n } else {\n // remove previous error\n this.removeErrors(url, ['required']);\n }\n\n return Object.keys(errors).length ? errors : null;\n };\n }\n\n private removeErrors(control: AbstractControl, errors: string[]): boolean {\n if (!control || !control.errors) {\n return false;\n }\n let removedError = false;\n for (const error of errors) {\n if (control.errors[error]) {\n removedError = true;\n delete control.errors[error];\n }\n }\n if (removedError) {\n control.setErrors(\n Object.keys(control.errors).length ? Object.assign({}, control.errors) : null\n );\n }\n return removedError;\n }\n}\n","<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Source' | translate }}</legend>\n <form [formGroup]=\"formGroup\" class=\"\">\n <div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label title=\"{{ 'Provide a file path' | translate }}\" class=\"c8y-radio radio-inline m-l-8\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n </label>\n </div>\n <ng-container [ngSwitch]=\"uploadChoice\">\n <div *ngSwitchCase=\"'uploadBinary'\">\n <c8y-form-group class=\"m-b-8\">\n <c8y-drop-area\n formControlName=\"droppedFile\"\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"1\"\n [accept]=\"'md'\"\n ></c8y-drop-area>\n </c8y-form-group>\n </div>\n <div *ngSwitchCase=\"'uploadUrl'\">\n <c8y-form-group class=\"m-b-8\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n formControlName=\"contentUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n />\n </div>\n </div>\n </c8y-form-group>\n </div>\n </ng-container>\n </form>\n</fieldset>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { IFetchOptions, FetchClient, IFetchResponse } from '@c8y/client';\nimport { AppStateService, 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 loading: boolean;\n markdown: string;\n contextPath: string;\n private readonly headers: any = { 'Content-Type': 'text/markdown', responseType: 'blob' };\n\n constructor(\n private appState: AppStateService,\n private client: FetchClient,\n private markdownWidgetService: MarkdownWidgetService\n ) {}\n\n async ngOnInit() {\n this.contextPath = this.appState.state.app.contextPath;\n if (this.config.markdownBinaryId) {\n const readmeContent = await (\n await this.markdownWidgetService.getFile(this.config.markdownBinaryId)\n ).text();\n this.markdown = readmeContent;\n } else if (this.config.contentUrl?.toLowerCase() === '/readme.md') {\n this.markdown = await this.getReadmeFileContent();\n } else {\n this.setContentFromUrl(this.config.contentUrl);\n }\n }\n\n setContentFromUrl(url: string) {\n const req = new XMLHttpRequest();\n\n req.onreadystatechange = () => this.render(req);\n req.addEventListener('load', () => this.render(req));\n req.open('GET', url);\n req.responseType = 'text';\n req.setRequestHeader('Accept', 'text/html');\n req.send();\n }\n\n private async render(req: XMLHttpRequest) {\n if (req.readyState === 4 && req.status === 200) {\n this.markdown = req.response;\n }\n }\n\n private async getReadmeFileContent(): Promise<string> {\n const readmeFile = await this.getReadmeFile();\n\n if (readmeFile.status === 200) {\n return await readmeFile.text();\n }\n return '';\n }\n\n private async getReadmeFile(): Promise<IFetchResponse> {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers\n };\n const result: IFetchResponse = await this.client.fetch(\n `/apps/${this.contextPath}${this.config.contentUrl}`,\n options\n );\n return result;\n }\n}\n","<div id=\"helpContent\" class=\"p-16 p-t-0 markdown-content\" [innerHTML]=\"markdown | markdownToHtml | async\"></div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3.MarkdownWidgetService"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-widgets-implementations-markdown.mjs","sources":["../../widgets/implementations/markdown/markdown-widget.service.ts","../../widgets/implementations/markdown/markdown-widget-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 { Injectable } from '@angular/core';\nimport { IManagedObjectBinary, InventoryBinaryService, InventoryService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { FilesService, AlertService } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable({ providedIn: 'root' })\nexport class MarkdownWidgetService {\n constructor(\n private fileService: FilesService,\n private inventory: InventoryService,\n private binary: InventoryBinaryService,\n private alert: AlertService,\n private translate: TranslateService\n ) {}\n\n async getFile(markdownBinaryId: string | null): Promise<File> {\n if (!markdownBinaryId) {\n return null;\n }\n\n try {\n const { data: markdownBinaryMo } = await this.inventory.detail(markdownBinaryId);\n const file = await this.fileService.getFile(markdownBinaryMo as IManagedObjectBinary);\n return file;\n } catch (e) {\n const text = this.translate.instant(\n gettext('Unable to retrieve binary with ID: {{ markdownBinaryId }}'),\n { markdownBinaryId }\n );\n this.alert.danger(text, e?.data);\n }\n\n return null;\n }\n\n async uploadFile(file: File): Promise<string> {\n const { data: mo } = await this.binary.create(file);\n return mo.id;\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlertService, C8yValidators, CoreModule, OnBeforeSave } from '@c8y/ngx-components';\nimport {\n AbstractControl,\n FormBuilder,\n FormGroup,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport { MarkdownWidgetConfig } from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\n\n@Component({\n selector: 'c8y-markdown-widget-config',\n templateUrl: './markdown-widget-config.component.html',\n standalone: true,\n imports: [CoreModule, ReactiveFormsModule]\n})\nexport class MarkdownWidgetConfigComponent implements OnInit, OnBeforeSave {\n @Input() config: MarkdownWidgetConfig;\n formGroup: FormGroup;\n fileFromConfig: File;\n uploadChoice: 'uploadBinary' | 'uploadUrl' = 'uploadUrl';\n loading = false;\n\n constructor(\n private formBuilder: FormBuilder,\n private form: NgForm,\n private alert: AlertService,\n private markdownService: MarkdownWidgetService\n ) {}\n\n async onBeforeSave(config?: MarkdownWidgetConfig): Promise<boolean> {\n if (this.formGroup.invalid) {\n return false;\n }\n if (this.uploadChoice === 'uploadUrl') {\n Object.assign(config, {\n contentUrl: this.formGroup.value.contentUrl,\n markdownBinaryId: null\n });\n return true;\n }\n const fileFromForm = this.getFileFromFormValue(this.formGroup.value);\n if (fileFromForm && fileFromForm !== this.fileFromConfig) {\n try {\n const markdownBinaryId = await this.markdownService.uploadFile(fileFromForm);\n Object.assign(config, { markdownBinaryId, contentUrl: null });\n return true;\n } catch (e) {\n this.alert.danger(gettext('Unable to upload Markdown file.'), e?.data);\n return false;\n }\n }\n if (!fileFromForm) {\n Object.assign(config, { contentUrl: '/readme.md', markdownBinaryId: null });\n }\n return true;\n }\n\n async ngOnInit() {\n this.initForm();\n if (this.config.markdownBinaryId) {\n this.uploadChoice = 'uploadBinary';\n this.fileFromConfig = await this.markdownService.getFile(this.config.markdownBinaryId);\n this.formGroup.patchValue({\n droppedFile: [{ file: this.fileFromConfig, name: this.fileFromConfig.name }]\n });\n }\n }\n\n onChange(value: 'uploadBinary' | 'uploadUrl') {\n this.uploadChoice = value;\n this.formGroup.controls['uploadChoice'].patchValue(value);\n }\n\n private getFileFromFormValue(formValue: any): File | null {\n const binary: any[] = formValue?.droppedFile || [];\n return binary[0]?.file || null;\n }\n\n private initForm(): void {\n this.formGroup = this.formBuilder.group(\n {\n contentUrl: ['', [Validators.maxLength(2000)]],\n droppedFile: [\n null,\n [\n Validators.minLength(1),\n Validators.maxLength(1),\n C8yValidators.filesValidator({ maximumFileSizeInKb: 1000 })\n ]\n ],\n uploadChoice: [this.config.markdownBinaryId ? 'uploadBinary' : 'uploadUrl', []]\n },\n { validators: this.requireEitherBinaryOrUrl() }\n );\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n }\n\n private requireEitherBinaryOrUrl(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const url = control.get(`contentUrl`);\n const uploadBinary = control.get(`droppedFile`);\n\n const urlDefined = url && url.value !== undefined && url.value !== null;\n const uploadBinaryDefined =\n uploadBinary && uploadBinary.value !== undefined && uploadBinary.value !== null;\n\n const errors = {};\n if (this.uploadChoice === 'uploadBinary' && !uploadBinaryDefined) {\n // sets error\n const error = { required: true };\n uploadBinary.setErrors(Object.assign({}, uploadBinary.errors || {}, error));\n Object.assign(errors, error);\n } else {\n // remove previous error\n this.removeErrors(uploadBinary, ['required']);\n }\n\n if (this.uploadChoice === 'uploadUrl' && (!urlDefined || url.value === '')) {\n // sets error\n const error = { required: true };\n url.setErrors(Object.assign({}, url.errors || {}, error));\n Object.assign(errors, error);\n } else {\n // remove previous error\n this.removeErrors(url, ['required']);\n }\n\n return Object.keys(errors).length ? errors : null;\n };\n }\n\n private removeErrors(control: AbstractControl, errors: string[]): boolean {\n if (!control || !control.errors) {\n return false;\n }\n let removedError = false;\n for (const error of errors) {\n if (control.errors[error]) {\n removedError = true;\n delete control.errors[error];\n }\n }\n if (removedError) {\n control.setErrors(\n Object.keys(control.errors).length ? Object.assign({}, control.errors) : null\n );\n }\n return removedError;\n }\n}\n","<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Source' | translate }}</legend>\n <form [formGroup]=\"formGroup\" class=\"\">\n <div class=\"form-group\">\n <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadBinary\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>{{ 'Upload a binary' | translate }}</span>\n </label>\n <label title=\"{{ 'Provide a file path' | translate }}\" class=\"c8y-radio radio-inline m-l-8\">\n <input\n #radio\n formControlName=\"uploadChoice\"\n type=\"radio\"\n value=\"uploadUrl\"\n name=\"uploadChoice\"\n (change)=\"onChange($event.target.value)\"\n />\n <span></span>\n <span>\n {{ 'Provide a file path' | translate }}\n </span>\n </label>\n </div>\n <ng-container [ngSwitch]=\"uploadChoice\">\n <div *ngSwitchCase=\"'uploadBinary'\">\n <c8y-form-group class=\"m-b-8\">\n <c8y-drop-area\n formControlName=\"droppedFile\"\n class=\"drop-area-sm\"\n [title]=\"'Drop file or click to browse' | translate\"\n [maxAllowedFiles]=\"1\"\n [accept]=\"'md'\"\n ></c8y-drop-area>\n </c8y-form-group>\n </div>\n <div *ngSwitchCase=\"'uploadUrl'\">\n <c8y-form-group class=\"m-b-8\">\n <div class=\"m-b-4 p-b-8\">\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <i c8yIcon=\"globe\"></i>\n </span>\n <input\n type=\"text\"\n class=\"form-control\"\n formControlName=\"contentUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n />\n </div>\n </div>\n </c8y-form-group>\n </div>\n </ng-container>\n </form>\n</fieldset>\n","import { Component, Input, OnInit } from '@angular/core';\nimport { IFetchOptions, FetchClient, IFetchResponse } from '@c8y/client';\nimport { AppStateService, 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 loading: boolean;\n markdown: string;\n contextPath: string;\n private readonly headers: any = { 'Content-Type': 'text/markdown', responseType: 'blob' };\n\n constructor(\n private appState: AppStateService,\n private client: FetchClient,\n private markdownWidgetService: MarkdownWidgetService\n ) {}\n\n async ngOnInit() {\n this.contextPath = this.appState.state.app.contextPath;\n if (this.config.markdownBinaryId) {\n const readmeContent = await (\n await this.markdownWidgetService.getFile(this.config.markdownBinaryId)\n ).text();\n this.markdown = readmeContent;\n } else if (this.config.contentUrl?.toLowerCase() === '/readme.md') {\n this.markdown = await this.getReadmeFileContent();\n } else {\n this.setContentFromUrl(this.config.contentUrl);\n }\n }\n\n setContentFromUrl(url: string) {\n const req = new XMLHttpRequest();\n\n req.onreadystatechange = () => this.render(req);\n req.addEventListener('load', () => this.render(req));\n req.open('GET', url);\n req.responseType = 'text';\n req.setRequestHeader('Accept', 'text/html');\n req.send();\n }\n\n private async render(req: XMLHttpRequest) {\n if (req.readyState === 4 && req.status === 200) {\n this.markdown = req.response;\n }\n }\n\n private async getReadmeFileContent(): Promise<string> {\n const readmeFile = await this.getReadmeFile();\n\n if (readmeFile.status === 200) {\n return await readmeFile.text();\n }\n return '';\n }\n\n private async getReadmeFile(): Promise<IFetchResponse> {\n const options: IFetchOptions = {\n method: 'GET',\n headers: this.headers\n };\n const result: IFetchResponse = await this.client.fetch(\n `/apps/${this.contextPath}${this.config.contentUrl}`,\n options\n );\n return result;\n }\n}\n","<div id=\"helpContent\" class=\"p-16 p-t-0 markdown-content\" [innerHTML]=\"markdown | markdownToHtml | async\"></div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3.MarkdownWidgetService"],"mappings":"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"}
@@ -73,7 +73,7 @@ class QuickLinksWidgetConfigAddLinkComponent {
73
73
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: QuickLinksWidgetConfigAddLinkComponent, decorators: [{
74
74
  type: Component,
75
75
  args: [{ selector: 'c8y-quick-links-widget-config-add-link', imports: [TooltipModule, C8yTranslatePipe, ReactiveFormsModule, ChangeIconComponent], template: "<form [formGroup]=\"addLinkFormGroup\">\n <div class=\"d-flex a-i-center gap-24\">\n <div class=\"form-group\">\n <label>{{ 'Icon' | translate }}</label>\n <c8y-change-icon\n class=\"form-control\"\n [currentIcon]=\"addLinkFormGroup.controls.icon.value\"\n (onButtonClick)=\"changeLinkIcon()\"\n ></c8y-change-icon>\n </div>\n <div class=\"form-group flex-grow\">\n <label for=\"ql-label\">{{ 'Label' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"ql-label\"\n type=\"text\"\n formControlName=\"label\"\n maxlength=\"50\"\n [placeholder]=\"'e.g. my Quick Link' | translate\"\n />\n </div>\n </div>\n <div class=\"d-flex a-i-center gap-24\">\n <div class=\"form-group flex-grow\">\n <label for=\"ql-url\">{{ 'URL' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"ql-url\"\n type=\"text\"\n formControlName=\"url\"\n maxlength=\"150\"\n [placeholder]=\"'e.g. http://www.example.com' | translate\"\n />\n </div>\n <div class=\"form-group flex-noshrink\">\n <label>&nbsp;</label>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Open the link in a new browser tab' | translate }}\"\n >\n <input\n [attr.aria-label]=\"'Open in new tab' | translate\"\n type=\"checkbox\"\n formControlName=\"newTab\"\n checked=\"checked\"\n />\n <span></span>\n <span>{{ 'New tab' | translate }}</span>\n </label>\n </div>\n </div>\n</form>\n\n<button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n (click)=\"onCancel.emit()\"\n>\n {{ 'Cancel' | translate }}\n</button>\n<button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Create a quick link' | translate }}\"\n type=\"button\"\n (click)=\"createQuickLink()\"\n [disabled]=\"addLinkFormGroup.invalid\"\n>\n {{ 'Add quick link' | translate }}\n</button>\n" }]
76
- }] });
76
+ }], propDecorators: { onQuickLinkCreated: [{ type: i0.Output, args: ["onQuickLinkCreated"] }], onCancel: [{ type: i0.Output, args: ["onCancel"] }] } });
77
77
 
78
78
  /**
79
79
  * Service for managing quick links in Cockpit and Device Management applications.
@@ -528,7 +528,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
528
528
  IconDirective,
529
529
  C8yTranslatePipe
530
530
  ], providers: [AppHrefPipe, HumanizeAppNamePipe, RelativeUrlParserPipe], template: "@let links = config().links;\n@let pointerNoneStylesPreview = isPreview() ? { 'pointer-events': 'none' } : null;\n\n@if (config().displayOption === DisplayOption.GRID) {\n @if (links?.length) {\n <div class=\"card-group-block interact-grid border-top m-b-0\">\n @for (link of links; track link) {\n @let linkLabel = config().translateLinkLabels ? (link.label | translate) : link.label;\n <a\n class=\"card card--btn pointer\"\n [ngStyle]=\"pointerNoneStylesPreview\"\n [title]=\"linkLabel\"\n [ngClass]=\"{\n disabled: isPreview()\n }\"\n data-cy=\"c8y-quick-links-widget-view--quick-link-card\"\n [attr.role]=\"isPreview() ? null : 'button'\"\n [target]=\"!isPreview() && link.newTab ? '_blank' : '_self'\"\n [attr.rel]=\"isPreview() ? null : 'noopener noreferrer'\"\n [attr.href]=\"isPreview() ? null : (link.url | relativeUrlParser)\"\n >\n @if (link.newTab && !isPreview()) {\n <div\n class=\"card-actions showOnHover\"\n title=\"{{ 'Open in new tab' | translate }}\"\n >\n <span class=\"dropdown-toggle c8y-dropdown\">\n <i c8yIcon=\"external-link\"></i>\n </span>\n </div>\n }\n\n <div class=\"card-block text-center\">\n <div class=\"icon-32\">\n @if (link.icon) {\n <i\n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"link.icon\"\n ></i>\n } @else {\n <c8y-app-icon\n [name]=\"link.app.name\"\n [app]=\"link.app\"\n [contextPath]=\"link.app.contextPath\"\n ></c8y-app-icon>\n }\n </div>\n <small class=\"text-muted\">\n {{ linkLabel }}\n </small>\n </div>\n </a>\n }\n </div>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n} @else {\n @if (links?.length) {\n <div class=\"separator-top\">\n @for (link of links; track link) {\n @let linkLabel = config().translateLinkLabels ? (link.label | translate) : link.label;\n <a\n class=\"d-flex a-i-center btn-clean gap-8 p-16 text-truncate separator-bottom\"\n [ngStyle]=\"pointerNoneStylesPreview\"\n [title]=\"linkLabel\"\n data-cy=\"c8y-quick-links-widget-view--quick-link-list-item\"\n [attr.role]=\"isPreview() ? null : 'button'\"\n [target]=\"!isPreview() && link.newTab ? '_blank' : '_self'\"\n [attr.rel]=\"isPreview() ? null : 'noopener noreferrer'\"\n [attr.href]=\"isPreview() ? null : (link.url | relativeUrlParser)\"\n >\n @if (link.icon) {\n <i\n class=\"c8y-icon-duocolor icon-24\"\n [c8yIcon]=\"link.icon\"\n ></i>\n } @else {\n <c8y-app-icon\n [name]=\"link.app.name\"\n [app]=\"link.app\"\n [contextPath]=\"link.app.contextPath\"\n ></c8y-app-icon>\n }\n\n <span\n class=\"text-truncate\"\n [title]=\"linkLabel\"\n >\n {{ linkLabel }}\n </span>\n @if (link.newTab) {\n <i\n class=\"text-muted m-l-auto showOnHover\"\n [c8yIcon]=\"'external-link'\"\n title=\"{{ 'Open in new tab' | translate }}\"\n ></i>\n }\n </a>\n }\n </div>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n}\n" }]
531
- }] });
531
+ }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], isPreview: [{ type: i0.Input, args: [{ isSignal: true, alias: "isPreview", required: false }] }] } });
532
532
 
533
533
  class QuickLinksWidgetConfigListComponent {
534
534
  constructor() {
@@ -587,7 +587,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
587
587
  ChangeIconComponent,
588
588
  NgClass
589
589
  ], template: "<c8y-list-group\n class=\"cdk-droplist no-border-last separator-top\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"getQuickLinks().length < 2\"\n>\n <form\n class=\"d-contents\"\n [formGroup]=\"quickLinksForm()\"\n >\n <div\n class=\"d-contents\"\n [formArrayName]=\"'quickLinks'\"\n >\n @for (link of quickLinksFormArray().controls; track link; let i = $index) {\n @let linkValue = link.getRawValue();\n\n <c8y-li\n [dense]=\"true\"\n [formGroupName]=\"i\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-icon\n class=\"icon-24 p-relative changeIcon a-s-stretch\"\n [ngClass]=\"{\n 'm-l-16': getQuickLinks().length < 2\n }\"\n >\n @if (linkValue.icon) {\n <c8y-change-icon\n [currentIcon]=\"linkValue.icon\"\n (onButtonClick)=\"changeLinkIcon(link)\"\n ></c8y-change-icon>\n } @else {\n <c8y-change-icon (onButtonClick)=\"changeLinkIcon(link)\">\n <c8y-app-icon\n [name]=\"linkValue.app.name\"\n [app]=\"linkValue.app\"\n [contextPath]=\"linkValue.app.contextPath\"\n ></c8y-app-icon>\n </c8y-change-icon>\n }\n </c8y-li-icon>\n\n <div class=\"d-flex gap-8 a-i-center\">\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n formControlName=\"label\"\n [placeholder]=\"'e.g. my Quick Link' | translate\"\n />\n <span></span>\n </div>\n\n <button\n class=\"showOnHover btn-dot btn-dot--danger m-l-auto\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"top\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"removeLink(i)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <c8y-list-item-collapse>\n <div class=\"d-flex a-i-center gap-24\">\n <div class=\"form-group flex-grow\">\n <label for=\"ql-url\">{{ 'URL' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"ql-url\"\n type=\"text\"\n formControlName=\"url\"\n maxlength=\"150\"\n [placeholder]=\"'e.g. https://www.example.com' | translate\"\n />\n </div>\n <div class=\"form-group flex-noshrink\">\n <label>&nbsp;</label>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Open the link in a new browser tab' | translate }}\"\n >\n <input\n [attr.aria-label]=\"'Open in new tab' | translate\"\n type=\"checkbox\"\n formControlName=\"newTab\"\n checked=\"checked\"\n />\n <span></span>\n <span>{{ 'New tab' | translate }}</span>\n </label>\n </div>\n </div>\n </c8y-list-item-collapse>\n </c8y-li>\n }\n </div>\n </form>\n</c8y-list-group>\n" }]
590
- }] });
590
+ }], propDecorators: { quickLinksForm: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickLinksForm", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], quickLinksFormArray: [{ type: i0.Input, args: [{ isSignal: true, alias: "quickLinksFormArray", required: false }] }], appsNameChanged: [{ type: i0.Input, args: [{ isSignal: true, alias: "appsNameChanged", required: false }] }] } });
591
591
 
592
592
  class QuickLinksWidgetConfigComponent {
593
593
  constructor() {
@@ -717,7 +717,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
717
717
  IconDirective,
718
718
  CollapseModule
719
719
  ], providers: [DashboardChildComponent, DashboardComponent], template: "<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'General' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8 p-b-8\">\n <label class=\"m-b-0 text-label-small\">{{ 'Display as' | translate }}</label>\n <div class=\"c8y-select-wrapper form-group-sm\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n [(ngModel)]=\"selectedDisplayOption\"\n >\n <option [value]=\"DisplayOption.GRID\">\n {{ DisplayOption.GRID | translate }}\n </option>\n <option [value]=\"DisplayOption.LIST\">\n {{ DisplayOption.LIST | translate }}\n </option>\n </select>\n </div>\n <label\n class=\"c8y-checkbox m-l-auto\"\n title=\"{{ 'Translate labels if possible' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config().translateLinkLabels\"\n />\n <span></span>\n <span>{{ 'Translate labels if possible' | translate }}</span>\n </label>\n </div>\n</fieldset>\n\n<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Links' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8 p-b-8\">\n <button\n class=\"btn btn-clean btn-sm\"\n title=\"{{ 'Add a quick link' | translate }}\"\n type=\"button\"\n (click)=\"addLinkIsCollapsed = !addLinkIsCollapsed\"\n >\n <i [c8yIcon]=\"'plus-circle'\"></i>\n {{ 'Add a quick link' | translate }}\n </button>\n\n <button\n class=\"btn btn-clean btn-sm\"\n title=\"{{ 'Reset links' | translate }}\"\n [popover]=\"confirmPopover\"\n placement=\"bottom\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [outsideClick]=\"true\"\n #pop=\"bs-popover\"\n >\n <i [c8yIcon]=\"'reset'\"></i>\n {{ 'Reset links' | translate }}\n </button>\n <ng-template #confirmPopover>\n <p class=\"m-b-8\">\n {{\n 'Resetting links removes all custom links and resets the widget to its default state.'\n | translate\n }}\n </p>\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"pop.hide()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n (click)=\"resetLinks(); pop.hide()\"\n >\n {{ 'Reset links' | translate }}\n </button>\n </ng-template>\n </div>\n <div\n class=\"collapse bg.component\"\n #collapse=\"bs-collapse\"\n [collapse]=\"addLinkIsCollapsed\"\n [isAnimated]=\"true\"\n >\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Add a quick link' | translate }}</legend>\n <c8y-quick-links-widget-config-add-link\n class=\"d-block p-b-16 p-l-8 p-r-8\"\n (onQuickLinkCreated)=\"addQuickLink($event); addLinkIsCollapsed = true\"\n (onCancel)=\"addLinkIsCollapsed = true\"\n ></c8y-quick-links-widget-config-add-link>\n </fieldset>\n </div>\n\n @if (config().links.length) {\n <c8y-quick-links-widget-config-list\n class=\"separator-top\"\n [quickLinksForm]=\"quickLinksForm\"\n [config]=\"config()\"\n [quickLinksFormArray]=\"quickLinksFormArray\"\n [appsNameChanged]=\"appsNameChanged\"\n ></c8y-quick-links-widget-config-list>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display' | translate\"\n [horizontal]=\"true\"\n >\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Reset links' | translate }}\"\n type=\"button\"\n (click)=\"resetLinks()\"\n translate\n >\n Reset links\n </button>\n </div>\n </c8y-ui-empty-state>\n }\n</fieldset>\n\n<ng-template #quickLinksPreview>\n <c8y-quick-links-widget-view\n [config]=\"{\n links: getQuickLinks(),\n displayOption: selectedDisplayOption,\n translateLinkLabels: config().translateLinkLabels\n }\"\n [isPreview]=\"true\"\n ></c8y-quick-links-widget-view>\n</ng-template>\n" }]
720
- }], propDecorators: { previewSet: [{
720
+ }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], previewSet: [{
721
721
  type: ViewChild,
722
722
  args: ['quickLinksPreview']
723
723
  }] } });
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-widgets-implementations-quick-links.mjs","sources":["../../widgets/implementations/quick-links/quick-links.model.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-add-link.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-add-link.component.html","../../widgets/implementations/quick-links/quick-links.service.ts","../../widgets/implementations/quick-links/relative-url-parser.pipe.ts","../../widgets/implementations/quick-links/quick-links-widget-view/quick-links-widget-view.component.ts","../../widgets/implementations/quick-links/quick-links-widget-view/quick-links-widget-view.component.html","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-list.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-list.component.html","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config.component.html","../../widgets/implementations/quick-links/c8y-ngx-components-widgets-implementations-quick-links.ts"],"sourcesContent":["import { IApplication } from '@c8y/client';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { ValidationPattern } from '@c8y/ngx-components';\n\nexport interface IQuickLink {\n icon: string;\n label: string;\n url: string;\n newTab: boolean;\n app?: IApplication;\n}\n\nexport type QuickLinksConfig = {\n links: IQuickLink[];\n displayOption: DisplayOptionType;\n translateLinkLabels: boolean;\n};\n\nexport const QuickLinkDisplayOption = {\n GRID: 'Grid',\n LIST: 'List'\n} as const;\n\nexport type DisplayOptionType =\n (typeof QuickLinkDisplayOption)[keyof typeof QuickLinkDisplayOption];\n\nexport const DEFAULT_DISPLAY_OPTION_VALUE = QuickLinkDisplayOption.GRID;\nexport const DEFAULT_QUICK_LINK_ICON = 'link';\n\nexport const HELP_AND_SERVICE_WIDGET_ID = defaultWidgetIds.HELP_AND_SERVICE;\nexport const APPLICATIONS_WIDGET_ID = defaultWidgetIds.APPLICATIONS;\nexport const QUICK_LINKS_DEVICE_MANAGEMENT_ID = defaultWidgetIds.DEVICE_MANAGEMENT_WELCOME;\n\nexport type ConvertibleWidgetID =\n | typeof HELP_AND_SERVICE_WIDGET_ID\n | typeof APPLICATIONS_WIDGET_ID\n | typeof QUICK_LINKS_DEVICE_MANAGEMENT_ID;\n\nexport type DefaultDeviceManagementQuickLinkDefinition = {\n navPath: string[];\n overrides?: QuickLinkOverrides;\n};\ninterface QuickLinkOverrides {\n label?: string;\n icon?: string;\n url?: string;\n}\n\nexport const URL_VALIDATOR_PATTERN = ValidationPattern.rules.quickLinkUrl.pattern;\n\nexport type WidgetConversionConfig = {\n convertWidget: () => void;\n};\n","import { Component, inject, OnInit, output } from '@angular/core';\nimport { C8yTranslatePipe, ChangeIconComponent } from '@c8y/ngx-components';\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { IconSelectorService } from '@c8y/ngx-components/icon-selector';\nimport { DEFAULT_QUICK_LINK_ICON, IQuickLink, URL_VALIDATOR_PATTERN } from '../quick-links.model';\n\n@Component({\n selector: 'c8y-quick-links-widget-config-add-link',\n imports: [TooltipModule, C8yTranslatePipe, ReactiveFormsModule, ChangeIconComponent],\n templateUrl: './quick-links-widget-config-add-link.component.html'\n})\nexport class QuickLinksWidgetConfigAddLinkComponent implements OnInit {\n onQuickLinkCreated = output<IQuickLink>();\n onCancel = output<void>();\n\n addLinkFormGroup: ReturnType<QuickLinksWidgetConfigAddLinkComponent['initForm']>;\n\n private readonly iconSelector = inject(IconSelectorService);\n private readonly fb = inject(FormBuilder);\n\n ngOnInit() {\n this.addLinkFormGroup = this.initForm();\n }\n\n async changeLinkIcon(): Promise<void> {\n try {\n const newIcon = await this.iconSelector.selectIcon();\n this.addLinkFormGroup.controls.icon.setValue(newIcon);\n } catch {\n // nothing to do\n }\n }\n\n createQuickLink(): void {\n this.onQuickLinkCreated.emit(this.addLinkFormGroup.value as IQuickLink);\n\n this.addLinkFormGroup.reset();\n this.addLinkFormGroup.controls.icon.setValue(DEFAULT_QUICK_LINK_ICON);\n }\n\n private initForm() {\n const controls = {\n icon: [DEFAULT_QUICK_LINK_ICON, [Validators.required]],\n label: ['', [Validators.required, Validators.maxLength(50)]],\n url: ['', [Validators.required, Validators.pattern(URL_VALIDATOR_PATTERN)]],\n newTab: [false, [Validators.required]]\n };\n\n return this.fb.group(controls);\n }\n}\n","<form [formGroup]=\"addLinkFormGroup\">\n <div class=\"d-flex a-i-center gap-24\">\n <div class=\"form-group\">\n <label>{{ 'Icon' | translate }}</label>\n <c8y-change-icon\n class=\"form-control\"\n [currentIcon]=\"addLinkFormGroup.controls.icon.value\"\n (onButtonClick)=\"changeLinkIcon()\"\n ></c8y-change-icon>\n </div>\n <div class=\"form-group flex-grow\">\n <label for=\"ql-label\">{{ 'Label' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"ql-label\"\n type=\"text\"\n formControlName=\"label\"\n maxlength=\"50\"\n [placeholder]=\"'e.g. my Quick Link' | translate\"\n />\n </div>\n </div>\n <div class=\"d-flex a-i-center gap-24\">\n <div class=\"form-group flex-grow\">\n <label for=\"ql-url\">{{ 'URL' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"ql-url\"\n type=\"text\"\n formControlName=\"url\"\n maxlength=\"150\"\n [placeholder]=\"'e.g. http://www.example.com' | translate\"\n />\n </div>\n <div class=\"form-group flex-noshrink\">\n <label>&nbsp;</label>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Open the link in a new browser tab' | translate }}\"\n >\n <input\n [attr.aria-label]=\"'Open in new tab' | translate\"\n type=\"checkbox\"\n formControlName=\"newTab\"\n checked=\"checked\"\n />\n <span></span>\n <span>{{ 'New tab' | translate }}</span>\n </label>\n </div>\n </div>\n</form>\n\n<button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n (click)=\"onCancel.emit()\"\n>\n {{ 'Cancel' | translate }}\n</button>\n<button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Create a quick link' | translate }}\"\n type=\"button\"\n (click)=\"createQuickLink()\"\n [disabled]=\"addLinkFormGroup.invalid\"\n>\n {{ 'Add quick link' | translate }}\n</button>\n","import { inject, Injectable } from '@angular/core';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n DocLink,\n DocLinkWithLabel,\n DocsService,\n NavigatorNode,\n NavigatorService,\n sortByPriority\n} from '@c8y/ngx-components';\nimport { combineLatestWith, map, switchMap } from 'rxjs/operators';\nimport { DefaultDeviceManagementQuickLinkDefinition, IQuickLink } from './quick-links.model';\n\n/**\n * Service for managing quick links in Cockpit and Device Management applications.\n * It fetches, processes, and provides quick links to relevant documentation and navigation nodes.\n */\n@Injectable({ providedIn: 'root' })\nexport class QuickLinksService {\n private navNodes: NavigatorNode[];\n\n private readonly docsService = inject(DocsService);\n private readonly navigatorService = inject(NavigatorService);\n\n private readonly labelsToFilterOutInDeviceManagement = [\n 'Add user',\n 'Add device',\n 'Cockpit',\n 'Legal notices'\n ];\n\n /**\n * Retrieves the default quick links for Cockpit Application.\n *\n * @returns An observable emitting an array of quick links.\n */\n getDefaultQuickLinks$(): Observable<IQuickLink[]> {\n return this.getDocLinks$().pipe(\n map(docLinks =>\n docLinks.map(docLink => ({\n icon: docLink.icon,\n label: docLink.label,\n url: docLink.url,\n newTab: docLink.target === '_blank'\n }))\n )\n );\n }\n\n /**\n * Retrieves default quick links for Device Management Application\n *\n * @returns An observable emitting an array of quick links for device management.\n */\n getQuickLinksForDeviceManagement$(): Observable<IQuickLink[]> {\n return this.getSortedDocLinksForDeviceManagement().pipe(\n map(docLinks =>\n docLinks.map(docLink => ({\n icon: docLink.icon,\n label: docLink.label,\n url: docLink.url,\n newTab: docLink.target === '_blank'\n }))\n )\n );\n }\n\n /**\n * Fetches documentation links for Cockpit Application and sorts them by priority.\n *\n * @returns An observable emitting an array of documentation links.\n */\n private getDocLinks$(): Observable<DocLink[]> {\n return combineLatest([this.docsService.items$, this.navigatorService.items$]).pipe(\n map(([links, navigatorNodes]) => this.handleDocLinks([...links], navigatorNodes)),\n map(docLinks => sortByPriority(docLinks))\n );\n }\n\n /**\n * Processes and modifies documentation links.\n *\n * @param links - Array of documentation links.\n * @param navigatorNodes - Array of navigation nodes.\n *\n * @returns An array of processed documentation links.\n */\n private handleDocLinks(links: DocLink[], navigatorNodes: NavigatorNode[]): DocLink[] {\n const groupLink = this.createAddGroupDocLink(navigatorNodes);\n\n if (groupLink) {\n links.push(groupLink);\n }\n return this.replaceDocsLinksWithMainOne(links);\n }\n\n /**\n * Creates a quick link for adding a group if the \"Groups\" node is present.\n *\n * @param navigatorNodes - Array of navigation nodes.\n * @returns A `DocLink` for adding a group or `undefined`.\n */\n private createAddGroupDocLink(navigatorNodes: NavigatorNode[]): DocLink | undefined {\n let docLink: DocLink;\n const groupsNodeLabel = gettext('Groups');\n const groupsNode = this.findNavigatorNode(groupsNodeLabel, navigatorNodes);\n\n if (groupsNode) {\n docLink = {\n type: 'quicklink',\n icon: 'c8y-icon c8y-icon-group-add',\n label: gettext('Add group'),\n target: null,\n url: '/group?showAddGroup=true'\n };\n }\n return docLink;\n }\n\n /**\n * Retrieves additional documentation links related to device management.\n *\n * @returns An observable that emits a list of processed documentation links.\n */\n private getAdditionalDocLinksForDeviceManagement$(): Observable<DocLink[]> {\n return this.docsService.items$.pipe(\n map(docLinks => this.prepareDocLinksForDeviceManagement(docLinks))\n );\n }\n\n /**\n * Prepares documentation links by replacing some links with a main one and filtering out irrelevant links.\n *\n * @param links - The list of documentation links to process.\n * @returns The processed list of documentation links.\n */\n private prepareDocLinksForDeviceManagement(links: DocLink[]): DocLink[] {\n const _links = this.replaceDocsLinksWithMainOne(links);\n\n return this.filterOutDocsLinksForDeviceManagement(_links);\n }\n\n /**\n * Filters out documentation links that should not be included in device management.\n *\n * @param links - The list of documentation links to filter.\n * @returns The filtered list of documentation links.\n */\n private filterOutDocsLinksForDeviceManagement(links: DocLink[]): DocLink[] {\n const filteredLinks = links.filter(\n link =>\n !this.labelsToFilterOutInDeviceManagement.includes(link.label) &&\n !link.url.includes('/apps/')\n );\n\n const additionalLinks = this.docsService\n .getItemsFromHookDocs()\n .filter(doc => this.labelsToFilterOutInDeviceManagement.includes(doc.label));\n\n return sortByPriority([...filteredLinks, ...additionalLinks]);\n }\n\n /**\n * Replaces the first occurrence of a documentation link with a main user guide link.\n *\n * @param links - The list of documentation links to process.\n * @returns The modified list of documentation links.\n */\n private replaceDocsLinksWithMainOne(links: DocLink[]): DocLink[] {\n const DOCS_PATH = '/docs/';\n const docsLinkRegex = /\\/docs\\/(?!legal-notices)/;\n let firstDocsLink = true;\n return links.reduce((acc, link) => {\n const isDocsLink = link.url && docsLinkRegex.test(link.url);\n if (isDocsLink) {\n if (firstDocsLink) {\n firstDocsLink = false;\n // Replace the first /docs/ link with the main one\n acc.push({\n icon: 'book-shelf',\n label: gettext('User documentation'),\n url: this.docsService.getUserGuideLink(DOCS_PATH),\n type: 'doc',\n target: '_blank'\n } as DocLinkWithLabel);\n }\n } else {\n acc.push({\n ...link,\n target: this.isLinkForCurrentApp(link) ? null : '_blank'\n });\n }\n return acc;\n }, []);\n }\n\n /**\n * Checks if a URL is valid.\n *\n * @param url - The URL string to validate.\n * @returns `true` if the URL is valid, otherwise `false`.\n */\n private isValidURL(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Determines if a link belongs to the current application.\n *\n * @param link - The documentation link to check.\n * @returns `true` if the link is for the current app, otherwise `false`.\n */\n private isLinkForCurrentApp(link: DocLink): boolean {\n const { url } = link;\n if (!url) return false;\n\n if (!this.isValidURL(url)) {\n return !url.startsWith('/apps/');\n }\n return false;\n }\n\n /**\n * Finds a navigation node by its label.\n *\n * @param nodeName - Label of the node to find.\n * @param navNodes - Array of navigation nodes.\n *\n * @returns The found navigation node.\n */\n private findNavigatorNode(nodeName: string, navNodes: NavigatorNode[] = []): NavigatorNode {\n return navNodes.find((node: NavigatorNode) => node.label === nodeName);\n }\n\n /**\n * Retrieves the default quick links for device management.\n *\n * This method returns an array of predefined quick link definitions\n * used for navigation within the device management section of the application.\n *\n * Each quick link is defined by a navigation path (`navPath`), and optionally\n * includes override properties such as a custom label, icon, or URL.\n *\n * @returns An array of quick link definitions.\n */\n private getDefaultQuickLinksForDeviceManagement(): DefaultDeviceManagementQuickLinkDefinition[] {\n return [\n { navPath: ['Devices', 'All devices'] },\n { navPath: ['Devices', 'Registration'], overrides: { label: gettext('Register device') } },\n {\n navPath: ['Groups'],\n overrides: {\n label: gettext('Add group'),\n icon: 'c8y-group-add',\n url: '/group?showAddGroup=true'\n }\n },\n {\n navPath: ['Management', 'Device profiles'],\n overrides: { label: gettext('Add device profile') }\n },\n {\n navPath: ['Management', 'Software repository'],\n overrides: { label: gettext('Add software') }\n },\n {\n navPath: ['Management', 'Firmware repository'],\n overrides: { label: gettext('Add firmware') }\n }\n ];\n }\n\n /**\n * Fetches documentation links for Device Management Application and sorts them by priority.\n *\n * @returns An observable emitting an array of documentation links.\n */\n private getSortedDocLinksForDeviceManagement(): Observable<DocLink[]> {\n return this.navigatorService.items$.pipe(\n switchMap(navNodes => {\n return of(\n this.getDefaultQuickLinksForDeviceManagement()\n .map(({ navPath, overrides }) =>\n this.createDocLinkToNavNode(navPath, overrides, navNodes)\n )\n .filter(Boolean)\n );\n }),\n combineLatestWith(this.getAdditionalDocLinksForDeviceManagement$()),\n map(([links, additionalLinks]) => [...links, ...additionalLinks]),\n map(docLinks => sortByPriority(docLinks))\n );\n }\n\n /**\n * Creates a document link based on the given navigation node path labels.\n *\n * @param navNodePathLabels - An array of strings representing the path labels used to find the navigation node.\n * @param quickLinkOverrides - An optional partial object of `DocLink` properties that can override the defaults.\n * @param navNodes - An array of `NavigatorNode` objects to search within for the navigation node.\n *\n * @returns A `DocLink` object with the details of the found navigation node, or `undefined` if no matching node is found.\n */\n private createDocLinkToNavNode(\n navNodePathLabels: string[],\n quickLinkOverrides: Partial<DocLink> = {},\n navNodes: NavigatorNode[]\n ): DocLink | undefined {\n const navNode = this.findVisibleNavNode(navNodePathLabels, navNodes);\n\n if (!navNode) {\n return;\n }\n\n return {\n icon: navNode.icon,\n type: 'doc',\n label: navNode.label,\n priority: navNode.priority,\n url: this.ensureLeadingSlash(navNode.path),\n ...quickLinkOverrides\n } as DocLink;\n }\n\n /**\n * Ensures the given path starts with a leading slash.\n *\n * @param path - The path to check.\n * @returns The path with a leading slash.\n */\n private ensureLeadingSlash(path: string): string {\n return path.startsWith('/') ? path : `/${path}`;\n }\n\n /**\n * Recursively searches for a visible navigation node that matches the given path labels.\n *\n * @param navNodePathLabels - An array of labels representing the navigation path.\n * This array is mutated as elements are shifted during recursion.\n * @param navNodes - An array of `NavigatorNode` objects to search within. Defaults to `this.navNodes`.\n *\n * @returns The found `NavigatorNode`.\n */\n private findVisibleNavNode(\n navNodePathLabels: string[],\n navNodes: NavigatorNode[] = this.navNodes\n ): NavigatorNode {\n const currentLabel = navNodePathLabels.shift();\n const navNode = navNodes.find(navNode => !navNode.hidden && navNode.label === currentLabel);\n if (navNode && navNodePathLabels.length > 0) {\n return this.findVisibleNavNode(navNodePathLabels, navNode.children);\n }\n return navNode;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'relativeUrlParser'\n})\nexport class RelativeUrlParserPipe implements PipeTransform {\n transform(url: string): string {\n if (!url) {\n return '';\n }\n\n if (this.isAppUrl(url) || this.isFullUrl(url)) {\n return url;\n }\n\n if (this.isQueryParameter(url)) {\n return `${window.location.hash}${url}`;\n }\n\n if (this.isRelativeToBaseUrl(url)) {\n return url;\n }\n\n if (this.isRelativeUrl(url)) {\n return `#${url}`;\n }\n\n return url;\n }\n\n private isFullUrl(url: string): boolean {\n return url.startsWith('http') || url.startsWith('https');\n }\n\n private isRelativeToBaseUrl(url: string): boolean {\n return url.startsWith('#');\n }\n\n private isRelativeUrl(url: string): boolean {\n return url.startsWith('/');\n }\n\n private isAppUrl(url: string): boolean {\n return url.startsWith('/apps');\n }\n\n private isQueryParameter(url: string): boolean {\n return url.startsWith('?');\n }\n}\n","import { Component, inject, input, OnInit } from '@angular/core';\nimport {\n AppHrefPipe,\n AppIconComponent,\n AppSwitcherService,\n C8yTranslatePipe,\n DashboardChildComponent,\n EmptyStateComponent,\n HumanizeAppNamePipe,\n IconDirective\n} from '@c8y/ngx-components';\nimport { CommonModule as NgCommonModule } from '@angular/common';\n\nimport {\n APPLICATIONS_WIDGET_ID,\n ConvertibleWidgetID,\n DEFAULT_DISPLAY_OPTION_VALUE,\n DEFAULT_QUICK_LINK_ICON,\n QuickLinkDisplayOption,\n HELP_AND_SERVICE_WIDGET_ID,\n QUICK_LINKS_DEVICE_MANAGEMENT_ID,\n QuickLinksConfig,\n WidgetConversionConfig\n} from '../quick-links.model';\nimport { isEmpty } from 'lodash';\nimport { QuickLinksService } from '../quick-links.service';\nimport { RelativeUrlParserPipe } from '../relative-url-parser.pipe';\nimport { firstValueFrom, take } from 'rxjs';\n\n@Component({\n selector: 'c8y-quick-links-widget-view',\n imports: [\n NgCommonModule,\n AppIconComponent,\n RelativeUrlParserPipe,\n EmptyStateComponent,\n IconDirective,\n C8yTranslatePipe\n ],\n templateUrl: './quick-links-widget-view.component.html',\n providers: [AppHrefPipe, HumanizeAppNamePipe, RelativeUrlParserPipe]\n})\nexport class QuickLinksWidgetViewComponent implements OnInit {\n config = input<QuickLinksConfig>();\n isPreview = input<boolean>(false);\n\n protected readonly DEFAULT_QUICK_LINK_ICON = DEFAULT_QUICK_LINK_ICON;\n protected readonly DisplayOption = QuickLinkDisplayOption;\n\n private readonly quickLinksService = inject(QuickLinksService);\n private readonly dashboardChild = inject(DashboardChildComponent);\n private readonly appSwitcherService = inject(AppSwitcherService);\n private readonly appHrefPipe = inject(AppHrefPipe);\n private readonly humanizeAppNamePipe = inject(HumanizeAppNamePipe);\n\n ngOnInit(): void {\n this.convertLegacyWidget();\n }\n\n /**\n * The method is responsible for converting legacy widgets into their updated versions if a conversion is required.\n *\n * The widgets are being converted:\n * - Help and Service Widget\n * - Applications Widget\n * - Quick Links - Device Management Widget\n */\n private convertLegacyWidget(): void {\n if (!this.isConversionRequiredForWidget()) {\n return;\n }\n\n const widgetId: ConvertibleWidgetID = this.getWidgetId();\n\n const widgetConversionMap: Record<ConvertibleWidgetID, WidgetConversionConfig> = {\n [HELP_AND_SERVICE_WIDGET_ID]: {\n convertWidget: this.convertHelpAndServiceWidget.bind(this)\n },\n [APPLICATIONS_WIDGET_ID]: {\n convertWidget: this.convertApplicationsWidget.bind(this)\n },\n [QUICK_LINKS_DEVICE_MANAGEMENT_ID]: {\n convertWidget: this.convertDeviceManagementQuickLinksWidget.bind(this)\n }\n };\n\n const widget: WidgetConversionConfig = widgetConversionMap[widgetId];\n\n widget.convertWidget();\n }\n\n /**\n * Converts the Device Management Quick Links widget by assigning default quick links for the device management app\n * and updating the widget configuration with default options.\n */\n private convertDeviceManagementQuickLinksWidget(): void {\n this.quickLinksService\n .getQuickLinksForDeviceManagement$()\n .pipe(take(1))\n .subscribe(quickLinks => (this.config().links = quickLinks));\n\n this.config().displayOption = DEFAULT_DISPLAY_OPTION_VALUE;\n }\n\n /**\n * Converts the Applications widget by assigning default quick links\n * and updating the widget configuration with default options.\n */\n private convertApplicationsWidget(): void {\n this.appSwitcherService.apps$.pipe(take(1)).subscribe(\n async oneCloudApps =>\n (this.config().links = await Promise.all(\n oneCloudApps.map(async app => ({\n label: await firstValueFrom(this.humanizeAppNamePipe.transform(app)),\n url: this.appHrefPipe.transform(app),\n icon: null,\n newTab: false,\n app\n }))\n ))\n );\n\n this.config().displayOption = DEFAULT_DISPLAY_OPTION_VALUE;\n }\n\n /**\n * Converts the Help and Service widget by assigning default quick links\n * and updating the widget configuration with default options.\n */\n private convertHelpAndServiceWidget(): void {\n this.quickLinksService\n .getDefaultQuickLinks$()\n .pipe(take(1))\n .subscribe(quickLinks => (this.config().links = quickLinks));\n\n this.config().displayOption = DEFAULT_DISPLAY_OPTION_VALUE;\n }\n\n /**\n * Determines whether conversion is required for the widget.\n * Conversion is needed if the widget configuration is empty and a valid widget ID exists.\n *\n * @returns `true` if conversion is required, otherwise `false`.\n */\n private isConversionRequiredForWidget(): boolean {\n return isEmpty(this.config()) && !!this.getWidgetId();\n }\n\n /**\n * Retrieves the widget ID from the dashboard child data.\n * If `componentId` is available, it is returned; otherwise, the widget's `name` is used.\n *\n * @returns The widget ID as a `ConvertibleWidgetID`, based on `componentId` or `name`.\n */\n private getWidgetId(): ConvertibleWidgetID {\n return this.dashboardChild['data']?.componentId\n ? this.dashboardChild['data']?.componentId\n : this.dashboardChild['data']?.name;\n }\n}\n","@let links = config().links;\n@let pointerNoneStylesPreview = isPreview() ? { 'pointer-events': 'none' } : null;\n\n@if (config().displayOption === DisplayOption.GRID) {\n @if (links?.length) {\n <div class=\"card-group-block interact-grid border-top m-b-0\">\n @for (link of links; track link) {\n @let linkLabel = config().translateLinkLabels ? (link.label | translate) : link.label;\n <a\n class=\"card card--btn pointer\"\n [ngStyle]=\"pointerNoneStylesPreview\"\n [title]=\"linkLabel\"\n [ngClass]=\"{\n disabled: isPreview()\n }\"\n data-cy=\"c8y-quick-links-widget-view--quick-link-card\"\n [attr.role]=\"isPreview() ? null : 'button'\"\n [target]=\"!isPreview() && link.newTab ? '_blank' : '_self'\"\n [attr.rel]=\"isPreview() ? null : 'noopener noreferrer'\"\n [attr.href]=\"isPreview() ? null : (link.url | relativeUrlParser)\"\n >\n @if (link.newTab && !isPreview()) {\n <div\n class=\"card-actions showOnHover\"\n title=\"{{ 'Open in new tab' | translate }}\"\n >\n <span class=\"dropdown-toggle c8y-dropdown\">\n <i c8yIcon=\"external-link\"></i>\n </span>\n </div>\n }\n\n <div class=\"card-block text-center\">\n <div class=\"icon-32\">\n @if (link.icon) {\n <i\n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"link.icon\"\n ></i>\n } @else {\n <c8y-app-icon\n [name]=\"link.app.name\"\n [app]=\"link.app\"\n [contextPath]=\"link.app.contextPath\"\n ></c8y-app-icon>\n }\n </div>\n <small class=\"text-muted\">\n {{ linkLabel }}\n </small>\n </div>\n </a>\n }\n </div>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n} @else {\n @if (links?.length) {\n <div class=\"separator-top\">\n @for (link of links; track link) {\n @let linkLabel = config().translateLinkLabels ? (link.label | translate) : link.label;\n <a\n class=\"d-flex a-i-center btn-clean gap-8 p-16 text-truncate separator-bottom\"\n [ngStyle]=\"pointerNoneStylesPreview\"\n [title]=\"linkLabel\"\n data-cy=\"c8y-quick-links-widget-view--quick-link-list-item\"\n [attr.role]=\"isPreview() ? null : 'button'\"\n [target]=\"!isPreview() && link.newTab ? '_blank' : '_self'\"\n [attr.rel]=\"isPreview() ? null : 'noopener noreferrer'\"\n [attr.href]=\"isPreview() ? null : (link.url | relativeUrlParser)\"\n >\n @if (link.icon) {\n <i\n class=\"c8y-icon-duocolor icon-24\"\n [c8yIcon]=\"link.icon\"\n ></i>\n } @else {\n <c8y-app-icon\n [name]=\"link.app.name\"\n [app]=\"link.app\"\n [contextPath]=\"link.app.contextPath\"\n ></c8y-app-icon>\n }\n\n <span\n class=\"text-truncate\"\n [title]=\"linkLabel\"\n >\n {{ linkLabel }}\n </span>\n @if (link.newTab) {\n <i\n class=\"text-muted m-l-auto showOnHover\"\n [c8yIcon]=\"'external-link'\"\n title=\"{{ 'Open in new tab' | translate }}\"\n ></i>\n }\n </a>\n }\n </div>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n}\n","import { Component, inject, input, WritableSignal } from '@angular/core';\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\nimport {\n AppIconComponent,\n C8yTranslateModule,\n DynamicFormsModule,\n FormsModule,\n IconDirective,\n ListGroupModule,\n ChangeIconComponent\n} from '@c8y/ngx-components';\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { IQuickLink, QuickLinksConfig } from '../quick-links.model';\nimport { IconSelectorService } from '@c8y/ngx-components/icon-selector';\nimport { IApplication } from '@c8y/client';\nimport { NgClass } from '@angular/common';\n\n@Component({\n selector: 'c8y-quick-links-widget-config-list',\n host: {\n class: 'd-contents'\n },\n imports: [\n FormsModule,\n DragDropModule,\n TooltipModule,\n PopoverModule,\n ListGroupModule,\n DynamicFormsModule,\n AppIconComponent,\n C8yTranslateModule,\n IconDirective,\n ChangeIconComponent,\n NgClass\n ],\n templateUrl: './quick-links-widget-config-list.component.html'\n})\nexport class QuickLinksWidgetConfigListComponent {\n quickLinksForm = input<FormGroup>();\n config = input<QuickLinksConfig>();\n quickLinksFormArray = input<FormArray>();\n appsNameChanged = input<WritableSignal<IApplication[]>>();\n\n private readonly iconSelector = inject(IconSelectorService);\n\n drop(event: CdkDragDrop<IQuickLink[]>): void {\n moveItemInArray(this.config().links, event.previousIndex, event.currentIndex);\n moveItemInArray(this.quickLinksFormArray().controls, event.previousIndex, event.currentIndex);\n }\n\n async changeLinkIcon(linkForm: AbstractControl<any, any>): Promise<void> {\n try {\n const isIconPresent = !!linkForm.get('icon')?.value;\n const newIcon = await this.iconSelector.selectIcon();\n\n if (newIcon) {\n linkForm.patchValue({ icon: newIcon });\n this.config().links = this.getQuickLinks();\n }\n\n const isAppIconChange = !!linkForm.get('app')?.value;\n if (isAppIconChange && !isIconPresent) {\n this.appsNameChanged().update(apps => [...apps, linkForm.get('app')?.value]);\n }\n } catch {\n // Nothing to do if the user cancels icon selection\n }\n }\n\n removeLink(index: number): void {\n const quickLinksFormArray = this.quickLinksForm().get('quickLinks') as FormArray;\n quickLinksFormArray.removeAt(index);\n this.config().links = this.getQuickLinks();\n }\n\n getQuickLinks(): IQuickLink[] {\n return this.quickLinksForm().getRawValue().quickLinks as IQuickLink[];\n }\n}\n","<c8y-list-group\n class=\"cdk-droplist no-border-last separator-top\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"getQuickLinks().length < 2\"\n>\n <form\n class=\"d-contents\"\n [formGroup]=\"quickLinksForm()\"\n >\n <div\n class=\"d-contents\"\n [formArrayName]=\"'quickLinks'\"\n >\n @for (link of quickLinksFormArray().controls; track link; let i = $index) {\n @let linkValue = link.getRawValue();\n\n <c8y-li\n [dense]=\"true\"\n [formGroupName]=\"i\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-icon\n class=\"icon-24 p-relative changeIcon a-s-stretch\"\n [ngClass]=\"{\n 'm-l-16': getQuickLinks().length < 2\n }\"\n >\n @if (linkValue.icon) {\n <c8y-change-icon\n [currentIcon]=\"linkValue.icon\"\n (onButtonClick)=\"changeLinkIcon(link)\"\n ></c8y-change-icon>\n } @else {\n <c8y-change-icon (onButtonClick)=\"changeLinkIcon(link)\">\n <c8y-app-icon\n [name]=\"linkValue.app.name\"\n [app]=\"linkValue.app\"\n [contextPath]=\"linkValue.app.contextPath\"\n ></c8y-app-icon>\n </c8y-change-icon>\n }\n </c8y-li-icon>\n\n <div class=\"d-flex gap-8 a-i-center\">\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n formControlName=\"label\"\n [placeholder]=\"'e.g. my Quick Link' | translate\"\n />\n <span></span>\n </div>\n\n <button\n class=\"showOnHover btn-dot btn-dot--danger m-l-auto\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"top\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"removeLink(i)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <c8y-list-item-collapse>\n <div class=\"d-flex a-i-center gap-24\">\n <div class=\"form-group flex-grow\">\n <label for=\"ql-url\">{{ 'URL' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"ql-url\"\n type=\"text\"\n formControlName=\"url\"\n maxlength=\"150\"\n [placeholder]=\"'e.g. https://www.example.com' | translate\"\n />\n </div>\n <div class=\"form-group flex-noshrink\">\n <label>&nbsp;</label>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Open the link in a new browser tab' | translate }}\"\n >\n <input\n [attr.aria-label]=\"'Open in new tab' | translate\"\n type=\"checkbox\"\n formControlName=\"newTab\"\n checked=\"checked\"\n />\n <span></span>\n <span>{{ 'New tab' | translate }}</span>\n </label>\n </div>\n </div>\n </c8y-list-item-collapse>\n </c8y-li>\n }\n </div>\n </form>\n</c8y-list-group>\n","import {\n Component,\n inject,\n input,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n C8yTranslateModule,\n DashboardChildComponent,\n DashboardComponent,\n EmptyStateComponent,\n HumanizeAppNamePipe,\n InterAppService,\n ModalService,\n OnBeforeSave,\n Status,\n SupportedApps,\n IconDirective\n} from '@c8y/ngx-components';\nimport { CommonModule as NgCommonModule } from '@angular/common';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport {\n DEFAULT_DISPLAY_OPTION_VALUE,\n DEFAULT_QUICK_LINK_ICON,\n QuickLinkDisplayOption,\n DisplayOptionType,\n IQuickLink,\n QuickLinksConfig,\n URL_VALIDATOR_PATTERN\n} from '../quick-links.model';\nimport { QuickLinksWidgetConfigAddLinkComponent } from './quick-links-widget-config-add-link.component';\nimport { forkJoin, lastValueFrom, of, Subject, switchMap, take } from 'rxjs';\nimport { QuickLinksWidgetViewComponent } from '../quick-links-widget-view/quick-links-widget-view.component';\nimport { QuickLinksService } from '../quick-links.service';\nimport { IApplication } from '@c8y/client';\nimport { FormArray, FormBuilder, FormsModule, Validators } from '@angular/forms';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport {\n ContextDashboardService,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport { QuickLinksWidgetConfigListComponent } from './quick-links-widget-config-list.component';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'c8y-quick-links-widget-config',\n imports: [\n NgCommonModule,\n TooltipModule,\n PopoverModule,\n QuickLinksWidgetConfigAddLinkComponent,\n QuickLinksWidgetViewComponent,\n QuickLinksWidgetConfigListComponent,\n C8yTranslateModule,\n EmptyStateComponent,\n FormsModule,\n IconDirective,\n CollapseModule\n ],\n templateUrl: './quick-links-widget-config.component.html',\n providers: [DashboardChildComponent, DashboardComponent]\n})\nexport class QuickLinksWidgetConfigComponent implements OnInit, OnBeforeSave, OnDestroy {\n config = input<QuickLinksConfig>();\n\n quickLinksForm: ReturnType<QuickLinksWidgetConfigComponent['initForm']>;\n selectedDisplayOption: DisplayOptionType = DEFAULT_DISPLAY_OPTION_VALUE;\n appsNameChanged = signal<IApplication[]>([]);\n addLinkIsCollapsed = true;\n\n @ViewChild('quickLinksPreview')\n set previewSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private destroy$ = new Subject<void>();\n\n readonly DEFAULT_QUICK_LINK_ICON = DEFAULT_QUICK_LINK_ICON;\n readonly DisplayOption = QuickLinkDisplayOption;\n private readonly CHANGE_DEFAULT_ICON_LABEL = gettext('You have changed the quick link icon for:');\n private readonly SAVE_CHANGES_LABEL = gettext(\n 'Please note that this action is irreversible. Do you want to save your changes?'\n );\n\n get quickLinksFormArray(): FormArray {\n return this.quickLinksForm.get('quickLinks') as FormArray;\n }\n\n private readonly quickLinksService = inject(QuickLinksService);\n private readonly modalService = inject(ModalService);\n private readonly humanizeAppNamePipe = inject(HumanizeAppNamePipe);\n private readonly interAppService = inject(InterAppService);\n private readonly formBuilder = inject(FormBuilder);\n private readonly contextDashboardService = inject(ContextDashboardService);\n private readonly translateService = inject(TranslateService);\n private readonly widgetConfigService = inject(WidgetConfigService);\n\n ngOnInit(): void {\n this.onInitConfig();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n getQuickLinks(): IQuickLink[] {\n return this.quickLinksForm.getRawValue().quickLinks as IQuickLink[];\n }\n\n addQuickLink(link: IQuickLink): void {\n const quickLinkForm = this.formBuilder.group({\n icon: [link?.icon],\n label: [link?.label || '', [Validators.required, Validators.maxLength(50)]],\n url: [link?.url || '', [Validators.required, Validators.pattern(URL_VALIDATOR_PATTERN)]],\n newTab: [link?.newTab || false],\n app: [link?.app]\n });\n\n this.quickLinksFormArray.push(quickLinkForm);\n\n this.config().links = this.getQuickLinks();\n }\n\n async onBeforeSave(config?: QuickLinksConfig): Promise<boolean> {\n try {\n await this.confirmAppIconChanges();\n\n config.links = this.getQuickLinks();\n config.displayOption = this.selectedDisplayOption;\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n assignLinksToConfig(): void {\n this.interAppService\n .isCurrentApp$(SupportedApps.devicemanagement)\n .pipe(\n take(1),\n switchMap(isDeviceManagement =>\n isDeviceManagement\n ? this.quickLinksService.getQuickLinksForDeviceManagement$()\n : this.quickLinksService.getDefaultQuickLinks$()\n )\n )\n .subscribe(quickLinks => (this.config().links = quickLinks));\n }\n\n resetLinks(): void {\n this.quickLinksForm = this.initForm();\n this.assignLinksToConfig();\n this.config().links.forEach(link => this.addQuickLink(link));\n }\n\n private onInitConfig(): void {\n this.setupQuickLinksForm();\n\n if (!this.config().links) {\n this.assignLinksToConfig();\n }\n\n this.config().links.forEach(link => this.addQuickLink(link));\n\n if (!this.config().displayOption) {\n this.config().displayOption = this.selectedDisplayOption;\n return;\n }\n this.selectedDisplayOption = this.config().displayOption;\n }\n\n private setupQuickLinksForm(): void {\n this.quickLinksForm = this.initForm();\n\n this.quickLinksForm.statusChanges\n .pipe(debounceTime(30), takeUntil(this.destroy$))\n .subscribe(status => (this.contextDashboardService.formDisabled$ = of(status === 'INVALID')));\n }\n\n private async confirmAppIconChanges(): Promise<void> {\n if (this.appsNameChanged().length > 0) {\n const appNameObservables = this.appsNameChanged().map(app =>\n this.humanizeAppNamePipe.transform(app).pipe(take(1))\n );\n\n const appNames = await lastValueFrom(forkJoin(appNameObservables));\n\n const CHANGE_DEFAULT_ICON_LABEL_TRANSLATED = this.translateService.instant(\n this.CHANGE_DEFAULT_ICON_LABEL\n );\n const SAVE_CHANGES_LABEL_TRANSLATED = this.translateService.instant(this.SAVE_CHANGES_LABEL);\n\n const modalMessage = `${CHANGE_DEFAULT_ICON_LABEL_TRANSLATED} ${appNames.join(', ')}. ${SAVE_CHANGES_LABEL_TRANSLATED}`;\n\n await this.modalService.confirm(\n gettext('Confirm Quick Link Icon Change'),\n modalMessage,\n Status.INFO,\n {\n ok: gettext('Save')\n }\n );\n }\n }\n\n private initForm() {\n return this.formBuilder.group({\n quickLinks: this.formBuilder.array([])\n });\n }\n}\n","<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'General' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8 p-b-8\">\n <label class=\"m-b-0 text-label-small\">{{ 'Display as' | translate }}</label>\n <div class=\"c8y-select-wrapper form-group-sm\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n [(ngModel)]=\"selectedDisplayOption\"\n >\n <option [value]=\"DisplayOption.GRID\">\n {{ DisplayOption.GRID | translate }}\n </option>\n <option [value]=\"DisplayOption.LIST\">\n {{ DisplayOption.LIST | translate }}\n </option>\n </select>\n </div>\n <label\n class=\"c8y-checkbox m-l-auto\"\n title=\"{{ 'Translate labels if possible' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config().translateLinkLabels\"\n />\n <span></span>\n <span>{{ 'Translate labels if possible' | translate }}</span>\n </label>\n </div>\n</fieldset>\n\n<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Links' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8 p-b-8\">\n <button\n class=\"btn btn-clean btn-sm\"\n title=\"{{ 'Add a quick link' | translate }}\"\n type=\"button\"\n (click)=\"addLinkIsCollapsed = !addLinkIsCollapsed\"\n >\n <i [c8yIcon]=\"'plus-circle'\"></i>\n {{ 'Add a quick link' | translate }}\n </button>\n\n <button\n class=\"btn btn-clean btn-sm\"\n title=\"{{ 'Reset links' | translate }}\"\n [popover]=\"confirmPopover\"\n placement=\"bottom\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [outsideClick]=\"true\"\n #pop=\"bs-popover\"\n >\n <i [c8yIcon]=\"'reset'\"></i>\n {{ 'Reset links' | translate }}\n </button>\n <ng-template #confirmPopover>\n <p class=\"m-b-8\">\n {{\n 'Resetting links removes all custom links and resets the widget to its default state.'\n | translate\n }}\n </p>\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"pop.hide()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n (click)=\"resetLinks(); pop.hide()\"\n >\n {{ 'Reset links' | translate }}\n </button>\n </ng-template>\n </div>\n <div\n class=\"collapse bg.component\"\n #collapse=\"bs-collapse\"\n [collapse]=\"addLinkIsCollapsed\"\n [isAnimated]=\"true\"\n >\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Add a quick link' | translate }}</legend>\n <c8y-quick-links-widget-config-add-link\n class=\"d-block p-b-16 p-l-8 p-r-8\"\n (onQuickLinkCreated)=\"addQuickLink($event); addLinkIsCollapsed = true\"\n (onCancel)=\"addLinkIsCollapsed = true\"\n ></c8y-quick-links-widget-config-add-link>\n </fieldset>\n </div>\n\n @if (config().links.length) {\n <c8y-quick-links-widget-config-list\n class=\"separator-top\"\n [quickLinksForm]=\"quickLinksForm\"\n [config]=\"config()\"\n [quickLinksFormArray]=\"quickLinksFormArray\"\n [appsNameChanged]=\"appsNameChanged\"\n ></c8y-quick-links-widget-config-list>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display' | translate\"\n [horizontal]=\"true\"\n >\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Reset links' | translate }}\"\n type=\"button\"\n (click)=\"resetLinks()\"\n translate\n >\n Reset links\n </button>\n </div>\n </c8y-ui-empty-state>\n }\n</fieldset>\n\n<ng-template #quickLinksPreview>\n <c8y-quick-links-widget-view\n [config]=\"{\n links: getQuickLinks(),\n displayOption: selectedDisplayOption,\n translateLinkLabels: config().translateLinkLabels\n }\"\n [isPreview]=\"true\"\n ></c8y-quick-links-widget-view>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgCommonModule","i1","switchMap","FormsModule","i3","i4"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-widgets-implementations-quick-links.mjs","sources":["../../widgets/implementations/quick-links/quick-links.model.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-add-link.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-add-link.component.html","../../widgets/implementations/quick-links/quick-links.service.ts","../../widgets/implementations/quick-links/relative-url-parser.pipe.ts","../../widgets/implementations/quick-links/quick-links-widget-view/quick-links-widget-view.component.ts","../../widgets/implementations/quick-links/quick-links-widget-view/quick-links-widget-view.component.html","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-list.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-list.component.html","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config.component.html","../../widgets/implementations/quick-links/c8y-ngx-components-widgets-implementations-quick-links.ts"],"sourcesContent":["import { IApplication } from '@c8y/client';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { ValidationPattern } from '@c8y/ngx-components';\n\nexport interface IQuickLink {\n icon: string;\n label: string;\n url: string;\n newTab: boolean;\n app?: IApplication;\n}\n\nexport type QuickLinksConfig = {\n links: IQuickLink[];\n displayOption: DisplayOptionType;\n translateLinkLabels: boolean;\n};\n\nexport const QuickLinkDisplayOption = {\n GRID: 'Grid',\n LIST: 'List'\n} as const;\n\nexport type DisplayOptionType =\n (typeof QuickLinkDisplayOption)[keyof typeof QuickLinkDisplayOption];\n\nexport const DEFAULT_DISPLAY_OPTION_VALUE = QuickLinkDisplayOption.GRID;\nexport const DEFAULT_QUICK_LINK_ICON = 'link';\n\nexport const HELP_AND_SERVICE_WIDGET_ID = defaultWidgetIds.HELP_AND_SERVICE;\nexport const APPLICATIONS_WIDGET_ID = defaultWidgetIds.APPLICATIONS;\nexport const QUICK_LINKS_DEVICE_MANAGEMENT_ID = defaultWidgetIds.DEVICE_MANAGEMENT_WELCOME;\n\nexport type ConvertibleWidgetID =\n | typeof HELP_AND_SERVICE_WIDGET_ID\n | typeof APPLICATIONS_WIDGET_ID\n | typeof QUICK_LINKS_DEVICE_MANAGEMENT_ID;\n\nexport type DefaultDeviceManagementQuickLinkDefinition = {\n navPath: string[];\n overrides?: QuickLinkOverrides;\n};\ninterface QuickLinkOverrides {\n label?: string;\n icon?: string;\n url?: string;\n}\n\nexport const URL_VALIDATOR_PATTERN = ValidationPattern.rules.quickLinkUrl.pattern;\n\nexport type WidgetConversionConfig = {\n convertWidget: () => void;\n};\n","import { Component, inject, OnInit, output } from '@angular/core';\nimport { C8yTranslatePipe, ChangeIconComponent } from '@c8y/ngx-components';\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { IconSelectorService } from '@c8y/ngx-components/icon-selector';\nimport { DEFAULT_QUICK_LINK_ICON, IQuickLink, URL_VALIDATOR_PATTERN } from '../quick-links.model';\n\n@Component({\n selector: 'c8y-quick-links-widget-config-add-link',\n imports: [TooltipModule, C8yTranslatePipe, ReactiveFormsModule, ChangeIconComponent],\n templateUrl: './quick-links-widget-config-add-link.component.html'\n})\nexport class QuickLinksWidgetConfigAddLinkComponent implements OnInit {\n onQuickLinkCreated = output<IQuickLink>();\n onCancel = output<void>();\n\n addLinkFormGroup: ReturnType<QuickLinksWidgetConfigAddLinkComponent['initForm']>;\n\n private readonly iconSelector = inject(IconSelectorService);\n private readonly fb = inject(FormBuilder);\n\n ngOnInit() {\n this.addLinkFormGroup = this.initForm();\n }\n\n async changeLinkIcon(): Promise<void> {\n try {\n const newIcon = await this.iconSelector.selectIcon();\n this.addLinkFormGroup.controls.icon.setValue(newIcon);\n } catch {\n // nothing to do\n }\n }\n\n createQuickLink(): void {\n this.onQuickLinkCreated.emit(this.addLinkFormGroup.value as IQuickLink);\n\n this.addLinkFormGroup.reset();\n this.addLinkFormGroup.controls.icon.setValue(DEFAULT_QUICK_LINK_ICON);\n }\n\n private initForm() {\n const controls = {\n icon: [DEFAULT_QUICK_LINK_ICON, [Validators.required]],\n label: ['', [Validators.required, Validators.maxLength(50)]],\n url: ['', [Validators.required, Validators.pattern(URL_VALIDATOR_PATTERN)]],\n newTab: [false, [Validators.required]]\n };\n\n return this.fb.group(controls);\n }\n}\n","<form [formGroup]=\"addLinkFormGroup\">\n <div class=\"d-flex a-i-center gap-24\">\n <div class=\"form-group\">\n <label>{{ 'Icon' | translate }}</label>\n <c8y-change-icon\n class=\"form-control\"\n [currentIcon]=\"addLinkFormGroup.controls.icon.value\"\n (onButtonClick)=\"changeLinkIcon()\"\n ></c8y-change-icon>\n </div>\n <div class=\"form-group flex-grow\">\n <label for=\"ql-label\">{{ 'Label' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"ql-label\"\n type=\"text\"\n formControlName=\"label\"\n maxlength=\"50\"\n [placeholder]=\"'e.g. my Quick Link' | translate\"\n />\n </div>\n </div>\n <div class=\"d-flex a-i-center gap-24\">\n <div class=\"form-group flex-grow\">\n <label for=\"ql-url\">{{ 'URL' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"ql-url\"\n type=\"text\"\n formControlName=\"url\"\n maxlength=\"150\"\n [placeholder]=\"'e.g. http://www.example.com' | translate\"\n />\n </div>\n <div class=\"form-group flex-noshrink\">\n <label>&nbsp;</label>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Open the link in a new browser tab' | translate }}\"\n >\n <input\n [attr.aria-label]=\"'Open in new tab' | translate\"\n type=\"checkbox\"\n formControlName=\"newTab\"\n checked=\"checked\"\n />\n <span></span>\n <span>{{ 'New tab' | translate }}</span>\n </label>\n </div>\n </div>\n</form>\n\n<button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n (click)=\"onCancel.emit()\"\n>\n {{ 'Cancel' | translate }}\n</button>\n<button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Create a quick link' | translate }}\"\n type=\"button\"\n (click)=\"createQuickLink()\"\n [disabled]=\"addLinkFormGroup.invalid\"\n>\n {{ 'Add quick link' | translate }}\n</button>\n","import { inject, Injectable } from '@angular/core';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n DocLink,\n DocLinkWithLabel,\n DocsService,\n NavigatorNode,\n NavigatorService,\n sortByPriority\n} from '@c8y/ngx-components';\nimport { combineLatestWith, map, switchMap } from 'rxjs/operators';\nimport { DefaultDeviceManagementQuickLinkDefinition, IQuickLink } from './quick-links.model';\n\n/**\n * Service for managing quick links in Cockpit and Device Management applications.\n * It fetches, processes, and provides quick links to relevant documentation and navigation nodes.\n */\n@Injectable({ providedIn: 'root' })\nexport class QuickLinksService {\n private navNodes: NavigatorNode[];\n\n private readonly docsService = inject(DocsService);\n private readonly navigatorService = inject(NavigatorService);\n\n private readonly labelsToFilterOutInDeviceManagement = [\n 'Add user',\n 'Add device',\n 'Cockpit',\n 'Legal notices'\n ];\n\n /**\n * Retrieves the default quick links for Cockpit Application.\n *\n * @returns An observable emitting an array of quick links.\n */\n getDefaultQuickLinks$(): Observable<IQuickLink[]> {\n return this.getDocLinks$().pipe(\n map(docLinks =>\n docLinks.map(docLink => ({\n icon: docLink.icon,\n label: docLink.label,\n url: docLink.url,\n newTab: docLink.target === '_blank'\n }))\n )\n );\n }\n\n /**\n * Retrieves default quick links for Device Management Application\n *\n * @returns An observable emitting an array of quick links for device management.\n */\n getQuickLinksForDeviceManagement$(): Observable<IQuickLink[]> {\n return this.getSortedDocLinksForDeviceManagement().pipe(\n map(docLinks =>\n docLinks.map(docLink => ({\n icon: docLink.icon,\n label: docLink.label,\n url: docLink.url,\n newTab: docLink.target === '_blank'\n }))\n )\n );\n }\n\n /**\n * Fetches documentation links for Cockpit Application and sorts them by priority.\n *\n * @returns An observable emitting an array of documentation links.\n */\n private getDocLinks$(): Observable<DocLink[]> {\n return combineLatest([this.docsService.items$, this.navigatorService.items$]).pipe(\n map(([links, navigatorNodes]) => this.handleDocLinks([...links], navigatorNodes)),\n map(docLinks => sortByPriority(docLinks))\n );\n }\n\n /**\n * Processes and modifies documentation links.\n *\n * @param links - Array of documentation links.\n * @param navigatorNodes - Array of navigation nodes.\n *\n * @returns An array of processed documentation links.\n */\n private handleDocLinks(links: DocLink[], navigatorNodes: NavigatorNode[]): DocLink[] {\n const groupLink = this.createAddGroupDocLink(navigatorNodes);\n\n if (groupLink) {\n links.push(groupLink);\n }\n return this.replaceDocsLinksWithMainOne(links);\n }\n\n /**\n * Creates a quick link for adding a group if the \"Groups\" node is present.\n *\n * @param navigatorNodes - Array of navigation nodes.\n * @returns A `DocLink` for adding a group or `undefined`.\n */\n private createAddGroupDocLink(navigatorNodes: NavigatorNode[]): DocLink | undefined {\n let docLink: DocLink;\n const groupsNodeLabel = gettext('Groups');\n const groupsNode = this.findNavigatorNode(groupsNodeLabel, navigatorNodes);\n\n if (groupsNode) {\n docLink = {\n type: 'quicklink',\n icon: 'c8y-icon c8y-icon-group-add',\n label: gettext('Add group'),\n target: null,\n url: '/group?showAddGroup=true'\n };\n }\n return docLink;\n }\n\n /**\n * Retrieves additional documentation links related to device management.\n *\n * @returns An observable that emits a list of processed documentation links.\n */\n private getAdditionalDocLinksForDeviceManagement$(): Observable<DocLink[]> {\n return this.docsService.items$.pipe(\n map(docLinks => this.prepareDocLinksForDeviceManagement(docLinks))\n );\n }\n\n /**\n * Prepares documentation links by replacing some links with a main one and filtering out irrelevant links.\n *\n * @param links - The list of documentation links to process.\n * @returns The processed list of documentation links.\n */\n private prepareDocLinksForDeviceManagement(links: DocLink[]): DocLink[] {\n const _links = this.replaceDocsLinksWithMainOne(links);\n\n return this.filterOutDocsLinksForDeviceManagement(_links);\n }\n\n /**\n * Filters out documentation links that should not be included in device management.\n *\n * @param links - The list of documentation links to filter.\n * @returns The filtered list of documentation links.\n */\n private filterOutDocsLinksForDeviceManagement(links: DocLink[]): DocLink[] {\n const filteredLinks = links.filter(\n link =>\n !this.labelsToFilterOutInDeviceManagement.includes(link.label) &&\n !link.url.includes('/apps/')\n );\n\n const additionalLinks = this.docsService\n .getItemsFromHookDocs()\n .filter(doc => this.labelsToFilterOutInDeviceManagement.includes(doc.label));\n\n return sortByPriority([...filteredLinks, ...additionalLinks]);\n }\n\n /**\n * Replaces the first occurrence of a documentation link with a main user guide link.\n *\n * @param links - The list of documentation links to process.\n * @returns The modified list of documentation links.\n */\n private replaceDocsLinksWithMainOne(links: DocLink[]): DocLink[] {\n const DOCS_PATH = '/docs/';\n const docsLinkRegex = /\\/docs\\/(?!legal-notices)/;\n let firstDocsLink = true;\n return links.reduce((acc, link) => {\n const isDocsLink = link.url && docsLinkRegex.test(link.url);\n if (isDocsLink) {\n if (firstDocsLink) {\n firstDocsLink = false;\n // Replace the first /docs/ link with the main one\n acc.push({\n icon: 'book-shelf',\n label: gettext('User documentation'),\n url: this.docsService.getUserGuideLink(DOCS_PATH),\n type: 'doc',\n target: '_blank'\n } as DocLinkWithLabel);\n }\n } else {\n acc.push({\n ...link,\n target: this.isLinkForCurrentApp(link) ? null : '_blank'\n });\n }\n return acc;\n }, []);\n }\n\n /**\n * Checks if a URL is valid.\n *\n * @param url - The URL string to validate.\n * @returns `true` if the URL is valid, otherwise `false`.\n */\n private isValidURL(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Determines if a link belongs to the current application.\n *\n * @param link - The documentation link to check.\n * @returns `true` if the link is for the current app, otherwise `false`.\n */\n private isLinkForCurrentApp(link: DocLink): boolean {\n const { url } = link;\n if (!url) return false;\n\n if (!this.isValidURL(url)) {\n return !url.startsWith('/apps/');\n }\n return false;\n }\n\n /**\n * Finds a navigation node by its label.\n *\n * @param nodeName - Label of the node to find.\n * @param navNodes - Array of navigation nodes.\n *\n * @returns The found navigation node.\n */\n private findNavigatorNode(nodeName: string, navNodes: NavigatorNode[] = []): NavigatorNode {\n return navNodes.find((node: NavigatorNode) => node.label === nodeName);\n }\n\n /**\n * Retrieves the default quick links for device management.\n *\n * This method returns an array of predefined quick link definitions\n * used for navigation within the device management section of the application.\n *\n * Each quick link is defined by a navigation path (`navPath`), and optionally\n * includes override properties such as a custom label, icon, or URL.\n *\n * @returns An array of quick link definitions.\n */\n private getDefaultQuickLinksForDeviceManagement(): DefaultDeviceManagementQuickLinkDefinition[] {\n return [\n { navPath: ['Devices', 'All devices'] },\n { navPath: ['Devices', 'Registration'], overrides: { label: gettext('Register device') } },\n {\n navPath: ['Groups'],\n overrides: {\n label: gettext('Add group'),\n icon: 'c8y-group-add',\n url: '/group?showAddGroup=true'\n }\n },\n {\n navPath: ['Management', 'Device profiles'],\n overrides: { label: gettext('Add device profile') }\n },\n {\n navPath: ['Management', 'Software repository'],\n overrides: { label: gettext('Add software') }\n },\n {\n navPath: ['Management', 'Firmware repository'],\n overrides: { label: gettext('Add firmware') }\n }\n ];\n }\n\n /**\n * Fetches documentation links for Device Management Application and sorts them by priority.\n *\n * @returns An observable emitting an array of documentation links.\n */\n private getSortedDocLinksForDeviceManagement(): Observable<DocLink[]> {\n return this.navigatorService.items$.pipe(\n switchMap(navNodes => {\n return of(\n this.getDefaultQuickLinksForDeviceManagement()\n .map(({ navPath, overrides }) =>\n this.createDocLinkToNavNode(navPath, overrides, navNodes)\n )\n .filter(Boolean)\n );\n }),\n combineLatestWith(this.getAdditionalDocLinksForDeviceManagement$()),\n map(([links, additionalLinks]) => [...links, ...additionalLinks]),\n map(docLinks => sortByPriority(docLinks))\n );\n }\n\n /**\n * Creates a document link based on the given navigation node path labels.\n *\n * @param navNodePathLabels - An array of strings representing the path labels used to find the navigation node.\n * @param quickLinkOverrides - An optional partial object of `DocLink` properties that can override the defaults.\n * @param navNodes - An array of `NavigatorNode` objects to search within for the navigation node.\n *\n * @returns A `DocLink` object with the details of the found navigation node, or `undefined` if no matching node is found.\n */\n private createDocLinkToNavNode(\n navNodePathLabels: string[],\n quickLinkOverrides: Partial<DocLink> = {},\n navNodes: NavigatorNode[]\n ): DocLink | undefined {\n const navNode = this.findVisibleNavNode(navNodePathLabels, navNodes);\n\n if (!navNode) {\n return;\n }\n\n return {\n icon: navNode.icon,\n type: 'doc',\n label: navNode.label,\n priority: navNode.priority,\n url: this.ensureLeadingSlash(navNode.path),\n ...quickLinkOverrides\n } as DocLink;\n }\n\n /**\n * Ensures the given path starts with a leading slash.\n *\n * @param path - The path to check.\n * @returns The path with a leading slash.\n */\n private ensureLeadingSlash(path: string): string {\n return path.startsWith('/') ? path : `/${path}`;\n }\n\n /**\n * Recursively searches for a visible navigation node that matches the given path labels.\n *\n * @param navNodePathLabels - An array of labels representing the navigation path.\n * This array is mutated as elements are shifted during recursion.\n * @param navNodes - An array of `NavigatorNode` objects to search within. Defaults to `this.navNodes`.\n *\n * @returns The found `NavigatorNode`.\n */\n private findVisibleNavNode(\n navNodePathLabels: string[],\n navNodes: NavigatorNode[] = this.navNodes\n ): NavigatorNode {\n const currentLabel = navNodePathLabels.shift();\n const navNode = navNodes.find(navNode => !navNode.hidden && navNode.label === currentLabel);\n if (navNode && navNodePathLabels.length > 0) {\n return this.findVisibleNavNode(navNodePathLabels, navNode.children);\n }\n return navNode;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'relativeUrlParser'\n})\nexport class RelativeUrlParserPipe implements PipeTransform {\n transform(url: string): string {\n if (!url) {\n return '';\n }\n\n if (this.isAppUrl(url) || this.isFullUrl(url)) {\n return url;\n }\n\n if (this.isQueryParameter(url)) {\n return `${window.location.hash}${url}`;\n }\n\n if (this.isRelativeToBaseUrl(url)) {\n return url;\n }\n\n if (this.isRelativeUrl(url)) {\n return `#${url}`;\n }\n\n return url;\n }\n\n private isFullUrl(url: string): boolean {\n return url.startsWith('http') || url.startsWith('https');\n }\n\n private isRelativeToBaseUrl(url: string): boolean {\n return url.startsWith('#');\n }\n\n private isRelativeUrl(url: string): boolean {\n return url.startsWith('/');\n }\n\n private isAppUrl(url: string): boolean {\n return url.startsWith('/apps');\n }\n\n private isQueryParameter(url: string): boolean {\n return url.startsWith('?');\n }\n}\n","import { Component, inject, input, OnInit } from '@angular/core';\nimport {\n AppHrefPipe,\n AppIconComponent,\n AppSwitcherService,\n C8yTranslatePipe,\n DashboardChildComponent,\n EmptyStateComponent,\n HumanizeAppNamePipe,\n IconDirective\n} from '@c8y/ngx-components';\nimport { CommonModule as NgCommonModule } from '@angular/common';\n\nimport {\n APPLICATIONS_WIDGET_ID,\n ConvertibleWidgetID,\n DEFAULT_DISPLAY_OPTION_VALUE,\n DEFAULT_QUICK_LINK_ICON,\n QuickLinkDisplayOption,\n HELP_AND_SERVICE_WIDGET_ID,\n QUICK_LINKS_DEVICE_MANAGEMENT_ID,\n QuickLinksConfig,\n WidgetConversionConfig\n} from '../quick-links.model';\nimport { isEmpty } from 'lodash';\nimport { QuickLinksService } from '../quick-links.service';\nimport { RelativeUrlParserPipe } from '../relative-url-parser.pipe';\nimport { firstValueFrom, take } from 'rxjs';\n\n@Component({\n selector: 'c8y-quick-links-widget-view',\n imports: [\n NgCommonModule,\n AppIconComponent,\n RelativeUrlParserPipe,\n EmptyStateComponent,\n IconDirective,\n C8yTranslatePipe\n ],\n templateUrl: './quick-links-widget-view.component.html',\n providers: [AppHrefPipe, HumanizeAppNamePipe, RelativeUrlParserPipe]\n})\nexport class QuickLinksWidgetViewComponent implements OnInit {\n config = input<QuickLinksConfig>();\n isPreview = input<boolean>(false);\n\n protected readonly DEFAULT_QUICK_LINK_ICON = DEFAULT_QUICK_LINK_ICON;\n protected readonly DisplayOption = QuickLinkDisplayOption;\n\n private readonly quickLinksService = inject(QuickLinksService);\n private readonly dashboardChild = inject(DashboardChildComponent);\n private readonly appSwitcherService = inject(AppSwitcherService);\n private readonly appHrefPipe = inject(AppHrefPipe);\n private readonly humanizeAppNamePipe = inject(HumanizeAppNamePipe);\n\n ngOnInit(): void {\n this.convertLegacyWidget();\n }\n\n /**\n * The method is responsible for converting legacy widgets into their updated versions if a conversion is required.\n *\n * The widgets are being converted:\n * - Help and Service Widget\n * - Applications Widget\n * - Quick Links - Device Management Widget\n */\n private convertLegacyWidget(): void {\n if (!this.isConversionRequiredForWidget()) {\n return;\n }\n\n const widgetId: ConvertibleWidgetID = this.getWidgetId();\n\n const widgetConversionMap: Record<ConvertibleWidgetID, WidgetConversionConfig> = {\n [HELP_AND_SERVICE_WIDGET_ID]: {\n convertWidget: this.convertHelpAndServiceWidget.bind(this)\n },\n [APPLICATIONS_WIDGET_ID]: {\n convertWidget: this.convertApplicationsWidget.bind(this)\n },\n [QUICK_LINKS_DEVICE_MANAGEMENT_ID]: {\n convertWidget: this.convertDeviceManagementQuickLinksWidget.bind(this)\n }\n };\n\n const widget: WidgetConversionConfig = widgetConversionMap[widgetId];\n\n widget.convertWidget();\n }\n\n /**\n * Converts the Device Management Quick Links widget by assigning default quick links for the device management app\n * and updating the widget configuration with default options.\n */\n private convertDeviceManagementQuickLinksWidget(): void {\n this.quickLinksService\n .getQuickLinksForDeviceManagement$()\n .pipe(take(1))\n .subscribe(quickLinks => (this.config().links = quickLinks));\n\n this.config().displayOption = DEFAULT_DISPLAY_OPTION_VALUE;\n }\n\n /**\n * Converts the Applications widget by assigning default quick links\n * and updating the widget configuration with default options.\n */\n private convertApplicationsWidget(): void {\n this.appSwitcherService.apps$.pipe(take(1)).subscribe(\n async oneCloudApps =>\n (this.config().links = await Promise.all(\n oneCloudApps.map(async app => ({\n label: await firstValueFrom(this.humanizeAppNamePipe.transform(app)),\n url: this.appHrefPipe.transform(app),\n icon: null,\n newTab: false,\n app\n }))\n ))\n );\n\n this.config().displayOption = DEFAULT_DISPLAY_OPTION_VALUE;\n }\n\n /**\n * Converts the Help and Service widget by assigning default quick links\n * and updating the widget configuration with default options.\n */\n private convertHelpAndServiceWidget(): void {\n this.quickLinksService\n .getDefaultQuickLinks$()\n .pipe(take(1))\n .subscribe(quickLinks => (this.config().links = quickLinks));\n\n this.config().displayOption = DEFAULT_DISPLAY_OPTION_VALUE;\n }\n\n /**\n * Determines whether conversion is required for the widget.\n * Conversion is needed if the widget configuration is empty and a valid widget ID exists.\n *\n * @returns `true` if conversion is required, otherwise `false`.\n */\n private isConversionRequiredForWidget(): boolean {\n return isEmpty(this.config()) && !!this.getWidgetId();\n }\n\n /**\n * Retrieves the widget ID from the dashboard child data.\n * If `componentId` is available, it is returned; otherwise, the widget's `name` is used.\n *\n * @returns The widget ID as a `ConvertibleWidgetID`, based on `componentId` or `name`.\n */\n private getWidgetId(): ConvertibleWidgetID {\n return this.dashboardChild['data']?.componentId\n ? this.dashboardChild['data']?.componentId\n : this.dashboardChild['data']?.name;\n }\n}\n","@let links = config().links;\n@let pointerNoneStylesPreview = isPreview() ? { 'pointer-events': 'none' } : null;\n\n@if (config().displayOption === DisplayOption.GRID) {\n @if (links?.length) {\n <div class=\"card-group-block interact-grid border-top m-b-0\">\n @for (link of links; track link) {\n @let linkLabel = config().translateLinkLabels ? (link.label | translate) : link.label;\n <a\n class=\"card card--btn pointer\"\n [ngStyle]=\"pointerNoneStylesPreview\"\n [title]=\"linkLabel\"\n [ngClass]=\"{\n disabled: isPreview()\n }\"\n data-cy=\"c8y-quick-links-widget-view--quick-link-card\"\n [attr.role]=\"isPreview() ? null : 'button'\"\n [target]=\"!isPreview() && link.newTab ? '_blank' : '_self'\"\n [attr.rel]=\"isPreview() ? null : 'noopener noreferrer'\"\n [attr.href]=\"isPreview() ? null : (link.url | relativeUrlParser)\"\n >\n @if (link.newTab && !isPreview()) {\n <div\n class=\"card-actions showOnHover\"\n title=\"{{ 'Open in new tab' | translate }}\"\n >\n <span class=\"dropdown-toggle c8y-dropdown\">\n <i c8yIcon=\"external-link\"></i>\n </span>\n </div>\n }\n\n <div class=\"card-block text-center\">\n <div class=\"icon-32\">\n @if (link.icon) {\n <i\n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"link.icon\"\n ></i>\n } @else {\n <c8y-app-icon\n [name]=\"link.app.name\"\n [app]=\"link.app\"\n [contextPath]=\"link.app.contextPath\"\n ></c8y-app-icon>\n }\n </div>\n <small class=\"text-muted\">\n {{ linkLabel }}\n </small>\n </div>\n </a>\n }\n </div>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n} @else {\n @if (links?.length) {\n <div class=\"separator-top\">\n @for (link of links; track link) {\n @let linkLabel = config().translateLinkLabels ? (link.label | translate) : link.label;\n <a\n class=\"d-flex a-i-center btn-clean gap-8 p-16 text-truncate separator-bottom\"\n [ngStyle]=\"pointerNoneStylesPreview\"\n [title]=\"linkLabel\"\n data-cy=\"c8y-quick-links-widget-view--quick-link-list-item\"\n [attr.role]=\"isPreview() ? null : 'button'\"\n [target]=\"!isPreview() && link.newTab ? '_blank' : '_self'\"\n [attr.rel]=\"isPreview() ? null : 'noopener noreferrer'\"\n [attr.href]=\"isPreview() ? null : (link.url | relativeUrlParser)\"\n >\n @if (link.icon) {\n <i\n class=\"c8y-icon-duocolor icon-24\"\n [c8yIcon]=\"link.icon\"\n ></i>\n } @else {\n <c8y-app-icon\n [name]=\"link.app.name\"\n [app]=\"link.app\"\n [contextPath]=\"link.app.contextPath\"\n ></c8y-app-icon>\n }\n\n <span\n class=\"text-truncate\"\n [title]=\"linkLabel\"\n >\n {{ linkLabel }}\n </span>\n @if (link.newTab) {\n <i\n class=\"text-muted m-l-auto showOnHover\"\n [c8yIcon]=\"'external-link'\"\n title=\"{{ 'Open in new tab' | translate }}\"\n ></i>\n }\n </a>\n }\n </div>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n}\n","import { Component, inject, input, WritableSignal } from '@angular/core';\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\nimport {\n AppIconComponent,\n C8yTranslateModule,\n DynamicFormsModule,\n FormsModule,\n IconDirective,\n ListGroupModule,\n ChangeIconComponent\n} from '@c8y/ngx-components';\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { IQuickLink, QuickLinksConfig } from '../quick-links.model';\nimport { IconSelectorService } from '@c8y/ngx-components/icon-selector';\nimport { IApplication } from '@c8y/client';\nimport { NgClass } from '@angular/common';\n\n@Component({\n selector: 'c8y-quick-links-widget-config-list',\n host: {\n class: 'd-contents'\n },\n imports: [\n FormsModule,\n DragDropModule,\n TooltipModule,\n PopoverModule,\n ListGroupModule,\n DynamicFormsModule,\n AppIconComponent,\n C8yTranslateModule,\n IconDirective,\n ChangeIconComponent,\n NgClass\n ],\n templateUrl: './quick-links-widget-config-list.component.html'\n})\nexport class QuickLinksWidgetConfigListComponent {\n quickLinksForm = input<FormGroup>();\n config = input<QuickLinksConfig>();\n quickLinksFormArray = input<FormArray>();\n appsNameChanged = input<WritableSignal<IApplication[]>>();\n\n private readonly iconSelector = inject(IconSelectorService);\n\n drop(event: CdkDragDrop<IQuickLink[]>): void {\n moveItemInArray(this.config().links, event.previousIndex, event.currentIndex);\n moveItemInArray(this.quickLinksFormArray().controls, event.previousIndex, event.currentIndex);\n }\n\n async changeLinkIcon(linkForm: AbstractControl<any, any>): Promise<void> {\n try {\n const isIconPresent = !!linkForm.get('icon')?.value;\n const newIcon = await this.iconSelector.selectIcon();\n\n if (newIcon) {\n linkForm.patchValue({ icon: newIcon });\n this.config().links = this.getQuickLinks();\n }\n\n const isAppIconChange = !!linkForm.get('app')?.value;\n if (isAppIconChange && !isIconPresent) {\n this.appsNameChanged().update(apps => [...apps, linkForm.get('app')?.value]);\n }\n } catch {\n // Nothing to do if the user cancels icon selection\n }\n }\n\n removeLink(index: number): void {\n const quickLinksFormArray = this.quickLinksForm().get('quickLinks') as FormArray;\n quickLinksFormArray.removeAt(index);\n this.config().links = this.getQuickLinks();\n }\n\n getQuickLinks(): IQuickLink[] {\n return this.quickLinksForm().getRawValue().quickLinks as IQuickLink[];\n }\n}\n","<c8y-list-group\n class=\"cdk-droplist no-border-last separator-top\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"getQuickLinks().length < 2\"\n>\n <form\n class=\"d-contents\"\n [formGroup]=\"quickLinksForm()\"\n >\n <div\n class=\"d-contents\"\n [formArrayName]=\"'quickLinks'\"\n >\n @for (link of quickLinksFormArray().controls; track link; let i = $index) {\n @let linkValue = link.getRawValue();\n\n <c8y-li\n [dense]=\"true\"\n [formGroupName]=\"i\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-icon\n class=\"icon-24 p-relative changeIcon a-s-stretch\"\n [ngClass]=\"{\n 'm-l-16': getQuickLinks().length < 2\n }\"\n >\n @if (linkValue.icon) {\n <c8y-change-icon\n [currentIcon]=\"linkValue.icon\"\n (onButtonClick)=\"changeLinkIcon(link)\"\n ></c8y-change-icon>\n } @else {\n <c8y-change-icon (onButtonClick)=\"changeLinkIcon(link)\">\n <c8y-app-icon\n [name]=\"linkValue.app.name\"\n [app]=\"linkValue.app\"\n [contextPath]=\"linkValue.app.contextPath\"\n ></c8y-app-icon>\n </c8y-change-icon>\n }\n </c8y-li-icon>\n\n <div class=\"d-flex gap-8 a-i-center\">\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n formControlName=\"label\"\n [placeholder]=\"'e.g. my Quick Link' | translate\"\n />\n <span></span>\n </div>\n\n <button\n class=\"showOnHover btn-dot btn-dot--danger m-l-auto\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"top\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"removeLink(i)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <c8y-list-item-collapse>\n <div class=\"d-flex a-i-center gap-24\">\n <div class=\"form-group flex-grow\">\n <label for=\"ql-url\">{{ 'URL' | translate }}</label>\n <input\n class=\"form-control\"\n id=\"ql-url\"\n type=\"text\"\n formControlName=\"url\"\n maxlength=\"150\"\n [placeholder]=\"'e.g. https://www.example.com' | translate\"\n />\n </div>\n <div class=\"form-group flex-noshrink\">\n <label>&nbsp;</label>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Open the link in a new browser tab' | translate }}\"\n >\n <input\n [attr.aria-label]=\"'Open in new tab' | translate\"\n type=\"checkbox\"\n formControlName=\"newTab\"\n checked=\"checked\"\n />\n <span></span>\n <span>{{ 'New tab' | translate }}</span>\n </label>\n </div>\n </div>\n </c8y-list-item-collapse>\n </c8y-li>\n }\n </div>\n </form>\n</c8y-list-group>\n","import {\n Component,\n inject,\n input,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n C8yTranslateModule,\n DashboardChildComponent,\n DashboardComponent,\n EmptyStateComponent,\n HumanizeAppNamePipe,\n InterAppService,\n ModalService,\n OnBeforeSave,\n Status,\n SupportedApps,\n IconDirective\n} from '@c8y/ngx-components';\nimport { CommonModule as NgCommonModule } from '@angular/common';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport {\n DEFAULT_DISPLAY_OPTION_VALUE,\n DEFAULT_QUICK_LINK_ICON,\n QuickLinkDisplayOption,\n DisplayOptionType,\n IQuickLink,\n QuickLinksConfig,\n URL_VALIDATOR_PATTERN\n} from '../quick-links.model';\nimport { QuickLinksWidgetConfigAddLinkComponent } from './quick-links-widget-config-add-link.component';\nimport { forkJoin, lastValueFrom, of, Subject, switchMap, take } from 'rxjs';\nimport { QuickLinksWidgetViewComponent } from '../quick-links-widget-view/quick-links-widget-view.component';\nimport { QuickLinksService } from '../quick-links.service';\nimport { IApplication } from '@c8y/client';\nimport { FormArray, FormBuilder, FormsModule, Validators } from '@angular/forms';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport {\n ContextDashboardService,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport { QuickLinksWidgetConfigListComponent } from './quick-links-widget-config-list.component';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'c8y-quick-links-widget-config',\n imports: [\n NgCommonModule,\n TooltipModule,\n PopoverModule,\n QuickLinksWidgetConfigAddLinkComponent,\n QuickLinksWidgetViewComponent,\n QuickLinksWidgetConfigListComponent,\n C8yTranslateModule,\n EmptyStateComponent,\n FormsModule,\n IconDirective,\n CollapseModule\n ],\n templateUrl: './quick-links-widget-config.component.html',\n providers: [DashboardChildComponent, DashboardComponent]\n})\nexport class QuickLinksWidgetConfigComponent implements OnInit, OnBeforeSave, OnDestroy {\n config = input<QuickLinksConfig>();\n\n quickLinksForm: ReturnType<QuickLinksWidgetConfigComponent['initForm']>;\n selectedDisplayOption: DisplayOptionType = DEFAULT_DISPLAY_OPTION_VALUE;\n appsNameChanged = signal<IApplication[]>([]);\n addLinkIsCollapsed = true;\n\n @ViewChild('quickLinksPreview')\n set previewSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private destroy$ = new Subject<void>();\n\n readonly DEFAULT_QUICK_LINK_ICON = DEFAULT_QUICK_LINK_ICON;\n readonly DisplayOption = QuickLinkDisplayOption;\n private readonly CHANGE_DEFAULT_ICON_LABEL = gettext('You have changed the quick link icon for:');\n private readonly SAVE_CHANGES_LABEL = gettext(\n 'Please note that this action is irreversible. Do you want to save your changes?'\n );\n\n get quickLinksFormArray(): FormArray {\n return this.quickLinksForm.get('quickLinks') as FormArray;\n }\n\n private readonly quickLinksService = inject(QuickLinksService);\n private readonly modalService = inject(ModalService);\n private readonly humanizeAppNamePipe = inject(HumanizeAppNamePipe);\n private readonly interAppService = inject(InterAppService);\n private readonly formBuilder = inject(FormBuilder);\n private readonly contextDashboardService = inject(ContextDashboardService);\n private readonly translateService = inject(TranslateService);\n private readonly widgetConfigService = inject(WidgetConfigService);\n\n ngOnInit(): void {\n this.onInitConfig();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n getQuickLinks(): IQuickLink[] {\n return this.quickLinksForm.getRawValue().quickLinks as IQuickLink[];\n }\n\n addQuickLink(link: IQuickLink): void {\n const quickLinkForm = this.formBuilder.group({\n icon: [link?.icon],\n label: [link?.label || '', [Validators.required, Validators.maxLength(50)]],\n url: [link?.url || '', [Validators.required, Validators.pattern(URL_VALIDATOR_PATTERN)]],\n newTab: [link?.newTab || false],\n app: [link?.app]\n });\n\n this.quickLinksFormArray.push(quickLinkForm);\n\n this.config().links = this.getQuickLinks();\n }\n\n async onBeforeSave(config?: QuickLinksConfig): Promise<boolean> {\n try {\n await this.confirmAppIconChanges();\n\n config.links = this.getQuickLinks();\n config.displayOption = this.selectedDisplayOption;\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n assignLinksToConfig(): void {\n this.interAppService\n .isCurrentApp$(SupportedApps.devicemanagement)\n .pipe(\n take(1),\n switchMap(isDeviceManagement =>\n isDeviceManagement\n ? this.quickLinksService.getQuickLinksForDeviceManagement$()\n : this.quickLinksService.getDefaultQuickLinks$()\n )\n )\n .subscribe(quickLinks => (this.config().links = quickLinks));\n }\n\n resetLinks(): void {\n this.quickLinksForm = this.initForm();\n this.assignLinksToConfig();\n this.config().links.forEach(link => this.addQuickLink(link));\n }\n\n private onInitConfig(): void {\n this.setupQuickLinksForm();\n\n if (!this.config().links) {\n this.assignLinksToConfig();\n }\n\n this.config().links.forEach(link => this.addQuickLink(link));\n\n if (!this.config().displayOption) {\n this.config().displayOption = this.selectedDisplayOption;\n return;\n }\n this.selectedDisplayOption = this.config().displayOption;\n }\n\n private setupQuickLinksForm(): void {\n this.quickLinksForm = this.initForm();\n\n this.quickLinksForm.statusChanges\n .pipe(debounceTime(30), takeUntil(this.destroy$))\n .subscribe(status => (this.contextDashboardService.formDisabled$ = of(status === 'INVALID')));\n }\n\n private async confirmAppIconChanges(): Promise<void> {\n if (this.appsNameChanged().length > 0) {\n const appNameObservables = this.appsNameChanged().map(app =>\n this.humanizeAppNamePipe.transform(app).pipe(take(1))\n );\n\n const appNames = await lastValueFrom(forkJoin(appNameObservables));\n\n const CHANGE_DEFAULT_ICON_LABEL_TRANSLATED = this.translateService.instant(\n this.CHANGE_DEFAULT_ICON_LABEL\n );\n const SAVE_CHANGES_LABEL_TRANSLATED = this.translateService.instant(this.SAVE_CHANGES_LABEL);\n\n const modalMessage = `${CHANGE_DEFAULT_ICON_LABEL_TRANSLATED} ${appNames.join(', ')}. ${SAVE_CHANGES_LABEL_TRANSLATED}`;\n\n await this.modalService.confirm(\n gettext('Confirm Quick Link Icon Change'),\n modalMessage,\n Status.INFO,\n {\n ok: gettext('Save')\n }\n );\n }\n }\n\n private initForm() {\n return this.formBuilder.group({\n quickLinks: this.formBuilder.array([])\n });\n }\n}\n","<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'General' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8 p-b-8\">\n <label class=\"m-b-0 text-label-small\">{{ 'Display as' | translate }}</label>\n <div class=\"c8y-select-wrapper form-group-sm\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n [(ngModel)]=\"selectedDisplayOption\"\n >\n <option [value]=\"DisplayOption.GRID\">\n {{ DisplayOption.GRID | translate }}\n </option>\n <option [value]=\"DisplayOption.LIST\">\n {{ DisplayOption.LIST | translate }}\n </option>\n </select>\n </div>\n <label\n class=\"c8y-checkbox m-l-auto\"\n title=\"{{ 'Translate labels if possible' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config().translateLinkLabels\"\n />\n <span></span>\n <span>{{ 'Translate labels if possible' | translate }}</span>\n </label>\n </div>\n</fieldset>\n\n<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Links' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8 p-b-8\">\n <button\n class=\"btn btn-clean btn-sm\"\n title=\"{{ 'Add a quick link' | translate }}\"\n type=\"button\"\n (click)=\"addLinkIsCollapsed = !addLinkIsCollapsed\"\n >\n <i [c8yIcon]=\"'plus-circle'\"></i>\n {{ 'Add a quick link' | translate }}\n </button>\n\n <button\n class=\"btn btn-clean btn-sm\"\n title=\"{{ 'Reset links' | translate }}\"\n [popover]=\"confirmPopover\"\n placement=\"bottom\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [outsideClick]=\"true\"\n #pop=\"bs-popover\"\n >\n <i [c8yIcon]=\"'reset'\"></i>\n {{ 'Reset links' | translate }}\n </button>\n <ng-template #confirmPopover>\n <p class=\"m-b-8\">\n {{\n 'Resetting links removes all custom links and resets the widget to its default state.'\n | translate\n }}\n </p>\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"pop.hide()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n (click)=\"resetLinks(); pop.hide()\"\n >\n {{ 'Reset links' | translate }}\n </button>\n </ng-template>\n </div>\n <div\n class=\"collapse bg.component\"\n #collapse=\"bs-collapse\"\n [collapse]=\"addLinkIsCollapsed\"\n [isAnimated]=\"true\"\n >\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Add a quick link' | translate }}</legend>\n <c8y-quick-links-widget-config-add-link\n class=\"d-block p-b-16 p-l-8 p-r-8\"\n (onQuickLinkCreated)=\"addQuickLink($event); addLinkIsCollapsed = true\"\n (onCancel)=\"addLinkIsCollapsed = true\"\n ></c8y-quick-links-widget-config-add-link>\n </fieldset>\n </div>\n\n @if (config().links.length) {\n <c8y-quick-links-widget-config-list\n class=\"separator-top\"\n [quickLinksForm]=\"quickLinksForm\"\n [config]=\"config()\"\n [quickLinksFormArray]=\"quickLinksFormArray\"\n [appsNameChanged]=\"appsNameChanged\"\n ></c8y-quick-links-widget-config-list>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display' | translate\"\n [horizontal]=\"true\"\n >\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Reset links' | translate }}\"\n type=\"button\"\n (click)=\"resetLinks()\"\n translate\n >\n Reset links\n </button>\n </div>\n </c8y-ui-empty-state>\n }\n</fieldset>\n\n<ng-template #quickLinksPreview>\n <c8y-quick-links-widget-view\n [config]=\"{\n links: getQuickLinks(),\n displayOption: selectedDisplayOption,\n translateLinkLabels: config().translateLinkLabels\n }\"\n [isPreview]=\"true\"\n ></c8y-quick-links-widget-view>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgCommonModule","i1","switchMap","FormsModule","i3","i4"],"mappings":"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"}