@c8y/ngx-components 1023.96.0 → 1023.97.4

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 (43) hide show
  1. package/alarms/index.d.ts.map +1 -1
  2. package/context-dashboard/device/view/index.d.ts +24 -1
  3. package/context-dashboard/device/view/index.d.ts.map +1 -1
  4. package/context-dashboard/index.d.ts +9 -3
  5. package/context-dashboard/index.d.ts.map +1 -1
  6. package/echart/index.d.ts.map +1 -1
  7. package/fesm2022/c8y-ngx-components-alarms.mjs +12 -5
  8. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs +21 -3
  10. package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-context-dashboard-devicemanagement.mjs +2 -2
  12. package/fesm2022/c8y-ngx-components-context-dashboard-devicemanagement.mjs.map +1 -1
  13. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +25 -15
  14. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  15. package/fesm2022/c8y-ngx-components-echart.mjs +52 -36
  16. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  17. package/fesm2022/c8y-ngx-components-map.mjs +15 -0
  18. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-upgrade.mjs +12 -1
  20. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +33 -9
  22. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs.map +1 -1
  23. package/fesm2022/c8y-ngx-components.mjs +30 -5
  24. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  25. package/index.d.ts +5 -0
  26. package/index.d.ts.map +1 -1
  27. package/locales/de.po +57 -3
  28. package/locales/es.po +57 -3
  29. package/locales/fr.po +57 -3
  30. package/locales/ja_JP.po +57 -3
  31. package/locales/ko.po +57 -3
  32. package/locales/locales.pot +9 -0
  33. package/locales/nl.po +57 -3
  34. package/locales/pl.po +57 -3
  35. package/locales/pt_BR.po +57 -3
  36. package/locales/zh_CN.po +57 -3
  37. package/locales/zh_TW.po +57 -3
  38. package/map/index.d.ts.map +1 -1
  39. package/package.json +1 -1
  40. package/upgrade/index.d.ts +1 -0
  41. package/upgrade/index.d.ts.map +1 -1
  42. package/widgets/implementations/quick-links/index.d.ts +3 -1
  43. package/widgets/implementations/quick-links/index.d.ts.map +1 -1
