{"version":3,"file":"c8y-ngx-components-widgets-implementations-quick-links.mjs","sources":["../../widgets/implementations/quick-links/quick-links.model.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-add-link.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-add-link.component.html","../../widgets/implementations/quick-links/quick-links.service.ts","../../widgets/implementations/quick-links/relative-url-parser.pipe.ts","../../widgets/implementations/quick-links/quick-links-widget-view/quick-links-widget-view.component.ts","../../widgets/implementations/quick-links/quick-links-widget-view/quick-links-widget-view.component.html","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-list.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config-list.component.html","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config.component.ts","../../widgets/implementations/quick-links/quick-links-widget-config/quick-links-widget-config.component.html","../../widgets/implementations/quick-links/c8y-ngx-components-widgets-implementations-quick-links.ts"],"sourcesContent":["import { IApplication } from '@c8y/client';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { ValidationPattern } from '@c8y/ngx-components';\n\nexport interface IQuickLink {\n  icon: string;\n  label: string;\n  url: string;\n  newTab: boolean;\n  app?: IApplication;\n}\n\nexport type QuickLinksConfig = {\n  links: IQuickLink[];\n  displayOption: DisplayOptionType;\n  translateLinkLabels: boolean;\n};\n\nexport const QuickLinkDisplayOption = {\n  GRID: 'Grid',\n  LIST: 'List'\n} as const;\n\nexport type DisplayOptionType =\n  (typeof QuickLinkDisplayOption)[keyof typeof QuickLinkDisplayOption];\n\nexport const DEFAULT_DISPLAY_OPTION_VALUE = QuickLinkDisplayOption.GRID;\nexport const DEFAULT_QUICK_LINK_ICON = 'link';\n\nexport const HELP_AND_SERVICE_WIDGET_ID = defaultWidgetIds.HELP_AND_SERVICE;\nexport const APPLICATIONS_WIDGET_ID = defaultWidgetIds.APPLICATIONS;\nexport const QUICK_LINKS_DEVICE_MANAGEMENT_ID = defaultWidgetIds.DEVICE_MANAGEMENT_WELCOME;\n\nexport type ConvertibleWidgetID =\n  | typeof HELP_AND_SERVICE_WIDGET_ID\n  | typeof APPLICATIONS_WIDGET_ID\n  | typeof QUICK_LINKS_DEVICE_MANAGEMENT_ID;\n\nexport type DefaultDeviceManagementQuickLinkDefinition = {\n  navPath: string[];\n  overrides?: QuickLinkOverrides;\n};\ninterface QuickLinkOverrides {\n  label?: string;\n  icon?: string;\n  url?: string;\n}\n\nexport const URL_VALIDATOR_PATTERN = ValidationPattern.rules.quickLinkUrl.pattern;\n\nexport type WidgetConversionConfig = {\n  convertWidget: () => void;\n};\n","import { Component, inject, OnInit, output } from '@angular/core';\nimport { C8yTranslatePipe, ChangeIconComponent } from '@c8y/ngx-components';\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { IconSelectorService } from '@c8y/ngx-components/icon-selector';\nimport { DEFAULT_QUICK_LINK_ICON, IQuickLink, URL_VALIDATOR_PATTERN } from '../quick-links.model';\n\n@Component({\n  selector: 'c8y-quick-links-widget-config-add-link',\n  imports: [TooltipModule, C8yTranslatePipe, ReactiveFormsModule, ChangeIconComponent],\n  templateUrl: './quick-links-widget-config-add-link.component.html'\n})\nexport class QuickLinksWidgetConfigAddLinkComponent implements OnInit {\n  onQuickLinkCreated = output<IQuickLink>();\n  onCancel = output<void>();\n\n  addLinkFormGroup: ReturnType<QuickLinksWidgetConfigAddLinkComponent['initForm']>;\n\n  private readonly iconSelector = inject(IconSelectorService);\n  private readonly fb = inject(FormBuilder);\n\n  ngOnInit() {\n    this.addLinkFormGroup = this.initForm();\n  }\n\n  async changeLinkIcon(): Promise<void> {\n    try {\n      const newIcon = await this.iconSelector.selectIcon();\n      this.addLinkFormGroup.controls.icon.setValue(newIcon);\n    } catch {\n      // nothing to do\n    }\n  }\n\n  createQuickLink(): void {\n    this.onQuickLinkCreated.emit(this.addLinkFormGroup.value as IQuickLink);\n\n    this.addLinkFormGroup.reset();\n    this.addLinkFormGroup.controls.icon.setValue(DEFAULT_QUICK_LINK_ICON);\n  }\n\n  private initForm() {\n    const controls = {\n      icon: [DEFAULT_QUICK_LINK_ICON, [Validators.required]],\n      label: ['', [Validators.required, Validators.maxLength(50)]],\n      url: ['', [Validators.required, Validators.pattern(URL_VALIDATOR_PATTERN)]],\n      newTab: [false, [Validators.required]]\n    };\n\n    return this.fb.group(controls);\n  }\n}\n","<form [formGroup]=\"addLinkFormGroup\">\n  <div class=\"d-flex a-i-center gap-24\">\n    <div class=\"form-group\">\n      <label>{{ 'Icon' | translate }}</label>\n      <c8y-change-icon\n        class=\"form-control\"\n        [currentIcon]=\"addLinkFormGroup.controls.icon.value\"\n        (onButtonClick)=\"changeLinkIcon()\"\n      ></c8y-change-icon>\n    </div>\n    <div class=\"form-group flex-grow\">\n      <label for=\"ql-label\">{{ 'Label' | translate }}</label>\n      <input\n        class=\"form-control\"\n        id=\"ql-label\"\n        type=\"text\"\n        formControlName=\"label\"\n        maxlength=\"50\"\n        [placeholder]=\"'e.g. my Quick Link' | translate\"\n      />\n    </div>\n  </div>\n  <div class=\"d-flex a-i-center gap-24\">\n    <div class=\"form-group flex-grow\">\n      <label for=\"ql-url\">{{ 'URL' | translate }}</label>\n      <input\n        class=\"form-control\"\n        id=\"ql-url\"\n        type=\"text\"\n        formControlName=\"url\"\n        maxlength=\"150\"\n        [placeholder]=\"'e.g. http://www.example.com' | translate\"\n      />\n    </div>\n    <div class=\"form-group flex-noshrink\">\n      <label>&nbsp;</label>\n      <label\n        class=\"c8y-checkbox\"\n        title=\"{{ 'Open the link in a new browser tab' | translate }}\"\n      >\n        <input\n          [attr.aria-label]=\"'Open in new tab' | translate\"\n          type=\"checkbox\"\n          formControlName=\"newTab\"\n          checked=\"checked\"\n        />\n        <span></span>\n        <span>{{ 'New tab' | translate }}</span>\n      </label>\n    </div>\n  </div>\n</form>\n\n<button\n  class=\"btn btn-default btn-sm\"\n  type=\"button\"\n  (click)=\"onCancel.emit()\"\n>\n  {{ 'Cancel' | translate }}\n</button>\n<button\n  class=\"btn btn-primary btn-sm\"\n  title=\"{{ 'Create a quick link' | translate }}\"\n  type=\"button\"\n  (click)=\"createQuickLink()\"\n  [disabled]=\"addLinkFormGroup.invalid\"\n>\n  {{ 'Add quick link' | translate }}\n</button>\n","import { inject, Injectable } from '@angular/core';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  DocLink,\n  DocLinkWithLabel,\n  DocsService,\n  NavigatorNode,\n  NavigatorService,\n  sortByPriority\n} from '@c8y/ngx-components';\nimport { combineLatestWith, map, switchMap } from 'rxjs/operators';\nimport { DefaultDeviceManagementQuickLinkDefinition, IQuickLink } from './quick-links.model';\n\n/**\n * Service for managing quick links in Cockpit and Device Management applications.\n * It fetches, processes, and provides quick links to relevant documentation and navigation nodes.\n */\n@Injectable({ providedIn: 'root' })\nexport class QuickLinksService {\n  private navNodes: NavigatorNode[];\n\n  private readonly docsService = inject(DocsService);\n  private readonly navigatorService = inject(NavigatorService);\n\n  private readonly labelsToFilterOutInDeviceManagement = [\n    'Add user',\n    'Add device',\n    'Cockpit',\n    'Legal notices'\n  ];\n\n  /**\n   * Retrieves the default quick links for Cockpit Application.\n   *\n   * @returns An observable emitting an array of quick links.\n   */\n  getDefaultQuickLinks$(): Observable<IQuickLink[]> {\n    return this.getDocLinks$().pipe(\n      map(docLinks =>\n        docLinks.map(docLink => ({\n          icon: docLink.icon,\n          label: docLink.label,\n          url: docLink.url,\n          newTab: docLink.target === '_blank'\n        }))\n      )\n    );\n  }\n\n  /**\n   * Retrieves default quick links for Device Management Application\n   *\n   * @returns An observable emitting an array of quick links for device management.\n   */\n  getQuickLinksForDeviceManagement$(): Observable<IQuickLink[]> {\n    return this.getSortedDocLinksForDeviceManagement().pipe(\n      map(docLinks =>\n        docLinks.map(docLink => ({\n          icon: docLink.icon,\n          label: docLink.label,\n          url: docLink.url,\n          newTab: docLink.target === '_blank'\n        }))\n      )\n    );\n  }\n\n  /**\n   * Fetches documentation links for Cockpit Application and sorts them by priority.\n   *\n   * @returns An observable emitting an array of documentation links.\n   */\n  private getDocLinks$(): Observable<DocLink[]> {\n    return combineLatest([this.docsService.items$, this.navigatorService.items$]).pipe(\n      map(([links, navigatorNodes]) => this.handleDocLinks([...links], navigatorNodes)),\n      map(docLinks => sortByPriority(docLinks))\n    );\n  }\n\n  /**\n   * Processes and modifies documentation links.\n   *\n   * @param links - Array of documentation links.\n   * @param navigatorNodes - Array of navigation nodes.\n   *\n   * @returns An array of processed documentation links.\n   */\n  private handleDocLinks(links: DocLink[], navigatorNodes: NavigatorNode[]): DocLink[] {\n    const groupLink = this.createAddGroupDocLink(navigatorNodes);\n\n    if (groupLink) {\n      links.push(groupLink);\n    }\n    return this.replaceDocsLinksWithMainOne(links);\n  }\n\n  /**\n   * Creates a quick link for adding a group if the \"Groups\" node is present.\n   *\n   * @param navigatorNodes - Array of navigation nodes.\n   * @returns A `DocLink` for adding a group or `undefined`.\n   */\n  private createAddGroupDocLink(navigatorNodes: NavigatorNode[]): DocLink | undefined {\n    let docLink: DocLink;\n    const groupsNodeLabel = gettext('Groups');\n    const groupsNode = this.findNavigatorNode(groupsNodeLabel, navigatorNodes);\n\n    if (groupsNode) {\n      docLink = {\n        type: 'quicklink',\n        icon: 'c8y-icon c8y-icon-group-add',\n        label: gettext('Add group'),\n        target: null,\n        url: '/group?showAddGroup=true'\n      };\n    }\n    return docLink;\n  }\n\n  /**\n   * Retrieves additional documentation links related to device management.\n   *\n   * @returns An observable that emits a list of processed documentation links.\n   */\n  private getAdditionalDocLinksForDeviceManagement$(): Observable<DocLink[]> {\n    return this.docsService.items$.pipe(\n      map(docLinks => this.prepareDocLinksForDeviceManagement(docLinks))\n    );\n  }\n\n  /**\n   * Prepares documentation links by replacing some links with a main one and filtering out irrelevant links.\n   *\n   * @param links - The list of documentation links to process.\n   * @returns The processed list of documentation links.\n   */\n  private prepareDocLinksForDeviceManagement(links: DocLink[]): DocLink[] {\n    const _links = this.replaceDocsLinksWithMainOne(links);\n\n    return this.filterOutDocsLinksForDeviceManagement(_links);\n  }\n\n  /**\n   * Filters out documentation links that should not be included in device management.\n   *\n   * @param links - The list of documentation links to filter.\n   * @returns The filtered list of documentation links.\n   */\n  private filterOutDocsLinksForDeviceManagement(links: DocLink[]): DocLink[] {\n    const filteredLinks = links.filter(\n      link =>\n        !this.labelsToFilterOutInDeviceManagement.includes(link.label) &&\n        !link.url.includes('/apps/')\n    );\n\n    const additionalLinks = this.docsService\n      .getItemsFromHookDocs()\n      .filter(doc => this.labelsToFilterOutInDeviceManagement.includes(doc.label));\n\n    return sortByPriority([...filteredLinks, ...additionalLinks]);\n  }\n\n  /**\n   * Replaces the first occurrence of a documentation link with a main user guide link.\n   *\n   * @param links - The list of documentation links to process.\n   * @returns The modified list of documentation links.\n   */\n  private replaceDocsLinksWithMainOne(links: DocLink[]): DocLink[] {\n    const DOCS_PATH = '/docs/';\n    const docsLinkRegex = /\\/docs\\/(?!legal-notices)/;\n    let firstDocsLink = true;\n    return links.reduce((acc, link) => {\n      const isDocsLink = link.url && docsLinkRegex.test(link.url);\n      if (isDocsLink) {\n        if (firstDocsLink) {\n          firstDocsLink = false;\n          // Replace the first /docs/ link with the main one\n          acc.push({\n            icon: 'book-shelf',\n            label: gettext('User documentation'),\n            url: this.docsService.getUserGuideLink(DOCS_PATH),\n            type: 'doc',\n            target: '_blank'\n          } as DocLinkWithLabel);\n        }\n      } else {\n        acc.push({\n          ...link,\n          target: this.isLinkForCurrentApp(link) ? null : '_blank'\n        });\n      }\n      return acc;\n    }, []);\n  }\n\n  /**\n   * Checks if a URL is valid.\n   *\n   * @param url - The URL string to validate.\n   * @returns `true` if the URL is valid, otherwise `false`.\n   */\n  private isValidURL(url: string): boolean {\n    try {\n      new URL(url);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Determines if a link belongs to the current application.\n   *\n   * @param link - The documentation link to check.\n   * @returns `true` if the link is for the current app, otherwise `false`.\n   */\n  private isLinkForCurrentApp(link: DocLink): boolean {\n    const { url } = link;\n    if (!url) return false;\n\n    if (!this.isValidURL(url)) {\n      return !url.startsWith('/apps/');\n    }\n    return false;\n  }\n\n  /**\n   * Finds a navigation node by its label.\n   *\n   * @param nodeName - Label of the node to find.\n   * @param navNodes - Array of navigation nodes.\n   *\n   * @returns The found navigation node.\n   */\n  private findNavigatorNode(nodeName: string, navNodes: NavigatorNode[] = []): NavigatorNode {\n    return navNodes.find((node: NavigatorNode) => node.label === nodeName);\n  }\n\n  /**\n   * Retrieves the default quick links for device management.\n   *\n   * This method returns an array of predefined quick link definitions\n   * used for navigation within the device management section of the application.\n   *\n   * Each quick link is defined by a navigation path (`navPath`), and optionally\n   * includes override properties such as a custom label, icon, or URL.\n   *\n   * @returns An array of quick link definitions.\n   */\n  private getDefaultQuickLinksForDeviceManagement(): DefaultDeviceManagementQuickLinkDefinition[] {\n    return [\n      { navPath: ['Devices', 'All devices'] },\n      { navPath: ['Devices', 'Registration'], overrides: { label: gettext('Register device') } },\n      {\n        navPath: ['Groups'],\n        overrides: {\n          label: gettext('Add group'),\n          icon: 'c8y-group-add',\n          url: '/group?showAddGroup=true'\n        }\n      },\n      {\n        navPath: ['Management', 'Device profiles'],\n        overrides: { label: gettext('Add device profile') }\n      },\n      {\n        navPath: ['Management', 'Software repository'],\n        overrides: { label: gettext('Add software') }\n      },\n      {\n        navPath: ['Management', 'Firmware repository'],\n        overrides: { label: gettext('Add firmware') }\n      }\n    ];\n  }\n\n  /**\n   * Fetches documentation links for Device Management Application and sorts them by priority.\n   *\n   * @returns An observable emitting an array of documentation links.\n   */\n  private getSortedDocLinksForDeviceManagement(): Observable<DocLink[]> {\n    return this.navigatorService.items$.pipe(\n      switchMap(navNodes => {\n        return of(\n          this.getDefaultQuickLinksForDeviceManagement()\n            .map(({ navPath, overrides }) =>\n              this.createDocLinkToNavNode(navPath, overrides, navNodes)\n            )\n            .filter(Boolean)\n        );\n      }),\n      combineLatestWith(this.getAdditionalDocLinksForDeviceManagement$()),\n      map(([links, additionalLinks]) => [...links, ...additionalLinks]),\n      map(docLinks => sortByPriority(docLinks))\n    );\n  }\n\n  /**\n   * Creates a document link based on the given navigation node path labels.\n   *\n   * @param navNodePathLabels - An array of strings representing the path labels used to find the navigation node.\n   * @param quickLinkOverrides - An optional partial object of `DocLink` properties that can override the defaults.\n   * @param navNodes - An array of `NavigatorNode` objects to search within for the navigation node.\n   *\n   * @returns A `DocLink` object with the details of the found navigation node, or `undefined` if no matching node is found.\n   */\n  private createDocLinkToNavNode(\n    navNodePathLabels: string[],\n    quickLinkOverrides: Partial<DocLink> = {},\n    navNodes: NavigatorNode[]\n  ): DocLink | undefined {\n    const navNode = this.findVisibleNavNode(navNodePathLabels, navNodes);\n\n    if (!navNode) {\n      return;\n    }\n\n    return {\n      icon: navNode.icon,\n      type: 'doc',\n      label: navNode.label,\n      priority: navNode.priority,\n      url: this.ensureLeadingSlash(navNode.path),\n      ...quickLinkOverrides\n    } as DocLink;\n  }\n\n  /**\n   * Ensures the given path starts with a leading slash.\n   *\n   * @param path - The path to check.\n   * @returns The path with a leading slash.\n   */\n  private ensureLeadingSlash(path: string): string {\n    return path.startsWith('/') ? path : `/${path}`;\n  }\n\n  /**\n   * Recursively searches for a visible navigation node that matches the given path labels.\n   *\n   * @param navNodePathLabels - An array of labels representing the navigation path.\n   *                            This array is mutated as elements are shifted during recursion.\n   * @param navNodes - An array of `NavigatorNode` objects to search within. Defaults to `this.navNodes`.\n   *\n   * @returns The found `NavigatorNode`.\n   */\n  private findVisibleNavNode(\n    navNodePathLabels: string[],\n    navNodes: NavigatorNode[] = this.navNodes\n  ): NavigatorNode {\n    const currentLabel = navNodePathLabels.shift();\n    const navNode = navNodes.find(navNode => !navNode.hidden && navNode.label === currentLabel);\n    if (navNode && navNodePathLabels.length > 0) {\n      return this.findVisibleNavNode(navNodePathLabels, navNode.children);\n    }\n    return navNode;\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n  name: 'relativeUrlParser'\n})\nexport class RelativeUrlParserPipe implements PipeTransform {\n  transform(url: string): string {\n    if (!url) {\n      return '';\n    }\n\n    if (this.isAppUrl(url) || this.isFullUrl(url)) {\n      return url;\n    }\n\n    if (this.isQueryParameter(url)) {\n      const hash = window.location.hash;\n      if (hash.includes('?')) {\n        return `${hash}&${url.substring(1)}`;\n      }\n      return `${hash}${url}`;\n    }\n\n    if (this.isRelativeToBaseUrl(url)) {\n      return url;\n    }\n\n    if (this.isRelativeUrl(url)) {\n      return `#${url}`;\n    }\n\n    return url;\n  }\n\n  private isFullUrl(url: string): boolean {\n    return url.startsWith('http') || url.startsWith('https');\n  }\n\n  private isRelativeToBaseUrl(url: string): boolean {\n    return url.startsWith('#');\n  }\n\n  private isRelativeUrl(url: string): boolean {\n    return url.startsWith('/');\n  }\n\n  private isAppUrl(url: string): boolean {\n    return url.startsWith('/apps');\n  }\n\n  private isQueryParameter(url: string): boolean {\n    return url.startsWith('?');\n  }\n}\n","import { Component, inject, input, OnInit } from '@angular/core';\nimport {\n  AppHrefPipe,\n  AppIconComponent,\n  AppSwitcherService,\n  C8yTranslatePipe,\n  DashboardChildComponent,\n  EmptyStateComponent,\n  HumanizeAppNamePipe,\n  IconDirective\n} from '@c8y/ngx-components';\nimport { CommonModule as NgCommonModule } from '@angular/common';\n\nimport {\n  APPLICATIONS_WIDGET_ID,\n  ConvertibleWidgetID,\n  DEFAULT_DISPLAY_OPTION_VALUE,\n  DEFAULT_QUICK_LINK_ICON,\n  QuickLinkDisplayOption,\n  HELP_AND_SERVICE_WIDGET_ID,\n  QUICK_LINKS_DEVICE_MANAGEMENT_ID,\n  QuickLinksConfig,\n  WidgetConversionConfig\n} from '../quick-links.model';\nimport { isEmpty } from 'lodash';\nimport { QuickLinksService } from '../quick-links.service';\nimport { RelativeUrlParserPipe } from '../relative-url-parser.pipe';\nimport { firstValueFrom, take } from 'rxjs';\n\n@Component({\n  selector: 'c8y-quick-links-widget-view',\n  imports: [\n    NgCommonModule,\n    AppIconComponent,\n    RelativeUrlParserPipe,\n    EmptyStateComponent,\n    IconDirective,\n    C8yTranslatePipe\n  ],\n  templateUrl: './quick-links-widget-view.component.html',\n  providers: [AppHrefPipe, HumanizeAppNamePipe, RelativeUrlParserPipe]\n})\nexport class QuickLinksWidgetViewComponent implements OnInit {\n  config = input<QuickLinksConfig>();\n  isPreview = input<boolean>(false);\n\n  protected readonly DEFAULT_QUICK_LINK_ICON = DEFAULT_QUICK_LINK_ICON;\n  protected readonly DisplayOption = QuickLinkDisplayOption;\n\n  private readonly quickLinksService = inject(QuickLinksService);\n  private readonly dashboardChild = inject(DashboardChildComponent);\n  private readonly appSwitcherService = inject(AppSwitcherService);\n  private readonly appHrefPipe = inject(AppHrefPipe);\n  private readonly humanizeAppNamePipe = inject(HumanizeAppNamePipe);\n\n  ngOnInit(): void {\n    this.convertLegacyWidget();\n  }\n\n  /**\n   * The method is responsible for converting legacy widgets into their updated versions if a conversion is required.\n   *\n   * The widgets are being converted:\n   * - Help and Service Widget\n   * - Applications Widget\n   * - Quick Links - Device Management Widget\n   */\n  private convertLegacyWidget(): void {\n    if (!this.isConversionRequiredForWidget()) {\n      return;\n    }\n\n    const widgetId: ConvertibleWidgetID = this.getWidgetId();\n\n    const widgetConversionMap: Record<ConvertibleWidgetID, WidgetConversionConfig> = {\n      [HELP_AND_SERVICE_WIDGET_ID]: {\n        convertWidget: this.convertHelpAndServiceWidget.bind(this)\n      },\n      [APPLICATIONS_WIDGET_ID]: {\n        convertWidget: this.convertApplicationsWidget.bind(this)\n      },\n      [QUICK_LINKS_DEVICE_MANAGEMENT_ID]: {\n        convertWidget: this.convertDeviceManagementQuickLinksWidget.bind(this)\n      }\n    };\n\n    const widget: WidgetConversionConfig = widgetConversionMap[widgetId];\n\n    widget.convertWidget();\n  }\n\n  /**\n   * Converts the Device Management Quick Links widget by assigning default quick links for the device management app\n   * and updating the widget configuration with default options.\n   */\n  private convertDeviceManagementQuickLinksWidget(): void {\n    this.quickLinksService\n      .getQuickLinksForDeviceManagement$()\n      .pipe(take(1))\n      .subscribe(quickLinks => (this.config().links = quickLinks));\n\n    this.config().displayOption = DEFAULT_DISPLAY_OPTION_VALUE;\n  }\n\n  /**\n   * Converts the Applications widget by assigning default quick links\n   * and updating the widget configuration with default options.\n   */\n  private convertApplicationsWidget(): void {\n    this.appSwitcherService.apps$.pipe(take(1)).subscribe(\n      async oneCloudApps =>\n        (this.config().links = await Promise.all(\n          oneCloudApps.map(async app => ({\n            label: await firstValueFrom(this.humanizeAppNamePipe.transform(app)),\n            url: this.appHrefPipe.transform(app),\n            icon: null,\n            newTab: false,\n            app\n          }))\n        ))\n    );\n\n    this.config().displayOption = DEFAULT_DISPLAY_OPTION_VALUE;\n  }\n\n  /**\n   * Converts the Help and Service widget by assigning default quick links\n   * and updating the widget configuration with default options.\n   */\n  private convertHelpAndServiceWidget(): void {\n    this.quickLinksService\n      .getDefaultQuickLinks$()\n      .pipe(take(1))\n      .subscribe(quickLinks => (this.config().links = quickLinks));\n\n    this.config().displayOption = DEFAULT_DISPLAY_OPTION_VALUE;\n  }\n\n  /**\n   * Determines whether conversion is required for the widget.\n   * Conversion is needed if the widget configuration is empty and a valid widget ID exists.\n   *\n   * @returns `true` if conversion is required, otherwise `false`.\n   */\n  private isConversionRequiredForWidget(): boolean {\n    return isEmpty(this.config()) && !!this.getWidgetId();\n  }\n\n  /**\n   * Retrieves the widget ID from the dashboard child data.\n   * If `componentId` is available, it is returned; otherwise, the widget's `name` is used.\n   *\n   * @returns The widget ID as a `ConvertibleWidgetID`, based on `componentId` or `name`.\n   */\n  private getWidgetId(): ConvertibleWidgetID {\n    return this.dashboardChild['data']?.componentId\n      ? this.dashboardChild['data']?.componentId\n      : this.dashboardChild['data']?.name;\n  }\n}\n","@let links = config().links;\n@let pointerNoneStylesPreview = isPreview() ? { 'pointer-events': 'none' } : null;\n\n@if (config().displayOption === DisplayOption.GRID) {\n  @if (links?.length) {\n    <div class=\"card-group-block interact-grid border-top m-b-0\">\n      @for (link of links; track link) {\n        @let linkLabel = config().translateLinkLabels ? (link.label | translate) : link.label;\n        <a\n          class=\"card card--btn pointer\"\n          [ngStyle]=\"pointerNoneStylesPreview\"\n          [title]=\"linkLabel\"\n          [ngClass]=\"{\n            disabled: isPreview()\n          }\"\n          data-cy=\"c8y-quick-links-widget-view--quick-link-card\"\n          [attr.role]=\"isPreview() ? null : 'button'\"\n          [target]=\"!isPreview() && link.newTab ? '_blank' : '_self'\"\n          [attr.rel]=\"isPreview() ? null : 'noopener noreferrer'\"\n          [attr.href]=\"isPreview() ? null : (link.url | relativeUrlParser)\"\n        >\n          @if (link.newTab && !isPreview()) {\n            <div\n              class=\"card-actions showOnHover\"\n              title=\"{{ 'Open in new tab' | translate }}\"\n            >\n              <span class=\"dropdown-toggle c8y-dropdown\">\n                <i c8yIcon=\"external-link\"></i>\n              </span>\n            </div>\n          }\n\n          <div class=\"card-block text-center\">\n            <div class=\"icon-32\">\n              @if (link.icon) {\n                <i\n                  class=\"c8y-icon-duocolor\"\n                  [c8yIcon]=\"link.icon\"\n                ></i>\n              } @else {\n                <c8y-app-icon\n                  [name]=\"link.app.name\"\n                  [app]=\"link.app\"\n                  [contextPath]=\"link.app.contextPath\"\n                ></c8y-app-icon>\n              }\n            </div>\n            <small class=\"text-muted\">\n              {{ linkLabel }}\n            </small>\n          </div>\n        </a>\n      }\n    </div>\n  } @else {\n    <c8y-ui-empty-state\n      [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n      [title]=\"'No quick links to display.' | translate\"\n      [horizontal]=\"true\"\n    ></c8y-ui-empty-state>\n  }\n} @else {\n  @if (links?.length) {\n    <div class=\"separator-top\">\n      @for (link of links; track link) {\n        @let linkLabel = config().translateLinkLabels ? (link.label | translate) : link.label;\n        <a\n          class=\"d-flex a-i-center btn-clean gap-8 p-16 text-truncate separator-bottom\"\n          [ngStyle]=\"pointerNoneStylesPreview\"\n          [title]=\"linkLabel\"\n          data-cy=\"c8y-quick-links-widget-view--quick-link-list-item\"\n          [attr.role]=\"isPreview() ? null : 'button'\"\n          [target]=\"!isPreview() && link.newTab ? '_blank' : '_self'\"\n          [attr.rel]=\"isPreview() ? null : 'noopener noreferrer'\"\n          [attr.href]=\"isPreview() ? null : (link.url | relativeUrlParser)\"\n        >\n          @if (link.icon) {\n            <i\n              class=\"c8y-icon-duocolor icon-24\"\n              [c8yIcon]=\"link.icon\"\n            ></i>\n          } @else {\n            <c8y-app-icon\n              [name]=\"link.app.name\"\n              [app]=\"link.app\"\n              [contextPath]=\"link.app.contextPath\"\n            ></c8y-app-icon>\n          }\n\n          <span\n            class=\"text-truncate\"\n            [title]=\"linkLabel\"\n          >\n            {{ linkLabel }}\n          </span>\n          @if (link.newTab) {\n            <i\n              class=\"text-muted m-l-auto showOnHover\"\n              [c8yIcon]=\"'external-link'\"\n              title=\"{{ 'Open in new tab' | translate }}\"\n            ></i>\n          }\n        </a>\n      }\n    </div>\n  } @else {\n    <c8y-ui-empty-state\n      [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n      [title]=\"'No quick links to display.' | translate\"\n      [horizontal]=\"true\"\n    ></c8y-ui-empty-state>\n  }\n}\n","import { Component, inject, input, WritableSignal } from '@angular/core';\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\nimport {\n  AppIconComponent,\n  C8yTranslateModule,\n  DynamicFormsModule,\n  FormsModule,\n  IconDirective,\n  ListGroupModule,\n  ChangeIconComponent\n} from '@c8y/ngx-components';\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { IQuickLink, QuickLinksConfig } from '../quick-links.model';\nimport { IconSelectorService } from '@c8y/ngx-components/icon-selector';\nimport { IApplication } from '@c8y/client';\nimport { NgClass } from '@angular/common';\n\n@Component({\n  selector: 'c8y-quick-links-widget-config-list',\n  host: {\n    class: 'd-contents'\n  },\n  imports: [\n    FormsModule,\n    DragDropModule,\n    TooltipModule,\n    PopoverModule,\n    ListGroupModule,\n    DynamicFormsModule,\n    AppIconComponent,\n    C8yTranslateModule,\n    IconDirective,\n    ChangeIconComponent,\n    NgClass\n  ],\n  templateUrl: './quick-links-widget-config-list.component.html'\n})\nexport class QuickLinksWidgetConfigListComponent {\n  quickLinksForm = input<FormGroup>();\n  config = input<QuickLinksConfig>();\n  quickLinksFormArray = input<FormArray>();\n  appsNameChanged = input<WritableSignal<IApplication[]>>();\n\n  private readonly iconSelector = inject(IconSelectorService);\n\n  drop(event: CdkDragDrop<IQuickLink[]>): void {\n    moveItemInArray(this.config().links, event.previousIndex, event.currentIndex);\n    moveItemInArray(this.quickLinksFormArray().controls, event.previousIndex, event.currentIndex);\n  }\n\n  async changeLinkIcon(linkForm: AbstractControl<any, any>): Promise<void> {\n    try {\n      const isIconPresent = !!linkForm.get('icon')?.value;\n      const newIcon = await this.iconSelector.selectIcon();\n\n      if (newIcon) {\n        linkForm.patchValue({ icon: newIcon });\n        this.config().links = this.getQuickLinks();\n      }\n\n      const isAppIconChange = !!linkForm.get('app')?.value;\n      if (isAppIconChange && !isIconPresent) {\n        this.appsNameChanged().update(apps => [...apps, linkForm.get('app')?.value]);\n      }\n    } catch {\n      // Nothing to do if the user cancels icon selection\n    }\n  }\n\n  removeLink(index: number): void {\n    const quickLinksFormArray = this.quickLinksForm().get('quickLinks') as FormArray;\n    quickLinksFormArray.removeAt(index);\n    this.config().links = this.getQuickLinks();\n  }\n\n  getQuickLinks(): IQuickLink[] {\n    return this.quickLinksForm().getRawValue().quickLinks as IQuickLink[];\n  }\n}\n","<c8y-list-group\n  class=\"cdk-droplist no-border-last separator-top\"\n  cdkDropList\n  (cdkDropListDropped)=\"drop($event)\"\n  [cdkDropListDisabled]=\"getQuickLinks().length < 2\"\n>\n  <form\n    class=\"d-contents\"\n    [formGroup]=\"quickLinksForm()\"\n  >\n    <div\n      class=\"d-contents\"\n      [formArrayName]=\"'quickLinks'\"\n    >\n      @for (link of quickLinksFormArray().controls; track link; let i = $index) {\n        @let linkValue = link.getRawValue();\n\n        <c8y-li\n          [dense]=\"true\"\n          [formGroupName]=\"i\"\n          cdkDrag\n        >\n          <c8y-li-drag-handle\n            title=\"{{ 'Drag to reorder' | translate }}\"\n            cdkDragHandle\n          >\n            <i c8yIcon=\"drag-reorder\"></i>\n          </c8y-li-drag-handle>\n          <c8y-li-icon\n            class=\"icon-24 p-relative changeIcon a-s-stretch\"\n            [ngClass]=\"{\n              'm-l-16': getQuickLinks().length < 2\n            }\"\n          >\n            @if (linkValue.icon) {\n              <c8y-change-icon\n                [currentIcon]=\"linkValue.icon\"\n                (onButtonClick)=\"changeLinkIcon(link)\"\n              ></c8y-change-icon>\n            } @else {\n              <c8y-change-icon (onButtonClick)=\"changeLinkIcon(link)\">\n                <c8y-app-icon\n                  [name]=\"linkValue.app.name\"\n                  [app]=\"linkValue.app\"\n                  [contextPath]=\"linkValue.app.contextPath\"\n                ></c8y-app-icon>\n              </c8y-change-icon>\n            }\n          </c8y-li-icon>\n\n          <div class=\"d-flex gap-8 a-i-center\">\n            <div class=\"input-group input-group-editable\">\n              <input\n                class=\"form-control\"\n                formControlName=\"label\"\n                [placeholder]=\"'e.g. my Quick Link' | translate\"\n              />\n              <span></span>\n            </div>\n\n            <button\n              class=\"showOnHover btn-dot btn-dot--danger m-l-auto\"\n              [attr.aria-label]=\"'Delete' | translate\"\n              tooltip=\"{{ 'Delete' | translate }}\"\n              placement=\"top\"\n              type=\"button\"\n              [delay]=\"500\"\n              (click)=\"removeLink(i)\"\n            >\n              <i c8yIcon=\"minus-circle\"></i>\n            </button>\n          </div>\n          <c8y-list-item-collapse>\n            <div class=\"d-flex a-i-center gap-24\">\n              <div class=\"form-group flex-grow\">\n                <label for=\"ql-url\">{{ 'URL' | translate }}</label>\n                <input\n                  class=\"form-control\"\n                  id=\"ql-url\"\n                  type=\"text\"\n                  formControlName=\"url\"\n                  maxlength=\"150\"\n                  [placeholder]=\"'e.g. https://www.example.com' | translate\"\n                />\n              </div>\n              <div class=\"form-group flex-noshrink\">\n                <label>&nbsp;</label>\n                <label\n                  class=\"c8y-checkbox\"\n                  title=\"{{ 'Open the link in a new browser tab' | translate }}\"\n                >\n                  <input\n                    [attr.aria-label]=\"'Open in new tab' | translate\"\n                    type=\"checkbox\"\n                    formControlName=\"newTab\"\n                    checked=\"checked\"\n                  />\n                  <span></span>\n                  <span>{{ 'New tab' | translate }}</span>\n                </label>\n              </div>\n            </div>\n          </c8y-list-item-collapse>\n        </c8y-li>\n      }\n    </div>\n  </form>\n</c8y-list-group>\n","import {\n  Component,\n  inject,\n  input,\n  OnDestroy,\n  OnInit,\n  signal,\n  TemplateRef,\n  ViewChild\n} from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  C8yTranslateModule,\n  DashboardChildComponent,\n  DashboardComponent,\n  EmptyStateComponent,\n  HumanizeAppNamePipe,\n  InterAppService,\n  ModalService,\n  OnBeforeSave,\n  Status,\n  SupportedApps,\n  IconDirective\n} from '@c8y/ngx-components';\nimport { CommonModule as NgCommonModule } from '@angular/common';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport {\n  DEFAULT_DISPLAY_OPTION_VALUE,\n  DEFAULT_QUICK_LINK_ICON,\n  QuickLinkDisplayOption,\n  DisplayOptionType,\n  IQuickLink,\n  QuickLinksConfig,\n  URL_VALIDATOR_PATTERN\n} from '../quick-links.model';\nimport { QuickLinksWidgetConfigAddLinkComponent } from './quick-links-widget-config-add-link.component';\nimport { forkJoin, lastValueFrom, Subject, switchMap, take } from 'rxjs';\nimport { QuickLinksWidgetViewComponent } from '../quick-links-widget-view/quick-links-widget-view.component';\nimport { QuickLinksService } from '../quick-links.service';\nimport { IApplication } from '@c8y/client';\nimport { FormArray, FormBuilder, FormsModule, NgForm, Validators } from '@angular/forms';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { QuickLinksWidgetConfigListComponent } from './quick-links-widget-config-list.component';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n  selector: 'c8y-quick-links-widget-config',\n  imports: [\n    NgCommonModule,\n    TooltipModule,\n    PopoverModule,\n    QuickLinksWidgetConfigAddLinkComponent,\n    QuickLinksWidgetViewComponent,\n    QuickLinksWidgetConfigListComponent,\n    C8yTranslateModule,\n    EmptyStateComponent,\n    FormsModule,\n    IconDirective,\n    CollapseModule\n  ],\n  templateUrl: './quick-links-widget-config.component.html',\n  providers: [DashboardChildComponent, DashboardComponent]\n})\nexport class QuickLinksWidgetConfigComponent implements OnInit, OnBeforeSave, OnDestroy {\n  config = input<QuickLinksConfig>();\n\n  quickLinksForm: ReturnType<QuickLinksWidgetConfigComponent['initForm']>;\n  selectedDisplayOption: DisplayOptionType = DEFAULT_DISPLAY_OPTION_VALUE;\n  appsNameChanged = signal<IApplication[]>([]);\n  addLinkIsCollapsed = true;\n\n  @ViewChild('quickLinksPreview')\n  set previewSet(template: TemplateRef<any>) {\n    if (template) {\n      this.widgetConfigService.setPreview(template);\n      return;\n    }\n    this.widgetConfigService.setPreview(null);\n  }\n\n  private destroy$ = new Subject<void>();\n\n  readonly DEFAULT_QUICK_LINK_ICON = DEFAULT_QUICK_LINK_ICON;\n  readonly DisplayOption = QuickLinkDisplayOption;\n  private readonly CHANGE_DEFAULT_ICON_LABEL = gettext('You have changed the quick link icon for:');\n  private readonly SAVE_CHANGES_LABEL = gettext(\n    'Please note that this action is irreversible. Do you want to save your changes?'\n  );\n\n  get quickLinksFormArray(): FormArray {\n    return this.quickLinksForm.get('quickLinks') as FormArray;\n  }\n\n  private readonly quickLinksService = inject(QuickLinksService);\n  private readonly modalService = inject(ModalService);\n  private readonly humanizeAppNamePipe = inject(HumanizeAppNamePipe);\n  private readonly interAppService = inject(InterAppService);\n  private readonly formBuilder = inject(FormBuilder);\n  private readonly translateService = inject(TranslateService);\n  private readonly widgetConfigService = inject(WidgetConfigService);\n  private readonly parentForm = inject(NgForm, { optional: true });\n\n  ngOnInit(): void {\n    this.onInitConfig();\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n\n    if (this.parentForm) {\n      this.parentForm.form.removeControl('quickLinks');\n    }\n  }\n\n  getQuickLinks(): IQuickLink[] {\n    return this.quickLinksForm.getRawValue().quickLinks as IQuickLink[];\n  }\n\n  addQuickLink(link: IQuickLink): void {\n    const quickLinkForm = this.formBuilder.group({\n      icon: [link?.icon],\n      label: [link?.label || '', [Validators.required, Validators.maxLength(50)]],\n      url: [link?.url || '', [Validators.required, Validators.pattern(URL_VALIDATOR_PATTERN)]],\n      newTab: [link?.newTab || false],\n      app: [link?.app]\n    });\n\n    this.quickLinksFormArray.push(quickLinkForm);\n\n    this.config().links = this.getQuickLinks();\n  }\n\n  async onBeforeSave(config?: QuickLinksConfig): Promise<boolean> {\n    try {\n      await this.confirmAppIconChanges();\n\n      config.links = this.getQuickLinks();\n      config.displayOption = this.selectedDisplayOption;\n\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  assignLinksToConfig(): void {\n    this.interAppService\n      .isCurrentApp$(SupportedApps.devicemanagement)\n      .pipe(\n        take(1),\n        switchMap(isDeviceManagement =>\n          isDeviceManagement\n            ? this.quickLinksService.getQuickLinksForDeviceManagement$()\n            : this.quickLinksService.getDefaultQuickLinks$()\n        )\n      )\n      .subscribe(quickLinks => (this.config().links = quickLinks));\n  }\n\n  resetLinks(): void {\n    this.quickLinksForm = this.initForm();\n    this.assignLinksToConfig();\n    this.config().links.forEach(link => this.addQuickLink(link));\n  }\n\n  private onInitConfig(): void {\n    this.setupQuickLinksForm();\n\n    if (!this.config().links) {\n      this.assignLinksToConfig();\n    }\n\n    this.config().links.forEach(link => this.addQuickLink(link));\n\n    if (!this.config().displayOption) {\n      this.config().displayOption = this.selectedDisplayOption;\n      return;\n    }\n    this.selectedDisplayOption = this.config().displayOption;\n  }\n\n  private setupQuickLinksForm(): void {\n    this.quickLinksForm = this.initForm();\n\n    if (this.parentForm) {\n      this.parentForm.form.addControl('quickLinks', this.quickLinksForm);\n    }\n  }\n\n  private async confirmAppIconChanges(): Promise<void> {\n    if (this.appsNameChanged().length > 0) {\n      const appNameObservables = this.appsNameChanged().map(app =>\n        this.humanizeAppNamePipe.transform(app).pipe(take(1))\n      );\n\n      const appNames = await lastValueFrom(forkJoin(appNameObservables));\n\n      const CHANGE_DEFAULT_ICON_LABEL_TRANSLATED = this.translateService.instant(\n        this.CHANGE_DEFAULT_ICON_LABEL\n      );\n      const SAVE_CHANGES_LABEL_TRANSLATED = this.translateService.instant(this.SAVE_CHANGES_LABEL);\n\n      const modalMessage = `${CHANGE_DEFAULT_ICON_LABEL_TRANSLATED} ${appNames.join(', ')}. ${SAVE_CHANGES_LABEL_TRANSLATED}`;\n\n      await this.modalService.confirm(\n        gettext('Confirm Quick Link Icon Change'),\n        modalMessage,\n        Status.INFO,\n        {\n          ok: gettext('Save')\n        }\n      );\n    }\n  }\n\n  private initForm() {\n    return this.formBuilder.group({\n      quickLinks: this.formBuilder.array([])\n    });\n  }\n}\n","<fieldset class=\"c8y-fieldset\">\n  <legend>{{ 'General' | translate }}</legend>\n  <div class=\"d-flex a-i-center gap-8 p-b-8\">\n    <label class=\"m-b-0 text-label-small\">{{ 'Display as' | translate }}</label>\n    <div class=\"c8y-select-wrapper form-group-sm\">\n      <select\n        class=\"form-control\"\n        title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n        [(ngModel)]=\"selectedDisplayOption\"\n      >\n        <option [value]=\"DisplayOption.GRID\">\n          {{ DisplayOption.GRID | translate }}\n        </option>\n        <option [value]=\"DisplayOption.LIST\">\n          {{ DisplayOption.LIST | translate }}\n        </option>\n      </select>\n    </div>\n    <label\n      class=\"c8y-checkbox m-l-auto\"\n      title=\"{{ 'Translate labels if possible' | translate }}\"\n    >\n      <input\n        type=\"checkbox\"\n        [(ngModel)]=\"config().translateLinkLabels\"\n      />\n      <span></span>\n      <span>{{ 'Translate labels if possible' | translate }}</span>\n    </label>\n  </div>\n</fieldset>\n\n<fieldset class=\"c8y-fieldset\">\n  <legend>{{ 'Links' | translate }}</legend>\n  <div class=\"d-flex a-i-center gap-8 p-b-8\">\n    <button\n      class=\"btn btn-clean btn-sm\"\n      title=\"{{ 'Add a quick link' | translate }}\"\n      type=\"button\"\n      (click)=\"addLinkIsCollapsed = !addLinkIsCollapsed\"\n    >\n      <i [c8yIcon]=\"'plus-circle'\"></i>\n      {{ 'Add a quick link' | translate }}\n    </button>\n\n    <button\n      class=\"btn btn-clean btn-sm\"\n      title=\"{{ 'Reset links' | translate }}\"\n      [popover]=\"confirmPopover\"\n      placement=\"bottom\"\n      container=\"body\"\n      type=\"button\"\n      [adaptivePosition]=\"false\"\n      [outsideClick]=\"true\"\n      #pop=\"bs-popover\"\n    >\n      <i [c8yIcon]=\"'reset'\"></i>\n      {{ 'Reset links' | translate }}\n    </button>\n    <ng-template #confirmPopover>\n      <p class=\"m-b-8\">\n        {{\n          'Resetting links removes all custom links and resets the widget to its default state.'\n            | translate\n        }}\n      </p>\n      <button\n        class=\"btn btn-default btn-sm\"\n        (click)=\"pop.hide()\"\n      >\n        {{ 'Cancel' | translate }}\n      </button>\n      <button\n        class=\"btn btn-primary btn-sm\"\n        (click)=\"resetLinks(); pop.hide()\"\n      >\n        {{ 'Reset links' | translate }}\n      </button>\n    </ng-template>\n  </div>\n  <div\n    class=\"collapse bg.component\"\n    #collapse=\"bs-collapse\"\n    [collapse]=\"addLinkIsCollapsed\"\n    [isAnimated]=\"true\"\n  >\n    <fieldset class=\"c8y-fieldset\">\n      <legend>{{ 'Add a quick link' | translate }}</legend>\n      <c8y-quick-links-widget-config-add-link\n        class=\"d-block p-b-16 p-l-8 p-r-8\"\n        (onQuickLinkCreated)=\"addQuickLink($event); addLinkIsCollapsed = true\"\n        (onCancel)=\"addLinkIsCollapsed = true\"\n      ></c8y-quick-links-widget-config-add-link>\n    </fieldset>\n  </div>\n\n  @if (config().links.length) {\n    <c8y-quick-links-widget-config-list\n      class=\"separator-top\"\n      [quickLinksForm]=\"quickLinksForm\"\n      [config]=\"config()\"\n      [quickLinksFormArray]=\"quickLinksFormArray\"\n      [appsNameChanged]=\"appsNameChanged\"\n    ></c8y-quick-links-widget-config-list>\n  } @else {\n    <c8y-ui-empty-state\n      [icon]=\"DEFAULT_QUICK_LINK_ICON\"\n      [title]=\"'No quick links to display' | translate\"\n      [horizontal]=\"true\"\n    >\n      <div>\n        <button\n          class=\"btn btn-primary m-t-16\"\n          title=\"{{ 'Reset links' | translate }}\"\n          type=\"button\"\n          (click)=\"resetLinks()\"\n          translate\n        >\n          Reset links\n        </button>\n      </div>\n    </c8y-ui-empty-state>\n  }\n</fieldset>\n\n<ng-template #quickLinksPreview>\n  <c8y-quick-links-widget-view\n    [config]=\"{\n      links: getQuickLinks(),\n      displayOption: selectedDisplayOption,\n      translateLinkLabels: config().translateLinkLabels\n    }\"\n    [isPreview]=\"true\"\n  ></c8y-quick-links-widget-view>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgCommonModule","i1","switchMap","FormsModule","i3","i4"],"mappings":"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"}