@c8y/ngx-components 1024.2.4 → 1024.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/fesm2022/{c8y-ngx-components-asset-property-grid.component-DhfJagxU.mjs → c8y-ngx-components-asset-property-grid.component-Ddva2QJW.mjs} +35 -19
  2. package/fesm2022/c8y-ngx-components-asset-property-grid.component-Ddva2QJW.mjs.map +1 -0
  3. package/fesm2022/c8y-ngx-components-bookmarks.mjs +33 -23
  4. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  5. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +30 -16
  6. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +3 -2
  8. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +2 -2
  10. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-device-profile.mjs +27 -9
  12. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  13. package/fesm2022/c8y-ngx-components-icon-selector.mjs +1538 -59
  14. package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
  15. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +9 -11
  16. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  17. package/fesm2022/c8y-ngx-components-remote-access-data.mjs +52 -2
  18. package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +17 -3
  20. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +184 -41
  22. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -1
  23. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +94 -49
  24. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  25. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +5 -4
  26. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  27. package/fesm2022/c8y-ngx-components-repository-software.mjs +10 -4
  28. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  29. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +5 -4
  30. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  31. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +6 -5
  32. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
  33. package/fesm2022/c8y-ngx-components.mjs +10 -5
  34. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  35. package/locales/de.po +327 -8
  36. package/locales/es.po +327 -8
  37. package/locales/fr.po +327 -8
  38. package/locales/ja_JP.po +325 -9
  39. package/locales/ko.po +327 -8
  40. package/locales/locales.pot +326 -7
  41. package/locales/nl.po +327 -8
  42. package/locales/pl.po +327 -8
  43. package/locales/pt_BR.po +327 -8
  44. package/locales/zh_CN.po +327 -8
  45. package/locales/zh_TW.po +327 -8
  46. package/package.json +1 -1
  47. package/types/c8y-ngx-components-bookmarks.d.ts +7 -7
  48. package/types/c8y-ngx-components-bookmarks.d.ts.map +1 -1
  49. package/types/c8y-ngx-components-context-dashboard.d.ts +7 -3
  50. package/types/c8y-ngx-components-context-dashboard.d.ts.map +1 -1
  51. package/types/c8y-ngx-components-device-profile.d.ts +5 -2
  52. package/types/c8y-ngx-components-device-profile.d.ts.map +1 -1
  53. package/types/c8y-ngx-components-icon-selector.d.ts +286 -32
  54. package/types/c8y-ngx-components-icon-selector.d.ts.map +1 -1
  55. package/types/c8y-ngx-components-protocol-opcua.d.ts.map +1 -1
  56. package/types/c8y-ngx-components-remote-access-data.d.ts +27 -1
  57. package/types/c8y-ngx-components-remote-access-data.d.ts.map +1 -1
  58. package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts +10 -3
  59. package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts.map +1 -1
  60. package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts +20 -2
  61. package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts.map +1 -1
  62. package/types/c8y-ngx-components-repository-configuration.d.ts +20 -10
  63. package/types/c8y-ngx-components-repository-configuration.d.ts.map +1 -1
  64. package/types/c8y-ngx-components-repository-firmware.d.ts.map +1 -1
  65. package/types/c8y-ngx-components-repository-software.d.ts +2 -0
  66. package/types/c8y-ngx-components-repository-software.d.ts.map +1 -1
  67. package/types/c8y-ngx-components-trusted-certificates.d.ts.map +1 -1
  68. package/types/c8y-ngx-components-widgets-implementations-asset-table.d.ts.map +1 -1
  69. package/types/c8y-ngx-components.d.ts +5 -1
  70. package/types/c8y-ngx-components.d.ts.map +1 -1
  71. package/fesm2022/c8y-ngx-components-asset-property-grid.component-DhfJagxU.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-icon-selector.mjs","sources":["../../icon-selector/icon-name.pipe.ts","../../icon-selector/icon-selector.component.ts","../../icon-selector/icon-selector.component.html","../../icon-selector/icon-selector-modal/icon-selector-modal.component.ts","../../icon-selector/icon-selector-modal/icon-selector-modal.component.html","../../icon-selector/icon-selector.service.ts","../../icon-selector/icon-selector-wrapper/icon-selector-wrapper.component.ts","../../icon-selector/icon-selector-wrapper/icon-selector-wrapper.component.html","../../icon-selector/icon-selector.module.ts","../../icon-selector/c8y-ngx-components-icon-selector.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'iconName' })\nexport class IconNamePipe implements PipeTransform {\n transform(icon: string): string {\n if (icon.startsWith('c8y-')) {\n return icon.replace(/^c8y-/, '');\n }\n return icon;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { BehaviorSubject, Observable, combineLatest, defer, from } from 'rxjs';\nimport { debounceTime, map, shareReplay, startWith } from 'rxjs/operators';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n IconDirective,\n C8yTranslateDirective,\n C8yTranslatePipe,\n EmptyStateComponent\n} from '@c8y/ngx-components';\nimport { clone } from 'lodash-es';\nimport { DefaultIconDefinition } from '@c8y/ngx-components/icon-selector/model';\nimport { SupportedIconsSuggestions } from '@c8y/ngx-components/icon-selector/icons';\nimport { FormsModule } from '@angular/forms';\nimport { AsyncPipe, NgClass } from '@angular/common';\nimport { IconNamePipe } from './icon-name.pipe';\n\nconst allIconCategory = gettext('All`icons-category`');\n\n@Component({\n selector: 'c8y-icon-selector',\n templateUrl: './icon-selector.component.html',\n styleUrls: [],\n imports: [\n FormsModule,\n IconDirective,\n C8yTranslateDirective,\n C8yTranslatePipe,\n AsyncPipe,\n NgClass,\n IconNamePipe,\n EmptyStateComponent\n ]\n})\nexport class IconSelectorComponent {\n @Input() iconCategoriesToExclude: string[] = [];\n @Input() showIconClass = true;\n @Output() onSelect = new EventEmitter<string>();\n @Input() selectedIcon: SupportedIconsSuggestions;\n\n icons$: Observable<DefaultIconDefinition[]>;\n filteredIcons$: Observable<DefaultIconDefinition[]>;\n searchTerm$ = new BehaviorSubject('');\n selectedIconCategory$ = new BehaviorSubject<string>(allIconCategory);\n availableIconCategories$: Observable<string[]>;\n\n constructor() {\n this.icons$ = defer(() => from(this.loadIconDefinitions())).pipe(\n map(icons => icons.filter(tmp => !this.iconCategoriesToExclude.includes(tmp.label))),\n shareReplay({ refCount: true, bufferSize: 1 })\n );\n this.filteredIcons$ = combineLatest([\n this.icons$,\n this.searchTerm$.pipe(debounceTime(500), startWith(this.searchTerm$.value)),\n this.selectedIconCategory$\n ]).pipe(\n map(([icons, searchTerm, category]) =>\n this.filterIconsByCategoryAndSearchTerm(icons, category, searchTerm)\n )\n );\n this.availableIconCategories$ = this.icons$.pipe(\n map(icons => [allIconCategory, ...icons.map(tmp => tmp.label)])\n );\n }\n\n async loadIconDefinitions(): Promise<DefaultIconDefinition[]> {\n const { allIcons } = await import('@c8y/ngx-components/icon-selector/icons');\n return allIcons;\n }\n\n filterIconsByCategoryAndSearchTerm(\n iconCategories: DefaultIconDefinition[],\n selectedCategory: string,\n searchTerm: string\n ): DefaultIconDefinition[] {\n if (selectedCategory !== allIconCategory) {\n iconCategories = iconCategories.filter(category => category.label === selectedCategory);\n }\n\n if (searchTerm) {\n const lowerCaseSearchTerm = searchTerm.toLowerCase();\n const matchingCategories = new Array<DefaultIconDefinition>();\n for (const category of iconCategories) {\n const matchingIcons = category.icons.filter(iconClasses =>\n iconClasses.some(iconClass => iconClass.includes(lowerCaseSearchTerm))\n );\n if (matchingIcons.length) {\n matchingCategories.push({ ...clone(category), icons: matchingIcons });\n }\n }\n return matchingCategories;\n }\n\n return iconCategories;\n }\n\n onSearchChange(searchTerm: string) {\n this.searchTerm$.next(searchTerm);\n }\n\n onCategoryFilterChanged(categoryChange: string): void {\n this.selectedIconCategory$.next(categoryChange);\n }\n\n onIconClicked(icon: ReadonlyArray<string>): void {\n this.selectedIcon = icon[0];\n this.onSelect.emit(icon[0]);\n }\n}\n","<div class=\"p-l-24 p-r-24 p-t-8 p-b-8 separator-bottom\">\n <div class=\"row d-flex-sm\">\n <div class=\"col-sm-6 m-b-8\">\n <div\n class=\"input-group-search input-group\"\n style=\"width: auto\"\n >\n <input\n class=\"form-control\"\n id=\"filter-icons\"\n placeholder=\"{{ 'Type to filter icons…' | translate }}\"\n type=\"search\"\n [ngModel]=\"searchTerm$ | async\"\n (ngModelChange)=\"onSearchChange($event)\"\n />\n @if (searchTerm$ | async) {\n <span\n class=\"input-group-addon pointer\"\n (click)=\"onSearchChange('')\"\n >\n <i c8yIcon=\"times\"></i>\n </span>\n } @else {\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\"></i>\n </span>\n }\n </div>\n </div>\n <div class=\"col-sm-6 m-b-8 text-right\">\n <div class=\"d-inline-flex a-i-center text-left\">\n <label\n class=\"m-b-0 m-r-8 flex-no-shrink\"\n translate\n >\n Filter by type\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"exampleSelect\"\n [ngModel]=\"selectedIconCategory$ | async\"\n (ngModelChange)=\"onCategoryFilterChanged($event)\"\n >\n @for (category of availableIconCategories$ | async; track category) {\n <option [ngValue]=\"category\">\n {{ category | translate }}\n </option>\n }\n </select>\n <span></span>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"modal-inner-scroll\">\n <div\n class=\"modal-body\"\n style=\"height: calc(100vh - 293px)\"\n >\n <div class=\"dtm-icon-grid\">\n @for (iconDefinition of filteredIcons$ | async; track iconDefinition) {\n <div class=\"d-contents\">\n <div class=\"legend form-block center grid__col--fullspan\">\n {{ iconDefinition.label | translate }}\n </div>\n\n @for (icon of iconDefinition.icons; track icon) {\n <div class=\"d-contents\">\n <div\n class=\"dtm-icon-grid__item\"\n [ngClass]=\"{\n 'dtm-icon-grid__item--selected': selectedIcon && icon[0] === selectedIcon\n }\"\n >\n <button\n class=\"dtm-icon-grid__btn\"\n [title]=\"icon[0] | iconName\"\n (click)=\"onIconClicked(icon)\"\n >\n <i\n class=\"icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"icon[0]\"\n ></i>\n @if (showIconClass) {\n <small class=\"d-block text-center text-break-word\">\n {{ icon[0] | iconName }}\n </small>\n }\n </button>\n </div>\n </div>\n }\n </div>\n } @empty {\n <c8y-ui-empty-state\n icon=\"search\"\n style=\"grid-column: 1 / 3\"\n [title]=\"'No icons found' | translate\"\n [subtitle]=\"\n 'Try adjusting your search or filter to find what you\\'re looking for.' | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n </div>\n </div>\n</div>\n","import { Component } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { IconSelectorComponent } from '../icon-selector.component';\n\n@Component({\n selector: 'c8y-icon-selector-modal',\n templateUrl: './icon-selector-modal.component.html',\n imports: [IconSelectorComponent, C8yTranslatePipe]\n})\nexport class IconSelectorModalComponent {\n title: string = gettext('Select icon');\n currentSelection: string;\n saveButtonLabel: string = gettext('Select');\n iconCategoriesToExclude: string[] = [];\n showIconClass = true;\n\n readonly result: Promise<string> = new Promise((resolve, reject) => {\n this.save = resolve;\n this.cancel = reject;\n });\n\n private save: (value: string) => void;\n private cancel: (reason?: any) => void;\n\n constructor(private bsModal: BsModalRef) {}\n\n close() {\n this.bsModal.hide();\n this.cancel();\n }\n\n saveChanges(): void {\n this.bsModal.hide();\n this.save(this.currentSelection);\n }\n\n selectionChange(newSelection: string) {\n this.currentSelection = newSelection;\n }\n}\n","<div class=\"modal-header\">\n <div id=\"modal-title\" class=\"modal-title h4\">{{ title | translate }}</div>\n</div>\n<div id=\"modal-body\">\n <c8y-icon-selector\n (onSelect)=\"selectionChange($event)\"\n [selectedIcon]=\"currentSelection\"\n [iconCategoriesToExclude]=\"iconCategoriesToExclude\"\n [showIconClass]=\"showIconClass\"\n ></c8y-icon-selector>\n</div>\n<div class=\"modal-footer separator text-center\">\n <button class=\"btn btn-default\" (click)=\"close()\">\n {{ 'Cancel' | translate }}\n </button>\n <button class=\"btn btn-primary\" [disabled]=\"!currentSelection\" (click)=\"saveChanges()\">\n {{ saveButtonLabel | translate }}\n </button>\n</div>\n","import { Injectable } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { IconSelectorModalComponent } from './icon-selector-modal/icon-selector-modal.component';\n\n@Injectable({ providedIn: 'root' })\nexport class IconSelectorService {\n constructor(protected modal: BsModalService) {}\n\n selectIcon(\n initialState: Partial<\n Pick<\n IconSelectorModalComponent,\n | 'currentSelection'\n | 'title'\n | 'saveButtonLabel'\n | 'iconCategoriesToExclude'\n | 'showIconClass'\n >\n > = {}\n ): Promise<string> {\n const modal = this.modal.show(IconSelectorModalComponent, {\n ignoreBackdropClick: true,\n keyboard: false,\n initialState,\n class: 'modal-lg'\n });\n const content = modal.content as IconSelectorModalComponent;\n return content.result;\n }\n}\n","import { Component, forwardRef, Input, Output, EventEmitter } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { IconSelectorService } from '../icon-selector.service';\nimport { GainsightService, IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { PRODUCT_EXPERIENCE_ICON_SELECTOR } from '@c8y/ngx-components/icon-selector/model';\nimport { NgIf } from '@angular/common';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n/**\n * A component which acts as a wrapper for the icon selector.\n *\n * Example 1:\n * ```\n <c8y-icon-selector-wrapper\n [selectedIcon]=\"'water'\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n * ```\n * OR as a part of a formGroup\n * Example 2:\n * ```\n <c8y-icon-selector-wrapper name=\"icon\" formControlName=\"icon\">\n </c8y-icon-selector-wrapper>\n * ```\n */\n@Component({\n selector: 'c8y-icon-selector-wrapper',\n templateUrl: './icon-selector-wrapper.component.html',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => IconSelectorWrapperComponent),\n multi: true\n }\n ],\n imports: [NgIf, IconDirective, TooltipDirective, C8yTranslatePipe]\n})\nexport class IconSelectorWrapperComponent implements ControlValueAccessor {\n @Input() canRemoveIcon = false;\n @Input() selectedIcon: string;\n /**\n * The displayed icon size, the value has to be multiple of 8.\n */\n @Input() iconSize = 32;\n @Output() onSelect: EventEmitter<string> = new EventEmitter();\n\n /**\n * @ignore\n */\n onTouched: () => void;\n\n constructor(\n private iconSelector: IconSelectorService,\n private gainsightService: GainsightService\n ) {}\n\n /**\n * @ignore\n */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onChange: (value: string) => void = () => {};\n\n /**\n * @ignore\n * @param icon The value to update\n */\n writeValue(icon: string): void {\n this.selectedIcon = icon;\n }\n\n /**\n * @ignore\n * @param fn The function to register for changes\n */\n registerOnChange(fn: () => void): void {\n this.onChange = fn;\n }\n\n /**\n * @ignore\n * @param fn The function to register for changes\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n removeIcon() {\n this.onSelect.emit(undefined);\n }\n\n async openIconSelector() {\n try {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ICON_SELECTOR.EVENTS.ICON_SELECTOR, {\n component: PRODUCT_EXPERIENCE_ICON_SELECTOR.COMPONENTS.ICON_SELECTOR_WRAPPER_COMPONENT,\n action: PRODUCT_EXPERIENCE_ICON_SELECTOR.ACTIONS.OPEN_ICON_SELECTOR\n });\n const icon = await this.iconSelector.selectIcon({\n currentSelection: this.selectedIcon\n });\n this.onChange(icon);\n this.selectedIcon = icon;\n this.onSelect.emit(icon);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ICON_SELECTOR.EVENTS.ICON_SELECTOR, {\n component: PRODUCT_EXPERIENCE_ICON_SELECTOR.COMPONENTS.ICON_SELECTOR_WRAPPER_COMPONENT,\n action: PRODUCT_EXPERIENCE_ICON_SELECTOR.ACTIONS.ICON_SELECTED\n });\n } catch {\n // nothing to do\n }\n }\n}\n","<div class=\"d-flex a-i-center j-c-center p-relative\">\n @if (selectedIcon) {\n <div class=\"icon-{{ iconSize }} text-center fit-w fit-h\">\n <i\n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"selectedIcon\"\n ></i>\n </div>\n }\n\n @if (!selectedIcon) {\n <div\n class=\"icon-{{ iconSize }} text-muted text-center a-s-stretch fit-w\"\n style=\"border: 2px dashed var(--c8y-root-component-border-color)\"\n >\n <span class=\"d-flex a-i-center j-c-center text-12 fit-h\">\n <em>{{ 'Auto' | translate }}</em>\n </span>\n </div>\n }\n <div class=\"showOnHover d-flex j-c-center a-i-center p-absolute fit-h fit-w\">\n @if (!selectedIcon) {\n <button\n class=\"btn btn-clean btn-icon btn-sm m-0\"\n title=\"{{ 'Select icon' | translate }}\"\n [attr.aria-label]=\"'Select icon' | translate\"\n type=\"button\"\n (click)=\"openIconSelector()\"\n >\n {{ 'Select' | translate }}\n </button>\n }\n @if (selectedIcon) {\n <button\n class=\"btn-dot btn-icon m-0 fit-h\"\n [attr.aria-label]=\"'Change icon' | translate\"\n tooltip=\"{{ 'Change icon' | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"openIconSelector()\"\n >\n <i [c8yIcon]=\"'replace'\"></i>\n </button>\n }\n @if (selectedIcon && canRemoveIcon) {\n <button\n class=\"btn-dot btn-dot--danger btn-icon fit-h m-0\"\n [attr.aria-label]=\"'Remove icon and use default icon' | translate\"\n tooltip=\"{{ 'Remove icon and use default icon' | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"removeIcon()\"\n >\n <i [c8yIcon]=\"'minus-circle'\"></i>\n </button>\n }\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommonModule, DropAreaModule } from '@c8y/ngx-components';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { IconNamePipe } from './icon-name.pipe';\nimport { IconSelectorModalComponent } from './icon-selector-modal/icon-selector-modal.component';\nimport { IconSelectorComponent } from './icon-selector.component';\nimport { IconSelectorWrapperComponent } from './icon-selector-wrapper/icon-selector-wrapper.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n DropAreaModule,\n TooltipModule,\n IconSelectorComponent,\n IconSelectorModalComponent,\n IconNamePipe,\n IconSelectorWrapperComponent\n ],\n exports: [\n IconSelectorComponent,\n IconSelectorModalComponent,\n IconNamePipe,\n IconSelectorWrapperComponent\n ]\n})\nexport class IconSelectorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i1.IconSelectorService"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-icon-selector.mjs","sources":["../../icon-selector/model/icon-selector.model.ts","../../icon-selector/icon-name.pipe.ts","../../icon-selector/custom-icon/custom-icon-storage.service.ts","../../icon-selector/custom-icon/svg-sanitizer.service.ts","../../icon-selector/custom-icon/custom-icon-registry.service.ts","../../icon-selector/custom-icon/add-custom-icon-modal/add-custom-icon-modal.component.ts","../../icon-selector/custom-icon/add-custom-icon-modal/add-custom-icon-modal.component.html","../../icon-selector/custom-icon/add-custom-icon-modal/add-custom-icon-modal.service.ts","../../icon-selector/custom-icon/import-custom-icons-modal/import-custom-icons-modal.component.ts","../../icon-selector/custom-icon/import-custom-icons-modal/import-custom-icons-modal.component.html","../../icon-selector/custom-icon/import-custom-icons-modal/import-custom-icons-modal.service.ts","../../icon-selector/icon-selector.component.ts","../../icon-selector/icon-selector.component.html","../../icon-selector/icon-selector-modal/icon-selector-modal.component.ts","../../icon-selector/icon-selector-modal/icon-selector-modal.component.html","../../icon-selector/icon-selector.service.ts","../../icon-selector/icon-selector-wrapper/icon-selector-wrapper.component.ts","../../icon-selector/icon-selector-wrapper/icon-selector-wrapper.component.html","../../icon-selector/icon-selector.module.ts","../../icon-selector/c8y-ngx-components-icon-selector.ts"],"sourcesContent":["export interface DefaultIconDefinition {\n label: string;\n icons: string[][] | ReadonlyArray<ReadonlyArray<string>>;\n}\n\nexport const PRODUCT_EXPERIENCE_ICON_SELECTOR = {\n EVENTS: {\n ICON_SELECTOR: 'iconSelector'\n },\n COMPONENTS: {\n ICON_SELECTOR_WRAPPER_COMPONENT: 'icon-selector-wrapper-component'\n },\n ACTIONS: {\n OPEN_ICON_SELECTOR: 'openIconSelector',\n ICON_SELECTED: 'iconSelected'\n }\n};\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'iconName' })\nexport class IconNamePipe implements PipeTransform {\n transform(icon: string): string {\n if (icon.startsWith('c8y-')) {\n return icon.replace(/^c8y-/, '');\n }\n return icon;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { AppStateService, ZipService } from '@c8y/ngx-components';\nimport {\n ApplicationAvailability,\n ApplicationService,\n ApplicationType,\n FetchClient,\n IApplication\n} from '@c8y/client';\nimport {\n ICON_OPTIONS_CONTEXT_PATH,\n ICON_OPTIONS_FILE,\n convertRelativePathToAbsolutePath,\n getIconSet,\n CustomIconSet,\n getIconFileName,\n getIconManifestPath\n} from '@c8y/bootstrap';\nimport { CustomIconDefinitionToBeSaved } from './custom-icon.model';\n\nconst MANIFEST = {\n name: ICON_OPTIONS_CONTEXT_PATH,\n contextPath: ICON_OPTIONS_CONTEXT_PATH,\n key: `${ICON_OPTIONS_CONTEXT_PATH}-key`,\n description: 'Hosted app storing custom icon definitions.',\n icon: {\n class: 'c8y-icon-circle-star'\n },\n noAppSwitcher: true,\n type: ApplicationType.HOSTED,\n availability: ApplicationAvailability.SHARED\n} as const satisfies IApplication;\n\n@Injectable({ providedIn: 'root' })\nexport class CustomIconStorageService {\n private readonly applicationService = inject(ApplicationService);\n private readonly appState = inject(AppStateService);\n private readonly fetch = inject(FetchClient);\n private readonly zip = inject(ZipService);\n\n /** Fetches the current icon set from the tenant's hosted app. Returns empty set if none exists.\n * An optional fetchFn can be supplied to use global fetch (e.g. from bootstrap before Angular starts)\n * instead of the injected FetchClient. */\n async getIconSet(): Promise<CustomIconSet> {\n return getIconSet(this.fetch.fetch.bind(this.fetch));\n }\n\n /** Persists the full icon set to the tenant-owned public-icon-options hosted app.\n * icons.json contains metadata-only icons array + an iconCss map (name → CSS rule).\n * CSS is built once per icon at save time and stored per-entry, so incremental saves\n * only update the changed entry without re-encoding every icon's SVG.\n *\n * `filesToRemove`: SVG file names of deleted icons. The platform has no delete-file\n * API (`updateFiles` only adds or replaces), so when files must go the active binary\n * is rebuilt without them. The manifest is always generated client-side and never\n * read back from the archive — the file-update endpoint repackages asynchronously,\n * so an archive read right after a write can return stale content.\n *\n * @returns the `lastModified` timestamp written to the manifest. */\n async saveIconSet(\n icons: Array<CustomIconDefinitionToBeSaved>,\n filesToRemove: string[] = []\n ): Promise<string> {\n const app = await this.ensureApp();\n\n const metadata = icons.map(\n ({ name, family, category, isOverride, overriddenIconName, hasSecondary }) => ({\n name,\n family,\n category,\n isOverride,\n hasSecondary,\n ...(overriddenIconName ? { overriddenIconName } : {})\n })\n );\n\n const filesOfIcons = icons\n .map(icon => {\n const filesOfIcon: Array<{ path: string; contents: File }> = [];\n if (icon.svgContentPrimary) {\n const primaryFileName = getIconFileName(icon);\n const primaryBlob = new File([icon.svgContentPrimary], primaryFileName, {\n type: 'image/svg+xml'\n });\n filesOfIcon.push({ path: primaryFileName, contents: primaryBlob });\n }\n if (icon.hasSecondary && icon.svgContentSecondary) {\n const secondaryFileName = getIconFileName(icon, true);\n const secondaryBlob = new File([icon.svgContentSecondary], secondaryFileName, {\n type: 'image/svg+xml'\n });\n filesOfIcon.push({ path: secondaryFileName, contents: secondaryBlob });\n }\n return filesOfIcon;\n })\n .flat();\n\n const lastModified = new Date().toISOString();\n const files: Array<{ path: string; contents: File }> = [\n ...filesOfIcons,\n {\n path: ICON_OPTIONS_FILE,\n contents: new File([JSON.stringify({ icons: metadata, lastModified })], ICON_OPTIONS_FILE, {\n type: 'application/json'\n })\n }\n ];\n\n if (filesToRemove.length && app.activeVersionId) {\n // No propagation wait here: nothing reads the manifest after a removal —\n // CSS and grid state come from the in-memory set, and the next rebuild\n // fetches kept files individually, which is safe on any served version.\n await this.rebuildBinary(app, icons, files);\n } else {\n await this.applicationService.binary(app).updateFiles(files);\n // Added/changed SVGs must be fetchable once the grid renders them.\n await this.waitForManifestPropagation(lastModified);\n }\n return lastModified;\n }\n\n private async waitForManifestPropagation(lastModified: string): Promise<void> {\n const pollAttempts = 10;\n const pollDelayStep = 2_500;\n const pollDelayMax = 10_000;\n for (let i = 0; i < pollAttempts; i++) {\n if (i > 0) {\n // Incremental backoff before polling to give the server time to process the updated files\n await new Promise(resolve =>\n setTimeout(resolve, Math.min(i * pollDelayStep, pollDelayMax))\n );\n }\n const manifestPath = getIconManifestPath();\n const response = await this.fetch.fetch(manifestPath, { cache: 'no-cache' });\n if (response.status !== 200) {\n continue;\n }\n\n const json = await response.json();\n if (json.lastModified === lastModified) {\n return;\n }\n }\n // Deliberately non-throwing: the save itself succeeded, only the propagation check timed out.\n console.warn(\n 'Custom icons saved, but the updated manifest was not observed within the polling window.'\n );\n }\n\n /** Rebuilds the app binary from scratch: the static cumulocity.json, the given\n * upserts (fresh manifest + SVGs with in-memory content) and the remaining icons'\n * SVGs fetched individually from the hosted app. The old archive is deliberately\n * never downloaded — the file-update endpoint repackages asynchronously, so a\n * read right after a write can return stale content. Per-file fetches are safe:\n * kept files are unchanged, so any served version returns identical content. */\n private async rebuildBinary(\n app: IApplication,\n icons: Array<CustomIconDefinitionToBeSaved>,\n upserts: Array<{ path: string; contents: File }>\n ): Promise<void> {\n const files: Array<{ fileName: string; blob: Blob }> = [\n {\n fileName: 'cumulocity.json',\n blob: new Blob([JSON.stringify(MANIFEST)], { type: 'application/json' })\n },\n ...upserts.map(u => ({ fileName: u.path, blob: u.contents as Blob }))\n ];\n\n const included = new Set(files.map(f => f.fileName));\n const toFetch = icons\n .flatMap(icon => [\n getIconFileName(icon),\n ...(icon.hasSecondary ? [getIconFileName(icon, true)] : [])\n ])\n .filter(name => !included.has(name));\n const fetched = await Promise.all(\n toFetch.map(async name => {\n const response = await this.fetch.fetch(convertRelativePathToAbsolutePath(name), {\n cache: 'no-cache'\n });\n if (response.status !== 200) {\n console.warn(\n `[c8y] Could not preserve ${name} while rebuilding the icon app (HTTP ${response.status}).`\n );\n return null;\n }\n return { fileName: name, blob: await response.blob() };\n })\n );\n files.push(...fetched.filter(f => f !== null));\n\n const zipBlob = await this.zip.createZip(files);\n const file = new File([zipBlob], `${ICON_OPTIONS_CONTEXT_PATH}.zip`);\n const binaryService = this.applicationService.binary(app);\n const { data: binary } = await binaryService.upload(file);\n await this.applicationService.update({ id: app.id, activeVersionId: `${binary.id}` });\n await binaryService.delete(app.activeVersionId);\n }\n\n private async ensureApp(): Promise<IApplication> {\n const existing = await this.findOwnedApp();\n if (existing) {\n return existing;\n }\n const { data: created } = await this.applicationService.create(MANIFEST as IApplication);\n const zipBlob = await this.zip.createZip([\n {\n fileName: 'cumulocity.json',\n blob: new Blob([JSON.stringify(MANIFEST)], { type: 'application/json' })\n }\n ]);\n const file = new File([zipBlob], `${ICON_OPTIONS_CONTEXT_PATH}.zip`);\n const { data: binary } = await this.applicationService.binary(created).upload(file);\n const { data: updated } = await this.applicationService.update({\n id: created.id,\n activeVersionId: `${binary.id}`\n });\n return updated;\n }\n\n private async findOwnedApp(): Promise<IApplication | undefined> {\n try {\n const currentTenantName = this.appState.currentTenant.value?.name;\n const { data: apps } = await this.applicationService.list({\n name: ICON_OPTIONS_CONTEXT_PATH,\n pageSize: 1,\n owner: currentTenantName,\n type: ApplicationType.HOSTED\n });\n return apps[0];\n } catch (e) {\n console.error('[c8y] Failed to list applications when looking for icon options app:', e);\n throw e;\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport * as DOMPurifyNS from 'dompurify';\nimport type { Config, DOMPurify as DOMPurifyI } from 'dompurify';\nimport { SvgValidationResult } from './custom-icon.model';\n\n// ESM build exports `default`; CJS/Jest wraps the instance at module.exports directly.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst DOMPurify = ((DOMPurifyNS as any).default ?? DOMPurifyNS) as DOMPurifyI;\n\nconst DANGEROUS_ELEMENTS = ['script', 'iframe', 'object', 'embed', 'foreignObject', 'style'];\n/** Matches any event-handler attribute (on* in any case), covering all SVG event attributes. */\nconst DANGEROUS_ATTRIBUTE_PREFIX = /^on/i;\n/** Matches a CSS url() reference that does not point to an internal #id fragment. */\nconst EXTERNAL_CSS_URL = /url\\s*\\(\\s*['\"]?\\s*(?!#)/i;\n\n/** DOMPurify config for SVG-only sanitization. */\nconst SVG_PURIFY_CONFIG: Config = {\n USE_PROFILES: { svg: true, svgFilters: true },\n FORBID_TAGS: DANGEROUS_ELEMENTS,\n RETURN_DOM: false,\n RETURN_DOM_FRAGMENT: false\n};\n\n// DOMPurify's SVG profile keeps href/xlink:href (e.g. on <image>) and style attributes.\n// Strip external references it would otherwise let through; #id fragments stay valid.\nDOMPurify.addHook('afterSanitizeAttributes', node => {\n for (const attrName of ['href', 'xlink:href']) {\n const value = node.getAttribute(attrName);\n if (value && !value.startsWith('#')) {\n node.removeAttribute(attrName);\n }\n }\n const style = node.getAttribute('style');\n if (style && EXTERNAL_CSS_URL.test(style)) {\n node.removeAttribute('style');\n }\n});\n\n@Injectable({ providedIn: 'root' })\nexport class SvgSanitizerService {\n /** Validates SVG content without modifying it. Returns errors (blocking) and warnings (advisory). */\n validate(svgContent: string): SvgValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!svgContent?.trim()) {\n errors.push('SVG content is empty');\n return { valid: false, errors, warnings };\n }\n\n let doc: Document;\n try {\n doc = new DOMParser().parseFromString(svgContent, 'image/svg+xml');\n } catch {\n errors.push('Failed to parse SVG as XML');\n return { valid: false, errors, warnings };\n }\n\n const parserError = doc.querySelector('parsererror');\n if (parserError) {\n errors.push(`Malformed SVG: ${parserError.textContent?.substring(0, 200)}`);\n return { valid: false, errors, warnings };\n }\n\n const svg = doc.documentElement;\n if (svg.tagName !== 'svg') {\n errors.push('Root element must be <svg>');\n return { valid: false, errors, warnings };\n }\n\n if (!svg.getAttribute('viewBox')) {\n warnings.push('Missing viewBox attribute — icon may not scale correctly');\n }\n\n for (const tag of DANGEROUS_ELEMENTS) {\n if (svg.querySelector(tag)) {\n errors.push(`Forbidden element <${tag}> detected`);\n }\n }\n\n // Include root <svg> itself — querySelectorAll('*') returns descendants only\n const allElements = [svg, ...Array.from(svg.querySelectorAll('*'))];\n for (const el of allElements) {\n for (const attr of Array.from(el.attributes)) {\n if (DANGEROUS_ATTRIBUTE_PREFIX.test(attr.name)) {\n errors.push(`Forbidden event handler \"${attr.name}\" on <${el.tagName}>`);\n }\n }\n const href = el.getAttribute('xlink:href') || el.getAttribute('href');\n if (href && !href.startsWith('#')) {\n errors.push(\n `External reference detected: \"${href}\" — only internal #id references are allowed`\n );\n }\n const style = el.getAttribute('style');\n if (style && EXTERNAL_CSS_URL.test(style)) {\n errors.push(\n `External url() reference in style attribute on <${el.tagName}> — only internal #id references are allowed`\n );\n }\n }\n\n const fillAttrs = svg.querySelectorAll('[fill]');\n const hasHardcodedColor = Array.from(fillAttrs).some(el => {\n const fill = el.getAttribute('fill');\n return fill && fill !== 'none' && fill !== 'currentColor' && !fill.startsWith('url(');\n });\n if (hasHardcodedColor) {\n warnings.push('Hardcoded fill colors detected — use \"currentColor\" for theme-adaptive icons');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n }\n\n /** Removes dangerous elements and attributes from SVG using DOMPurify.\n * Output is safe for use with DomSanitizer.bypassSecurityTrustHtml(). */\n sanitize(svgContent: string): string {\n return DOMPurify.sanitize(svgContent, SVG_PURIFY_CONFIG);\n }\n\n /** Replaces hardcoded fill/stroke colors with `currentColor` so icons adapt to the theme. */\n normalizeColors(svgContent: string): string {\n const doc = new DOMParser().parseFromString(svgContent, 'image/svg+xml');\n if (doc.querySelector('parsererror')) {\n // Return as-is if malformed — sanitize() already validated structure\n return svgContent;\n }\n const svg = doc.documentElement;\n this.normalizeColorsOnNode(svg);\n return new XMLSerializer().serializeToString(svg);\n }\n\n /** Percent-encodes a sanitized SVG string for use in a CSS `url()` data URI. */\n toDataUri(sanitizedSvg: string): string {\n return `data:image/svg+xml,${encodeURIComponent(sanitizedSvg.trim().replace(/\\s+/g, ' '))}`;\n }\n\n private normalizeColorsOnNode(node: Element): void {\n for (const attr of ['fill', 'stroke']) {\n const value = node.getAttribute(attr);\n if (value && value !== 'none' && value !== 'currentColor' && !value.startsWith('url(')) {\n node.setAttribute(attr, 'currentColor');\n }\n }\n for (const child of Array.from(node.children)) {\n this.normalizeColorsOnNode(child);\n }\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ZipService } from '@c8y/ngx-components';\nimport { defer, firstValueFrom, Observable, ReplaySubject, share } from 'rxjs';\nimport {\n CustomIconDefinition,\n CustomIconDefinitionToBeSaved,\n IconFamily\n} from './custom-icon.model';\nimport { CustomIconStorageService } from './custom-icon-storage.service';\nimport { SvgSanitizerService } from './svg-sanitizer.service';\nimport { DefaultIconDefinition } from '@c8y/ngx-components/icon-selector/model';\nimport {\n applyCustomIconStyles,\n convertRelativePathToAbsolutePath,\n getIconFileName,\n ICON_OPTIONS_FILE\n} from '@c8y/bootstrap';\nimport { FetchClient } from '@c8y/client';\n\nconst CUSTOM_CATEGORY_LABEL = gettext('Custom`icons-category`');\n\n@Injectable({ providedIn: 'root' })\nexport class CustomIconRegistryService {\n /** Reactive signal holding the current set of custom icons. Updates on load, save, delete, or import. */\n readonly icons = signal<CustomIconDefinition[]>([]);\n /** True after a successful load — distinguishes \"empty icons\" from \"never loaded or failed\". */\n readonly loaded = signal(false);\n /** Shared load stream: concurrent subscribers join the in-flight request, and the reset\n * flags start a fresh request once the previous one completed or errored. */\n private readonly load$: Observable<void> = defer(() => this._doLoad()).pipe(\n share({\n connector: () => new ReplaySubject<void>(1),\n resetOnComplete: true,\n resetOnError: true,\n resetOnRefCountZero: true\n })\n );\n\n private readonly storage = inject(CustomIconStorageService);\n private readonly zip = inject(ZipService);\n private readonly svgSanitizer = inject(SvgSanitizerService);\n private readonly fetch = inject(FetchClient);\n /** lastModified of the manifest as last written or loaded — used as the CSS cache-buster. */\n private lastModified?: string;\n\n /** Loads custom icons from storage and injects their CSS into the document.\n * Concurrent calls share the same in-flight request — no duplicate fetches. */\n load(): Promise<void> {\n return firstValueFrom(this.load$);\n }\n\n /** Saves or updates a custom icon (upsert by name + family) and refreshes CSS immediately.\n * Matching on name alone would let e.g. a 'c8y' family entry replace a 'dlt' entry of the\n * same name, silently dropping the other family's CSS rule. */\n async saveIcon(def: CustomIconDefinitionToBeSaved): Promise<void> {\n const current = this.icons();\n const existing = current.findIndex(i => i.name === def.name && i.family === def.family);\n const updated =\n existing >= 0 ? current.map((i, idx) => (idx === existing ? def : i)) : [...current, def];\n this.lastModified = await this.storage.saveIconSet(updated);\n this.applyStyles(updated);\n this.icons.set(updated);\n }\n\n /** Removes a custom icon by name + family, deletes its SVG files from the\n * hosted app and refreshes CSS immediately. */\n async deleteIcon(name: string, family: IconFamily): Promise<void> {\n const current = this.icons();\n const removed = current.find(i => i.name === name && i.family === family);\n const updated = current.filter(i => !(i.name === name && i.family === family));\n const filesToRemove = removed\n ? [\n getIconFileName(removed),\n ...(removed.hasSecondary ? [getIconFileName(removed, true)] : [])\n ]\n : [];\n // The stored lastModified is deliberately NOT advanced: kept files are unchanged,\n // and keeping their cache-busted URLs identical lets the browser cache serve them\n // instead of refetching while the rebuilt app version is still propagating.\n await this.storage.saveIconSet(updated, filesToRemove);\n this.applyStyles(updated);\n this.icons.set(updated);\n }\n\n /** Convert custom icons into DefaultIconDefinition[] grouped by category for the selector.\n * Override icons are excluded — they only replace built-in CSS rendering, not add new grid entries. */\n toIconDefinitions(): DefaultIconDefinition[] {\n const byCategory = new Map<string, string[][]>();\n for (const icon of this.icons()) {\n if (icon.isOverride) continue;\n const category = icon.category || CUSTOM_CATEGORY_LABEL;\n if (!byCategory.has(category)) {\n byCategory.set(category, []);\n }\n byCategory.get(category)!.push([icon.name]);\n }\n return Array.from(byCategory.entries()).map(([label, icons]) => ({ label, icons }));\n }\n\n /** Exports all custom icons as a ZIP containing icons.json and individual SVG files.\n * Note: SVG content is only available in memory immediately after adding/editing icons.\n * After page reload, icons loaded from storage have no svgContent in memory — those\n * icons will be omitted from the SVG files in the export. */\n async exportAsZip(): Promise<Blob> {\n const icons = this.icons();\n const manifest = icons.map(\n ({ name, category, family, isOverride, overriddenIconName, hasSecondary }) => ({\n name,\n category,\n family,\n isOverride,\n overriddenIconName,\n hasSecondary\n })\n );\n const iconPromises = new Array<\n Promise<{ icon: CustomIconDefinition; filesOfIcon: Array<{ fileName: string; blob: Blob }> }>\n >();\n for (const icon of manifest) {\n const svgsOfIconPromises = new Array<Promise<{ fileName: string; blob: Blob }>>();\n const primary = this.downloadSVG(icon);\n svgsOfIconPromises.push(primary);\n\n if (icon.hasSecondary) {\n const secondary = this.downloadSVG(icon, true);\n svgsOfIconPromises.push(secondary);\n }\n\n iconPromises.push(\n Promise.all(svgsOfIconPromises)\n .then(filesOfIcon => {\n return { icon, filesOfIcon };\n })\n .catch(() => {\n return { icon, filesOfIcon: [] }; // Skip icons whose SVGs can't be loaded\n })\n );\n }\n const iconFiles = await Promise.all(iconPromises);\n const iconsWithFiles = iconFiles.filter(i => i.filesOfIcon.length > 0);\n const filteredManifest = iconsWithFiles.map(i => i.icon);\n const files: { fileName: string; blob: Blob }[] = [\n { fileName: 'icons.json', blob: new Blob([JSON.stringify(filteredManifest, null, 2)]) },\n ...iconsWithFiles.flatMap(i => i.filesOfIcon)\n ];\n return this.zip.createZip(files);\n }\n\n /** Returns a copy of the icon with its SVG content loaded from the hosted app when\n * not in memory — icons loaded from the manifest after a reload are metadata-only.\n * A missing file is non-fatal: the field stays empty and the edit modal falls back\n * to requiring a re-upload. */\n async withSvgContent(icon: CustomIconDefinition): Promise<CustomIconDefinitionToBeSaved> {\n const result: CustomIconDefinitionToBeSaved = { ...icon };\n try {\n if (!result.svgContentPrimary) {\n const { blob } = await this.downloadSVG(icon);\n result.svgContentPrimary = await blob.text();\n }\n if (icon.hasSecondary && !result.svgContentSecondary) {\n const { blob } = await this.downloadSVG(icon, true);\n result.svgContentSecondary = await blob.text();\n }\n } catch (e) {\n console.error('[c8y] Failed to load SVG content of custom icon:', e);\n }\n return result;\n }\n\n async downloadSVG(\n icon: CustomIconDefinition,\n isSecondary = false\n ): Promise<{ fileName: string; blob: Blob }> {\n const fileName = getIconFileName(icon, isSecondary);\n const absolutePath = convertRelativePathToAbsolutePath(fileName);\n const response = await this.fetch.fetch(absolutePath, { cache: 'no-cache' });\n if (response.status !== 200) {\n throw new Error(`Failed to fetch SVG: ${response.status}`);\n }\n const blob = await response.blob();\n return { fileName, blob };\n }\n\n /** Imports icons from a ZIP export. Icons whose names already exist are skipped. */\n async importFromZip(zipFile: File): Promise<{ imported: number; skipped: string[] }> {\n const entries = await firstValueFrom(this.zip.getEntries(zipFile));\n const manifestEntry = entries.find(e => e.filename === ICON_OPTIONS_FILE);\n if (!manifestEntry) {\n throw new Error(`Invalid export ZIP: missing ${ICON_OPTIONS_FILE}`);\n }\n const manifestBlob = await firstValueFrom(this.zip.getData(manifestEntry));\n const manifest: Array<CustomIconDefinition> = JSON.parse(await manifestBlob.text());\n\n const existing = new Set(this.icons().map(i => i.name));\n const skipped: string[] = [];\n const toAdd: CustomIconDefinitionToBeSaved[] = [];\n\n const VALID_NAME = /^[a-z0-9][a-z0-9-]*$/;\n const VALID_FAMILIES = new Set<string>(['dlt', 'c8y']);\n\n for (const meta of manifest) {\n if (!meta.name || !VALID_NAME.test(meta.name) || !VALID_FAMILIES.has(meta.family)) {\n skipped.push(meta.name ?? '(invalid)');\n continue;\n }\n if (existing.has(meta.name)) {\n skipped.push(meta.name);\n continue;\n }\n const primaryFileName = getIconFileName(meta);\n const svgEntry = entries.find(e => e.filename === primaryFileName);\n if (!svgEntry) {\n skipped.push(meta.name);\n continue;\n }\n const svgBlob = await firstValueFrom(this.zip.getData(svgEntry));\n const svgContent = this.svgSanitizer.sanitize(await svgBlob.text());\n\n let svgContentSecondary: string | undefined;\n if (meta.hasSecondary) {\n const secondaryFileName = getIconFileName(meta, true);\n const secondaryEntry = entries.find(e => e.filename === secondaryFileName);\n if (secondaryEntry) {\n const secBlob = await firstValueFrom(this.zip.getData(secondaryEntry));\n svgContentSecondary = this.svgSanitizer.sanitize(await secBlob.text());\n }\n }\n\n toAdd.push({\n ...meta,\n svgContentPrimary: svgContent,\n svgContentSecondary,\n hasSecondary: !!svgContentSecondary\n });\n }\n\n if (toAdd.length) {\n const updated = [...this.icons(), ...toAdd];\n this.lastModified = await this.storage.saveIconSet(updated);\n this.applyStyles(updated);\n this.icons.set(updated);\n }\n\n return { imported: toAdd.length, skipped };\n }\n\n /** Injects CSS built from the in-memory icon set. The manifest is deliberately NOT\n * re-fetched — right after a save the hosted app can still serve the previous\n * version, which would re-inject rules for icons that were just removed. The stored\n * lastModified keeps unchanged icons' cache-busted URLs stable, so the browser cache\n * serves them instead of refetching while a new app version is still propagating. */\n private applyStyles(icons: CustomIconDefinition[]): void {\n applyCustomIconStyles({ icons, lastModified: this.lastModified });\n }\n\n private async _doLoad(): Promise<void> {\n const set = await this.storage.getIconSet();\n this.lastModified = set.lastModified;\n this.icons.set(set.icons);\n this.loaded.set(true);\n }\n}\n","import {\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n OnInit,\n Signal,\n signal,\n viewChild\n} from '@angular/core';\nimport {\n AbstractControl,\n FormBuilder,\n FormsModule,\n ReactiveFormsModule,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n C8yTranslatePipe,\n C8yTranslateDirective,\n DropAreaComponent,\n DroppedFile,\n FormGroupComponent,\n IconDirective,\n ListItemComponent,\n LoadingComponent,\n MessageDirective,\n MessagesComponent,\n ModalComponent,\n TypeaheadComponent\n} from '@c8y/ngx-components';\nimport { SvgSanitizerService } from '../svg-sanitizer.service';\nimport {\n CustomIconDefinitionToBeSaved,\n CustomIconModalMode,\n IconFamily,\n SvgValidationResult\n} from '../custom-icon.model';\n\n// OnPush is intentionally omitted: c8y-form-group's debounced updateErrors fires via setTimeout,\n// which does not mark an OnPush component dirty. Without Default CD, validation messages appear\n// one cycle late (red border shows but text stays hidden until next interaction).\n@Component({\n selector: 'c8y-add-custom-icon-modal',\n templateUrl: './add-custom-icon-modal.component.html',\n imports: [\n ModalComponent,\n DropAreaComponent,\n IconDirective,\n FormGroupComponent,\n MessagesComponent,\n MessageDirective,\n C8yTranslateDirective,\n C8yTranslatePipe,\n FormsModule,\n ReactiveFormsModule,\n TypeaheadComponent,\n ListItemComponent,\n LoadingComponent,\n TooltipModule\n ]\n})\nexport class AddCustomIconModalComponent implements OnInit {\n /** Modal mode: 'add' (new icon), 'edit' (existing icon), 'override' (replace built-in).\n * Plain property facade over a signal — BsModalService's `initialState` assigns it as a\n * property, while `isEditMode`/`isOverrideMode` derive from the backing signal. */\n get mode(): CustomIconModalMode {\n return this._mode();\n }\n set mode(value: CustomIconModalMode) {\n this._mode.set(value);\n }\n private readonly _mode = signal<CustomIconModalMode>('add');\n /** Icon being edited/overridden. Null for 'add' mode. */\n editingIcon: CustomIconDefinitionToBeSaved | null = null;\n /** Available category labels for the dropdown. */\n allCategories: string[] = [];\n /** Built-in + existing custom icon names — used for collision detection. */\n reservedIconNames: Set<string> = new Set();\n\n readonly previewSizes = [20, 32, 48];\n readonly isReady = signal(false);\n readonly isEditMode = computed(() => this._mode() === 'edit');\n readonly isOverrideMode = computed(() => this._mode() === 'override');\n readonly selectedFamily = signal<IconFamily>('dlt');\n readonly primarySvg = signal<string | null>(null);\n readonly primaryValidation = signal<SvgValidationResult | null>(null);\n readonly lightSvg = signal<string | null>(null);\n readonly lightValidation = signal<SvgValidationResult | null>(null);\n readonly showCompositePreview = computed(\n () => this.selectedFamily() === 'c8y' && !!this.primarySvg() && !!this.lightSvg()\n );\n protected readonly modalTitle = computed(() =>\n this.isOverrideMode()\n ? gettext('Replace icon')\n : this.isEditMode()\n ? gettext('Edit icon')\n : gettext('Add icon')\n );\n\n protected readonly okLabel = computed(() =>\n this.isOverrideMode()\n ? gettext('Replace')\n : this.isEditMode()\n ? gettext('Save changes')\n : gettext('Add icon')\n );\n\n readonly isValid = computed(() => {\n if (!this.primarySvg()) return false;\n const primary = this.primaryValidation();\n if (!primary?.valid) return false;\n if (this.selectedFamily() === 'c8y')\n return !!this.lightSvg() && !!this.lightValidation()?.valid;\n return true;\n });\n\n /** Set on the first save attempt — validation messages only appear from then on,\n * so an untouched form doesn't open covered in errors. */\n readonly saveAttempted = signal(false);\n protected readonly hasCategoryError = computed(\n () => this.saveAttempted() && !this.categorySearch()\n );\n protected readonly categoryErrors = computed(() =>\n this.hasCategoryError() ? { required: true } : {}\n );\n protected readonly primarySvgErrors = computed(() =>\n this.saveAttempted() && !this.primarySvg() ? { required: true } : {}\n );\n protected readonly lightSvgErrors = computed(() =>\n this.saveAttempted() && this.selectedFamily() === 'c8y' && !this.lightSvg()\n ? { required: true }\n : {}\n );\n /** Boolean error state for the SVG upload form groups — drives `c8y-form-group [hasError]`\n * so the label and messages pick up the validation styling (the drop area is not a form control). */\n protected readonly hasPrimarySvgError = computed(\n () => this.saveAttempted() && !this.primarySvg()\n );\n protected readonly hasLightSvgError = computed(\n () => this.saveAttempted() && this.selectedFamily() === 'c8y' && !this.lightSvg()\n );\n\n readonly categorySearch = signal('');\n readonly baseCategories = computed(() =>\n this.allCategories.length ? this.allCategories : ['Custom']\n );\n /** Categories matching the current search text — drives the typeahead dropdown list. */\n readonly filteredCategories = computed(() =>\n this.baseCategories().filter(c => this.isCategoryMatch(c))\n );\n readonly hasNoMatch = computed(\n () => !!this.categorySearch() && this.filteredCategories().length === 0\n );\n /** True when the typed text is non-empty and doesn't exactly match an existing category. */\n readonly showAddNew = computed(() => {\n const search = this.categorySearch();\n if (!search) return false;\n const searchLower = search.toLowerCase();\n return !this.baseCategories().some(\n c => c.replace(/`[^`]*`$/, '').toLowerCase() === searchLower\n );\n });\n\n private readonly categoryTypeahead = viewChild<TypeaheadComponent>('categoryTypeahead');\n\n readonly nameMessages = [\n { name: 'required', text: gettext('Icon name is required.') },\n { name: 'pattern', text: gettext('Only lowercase letters, numbers and hyphens are allowed.') },\n {\n name: 'c8yPrefix',\n text: gettext(\n 'DLT (single color) icons must not start with \"c8y-\". Use the C8Y (duocolor) type for c8y- prefixed icons.'\n )\n },\n {\n name: 'nameCollision',\n text: gettext(\n 'This name conflicts with a built-in icon. Use the Override option instead, or choose a different name.'\n )\n }\n ] as const;\n\n readonly primaryPreviewHtml = this.buildPreviewComputed(this.primarySvg);\n readonly lightPreviewHtml = this.buildPreviewComputed(this.lightSvg);\n\n readonly form = inject(FormBuilder).group({\n name: [\n '',\n [\n Validators.required,\n Validators.pattern(/^[a-z0-9][a-z0-9-]*$/),\n this.c8yPrefixValidator(),\n this.nameCollisionValidator()\n ]\n ],\n family: ['dlt' as IconFamily],\n category: ['', Validators.required]\n });\n\n private readonly bsModal = inject(BsModalRef);\n private readonly svgSanitizer = inject(SvgSanitizerService);\n private readonly domSanitizer = inject(DomSanitizer);\n private readonly translateService = inject(TranslateService);\n\n /** Modal body — only rendered once `isReady` is true. */\n private readonly modalBody = viewChild<ElementRef<HTMLElement>>('modalBody');\n\n private resolve!: (value: CustomIconDefinitionToBeSaved | null) => void;\n readonly result: Promise<CustomIconDefinitionToBeSaved | null> = new Promise(res => {\n this.resolve = res;\n });\n\n constructor() {\n // Focus the first interactive field as soon as the body renders — keyboard/\n // screen-reader users don't need to re-navigate from the modal title.\n effect(() => {\n const body = this.modalBody();\n if (!body) return;\n body.nativeElement\n .querySelector<HTMLElement>(\n 'input:not([disabled]), button:not([disabled]), select:not([disabled])'\n )\n ?.focus();\n });\n }\n\n ngOnInit(): void {\n // Deferred so Bootstrap animates the modal at its full (spinner) size first.\n setTimeout(() => this.isReady.set(true));\n\n // Disable via the forms API — an [attr.disabled] binding gets stripped when\n // reactive forms syncs the enabled control state on init.\n if (this.isEditMode()) {\n this.form.get('name')?.disable();\n }\n\n if (this.editingIcon) {\n this.selectedFamily.set(this.editingIcon.family);\n const category = this.editingIcon.category || 'Custom';\n this.categorySearch.set(category.replace(/`[^`]*`$/, ''));\n this.form.patchValue({\n name: this.editingIcon.name,\n family: this.editingIcon.family,\n category\n });\n setTimeout(() => {\n const th = this.categoryTypeahead();\n if (th?.searchControl) {\n th.searchControl.nativeElement.value = category.replace(/`[^`]*`$/, '');\n }\n });\n if (this.editingIcon.svgContentPrimary) {\n this.primarySvg.set(this.editingIcon.svgContentPrimary);\n this.primaryValidation.set(this.svgSanitizer.validate(this.editingIcon.svgContentPrimary));\n }\n if (this.editingIcon.svgContentSecondary) {\n this.lightSvg.set(this.editingIcon.svgContentSecondary);\n this.lightValidation.set(this.svgSanitizer.validate(this.editingIcon.svgContentSecondary));\n }\n }\n }\n\n onFamilyChange(family: IconFamily): void {\n this.selectedFamily.set(family);\n this.form.patchValue({ family });\n // Re-run name validators since c8yPrefixValidator depends on selectedFamily\n this.form.get('name')?.updateValueAndValidity();\n if (family === 'dlt') {\n this.lightSvg.set(null);\n this.lightValidation.set(null);\n }\n }\n\n async onPrimaryDropped(files: DroppedFile[]): Promise<void> {\n if (!files.length) return;\n const raw = await files[0].readAsText();\n const { content, validation } = this.processUpload(raw);\n this.primarySvg.set(content);\n this.primaryValidation.set(validation);\n if (!this.form.getRawValue().name) {\n const nameFromFile = files[0].file.name\n .replace(/\\.svg$/i, '')\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n this.form.patchValue({ name: nameFromFile });\n }\n }\n\n async onLightDropped(files: DroppedFile[]): Promise<void> {\n if (!files.length) return;\n const raw = await files[0].readAsText();\n const { content, validation } = this.processUpload(raw);\n this.lightSvg.set(content);\n this.lightValidation.set(validation);\n }\n\n clearPrimary(): void {\n this.primarySvg.set(null);\n this.primaryValidation.set(null);\n }\n\n clearLight(): void {\n this.lightSvg.set(null);\n this.lightValidation.set(null);\n }\n\n /** Called on every keystroke in the typeahead — filters categories and sets the form value. */\n onCategorySearch(text: string): void {\n this.categorySearch.set(text);\n this.form.patchValue({ category: text });\n this.form.get('category')?.markAsTouched();\n }\n\n clearCategory(): void {\n this.categorySearch.set('');\n this.form.patchValue({ category: '' });\n this.form.get('category')?.markAsTouched();\n const th = this.categoryTypeahead();\n th?.reset();\n }\n\n /** Selects an existing category or confirms a new one from the typeahead dropdown. */\n selectCategory(name: string): void {\n const trimmed = name.trim();\n if (!trimmed) return;\n const displayName = trimmed.replace(/`[^`]*`$/, '');\n this.categorySearch.set(displayName); // store display name — filter uses this for comparison\n this.form.patchValue({ category: trimmed }); // store raw value (preserves gettext key for built-ins)\n this.form.get('category')?.markAsTouched();\n const th = this.categoryTypeahead();\n if (th?.searchControl) {\n th.searchControl.nativeElement.value = displayName;\n }\n }\n\n save(): void {\n // Save stays enabled while invalid — the first attempt surfaces the validation\n // messages instead of leaving the user guessing why a disabled button won't work.\n if (!this.isValid() || (this.form.invalid && !this.isOverrideMode())) {\n this.saveAttempted.set(true);\n this.form.markAllAsTouched();\n return;\n }\n\n // getRawValue(): the name control is disabled in edit mode and would be\n // missing from form.value\n let iconName = this.form.getRawValue().name ?? '';\n // c8y family icons require the 'c8y-' prefix so the IconDirective routes\n // them to the duocolor CSS pseudo-element rendering path (::before + ::after)\n if (this.selectedFamily() === 'c8y' && !iconName.startsWith('c8y-')) {\n iconName = `c8y-${iconName}`;\n }\n\n // Safe: isValid() guard above ensures primarySvg() is non-null. The signals already\n // hold sanitized + color-normalized content — onPrimaryDropped()/onLightDropped()\n // process uploads, and editingIcon content was processed when originally saved.\n const result: CustomIconDefinitionToBeSaved = {\n name: iconName,\n family: this.selectedFamily(),\n // Overrides replace a built-in icon and belong to no collection\n category: this.isOverrideMode() ? '' : (this.form.value.category ?? 'Custom'),\n svgContentPrimary: this.primarySvg()!,\n isOverride: this.isOverrideMode(),\n overriddenIconName: this.editingIcon?.overriddenIconName\n };\n\n if (this.selectedFamily() === 'c8y' && this.lightSvg()) {\n result.svgContentSecondary = this.lightSvg()!;\n result.hasSecondary = true;\n }\n\n this.resolve(result);\n this.bsModal.hide();\n }\n\n cancel(): void {\n this.resolve(null);\n this.bsModal.hide();\n }\n\n /** Overrides c8y-modal's default hide-on-OK — save() decides whether the modal\n * closes (valid) or stays open showing the validation messages. */\n protected keepOpenOnOk(): void {}\n\n /** Sanitizes an uploaded SVG and validates the result. Issues found in the raw\n * upload but gone after sanitizing were removed content — surfaced as warnings\n * so the user knows the stored SVG differs from the uploaded file. */\n private processUpload(raw: string): { content: string; validation: SvgValidationResult } {\n const rawValidation = this.svgSanitizer.validate(raw);\n const content = this.svgSanitizer.normalizeColors(this.svgSanitizer.sanitize(raw));\n const validation = this.svgSanitizer.validate(content);\n const removed = rawValidation.errors.filter(e => !validation.errors.includes(e));\n if (removed.length) {\n validation.warnings = [\n this.translateService.instant(gettext('Unsafe content was removed from the uploaded SVG:')),\n ...removed,\n ...validation.warnings\n ];\n }\n return { content, validation };\n }\n\n /** Returns true when the category label matches the current search text. */\n private isCategoryMatch(cat: string): boolean {\n const search = this.categorySearch().toLowerCase();\n if (!search) return true;\n return cat\n .replace(/`[^`]*`$/, '')\n .toLowerCase()\n .includes(search);\n }\n\n private buildPreviewComputed(\n svgSignal: ReturnType<typeof signal<string | null>>\n ): Signal<SafeHtml | null> {\n return computed(() => {\n const svg = svgSignal();\n if (!svg) return null;\n let sanitized = this.svgSanitizer.sanitize(svg);\n sanitized = sanitized.replace(\n /<svg/i,\n '<svg width=\"100%\" height=\"100%\" style=\"display:block\"'\n );\n // Safe: sanitize() already removed all dangerous elements, event handlers, and\n // external references. The only modification after sanitize() is adding safe sizing attributes.\n return this.domSanitizer.bypassSecurityTrustHtml(sanitized);\n });\n }\n\n private c8yPrefixValidator(): ValidatorFn {\n return (control: AbstractControl) => {\n if (\n typeof control.value === 'string' &&\n control.value.startsWith('c8y-') &&\n this.selectedFamily() === 'dlt'\n ) {\n return { c8yPrefix: {} };\n }\n return null;\n };\n }\n\n private nameCollisionValidator(): ValidatorFn {\n return (control: AbstractControl) => {\n const name = typeof control.value === 'string' ? control.value : '';\n if (!name) {\n return null; // other validators will catch empty name\n }\n const nonPrefixedNewName = name.replace(/^c8y-/, '');\n\n const hasConflict = Array.from(this.reservedIconNames).some(iconName => {\n const nonPrefixedIconName = iconName.replace(/^c8y-/, '');\n return (\n iconName === name ||\n iconName === nonPrefixedNewName ||\n nonPrefixedIconName === name ||\n nonPrefixedIconName === nonPrefixedNewName\n );\n });\n if (hasConflict) {\n return { nameCollision: {} };\n }\n return null;\n };\n }\n}\n","<c8y-modal\n [title]=\"modalTitle() | translate\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [close]=\"keepOpenOnOk\"\n [labels]=\"{ cancel: 'Cancel', ok: okLabel() | translate }\"\n>\n <ng-container c8y-modal-title>\n <span\n [c8yIcon]=\"isOverrideMode() ? 'replace' : isEditMode() ? 'pencil' : 'plus-circle-o'\"\n aria-hidden=\"true\"\n ></span>\n </ng-container>\n\n @if (!isReady()) {\n <!-- min-height matches the approximate form height so Bootstrap animates\n the modal at its full size before the form is rendered. -->\n <div\n class=\"p-32 d-flex a-i-center j-c-center\"\n style=\"min-height: 380px\"\n [attr.aria-label]=\"'Loading…' | translate\"\n role=\"status\"\n >\n <c8y-loading></c8y-loading>\n </div>\n }\n\n @if (isReady()) {\n <div\n class=\"p-t-16 p-b-24 p-l-32 p-r-32\"\n #modalBody\n >\n @if (isOverrideMode()) {\n <p class=\"text-center text-16 text-bold text-balance m-b-16\">\n {{ 'Upload a replacement SVG for {{iconName}}' | translate: { iconName:\n editingIcon?.overriddenIconName } }}\n </p>\n }\n\n <!-- Name, collection and icon type (hidden in override mode) -->\n @if (!isOverrideMode()) {\n @if (!isEditMode()) {\n <p\n class=\"text-muted m-b-16\"\n translate\n >\n Upload a custom SVG icon and assign it to a collection to keep your icons organized.\n </p>\n }\n <div\n class=\"m-b-16\"\n [formGroup]=\"form\"\n >\n <c8y-form-group class=\"p-b-16\">\n <label\n for=\"iconName\"\n translate\n >Icon name</label\n >\n <input\n class=\"form-control\"\n id=\"iconName\"\n aria-required=\"true\"\n aria-describedby=\"iconName-messages\"\n type=\"text\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'acme-logo' }\"\n formControlName=\"name\"\n />\n <c8y-messages\n id=\"iconName-messages\"\n role=\"status\"\n [helpMessage]=\"'Lowercase letters, numbers and hyphens only' | translate\"\n >\n @for (message of nameMessages; track message.name) {\n <c8y-message\n [name]=\"message.name\"\n [text]=\"message.text | translate\"\n ></c8y-message>\n }\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group [hasError]=\"hasCategoryError()\">\n <label\n for=\"iconCategory\"\n translate\n >Collection</label\n >\n <div class=\"p-relative\">\n <c8y-typeahead\n [attr.aria-label]=\"'Icon collection' | translate\"\n id=\"iconCategory\"\n #categoryTypeahead\n [allowFreeEntries]=\"true\"\n [hideNew]=\"true\"\n [placeholder]=\"'Select or enter a collection name' | translate\"\n (onSearch)=\"onCategorySearch($event)\"\n >\n @for (cat of filteredCategories(); track cat) {\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"selectCategory(cat)\"\n [active]=\"form.value.category === cat\"\n >{{ cat | translate }}</c8y-li\n >\n }\n @if (showAddNew()) {\n <c8y-li class=\"bg-level-2 p-8\">\n @if (hasNoMatch()) {\n <span\n class=\"m-r-8\"\n translate\n >No existing collection found.</span\n >\n }\n <button\n class=\"btn btn-default btn-xs\"\n type=\"button\"\n (click)=\"selectCategory(categorySearch())\"\n >\n {{ 'Add new collection`collection`' | translate }}\n </button>\n </c8y-li>\n }\n </c8y-typeahead>\n @if (categorySearch()) {\n <button\n class=\"btn btn-dot p-absolute\"\n style=\"right: 36px; z-index: 10\"\n [attr.aria-label]=\"'Clear collection' | translate\"\n type=\"button\"\n (click)=\"clearCategory()\"\n >\n <i\n [c8yIcon]=\"'times'\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n </div>\n <c8y-messages\n role=\"alert\"\n [show]=\"categoryErrors()\"\n >\n <c8y-message\n [name]=\"'required'\"\n [text]=\"'Collection is required.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n @if (!isEditMode()) {\n <fieldset class=\"c8y-fieldset m-b-24\">\n <legend translate>Icon type</legend>\n <div class=\"d-flex gap-16 p-b-16\">\n <label class=\"c8y-radio a-i-start\">\n <input\n name=\"iconFamily\"\n type=\"radio\"\n [checked]=\"selectedFamily() === 'dlt'\"\n (change)=\"onFamilyChange('dlt')\"\n />\n <span></span>\n <span\n >{{ 'Single color' | translate }}<br />\n <small\n class=\"text-muted d-block\"\n translate\n >\n Single SVG, inherits text color via currentColor.\n </small>\n </span>\n </label>\n\n <label class=\"c8y-radio a-i-start\">\n <input\n name=\"iconFamily\"\n type=\"radio\"\n [checked]=\"selectedFamily() === 'c8y'\"\n (change)=\"onFamilyChange('c8y')\"\n />\n <span></span>\n <span>\n {{ 'Duocolor' | translate }}<br />\n <small\n class=\"text-muted d-block\"\n translate\n >\n Two SVGs required: a dark layer and a light accent layer.\n </small>\n </span>\n </label>\n </div>\n </fieldset>\n }\n </div>\n }\n\n <!-- SVG uploads -->\n <div\n class=\"m-b-16\"\n [class.row]=\"selectedFamily() === 'c8y'\"\n >\n @if (selectedFamily() === 'dlt') {\n <c8y-form-group [hasError]=\"hasPrimarySvgError()\">\n <label translate>Icon SVG</label>\n @if (!primarySvg()) {\n <c8y-drop-area\n class=\"drop-area-sm\"\n [icon]=\"'upload'\"\n [title]=\"'Upload SVG icon' | translate\"\n [attr.aria-label]=\"'Upload SVG icon' | translate\"\n [accept]=\"'.svg'\"\n [maxAllowedFiles]=\"1\"\n [maxFileSizeInMegaBytes]=\"5\"\n [message]=\"'Drop SVG file here or click to browse' | translate\"\n (dropped)=\"onPrimaryDropped($event)\"\n ></c8y-drop-area>\n <c8y-messages\n class=\"m-t-8\"\n role=\"status\"\n [show]=\"primarySvgErrors()\"\n [helpMessage]=\"\n hasPrimarySvgError()\n ? ''\n : ('Square viewBox (e.g. 24×24) · currentColor fills · no external refs or scripts'\n | translate)\n \"\n >\n <c8y-message\n [name]=\"'required'\"\n [text]=\"'Upload an SVG file.' | translate\"\n ></c8y-message>\n @if (primaryValidation(); as pv) {\n @for (error of pv.errors; track error) {\n <div class=\"d-block text-danger\">{{ error }}</div>\n }\n @for (warning of pv.warnings; track warning) {\n <div class=\"d-block text-warning\">{{ warning }}</div>\n }\n }\n </c8y-messages>\n } @else {\n <fieldset class=\"c8y-fieldset m-b-8\">\n <legend class=\"d-flex a-i-center\">\n <span translate>Preview</span>\n <button\n class=\"btn btn-dot btn-dot--danger m-l-8\"\n [attr.aria-label]=\"'Remove SVG preview' | translate\"\n [tooltip]=\"'Remove SVG preview' | translate\"\n placement=\"top\"\n container=\"body\"\n [delay]=\"500\"\n (click)=\"clearPrimary()\"\n >\n <i\n [c8yIcon]=\"'minus-circle'\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </legend>\n <div class=\"row d-flex a-i-center gap-16 p-b-16\">\n <div\n class=\"col-sm-6 d-flex a-i-end gap-8 j-c-around p-16 c8y-light-theme\"\n style=\"\n background: var(--c8y-root-component-background-default);\n border: 1px solid var(--c8y-root-component-border-color);\n border-radius: var(--c8y-component-border-radius-base, 4px);\n \"\n >\n @for (size of previewSizes; track size) {\n <div class=\"d-flex d-col a-i-center\">\n <div\n class=\"d-flex a-i-center j-c-center text-default\"\n [style.width.px]=\"size\"\n [style.height.px]=\"size\"\n aria-hidden=\"true\"\n [innerHTML]=\"primaryPreviewHtml()\"\n ></div>\n <small class=\"text-muted\">{{ size }}</small>\n </div>\n }\n </div>\n <div\n class=\"col-sm-6 d-flex a-i-end gap-16 j-c-around p-16 c8y-dark-theme\"\n style=\"\n background: var(--c8y-root-component-background-default);\n border: 1px solid var(--c8y-root-component-border-color);\n border-radius: var(--c8y-component-border-radius-base, 4px);\n \"\n >\n @for (size of previewSizes; track size) {\n <div class=\"d-flex d-col a-i-center\">\n <div\n class=\"d-flex a-i-center j-c-center text-default\"\n [style.width.px]=\"size\"\n [style.height.px]=\"size\"\n aria-hidden=\"true\"\n [innerHTML]=\"primaryPreviewHtml()\"\n ></div>\n <small class=\"text-muted\">{{ size }}</small>\n </div>\n }\n </div>\n </div>\n @if (primaryValidation(); as pv) {\n @if (pv.errors.length || pv.warnings.length) {\n <small\n class=\"form-control-feedback-message\"\n role=\"status\"\n >\n @for (error of pv.errors; track error) {\n <div class=\"d-block text-danger\">{{ error }}</div>\n }\n @for (warning of pv.warnings; track warning) {\n <div class=\"d-block text-warning\">{{ warning }}</div>\n }\n </small>\n }\n }\n </fieldset>\n }\n </c8y-form-group>\n } @else {\n <!-- C8Y duocolor: dark + light uploads side by side -->\n <div class=\"row d-flex-md gap-16\">\n <div class=\"col-sm-6\">\n <c8y-form-group [hasError]=\"hasPrimarySvgError()\">\n <label translate>Dark layer SVG</label>\n @if (!primarySvg()) {\n <c8y-drop-area\n class=\"drop-area-sm\"\n [icon]=\"'upload'\"\n [attr.aria-label]=\"'Upload dark layer SVG' | translate\"\n [accept]=\"'.svg'\"\n [maxAllowedFiles]=\"1\"\n [maxFileSizeInMegaBytes]=\"5\"\n [message]=\"'Drop dark layer SVG' | translate\"\n (dropped)=\"onPrimaryDropped($event)\"\n ></c8y-drop-area>\n <c8y-messages\n class=\"m-t-8\"\n role=\"status\"\n [show]=\"primarySvgErrors()\"\n [helpMessage]=\"\n hasPrimarySvgError()\n ? ''\n : ('Square viewBox · currentColor fills · main icon shape' | translate)\n \"\n >\n <c8y-message\n [name]=\"'required'\"\n [text]=\"'Upload an SVG file.' | translate\"\n ></c8y-message>\n @if (primaryValidation(); as pv) {\n @for (error of pv.errors; track error) {\n <div class=\"d-block text-danger\">{{ error }}</div>\n }\n @for (warning of pv.warnings; track warning) {\n <div class=\"d-block text-warning\">{{ warning }}</div>\n }\n }\n </c8y-messages>\n } @else {\n <div class=\"d-flex a-i-center gap-8 p-8 separator m-b-4\">\n <div\n class=\"d-flex a-i-center j-c-center\"\n [style.width.px]=\"32\"\n [style.height.px]=\"32\"\n aria-hidden=\"true\"\n [innerHTML]=\"primaryPreviewHtml()\"\n ></div>\n <span\n class=\"text-muted text-12 flex-grow\"\n translate\n >Dark layer</span\n >\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove dark layer SVG' | translate\"\n [tooltip]=\"'Remove dark layer SVG' | translate\"\n placement=\"top\"\n container=\"body\"\n [delay]=\"500\"\n (click)=\"clearPrimary()\"\n >\n <i\n [c8yIcon]=\"'minus-circle'\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n @if (primaryValidation(); as pv) {\n @if (pv.errors.length || pv.warnings.length) {\n <small\n class=\"form-control-feedback-message\"\n role=\"status\"\n >\n @for (error of pv.errors; track error) {\n <div class=\"d-block text-danger\">{{ error }}</div>\n }\n @for (warning of pv.warnings; track warning) {\n <div class=\"d-block text-warning\">{{ warning }}</div>\n }\n </small>\n }\n }\n }\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group [hasError]=\"hasLightSvgError()\">\n <label translate>Light layer SVG</label>\n @if (!lightSvg()) {\n <c8y-drop-area\n class=\"drop-area-sm\"\n [icon]=\"'upload'\"\n [attr.aria-label]=\"'Upload light layer SVG' | translate\"\n [accept]=\"'.svg'\"\n [maxAllowedFiles]=\"1\"\n [maxFileSizeInMegaBytes]=\"5\"\n [message]=\"'Drop light layer SVG' | translate\"\n (dropped)=\"onLightDropped($event)\"\n ></c8y-drop-area>\n <c8y-messages\n class=\"m-t-8\"\n role=\"status\"\n [show]=\"lightSvgErrors()\"\n [helpMessage]=\"\n hasLightSvgError()\n ? ''\n : ('Same viewBox as dark layer · accent shape for the light tint'\n | translate)\n \"\n >\n <c8y-message\n [name]=\"'required'\"\n [text]=\"'Upload an SVG file.' | translate\"\n ></c8y-message>\n @if (lightValidation(); as lv) {\n @for (error of lv.errors; track error) {\n <div class=\"d-block text-danger\">{{ error }}</div>\n }\n @for (warning of lv.warnings; track warning) {\n <div class=\"d-block text-warning\">{{ warning }}</div>\n }\n }\n </c8y-messages>\n } @else {\n <div class=\"d-flex a-i-center gap-8 p-8 separator m-b-4\">\n <div\n class=\"d-flex a-i-center j-c-center\"\n [style.width.px]=\"32\"\n [style.height.px]=\"32\"\n aria-hidden=\"true\"\n [innerHTML]=\"lightPreviewHtml()\"\n ></div>\n <span\n class=\"text-muted text-12 flex-grow\"\n translate\n >Light layer</span\n >\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.aria-label]=\"'Remove light layer SVG' | translate\"\n [tooltip]=\"'Remove light layer SVG' | translate\"\n placement=\"top\"\n container=\"body\"\n [delay]=\"500\"\n (click)=\"clearLight()\"\n >\n <i\n [c8yIcon]=\"'minus-circle'\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n @if (lightValidation(); as lv) {\n @if (lv.errors.length || lv.warnings.length) {\n <small\n class=\"form-control-feedback-message\"\n role=\"status\"\n >\n @for (error of lv.errors; track error) {\n <div class=\"d-block text-danger\">{{ error }}</div>\n }\n @for (warning of lv.warnings; track warning) {\n <div class=\"d-block text-warning\">{{ warning }}</div>\n }\n </small>\n }\n }\n }\n </c8y-form-group>\n </div>\n </div>\n\n @if (showCompositePreview()) {\n <fieldset\n class=\"c8y-fieldset m-t-16\"\n aria-hidden=\"true\"\n >\n <legend translate>Composited preview</legend>\n <div class=\"row d-flex-md gap-16 p-b-16\">\n <!-- Light background -->\n <div\n class=\"col-sm-6 d-flex a-i-end gap-8 j-c-around p-16 c8y-light-theme\"\n style=\"\n background: var(--c8y-root-component-background-default);\n border: 1px solid var(--c8y-root-component-border-color);\n border-radius: var(--c8y-component-border-radius-base, 4px);\n \"\n >\n @for (size of previewSizes; track size) {\n <div class=\"d-flex d-col a-i-center\">\n <div\n class=\"p-relative\"\n [style.width.px]=\"size\"\n [style.height.px]=\"size\"\n >\n <div\n class=\"d-flex a-i-center j-c-center fit-w fit-h\"\n style=\"color: var(--c8y-root-component-icon-dark-color-dark)\"\n [innerHTML]=\"primaryPreviewHtml()\"\n ></div>\n <div\n class=\"d-flex a-i-center j-c-center fit-w fit-h p-absolute\"\n style=\"\n top: 0;\n left: 0;\n color: var(--c8y-root-component-icon-dark-color-light);\n \"\n [innerHTML]=\"lightPreviewHtml()\"\n ></div>\n </div>\n <small class=\"text-muted\">{{ size }}</small>\n </div>\n }\n </div>\n <!-- Dark background -->\n <div\n class=\"col-sm-6 d-flex a-i-end gap-8 j-c-around p-16 c8y-dark-theme\"\n style=\"\n background: var(--c8y-root-component-background-default);\n border-radius: var(--c8y-component-border-radius-base, 4px);\n \"\n >\n @for (size of previewSizes; track size) {\n <div class=\"d-flex d-col a-i-center\">\n <div\n class=\"p-relative\"\n [style.width.px]=\"size\"\n [style.height.px]=\"size\"\n >\n <div\n class=\"d-flex a-i-center j-c-center fit-w fit-h\"\n style=\"color: var(--c8y-root-component-icon-dark-color-dark)\"\n [innerHTML]=\"primaryPreviewHtml()\"\n ></div>\n <div\n class=\"d-flex a-i-center j-c-center fit-w fit-h p-absolute\"\n style=\"\n top: 0;\n left: 0;\n color: var(\n --c8y-component-icon-dark-color-light,\n var(--c8y-root-component-icon-dark-color-light)\n );\n \"\n [innerHTML]=\"lightPreviewHtml()\"\n ></div>\n </div>\n <small class=\"text-muted\">{{ size }}</small>\n </div>\n }\n </div>\n </div>\n </fieldset>\n }\n }\n </div>\n </div>\n }\n</c8y-modal>\n","import { inject, Injectable } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { AddCustomIconModalComponent } from './add-custom-icon-modal.component';\nimport {\n CustomIconDefinition,\n CustomIconDefinitionToBeSaved,\n CustomIconModalMode\n} from '../custom-icon.model';\n\nexport interface AddCustomIconModalOptions {\n mode?: CustomIconModalMode;\n editingIcon?: CustomIconDefinition;\n allCategories?: string[];\n /** Built-in + existing custom names to block in the name field. */\n reservedIconNames?: Set<string>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AddCustomIconModalService {\n private readonly modal = inject(BsModalService);\n\n /**\n * Opens the add/edit/override custom icon modal.\n * @returns Resolves with the saved icon definition, or `null` if the user cancelled.\n * The `mode` option controls the modal title and which fields are editable.\n */\n open(options: AddCustomIconModalOptions = {}): Promise<CustomIconDefinitionToBeSaved | null> {\n const initialState: Partial<AddCustomIconModalComponent> = {\n mode: options.mode ?? 'add',\n editingIcon: options.editingIcon ?? null,\n allCategories: options.allCategories ?? [],\n reservedIconNames: options.reservedIconNames ?? new Set()\n };\n const ref = this.modal.show(AddCustomIconModalComponent, {\n initialState,\n ignoreBackdropClick: true,\n keyboard: false,\n class: 'modal-md'\n });\n return (ref.content as AddCustomIconModalComponent).result;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { firstValueFrom } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n C8yTranslateDirective,\n C8yTranslatePipe,\n DropAreaComponent,\n DroppedFile,\n IconDirective,\n LoadingComponent,\n ModalComponent,\n ZipService\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { CustomIconRegistryService } from '../custom-icon-registry.service';\nimport { SvgSanitizerService } from '../svg-sanitizer.service';\nimport { IconFamily, ImportPreviewIcon, SkippedImportIcon } from '../custom-icon.model';\nimport { CustomIconDefinition, getIconFileName } from '@c8y/bootstrap';\n\ntype ImportState = 'idle' | 'previewing' | 'importing';\n\n@Component({\n selector: 'c8y-import-custom-icons-modal',\n templateUrl: './import-custom-icons-modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n C8yTranslatePipe,\n C8yTranslateDirective,\n DropAreaComponent,\n LoadingComponent,\n ModalComponent,\n IconDirective\n ]\n})\nexport class ImportCustomIconsModalComponent {\n /** Current state of the import workflow: idle → previewing → importing. */\n readonly state = signal<ImportState>('idle');\n /** Error message if ZIP parsing fails; null when clean. */\n readonly dropError = signal<string | null>(null);\n /** Icons ready to import (not skipped) from the current ZIP, with SVG previews. */\n readonly toImportIcons = signal<ImportPreviewIcon[]>([]);\n protected readonly familyLabels: Record<IconFamily, string> = {\n dlt: gettext('Single color'),\n c8y: gettext('Duocolor')\n };\n protected readonly skipReasonLabels: Record<SkippedImportIcon['reason'], string> = {\n exists: gettext('Already exists'),\n missingSvg: gettext('Missing SVG file')\n };\n /** Icons skipped during preview, with the reason. */\n readonly skippedIcons = signal<SkippedImportIcon[]>([]);\n /** True when every skipped icon was skipped because it already exists in the tenant. */\n protected readonly allSkippedExist = computed(\n () => this.skippedIcons().length > 0 && this.skippedIcons().every(s => s.reason === 'exists')\n );\n\n private pendingFile: File | null = null;\n private readonly bsModal = inject(BsModalRef);\n private readonly registry = inject(CustomIconRegistryService);\n private readonly zip = inject(ZipService);\n private readonly alerts = inject(AlertService);\n private readonly translate = inject(TranslateService);\n private readonly svgSanitizer = inject(SvgSanitizerService);\n private readonly domSanitizer = inject(DomSanitizer);\n\n private resolve: (didImport: boolean) => void;\n readonly result: Promise<boolean> = new Promise(res => {\n this.resolve = res;\n });\n\n async onZipDropped(files: DroppedFile[]): Promise<void> {\n if (!files.length) return;\n this.dropError.set(null);\n this.pendingFile = files[0].file;\n try {\n const preview = await this.previewImport(this.pendingFile);\n this.toImportIcons.set(preview.toImport);\n this.skippedIcons.set(preview.skipped);\n this.state.set('previewing');\n } catch (e: unknown) {\n this.dropError.set(\n (e instanceof Error ? e.message : null) ??\n this.translate.instant(gettext('Failed to read ZIP file.'))\n );\n }\n }\n\n async confirmImport(): Promise<void> {\n if (!this.pendingFile) return;\n this.state.set('importing');\n try {\n const result = await this.registry.importFromZip(this.pendingFile);\n const msg = this.translate.instant(gettext('{{count}} icon(s) imported.'), {\n count: result.imported\n });\n this.alerts.success(msg);\n this.resolve(result.imported > 0);\n this.bsModal.hide();\n } catch (e: unknown) {\n this.alerts.danger((e instanceof Error ? e.message : null) ?? gettext('Import failed.'));\n this.state.set('previewing');\n }\n }\n\n close(): void {\n if (this.state() === 'importing') return;\n this.resolve(false);\n this.bsModal.hide();\n }\n\n /** Overrides c8y-modal's default hide-on-click — the modal must stay open and show\n * the importing spinner until confirmImport()/close() hide it themselves. */\n protected keepOpen(): void {}\n\n private async previewImport(\n file: File\n ): Promise<{ toImport: ImportPreviewIcon[]; skipped: SkippedImportIcon[] }> {\n const entries = await firstValueFrom(this.zip.getEntries(file));\n const manifestEntry = entries.find(e => e.filename === 'icons.json');\n if (!manifestEntry) {\n throw new Error(this.translate.instant(gettext('Invalid ZIP: missing icons.json')));\n }\n const blob = await firstValueFrom(this.zip.getData(manifestEntry));\n const manifest: Array<CustomIconDefinition> = JSON.parse(await blob.text());\n\n const existing = new Set(this.registry.icons().map(i => i.name));\n const entryNames = new Set(entries.map(e => e.filename));\n const skipped: SkippedImportIcon[] = [];\n const toImport: ImportPreviewIcon[] = [];\n\n const readSvg = async (fileName: string): Promise<SafeHtml | null> => {\n const entry = entries.find(e => e.filename === fileName);\n if (!entry) return null;\n const svgBlob = await firstValueFrom(this.zip.getData(entry));\n return this.buildPreviewHtml(await svgBlob.text());\n };\n\n for (const meta of manifest) {\n const primaryFileName = getIconFileName(meta);\n const secondaryFileName = meta.hasSecondary && getIconFileName(meta, true);\n const preview: ImportPreviewIcon = {\n name: meta.name,\n category: meta.category,\n family: meta.family,\n isOverride: meta.isOverride,\n previewHtml: await readSvg(primaryFileName),\n previewHtmlSecondary: secondaryFileName ? await readSvg(secondaryFileName) : null\n };\n const missingSvg =\n !entryNames.has(primaryFileName) ||\n (secondaryFileName && !entryNames.has(secondaryFileName));\n if (existing.has(meta.name)) {\n skipped.push({ ...preview, reason: 'exists' });\n } else if (missingSvg) {\n skipped.push({ ...preview, reason: 'missingSvg' });\n } else {\n toImport.push(preview);\n }\n }\n return { toImport, skipped };\n }\n\n /** Sanitized preview of an SVG from the ZIP.\n * Safe for [innerHTML]: the string is DOMPurify-sanitized right before the trust call\n * and only safe sizing attributes are added afterwards. */\n private buildPreviewHtml(rawSvg: string): SafeHtml | null {\n const sanitized = this.svgSanitizer.sanitize(rawSvg);\n if (!sanitized) {\n return null;\n }\n return this.domSanitizer.bypassSecurityTrustHtml(\n sanitized.replace(/<svg/i, '<svg width=\"100%\" height=\"100%\" style=\"display:block\"')\n );\n }\n}\n","<c8y-modal\n [title]=\"'Import custom icons' | translate\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"close()\"\n (onClose)=\"confirmImport()\"\n [close]=\"keepOpen\"\n [dismiss]=\"keepOpen\"\n [disabled]=\"state() !== 'previewing' || toImportIcons().length === 0\"\n [labels]=\"{\n cancel: 'Cancel',\n ok: 'Import' | translate\n }\"\n>\n <ng-container c8y-modal-title>\n <span\n [c8yIcon]=\"'data-import'\"\n aria-hidden=\"true\"\n ></span>\n </ng-container>\n\n <div class=\"p-24\">\n @if (state() === 'idle') {\n <p\n class=\"text-16 text-center text-balance m-b-16\"\n translate\n >\n Upload a ZIP file previously exported from the icon selector to import custom icons into\n this tenant.\n </p>\n <div class=\"d-flex j-c-center\">\n <c8y-drop-area\n [icon]=\"'upload'\"\n style=\"width: 390px\"\n [title]=\"'Upload icon ZIP' | translate\"\n accept=\".zip\"\n [maxAllowedFiles]=\"1\"\n [message]=\"'Drop your .zip export file here or click to browse' | translate\"\n (dropped)=\"onZipDropped($event)\"\n ></c8y-drop-area>\n @if (dropError()) {\n <div\n class=\"alert alert-danger m-t-8\"\n role=\"alert\"\n >\n {{ dropError() }}\n </div>\n }\n </div>\n }\n\n @if (state() === 'previewing') {\n @if (toImportIcons().length) {\n <p\n class=\"m-b-8 text-bold\"\n translate\n >\n The following icons will be imported:\n </p>\n <ul class=\"list-unstyled m-b-16 separator-top\">\n @for (icon of toImportIcons(); track icon.name) {\n <li class=\"d-flex a-i-center gap-8 p-t-8 p-b-8 separator-bottom\">\n <span\n class=\"p-relative flex-no-shrink\"\n [style.width.px]=\"24\"\n [style.height.px]=\"24\"\n aria-hidden=\"true\"\n >\n <span\n class=\"d-flex a-i-center j-c-center fit-w fit-h\"\n [class.text-default]=\"!icon.previewHtmlSecondary\"\n [style.color]=\"\n icon.previewHtmlSecondary\n ? 'var(--c8y-root-component-icon-dark-color-dark)'\n : null\n \"\n [innerHTML]=\"icon.previewHtml\"\n ></span>\n @if (icon.previewHtmlSecondary) {\n <span\n class=\"d-flex a-i-center j-c-center fit-w fit-h p-absolute\"\n style=\"top: 0; left: 0; color: var(--c8y-root-component-icon-dark-color-light)\"\n [innerHTML]=\"icon.previewHtmlSecondary\"\n ></span>\n }\n </span>\n <span class=\"flex-grow min-width-0 text-truncate\">\n {{ icon.name }}\n @if (icon.category && !icon.isOverride) {\n <small class=\"text-muted m-l-4\">{{ icon.category | translate }}</small>\n }\n </span>\n <span class=\"tag tag--info flex-no-shrink\">\n {{ familyLabels[icon.family] | translate }}\n </span>\n @if (icon.isOverride) {\n <span\n class=\"tag tag--warning flex-no-shrink\"\n translate\n >Override</span\n >\n }\n </li>\n }\n </ul>\n } @else if (allSkippedExist()) {\n <div\n class=\"alert alert-warning\"\n role=\"status\"\n translate\n >\n All icons in this file already exist in this tenant.\n </div>\n } @else {\n <div\n class=\"alert alert-warning\"\n role=\"status\"\n translate\n >\n No icons to import.\n </div>\n }\n @if (skippedIcons().length && !(allSkippedExist() && toImportIcons().length === 0)) {\n <p\n class=\"m-b-8 text-bold\"\n translate\n >\n The following icons will be skipped:\n </p>\n <ul class=\"list-unstyled m-b-16 separator-top\">\n @for (icon of skippedIcons(); track icon.name) {\n <li class=\"d-flex a-i-center gap-8 p-t-8 p-b-8 separator-bottom\">\n <span\n class=\"p-relative flex-no-shrink\"\n [style.width.px]=\"24\"\n [style.height.px]=\"24\"\n aria-hidden=\"true\"\n >\n <span\n class=\"d-flex a-i-center j-c-center fit-w fit-h\"\n [class.text-default]=\"!icon.previewHtmlSecondary\"\n [style.color]=\"\n icon.previewHtmlSecondary\n ? 'var(--c8y-root-component-icon-dark-color-dark)'\n : null\n \"\n [innerHTML]=\"icon.previewHtml\"\n ></span>\n @if (icon.previewHtmlSecondary) {\n <span\n class=\"d-flex a-i-center j-c-center fit-w fit-h p-absolute\"\n style=\"top: 0; left: 0; color: var(--c8y-root-component-icon-dark-color-light)\"\n [innerHTML]=\"icon.previewHtmlSecondary\"\n ></span>\n }\n </span>\n <span class=\"flex-grow min-width-0 text-truncate\">\n {{ icon.name }}\n @if (icon.category && !icon.isOverride) {\n <small class=\"text-muted m-l-4\">{{ icon.category | translate }}</small>\n }\n </span>\n <span class=\"tag tag--warning flex-no-shrink\">\n {{ skipReasonLabels[icon.reason] | translate }}\n </span>\n </li>\n }\n </ul>\n }\n }\n\n @if (state() === 'importing') {\n <c8y-loading\n role=\"status\"\n [message]=\"'Importing icons…' | translate\"\n ></c8y-loading>\n }\n </div>\n</c8y-modal>\n","import { inject, Injectable } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ImportCustomIconsModalComponent } from './import-custom-icons-modal.component';\n\n@Injectable({ providedIn: 'root' })\nexport class ImportCustomIconsModalService {\n private readonly modal = inject(BsModalService);\n\n /**\n * Opens the import custom icons modal.\n * @returns Resolves to `true` when at least one icon was imported, `false` when the user\n * cancelled or nothing was imported.\n */\n open(): Promise<boolean> {\n const ref = this.modal.show(ImportCustomIconsModalComponent, {\n ignoreBackdropClick: true,\n keyboard: false,\n class: 'modal-md'\n });\n return (ref.content as ImportCustomIconsModalComponent).result;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport {\n BehaviorSubject,\n combineLatest,\n defer,\n from,\n merge,\n Observable,\n of,\n ReplaySubject\n} from 'rxjs';\nimport { debounceTime, map, shareReplay, startWith, switchMap, tap } from 'rxjs/operators';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n C8yTranslateDirective,\n C8yTranslatePipe,\n EmptyStateComponent,\n IconDirective,\n LoadingComponent,\n ModalService,\n Permissions,\n SelectComponent\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { DefaultIconDefinition } from '@c8y/ngx-components/icon-selector/model';\nimport { SupportedIconsSuggestions } from '@c8y/ngx-components/icon-selector/icons';\nimport { FormsModule } from '@angular/forms';\nimport { AsyncPipe } from '@angular/common';\nimport { IconNamePipe } from './icon-name.pipe';\nimport { CustomIconDefinitionToBeSaved } from './custom-icon/custom-icon.model';\nimport { CustomIconRegistryService } from './custom-icon/custom-icon-registry.service';\nimport { AddCustomIconModalService } from './custom-icon/add-custom-icon-modal/add-custom-icon-modal.service';\nimport { ImportCustomIconsModalService } from './custom-icon/import-custom-icons-modal/import-custom-icons-modal.service';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\n\nconst allIconCategory = gettext('All`icons-category`');\n\nfunction errorMessage(e: unknown, fallback: string): string {\n return (e instanceof Error ? e.message : null) ?? fallback;\n}\n\n@Component({\n selector: 'c8y-icon-selector',\n templateUrl: './icon-selector.component.html',\n styleUrls: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n FormsModule,\n IconDirective,\n C8yTranslateDirective,\n C8yTranslatePipe,\n AsyncPipe,\n IconNamePipe,\n EmptyStateComponent,\n LoadingComponent,\n SelectComponent,\n TooltipModule\n ]\n})\nexport class IconSelectorComponent implements OnInit, OnDestroy {\n // Exposed so templates can use gettext() for i18n string extraction inside @let expressions\n protected readonly gettext = gettext;\n\n /** Category labels to hide from the grid. Values are translated category strings (e.g. `gettext('Custom\\`icons-category\\`')`). */\n @Input() iconCategoriesToExclude: string[] = [];\n /** When true, displays the icon's CSS class name as a label beneath each tile. */\n @Input() showIconClass = true;\n @Output() onSelect = new EventEmitter<string | undefined>();\n /** Highlights the given icon and auto-scrolls to it when changed programmatically after a save. */\n @Input() selectedIcon: SupportedIconsSuggestions;\n\n protected readonly icons$!: Observable<DefaultIconDefinition[]>;\n protected readonly filteredIcons$!: Observable<DefaultIconDefinition[]>;\n protected readonly availableIconCategories$!: Observable<string[]>;\n protected readonly availableIconCategoryItems$!: Observable<{ label: string; value: string }[]>;\n protected allCategories!: () => string[];\n private allIconNames!: () => Set<string>;\n\n protected readonly allIconCategory = allIconCategory;\n protected readonly searchTerm$ = new BehaviorSubject('');\n protected readonly selectedIconCategory$ = new BehaviorSubject<string>(allIconCategory);\n\n protected readonly isAdmin = signal(false);\n protected readonly customIconNames = signal(new Set<string>());\n protected readonly overriddenIconNames = signal(new Set<string>());\n protected readonly customCategoryLabels = signal(new Set<string>());\n protected readonly iconsLoading = signal(true);\n protected readonly isSaving = signal(false);\n /** Categories rendered so far; updated in chunks to keep frames short. */\n protected readonly visibleDefinitions = signal<DefaultIconDefinition[]>([]);\n /** Icons matching the current filter — drives the screen-reader result announcement. */\n protected readonly filteredIconCount = signal(0);\n protected readonly hasCustomIcons = computed(() => this.registry.icons().length > 0);\n\n /** Incremented on each new renderProgressively call to cancel in-flight chunks.\n * Also incremented in ngOnDestroy so any pending setTimeout callbacks self-terminate. */\n private progressiveRenderToken = 0;\n private scrollToIconTimer: ReturnType<typeof setTimeout> | null = null;\n // ReplaySubject(1): no initial emission (unlike BehaviorSubject) so combineLatest waits\n // for ngOnInit's explicit .next() before emitting — prevents two-phase loading.\n // Replay ensures late subscribers (template may subscribe after ngOnInit fires) still get\n // the value — fixes blank selector for non-admin users.\n private readonly customIconsRefresh$ = new ReplaySubject<void>(1);\n private readonly el: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly permissions = inject(Permissions);\n private readonly registry = inject(CustomIconRegistryService);\n private readonly addModal = inject(AddCustomIconModalService);\n private readonly importModal = inject(ImportCustomIconsModalService);\n private readonly modalService = inject(ModalService);\n private readonly alerts = inject(AlertService);\n private readonly translate = inject(TranslateService);\n\n constructor() {\n try {\n this.isAdmin.set(this.permissions.hasRole(Permissions.ROLE_APPLICATION_MANAGEMENT_ADMIN));\n } catch {\n // not logged in yet\n }\n\n const builtInIcons$ = defer(() => from(this.loadBuiltInDefinitions())).pipe(\n shareReplay({ refCount: true, bufferSize: 1 })\n );\n\n const customIcons$ = this.customIconsRefresh$.pipe(\n map(() => this.registry.toIconDefinitions()),\n // Emit an empty list immediately so combineLatest doesn't wait for the\n // registry network fetch before showing built-in icons.\n startWith([] as DefaultIconDefinition[])\n );\n\n this.icons$ = combineLatest([builtInIcons$, customIcons$]).pipe(\n // Clear the loading spinner on the first emission (built-in icons ready)\n // rather than waiting until registry.load() also completes.\n tap(() => this.iconsLoading.set(false)),\n map(([builtIn, custom]) => {\n // Merge definitions with the same label (custom icons assigned to an existing category\n // must appear inside that category, not create a duplicate group)\n const merged = new Map<string, string[][]>();\n for (const def of [...custom, ...builtIn]) {\n const existing = merged.get(def.label);\n const mutableIcons = def.icons.map(i => [...i]);\n if (existing) {\n existing.push(...mutableIcons);\n } else {\n merged.set(def.label, mutableIcons);\n }\n }\n return Array.from(merged.entries())\n .map(([label, icons]) => ({ label, icons }))\n .filter(c => !this.iconCategoriesToExclude.includes(c.label))\n .sort((a, b) => a.label.localeCompare(b.label));\n }),\n shareReplay({ refCount: true, bufferSize: 1 })\n );\n\n this.filteredIcons$ = combineLatest([\n this.icons$,\n this.searchTerm$.pipe(debounceTime(500), startWith(this.searchTerm$.value)),\n this.selectedIconCategory$\n ]).pipe(\n map(([icons, searchTerm, category]) =>\n this.filterIconsByCategoryAndSearchTerm(icons, category, searchTerm)\n )\n );\n\n this.availableIconCategories$ = this.icons$.pipe(\n map(icons => [allIconCategory, ...icons.map(c => c.label)])\n );\n\n this.availableIconCategoryItems$ = this.availableIconCategories$.pipe(\n switchMap(cats =>\n merge(of(null), this.translate.onLangChange).pipe(\n map(() => cats.map(c => ({ label: this.translate.instant(c), value: c })))\n )\n ),\n startWith([{ label: this.translate.instant(allIconCategory), value: allIconCategory }])\n );\n\n this.allCategories = toSignal(this.icons$.pipe(map(icons => icons.map(c => c.label))), {\n initialValue: [] as string[]\n });\n\n this.allIconNames = toSignal(\n this.icons$.pipe(map(defs => new Set(defs.flatMap(cat => cat.icons.map(i => i[0]))))),\n { initialValue: new Set<string>() }\n );\n\n // Drive progressive rendering — each new filteredIcons$ emission (initial load,\n // search, category filter) triggers chunked DOM creation so the first categories\n // appear immediately without blocking the main thread for 1400+ nodes.\n this.filteredIcons$.pipe(takeUntilDestroyed()).subscribe(defs => {\n this.filteredIconCount.set(defs.reduce((total, def) => total + def.icons.length, 0));\n this.renderProgressively(defs);\n });\n }\n\n async ngOnInit(): Promise<void> {\n // Only fetch on first open or after a failed load. Skipping on subsequent opens avoids\n // racing against the platform propagating a new activeVersionId after a save.\n // registry.loaded() distinguishes \"never loaded / error\" from \"loaded but empty\".\n try {\n if (!this.registry.loaded()) {\n await this.registry.load();\n }\n this.syncCustomIconNames();\n } catch (e: unknown) {\n this.alerts.danger(errorMessage(e, gettext('Failed to load custom icons.')));\n }\n this.customIconsRefresh$.next();\n // iconsLoading is now cleared reactively by tap() in the icons$ pipeline on first emission.\n }\n\n async onResetOverrideClicked(iconName: string): Promise<void> {\n try {\n await this.modalService.confirm(\n gettext('Reset icon'),\n gettext('This will remove your custom override and restore the original icon.'),\n 'warning'\n );\n } catch {\n return;\n }\n const override = this.registry\n .icons()\n .find(i => i.isOverride && i.overriddenIconName === iconName);\n if (!override) return;\n this.isSaving.set(true);\n try {\n await this.registry.deleteIcon(override.name, override.family);\n this.syncCustomIconNames();\n this.customIconsRefresh$.next();\n } catch (e: unknown) {\n this.alerts.danger(errorMessage(e, gettext('Failed to reset icon.')));\n } finally {\n this.isSaving.set(false);\n }\n }\n\n async onAddIconClicked(): Promise<void> {\n const result = await this.addModal.open({\n mode: 'add',\n allCategories: this.allCategories(),\n reservedIconNames: new Set([...this.allIconNames(), ...this.customIconNames()])\n });\n if (!result) return;\n this.isSaving.set(true);\n try {\n await this.registry.saveIcon(result);\n this.syncCustomIconNames();\n this.customIconsRefresh$.next();\n } catch (e: unknown) {\n this.alerts.danger(errorMessage(e, gettext('Failed to save icon.')));\n return;\n } finally {\n this.isSaving.set(false);\n }\n this.scrollToIcon(result.name);\n }\n\n async onEditIconClicked(iconName: string): Promise<void> {\n const icon = this.registry.icons().find(i => i.name === iconName);\n if (!icon) return;\n // After a reload only manifest metadata is in memory — fetch the SVGs so the\n // edit modal shows the current content instead of empty upload fields.\n const editingIcon = await this.registry.withSvgContent(icon);\n const result = await this.addModal.open({\n mode: 'edit',\n editingIcon,\n allCategories: this.allCategories()\n });\n if (!result) return;\n this.isSaving.set(true);\n try {\n await this.registry.saveIcon(result);\n this.syncCustomIconNames();\n this.customIconsRefresh$.next();\n } catch (e: unknown) {\n this.alerts.danger(errorMessage(e, gettext('Failed to save icon.')));\n return;\n } finally {\n this.isSaving.set(false);\n }\n this.scrollToIcon(result.name);\n }\n\n async onDeleteIconClicked(iconName: string): Promise<void> {\n const icon = this.registry.icons().find(i => i.name === iconName);\n if (!icon) return;\n try {\n await this.modalService.confirm(\n gettext('Delete icon'),\n gettext('Are you sure you want to delete this icon? This cannot be undone.'),\n 'danger',\n { ok: gettext('Delete') }\n );\n } catch {\n return;\n }\n this.isSaving.set(true);\n try {\n await this.registry.deleteIcon(icon.name, icon.family);\n this.syncCustomIconNames();\n this.customIconsRefresh$.next();\n } catch (e: unknown) {\n this.alerts.danger(errorMessage(e, gettext('Failed to delete icon.')));\n } finally {\n this.isSaving.set(false);\n }\n }\n\n async onOverrideIconClicked(icon: ReadonlyArray<string>): Promise<void> {\n const iconName = icon[0];\n const overrideDef: CustomIconDefinitionToBeSaved = {\n name: iconName.replace(/^c8y-/, ''),\n family: iconName.startsWith('c8y-') ? 'c8y' : 'dlt',\n category: '',\n svgContentPrimary: '',\n isOverride: true,\n overriddenIconName: iconName\n };\n const result = await this.addModal.open({\n mode: 'override',\n editingIcon: overrideDef,\n allCategories: this.allCategories()\n });\n if (!result) return;\n this.isSaving.set(true);\n try {\n await this.registry.saveIcon(result);\n this.syncCustomIconNames();\n this.customIconsRefresh$.next();\n } catch (e: unknown) {\n this.alerts.danger(errorMessage(e, gettext('Failed to save icon override.')));\n return;\n } finally {\n this.isSaving.set(false);\n }\n // Scroll to the original icon position (override keeps it in the built-in grid slot)\n this.scrollToIcon(result.overriddenIconName ?? result.name);\n }\n\n async onExportClicked(): Promise<void> {\n try {\n const blob = await this.registry.exportAsZip();\n this.triggerDownload(blob, 'custom-icons.zip');\n } catch (e: unknown) {\n this.alerts.danger(errorMessage(e, gettext('Export failed.')));\n }\n }\n\n async onImportClicked(): Promise<void> {\n const didImport = await this.importModal.open();\n if (didImport) {\n this.isSaving.set(true);\n try {\n this.syncCustomIconNames();\n this.customIconsRefresh$.next();\n } finally {\n this.isSaving.set(false);\n }\n }\n }\n\n onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n onCategoryFilterChanged(categoryChange: string): void {\n this.selectedIconCategory$.next(categoryChange);\n }\n\n onIconClicked(icon: ReadonlyArray<string>): void {\n this.selectedIcon = icon[0];\n this.onSelect.emit(icon[0]);\n }\n\n ngOnDestroy(): void {\n this.customIconsRefresh$.complete();\n ++this.progressiveRenderToken;\n if (this.scrollToIconTimer !== null) clearTimeout(this.scrollToIconTimer);\n }\n\n /**\n * Renders `definitions` in chunks of 3 categories per `setTimeout(0)` frame.\n * This keeps individual frames short so the browser can paint after each chunk\n * and Angular's change-detection cycles remain cheap (enabling fast modal opens).\n * A token guards against stale chunks from a superseded render (e.g. rapid search).\n */\n private renderProgressively(definitions: DefaultIconDefinition[], onComplete?: () => void): void {\n const token = ++this.progressiveRenderToken;\n if (!definitions.length) {\n this.visibleDefinitions.set([]);\n onComplete?.();\n return;\n }\n const CHUNK = 3;\n // Show first chunk immediately — no empty-state flash.\n this.visibleDefinitions.set(definitions.slice(0, CHUNK));\n let i = CHUNK;\n const render = (): void => {\n if (token !== this.progressiveRenderToken) return; // superseded\n const chunk = definitions.slice(i, i + CHUNK);\n if (!chunk.length) {\n onComplete?.();\n return;\n }\n this.visibleDefinitions.update(prev => [...prev, ...chunk]);\n i += CHUNK;\n if (i < definitions.length) {\n setTimeout(render, 0);\n } else {\n onComplete?.();\n }\n };\n if (i < definitions.length) setTimeout(render, 0);\n else onComplete?.();\n }\n\n private filterIconsByCategoryAndSearchTerm(\n iconCategories: DefaultIconDefinition[],\n selectedCategory: string,\n searchTerm: string\n ): DefaultIconDefinition[] {\n if (selectedCategory !== allIconCategory) {\n iconCategories = iconCategories.filter(category => category.label === selectedCategory);\n }\n if (!searchTerm) return iconCategories;\n\n const lowerCaseSearchTerm = searchTerm.toLowerCase();\n const matchingCategories: DefaultIconDefinition[] = [];\n for (const category of iconCategories) {\n const matchingIcons = category.icons.filter(iconClasses =>\n iconClasses.some(iconClass => iconClass.includes(lowerCaseSearchTerm))\n );\n if (matchingIcons.length) {\n matchingCategories.push({ label: category.label, icons: matchingIcons });\n }\n }\n return matchingCategories;\n }\n\n protected isCustomIcon(iconName: string): boolean {\n return this.customIconNames().has(iconName);\n }\n\n protected isIconOverridden(iconName: string): boolean {\n return this.overriddenIconNames().has(iconName);\n }\n\n private async loadBuiltInDefinitions(): Promise<DefaultIconDefinition[]> {\n const { allIcons } = await import('@c8y/ngx-components/icon-selector/icons');\n return allIcons;\n }\n\n private syncCustomIconNames(): void {\n const icons = this.registry.icons();\n const nonOverrides = icons.filter(i => !i.isOverride);\n this.customIconNames.set(new Set(nonOverrides.map(i => i.name)));\n this.customCategoryLabels.set(new Set(nonOverrides.map(i => i.category).filter(Boolean)));\n this.overriddenIconNames.set(\n new Set(\n icons\n .filter(i => i.isOverride)\n .map(i => i.overriddenIconName)\n .filter(Boolean) as string[]\n )\n );\n }\n\n private scrollToIcon(iconName: string): void {\n this.selectedIcon = iconName as SupportedIconsSuggestions;\n this.onSelect.emit(iconName);\n this.scheduleScrollToSelected();\n }\n\n /** Scrolls the grid to whichever icon currently has [aria-current=\"true\"].\n * Called after a user selects or saves an icon. */\n private scheduleScrollToSelected(delay = 50): void {\n if (this.scrollToIconTimer !== null) clearTimeout(this.scrollToIconTimer);\n this.scrollToIconTimer = setTimeout(() => {\n this.scrollToIconTimer = null;\n try {\n const btn = this.el.nativeElement.querySelector(\n '[aria-current=\"true\"]'\n ) as HTMLElement | null;\n btn?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n } catch {\n // non-critical — scroll is best-effort\n }\n }, delay);\n }\n\n private triggerDownload(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }\n}\n","<div\n class=\"p-l-24 p-r-24 p-t-8 p-b-8 separator-bottom sticky-top\"\n style=\"background: var(--c8y-root-component-background-default); z-index: 2\"\n>\n <div class=\"row d-flex-sm\">\n <div class=\"col-sm-5 m-b-8\">\n <div\n class=\"input-group-search input-group\"\n style=\"width: auto\"\n >\n <label\n class=\"sr-only\"\n for=\"filter-icons\"\n translate\n >Filter icons</label\n >\n <input\n class=\"form-control\"\n id=\"filter-icons\"\n placeholder=\"{{ 'Type to filter icons…' | translate }}\"\n type=\"search\"\n [ngModel]=\"searchTerm$ | async\"\n (ngModelChange)=\"onSearchChange($event)\"\n />\n @if (searchTerm$ | async) {\n <button\n class=\"input-group-addon\"\n [attr.aria-label]=\"'Clear search' | translate\"\n type=\"button\"\n (click)=\"onSearchChange('')\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n } @else {\n <span\n class=\"input-group-addon\"\n aria-hidden=\"true\"\n >\n <i\n c8yIcon=\"search\"\n aria-hidden=\"true\"\n ></i>\n </span>\n }\n </div>\n </div>\n <div class=\"col-sm-7 m-b-8\">\n <div class=\"d-flex a-i-center j-c-end gap-16 text-left\">\n <div class=\"d-flex a-i-center flex-grow\">\n <label\n class=\"m-b-0 m-r-8 flex-no-shrink\"\n id=\"icon-category-filter-label\"\n translate\n >Collection</label\n >\n <c8y-select\n class=\"flex-grow\"\n [attr.aria-labelledby]=\"'icon-category-filter-label'\"\n [items]=\"availableIconCategoryItems$ | async\"\n [selected]=\"selectedIconCategory$ | async\"\n [canDeselect]=\"true\"\n (onSelect)=\"onCategoryFilterChanged($any($event).value)\"\n (onDeselect)=\"onCategoryFilterChanged(allIconCategory)\"\n ></c8y-select>\n </div>\n\n @if (isAdmin()) {\n <button\n class=\"btn btn-clean p-l-8 p-r-8 flex-no-shrink\"\n [title]=\"'Add custom icon' | translate\"\n [attr.aria-label]=\"'Add custom icon' | translate\"\n type=\"button\"\n (click)=\"onAddIconClicked()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n aria-hidden=\"true\"\n ></i>\n <span translate>Add icon</span>\n </button>\n <button\n class=\"btn btn-clean flex-no-shrink\"\n [attr.aria-label]=\"'Import icons from ZIP' | translate\"\n [tooltip]=\"'Import icons from ZIP' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n [adaptivePosition]=\"false\"\n (click)=\"onImportClicked()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"data-import\"\n aria-hidden=\"true\"\n ></i>\n <span>{{ 'Import`verb, imports icons from a ZIP file`' | translate }}</span>\n </button>\n @if (hasCustomIcons()) {\n <button\n class=\"btn btn-clean flex-no-shrink\"\n [attr.aria-label]=\"'Export custom icons as ZIP' | translate\"\n [tooltip]=\"'Export custom icons as ZIP' | translate\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n [adaptivePosition]=\"false\"\n (click)=\"onExportClicked()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"data-export\"\n aria-hidden=\"true\"\n ></i>\n <span>{{ 'Export`verb, exports custom icons as a ZIP file`' | translate }}</span>\n </button>\n }\n }\n </div>\n </div>\n </div>\n\n @if (isSaving()) {\n <div\n class=\"p-absolute m-t-4 p-b-4 overflow-hidden\"\n style=\"left: 0; right: 0\"\n [attr.aria-label]=\"'Saving…' | translate\"\n role=\"status\"\n >\n <c8y-loading layout=\"page\"></c8y-loading>\n </div>\n }\n</div>\n\n<div class=\"p-16\">\n @if (iconsLoading()) {\n <div\n class=\"d-flex a-i-center j-c-center p-32\"\n [attr.aria-label]=\"'Loading icons…' | translate\"\n role=\"status\"\n >\n <c8y-loading></c8y-loading>\n </div>\n } @else {\n <p\n class=\"sr-only\"\n role=\"status\"\n >\n @if (filteredIconCount() === 0) {\n {{ 'No icons found' | translate }}\n } @else {\n {{ '{{count}} icon(s) found' | translate: { count: filteredIconCount() } }}\n }\n </p>\n <section\n class=\"dtm-icon-grid\"\n [attr.aria-label]=\"'Icon grid' | translate\"\n [attr.aria-busy]=\"visibleDefinitions().length === 0 ? 'true' : null\"\n role=\"region\"\n >\n @for (iconDefinition of visibleDefinitions(); track iconDefinition.label) {\n <div\n class=\"d-contents\"\n [attr.aria-label]=\"iconDefinition.label | translate\"\n role=\"group\"\n >\n <div class=\"legend form-block center grid__col--fullspan d-flex a-i-center gap-8\">\n {{ iconDefinition.label | translate }}\n @if (customCategoryLabels().has(iconDefinition.label)) {\n <span class=\"tag tag--info m-l-4 m-t-0 m-b-0\">{{\n 'Custom`badge indicating a user-added icon category`' | translate\n }}</span>\n }\n </div>\n\n @for (icon of iconDefinition.icons; track icon[0]) {\n @let isCustom = isCustomIcon(icon[0]);\n @let isOverridden = isIconOverridden(icon[0]);\n @let overriddenLabel = gettext('{{name}} (overridden)');\n @let deleteHint = 'Select a different icon before deleting this one.' | translate;\n <div class=\"d-contents\">\n <div\n class=\"dtm-icon-grid__item\"\n [class.dtm-icon-grid__item--selected]=\"selectedIcon && icon[0] === selectedIcon\"\n [class.dtm-icon-grid__item--overridden]=\"isOverridden\"\n >\n <button\n class=\"dtm-icon-grid__btn\"\n [title]=\"icon[0] | iconName\"\n [attr.aria-label]=\"\n isOverridden\n ? (overriddenLabel | translate: { name: icon[0] | iconName })\n : (icon[0] | iconName)\n \"\n [attr.aria-current]=\"selectedIcon && icon[0] === selectedIcon ? 'true' : null\"\n (click)=\"onIconClicked(icon)\"\n >\n <i\n class=\"icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"icon[0]\"\n aria-hidden=\"true\"\n ></i>\n @if (showIconClass) {\n <small\n class=\"d-block text-center text-break-word\"\n aria-hidden=\"true\"\n >\n {{ icon[0] | iconName }}\n </small>\n }\n </button>\n\n @if (isOverridden) {\n <span\n class=\"dtm-icon-grid__override-marker\"\n [tooltip]=\"'Overridden icon' | translate\"\n placement=\"top\"\n container=\"body\"\n aria-hidden=\"true\"\n [delay]=\"500\"\n >\n <i c8yIcon=\"replace\"></i>\n </span>\n }\n\n @if (isAdmin()) {\n <div\n class=\"dtm-icon-grid__actions\"\n [attr.aria-label]=\"'{{name}} actions' | translate: { name: icon[0] | iconName }\"\n role=\"group\"\n >\n @if (isCustom) {\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"\n 'Edit {{name}}' | translate: { name: icon[0] | iconName }\n \"\n [tooltip]=\"'Edit {{name}}' | translate: { name: icon[0] | iconName }\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"$event.stopPropagation(); onEditIconClicked(icon[0])\"\n >\n <i\n c8yIcon=\"pencil\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <span\n [tooltip]=\"icon[0] === selectedIcon ? deleteHint : null\"\n placement=\"top\"\n container=\"body\"\n [delay]=\"500\"\n >\n <button\n class=\"btn btn-dot btn-dot--danger m-0\"\n [class.disabled]=\"icon[0] === selectedIcon\"\n [attr.aria-label]=\"\n 'Delete {{name}}' | translate: { name: icon[0] | iconName }\n \"\n [tooltip]=\"'Delete {{name}}' | translate: { name: icon[0] | iconName }\"\n placement=\"top\"\n container=\"body\"\n [attr.aria-disabled]=\"icon[0] === selectedIcon ? 'true' : null\"\n [attr.aria-describedby]=\"\n icon[0] === selectedIcon ? 'delete-hint-' + icon[0] : null\n \"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"\n $event.stopPropagation();\n icon[0] === selectedIcon || onDeleteIconClicked(icon[0])\n \"\n >\n <i\n c8yIcon=\"minus-circle\"\n aria-hidden=\"true\"\n ></i>\n </button>\n @if (icon[0] === selectedIcon) {\n <span\n class=\"sr-only\"\n [id]=\"'delete-hint-' + icon[0]\"\n >{{ deleteHint }}</span\n >\n }\n </span>\n } @else {\n @let overrideKey =\n isOverridden\n ? gettext('Replace override for {{name}}')\n : gettext('Override {{name}}');\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"overrideKey | translate: { name: icon[0] | iconName }\"\n [tooltip]=\"overrideKey | translate: { name: icon[0] | iconName }\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"$event.stopPropagation(); onOverrideIconClicked(icon)\"\n >\n <i\n c8yIcon=\"replace\"\n aria-hidden=\"true\"\n ></i>\n </button>\n @if (isOverridden) {\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.aria-label]=\"\n 'Reset override for {{name}}' | translate: { name: icon[0] | iconName }\n \"\n [tooltip]=\"\n 'Reset override for {{name}}' | translate: { name: icon[0] | iconName }\n \"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"$event.stopPropagation(); onResetOverrideClicked(icon[0])\"\n >\n <i\n c8yIcon=\"undo\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n } @empty {\n <c8y-ui-empty-state\n class=\"grid__col--fullspan\"\n icon=\"search\"\n [title]=\"'No icons found' | translate\"\n [subtitle]=\"\n 'Try adjusting your search or filter to find what you\\'re looking for.' | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n </section>\n }\n <!-- end @else iconsLoading -->\n</div>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { C8yTranslatePipe, ModalComponent } from '@c8y/ngx-components';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { IconSelectorComponent } from '../icon-selector.component';\n\n@Component({\n selector: 'c8y-icon-selector-modal',\n templateUrl: './icon-selector-modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconSelectorComponent, C8yTranslatePipe, ModalComponent]\n})\nexport class IconSelectorModalComponent {\n title: string = gettext('Select icon');\n currentSelection: string | undefined;\n selectionExplicitlySet = false;\n saveButtonLabel: string = gettext('Select');\n iconCategoriesToExclude: string[] = [];\n showIconClass = true;\n\n readonly result: Promise<string | undefined> = new Promise((resolve, reject) => {\n this.save = resolve;\n this.cancel = reject;\n });\n\n private save: (value: string | undefined) => void;\n private cancel: (reason?: void) => void;\n\n private readonly bsModal = inject(BsModalRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n close() {\n this.bsModal.hide();\n this.cancel();\n }\n\n saveChanges(): void {\n if (!this.selectionExplicitlySet) return;\n this.bsModal.hide();\n this.save(this.currentSelection);\n }\n\n selectionChange(newSelection: string | undefined) {\n this.currentSelection = newSelection;\n this.selectionExplicitlySet = true;\n this.cdr.markForCheck();\n }\n}\n","<c8y-modal\n [title]=\"title | translate\"\n (onDismiss)=\"close()\"\n (onClose)=\"saveChanges()\"\n headerClasses=\"text-center\"\n [disabled]=\"!selectionExplicitlySet\"\n [labels]=\"{ cancel: 'Cancel', ok: saveButtonLabel | translate }\"\n>\n <c8y-icon-selector\n [selectedIcon]=\"currentSelection\"\n [iconCategoriesToExclude]=\"iconCategoriesToExclude\"\n [showIconClass]=\"showIconClass\"\n (onSelect)=\"selectionChange($event)\"\n ></c8y-icon-selector>\n</c8y-modal>\n","import { Injectable } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { IconSelectorModalComponent } from './icon-selector-modal/icon-selector-modal.component';\n\n@Injectable({ providedIn: 'root' })\nexport class IconSelectorService {\n constructor(protected modal: BsModalService) {}\n\n /**\n * Opens the icon selector modal. Resolves with the selected icon CSS class string.\n * Rejects when the user dismisses without selecting.\n */\n selectIcon(\n initialState: Partial<\n Pick<\n IconSelectorModalComponent,\n | 'currentSelection'\n | 'title'\n | 'saveButtonLabel'\n | 'iconCategoriesToExclude'\n | 'showIconClass'\n >\n > = {}\n ): Promise<string | undefined> {\n const modal = this.modal.show(IconSelectorModalComponent, {\n ignoreBackdropClick: true,\n keyboard: false,\n initialState,\n class: 'modal-lg'\n });\n const content = modal.content as IconSelectorModalComponent;\n return content.result;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n forwardRef,\n inject,\n Input,\n Output,\n EventEmitter\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { IconSelectorService } from '../icon-selector.service';\nimport { GainsightService, IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { PRODUCT_EXPERIENCE_ICON_SELECTOR } from '@c8y/ngx-components/icon-selector/model';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n/**\n * A component which acts as a wrapper for the icon selector.\n *\n * Example 1:\n * ```\n <c8y-icon-selector-wrapper\n [selectedIcon]=\"'water'\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n * ```\n * OR as a part of a formGroup\n * Example 2:\n * ```\n <c8y-icon-selector-wrapper name=\"icon\" formControlName=\"icon\">\n </c8y-icon-selector-wrapper>\n * ```\n */\n// OnPush is required here: ControlValueAccessor's writeValue() is called by Angular forms outside\n// the component's CD cycle, so markForCheck() must be used to schedule a check when the value changes.\n@Component({\n selector: 'c8y-icon-selector-wrapper',\n templateUrl: './icon-selector-wrapper.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => IconSelectorWrapperComponent),\n multi: true\n }\n ],\n imports: [IconDirective, TooltipDirective, C8yTranslatePipe]\n})\nexport class IconSelectorWrapperComponent implements ControlValueAccessor {\n @Input() canRemoveIcon = false;\n @Input() selectedIcon: string;\n /**\n * The displayed icon size, the value has to be multiple of 8.\n */\n @Input() iconSize = 32;\n @Output() onSelect: EventEmitter<string> = new EventEmitter();\n\n /**\n * @ignore\n */\n onTouched: () => void;\n\n private readonly iconSelector = inject(IconSelectorService);\n private readonly gainsightService = inject(GainsightService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n /**\n * @ignore\n */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onChange: (value: string) => void = () => {};\n\n /**\n * @ignore\n * @param icon The value to update\n */\n writeValue(icon: string): void {\n this.selectedIcon = icon;\n this.cdr.markForCheck();\n }\n\n /**\n * @ignore\n * @param fn The function to register for changes\n */\n registerOnChange(fn: () => void): void {\n this.onChange = fn;\n }\n\n /**\n * @ignore\n * @param fn The function to register for changes\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n removeIcon() {\n this.onSelect.emit(undefined);\n }\n\n async openIconSelector() {\n try {\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ICON_SELECTOR.EVENTS.ICON_SELECTOR, {\n component: PRODUCT_EXPERIENCE_ICON_SELECTOR.COMPONENTS.ICON_SELECTOR_WRAPPER_COMPONENT,\n action: PRODUCT_EXPERIENCE_ICON_SELECTOR.ACTIONS.OPEN_ICON_SELECTOR\n });\n const icon = await this.iconSelector.selectIcon({\n currentSelection: this.selectedIcon\n });\n this.onChange(icon);\n this.selectedIcon = icon;\n this.cdr.markForCheck();\n this.onSelect.emit(icon);\n this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ICON_SELECTOR.EVENTS.ICON_SELECTOR, {\n component: PRODUCT_EXPERIENCE_ICON_SELECTOR.COMPONENTS.ICON_SELECTOR_WRAPPER_COMPONENT,\n action: PRODUCT_EXPERIENCE_ICON_SELECTOR.ACTIONS.ICON_SELECTED\n });\n } catch {\n // nothing to do\n }\n }\n}\n","<div class=\"d-flex a-i-center j-c-center p-relative\">\n @if (selectedIcon) {\n <div class=\"icon-{{ iconSize }} text-center fit-w fit-h\">\n <i\n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"selectedIcon\"\n aria-hidden=\"true\"\n ></i>\n </div>\n }\n\n @if (!selectedIcon) {\n <div\n class=\"icon-{{ iconSize }} text-muted text-center a-s-stretch fit-w\"\n style=\"border: 2px dashed var(--c8y-root-component-border-color)\"\n >\n <span class=\"d-flex a-i-center j-c-center text-12 fit-h\">\n <em>{{ 'Auto`icon-selector: automatic / default icon`' | translate }}</em>\n </span>\n </div>\n }\n <div class=\"showOnHover d-flex j-c-center a-i-center p-absolute fit-h fit-w\">\n @if (!selectedIcon) {\n <button\n class=\"btn btn-clean btn-icon btn-sm m-0\"\n title=\"{{ 'Select icon' | translate }}\"\n [attr.aria-label]=\"'Select icon' | translate\"\n type=\"button\"\n (click)=\"openIconSelector()\"\n >\n {{ 'Select' | translate }}\n </button>\n }\n @if (selectedIcon) {\n <button\n class=\"btn-dot btn-icon m-0 fit-h\"\n [attr.aria-label]=\"'Change icon' | translate\"\n tooltip=\"{{ 'Change icon' | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"openIconSelector()\"\n >\n <i\n [c8yIcon]=\"'replace'\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n @if (selectedIcon && canRemoveIcon) {\n <button\n class=\"btn-dot btn-dot--danger btn-icon fit-h m-0\"\n [attr.aria-label]=\"'Remove icon and use default icon' | translate\"\n tooltip=\"{{ 'Remove icon and use default icon' | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"removeIcon()\"\n >\n <i\n [c8yIcon]=\"'trash'\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DropAreaModule } from '@c8y/ngx-components';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { IconNamePipe } from './icon-name.pipe';\nimport { IconSelectorModalComponent } from './icon-selector-modal/icon-selector-modal.component';\nimport { IconSelectorComponent } from './icon-selector.component';\nimport { IconSelectorWrapperComponent } from './icon-selector-wrapper/icon-selector-wrapper.component';\n\n@NgModule({\n imports: [\n FormsModule,\n DropAreaModule,\n TooltipModule,\n IconSelectorComponent,\n IconSelectorModalComponent,\n IconNamePipe,\n IconSelectorWrapperComponent\n ],\n exports: [\n IconSelectorComponent,\n IconSelectorModalComponent,\n IconNamePipe,\n IconSelectorWrapperComponent\n ]\n})\nexport class IconSelectorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","PRODUCT_EXPERIENCE_ICON_SELECTOR"],"mappings":"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"}