@c8y/ngx-components 1023.14.180 → 1023.14.185

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.
@@ -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, of, Subject, switchMap, take } from 'rxjs';\nimport { QuickLinksWidgetViewComponent } from '../quick-links-widget-view/quick-links-widget-view.component';\nimport { QuickLinksService } from '../quick-links.service';\nimport { IApplication } from '@c8y/client';\nimport { FormArray, FormBuilder, FormsModule, Validators } from '@angular/forms';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport {\n ContextDashboardService,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport { QuickLinksWidgetConfigListComponent } from './quick-links-widget-config-list.component';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'c8y-quick-links-widget-config',\n imports: [\n NgCommonModule,\n TooltipModule,\n PopoverModule,\n QuickLinksWidgetConfigAddLinkComponent,\n QuickLinksWidgetViewComponent,\n QuickLinksWidgetConfigListComponent,\n C8yTranslateModule,\n EmptyStateComponent,\n FormsModule,\n IconDirective,\n CollapseModule\n ],\n templateUrl: './quick-links-widget-config.component.html',\n providers: [DashboardChildComponent, DashboardComponent]\n})\nexport class QuickLinksWidgetConfigComponent implements OnInit, OnBeforeSave, OnDestroy {\n config = input<QuickLinksConfig>();\n\n quickLinksForm: ReturnType<QuickLinksWidgetConfigComponent['initForm']>;\n selectedDisplayOption: DisplayOptionType = DEFAULT_DISPLAY_OPTION_VALUE;\n appsNameChanged = signal<IApplication[]>([]);\n addLinkIsCollapsed = true;\n\n @ViewChild('quickLinksPreview')\n set previewSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private destroy$ = new Subject<void>();\n\n readonly DEFAULT_QUICK_LINK_ICON = DEFAULT_QUICK_LINK_ICON;\n readonly DisplayOption = QuickLinkDisplayOption;\n private readonly CHANGE_DEFAULT_ICON_LABEL = gettext('You have changed the quick link icon for:');\n private readonly SAVE_CHANGES_LABEL = gettext(\n 'Please note that this action is irreversible. Do you want to save your changes?'\n );\n\n get quickLinksFormArray(): FormArray {\n return this.quickLinksForm.get('quickLinks') as FormArray;\n }\n\n private readonly quickLinksService = inject(QuickLinksService);\n private readonly modalService = inject(ModalService);\n private readonly humanizeAppNamePipe = inject(HumanizeAppNamePipe);\n private readonly interAppService = inject(InterAppService);\n private readonly formBuilder = inject(FormBuilder);\n private readonly contextDashboardService = inject(ContextDashboardService);\n private readonly translateService = inject(TranslateService);\n private readonly widgetConfigService = inject(WidgetConfigService);\n\n ngOnInit(): void {\n this.onInitConfig();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n getQuickLinks(): IQuickLink[] {\n return this.quickLinksForm.getRawValue().quickLinks as IQuickLink[];\n }\n\n addQuickLink(link: IQuickLink): void {\n const quickLinkForm = this.formBuilder.group({\n icon: [link?.icon],\n label: [link?.label || '', [Validators.required, Validators.maxLength(50)]],\n url: [link?.url || '', [Validators.required, Validators.pattern(URL_VALIDATOR_PATTERN)]],\n newTab: [link?.newTab || false],\n app: [link?.app]\n });\n\n this.quickLinksFormArray.push(quickLinkForm);\n\n this.config().links = this.getQuickLinks();\n }\n\n async onBeforeSave(config?: QuickLinksConfig): Promise<boolean> {\n try {\n await this.confirmAppIconChanges();\n\n config.links = this.getQuickLinks();\n config.displayOption = this.selectedDisplayOption;\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n assignLinksToConfig(): void {\n this.interAppService\n .isCurrentApp$(SupportedApps.devicemanagement)\n .pipe(\n take(1),\n switchMap(isDeviceManagement =>\n isDeviceManagement\n ? this.quickLinksService.getQuickLinksForDeviceManagement$()\n : this.quickLinksService.getDefaultQuickLinks$()\n )\n )\n .subscribe(quickLinks => (this.config().links = quickLinks));\n }\n\n resetLinks(): void {\n this.quickLinksForm = this.initForm();\n this.assignLinksToConfig();\n this.config().links.forEach(link => this.addQuickLink(link));\n }\n\n private onInitConfig(): void {\n this.setupQuickLinksForm();\n\n if (!this.config().links) {\n this.assignLinksToConfig();\n }\n\n this.config().links.forEach(link => this.addQuickLink(link));\n\n if (!this.config().displayOption) {\n this.config().displayOption = this.selectedDisplayOption;\n return;\n }\n this.selectedDisplayOption = this.config().displayOption;\n }\n\n private setupQuickLinksForm(): void {\n this.quickLinksForm = this.initForm();\n\n this.quickLinksForm.statusChanges\n .pipe(debounceTime(30), takeUntil(this.destroy$))\n .subscribe(status => (this.contextDashboardService.formDisabled$ = of(status === 'INVALID')));\n }\n\n private async confirmAppIconChanges(): Promise<void> {\n if (this.appsNameChanged().length > 0) {\n const appNameObservables = this.appsNameChanged().map(app =>\n this.humanizeAppNamePipe.transform(app).pipe(take(1))\n );\n\n const appNames = await lastValueFrom(forkJoin(appNameObservables));\n\n const CHANGE_DEFAULT_ICON_LABEL_TRANSLATED = this.translateService.instant(\n this.CHANGE_DEFAULT_ICON_LABEL\n );\n const SAVE_CHANGES_LABEL_TRANSLATED = this.translateService.instant(this.SAVE_CHANGES_LABEL);\n\n const modalMessage = `${CHANGE_DEFAULT_ICON_LABEL_TRANSLATED} ${appNames.join(', ')}. ${SAVE_CHANGES_LABEL_TRANSLATED}`;\n\n await this.modalService.confirm(\n gettext('Confirm Quick Link Icon Change'),\n modalMessage,\n Status.INFO,\n {\n ok: gettext('Save')\n }\n );\n }\n }\n\n private initForm() {\n return this.formBuilder.group({\n quickLinks: this.formBuilder.array([])\n });\n }\n}\n","<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'General' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8 p-b-8\">\n <label class=\"m-b-0 text-label-small\">{{ 'Display as' | translate }}</label>\n <div class=\"c8y-select-wrapper form-group-sm\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n [(ngModel)]=\"selectedDisplayOption\"\n >\n <option [value]=\"DisplayOption.GRID\">\n {{ DisplayOption.GRID | translate }}\n </option>\n <option [value]=\"DisplayOption.LIST\">\n {{ DisplayOption.LIST | translate }}\n </option>\n </select>\n </div>\n <label\n class=\"c8y-checkbox m-l-auto\"\n title=\"{{ 'Translate labels if possible' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config().translateLinkLabels\"\n />\n <span></span>\n <span>{{ 'Translate labels if possible' | translate }}</span>\n </label>\n </div>\n</fieldset>\n\n<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Links' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8 p-b-8\">\n <button\n class=\"btn btn-clean btn-sm\"\n title=\"{{ 'Add a quick link' | translate }}\"\n type=\"button\"\n (click)=\"addLinkIsCollapsed = !addLinkIsCollapsed\"\n >\n <i [c8yIcon]=\"'plus-circle'\"></i>\n {{ 'Add a quick link' | translate }}\n </button>\n\n <button\n class=\"btn btn-clean btn-sm\"\n title=\"{{ 'Reset links' | translate }}\"\n [popover]=\"confirmPopover\"\n placement=\"bottom\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [outsideClick]=\"true\"\n #pop=\"bs-popover\"\n >\n <i [c8yIcon]=\"'reset'\"></i>\n {{ 'Reset links' | translate }}\n </button>\n <ng-template #confirmPopover>\n <p class=\"m-b-8\">\n {{\n 'Resetting links removes all custom links and resets the widget to its default state.'\n | translate\n }}\n </p>\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"pop.hide()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n (click)=\"resetLinks(); pop.hide()\"\n >\n {{ 'Reset links' | translate }}\n </button>\n </ng-template>\n </div>\n <div\n class=\"collapse bg.component\"\n #collapse=\"bs-collapse\"\n [collapse]=\"addLinkIsCollapsed\"\n [isAnimated]=\"true\"\n >\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Add a quick link' | translate }}</legend>\n <c8y-quick-links-widget-config-add-link\n class=\"d-block p-b-16 p-l-8 p-r-8\"\n (onQuickLinkCreated)=\"addQuickLink($event); addLinkIsCollapsed = true\"\n (onCancel)=\"addLinkIsCollapsed = true\"\n ></c8y-quick-links-widget-config-add-link>\n </fieldset>\n </div>\n\n @if (config().links.length) {\n <c8y-quick-links-widget-config-list\n class=\"separator-top\"\n [quickLinksForm]=\"quickLinksForm\"\n [config]=\"config()\"\n [quickLinksFormArray]=\"quickLinksFormArray\"\n [appsNameChanged]=\"appsNameChanged\"\n ></c8y-quick-links-widget-config-list>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display' | translate\"\n [horizontal]=\"true\"\n >\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Reset links' | translate }}\"\n type=\"button\"\n (click)=\"resetLinks()\"\n translate\n >\n Reset links\n </button>\n </div>\n </c8y-ui-empty-state>\n }\n</fieldset>\n\n<ng-template #quickLinksPreview>\n <c8y-quick-links-widget-view\n [config]=\"{\n links: getQuickLinks(),\n displayOption: selectedDisplayOption,\n translateLinkLabels: config().translateLinkLabels\n }\"\n [isPreview]=\"true\"\n ></c8y-quick-links-widget-view>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgCommonModule","i1","switchMap","FormsModule","i3","i4"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-widgets-implementations-quick-links.mjs","sources":["../../widgets/implementations/quick-links/quick-links.model.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-add-link.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-add-link.component.html","../../widgets/implementations/quick-links/quick-links.service.ts","../../widgets/implementations/quick-links/relative-url-parser.pipe.ts","../../widgets/implementations/quick-links/quick-links-widget-view/quick-links-widget-view.component.ts","../../widgets/implementations/quick-links/quick-links-widget-view/quick-links-widget-view.component.html","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-list.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-list.component.html","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config.component.html","../../widgets/implementations/quick-links/c8y-ngx-components-widgets-implementations-quick-links.ts"],"sourcesContent":["import { IApplication } from '@c8y/client';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { ValidationPattern } from '@c8y/ngx-components';\n\nexport interface IQuickLink {\n icon: string;\n label: string;\n url: string;\n newTab: boolean;\n app?: IApplication;\n}\n\nexport type QuickLinksConfig = {\n links: IQuickLink[];\n displayOption: DisplayOptionType;\n translateLinkLabels: boolean;\n};\n\nexport const QuickLinkDisplayOption = {\n GRID: 'Grid',\n LIST: 'List'\n} as const;\n\nexport type DisplayOptionType =\n (typeof QuickLinkDisplayOption)[keyof typeof QuickLinkDisplayOption];\n\nexport const DEFAULT_DISPLAY_OPTION_VALUE = QuickLinkDisplayOption.GRID;\nexport const DEFAULT_QUICK_LINK_ICON = 'link';\n\nexport const HELP_AND_SERVICE_WIDGET_ID = defaultWidgetIds.HELP_AND_SERVICE;\nexport const APPLICATIONS_WIDGET_ID = defaultWidgetIds.APPLICATIONS;\nexport const QUICK_LINKS_DEVICE_MANAGEMENT_ID = defaultWidgetIds.DEVICE_MANAGEMENT_WELCOME;\n\nexport type ConvertibleWidgetID =\n | typeof HELP_AND_SERVICE_WIDGET_ID\n | typeof APPLICATIONS_WIDGET_ID\n | typeof QUICK_LINKS_DEVICE_MANAGEMENT_ID;\n\nexport type DefaultDeviceManagementQuickLinkDefinition = {\n navPath: string[];\n overrides?: QuickLinkOverrides;\n};\ninterface QuickLinkOverrides {\n label?: string;\n icon?: string;\n url?: string;\n}\n\nexport const URL_VALIDATOR_PATTERN = ValidationPattern.rules.quickLinkUrl.pattern;\n\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, of, Subject, switchMap, take } from 'rxjs';\nimport { QuickLinksWidgetViewComponent } from '../quick-links-widget-view/quick-links-widget-view.component';\nimport { QuickLinksService } from '../quick-links.service';\nimport { IApplication } from '@c8y/client';\nimport { FormArray, FormBuilder, FormsModule, Validators } from '@angular/forms';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport {\n ContextDashboardService,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport { QuickLinksWidgetConfigListComponent } from './quick-links-widget-config-list.component';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'c8y-quick-links-widget-config',\n imports: [\n NgCommonModule,\n TooltipModule,\n PopoverModule,\n QuickLinksWidgetConfigAddLinkComponent,\n QuickLinksWidgetViewComponent,\n QuickLinksWidgetConfigListComponent,\n C8yTranslateModule,\n EmptyStateComponent,\n FormsModule,\n IconDirective,\n CollapseModule\n ],\n templateUrl: './quick-links-widget-config.component.html',\n providers: [DashboardChildComponent, DashboardComponent]\n})\nexport class QuickLinksWidgetConfigComponent implements OnInit, OnBeforeSave, OnDestroy {\n config = input<QuickLinksConfig>();\n\n quickLinksForm: ReturnType<QuickLinksWidgetConfigComponent['initForm']>;\n selectedDisplayOption: DisplayOptionType = DEFAULT_DISPLAY_OPTION_VALUE;\n appsNameChanged = signal<IApplication[]>([]);\n addLinkIsCollapsed = true;\n\n @ViewChild('quickLinksPreview')\n set previewSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private destroy$ = new Subject<void>();\n\n readonly DEFAULT_QUICK_LINK_ICON = DEFAULT_QUICK_LINK_ICON;\n readonly DisplayOption = QuickLinkDisplayOption;\n private readonly CHANGE_DEFAULT_ICON_LABEL = gettext('You have changed the quick link icon for:');\n private readonly SAVE_CHANGES_LABEL = gettext(\n 'Please note that this action is irreversible. Do you want to save your changes?'\n );\n\n get quickLinksFormArray(): FormArray {\n return this.quickLinksForm.get('quickLinks') as FormArray;\n }\n\n private readonly quickLinksService = inject(QuickLinksService);\n private readonly modalService = inject(ModalService);\n private readonly humanizeAppNamePipe = inject(HumanizeAppNamePipe);\n private readonly interAppService = inject(InterAppService);\n private readonly formBuilder = inject(FormBuilder);\n private readonly contextDashboardService = inject(ContextDashboardService);\n private readonly translateService = inject(TranslateService);\n private readonly widgetConfigService = inject(WidgetConfigService);\n\n ngOnInit(): void {\n this.onInitConfig();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n getQuickLinks(): IQuickLink[] {\n return this.quickLinksForm.getRawValue().quickLinks as IQuickLink[];\n }\n\n addQuickLink(link: IQuickLink): void {\n const quickLinkForm = this.formBuilder.group({\n icon: [link?.icon],\n label: [link?.label || '', [Validators.required, Validators.maxLength(50)]],\n url: [\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 this.quickLinksForm.statusChanges\n .pipe(debounceTime(30), takeUntil(this.destroy$))\n .subscribe(status => (this.contextDashboardService.formDisabled$ = of(status === 'INVALID')));\n }\n\n private async confirmAppIconChanges(): Promise<void> {\n if (this.appsNameChanged().length > 0) {\n const appNameObservables = this.appsNameChanged().map(app =>\n this.humanizeAppNamePipe.transform(app).pipe(take(1))\n );\n\n const appNames = await lastValueFrom(forkJoin(appNameObservables));\n\n const CHANGE_DEFAULT_ICON_LABEL_TRANSLATED = this.translateService.instant(\n this.CHANGE_DEFAULT_ICON_LABEL\n );\n const SAVE_CHANGES_LABEL_TRANSLATED = this.translateService.instant(this.SAVE_CHANGES_LABEL);\n\n const modalMessage = `${CHANGE_DEFAULT_ICON_LABEL_TRANSLATED} ${appNames.join(', ')}. ${SAVE_CHANGES_LABEL_TRANSLATED}`;\n\n await this.modalService.confirm(\n gettext('Confirm Quick Link Icon Change'),\n modalMessage,\n Status.INFO,\n {\n ok: gettext('Save')\n }\n );\n }\n }\n\n private initForm() {\n return this.formBuilder.group({\n quickLinks: this.formBuilder.array([])\n });\n }\n}\n","<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'General' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8 p-b-8\">\n <label class=\"m-b-0 text-label-small\">{{ 'Display as' | translate }}</label>\n <div class=\"c8y-select-wrapper form-group-sm\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n [(ngModel)]=\"selectedDisplayOption\"\n >\n <option [value]=\"DisplayOption.GRID\">\n {{ DisplayOption.GRID | translate }}\n </option>\n <option [value]=\"DisplayOption.LIST\">\n {{ DisplayOption.LIST | translate }}\n </option>\n </select>\n </div>\n <label\n class=\"c8y-checkbox m-l-auto\"\n title=\"{{ 'Translate labels if possible' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config().translateLinkLabels\"\n />\n <span></span>\n <span>{{ 'Translate labels if possible' | translate }}</span>\n </label>\n </div>\n</fieldset>\n\n<fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Links' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8 p-b-8\">\n <button\n class=\"btn btn-clean btn-sm\"\n title=\"{{ 'Add a quick link' | translate }}\"\n type=\"button\"\n (click)=\"addLinkIsCollapsed = !addLinkIsCollapsed\"\n >\n <i [c8yIcon]=\"'plus-circle'\"></i>\n {{ 'Add a quick link' | translate }}\n </button>\n\n <button\n class=\"btn btn-clean btn-sm\"\n title=\"{{ 'Reset links' | translate }}\"\n [popover]=\"confirmPopover\"\n placement=\"bottom\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [outsideClick]=\"true\"\n #pop=\"bs-popover\"\n >\n <i [c8yIcon]=\"'reset'\"></i>\n {{ 'Reset links' | translate }}\n </button>\n <ng-template #confirmPopover>\n <p class=\"m-b-8\">\n {{\n 'Resetting links removes all custom links and resets the widget to its default state.'\n | translate\n }}\n </p>\n <button\n class=\"btn btn-default btn-sm\"\n (click)=\"pop.hide()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n (click)=\"resetLinks(); pop.hide()\"\n >\n {{ 'Reset links' | translate }}\n </button>\n </ng-template>\n </div>\n <div\n class=\"collapse bg.component\"\n #collapse=\"bs-collapse\"\n [collapse]=\"addLinkIsCollapsed\"\n [isAnimated]=\"true\"\n >\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Add a quick link' | translate }}</legend>\n <c8y-quick-links-widget-config-add-link\n class=\"d-block p-b-16 p-l-8 p-r-8\"\n (onQuickLinkCreated)=\"addQuickLink($event); addLinkIsCollapsed = true\"\n (onCancel)=\"addLinkIsCollapsed = true\"\n ></c8y-quick-links-widget-config-add-link>\n </fieldset>\n </div>\n\n @if (config().links.length) {\n <c8y-quick-links-widget-config-list\n class=\"separator-top\"\n [quickLinksForm]=\"quickLinksForm\"\n [config]=\"config()\"\n [quickLinksFormArray]=\"quickLinksFormArray\"\n [appsNameChanged]=\"appsNameChanged\"\n ></c8y-quick-links-widget-config-list>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n [title]=\"'No quick links to display' | translate\"\n [horizontal]=\"true\"\n >\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Reset links' | translate }}\"\n type=\"button\"\n (click)=\"resetLinks()\"\n translate\n >\n Reset links\n </button>\n </div>\n </c8y-ui-empty-state>\n }\n</fieldset>\n\n<ng-template #quickLinksPreview>\n <c8y-quick-links-widget-view\n [config]=\"{\n links: getQuickLinks(),\n displayOption: selectedDisplayOption,\n translateLinkLabels: config().translateLinkLabels\n }\"\n [isPreview]=\"true\"\n ></c8y-quick-links-widget-view>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgCommonModule","i1","switchMap","FormsModule","i3","i4"],"mappings":"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"}
package/locales/de.po CHANGED
@@ -16462,6 +16462,9 @@ msgstr "Das Dienste-Plugin bietet eine Registerkarte „Geräte“, auf der alle
16462
16462
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16463
16463
  msgstr "Das Format der URL ist ungültig. Es werden nur die Protokolle http, https und opc.tcp unterstützt."
16464
16464
 
16465
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16466
+ msgstr "Die URL darf nicht länger als {{ requiredLength }} Zeichen sein."
16467
+
16465
16468
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16466
16469
  msgstr "Die URL des Microservices ist falsch konfiguriert. Es fehlt ein Kontextpfad."
16467
16470
 
package/locales/es.po CHANGED
@@ -16484,6 +16484,9 @@ msgstr "El complemento Servicios proporciona una pestaña de dispositivos que mu
16484
16484
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16485
16485
  msgstr "El formato de URL no es válido. Los únicos protocolos admitidos son http, https y opc.tcp."
16486
16486
 
16487
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16488
+ msgstr "La URL no debe superar los {{ requiredLength }} caracteres."
16489
+
16487
16490
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16488
16491
  msgstr "La dirección URL del microservicio no se ha configurado correctamente. Falta una ruta de contexto."
16489
16492
 
package/locales/fr.po CHANGED
@@ -16480,6 +16480,9 @@ msgstr "Le plugin Services fournit un onglet Appareil qui répertorie tous les s
16480
16480
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16481
16481
  msgstr "Le format de l'URL n'est pas valide. Les seuls protocoles pris en charge sont http, https et opc.tcp."
16482
16482
 
16483
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16484
+ msgstr "L'URL ne doit pas dépasser {{ requiredLength }} caractères."
16485
+
16483
16486
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16484
16487
  msgstr "L'URL du microservice n'est pas configurée correctement. Un chemin de contexte est manquant."
16485
16488
 
package/locales/ja_JP.po CHANGED
@@ -16489,6 +16489,9 @@ msgstr "サービス プラグインによって、デバイスで実行され
16489
16489
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16490
16490
  msgstr "URL 形式が無効です。サポートされているプロトコルは http、https、opc.tcp のみです。"
16491
16491
 
16492
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16493
+ msgstr ""
16494
+
16492
16495
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16493
16496
  msgstr "マイクロサービスの URL が適切に設定されていません。コンテキスト パスがありません。"
16494
16497
 
package/locales/ko.po CHANGED
@@ -16485,6 +16485,9 @@ msgstr "서비스 플러그인은 디바이스 탭을 제공하며, 여기에는
16485
16485
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16486
16486
  msgstr "URL 형식이 유효하지 않습니다. 유일하게 지원되는 프로토콜은 http, https 및 opc.tcp입니다."
16487
16487
 
16488
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16489
+ msgstr "URL은 {{ requiredLength }} 자를 초과해서는 안 됩니다."
16490
+
16488
16491
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16489
16492
  msgstr "마이크로서비스의 URL이 잘못 구성되었습니다. 컨텍스트 경로가 없습니다."
16490
16493
 
@@ -16334,6 +16334,9 @@ msgstr ""
16334
16334
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16335
16335
  msgstr ""
16336
16336
 
16337
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16338
+ msgstr ""
16339
+
16337
16340
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16338
16341
  msgstr ""
16339
16342
 
package/locales/nl.po CHANGED
@@ -16516,6 +16516,9 @@ msgstr "De Services-plug-in biedt een apparaat-tabblad waarop alle services die
16516
16516
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16517
16517
  msgstr "Het URL-formaat is ongeldig. De enige ondersteunde protocollen zijn http, https en opc.tcp."
16518
16518
 
16519
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16520
+ msgstr "De URL mag niet langer zijn dan {{ requiredLength }} tekens."
16521
+
16519
16522
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16520
16523
  msgstr "De URL van de microservice is onjuist geconfigureerd. Er ontbreekt een contextpad."
16521
16524
 
package/locales/pl.po CHANGED
@@ -16560,6 +16560,9 @@ msgstr "Wtyczka Usługi udostępnia kartę urządzenia, na której wyświetlana
16560
16560
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16561
16561
  msgstr "Format adresu URL jest nieprawidłowy. Jedyne obsługiwane protokoły to http, https i opc.tcp."
16562
16562
 
16563
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16564
+ msgstr "Adres URL nie może przekraczać {{ requiredLength }} znaków."
16565
+
16563
16566
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16564
16567
  msgstr "Adres URL mikrousługi jest niepoprawnie skonfigurowany. Brak ścieżki kontekstu."
16565
16568
 
package/locales/pt_BR.po CHANGED
@@ -16512,6 +16512,9 @@ msgstr "O plugin Serviços fornece uma guia de dispositivos que lista todos os s
16512
16512
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16513
16513
  msgstr "O formato do URL é inválido! Os únicos protocolos suportados são http, https e opc.tcp."
16514
16514
 
16515
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16516
+ msgstr "A URL não deve ter mais do que {{ requiredLength }} caracteres."
16517
+
16515
16518
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16516
16519
  msgstr "O URL do microsserviço está configurado incorretamente. Falta um caminho de contexto."
16517
16520
 
package/locales/zh_CN.po CHANGED
@@ -16492,6 +16492,9 @@ msgstr "服务插件提供了一个设备选项卡,该选项卡列出了设备
16492
16492
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16493
16493
  msgstr "URL 格式无效。仅支持 http、https 和 opc.tcp 协议。"
16494
16494
 
16495
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16496
+ msgstr "URL 长度不得超过 {{ requiredLength }} 个字符。"
16497
+
16495
16498
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16496
16499
  msgstr "微服务的 URL 配置错误。缺少上下文路径。"
16497
16500
 
package/locales/zh_TW.po CHANGED
@@ -16499,6 +16499,9 @@ msgstr "服務外掛程式提供一個設備分頁,列出設備上全部正在
16499
16499
  msgid "The URL format is invalid. The only supported protocols are http, https and opc.tcp."
16500
16500
  msgstr "URL 格式无效。仅支持 http、https 和 opc.tcp 协议。"
16501
16501
 
16502
+ msgid "The URL must not exceed {{ requiredLength }} characters."
16503
+ msgstr "網址長度不得超過 {{ requiredLength }} 個字元。"
16504
+
16502
16505
  msgid "The URL of the microservice is misconfigured. A context path is missing."
16503
16506
  msgstr "微服务的 URL 配置错误。缺少上下文路径。"
16504
16507