@@ -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 const hash = window.location.hash;\n if (hash.includes('?')) {\n return `${hash}&${url.substring(1)}`;\n }\n return `${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, 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, NgForm, Validators } from '@angular/forms';\nimport { WidgetConfigService } 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 translateService = inject(TranslateService);\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly parentForm = inject(NgForm, { optional: true });\n\n ngOnInit(): void {\n this.onInitConfig();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n\n if (this.parentForm) {\n this.parentForm.form.removeControl('quickLinks');\n }\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 if (this.parentForm) {\n this.parentForm.form.addControl('quickLinks', this.quickLinksForm);\n }\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\n/** Maximum length of a quick link URL, matching common browser and server URL limits. */\nexport const QUICK_LINK_URL_MAX_LENGTH = 2000;\n\nexport type WidgetConversionConfig = {\n convertWidget: () => void;\n};\n","import { Component, inject, OnInit, output } from '@angular/core';\nimport {\n C8yTranslatePipe,\n ChangeIconComponent,\n FormGroupComponent,\n MessageDirective,\n MessagesComponent\n} 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 {\n DEFAULT_QUICK_LINK_ICON,\n IQuickLink,\n QUICK_LINK_URL_MAX_LENGTH,\n URL_VALIDATOR_PATTERN\n} from '../quick-links.model';\n\n@Component({\n selector: 'c8y-quick-links-widget-config-add-link',\n imports: [\n TooltipModule,\n C8yTranslatePipe,\n ReactiveFormsModule,\n ChangeIconComponent,\n FormGroupComponent,\n MessagesComponent,\n MessageDirective\n ],\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: [\n '',\n [\n Validators.required,\n Validators.pattern(URL_VALIDATOR_PATTERN),\n Validators.maxLength(QUICK_LINK_URL_MAX_LENGTH)\n ]\n ],\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 <c8y-form-group class=\"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 [placeholder]=\"'e.g. http://www.example.com' | translate\"\n />\n <c8y-messages>\n <c8y-message\n name=\"maxlength\"\n [text]=\"'The URL must not exceed {{ requiredLength }} characters.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\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 const hash = window.location.hash;\n if (hash.includes('?')) {\n return `${hash}&${url.substring(1)}`;\n }\n return `${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 <c8y-form-group class=\"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 [placeholder]=\"'e.g. https://www.example.com' | translate\"\n />\n <c8y-messages>\n <c8y-message\n name=\"maxlength\"\n [text]=\"'The URL must not exceed {{ requiredLength }} characters.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\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 QUICK_LINK_URL_MAX_LENGTH,\n QuickLinksConfig,\n URL_VALIDATOR_PATTERN\n} from '../quick-links.model';\nimport { QuickLinksWidgetConfigAddLinkComponent } from './quick-links-widget-config-add-link.component';\nimport { forkJoin, lastValueFrom, 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, NgForm, Validators } from '@angular/forms';\nimport { WidgetConfigService } 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 translateService = inject(TranslateService);\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly parentForm = inject(NgForm, { optional: true });\n\n ngOnInit(): void {\n this.onInitConfig();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n\n if (this.parentForm) {\n this.parentForm.form.removeControl('quickLinks');\n }\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: [\n link?.url || '',\n [\n Validators.required,\n Validators.pattern(URL_VALIDATOR_PATTERN),\n Validators.maxLength(QUICK_LINK_URL_MAX_LENGTH)\n ]\n ],\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 {\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 if (this.parentForm) {\n this.parentForm.form.addControl('quickLinks', this.quickLinksForm);\n }\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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"}
@@ -5016,6 +5016,14 @@ class C8yComponentOutlet {
5016
5016
  if (this._needToReCreateComponentInstance(changes)) {
5017
5017
  this.__viewContainerRef.clear();
5018
5018
  this._componentRef = undefined;
5019
+ // Destroy the previous environment injector before creating a new one. The dynamically
5020
+ // created standalone component's own environment ("adapter" — holding its imported-module
5021
+ // providers, e.g. ngx-bootstrap's PositioningService with window 'resize'/'scroll'
5022
+ // listeners) is a CHILD of this injector, so ViewContainerRef.clear() alone does not free
5023
+ // it. Without this destroy(), every re-creation (each input change) leaks an environment
5024
+ // injector and everything it holds.
5025
+ this._newEnvInjector?.destroy();
5026
+ this._newEnvInjector = undefined;
5019
5027
  if (this.c8yComponentOutlet) {
5020
5028
  // creating a new injector ensures that the Angular Chrome extension properly shows the element hierarchy
5021
5029
  const injector = Injector.create({
@@ -23102,7 +23110,11 @@ class PluginsService {
23102
23110
  // self scoped plugins need to be added to excluded remotes
23103
23111
  // as they would be otherwise automatically added to remotes
23104
23112
  const selfScopedPlugins = this.getSelfScopedPlugins(pluginsArray, application.contextPath);
23105
- const newExcludedRemotes = this.addPluginToRemotesConfig(appConfigExcludedRemotes, selfScopedPlugins);
23113
+ const manifestPlugins = this.getManifestPlugins(pluginsArray, manifestRemotes);
23114
+ const newExcludedRemotes = this.addPluginToRemotesConfig(appConfigExcludedRemotes, [
23115
+ ...selfScopedPlugins,
23116
+ ...manifestPlugins
23117
+ ]);
23106
23118
  return await this.updateRemotesInAppConfig(application, newRemotes, newExcludedRemotes);
23107
23119
  }
23108
23120
  /**
@@ -23121,6 +23133,7 @@ class PluginsService {
23121
23133
  /**
23122
23134
  * Fetches the application manifest.
23123
23135
  * @param application Application managed object.
23136
+ * @deprecated This method is deprecated and should not be used anymore. It was used to fetch the manifest of an application to read the remotes field from it, which was needed to set the initial state of remotes for applications created before the remotes field was added to the configuration. For new applications.
23124
23137
  * @returns Returns the application manifest.
23125
23138
  */
23126
23139
  async getCumulocityJsonFile(application) {
@@ -23133,6 +23146,8 @@ class PluginsService {
23133
23146
  /**
23134
23147
  * Sets the initial state of remotes in the configuration (when it's missing), based on the list of remotes being in the application manifest.
23135
23148
  * @param application Application managed object.
23149
+ * @deprecated This method is deprecated and should not be used anymore. It was used to set the initial state of remotes for applications that were created before the remotes field was added to the configuration. For new applications,
23150
+ * remotes should be set during the application creation and there should be no need to call this method.
23136
23151
  * @returns Returns a list of remotes that has been assigned to the configuration object.
23137
23152
  */
23138
23153
  async setInitialRemotes(application) {
@@ -23141,7 +23156,7 @@ class PluginsService {
23141
23156
  const manifestRemotes = manifest.remotes;
23142
23157
  return await this.updateRemotesInAppConfig(application, manifestRemotes || {}, {});
23143
23158
  }
23144
- catch (er) {
23159
+ catch {
23145
23160
  return undefined;
23146
23161
  }
23147
23162
  }
@@ -23315,9 +23330,16 @@ class PluginsService {
23315
23330
  return (plugin.scope === PluginsExportScopes.SELF &&
23316
23331
  (!contextPath || plugin.contextPath === contextPath));
23317
23332
  }
23333
+ isManifestPlugin(plugin, remotes) {
23334
+ return (remotes.hasOwnProperty(plugin.contextPath) ||
23335
+ Object.keys(remotes).some(key => key.startsWith(`${plugin.contextPath}@`)));
23336
+ }
23318
23337
  getSelfScopedPlugins(plugins, contextPath) {
23319
23338
  return plugins.filter(plugin => this.isSelfScopedPlugin(plugin, contextPath));
23320
23339
  }
23340
+ getManifestPlugins(plugins, remotes) {
23341
+ return plugins.filter(plugin => this.isManifestPlugin(plugin, remotes));
23342
+ }
23321
23343
  getAllPluginsExceptSelfScoped(plugins, contextPath) {
23322
23344
  return plugins.filter(plugin => !this.isSelfScopedPlugin(plugin, contextPath));
23323
23345
  }
@@ -23397,9 +23419,12 @@ class PluginsService {
23397
23419
  if (!contextPath || !moduleName) {
23398
23420
  return;
23399
23421
  }
23400
- remotesCopy[contextPath]?.length >= 0
23401
- ? remotesCopy[contextPath].push(moduleName)
23402
- : (remotesCopy[contextPath] = []).push(moduleName);
23422
+ if (remotesCopy[contextPath]?.length >= 0) {
23423
+ remotesCopy[contextPath].push(moduleName);
23424
+ }
23425
+ else {
23426
+ remotesCopy[contextPath] = [moduleName];
23427
+ }
23403
23428
  remotesCopy[contextPath] = [...new Set(remotesCopy[contextPath])];
23404
23429
  });
23405
23430
  return remotesCopy;