@c8y/ngx-components 1023.6.3 → 1023.7.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 (117) hide show
  1. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.map +1 -1
  2. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +1 -1
  3. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs.map +1 -1
  4. package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
  5. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  6. package/fesm2022/c8y-ngx-components-app-logs.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-asset-properties.mjs +2 -2
  8. package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-asset-property-grid.component-B1q7kXRu.mjs.map +1 -1
  10. package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  12. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  13. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs.map +1 -1
  14. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  15. package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
  16. package/fesm2022/c8y-ngx-components-computed-asset-properties-alarm-count-config.component-Bl18pHcM.mjs.map +1 -1
  17. package/fesm2022/c8y-ngx-components-computed-asset-properties-configuration-snapshot-config.component-C5QMFdX1.mjs.map +1 -1
  18. package/fesm2022/c8y-ngx-components-computed-asset-properties-event-count-config.component-C-Lc5Ble.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-computed-asset-properties-last-measurement-config.component-BXfM7hTQ.mjs.map +1 -1
  20. package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-context-dashboard-dashboard-general-settings.component-DN-f35bA.mjs.map +1 -1
  22. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +1 -1
  23. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  24. package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-m7YeEj9R.mjs.map +1 -1
  25. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
  26. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  27. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  28. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  29. package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
  30. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  31. package/fesm2022/c8y-ngx-components-device-protocol-object-mappings.mjs.map +1 -1
  32. package/fesm2022/c8y-ngx-components-device-protocols.mjs.map +1 -1
  33. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
  34. package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
  35. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  36. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  37. package/fesm2022/c8y-ngx-components-ecosystem-license-confirm.mjs.map +1 -1
  38. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  39. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  40. package/fesm2022/c8y-ngx-components-editor.mjs.map +1 -1
  41. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +1 -1
  42. package/fesm2022/c8y-ngx-components-events-events-timeline.mjs.map +1 -1
  43. package/fesm2022/c8y-ngx-components-file-preview.mjs.map +1 -1
  44. package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
  45. package/fesm2022/c8y-ngx-components-global-context.mjs +12 -12
  46. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  47. package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
  48. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
  49. package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
  50. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  51. package/fesm2022/c8y-ngx-components-messaging-management.mjs +1 -1
  52. package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
  53. package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
  54. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
  55. package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs.map +1 -1
  56. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
  57. package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs.map +1 -1
  58. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
  59. package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs.map +1 -1
  60. package/fesm2022/c8y-ngx-components-operations-device-selector.mjs.map +1 -1
  61. package/fesm2022/c8y-ngx-components-operations-operation-details.mjs.map +1 -1
  62. package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs.map +1 -1
  63. package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs.map +1 -1
  64. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +1 -1
  65. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
  66. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
  67. package/fesm2022/c8y-ngx-components-operations-status-filter.mjs.map +1 -1
  68. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
  69. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
  70. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
  71. package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs.map +1 -1
  72. package/fesm2022/c8y-ngx-components-platform-configuration.mjs.map +1 -1
  73. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
  74. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  75. package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
  76. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +1 -1
  77. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -1
  78. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -1
  79. package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
  80. package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
  81. package/fesm2022/c8y-ngx-components-reports.mjs.map +1 -1
  82. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  83. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  84. package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
  85. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  86. package/fesm2022/c8y-ngx-components-search.mjs.map +1 -1
  87. package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs.map +1 -1
  88. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +1 -1
  89. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
  90. package/fesm2022/c8y-ngx-components-static-assets.mjs.map +1 -1
  91. package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
  92. package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
  93. package/fesm2022/c8y-ngx-components-time-context.mjs +1 -1
  94. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
  95. package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
  96. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  97. package/fesm2022/c8y-ngx-components-user-roles.mjs.map +1 -1
  98. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  99. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-notes.mjs +1 -1
  100. package/fesm2022/c8y-ngx-components-widgets-implementations-cockpit-welcome.mjs.map +1 -1
  101. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  102. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  103. package/fesm2022/c8y-ngx-components-widgets-implementations-device-control-message.mjs.map +1 -1
  104. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +1 -1
  105. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
  106. package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
  107. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
  108. package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
  109. package/fesm2022/c8y-ngx-components-widgets-implementations-linear-gauge.mjs.map +1 -1
  110. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  111. package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
  112. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +4 -4
  113. package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs.map +1 -1
  114. package/fesm2022/c8y-ngx-components-widgets-implementations-three-d-rotation.mjs.map +1 -1
  115. package/fesm2022/c8y-ngx-components.mjs +2 -2
  116. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  117. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-branding-shared-lazy.mjs","sources":["../../branding/shared/lazy/apply-branding-to-app-modal/apply-branding-to-app.service.ts","../../branding/shared/lazy/apply-branding-to-app-modal/apply-branding-to-app-modal.component.ts","../../branding/shared/lazy/apply-branding-to-app-modal/apply-branding-to-app-modal.component.html","../../branding/shared/lazy/branding-tags-cell-renderer/branding-tags-cell-renderer.component.ts","../../branding/shared/lazy/branding-tags-cell-renderer/branding-tags-cell-renderer.component.html","../../branding/shared/lazy/branding-import-modal/branding-import-modal.component.ts","../../branding/shared/lazy/branding-import-modal/branding-import-modal.component.html","../../branding/shared/lazy/branding-import-modal/branding-import-modal.service.ts","../../branding/shared/lazy/branding-name-cell-renderer/branding-name-cell-renderer.component.ts","../../branding/shared/lazy/branding-name-cell-renderer/branding-name-cell-renderer.component.html","../../branding/shared/lazy/branding-tags-header-cell-renderer/branding-tags-header-cell-renderer.component.ts","../../branding/shared/lazy/branding-tags-header-cell-renderer/branding-tags-header-cell-renderer.component.html","../../branding/shared/lazy/branding/branding.component.ts","../../branding/shared/lazy/branding/branding.component.html","../../branding/shared/lazy/branding-form/branding-form.component.ts","../../branding/shared/lazy/branding-form/branding-form.component.html","../../branding/shared/lazy/branding-theme-form/branding-theme-form-structure.ts","../../branding/shared/lazy/branding-theme-form/branding-theme-form.component.ts","../../branding/shared/lazy/branding-theme-form/branding-theme-form.component.html","../../branding/shared/lazy/edit-branding-router-outlet/edit-branding-router-outlet.component.ts","../../branding/shared/lazy/edit-branding-router-outlet/edit-branding-router-outlet.component.html","../../branding/shared/lazy/branding-assets/branding-assets.component.ts","../../branding/shared/lazy/branding-assets/branding-assets.component.html","../../branding/shared/lazy/c8y-ngx-components-branding-shared-lazy.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ApplicationService, ApplicationType, IApplication } from '@c8y/client';\n\n@Injectable({ providedIn: 'root' })\nexport class ApplyBrandingToAppService {\n constructor(private apps: ApplicationService) {}\n\n async getBrandableApps(): Promise<IApplication[]> {\n const { data: apps } = await this.apps.list({\n pageSize: 2000,\n dropOverwrittenApps: true,\n type: ApplicationType.HOSTED\n });\n const appsWithDynamicOptionsUrl = this.getHostedAppsWhereDynamicOptionsUrlIsUndefined(apps);\n return appsWithDynamicOptionsUrl;\n }\n\n getHostedAppsWhereDynamicOptionsUrlIsUndefined(apps: IApplication[]) {\n return apps.filter(app => {\n const manifest = app.manifest;\n if (!manifest) {\n return false;\n }\n // filter out none web sdk based apps\n if (!manifest.webSdkVersion) {\n return false;\n }\n // filter out packages\n if (manifest.isPackage) {\n return false;\n }\n const dynamicOptionsUrl = manifest.dynamicOptionsUrl;\n\n return dynamicOptionsUrl === undefined || dynamicOptionsUrl === true;\n });\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ApplyBrandingToAppService } from './apply-branding-to-app.service';\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { AsyncPipe, NgForOf, NgIf } from '@angular/common';\nimport {\n AppIconComponent,\n C8yTranslateDirective,\n C8yTranslatePipe,\n HumanizeAppNamePipe,\n ListItemBodyComponent,\n ListItemCheckboxComponent,\n ListItemComponent,\n ListItemIconComponent,\n ModalComponent\n} from '@c8y/ngx-components';\nimport { Observable, merge, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { uniqBy } from 'lodash-es';\n\n@Component({\n selector: 'c8y-apply-branding-to-app-modal',\n templateUrl: './apply-branding-to-app-modal.component.html',\n standalone: true,\n imports: [\n NgIf,\n AsyncPipe,\n ReactiveFormsModule,\n ModalComponent,\n C8yTranslatePipe,\n C8yTranslateDirective,\n ListItemComponent,\n ListItemIconComponent,\n ListItemCheckboxComponent,\n AppIconComponent,\n ListItemBodyComponent,\n HumanizeAppNamePipe,\n NgForOf\n ]\n})\nexport class ApplyBrandingToAppModalComponent implements OnInit {\n @Input() currentTags: string[];\n brandableApps: Awaited<ReturnType<ApplyBrandingToAppService['getBrandableApps']>> = [];\n form: ReturnType<ApplyBrandingToAppModalComponent['initForm']>;\n numberOfSelectedApps$: Observable<number>;\n\n result = new Promise<ReturnType<typeof this.initForm>['value']>((resolve, reject) => {\n this._resovle = resolve;\n this._reject = reject;\n });\n\n private _resovle: (value: ReturnType<typeof this.initForm>['value']) => void;\n private _reject: (reason?: any) => void;\n constructor(\n private apply: ApplyBrandingToAppService,\n private formBuilder: FormBuilder\n ) {}\n\n async ngOnInit() {\n const brandableApps = await this.apply.getBrandableApps();\n this.brandableApps = uniqBy(brandableApps, 'contextPath');\n const tags = this.brandableApps.map(app => app.contextPath);\n this.form = this.initForm(tags);\n if (this.currentTags.length) {\n this.form.patchValue(\n this.currentTags.reduce((prev, curr) => Object.assign(prev, { [curr]: true }), {})\n );\n }\n this.numberOfSelectedApps$ = merge(this.form.valueChanges, of(this.form.value)).pipe(\n map(value => Object.values(value).filter(Boolean).length)\n );\n }\n\n save() {\n this._resovle(this.form.value);\n }\n\n cancel() {\n this._reject();\n }\n\n private initForm(tags: string[]) {\n const tagsFormMap: Record<string, FormControl<boolean>> = tags.reduceRight(\n (prev, curr) => Object.assign(prev, { [curr]: this.formBuilder.control(false) }),\n {}\n );\n return this.formBuilder.group(tagsFormMap);\n }\n}\n","<c8y-modal\n [title]=\"'Apply branding to apps' | translate\"\n [disabled]=\"!form || form.invalid || !brandableApps.length\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n <ng-container c8y-modal-title>\n <span c8yIcon=\"palette\"></span>\n </ng-container>\n <c8y-list-group\n class=\"m-b-0 no-border-last\"\n *ngIf=\"form\"\n [formGroup]=\"form\"\n >\n <c8y-li>\n <p\n class=\"text-center text-medium\"\n *ngIf=\"numberOfSelectedApps$ | async as numberOfApps; else noapps\"\n translate\n >\n {{ numberOfApps }} apps selected for branding\n </p>\n <ng-template #noapps>\n <p\n class=\"text-center text-medium\"\n translate\n >\n No apps selected for branding\n </p>\n </ng-template>\n </c8y-li>\n <c8y-li *ngFor=\"let app of brandableApps\">\n <c8y-li-icon>\n <c8y-app-icon\n class=\"icon-40\"\n [app]=\"app\"\n ></c8y-app-icon>\n </c8y-li-icon>\n <c8y-li-checkbox\n [attr.data-cy]=\"'branding-apply-branding-to-app-checkbox-' + app.contextPath\"\n [formControlName]=\"app.contextPath\"\n ></c8y-li-checkbox>\n <c8y-li-body class=\"p-t-8 d-block\">{{ app | humanizeAppName | async }}</c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n</c8y-modal>\n","import { AsyncPipe, NgForOf, NgIf } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { IApplication } from '@c8y/client';\nimport { AppStateService, CellRendererContext, HumanizeAppNamePipe } from '@c8y/ngx-components';\nimport { Observable, of } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\n\n@Component({\n selector: 'c8y-branding-tags-cell-renderer',\n templateUrl: './branding-tags-cell-renderer.component.html',\n standalone: true,\n imports: [NgIf, NgForOf, HumanizeAppNamePipe, AsyncPipe]\n})\nexport class BrandingTagsCellRendererComponent {\n hasLatestTag: boolean;\n appContextPathsOrApps$: Observable<Array<string | IApplication>>;\n constructor(\n context: CellRendererContext,\n private appState: AppStateService\n ) {\n const tags: string[] = context.value || [];\n this.hasLatestTag = tags.some(tag => tag === 'latest');\n const appSpecificTags = tags\n .filter(tag => tag.startsWith('app-'))\n .map(tag => tag.replace('app-', ''));\n\n this.appContextPathsOrApps$ = this.getAppContextPathsOrApps$(appSpecificTags);\n }\n\n private getAppContextPathsOrApps$(\n appContextPaths: string[]\n ): Observable<Array<string | IApplication>> {\n if (!appContextPaths.length) {\n return of([]);\n }\n return this.appState.currentAppsOfUser.pipe(\n map(apps => {\n return appContextPaths.map(tag => {\n const app = apps.find(app => app.contextPath === tag);\n return app || tag;\n });\n }),\n startWith(appContextPaths)\n );\n }\n}\n","<div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <div\n class=\"tag tag--success\"\n *ngIf=\"hasLatestTag\"\n translate\n >\n Global\n </div>\n <div\n class=\"tag tag--info\"\n *ngFor=\"let tag of appContextPathsOrApps$ | async\"\n [attr.data-cy]=\"'branding-tags-cell-renderer--tag-' + (tag.contextPath ? tag.contextPath : tag)\"\n >\n {{ tag | humanizeAppName | async }}\n </div>\n</div>\n","import { Component, ViewChild } from '@angular/core';\nimport { CoreModule, DroppedFile, ModalComponent, ZipService } from '@c8y/ngx-components';\nimport { AddBrandingModalService } from '@c8y/ngx-components/branding/shared/lazy/add-branding-modal';\nimport { firstValueFrom } from 'rxjs';\nimport { StaticAsset, StaticAssetsService } from '@c8y/ngx-components/static-assets/data';\nimport { StoreBrandingService } from '@c8y/ngx-components/branding/shared/data';\n\n@Component({\n selector: 'c8y-branding-import-modal',\n templateUrl: './branding-import-modal.component.html',\n standalone: true,\n imports: [CoreModule]\n})\nexport class BrandingImportModalComponent {\n @ViewChild(ModalComponent, { static: true }) modal: ModalComponent;\n\n result = new Promise<void>((resolve, reject) => {\n this._resovle = resolve;\n this._reject = reject;\n });\n files: DroppedFile[] = [];\n loading = false;\n\n private _resovle: () => void;\n private _reject: (reason?: any) => void;\n\n constructor(\n private addBrandingModalService: AddBrandingModalService,\n private zip: ZipService,\n private staticAssets: StaticAssetsService,\n private brandings: StoreBrandingService\n ) {}\n\n async droppedFile(event: DroppedFile[]) {\n this.loading = true;\n try {\n this.files = event;\n await this.import(event[0].file);\n } catch (e) {\n console.error(e);\n this.files = [];\n this.loading = false;\n return;\n }\n this.modal._close();\n this._resovle();\n }\n\n async import(file: File) {\n const versionDetails = await this.addBrandingModalService.openAddBrandingModal();\n if (!versionDetails) {\n throw Error('No version details provided');\n }\n\n // verify if branding is already present\n const { variants } = await this.brandings.loadBrandingVariants();\n if (!variants?.length) {\n await this.brandings.getStartedUsingBranding();\n }\n\n const importedZipEntries = await firstValueFrom(this.zip.getEntries(file));\n const staticAssetsEntry = importedZipEntries.find(\n entry => entry.filename === this.staticAssets.fileNames.exportZipName\n );\n if (!staticAssetsEntry) {\n throw Error(\n `Missing \"${this.staticAssets.fileNames.exportZipName}\" file in the uploaded zip.`\n );\n }\n const staticAssetsZip = await firstValueFrom(this.zip.getData(staticAssetsEntry));\n const staticAssetsZipFile = new File([staticAssetsZip], staticAssetsEntry.filename);\n const staticAssetsZipEntries = await firstValueFrom(this.zip.getEntries(staticAssetsZipFile));\n const filesToAdd = new Array<File>();\n let oldAssets: Array<StaticAsset>;\n let newAssets: Array<StaticAsset>;\n\n const contentsFileEntry = staticAssetsZipEntries.find(\n entry => entry.filename === this.staticAssets.fileNames.contents\n );\n if (contentsFileEntry) {\n const fileContent = await (await firstValueFrom(this.zip.getData(contentsFileEntry))).text();\n oldAssets = JSON.parse(fileContent);\n }\n for (const entry of staticAssetsZipEntries) {\n if (\n entry.filename === this.brandings.fileNames.manifest ||\n entry.filename === this.staticAssets.fileNames.contents\n ) {\n continue;\n }\n const file = await firstValueFrom(this.zip.getData(entry));\n const metadata = oldAssets?.find(asset => asset.fileName === entry.filename);\n if (metadata) {\n filesToAdd.push(\n new File([file], entry.filename, {\n type: metadata.type,\n lastModified: metadata.lastModified\n })\n );\n } else {\n filesToAdd.push(new File([file], entry.filename));\n }\n }\n if (filesToAdd.length > 0) {\n const currentStaticAssets = await this.staticAssets.listFilesCached('branding', true);\n newAssets = await this.staticAssets.addFilesToStaticAssets(\n 'branding',\n filesToAdd,\n currentStaticAssets,\n false\n );\n }\n\n const publicOptionsEntry = importedZipEntries.find(\n entry => entry.filename === this.brandings.fileNames.exportZipName\n );\n if (!publicOptionsEntry) {\n throw Error(`Missing \"${this.brandings.fileNames.exportZipName}\" file in the uploaded zip.`);\n }\n const publicOptionsZip = await firstValueFrom(this.zip.getData(publicOptionsEntry));\n const publicOptionsZipFile = new File([publicOptionsZip], publicOptionsEntry.filename);\n\n const publicOptionsFiles = await firstValueFrom(this.zip.getEntries(publicOptionsZipFile));\n const optionsFileEntry = publicOptionsFiles.find(\n entry => entry.filename === this.brandings.fileNames.options\n );\n if (!optionsFileEntry) {\n throw Error(\n `Missing \"${this.brandings.fileNames.options}\" file in \"${this.brandings.fileNames.exportZipName}\" file of the uploaded zip.`\n );\n }\n\n const optionsFile = await firstValueFrom(this.zip.getData(optionsFileEntry));\n let options = JSON.parse(await optionsFile.text());\n\n if (oldAssets.length && newAssets.length) {\n options = this.brandings.replaceBrandingAssetsInBrandingOptions(\n options,\n oldAssets,\n newAssets\n );\n }\n\n const zip = await this.brandings.getBrandingZip(options);\n\n await this.brandings.saveBranding(zip, `${versionDetails.brandingName}-1`, [\n versionDetails.brandingName\n ]);\n }\n\n cancel() {\n this._reject();\n }\n}\n","<c8y-modal\n [title]=\"'Import branding variant'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n [labels]=\"{ cancel: 'Cancel' }\"\n>\n <ng-container c8y-modal-title>\n <span c8yIcon=\"import\"></span>\n </ng-container>\n <div class=\"p-t-16 p-b-16 p-l-24 p-r-24 separator-bottom\">\n <p\n class=\"text-medium text-center text-16\"\n translate\n >\n Easily copy any branding variant from any tenant\n </p>\n <p translate class=\"p-t-8\">\n Export the branding variant from the source tenant and import the .zip file here. This process\n allows you to maintain consistent branding across multiple tenants efficiently.\n </p>\n </div>\n <div\n class=\"p-24 m-r-auto m-l-auto\"\n style=\"max-width: 300px\"\n >\n <c8y-drop-area\n [icon]=\"'upload'\"\n (dropped)=\"droppedFile($event)\"\n [files]=\"files\"\n [accept]=\"'.zip'\"\n [maxAllowedFiles]=\"1\"\n [loading]=\"loading\"\n ></c8y-drop-area>\n </div>\n</c8y-modal>\n","import { Injectable } from '@angular/core';\nimport { BrandingImportModalComponent } from './branding-import-modal.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BrandingImportModalService {\n constructor(private modal: BsModalService) {}\n\n async openBrandingImportModal() {\n let versionDetails: Awaited<BrandingImportModalComponent['result']>;\n try {\n const modalRef = this.modal.show(BrandingImportModalComponent, {\n class: 'modal-sm',\n ignoreBackdropClick: true,\n keyboard: false\n });\n versionDetails = await modalRef.content.result;\n } catch (e) {\n // modal closed\n return;\n }\n\n return versionDetails;\n }\n}\n","import { Component } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { CellRendererContext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-branding-name-cell-renderer',\n templateUrl: './branding-name-cell-renderer.component.html',\n standalone: true,\n imports: [RouterLink]\n})\nexport class BrandingNameCellRendererComponent {\n name: string;\n routerLink: string;\n constructor(\n context: CellRendererContext,\n private router: Router\n ) {\n this.name = context.value;\n this.routerLink = `${this.router.url}/${context.item.name}`;\n }\n}\n","<a [routerLink]=\"routerLink\">{{ name }}</a>\n","import { Component } from '@angular/core';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\n\n@Component({\n selector: 'c8y-branding-tags-header-cell-renderer',\n templateUrl: './branding-tags-header-cell-renderer.component.html',\n standalone: true,\n imports: [PopoverModule, C8yTranslatePipe]\n})\nexport class BrandingTagsHeaderCellRendererComponent {\n readonly heading = gettext('Applied to');\n readonly popoverContent = gettext(`<p class=\"m-b-8\">Branding can be applied at two levels</p>\n <ul class=\"list-unstyled m-b-0\">\n <li class=\"m-b-4\">\n <strong>Global: </strong>\n <span>Applied to the entire platform, affecting all apps and interfaces.</span>\n </li>\n <li>\n <strong>App-specific: </strong>\n <span>Applied only to selected apps within the platform.</span>\n </li>\n </ul>`);\n}\n","<div class=\"d-flex\">\n <span\n class=\"text-truncate\"\n [title]=\"heading | translate\"\n >\n {{ heading | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm a-s-center\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"applyBrandingPopover\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #applyBrandingPopover>\n <div [innerHTML]=\"popoverContent | translate\"></div>\n </ng-template>\n</div>\n","import { Component } from '@angular/core';\nimport {\n BrandVersion,\n StoreBrandingService,\n BrandingVersionService,\n BrandingTrackingService\n} from '@c8y/ngx-components/branding/shared/data';\nimport { BehaviorSubject, Observable, firstValueFrom } from 'rxjs';\nimport { map, shareReplay, switchMap } from 'rxjs/operators';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n ActionControl,\n AlertService,\n AppStateService,\n BuiltInActionType,\n Column,\n DisplayOptions,\n ModalService,\n Pagination,\n Status,\n ZipService,\n DataGridComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n TitleComponent,\n HelpComponent,\n ActionBarItemComponent,\n IconDirective,\n C8yTranslateDirective,\n C8yTranslatePipe,\n EmptyStateComponent,\n LoadingComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ApplicationService, IApplication } from '@c8y/client';\nimport { saveAs } from 'file-saver';\nimport { StaticAssetsService } from '@c8y/ngx-components/static-assets/data';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ApplyBrandingToAppModalComponent } from '../apply-branding-to-app-modal/apply-branding-to-app-modal.component';\nimport { AddBrandingModalService } from '@c8y/ngx-components/branding/shared/lazy/add-branding-modal';\nimport { BrandingTagsCellRendererComponent } from '../branding-tags-cell-renderer/branding-tags-cell-renderer.component';\nimport { BrandingImportModalService } from '../branding-import-modal/branding-import-modal.service';\nimport { BrandingNameCellRendererComponent } from '../branding-name-cell-renderer/branding-name-cell-renderer.component';\nimport { BrandingTagsHeaderCellRendererComponent } from '../branding-tags-header-cell-renderer/branding-tags-header-cell-renderer.component';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n selector: 'c8y-branding',\n templateUrl: './branding.component.html',\n standalone: true,\n imports: [\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n TitleComponent,\n HelpComponent,\n ActionBarItemComponent,\n IconDirective,\n C8yTranslateDirective,\n C8yTranslatePipe,\n EmptyStateComponent,\n LoadingComponent,\n DataGridComponent,\n AsyncPipe\n ]\n})\nexport class BrandingComponent {\n pagination: Pagination = {\n pageSize: 10,\n currentPage: 1\n };\n displayOptions: DisplayOptions = {\n bordered: false,\n striped: true,\n filter: true,\n gridHeader: true,\n hover: true\n };\n actionControls: ActionControl[] = [\n {\n type: BuiltInActionType.Edit,\n callback: (entry: BrandVersion, _reload) => {\n this.editBranding(entry.name);\n }\n },\n {\n type: BuiltInActionType.Export,\n callback: async (entry: BrandVersion, _reload) => {\n await this.exportBranding(entry);\n }\n },\n {\n type: 'preview',\n icon: 'external-link',\n text: gettext('Open preview'),\n callback: async (entry: BrandVersion, _reload) => {\n this.brandings.openPreviewForBranding(entry.name);\n }\n },\n {\n type: 'duplicate',\n icon: 'copy',\n text: gettext('Duplicate'),\n callback: async (entry: BrandVersion, _reload) => {\n await this.duplicateVersion(entry);\n this.refresh();\n }\n },\n {\n type: 'apply-to-app',\n icon: 'form',\n text: gettext('Apply to specific apps'),\n callback: async (entry: BrandVersion, _reload) => {\n await this.applyToApps(entry);\n this.refresh();\n }\n },\n {\n type: 'set-as-default',\n icon: 'globe1',\n text: gettext('Set as global'),\n showIf: (entry: BrandVersion) => {\n if (entry.tags?.includes('latest')) {\n return false;\n }\n return true;\n },\n callback: async (entry: BrandVersion, _reload) => {\n try {\n await this.confirmModal.confirm(\n gettext('Set as global branding'),\n gettext(\n 'Are you sure that you want to set this variant as the global branding? By doing so, this variant will be applied to all apps that do not have a specific branding applied. Do you want to proceed?'\n ),\n Status.INFO\n );\n } catch {\n // did not confirm\n return;\n }\n await this.brandings.markAsActive(entry);\n this.refresh();\n }\n },\n {\n type: BuiltInActionType.Delete,\n showIf: (entry: BrandVersion) => {\n if (entry.tags?.includes('latest')) {\n return false;\n }\n return true;\n },\n callback: async (entry: BrandVersion, _reload) => {\n try {\n await this.confirmModal.confirm(\n gettext('Delete branding variant'),\n gettext(\n 'You are about to delete this branding variant. This action cannot be undone. Do you want to proceed?'\n ),\n Status.DANGER\n );\n } catch {\n // did not confirm\n return;\n }\n\n this.brandingTracking.deleteBrandingVariant();\n await this.applicationService.deleteVersionPackage(entry.publicOptionsApp, {\n version: entry.version\n });\n this.refresh();\n }\n }\n ];\n columns: Column[] = [\n {\n name: 'name',\n header: gettext('Name'),\n path: 'name',\n filterable: true,\n cellRendererComponent: BrandingNameCellRendererComponent\n },\n {\n name: gettext('Applied to`Applications a branding applies to (table column header)`'),\n path: 'tags',\n filterable: false,\n cellCSSClassName: 'small',\n cellRendererComponent: BrandingTagsCellRendererComponent,\n headerCellRendererComponent: BrandingTagsHeaderCellRendererComponent\n },\n {\n name: 'owner',\n header: gettext('Owner'),\n path: 'owner',\n filterable: false\n },\n {\n name: 'lastUpdated',\n header: gettext('Last updated'),\n path: 'lastUpdated',\n filterable: false\n }\n ];\n currentAppContextPath = 'administration';\n availableBrandingVariants$: Observable<{\n publicOptions: IApplication;\n variants: BrandVersion[];\n }>;\n\n private reloadTrigger = new BehaviorSubject<void>(undefined);\n constructor(\n private brandings: StoreBrandingService,\n private activatedRoute: ActivatedRoute,\n private appState: AppStateService,\n private applicationService: ApplicationService,\n private zip: ZipService,\n private staticAssets: StaticAssetsService,\n private router: Router,\n private modal: BsModalService,\n private confirmModal: ModalService,\n private brandingVersionService: BrandingVersionService,\n private addBrandingModalService: AddBrandingModalService,\n private alert: AlertService,\n private brandingImportModalService: BrandingImportModalService,\n private brandingTracking: BrandingTrackingService\n ) {\n this.currentAppContextPath = this.appState.state.app?.contextPath || this.currentAppContextPath;\n this.availableBrandingVariants$ = this.reloadTrigger.pipe(\n switchMap(() => this.brandings.loadBrandingVariants()),\n // hide the fallback from users\n map(variants => {\n variants.variants = variants.variants.filter(v => !v.tags?.includes('fallback'));\n return variants;\n }),\n shareReplay({ refCount: true, bufferSize: 1 })\n );\n }\n\n async deleteAllBrandings(publicOptions?: IApplication) {\n const result = await this.confirmModal.confirm(\n gettext('Delete all branding variants'),\n gettext(\n `<p class=\"m-b-8\">\n This action will permanently remove all custom branding variants. Your tenant will revert\n to the default branding.\n </p>\n <p class=\"m-b-8\">\n Consider exporting your custom branding variants before proceeding, as this action cannot\n be undone.\n </p>\n <p>\n Are you sure you want to continue?\n </p>`\n ),\n Status.DANGER,\n { cancel: gettext('Cancel'), ok: gettext('Delete all') }\n );\n if (result === false || (typeof result === 'object' && !result.confirmed)) {\n return;\n }\n\n this.brandingTracking.deleteAllBrandings();\n\n await this.brandings.deleteAllBrandings(publicOptions);\n this.refresh();\n }\n\n async exportBranding(variant: BrandVersion) {\n this.brandingTracking.exportBranding();\n const branding = await firstValueFrom(this.brandings.getZipForBinary(variant.id));\n const staticAssetsApp = await this.staticAssets.getAppForTenant('branding');\n const staticAssetsZip = await firstValueFrom(\n this.brandings.getZipForBinary(\n staticAssetsApp.activeVersionId,\n this.staticAssets.fileNames.exportZipName\n )\n );\n const blob = await this.zip.createZip([\n { fileName: this.brandings.fileNames.exportZipName, blob: branding },\n { fileName: this.staticAssets.fileNames.exportZipName, blob: staticAssetsZip }\n ]);\n saveAs(blob, `branding-export-${variant.name}-${variant.revision}-${new Date().getTime()}.zip`);\n }\n\n refresh() {\n this.reloadTrigger.next();\n }\n\n async addNewVersion() {\n const versionDetails = await this.addBrandingModalService.openAddBrandingModal();\n if (!versionDetails) {\n this.refresh();\n return;\n }\n let fallBackBranding = {};\n try {\n fallBackBranding = await this.brandings.getBrandingOptionsForVersion('latest');\n } catch (e) {\n console.warn(`Failed to load latest branding`);\n }\n\n this.brandingTracking.addNewVersion();\n\n try {\n await this.brandings.addBranding(\n this.brandingVersionService.createInitialBrandingVersion(versionDetails.brandingName),\n fallBackBranding,\n [versionDetails.brandingName]\n );\n await this.brandings.waitForBrandingToBePresent(versionDetails.brandingName);\n this.editBranding(versionDetails.brandingName);\n } catch (e) {\n this.alert.addServerFailure(e, 'danger');\n }\n }\n\n async duplicateVersion(version: BrandVersion) {\n const options = await this.brandings.getBrandingOptionsForVersion(version.version);\n const versionDetails = await this.addBrandingModalService.openDuplicateBrandingModal();\n if (!versionDetails) {\n return;\n }\n\n this.brandingTracking.duplicateVersion();\n\n try {\n await this.brandings.addBranding(\n this.brandingVersionService.createInitialBrandingVersion(versionDetails.brandingName),\n options,\n [versionDetails.brandingName]\n );\n await this.brandings.waitForBrandingToBePresent(versionDetails.brandingName);\n this.editBranding(versionDetails.brandingName);\n } catch (e) {\n this.alert.addServerFailure(e, 'danger');\n }\n }\n\n async editBranding(brandingName: string) {\n return this.router.navigate([brandingName, 'edit'], { relativeTo: this.activatedRoute });\n }\n\n async getStartedUsingBranding() {\n const result = await this.confirmModal.confirm(\n gettext(`Get started using branding variants`),\n gettext(\n `<p class=\"m-b-8\">Confirming this action creates two branding variants:</p>\n <ul class=\"m-b-8 p-l-16\">\n <li>A default copy of your current global branding</li>\n <li>Your new customizable variant.</li>\n </ul>\n <p class=\"m-b-8\">\n After customization, you can set your new variant as global or apply it to specific apps.\n </p>\n <p>\n To revert changes, simply set the default branding as global or use the \"Delete all variants\" button at any time.\n </p>`\n )\n );\n if (result === false || (typeof result === 'object' && !result.confirmed)) {\n return;\n }\n\n this.brandingTracking.getStartedUsingBranding();\n\n await this.brandings.getStartedUsingBranding();\n await this.addNewVersion();\n }\n\n async applyToApps(version: BrandVersion) {\n const prefix = 'app-';\n const currentTags = version.tags\n .filter(tag => tag.startsWith(prefix))\n .map(tag => tag.replace(prefix, ''));\n const otherTags = version.tags.filter(tag => !tag.startsWith(prefix));\n let selectedTags: Awaited<ApplyBrandingToAppModalComponent['result']>;\n try {\n const modalRef = this.modal.show(ApplyBrandingToAppModalComponent, {\n initialState: { currentTags },\n ignoreBackdropClick: true,\n keyboard: false\n });\n selectedTags = await modalRef.content.result;\n } catch (e) {\n // modal closed\n return;\n }\n\n const selectedApps = Object.keys(selectedTags).filter(key => selectedTags[key]);\n\n this.brandingTracking.applyToApps(selectedApps);\n\n const tagsToSet = [...otherTags, ...selectedApps.map(tag => `${prefix}${tag}`)];\n\n await this.removeTagsFromOtherVersions(version.publicOptionsApp, tagsToSet, version.version);\n await this.applicationService.setPackageVersionTag(\n version.publicOptionsApp,\n version.version,\n tagsToSet\n );\n }\n\n async importBranding() {\n try {\n await this.brandingImportModalService.openBrandingImportModal();\n\n this.brandings.refreshTriggerBrandingVariants.next();\n this.reloadTrigger.next();\n } catch (e) {\n // modal closed\n }\n }\n\n private async removeTagsFromOtherVersions(\n publicOptionsApp: IApplication,\n tagsToRemove: string[],\n versionToIgnore?: string\n ) {\n for (const version of publicOptionsApp.applicationVersions) {\n if (version.version === versionToIgnore) {\n continue;\n }\n const removedTags = version.tags.filter(tag => !tagsToRemove.includes(tag));\n if (removedTags.length === version.tags.length) {\n continue;\n }\n await this.applicationService.setPackageVersionTag(\n publicOptionsApp,\n version.version,\n removedTags\n );\n }\n }\n}\n","<c8y-title>{{ 'Branding' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Settings' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'palette'\"\n [label]=\"'Branding' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'palette'\"\n [label]=\"'Variants' | translate\"\n [path]=\"'/branding-editor/variants'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n@let brandingVariant = availableBrandingVariants$ | async;\n@if (!brandingVariant) {\n <c8y-loading></c8y-loading>\n} @else {\n @if (brandingVariant.publicOptions) {\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"30\"\n >\n <button\n class=\"btn btn-link\"\n (click)=\"addNewVersion()\"\n data-cy=\"branding-add-branding-variant\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n <span translate>Add variant</span>\n </button>\n </c8y-action-bar-item>\n }\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"20\"\n >\n <button\n class=\"btn btn-link\"\n data-cy=\"branding-import-branding\"\n (click)=\"importBranding()\"\n >\n <i [c8yIcon]=\"'data-import'\"></i>\n <span translate>Import variant</span>\n </button>\n </c8y-action-bar-item>\n\n @if (brandingVariant.publicOptions) {\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"10\"\n >\n <button\n class=\"btn btn-link\"\n (click)=\"deleteAllBrandings(brandingVariant.publicOptions)\"\n data-cy=\"branding-remove-all-brandings\"\n >\n <i [c8yIcon]=\"'trash-o'\"></i>\n <span translate>Delete all variants</span>\n </button>\n </c8y-action-bar-item>\n }\n\n <c8y-help\n [src]=\"'/docs/enterprise-tenant/customization/#to-configure-branding-settings'\"\n ></c8y-help>\n\n <div class=\"content-fullpage d-flex d-col border-top\">\n <c8y-data-grid\n [title]=\"'Branding variants' | translate\"\n [columns]=\"columns\"\n [actionControls]=\"actionControls\"\n [pagination]=\"pagination\"\n [displayOptions]=\"displayOptions\"\n (onReload)=\"refresh()\"\n [rows]=\"brandingVariant.variants\"\n >\n @if (!brandingVariant.publicOptions) {\n <c8y-ui-empty-state\n [icon]=\"'palette'\"\n [title]=\"'No branding variants' | translate\"\n [subtitle]=\"\n 'Personalize your experience with a theme-able interface. Create a unique look that aligns with your brand identity.'\n | translate\n \"\n [horizontal]=\"false\"\n >\n <button\n class=\"btn btn-default\"\n data-cy=\"branding-get-started-using-branding\"\n (click)=\"getStartedUsingBranding()\"\n translate\n >\n Add branding variant\n </button>\n </c8y-ui-empty-state>\n }\n </c8y-data-grid>\n </div>\n}\n","import { Component } from '@angular/core';\nimport { ControlValueAccessor, FormBuilder, FormsModule } from '@angular/forms';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { CoreModule, MessageBannerService } from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { StaticAssetsFilePickerComponent } from '@c8y/ngx-components/static-assets';\nimport {\n brandingFormGroupTopLevelEntries,\n brandingFormGroupTopLevelEntriesToUnpack,\n BrandingOptionsJson,\n createGenericBrandingForm,\n TopLevelValues\n} from '@c8y/ngx-components/branding/shared/data';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\n\n@Component({\n selector: 'c8y-branding-form',\n templateUrl: './branding-form.component.html',\n standalone: true,\n host: { class: 'd-contents' },\n imports: [\n CoreModule,\n FormsModule,\n CollapseModule,\n StaticAssetsFilePickerComponent,\n EditorComponent\n ]\n})\nexport class BrandingFormComponent implements ControlValueAccessor {\n formGroup: ReturnType<BrandingFormComponent['initForm']>;\n messageBannerHelp = gettext(\n 'Supports markdown. Use {{ headerMark }} for headers, {{ listMark }} for lists, {{ boldMark }} for bold, {{ italicMark }} for italic, and {{ linkMark }} for links.'\n );\n messageBannerHelpParams = {\n headerMark: '`#`',\n listMark: '`*`',\n boldMark: '`**`',\n italicMark: '`_`',\n linkMark: '`[]()`'\n };\n private onTouched: () => void;\n\n private externalValue: BrandingOptionsJson = {};\n private formGroupValueChanges$: BrandingFormComponent['formGroup']['valueChanges'];\n\n constructor(\n private formBuilder: FormBuilder,\n private messageBannerService: MessageBannerService\n ) {\n this.formGroup = this.initForm();\n this.formGroupValueChanges$ = this.formGroup.valueChanges.pipe(takeUntilDestroyed());\n }\n\n writeValue(obj: string): void {\n try {\n const parsedObj = JSON.parse(obj);\n this.externalValue = parsedObj;\n this.applyStateToForm(parsedObj);\n } catch (e) {\n // failed to parse\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.formGroupValueChanges$.subscribe(value => fn(this.convertFormToState(value)));\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n cockieBannerChange(toggleState: boolean) {\n this.formGroup.controls.cookieBanner.patchValue({ cookieBannerDisabled: !toggleState });\n }\n\n onBlur(): void {\n this.onTouched();\n }\n\n initForm() {\n return createGenericBrandingForm(this.formBuilder);\n }\n\n applyStateToForm(branding: BrandingOptionsJson) {\n if (!branding) {\n return;\n }\n let toBePatched = brandingFormGroupTopLevelEntries.reduceRight((prev, curr) => {\n if (brandingFormGroupTopLevelEntriesToUnpack.includes(curr as any)) {\n return Object.assign(prev, { [curr]: branding });\n }\n return Object.assign(prev, { [curr]: branding[curr] });\n }, {});\n\n toBePatched = Object.keys(this.formGroup.controls)\n .filter(key => !brandingFormGroupTopLevelEntries.includes(key as any))\n .reduceRight((prev, curr) => {\n return Object.assign(prev, { [curr]: branding.brandingCssVars || {} });\n }, toBePatched);\n this.formGroup.patchValue(toBePatched);\n }\n\n convertFormToState(value: BrandingFormComponent['formGroup']['value']): string {\n const topLevel: TopLevelValues = brandingFormGroupTopLevelEntries.reduceRight((prev, curr) => {\n if (brandingFormGroupTopLevelEntriesToUnpack.includes(curr as any)) {\n return Object.assign(prev, value[curr]);\n }\n return Object.assign(prev, { [curr]: value[curr] });\n }, {});\n const newBrandingCssVars = Object.entries(value).reduceRight((prev, [key, value]) => {\n if (brandingFormGroupTopLevelEntries.includes(key as any)) {\n return prev;\n }\n return Object.assign(prev, value);\n }, {});\n const externalValue: BrandingOptionsJson = cloneDeep(this.externalValue || {});\n Object.assign(externalValue, topLevel);\n const currentCSSVars = externalValue['brandingCssVars'] || {};\n const assignedNewValues = Object.assign(currentCSSVars, newBrandingCssVars);\n externalValue['brandingCssVars'] = assignedNewValues;\n return JSON.stringify(externalValue, null, 2);\n }\n\n previewBanner(): void {\n this.messageBannerService.showBanner();\n }\n}\n","<c8y-help [src]=\"'/docs/enterprise-tenant/customization/#generic-tab'\"></c8y-help>\n\n<div\n class=\"inner-scroll\"\n [formGroup]=\"formGroup\"\n>\n <!-- Title & Favicon-->\n <div class=\"card-block\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4 class=\"text-normal text-right text-left-xs m-b-16\">\n {{ 'Title & favicon' | translate }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div\n class=\"row p-t-16 p-b-16\"\n [formGroupName]=\"'genericApplicationOptions'\"\n >\n <div class=\"col-md-6\">\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"globalTitle\"\n translate\n >\n Title\n </label>\n <input\n class=\"form-control\"\n id=\"globalTitle\"\n name=\"globalTitle\"\n type=\"text\"\n formControlName=\"globalTitle\"\n />\n <c8y-messages\n [helpMessage]=\"'Title to display in the browser tab' | translate\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label translate>Favicon</label>\n <c8y-static-assets-file-picker\n name=\"faviconUrl\"\n [supportedFileExtensions]=\"['ico']\"\n [isCSSURL]=\"false\"\n formControlName=\"faviconUrl\"\n ></c8y-static-assets-file-picker>\n <c8y-messages [helpMessage]=\"'Supported files: *.ico' | translate\"></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"card-block separator-top\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Dark theme\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <c8y-form-group class=\"m-b-32 p-t-8 m-t-4\">\n <label class=\"c8y-switch\">\n <input\n class=\"form-control\"\n name=\"darkThemeAvailable\"\n type=\"checkbox\"\n formControlName=\"darkThemeAvailable\"\n />\n <span></span>\n <span translate>Enable dark theme support</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <!-- Typography -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Typography\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <fieldset\n class=\"c8y-fieldset p-24\"\n [formGroupName]=\"'baseTypography'\"\n >\n <legend translate>Base typography</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"font-url\"\n translate\n >\n Fonts URL\n </label>\n <input\n class=\"form-control\"\n id=\"font-url\"\n placeholder=\"{{\n 'e.g. {{ example }}' | translate : { example: 'https://fonts.googleapis.com/css?family=Roboto:400,500,700' }\n }}\"\n type=\"text\"\n formControlName=\"font-url\"\n />\n <c8y-messages [helpMessage]=\"'The Google fonts URL' | translate\"></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"font-family-base\"\n for=\"font-family-base\"\n translate\n >\n Base font stack\n </label>\n <input\n class=\"form-control\"\n id=\"font-family-base\"\n placeholder=\"{{ 'e.g. {{ example }}' | translate : {example: '&quot;Roboto&quot;, Arial, sans-serif'} }}\"\n name=\"font-family-base\"\n type=\"text\"\n formControlName=\"font-family-base\"\n />\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6\">\n <fieldset\n class=\"c8y-fieldset p-24\"\n [formGroupName]=\"'headingsAndNavigatorTypography'\"\n >\n <legend>{{ 'Headings & navigator' | translate }}</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"font-family-headings\"\n for=\"font-family-headings\"\n translate\n >\n Headings font stack\n </label>\n <input\n class=\"form-control\"\n id=\"font-family-headings\"\n placeholder=\"{{ 'e.g. {{ example }}' | translate : {example: '&quot;Roboto&quot;, Arial, sans-serif'} }}\"\n type=\"text\"\n formControlName=\"font-family-headings\"\n />\n <c8y-messages\n [helpMessage]=\"\n 'Leave empty to use the same font as the base font stack' | translate\n \"\n ></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"navigator-font-family\"\n translate\n >\n Navigator font stack\n </label>\n <div class=\"form-control-static\">\n <label class=\"c8y-radio radio-inline\">\n <input\n name=\"navigator-font-family\"\n type=\"radio\"\n formControlName=\"navigator-font-family\"\n [value]=\"'var(--font-family-base)'\"\n />\n <span></span>\n <span translate>Match base font stack</span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"Radio Two\"\n >\n <input\n name=\"navigator-font-family\"\n type=\"radio\"\n formControlName=\"navigator-font-family\"\n [value]=\"'var(--font-family-headings)'\"\n />\n <span></span>\n <span translate>Match headings font stack</span>\n </label>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Cookie banner -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Cookie banner\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <fieldset\n class=\"c8y-fieldset p-24\"\n [formGroupName]=\"'cookieBanner'\"\n >\n <legend translate>Cookie banner</legend>\n <label class=\"c8y-switch\">\n <input\n class=\"form-control\"\n name=\"cookieBannerEnabled\"\n type=\"checkbox\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"!formGroup.value.cookieBanner.cookieBannerDisabled\"\n (ngModelChange)=\"cockieBannerChange($event)\"\n />\n <span></span>\n <span translate>Enable cookie banner</span>\n </label>\n\n <div\n class=\"collapse\"\n [collapse]=\"formGroup.value.cookieBanner.cookieBannerDisabled\"\n [isAnimated]=\"true\"\n >\n <div\n class=\"row\"\n style=\"min-height: 227px\"\n >\n <ng-container *ngIf=\"formGroup.value.cookieBanner.cookieBannerDisabled !== true\">\n <div class=\"col-md-6\">\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"cookieBannerTitle\"\n translate\n >\n Title\n </label>\n <input\n class=\"form-control\"\n id=\"cookieBannerTitle\"\n name=\"cookieBannerTitle\"\n type=\"text\"\n formControlName=\"cookieBannerTitle\"\n />\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"policyUrl\"\n translate\n >\n Link to privacy policy\n </label>\n <input\n class=\"form-control\"\n id=\"policyUrl\"\n name=\"policyUrl\"\n type=\"text\"\n formControlName=\"policyUrl\"\n />\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"policyVersion\"\n translate\n >\n Version of privacy policy\n </label>\n <input\n class=\"form-control\"\n id=\"policyVersion\"\n name=\"policyVersion\"\n type=\"text\"\n formControlName=\"policyVersion\"\n />\n <c8y-messages\n [helpMessage]=\"\n 'Changing the version of the privacy policy invalidates already existing cookie consents.'\n | translate\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"cookieBannerText\"\n translate\n >\n Text\n </label>\n <textarea\n class=\"form-control\"\n id=\"cookieBannerText\"\n name=\"cookieBannerText\"\n rows=\"8\"\n formControlName=\"cookieBannerText\"\n ></textarea>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </div>\n </ng-container>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <!-- Message banner -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Message banner\n </h4>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <fieldset\n class=\"c8y-fieldset p-24\"\n [formGroupName]=\"'messageBanner'\"\n >\n <legend translate>Message banner</legend>\n\n <label class=\"c8y-switch\">\n <input\n class=\"form-control\"\n name=\"messageBannerEnabled\"\n type=\"checkbox\"\n formControlName=\"messageBannerEnabled\"\n />\n <span></span>\n <span translate>Enable message banner</span>\n </label>\n <div\n class=\"collapse\"\n [collapse]=\"!formGroup.value.messageBanner.messageBannerEnabled\"\n [isAnimated]=\"true\"\n >\n <div class=\"d-flex a-i-center gap-8 p-t-16 p-b-16\">\n <fieldset class=\"c8y-fieldset p-16\">\n <legend>{{ 'Message type' | translate }}</legend>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Info' | translate }}\"\n >\n <input\n type=\"radio\"\n value=\"info\"\n formControlName=\"messageBannerType\"\n />\n <span></span>\n <span class=\"d-flex a-i-center\">\n <i\n class=\"text-info icon-16 m-r-4\"\n c8yIcon=\"info-circle\"\n ></i>\n Info\n </span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Warning' | translate }}\"\n >\n <input\n type=\"radio\"\n value=\"warning\"\n formControlName=\"messageBannerType\"\n />\n <span></span>\n <span class=\"d-flex a-i-center\">\n <i\n class=\"text-warning icon-16 m-r-4\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Warning' | translate }}\n </span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Danger' | translate }}\"\n >\n <input\n type=\"radio\"\n value=\"danger\"\n formControlName=\"messageBannerType\"\n />\n <span></span>\n <span class=\"d-flex a-i-center\">\n <i\n class=\"text-danger icon-16 m-r-4\"\n c8yIcon=\"exclamation-circle\"\n ></i>\n {{ 'Danger' | translate }}\n </span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Success' | translate }}\"\n >\n <input\n type=\"radio\"\n value=\"success\"\n formControlName=\"messageBannerType\"\n />\n <span></span>\n <span class=\"d-flex a-i-center\">\n <i\n class=\"text-success icon-16 m-r-4\"\n c8yIcon=\"check-circle\"\n ></i>\n {{ 'Success' | translate }}\n </span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'System' | translate }}\"\n >\n <input\n type=\"radio\"\n value=\"system\"\n formControlName=\"messageBannerType\"\n />\n <span></span>\n <span>\n <i\n class=\"text-primary icon-16 m-r4\"\n c8yIcon=\"wrench\"\n ></i>\n {{ 'System' | translate }}\n </span>\n </label>\n </fieldset>\n </div>\n\n <c8y-form-group\n class=\"m-b-32 p-b-32\"\n [style]=\"{ height: '300px' }\"\n *ngIf=\"formGroup.value.messageBanner.messageBannerEnabled\"\n >\n <label\n for=\"messageBannerContent\"\n translate\n >\n Message content\n </label>\n <c8y-editor\n class=\"flex-grow form-control\"\n style=\"height: 100%\"\n formControlName=\"messageBannerContent\"\n [editorOptions]=\"{language: 'markdown'}\"\n monacoEditorMarkerValidator\n ></c8y-editor>\n <c8y-messages\n [helpMessage]=\"messageBannerHelp | translate: messageBannerHelpParams\"\n ></c8y-messages>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"previewBanner()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"eye\"\n ></i>\n <span translate>Preview banner</span>\n </button>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n</div>\n","import { gettext } from '@c8y/ngx-components/gettext';\nimport { colorBrandingVars } from '@c8y/ngx-components/branding/shared/data';\n\ntype ColorVariableName = (typeof colorBrandingVars)[number];\n\ntype Color = { label: string; formControlName: ColorVariableName };\n\nexport const formStructure = {\n brandColors: {\n label: gettext('Brand colors'),\n brandColors: {\n label: gettext('Brand colors'),\n colors: [\n {\n label: gettext('Brand primary'),\n formControlName: 'brand-primary'\n },\n {\n label: gettext('Brand light'),\n formControlName: 'brand-light'\n },\n {\n label: gettext('Brand dark'),\n formControlName: 'brand-dark'\n }\n ] as const satisfies Color[]\n },\n shades: {\n label: gettext('Shades'),\n colorColumn: [\n [\n {\n label: 'c8y-brand-10',\n formControlName: 'c8y-brand-10'\n },\n {\n label: 'c8y-brand-20',\n formControlName: 'c8y-brand-20'\n },\n {\n label: 'c8y-brand-30',\n formControlName: 'c8y-brand-30'\n },\n {\n label: 'c8y-brand-40',\n formControlName: 'c8y-brand-40'\n }\n ],\n [\n {\n label: 'c8y-brand-50',\n formControlName: 'c8y-brand-50'\n },\n {\n label: 'c8y-brand-60',\n formControlName: 'c8y-brand-60'\n },\n {\n label: 'c8y-brand-70',\n formControlName: 'c8y-brand-70'\n },\n {\n label: 'c8y-brand-80',\n formControlName: 'c8y-brand-80'\n }\n ]\n ] as const satisfies Color[][]\n }\n },\n statusColors: {\n label: gettext('Status colors'),\n subCategories: [\n {\n label: gettext('Info colors'),\n colors: [\n {\n label: gettext('Info'),\n formControlName: 'palette-status-info'\n },\n {\n label: gettext('Info light'),\n formControlName: 'palette-status-info-light'\n },\n {\n label: gettext('Info dark'),\n formControlName: 'palette-status-info-dark'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Warning colors'),\n colors: [\n {\n label: gettext('Warning'),\n formControlName: 'palette-status-warning'\n },\n {\n label: gettext('Warning light'),\n formControlName: 'palette-status-warning-light'\n },\n {\n label: gettext('Warning dark'),\n formControlName: 'palette-status-warning-dark'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Danger colors'),\n colors: [\n {\n label: gettext('Danger'),\n formControlName: 'palette-status-danger'\n },\n {\n label: gettext('Danger light'),\n formControlName: 'palette-status-danger-light'\n },\n {\n label: gettext('Danger dark'),\n formControlName: 'palette-status-danger-dark'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Success colors'),\n colors: [\n {\n label: gettext('Success'),\n formControlName: 'palette-status-success'\n },\n {\n label: gettext('Success light'),\n formControlName: 'palette-status-success-light'\n },\n {\n label: gettext('Success dark'),\n formControlName: 'palette-status-success-dark'\n }\n ] as const satisfies Color[]\n }\n ]\n },\n actionBar: {\n label: gettext('Action bar'),\n colorColumns: [\n {\n label: gettext('Action bar'),\n colorColumns: [\n [\n {\n label: gettext('Background color'),\n formControlName: 'action-bar-background-default'\n },\n {\n label: gettext('Text color'),\n formControlName: 'action-bar-color-default'\n },\n {\n label: gettext('Icon color'),\n formControlName: 'action-bar-icon-color'\n }\n ],\n [\n {\n label: gettext('Button color'),\n formControlName: 'action-bar-color-actions'\n },\n {\n label: gettext('Button hover color'),\n formControlName: 'action-bar-color-actions-hover'\n }\n ]\n ] as const satisfies Color[][]\n }\n ]\n },\n mainHeader: {\n label: gettext('Main header'),\n colorColumns: [\n {\n label: gettext('Main header'),\n colorColumns: [\n [\n {\n label: gettext('Background color'),\n formControlName: 'header-color'\n },\n {\n label: gettext('Text color'),\n formControlName: 'header-text-color'\n }\n ],\n [\n {\n label: gettext('Button hover color'),\n formControlName: 'header-hover-color'\n }\n ]\n ] as const satisfies Color[][]\n }\n ]\n },\n navigator: {\n label: gettext('Navigator'),\n colorColumns: [\n {\n label: gettext('Navigation'),\n colors: [\n {\n label: gettext('Background color'),\n formControlName: 'navigator-bg-color'\n },\n {\n label: gettext('Text color'),\n formControlName: 'navigator-text-color'\n },\n {\n label: gettext('Separator color'),\n formControlName: 'navigator-separator-color'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Header'),\n colors: [\n {\n label: gettext('Header background color'),\n formControlName: 'navigator-header-bg'\n },\n {\n label: gettext('Title color'),\n formControlName: 'navigator-title-color'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Active node'),\n colors: [\n {\n label: gettext('Active background color'),\n formControlName: 'navigator-active-bg'\n },\n {\n label: gettext('Active border color'),\n formControlName: 'navigator-border-active'\n },\n {\n label: gettext('Active text color'),\n formControlName: 'navigator-color-active'\n }\n ] as const satisfies Color[]\n }\n ]\n },\n rightDrawer: {\n label: gettext('Right drawer'),\n colorColumns: [\n {\n label: gettext('Panel'),\n colors: [\n {\n label: gettext('Background color'),\n formControlName: 'right-drawer-background-default'\n },\n {\n label: gettext('Text color'),\n formControlName: 'right-drawer-text-color-default'\n },\n {\n label: gettext('Text muted color'),\n formControlName: 'right-drawer-text-color-muted'\n },\n {\n label: gettext('Separator color'),\n formControlName: 'right-drawer-separator-color'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Interactive'),\n colors: [\n {\n label: gettext('Link color'),\n formControlName: 'right-drawer-link-color'\n },\n {\n label: gettext('Link hover color'),\n formControlName: 'right-drawer-link-color-hover'\n }\n ] as const satisfies Color[]\n }\n ]\n }\n} as const;\n","import { Component, OnDestroy } from '@angular/core';\nimport { ControlValueAccessor, FormBuilder, FormsModule } from '@angular/forms';\nimport {\n map,\n distinctUntilChanged,\n pairwise,\n delay,\n switchMap,\n filter,\n startWith,\n take\n} from 'rxjs/operators';\nimport {\n CoreModule,\n FilesService,\n GENERIC_FILE_TYPE,\n ThemeSwitcherService,\n ColorInputComponent\n} from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { StaticAssetsFilePickerComponent } from '@c8y/ngx-components/static-assets';\nimport {\n BrandingOptionsJson,\n BrandingShadesService,\n createBrandingForm\n} from '@c8y/ngx-components/branding/shared/data';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, defer, interval, merge, of } from 'rxjs';\nimport { ActivatedRoute } from '@angular/router';\nimport { formStructure } from './branding-theme-form-structure';\n\n@Component({\n selector: 'c8y-branding-theme-form',\n templateUrl: './branding-theme-form.component.html',\n standalone: true,\n host: { class: 'd-contents' },\n imports: [CoreModule, FormsModule, StaticAssetsFilePickerComponent, ColorInputComponent]\n})\nexport class BrandingThemeFormComponent implements ControlValueAccessor, OnDestroy {\n readonly formStructure = formStructure;\n formGroup: ReturnType<BrandingThemeFormComponent['initForm']>;\n imageFileExtensions: string[];\n resetShadesButtonEnabled$: Observable<boolean>;\n private onTouched: () => void;\n\n private externalValue: BrandingOptionsJson = {};\n private formGroupValueChanges$: BrandingThemeFormComponent['formGroup']['valueChanges'];\n private addDarkThemePrefix = false;\n private readonly varsToConvertToHeight = [\n 'navigator-platform-logo-height',\n 'dark-navigator-platform-logo-height'\n ] as const;\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private formBuilder: FormBuilder,\n private filesService: FilesService,\n private brandingShades: BrandingShadesService,\n private themeSwitcher: ThemeSwitcherService\n ) {\n this.addDarkThemePrefix = !!this.activatedRoute.snapshot.data.dark;\n this.themeSwitcher.temporaryChangeTheme(this.addDarkThemePrefix ? 'dark' : 'light');\n this.formGroup = this.initForm();\n this.formGroupValueChanges$ = this.formGroup.valueChanges.pipe(takeUntilDestroyed());\n this.imageFileExtensions = this.filesService\n .mapGenericFileTypesToExtensions([GENERIC_FILE_TYPE.IMAGE])\n .filter(ext => ext !== 'ico');\n\n const hasCustomShades$ = merge(\n this.formGroup.valueChanges,\n defer(() => of(this.formGroup.value))\n ).pipe(\n takeUntilDestroyed(),\n map(tmp => this.brandingShades.hasCustomShadesSet(tmp['brand-primary'], tmp)),\n distinctUntilChanged()\n );\n this.resetShadesButtonEnabled$ = merge(\n defer(() => of(this.formGroup.controls['brand-primary'].status)),\n this.formGroup.controls['brand-primary'].statusChanges\n ).pipe(\n // statusChanges emits 'PENDING' when the form control is async validating\n // https://github.com/angular/angular/issues/41519\n switchMap(status => {\n if (status === 'PENDING') {\n return interval(200).pipe(\n map(() => this.formGroup.controls['brand-primary'].status),\n filter(stat => stat !== 'PENDING'),\n take(1),\n startWith(status)\n );\n }\n return of(status);\n }),\n switchMap(status => {\n if (status !== 'VALID') {\n return of(false);\n }\n return hasCustomShades$;\n })\n );\n\n const brandPrimaryFormControl = this.formGroup.controls['brand-primary'];\n brandPrimaryFormControl.valueChanges\n .pipe(\n filter(color => this.brandingShades.isValidShadeColor(color)),\n takeUntilDestroyed(),\n distinctUntilChanged(),\n pairwise(),\n delay(5)\n )\n .subscribe(([prev, curr]) => {\n try {\n if (!this.brandingShades.hasCustomShadesSet(prev, this.formGroup.value)) {\n this.regenerateShadesBasedOnPrimaryColor(curr);\n }\n } catch (e) {\n console.log(e);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.themeSwitcher.resetTemporaryTheme();\n }\n\n regenerateShadesBasedOnPrimaryColor(color?: string) {\n const newShades = this.brandingShades.getShadeColorBrandingCssVars(\n color || this.formGroup.value['brand-primary']\n );\n this.formGroup.patchValue(newShades);\n }\n\n writeValue(obj: string): void {\n try {\n const parsedObj = JSON.parse(obj);\n this.externalValue = parsedObj;\n this.applyStateToForm(parsedObj);\n } catch (e) {\n // failed to parse\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.formGroupValueChanges$.subscribe(value => fn(this.convertFormToState(value)));\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n onBlur(): void {\n this.onTouched();\n }\n\n initForm() {\n return createBrandingForm(this.formBuilder);\n }\n\n applyStateToForm(branding: BrandingOptionsJson) {\n if (!branding) {\n return;\n }\n const toBePatched = {};\n\n const prefix = this.getPrefix();\n Object.entries(branding.brandingCssVars || {}).forEach(([key, value]) => {\n if (prefix && !key.startsWith(prefix)) {\n return;\n }\n const keyInForm = key.replace(prefix, '');\n if (this.varsToConvertToHeight.includes(keyInForm as any) && typeof value === 'string') {\n toBePatched[keyInForm] = Number.parseInt(value.replace(/[a-zA-Z%]/, '') || '0');\n return;\n }\n toBePatched[keyInForm] = value;\n });\n this.formGroup.patchValue(toBePatched);\n }\n\n convertFormToState(value: BrandingThemeFormComponent['formGroup']['value']): string {\n const prefixedBrandingCssVars = {};\n const prefix = this.getPrefix();\n Object.entries(value).forEach(([key, value]) => {\n prefixedBrandingCssVars[`${prefix}${key}`] = value;\n });\n const externalValue: BrandingOptionsJson = cloneDeep(this.externalValue || {});\n const currentCSSVars = externalValue['brandingCssVars'] || {};\n const assignedNewValues = Object.assign(currentCSSVars, prefixedBrandingCssVars);\n for (const key of this.varsToConvertToHeight) {\n const value = assignedNewValues[key];\n if (typeof value === 'number') {\n assignedNewValues[key] += 'px';\n }\n }\n externalValue['brandingCssVars'] = assignedNewValues;\n return JSON.stringify(externalValue, null, 2);\n }\n\n private getPrefix() {\n return this.addDarkThemePrefix ? 'dark-' : '';\n }\n}\n","<c8y-help [src]=\"'/docs/enterprise-tenant/customization/#light-dark-theme-tab'\"></c8y-help>\n\n<div\n class=\"inner-scroll\"\n [formGroup]=\"formGroup\"\n>\n <!-- Logos -->\n <div class=\"card-block\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Logos\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend translate>Brand logo</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"brand-logo-img\"\n translate\n >\n Brand logo file\n </label>\n <c8y-static-assets-file-picker\n name=\"brand-logo-img\"\n [supportedFileExtensions]=\"imageFileExtensions\"\n [isCSSURL]=\"true\"\n [size]=\"150\"\n formControlName=\"brand-logo-img\"\n ></c8y-static-assets-file-picker>\n <c8y-messages [helpMessage]=\"'Supported files: *.png, *.svg, *.jpg' | translate\"></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"brand-logo-img-height\"\n for=\"brand-logo-img-height\"\n translate\n >\n Brand logo height\n </label>\n <input\n class=\"form-control\"\n id=\"brand-logo-img-height\"\n placeholder=\"{{ 'e.g. {{ example }}' | translate: { example: '50' } }}\"\n name=\"brand-logo-img-height\"\n type=\"number\"\n formControlName=\"brand-logo-img-height\"\n />\n <c8y-messages [helpMessage]=\"'Value is applied in px' | translate\"></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend translate>Navigator logo</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"navigator-platform-logo\"\n translate\n >\n Navigator logo file\n </label>\n <c8y-static-assets-file-picker\n name=\"navigator-platform-logo\"\n [supportedFileExtensions]=\"imageFileExtensions\"\n [isCSSURL]=\"true\"\n [size]=\"150\"\n formControlName=\"navigator-platform-logo\"\n ></c8y-static-assets-file-picker>\n <c8y-messages [helpMessage]=\"'Supported files: *.png, *.svg, *.jpg' | translate\"></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"navigator-platform-logo-height\"\n for=\"navigator-platform-logo-height\"\n translate\n >\n Navigator logo height\n </label>\n <input\n class=\"form-control\"\n id=\"navigator-platform-logo-height\"\n placeholder=\"{{ 'e.g. {{ example }}' | translate: { example: '50' } }}\"\n name=\"navigator-platform-logo-height\"\n type=\"number\"\n [min]=\"1\"\n formControlName=\"navigator-platform-logo-height\"\n />\n <c8y-messages [helpMessage]=\"'Value is applied in px' | translate\"></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend translate>Login image</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"login-platform-animation-img\"\n translate\n >\n Login image file\n </label>\n <c8y-static-assets-file-picker\n name=\"login-platform-animation-img\"\n [supportedFileExtensions]=\"imageFileExtensions\"\n [isCSSURL]=\"false\"\n [size]=\"150\"\n formControlName=\"login-platform-animation-img\"\n ></c8y-static-assets-file-picker>\n <c8y-messages [helpMessage]=\"'Supported files: *.png, *.svg, *.jpg' | translate\"></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Brand colors -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.brandColors.label | translate}}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend>{{ formStructure.brandColors.brandColors.label | translate}}</legend>\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of formStructure.brandColors.brandColors.colors\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-8\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend>{{ formStructure.brandColors.shades.label | translate }}</legend>\n <div class=\"row\">\n <div class=\"col-md-6\" *ngFor=\"let colorColumn of formStructure.brandColors.shades.colorColumn\">\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of colorColumn\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n data-cy=\"branding-reset-shades-button\"\n (click)=\"regenerateShadesBasedOnPrimaryColor()\"\n [disabled]=\"!(resetShadesButtonEnabled$ | async)\"\n >\n <i [c8yIcon]=\"'reset'\"></i>\n <span translate>Reset shades</span>\n </button>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Status colors -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.statusColors.label | translate }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-6\" *ngFor=\"let subCategory of formStructure.statusColors.subCategories\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend>{{ subCategory.label | translate }}</legend>\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of subCategory.colors\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Generic -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Generic\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend translate>Generic colors</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"body-background-color\"\n for=\"body-background-color\"\n translate\n >\n Body background color\n </label>\n <c8y-color-input\n name=\"body-background-color\"\n formControlName=\"body-background-color\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"text-color\"\n for=\"text-color\"\n translate\n >\n Text color\n </label>\n <c8y-color-input\n name=\"text-color\"\n formControlName=\"text-color\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"text-muted\"\n for=\"text-muted\"\n translate\n >\n Text muted color\n </label>\n <c8y-color-input\n name=\"text-muted\"\n formControlName=\"text-muted\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend translate>Interactive</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"link-color\"\n for=\"link-color\"\n translate\n >\n Link color\n </label>\n <c8y-color-input\n name=\"link-color\"\n formControlName=\"link-color\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"link-hover-color\"\n for=\"link-hover-color\"\n translate\n >\n Link hover color\n </label>\n <c8y-color-input\n name=\"link-hover-color\"\n formControlName=\"link-hover-color\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"btn-border-radius-base\"\n for=\"btn-border-radius-base\"\n translate\n >\n Button border-radius\n </label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g. 4' | translate }}\"\n name=\"btn-border-radius-base\"\n type=\"number\"\n formControlName=\"btn-border-radius-base\"\n />\n <c8y-messages [helpMessage]=\"'Value is applied in px' | translate\"></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Action bar -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.actionBar.label | translate }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <fieldset class=\"c8y-fieldset p-24\" *ngFor=\"let colorColumn of formStructure.actionBar.colorColumns\">\n <legend>{{ colorColumn.label | translate }}</legend>\n <div class=\"row\">\n <div class=\"col-md-6\" *ngFor=\"let subColorColumn of colorColumn.colorColumns\">\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of subColorColumn\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <!-- Main header -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.mainHeader.label | translate }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <fieldset class=\"c8y-fieldset p-24\" *ngFor=\"let colorColumn of formStructure.mainHeader.colorColumns\">\n <legend>{{ colorColumn.label | translate }}</legend>\n <div class=\"row\">\n <div class=\"col-md-6\" *ngFor=\"let subColorColumn of colorColumn.colorColumns\">\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of subColorColumn\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <!-- Navigator -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.navigator.label }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-4\" *ngFor=\"let colorColumn of formStructure.navigator.colorColumns\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend>{{ colorColumn.label | translate }}</legend>\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of colorColumn.colors\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Right drawer -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.rightDrawer.label | translate }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-6\" *ngFor=\"let colorColumn of formStructure.rightDrawer.colorColumns\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend>{{ colorColumn.label | translate }}</legend>\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of colorColumn.colors\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnDestroy } from '@angular/core';\nimport { ActivatedRoute, Router, RouterOutlet } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlertService, AppStateService, CoreModule } from '@c8y/ngx-components';\nimport { BehaviorSubject, Observable, firstValueFrom } from 'rxjs';\nimport { map, distinctUntilChanged, switchMap } from 'rxjs/operators';\nimport { cloneDeep } from 'lodash-es';\nimport {\n ApplyBrandingLocallyService,\n BrandingOptionsJson,\n StoreBrandingService\n} from '@c8y/ngx-components/branding/shared/data';\nimport { AsyncValidator, ControlValueAccessor, FormControl } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'c8y-edit-branding-router-outlet',\n templateUrl: './edit-branding-router-outlet.component.html',\n standalone: true,\n imports: [RouterOutlet, CoreModule]\n})\nexport class EditBrandingRouterOutletComponent implements OnDestroy {\n brandingName$: Observable<string>;\n formControl = new FormControl<string>(undefined);\n fallbackBranding$: Observable<BrandingOptionsJson>;\n tabName$: Observable<string>;\n isGlobalBranding$: Observable<boolean>;\n private newBranding = new BehaviorSubject<BrandingOptionsJson>(null);\n private currentlyDisplayedComponent = new BehaviorSubject<\n (ControlValueAccessor & Partial<AsyncValidator>) | null\n >(null);\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private store: StoreBrandingService,\n private router: Router,\n private alert: AlertService,\n private applyBrandingService: ApplyBrandingLocallyService,\n private appState: AppStateService\n ) {\n this.isGlobalBranding$ = this.activatedRoute.data.pipe(\n map(({ tags }) => {\n return tags?.includes('latest');\n })\n );\n this.tabName$ = this.currentlyDisplayedComponent.pipe(\n switchMap(() => this.activatedRoute.firstChild.data),\n map(data => data.tabName)\n );\n this.brandingName$ = this.activatedRoute.params.pipe(map(params => params.name));\n this.formControl.addValidators(control => {\n try {\n JSON.parse(control.value);\n return null;\n } catch (e) {\n return { invalidJson: true };\n }\n });\n this.fallbackBranding$ = this.activatedRoute.data.pipe(map(data => data.fallbackBranding));\n this.activatedRoute.data\n .pipe(takeUntilDestroyed(), distinctUntilChanged())\n .subscribe(({ branding }) => {\n this.applyBrandingService.applyBranding(branding);\n this.formControl.setValue(JSON.stringify(branding, null, 2));\n });\n this.currentlyDisplayedComponent.pipe(takeUntilDestroyed()).subscribe(component => {\n if (!component) {\n return;\n }\n this.formControl.clearAsyncValidators();\n component.registerOnChange(value => this.onBrandingVarChanges(value));\n component.writeValue(this.formControl.value);\n if (component.validate) {\n this.formControl.addAsyncValidators(form => component.validate(form));\n if (component.registerOnValidatorChange) {\n component.registerOnValidatorChange(() => this.formControl.updateValueAndValidity());\n }\n }\n\n this.formControl.updateValueAndValidity();\n });\n }\n\n ngOnDestroy(): void {\n this.applyBrandingService.resetBranding();\n }\n\n routeActivated(event: ControlValueAccessor & Partial<AsyncValidator>) {\n this.currentlyDisplayedComponent.next(event);\n }\n\n async saveBranding() {\n try {\n const currentBranding = this.newBranding.value;\n const tagsOfCurrentVersion = await firstValueFrom(\n this.activatedRoute.data.pipe(map(data => data.tags))\n );\n\n const currentBrandingName = this.activatedRoute.snapshot.params.name;\n const { variants } = await this.store.loadBrandingVariants();\n const currentBrandingObj = variants.find(v => v.tags.includes(currentBrandingName));\n const currentVersion = currentBrandingObj.version;\n await this.store.saveExistingBranding(currentBranding, currentVersion, tagsOfCurrentVersion);\n this.router.navigate(\n ['../../', currentBrandingName, this.activatedRoute.snapshot.routeConfig.path],\n {\n relativeTo: this.activatedRoute,\n replaceUrl: true\n }\n );\n this.alert.success(\n gettext(\n 'Branding saved. To apply this branding, refresh any open window that might be affected.'\n )\n );\n } catch (e) {\n this.alert.addServerFailure(e, 'danger');\n console.warn(e);\n }\n }\n\n cancel() {\n this.router.navigate(['branding-editor']);\n }\n\n async openPreview() {\n const name = this.activatedRoute.snapshot.params.name;\n this.store.openPreviewForBranding(name);\n }\n\n async markAsActive() {\n const currentBrandingName = this.activatedRoute.snapshot.params.name;\n const { variants } = await this.store.loadBrandingVariants();\n const currentBrandingObj = variants.find(v => v.tags.includes(currentBrandingName));\n await this.store.markAsActive(currentBrandingObj);\n }\n\n async onBrandingVarChanges(value: string) {\n this.formControl.setValue(value);\n\n try {\n const parsedValue: BrandingOptionsJson = JSON.parse(value);\n const fallbackBranding: BrandingOptionsJson = cloneDeep(\n await firstValueFrom(this.fallbackBranding$)\n );\n this.cleanUpObjects(parsedValue);\n this.cleanUpObjects(parsedValue.brandingCssVars);\n for (const key in fallbackBranding) {\n if (parsedValue[key] === undefined) {\n parsedValue[key] = fallbackBranding[key];\n }\n\n if (typeof parsedValue[key] === 'object' && typeof fallbackBranding[key] === 'object') {\n parsedValue[key] = Object.assign(fallbackBranding[key], parsedValue[key]);\n }\n }\n this.applyBrandingService.applyBranding(parsedValue);\n this.newBranding.next(parsedValue);\n } catch (e) {\n // not valid JSON;\n }\n }\n\n private cleanUpObjects(value: Record<string, any>) {\n if (!value) {\n return;\n }\n Object.keys(value).forEach(key => {\n if (value[key] === null || value[key] === '') {\n delete value[key];\n }\n });\n }\n}\n","<c8y-title>{{ brandingName$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Settings' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'palette'\"\n [label]=\"'Branding' | translate\"\n [path]=\"'/branding-editor'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"brandingName$ | async\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div class=\"card card--fullpage content-fullpage\">\n <div class=\"card-header separator\">\n <div class=\"card-title\">{{ brandingName$ | async }} — {{ tabName$ | async | translate }}</div>\n </div>\n <router-outlet\n class=\"d-contents\"\n (activate)=\"routeActivated($event)\"\n ></router-outlet>\n\n <div class=\"card-footer separator\">\n <!-- footer content -->\n <button\n class=\"btn btn-default\"\n data-cy=\"branding-cancel\"\n (click)=\"cancel()\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n data-cy=\"branding-save\"\n [disabled]=\"formControl.invalid\"\n (click)=\"saveBranding()\"\n translate\n >\n Save\n </button>\n <button\n class=\"btn btn-default\"\n data-cy=\"branding-save-as\"\n [disabled]=\"formControl.invalid\"\n (click)=\"openPreview()\"\n translate\n >\n Open preview\n </button>\n <button\n class=\"btn btn-default\"\n data-cy=\"branding-set-as-latest\"\n (click)=\"markAsActive()\"\n [disabled]=\"isGlobalBranding$ | async\"\n translate\n >\n Set as global\n </button>\n </div>\n</div>\n","import { Component } from '@angular/core';\nimport { StaticAssetsFileListComponent } from '@c8y/ngx-components/static-assets/modal';\nimport {\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n C8yTranslateDirective,\n C8yTranslatePipe,\n ClipboardService,\n TitleComponent,\n ActionBarItemComponent,\n FilesService,\n GENERIC_FILE_TYPE\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { StaticAsset } from '@c8y/ngx-components/static-assets/data';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'c8y-branding-assets',\n templateUrl: './branding-assets.component.html',\n standalone: true,\n imports: [\n StaticAssetsFileListComponent,\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n C8yTranslateDirective,\n C8yTranslatePipe,\n ActionBarItemComponent,\n FormsModule\n ]\n})\nexport class BrandingAssetsComponent {\n filterOptions = [\n {\n label: gettext('All'),\n value: []\n },\n {\n label: gettext('Images'),\n value: this.filesService.mapGenericFileTypesToExtensions([GENERIC_FILE_TYPE.IMAGE])\n },\n {\n label: gettext('Fonts'),\n value: this.filesService.mapGenericFileTypesToExtensions([GENERIC_FILE_TYPE.FONT])\n }\n ];\n supportedFileExtensions = this.filterOptions[0].value;\n\n constructor(\n private clipboard: ClipboardService,\n private filesService: FilesService,\n private translate: TranslateService\n ) {}\n\n onItemSelected(file: StaticAsset) {\n const successMessage = this.translate.instant(\n gettext('Copied asset file path to clipboard. You can use it e.g. in custom CSS.')\n );\n this.clipboard.writeText(file.path, { success: successMessage });\n }\n}\n","<c8y-title>{{ 'Branding assets' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Settings' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'palette'\"\n [label]=\"'Branding' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'files'\"\n [label]=\"'Branding assets' | translate\"\n [path]=\"'/branding-editor/assets'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'left'\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [(ngModel)]=\"supportedFileExtensions\"\n >\n @for (filterOption of filterOptions; track $index) {\n <option [ngValue]=\"filterOption.value\">\n {{ filterOption.label | translate }}\n </option>\n }\n </select>\n </div>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage inner-scroll\">\n <c8y-static-assets-file-list\n [supportedFileExtensions]=\"supportedFileExtensions\"\n (itemSelected)=\"onItemSelected($event)\"\n ></c8y-static-assets-file-list>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ApplyBrandingToAppService","i1","i2","i3","i4","i5","i6","i7","i8.BrandingImportModalService"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-branding-shared-lazy.mjs","sources":["../../branding/shared/lazy/apply-branding-to-app-modal/apply-branding-to-app.service.ts","../../branding/shared/lazy/apply-branding-to-app-modal/apply-branding-to-app-modal.component.ts","../../branding/shared/lazy/apply-branding-to-app-modal/apply-branding-to-app-modal.component.html","../../branding/shared/lazy/branding-tags-cell-renderer/branding-tags-cell-renderer.component.ts","../../branding/shared/lazy/branding-tags-cell-renderer/branding-tags-cell-renderer.component.html","../../branding/shared/lazy/branding-import-modal/branding-import-modal.component.ts","../../branding/shared/lazy/branding-import-modal/branding-import-modal.component.html","../../branding/shared/lazy/branding-import-modal/branding-import-modal.service.ts","../../branding/shared/lazy/branding-name-cell-renderer/branding-name-cell-renderer.component.ts","../../branding/shared/lazy/branding-name-cell-renderer/branding-name-cell-renderer.component.html","../../branding/shared/lazy/branding-tags-header-cell-renderer/branding-tags-header-cell-renderer.component.ts","../../branding/shared/lazy/branding-tags-header-cell-renderer/branding-tags-header-cell-renderer.component.html","../../branding/shared/lazy/branding/branding.component.ts","../../branding/shared/lazy/branding/branding.component.html","../../branding/shared/lazy/branding-form/branding-form.component.ts","../../branding/shared/lazy/branding-form/branding-form.component.html","../../branding/shared/lazy/branding-theme-form/branding-theme-form-structure.ts","../../branding/shared/lazy/branding-theme-form/branding-theme-form.component.ts","../../branding/shared/lazy/branding-theme-form/branding-theme-form.component.html","../../branding/shared/lazy/edit-branding-router-outlet/edit-branding-router-outlet.component.ts","../../branding/shared/lazy/edit-branding-router-outlet/edit-branding-router-outlet.component.html","../../branding/shared/lazy/branding-assets/branding-assets.component.ts","../../branding/shared/lazy/branding-assets/branding-assets.component.html","../../branding/shared/lazy/c8y-ngx-components-branding-shared-lazy.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ApplicationService, ApplicationType, IApplication } from '@c8y/client';\n\n@Injectable({ providedIn: 'root' })\nexport class ApplyBrandingToAppService {\n constructor(private apps: ApplicationService) {}\n\n async getBrandableApps(): Promise<IApplication[]> {\n const { data: apps } = await this.apps.list({\n pageSize: 2000,\n dropOverwrittenApps: true,\n type: ApplicationType.HOSTED\n });\n const appsWithDynamicOptionsUrl = this.getHostedAppsWhereDynamicOptionsUrlIsUndefined(apps);\n return appsWithDynamicOptionsUrl;\n }\n\n getHostedAppsWhereDynamicOptionsUrlIsUndefined(apps: IApplication[]) {\n return apps.filter(app => {\n const manifest = app.manifest;\n if (!manifest) {\n return false;\n }\n // filter out none web sdk based apps\n if (!manifest.webSdkVersion) {\n return false;\n }\n // filter out packages\n if (manifest.isPackage) {\n return false;\n }\n const dynamicOptionsUrl = manifest.dynamicOptionsUrl;\n\n return dynamicOptionsUrl === undefined || dynamicOptionsUrl === true;\n });\n }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ApplyBrandingToAppService } from './apply-branding-to-app.service';\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { AsyncPipe, NgForOf, NgIf } from '@angular/common';\nimport {\n AppIconComponent,\n C8yTranslateDirective,\n C8yTranslatePipe,\n HumanizeAppNamePipe,\n ListItemBodyComponent,\n ListItemCheckboxComponent,\n ListItemComponent,\n ListItemIconComponent,\n ModalComponent\n} from '@c8y/ngx-components';\nimport { Observable, merge, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { uniqBy } from 'lodash-es';\n\n@Component({\n selector: 'c8y-apply-branding-to-app-modal',\n templateUrl: './apply-branding-to-app-modal.component.html',\n standalone: true,\n imports: [\n NgIf,\n AsyncPipe,\n ReactiveFormsModule,\n ModalComponent,\n C8yTranslatePipe,\n C8yTranslateDirective,\n ListItemComponent,\n ListItemIconComponent,\n ListItemCheckboxComponent,\n AppIconComponent,\n ListItemBodyComponent,\n HumanizeAppNamePipe,\n NgForOf\n ]\n})\nexport class ApplyBrandingToAppModalComponent implements OnInit {\n @Input() currentTags: string[];\n brandableApps: Awaited<ReturnType<ApplyBrandingToAppService['getBrandableApps']>> = [];\n form: ReturnType<ApplyBrandingToAppModalComponent['initForm']>;\n numberOfSelectedApps$: Observable<number>;\n\n result = new Promise<ReturnType<typeof this.initForm>['value']>((resolve, reject) => {\n this._resovle = resolve;\n this._reject = reject;\n });\n\n private _resovle: (value: ReturnType<typeof this.initForm>['value']) => void;\n private _reject: (reason?: any) => void;\n constructor(\n private apply: ApplyBrandingToAppService,\n private formBuilder: FormBuilder\n ) {}\n\n async ngOnInit() {\n const brandableApps = await this.apply.getBrandableApps();\n this.brandableApps = uniqBy(brandableApps, 'contextPath');\n const tags = this.brandableApps.map(app => app.contextPath);\n this.form = this.initForm(tags);\n if (this.currentTags.length) {\n this.form.patchValue(\n this.currentTags.reduce((prev, curr) => Object.assign(prev, { [curr]: true }), {})\n );\n }\n this.numberOfSelectedApps$ = merge(this.form.valueChanges, of(this.form.value)).pipe(\n map(value => Object.values(value).filter(Boolean).length)\n );\n }\n\n save() {\n this._resovle(this.form.value);\n }\n\n cancel() {\n this._reject();\n }\n\n private initForm(tags: string[]) {\n const tagsFormMap: Record<string, FormControl<boolean>> = tags.reduceRight(\n (prev, curr) => Object.assign(prev, { [curr]: this.formBuilder.control(false) }),\n {}\n );\n return this.formBuilder.group(tagsFormMap);\n }\n}\n","<c8y-modal\n [title]=\"'Apply branding to apps' | translate\"\n [disabled]=\"!form || form.invalid || !brandableApps.length\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n (onClose)=\"save()\"\n [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n <ng-container c8y-modal-title>\n <span c8yIcon=\"palette\"></span>\n </ng-container>\n <c8y-list-group\n class=\"m-b-0 no-border-last\"\n *ngIf=\"form\"\n [formGroup]=\"form\"\n >\n <c8y-li>\n <p\n class=\"text-center text-medium\"\n *ngIf=\"numberOfSelectedApps$ | async as numberOfApps; else noapps\"\n translate\n >\n {{ numberOfApps }} apps selected for branding\n </p>\n <ng-template #noapps>\n <p\n class=\"text-center text-medium\"\n translate\n >\n No apps selected for branding\n </p>\n </ng-template>\n </c8y-li>\n <c8y-li *ngFor=\"let app of brandableApps\">\n <c8y-li-icon>\n <c8y-app-icon\n class=\"icon-40\"\n [app]=\"app\"\n ></c8y-app-icon>\n </c8y-li-icon>\n <c8y-li-checkbox\n [attr.data-cy]=\"'branding-apply-branding-to-app-checkbox-' + app.contextPath\"\n [formControlName]=\"app.contextPath\"\n ></c8y-li-checkbox>\n <c8y-li-body class=\"p-t-8 d-block\">{{ app | humanizeAppName | async }}</c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n</c8y-modal>\n","import { AsyncPipe, NgForOf, NgIf } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { IApplication } from '@c8y/client';\nimport { AppStateService, CellRendererContext, HumanizeAppNamePipe } from '@c8y/ngx-components';\nimport { Observable, of } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\n\n@Component({\n selector: 'c8y-branding-tags-cell-renderer',\n templateUrl: './branding-tags-cell-renderer.component.html',\n standalone: true,\n imports: [NgIf, NgForOf, HumanizeAppNamePipe, AsyncPipe]\n})\nexport class BrandingTagsCellRendererComponent {\n hasLatestTag: boolean;\n appContextPathsOrApps$: Observable<Array<string | IApplication>>;\n constructor(\n context: CellRendererContext,\n private appState: AppStateService\n ) {\n const tags: string[] = context.value || [];\n this.hasLatestTag = tags.some(tag => tag === 'latest');\n const appSpecificTags = tags\n .filter(tag => tag.startsWith('app-'))\n .map(tag => tag.replace('app-', ''));\n\n this.appContextPathsOrApps$ = this.getAppContextPathsOrApps$(appSpecificTags);\n }\n\n private getAppContextPathsOrApps$(\n appContextPaths: string[]\n ): Observable<Array<string | IApplication>> {\n if (!appContextPaths.length) {\n return of([]);\n }\n return this.appState.currentAppsOfUser.pipe(\n map(apps => {\n return appContextPaths.map(tag => {\n const app = apps.find(app => app.contextPath === tag);\n return app || tag;\n });\n }),\n startWith(appContextPaths)\n );\n }\n}\n","<div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <div\n class=\"tag tag--success\"\n *ngIf=\"hasLatestTag\"\n translate\n >\n Global\n </div>\n <div\n class=\"tag tag--info\"\n *ngFor=\"let tag of appContextPathsOrApps$ | async\"\n [attr.data-cy]=\"'branding-tags-cell-renderer--tag-' + (tag.contextPath ? tag.contextPath : tag)\"\n >\n {{ tag | humanizeAppName | async }}\n </div>\n</div>\n","import { Component, ViewChild } from '@angular/core';\nimport { CoreModule, DroppedFile, ModalComponent, ZipService } from '@c8y/ngx-components';\nimport { AddBrandingModalService } from '@c8y/ngx-components/branding/shared/lazy/add-branding-modal';\nimport { firstValueFrom } from 'rxjs';\nimport { StaticAsset, StaticAssetsService } from '@c8y/ngx-components/static-assets/data';\nimport { StoreBrandingService } from '@c8y/ngx-components/branding/shared/data';\n\n@Component({\n selector: 'c8y-branding-import-modal',\n templateUrl: './branding-import-modal.component.html',\n standalone: true,\n imports: [CoreModule]\n})\nexport class BrandingImportModalComponent {\n @ViewChild(ModalComponent, { static: true }) modal: ModalComponent;\n\n result = new Promise<void>((resolve, reject) => {\n this._resovle = resolve;\n this._reject = reject;\n });\n files: DroppedFile[] = [];\n loading = false;\n\n private _resovle: () => void;\n private _reject: (reason?: any) => void;\n\n constructor(\n private addBrandingModalService: AddBrandingModalService,\n private zip: ZipService,\n private staticAssets: StaticAssetsService,\n private brandings: StoreBrandingService\n ) {}\n\n async droppedFile(event: DroppedFile[]) {\n this.loading = true;\n try {\n this.files = event;\n await this.import(event[0].file);\n } catch (e) {\n console.error(e);\n this.files = [];\n this.loading = false;\n return;\n }\n this.modal._close();\n this._resovle();\n }\n\n async import(file: File) {\n const versionDetails = await this.addBrandingModalService.openAddBrandingModal();\n if (!versionDetails) {\n throw Error('No version details provided');\n }\n\n // verify if branding is already present\n const { variants } = await this.brandings.loadBrandingVariants();\n if (!variants?.length) {\n await this.brandings.getStartedUsingBranding();\n }\n\n const importedZipEntries = await firstValueFrom(this.zip.getEntries(file));\n const staticAssetsEntry = importedZipEntries.find(\n entry => entry.filename === this.staticAssets.fileNames.exportZipName\n );\n if (!staticAssetsEntry) {\n throw Error(\n `Missing \"${this.staticAssets.fileNames.exportZipName}\" file in the uploaded zip.`\n );\n }\n const staticAssetsZip = await firstValueFrom(this.zip.getData(staticAssetsEntry));\n const staticAssetsZipFile = new File([staticAssetsZip], staticAssetsEntry.filename);\n const staticAssetsZipEntries = await firstValueFrom(this.zip.getEntries(staticAssetsZipFile));\n const filesToAdd = new Array<File>();\n let oldAssets: Array<StaticAsset>;\n let newAssets: Array<StaticAsset>;\n\n const contentsFileEntry = staticAssetsZipEntries.find(\n entry => entry.filename === this.staticAssets.fileNames.contents\n );\n if (contentsFileEntry) {\n const fileContent = await (await firstValueFrom(this.zip.getData(contentsFileEntry))).text();\n oldAssets = JSON.parse(fileContent);\n }\n for (const entry of staticAssetsZipEntries) {\n if (\n entry.filename === this.brandings.fileNames.manifest ||\n entry.filename === this.staticAssets.fileNames.contents\n ) {\n continue;\n }\n const file = await firstValueFrom(this.zip.getData(entry));\n const metadata = oldAssets?.find(asset => asset.fileName === entry.filename);\n if (metadata) {\n filesToAdd.push(\n new File([file], entry.filename, {\n type: metadata.type,\n lastModified: metadata.lastModified\n })\n );\n } else {\n filesToAdd.push(new File([file], entry.filename));\n }\n }\n if (filesToAdd.length > 0) {\n const currentStaticAssets = await this.staticAssets.listFilesCached('branding', true);\n newAssets = await this.staticAssets.addFilesToStaticAssets(\n 'branding',\n filesToAdd,\n currentStaticAssets,\n false\n );\n }\n\n const publicOptionsEntry = importedZipEntries.find(\n entry => entry.filename === this.brandings.fileNames.exportZipName\n );\n if (!publicOptionsEntry) {\n throw Error(`Missing \"${this.brandings.fileNames.exportZipName}\" file in the uploaded zip.`);\n }\n const publicOptionsZip = await firstValueFrom(this.zip.getData(publicOptionsEntry));\n const publicOptionsZipFile = new File([publicOptionsZip], publicOptionsEntry.filename);\n\n const publicOptionsFiles = await firstValueFrom(this.zip.getEntries(publicOptionsZipFile));\n const optionsFileEntry = publicOptionsFiles.find(\n entry => entry.filename === this.brandings.fileNames.options\n );\n if (!optionsFileEntry) {\n throw Error(\n `Missing \"${this.brandings.fileNames.options}\" file in \"${this.brandings.fileNames.exportZipName}\" file of the uploaded zip.`\n );\n }\n\n const optionsFile = await firstValueFrom(this.zip.getData(optionsFileEntry));\n let options = JSON.parse(await optionsFile.text());\n\n if (oldAssets.length && newAssets.length) {\n options = this.brandings.replaceBrandingAssetsInBrandingOptions(\n options,\n oldAssets,\n newAssets\n );\n }\n\n const zip = await this.brandings.getBrandingZip(options);\n\n await this.brandings.saveBranding(zip, `${versionDetails.brandingName}-1`, [\n versionDetails.brandingName\n ]);\n }\n\n cancel() {\n this._reject();\n }\n}\n","<c8y-modal\n [title]=\"'Import branding variant'\"\n [headerClasses]=\"'dialog-header'\"\n (onDismiss)=\"cancel()\"\n [labels]=\"{ cancel: 'Cancel' }\"\n>\n <ng-container c8y-modal-title>\n <span c8yIcon=\"import\"></span>\n </ng-container>\n <div class=\"p-t-16 p-b-16 p-l-24 p-r-24 separator-bottom\">\n <p\n class=\"text-medium text-center text-16\"\n translate\n >\n Easily copy any branding variant from any tenant\n </p>\n <p translate class=\"p-t-8\">\n Export the branding variant from the source tenant and import the .zip file here. This process\n allows you to maintain consistent branding across multiple tenants efficiently.\n </p>\n </div>\n <div\n class=\"p-24 m-r-auto m-l-auto\"\n style=\"max-width: 300px\"\n >\n <c8y-drop-area\n [icon]=\"'upload'\"\n (dropped)=\"droppedFile($event)\"\n [files]=\"files\"\n [accept]=\"'.zip'\"\n [maxAllowedFiles]=\"1\"\n [loading]=\"loading\"\n ></c8y-drop-area>\n </div>\n</c8y-modal>\n","import { Injectable } from '@angular/core';\nimport { BrandingImportModalComponent } from './branding-import-modal.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BrandingImportModalService {\n constructor(private modal: BsModalService) {}\n\n async openBrandingImportModal() {\n let versionDetails: Awaited<BrandingImportModalComponent['result']>;\n try {\n const modalRef = this.modal.show(BrandingImportModalComponent, {\n class: 'modal-sm',\n ignoreBackdropClick: true,\n keyboard: false\n });\n versionDetails = await modalRef.content.result;\n } catch (e) {\n // modal closed\n return;\n }\n\n return versionDetails;\n }\n}\n","import { Component } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { CellRendererContext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-branding-name-cell-renderer',\n templateUrl: './branding-name-cell-renderer.component.html',\n standalone: true,\n imports: [RouterLink]\n})\nexport class BrandingNameCellRendererComponent {\n name: string;\n routerLink: string;\n constructor(\n context: CellRendererContext,\n private router: Router\n ) {\n this.name = context.value;\n this.routerLink = `${this.router.url}/${context.item.name}`;\n }\n}\n","<a [routerLink]=\"routerLink\">{{ name }}</a>\n","import { Component } from '@angular/core';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\n\n@Component({\n selector: 'c8y-branding-tags-header-cell-renderer',\n templateUrl: './branding-tags-header-cell-renderer.component.html',\n standalone: true,\n imports: [PopoverModule, C8yTranslatePipe]\n})\nexport class BrandingTagsHeaderCellRendererComponent {\n readonly heading = gettext('Applied to');\n readonly popoverContent = gettext(`<p class=\"m-b-8\">Branding can be applied at two levels</p>\n <ul class=\"list-unstyled m-b-0\">\n <li class=\"m-b-4\">\n <strong>Global: </strong>\n <span>Applied to the entire platform, affecting all apps and interfaces.</span>\n </li>\n <li>\n <strong>App-specific: </strong>\n <span>Applied only to selected apps within the platform.</span>\n </li>\n </ul>`);\n}\n","<div class=\"d-flex\">\n <span\n class=\"text-truncate\"\n [title]=\"heading | translate\"\n >\n {{ heading | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm a-s-center\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"applyBrandingPopover\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #applyBrandingPopover>\n <div [innerHTML]=\"popoverContent | translate\"></div>\n </ng-template>\n</div>\n","import { Component } from '@angular/core';\nimport {\n BrandVersion,\n StoreBrandingService,\n BrandingVersionService,\n BrandingTrackingService\n} from '@c8y/ngx-components/branding/shared/data';\nimport { BehaviorSubject, Observable, firstValueFrom } from 'rxjs';\nimport { map, shareReplay, switchMap } from 'rxjs/operators';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n ActionControl,\n AlertService,\n AppStateService,\n BuiltInActionType,\n Column,\n DisplayOptions,\n ModalService,\n Pagination,\n Status,\n ZipService,\n DataGridComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n TitleComponent,\n HelpComponent,\n ActionBarItemComponent,\n IconDirective,\n C8yTranslateDirective,\n C8yTranslatePipe,\n EmptyStateComponent,\n LoadingComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ApplicationService, IApplication } from '@c8y/client';\nimport { saveAs } from 'file-saver';\nimport { StaticAssetsService } from '@c8y/ngx-components/static-assets/data';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ApplyBrandingToAppModalComponent } from '../apply-branding-to-app-modal/apply-branding-to-app-modal.component';\nimport { AddBrandingModalService } from '@c8y/ngx-components/branding/shared/lazy/add-branding-modal';\nimport { BrandingTagsCellRendererComponent } from '../branding-tags-cell-renderer/branding-tags-cell-renderer.component';\nimport { BrandingImportModalService } from '../branding-import-modal/branding-import-modal.service';\nimport { BrandingNameCellRendererComponent } from '../branding-name-cell-renderer/branding-name-cell-renderer.component';\nimport { BrandingTagsHeaderCellRendererComponent } from '../branding-tags-header-cell-renderer/branding-tags-header-cell-renderer.component';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n selector: 'c8y-branding',\n templateUrl: './branding.component.html',\n standalone: true,\n imports: [\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n TitleComponent,\n HelpComponent,\n ActionBarItemComponent,\n IconDirective,\n C8yTranslateDirective,\n C8yTranslatePipe,\n EmptyStateComponent,\n LoadingComponent,\n DataGridComponent,\n AsyncPipe\n ]\n})\nexport class BrandingComponent {\n pagination: Pagination = {\n pageSize: 10,\n currentPage: 1\n };\n displayOptions: DisplayOptions = {\n bordered: false,\n striped: true,\n filter: true,\n gridHeader: true,\n hover: true\n };\n actionControls: ActionControl[] = [\n {\n type: BuiltInActionType.Edit,\n callback: (entry: BrandVersion, _reload) => {\n this.editBranding(entry.name);\n }\n },\n {\n type: BuiltInActionType.Export,\n callback: async (entry: BrandVersion, _reload) => {\n await this.exportBranding(entry);\n }\n },\n {\n type: 'preview',\n icon: 'external-link',\n text: gettext('Open preview'),\n callback: async (entry: BrandVersion, _reload) => {\n this.brandings.openPreviewForBranding(entry.name);\n }\n },\n {\n type: 'duplicate',\n icon: 'copy',\n text: gettext('Duplicate'),\n callback: async (entry: BrandVersion, _reload) => {\n await this.duplicateVersion(entry);\n this.refresh();\n }\n },\n {\n type: 'apply-to-app',\n icon: 'form',\n text: gettext('Apply to specific apps'),\n callback: async (entry: BrandVersion, _reload) => {\n await this.applyToApps(entry);\n this.refresh();\n }\n },\n {\n type: 'set-as-default',\n icon: 'globe1',\n text: gettext('Set as global'),\n showIf: (entry: BrandVersion) => {\n if (entry.tags?.includes('latest')) {\n return false;\n }\n return true;\n },\n callback: async (entry: BrandVersion, _reload) => {\n try {\n await this.confirmModal.confirm(\n gettext('Set as global branding'),\n gettext(\n 'Are you sure that you want to set this variant as the global branding? By doing so, this variant will be applied to all apps that do not have a specific branding applied. Do you want to proceed?'\n ),\n Status.INFO\n );\n } catch {\n // did not confirm\n return;\n }\n await this.brandings.markAsActive(entry);\n this.refresh();\n }\n },\n {\n type: BuiltInActionType.Delete,\n showIf: (entry: BrandVersion) => {\n if (entry.tags?.includes('latest')) {\n return false;\n }\n return true;\n },\n callback: async (entry: BrandVersion, _reload) => {\n try {\n await this.confirmModal.confirm(\n gettext('Delete branding variant'),\n gettext(\n 'You are about to delete this branding variant. This action cannot be undone. Do you want to proceed?'\n ),\n Status.DANGER\n );\n } catch {\n // did not confirm\n return;\n }\n\n this.brandingTracking.deleteBrandingVariant();\n await this.applicationService.deleteVersionPackage(entry.publicOptionsApp, {\n version: entry.version\n });\n this.refresh();\n }\n }\n ];\n columns: Column[] = [\n {\n name: 'name',\n header: gettext('Name'),\n path: 'name',\n filterable: true,\n cellRendererComponent: BrandingNameCellRendererComponent\n },\n {\n name: gettext('Applied to`Applications a branding applies to (table column header)`'),\n path: 'tags',\n filterable: false,\n cellCSSClassName: 'small',\n cellRendererComponent: BrandingTagsCellRendererComponent,\n headerCellRendererComponent: BrandingTagsHeaderCellRendererComponent\n },\n {\n name: 'owner',\n header: gettext('Owner'),\n path: 'owner',\n filterable: false\n },\n {\n name: 'lastUpdated',\n header: gettext('Last updated'),\n path: 'lastUpdated',\n filterable: false\n }\n ];\n currentAppContextPath = 'administration';\n availableBrandingVariants$: Observable<{\n publicOptions: IApplication;\n variants: BrandVersion[];\n }>;\n\n private reloadTrigger = new BehaviorSubject<void>(undefined);\n constructor(\n private brandings: StoreBrandingService,\n private activatedRoute: ActivatedRoute,\n private appState: AppStateService,\n private applicationService: ApplicationService,\n private zip: ZipService,\n private staticAssets: StaticAssetsService,\n private router: Router,\n private modal: BsModalService,\n private confirmModal: ModalService,\n private brandingVersionService: BrandingVersionService,\n private addBrandingModalService: AddBrandingModalService,\n private alert: AlertService,\n private brandingImportModalService: BrandingImportModalService,\n private brandingTracking: BrandingTrackingService\n ) {\n this.currentAppContextPath = this.appState.state.app?.contextPath || this.currentAppContextPath;\n this.availableBrandingVariants$ = this.reloadTrigger.pipe(\n switchMap(() => this.brandings.loadBrandingVariants()),\n // hide the fallback from users\n map(variants => {\n variants.variants = variants.variants.filter(v => !v.tags?.includes('fallback'));\n return variants;\n }),\n shareReplay({ refCount: true, bufferSize: 1 })\n );\n }\n\n async deleteAllBrandings(publicOptions?: IApplication) {\n const result = await this.confirmModal.confirm(\n gettext('Delete all branding variants'),\n gettext(\n `<p class=\"m-b-8\">\n This action will permanently remove all custom branding variants. Your tenant will revert\n to the default branding.\n </p>\n <p class=\"m-b-8\">\n Consider exporting your custom branding variants before proceeding, as this action cannot\n be undone.\n </p>\n <p>\n Are you sure you want to continue?\n </p>`\n ),\n Status.DANGER,\n { cancel: gettext('Cancel'), ok: gettext('Delete all') }\n );\n if (result === false || (typeof result === 'object' && !result.confirmed)) {\n return;\n }\n\n this.brandingTracking.deleteAllBrandings();\n\n await this.brandings.deleteAllBrandings(publicOptions);\n this.refresh();\n }\n\n async exportBranding(variant: BrandVersion) {\n this.brandingTracking.exportBranding();\n const branding = await firstValueFrom(this.brandings.getZipForBinary(variant.id));\n const staticAssetsApp = await this.staticAssets.getAppForTenant('branding');\n const staticAssetsZip = await firstValueFrom(\n this.brandings.getZipForBinary(\n staticAssetsApp.activeVersionId,\n this.staticAssets.fileNames.exportZipName\n )\n );\n const blob = await this.zip.createZip([\n { fileName: this.brandings.fileNames.exportZipName, blob: branding },\n { fileName: this.staticAssets.fileNames.exportZipName, blob: staticAssetsZip }\n ]);\n saveAs(blob, `branding-export-${variant.name}-${variant.revision}-${new Date().getTime()}.zip`);\n }\n\n refresh() {\n this.reloadTrigger.next();\n }\n\n async addNewVersion() {\n const versionDetails = await this.addBrandingModalService.openAddBrandingModal();\n if (!versionDetails) {\n this.refresh();\n return;\n }\n let fallBackBranding = {};\n try {\n fallBackBranding = await this.brandings.getBrandingOptionsForVersion('latest');\n } catch (e) {\n console.warn(`Failed to load latest branding`);\n }\n\n this.brandingTracking.addNewVersion();\n\n try {\n await this.brandings.addBranding(\n this.brandingVersionService.createInitialBrandingVersion(versionDetails.brandingName),\n fallBackBranding,\n [versionDetails.brandingName]\n );\n await this.brandings.waitForBrandingToBePresent(versionDetails.brandingName);\n this.editBranding(versionDetails.brandingName);\n } catch (e) {\n this.alert.addServerFailure(e, 'danger');\n }\n }\n\n async duplicateVersion(version: BrandVersion) {\n const options = await this.brandings.getBrandingOptionsForVersion(version.version);\n const versionDetails = await this.addBrandingModalService.openDuplicateBrandingModal();\n if (!versionDetails) {\n return;\n }\n\n this.brandingTracking.duplicateVersion();\n\n try {\n await this.brandings.addBranding(\n this.brandingVersionService.createInitialBrandingVersion(versionDetails.brandingName),\n options,\n [versionDetails.brandingName]\n );\n await this.brandings.waitForBrandingToBePresent(versionDetails.brandingName);\n this.editBranding(versionDetails.brandingName);\n } catch (e) {\n this.alert.addServerFailure(e, 'danger');\n }\n }\n\n async editBranding(brandingName: string) {\n return this.router.navigate([brandingName, 'edit'], { relativeTo: this.activatedRoute });\n }\n\n async getStartedUsingBranding() {\n const result = await this.confirmModal.confirm(\n gettext(`Get started using branding variants`),\n gettext(\n `<p class=\"m-b-8\">Confirming this action creates two branding variants:</p>\n <ul class=\"m-b-8 p-l-16\">\n <li>A default copy of your current global branding</li>\n <li>Your new customizable variant.</li>\n </ul>\n <p class=\"m-b-8\">\n After customization, you can set your new variant as global or apply it to specific apps.\n </p>\n <p>\n To revert changes, simply set the default branding as global or use the \"Delete all variants\" button at any time.\n </p>`\n )\n );\n if (result === false || (typeof result === 'object' && !result.confirmed)) {\n return;\n }\n\n this.brandingTracking.getStartedUsingBranding();\n\n await this.brandings.getStartedUsingBranding();\n await this.addNewVersion();\n }\n\n async applyToApps(version: BrandVersion) {\n const prefix = 'app-';\n const currentTags = version.tags\n .filter(tag => tag.startsWith(prefix))\n .map(tag => tag.replace(prefix, ''));\n const otherTags = version.tags.filter(tag => !tag.startsWith(prefix));\n let selectedTags: Awaited<ApplyBrandingToAppModalComponent['result']>;\n try {\n const modalRef = this.modal.show(ApplyBrandingToAppModalComponent, {\n initialState: { currentTags },\n ignoreBackdropClick: true,\n keyboard: false\n });\n selectedTags = await modalRef.content.result;\n } catch (e) {\n // modal closed\n return;\n }\n\n const selectedApps = Object.keys(selectedTags).filter(key => selectedTags[key]);\n\n this.brandingTracking.applyToApps(selectedApps);\n\n const tagsToSet = [...otherTags, ...selectedApps.map(tag => `${prefix}${tag}`)];\n\n await this.removeTagsFromOtherVersions(version.publicOptionsApp, tagsToSet, version.version);\n await this.applicationService.setPackageVersionTag(\n version.publicOptionsApp,\n version.version,\n tagsToSet\n );\n }\n\n async importBranding() {\n try {\n await this.brandingImportModalService.openBrandingImportModal();\n\n this.brandings.refreshTriggerBrandingVariants.next();\n this.reloadTrigger.next();\n } catch (e) {\n // modal closed\n }\n }\n\n private async removeTagsFromOtherVersions(\n publicOptionsApp: IApplication,\n tagsToRemove: string[],\n versionToIgnore?: string\n ) {\n for (const version of publicOptionsApp.applicationVersions) {\n if (version.version === versionToIgnore) {\n continue;\n }\n const removedTags = version.tags.filter(tag => !tagsToRemove.includes(tag));\n if (removedTags.length === version.tags.length) {\n continue;\n }\n await this.applicationService.setPackageVersionTag(\n publicOptionsApp,\n version.version,\n removedTags\n );\n }\n }\n}\n","<c8y-title>{{ 'Branding' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Settings' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'palette'\"\n [label]=\"'Branding' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'palette'\"\n [label]=\"'Variants' | translate\"\n [path]=\"'/branding-editor/variants'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n@let brandingVariant = availableBrandingVariants$ | async;\n@if (!brandingVariant) {\n <c8y-loading></c8y-loading>\n} @else {\n @if (brandingVariant.publicOptions) {\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"30\"\n >\n <button\n class=\"btn btn-link\"\n (click)=\"addNewVersion()\"\n data-cy=\"branding-add-branding-variant\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n <span translate>Add variant</span>\n </button>\n </c8y-action-bar-item>\n }\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"20\"\n >\n <button\n class=\"btn btn-link\"\n data-cy=\"branding-import-branding\"\n (click)=\"importBranding()\"\n >\n <i [c8yIcon]=\"'data-import'\"></i>\n <span translate>Import variant</span>\n </button>\n </c8y-action-bar-item>\n\n @if (brandingVariant.publicOptions) {\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"10\"\n >\n <button\n class=\"btn btn-link\"\n (click)=\"deleteAllBrandings(brandingVariant.publicOptions)\"\n data-cy=\"branding-remove-all-brandings\"\n >\n <i [c8yIcon]=\"'trash-o'\"></i>\n <span translate>Delete all variants</span>\n </button>\n </c8y-action-bar-item>\n }\n\n <c8y-help\n [src]=\"'/docs/enterprise-tenant/customization/#to-configure-branding-settings'\"\n ></c8y-help>\n\n <div class=\"content-fullpage d-flex d-col border-top\">\n <c8y-data-grid\n [title]=\"'Branding variants' | translate\"\n [columns]=\"columns\"\n [actionControls]=\"actionControls\"\n [pagination]=\"pagination\"\n [displayOptions]=\"displayOptions\"\n (onReload)=\"refresh()\"\n [rows]=\"brandingVariant.variants\"\n >\n @if (!brandingVariant.publicOptions) {\n <c8y-ui-empty-state\n [icon]=\"'palette'\"\n [title]=\"'No branding variants' | translate\"\n [subtitle]=\"\n 'Personalize your experience with a theme-able interface. Create a unique look that aligns with your brand identity.'\n | translate\n \"\n [horizontal]=\"false\"\n >\n <button\n class=\"btn btn-default\"\n data-cy=\"branding-get-started-using-branding\"\n (click)=\"getStartedUsingBranding()\"\n translate\n >\n Add branding variant\n </button>\n </c8y-ui-empty-state>\n }\n </c8y-data-grid>\n </div>\n}\n","import { Component } from '@angular/core';\nimport { ControlValueAccessor, FormBuilder, FormsModule } from '@angular/forms';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { CoreModule, MessageBannerService } from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { StaticAssetsFilePickerComponent } from '@c8y/ngx-components/static-assets';\nimport {\n brandingFormGroupTopLevelEntries,\n brandingFormGroupTopLevelEntriesToUnpack,\n BrandingOptionsJson,\n createGenericBrandingForm,\n TopLevelValues\n} from '@c8y/ngx-components/branding/shared/data';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\n\n@Component({\n selector: 'c8y-branding-form',\n templateUrl: './branding-form.component.html',\n standalone: true,\n host: { class: 'd-contents' },\n imports: [\n CoreModule,\n FormsModule,\n CollapseModule,\n StaticAssetsFilePickerComponent,\n EditorComponent\n ]\n})\nexport class BrandingFormComponent implements ControlValueAccessor {\n formGroup: ReturnType<BrandingFormComponent['initForm']>;\n messageBannerHelp = gettext(\n 'Supports markdown. Use {{ headerMark }} for headers, {{ listMark }} for lists, {{ boldMark }} for bold, {{ italicMark }} for italic, and {{ linkMark }} for links.'\n );\n messageBannerHelpParams = {\n headerMark: '`#`',\n listMark: '`*`',\n boldMark: '`**`',\n italicMark: '`_`',\n linkMark: '`[]()`'\n };\n private onTouched: () => void;\n\n private externalValue: BrandingOptionsJson = {};\n private formGroupValueChanges$: BrandingFormComponent['formGroup']['valueChanges'];\n\n constructor(\n private formBuilder: FormBuilder,\n private messageBannerService: MessageBannerService\n ) {\n this.formGroup = this.initForm();\n this.formGroupValueChanges$ = this.formGroup.valueChanges.pipe(takeUntilDestroyed());\n }\n\n writeValue(obj: string): void {\n try {\n const parsedObj = JSON.parse(obj);\n this.externalValue = parsedObj;\n this.applyStateToForm(parsedObj);\n } catch (e) {\n // failed to parse\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.formGroupValueChanges$.subscribe(value => fn(this.convertFormToState(value)));\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n cockieBannerChange(toggleState: boolean) {\n this.formGroup.controls.cookieBanner.patchValue({ cookieBannerDisabled: !toggleState });\n }\n\n onBlur(): void {\n this.onTouched();\n }\n\n initForm() {\n return createGenericBrandingForm(this.formBuilder);\n }\n\n applyStateToForm(branding: BrandingOptionsJson) {\n if (!branding) {\n return;\n }\n let toBePatched = brandingFormGroupTopLevelEntries.reduceRight((prev, curr) => {\n if (brandingFormGroupTopLevelEntriesToUnpack.includes(curr as any)) {\n return Object.assign(prev, { [curr]: branding });\n }\n return Object.assign(prev, { [curr]: branding[curr] });\n }, {});\n\n toBePatched = Object.keys(this.formGroup.controls)\n .filter(key => !brandingFormGroupTopLevelEntries.includes(key as any))\n .reduceRight((prev, curr) => {\n return Object.assign(prev, { [curr]: branding.brandingCssVars || {} });\n }, toBePatched);\n this.formGroup.patchValue(toBePatched);\n }\n\n convertFormToState(value: BrandingFormComponent['formGroup']['value']): string {\n const topLevel: TopLevelValues = brandingFormGroupTopLevelEntries.reduceRight((prev, curr) => {\n if (brandingFormGroupTopLevelEntriesToUnpack.includes(curr as any)) {\n return Object.assign(prev, value[curr]);\n }\n return Object.assign(prev, { [curr]: value[curr] });\n }, {});\n const newBrandingCssVars = Object.entries(value).reduceRight((prev, [key, value]) => {\n if (brandingFormGroupTopLevelEntries.includes(key as any)) {\n return prev;\n }\n return Object.assign(prev, value);\n }, {});\n const externalValue: BrandingOptionsJson = cloneDeep(this.externalValue || {});\n Object.assign(externalValue, topLevel);\n const currentCSSVars = externalValue['brandingCssVars'] || {};\n const assignedNewValues = Object.assign(currentCSSVars, newBrandingCssVars);\n externalValue['brandingCssVars'] = assignedNewValues;\n return JSON.stringify(externalValue, null, 2);\n }\n\n previewBanner(): void {\n this.messageBannerService.showBanner();\n }\n}\n","<c8y-help [src]=\"'/docs/enterprise-tenant/customization/#generic-tab'\"></c8y-help>\n\n<div\n class=\"inner-scroll\"\n [formGroup]=\"formGroup\"\n>\n <!-- Title & Favicon-->\n <div class=\"card-block\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4 class=\"text-normal text-right text-left-xs m-b-16\">\n {{ 'Title & favicon' | translate }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div\n class=\"row p-t-16 p-b-16\"\n [formGroupName]=\"'genericApplicationOptions'\"\n >\n <div class=\"col-md-6\">\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"globalTitle\"\n translate\n >\n Title\n </label>\n <input\n class=\"form-control\"\n id=\"globalTitle\"\n name=\"globalTitle\"\n type=\"text\"\n formControlName=\"globalTitle\"\n />\n <c8y-messages\n [helpMessage]=\"'Title to display in the browser tab' | translate\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label translate>Favicon</label>\n <c8y-static-assets-file-picker\n name=\"faviconUrl\"\n [supportedFileExtensions]=\"['ico']\"\n [isCSSURL]=\"false\"\n formControlName=\"faviconUrl\"\n ></c8y-static-assets-file-picker>\n <c8y-messages [helpMessage]=\"'Supported files: *.ico' | translate\"></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"card-block separator-top\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Dark theme\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <c8y-form-group class=\"m-b-32 p-t-8 m-t-4\">\n <label class=\"c8y-switch\">\n <input\n class=\"form-control\"\n name=\"darkThemeAvailable\"\n type=\"checkbox\"\n formControlName=\"darkThemeAvailable\"\n />\n <span></span>\n <span translate>Enable dark theme support</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <!-- Typography -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Typography\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <fieldset\n class=\"c8y-fieldset p-24\"\n [formGroupName]=\"'baseTypography'\"\n >\n <legend translate>Base typography</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"font-url\"\n translate\n >\n Fonts URL\n </label>\n <input\n class=\"form-control\"\n id=\"font-url\"\n placeholder=\"{{\n 'e.g. {{ example }}' | translate : { example: 'https://fonts.googleapis.com/css?family=Roboto:400,500,700' }\n }}\"\n type=\"text\"\n formControlName=\"font-url\"\n />\n <c8y-messages [helpMessage]=\"'The Google fonts URL' | translate\"></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"font-family-base\"\n for=\"font-family-base\"\n translate\n >\n Base font stack\n </label>\n <input\n class=\"form-control\"\n id=\"font-family-base\"\n placeholder=\"{{ 'e.g. {{ example }}' | translate : {example: '&quot;Roboto&quot;, Arial, sans-serif'} }}\"\n name=\"font-family-base\"\n type=\"text\"\n formControlName=\"font-family-base\"\n />\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6\">\n <fieldset\n class=\"c8y-fieldset p-24\"\n [formGroupName]=\"'headingsAndNavigatorTypography'\"\n >\n <legend>{{ 'Headings & navigator' | translate }}</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"font-family-headings\"\n for=\"font-family-headings\"\n translate\n >\n Headings font stack\n </label>\n <input\n class=\"form-control\"\n id=\"font-family-headings\"\n placeholder=\"{{ 'e.g. {{ example }}' | translate : {example: '&quot;Roboto&quot;, Arial, sans-serif'} }}\"\n type=\"text\"\n formControlName=\"font-family-headings\"\n />\n <c8y-messages\n [helpMessage]=\"\n 'Leave empty to use the same font as the base font stack' | translate\n \"\n ></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"navigator-font-family\"\n translate\n >\n Navigator font stack\n </label>\n <div class=\"form-control-static\">\n <label class=\"c8y-radio radio-inline\">\n <input\n name=\"navigator-font-family\"\n type=\"radio\"\n formControlName=\"navigator-font-family\"\n [value]=\"'var(--font-family-base)'\"\n />\n <span></span>\n <span translate>Match base font stack</span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"Radio Two\"\n >\n <input\n name=\"navigator-font-family\"\n type=\"radio\"\n formControlName=\"navigator-font-family\"\n [value]=\"'var(--font-family-headings)'\"\n />\n <span></span>\n <span translate>Match headings font stack</span>\n </label>\n </div>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Cookie banner -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Cookie banner\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <fieldset\n class=\"c8y-fieldset p-24\"\n [formGroupName]=\"'cookieBanner'\"\n >\n <legend translate>Cookie banner</legend>\n <label class=\"c8y-switch\">\n <input\n class=\"form-control\"\n name=\"cookieBannerEnabled\"\n type=\"checkbox\"\n [ngModelOptions]=\"{ standalone: true }\"\n [ngModel]=\"!formGroup.value.cookieBanner.cookieBannerDisabled\"\n (ngModelChange)=\"cockieBannerChange($event)\"\n />\n <span></span>\n <span translate>Enable cookie banner</span>\n </label>\n\n <div\n class=\"collapse\"\n [collapse]=\"formGroup.value.cookieBanner.cookieBannerDisabled\"\n [isAnimated]=\"true\"\n >\n <div\n class=\"row\"\n style=\"min-height: 227px\"\n >\n <ng-container *ngIf=\"formGroup.value.cookieBanner.cookieBannerDisabled !== true\">\n <div class=\"col-md-6\">\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"cookieBannerTitle\"\n translate\n >\n Title\n </label>\n <input\n class=\"form-control\"\n id=\"cookieBannerTitle\"\n name=\"cookieBannerTitle\"\n type=\"text\"\n formControlName=\"cookieBannerTitle\"\n />\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"policyUrl\"\n translate\n >\n Link to privacy policy\n </label>\n <input\n class=\"form-control\"\n id=\"policyUrl\"\n name=\"policyUrl\"\n type=\"text\"\n formControlName=\"policyUrl\"\n />\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"policyVersion\"\n translate\n >\n Version of privacy policy\n </label>\n <input\n class=\"form-control\"\n id=\"policyVersion\"\n name=\"policyVersion\"\n type=\"text\"\n formControlName=\"policyVersion\"\n />\n <c8y-messages\n [helpMessage]=\"\n 'Changing the version of the privacy policy invalidates already existing cookie consents.'\n | translate\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group class=\"m-b-32\">\n <label\n for=\"cookieBannerText\"\n translate\n >\n Text\n </label>\n <textarea\n class=\"form-control\"\n id=\"cookieBannerText\"\n name=\"cookieBannerText\"\n rows=\"8\"\n formControlName=\"cookieBannerText\"\n ></textarea>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </div>\n </ng-container>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <!-- Message banner -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Message banner\n </h4>\n </div>\n\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <fieldset\n class=\"c8y-fieldset p-24\"\n [formGroupName]=\"'messageBanner'\"\n >\n <legend translate>Message banner</legend>\n\n <label class=\"c8y-switch\">\n <input\n class=\"form-control\"\n name=\"messageBannerEnabled\"\n type=\"checkbox\"\n formControlName=\"messageBannerEnabled\"\n />\n <span></span>\n <span translate>Enable message banner</span>\n </label>\n <div\n class=\"collapse\"\n [collapse]=\"!formGroup.value.messageBanner.messageBannerEnabled\"\n [isAnimated]=\"true\"\n >\n <div class=\"d-flex a-i-center gap-8 p-t-16 p-b-16\">\n <fieldset class=\"c8y-fieldset p-16\">\n <legend>{{ 'Message type' | translate }}</legend>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Info' | translate }}\"\n >\n <input\n type=\"radio\"\n value=\"info\"\n formControlName=\"messageBannerType\"\n />\n <span></span>\n <span class=\"d-flex a-i-center\">\n <i\n class=\"text-info icon-16 m-r-4\"\n c8yIcon=\"info-circle\"\n ></i>\n Info\n </span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Warning' | translate }}\"\n >\n <input\n type=\"radio\"\n value=\"warning\"\n formControlName=\"messageBannerType\"\n />\n <span></span>\n <span class=\"d-flex a-i-center\">\n <i\n class=\"text-warning icon-16 m-r-4\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Warning' | translate }}\n </span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Danger' | translate }}\"\n >\n <input\n type=\"radio\"\n value=\"danger\"\n formControlName=\"messageBannerType\"\n />\n <span></span>\n <span class=\"d-flex a-i-center\">\n <i\n class=\"text-danger icon-16 m-r-4\"\n c8yIcon=\"exclamation-circle\"\n ></i>\n {{ 'Danger' | translate }}\n </span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'Success' | translate }}\"\n >\n <input\n type=\"radio\"\n value=\"success\"\n formControlName=\"messageBannerType\"\n />\n <span></span>\n <span class=\"d-flex a-i-center\">\n <i\n class=\"text-success icon-16 m-r-4\"\n c8yIcon=\"check-circle\"\n ></i>\n {{ 'Success' | translate }}\n </span>\n </label>\n <label\n class=\"c8y-radio radio-inline\"\n title=\"{{ 'System' | translate }}\"\n >\n <input\n type=\"radio\"\n value=\"system\"\n formControlName=\"messageBannerType\"\n />\n <span></span>\n <span>\n <i\n class=\"text-primary icon-16 m-r4\"\n c8yIcon=\"wrench\"\n ></i>\n {{ 'System' | translate }}\n </span>\n </label>\n </fieldset>\n </div>\n\n <c8y-form-group\n class=\"m-b-32 p-b-32\"\n [style]=\"{ height: '300px' }\"\n *ngIf=\"formGroup.value.messageBanner.messageBannerEnabled\"\n >\n <label\n for=\"messageBannerContent\"\n translate\n >\n Message content\n </label>\n <c8y-editor\n class=\"flex-grow form-control\"\n style=\"height: 100%\"\n formControlName=\"messageBannerContent\"\n [editorOptions]=\"{language: 'markdown'}\"\n monacoEditorMarkerValidator\n ></c8y-editor>\n <c8y-messages\n [helpMessage]=\"messageBannerHelp | translate: messageBannerHelpParams\"\n ></c8y-messages>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"previewBanner()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"eye\"\n ></i>\n <span translate>Preview banner</span>\n </button>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n</div>\n","import { gettext } from '@c8y/ngx-components/gettext';\nimport { colorBrandingVars } from '@c8y/ngx-components/branding/shared/data';\n\ntype ColorVariableName = (typeof colorBrandingVars)[number];\n\ntype Color = { label: string; formControlName: ColorVariableName };\n\nexport const formStructure = {\n brandColors: {\n label: gettext('Brand colors'),\n brandColors: {\n label: gettext('Brand colors'),\n colors: [\n {\n label: gettext('Brand primary'),\n formControlName: 'brand-primary'\n },\n {\n label: gettext('Brand light'),\n formControlName: 'brand-light'\n },\n {\n label: gettext('Brand dark'),\n formControlName: 'brand-dark'\n }\n ] as const satisfies Color[]\n },\n shades: {\n label: gettext('Shades'),\n colorColumn: [\n [\n {\n label: 'c8y-brand-10',\n formControlName: 'c8y-brand-10'\n },\n {\n label: 'c8y-brand-20',\n formControlName: 'c8y-brand-20'\n },\n {\n label: 'c8y-brand-30',\n formControlName: 'c8y-brand-30'\n },\n {\n label: 'c8y-brand-40',\n formControlName: 'c8y-brand-40'\n }\n ],\n [\n {\n label: 'c8y-brand-50',\n formControlName: 'c8y-brand-50'\n },\n {\n label: 'c8y-brand-60',\n formControlName: 'c8y-brand-60'\n },\n {\n label: 'c8y-brand-70',\n formControlName: 'c8y-brand-70'\n },\n {\n label: 'c8y-brand-80',\n formControlName: 'c8y-brand-80'\n }\n ]\n ] as const satisfies Color[][]\n }\n },\n statusColors: {\n label: gettext('Status colors'),\n subCategories: [\n {\n label: gettext('Info colors'),\n colors: [\n {\n label: gettext('Info'),\n formControlName: 'palette-status-info'\n },\n {\n label: gettext('Info light'),\n formControlName: 'palette-status-info-light'\n },\n {\n label: gettext('Info dark'),\n formControlName: 'palette-status-info-dark'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Warning colors'),\n colors: [\n {\n label: gettext('Warning'),\n formControlName: 'palette-status-warning'\n },\n {\n label: gettext('Warning light'),\n formControlName: 'palette-status-warning-light'\n },\n {\n label: gettext('Warning dark'),\n formControlName: 'palette-status-warning-dark'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Danger colors'),\n colors: [\n {\n label: gettext('Danger'),\n formControlName: 'palette-status-danger'\n },\n {\n label: gettext('Danger light'),\n formControlName: 'palette-status-danger-light'\n },\n {\n label: gettext('Danger dark'),\n formControlName: 'palette-status-danger-dark'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Success colors'),\n colors: [\n {\n label: gettext('Success'),\n formControlName: 'palette-status-success'\n },\n {\n label: gettext('Success light'),\n formControlName: 'palette-status-success-light'\n },\n {\n label: gettext('Success dark'),\n formControlName: 'palette-status-success-dark'\n }\n ] as const satisfies Color[]\n }\n ]\n },\n actionBar: {\n label: gettext('Action bar'),\n colorColumns: [\n {\n label: gettext('Action bar'),\n colorColumns: [\n [\n {\n label: gettext('Background color'),\n formControlName: 'action-bar-background-default'\n },\n {\n label: gettext('Text color'),\n formControlName: 'action-bar-color-default'\n },\n {\n label: gettext('Icon color'),\n formControlName: 'action-bar-icon-color'\n }\n ],\n [\n {\n label: gettext('Button color'),\n formControlName: 'action-bar-color-actions'\n },\n {\n label: gettext('Button hover color'),\n formControlName: 'action-bar-color-actions-hover'\n }\n ]\n ] as const satisfies Color[][]\n }\n ]\n },\n mainHeader: {\n label: gettext('Main header'),\n colorColumns: [\n {\n label: gettext('Main header'),\n colorColumns: [\n [\n {\n label: gettext('Background color'),\n formControlName: 'header-color'\n },\n {\n label: gettext('Text color'),\n formControlName: 'header-text-color'\n }\n ],\n [\n {\n label: gettext('Button hover color'),\n formControlName: 'header-hover-color'\n }\n ]\n ] as const satisfies Color[][]\n }\n ]\n },\n navigator: {\n label: gettext('Navigator'),\n colorColumns: [\n {\n label: gettext('Navigation'),\n colors: [\n {\n label: gettext('Background color'),\n formControlName: 'navigator-bg-color'\n },\n {\n label: gettext('Text color'),\n formControlName: 'navigator-text-color'\n },\n {\n label: gettext('Separator color'),\n formControlName: 'navigator-separator-color'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Header'),\n colors: [\n {\n label: gettext('Header background color'),\n formControlName: 'navigator-header-bg'\n },\n {\n label: gettext('Title color'),\n formControlName: 'navigator-title-color'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Active node'),\n colors: [\n {\n label: gettext('Active background color'),\n formControlName: 'navigator-active-bg'\n },\n {\n label: gettext('Active border color'),\n formControlName: 'navigator-border-active'\n },\n {\n label: gettext('Active text color'),\n formControlName: 'navigator-color-active'\n }\n ] as const satisfies Color[]\n }\n ]\n },\n rightDrawer: {\n label: gettext('Right drawer'),\n colorColumns: [\n {\n label: gettext('Panel'),\n colors: [\n {\n label: gettext('Background color'),\n formControlName: 'right-drawer-background-default'\n },\n {\n label: gettext('Text color'),\n formControlName: 'right-drawer-text-color-default'\n },\n {\n label: gettext('Text muted color'),\n formControlName: 'right-drawer-text-color-muted'\n },\n {\n label: gettext('Separator color'),\n formControlName: 'right-drawer-separator-color'\n }\n ] as const satisfies Color[]\n },\n {\n label: gettext('Interactive'),\n colors: [\n {\n label: gettext('Link color'),\n formControlName: 'right-drawer-link-color'\n },\n {\n label: gettext('Link hover color'),\n formControlName: 'right-drawer-link-color-hover'\n }\n ] as const satisfies Color[]\n }\n ]\n }\n} as const;\n","import { Component, OnDestroy } from '@angular/core';\nimport { ControlValueAccessor, FormBuilder, FormsModule } from '@angular/forms';\nimport {\n map,\n distinctUntilChanged,\n pairwise,\n delay,\n switchMap,\n filter,\n startWith,\n take\n} from 'rxjs/operators';\nimport {\n CoreModule,\n FilesService,\n GENERIC_FILE_TYPE,\n ThemeSwitcherService,\n ColorInputComponent\n} from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { StaticAssetsFilePickerComponent } from '@c8y/ngx-components/static-assets';\nimport {\n BrandingOptionsJson,\n BrandingShadesService,\n createBrandingForm\n} from '@c8y/ngx-components/branding/shared/data';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, defer, interval, merge, of } from 'rxjs';\nimport { ActivatedRoute } from '@angular/router';\nimport { formStructure } from './branding-theme-form-structure';\n\n@Component({\n selector: 'c8y-branding-theme-form',\n templateUrl: './branding-theme-form.component.html',\n standalone: true,\n host: { class: 'd-contents' },\n imports: [CoreModule, FormsModule, StaticAssetsFilePickerComponent, ColorInputComponent]\n})\nexport class BrandingThemeFormComponent implements ControlValueAccessor, OnDestroy {\n readonly formStructure = formStructure;\n formGroup: ReturnType<BrandingThemeFormComponent['initForm']>;\n imageFileExtensions: string[];\n resetShadesButtonEnabled$: Observable<boolean>;\n private onTouched: () => void;\n\n private externalValue: BrandingOptionsJson = {};\n private formGroupValueChanges$: BrandingThemeFormComponent['formGroup']['valueChanges'];\n private addDarkThemePrefix = false;\n private readonly varsToConvertToHeight = [\n 'navigator-platform-logo-height',\n 'dark-navigator-platform-logo-height'\n ] as const;\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private formBuilder: FormBuilder,\n private filesService: FilesService,\n private brandingShades: BrandingShadesService,\n private themeSwitcher: ThemeSwitcherService\n ) {\n this.addDarkThemePrefix = !!this.activatedRoute.snapshot.data.dark;\n this.themeSwitcher.temporaryChangeTheme(this.addDarkThemePrefix ? 'dark' : 'light');\n this.formGroup = this.initForm();\n this.formGroupValueChanges$ = this.formGroup.valueChanges.pipe(takeUntilDestroyed());\n this.imageFileExtensions = this.filesService\n .mapGenericFileTypesToExtensions([GENERIC_FILE_TYPE.IMAGE])\n .filter(ext => ext !== 'ico');\n\n const hasCustomShades$ = merge(\n this.formGroup.valueChanges,\n defer(() => of(this.formGroup.value))\n ).pipe(\n takeUntilDestroyed(),\n map(tmp => this.brandingShades.hasCustomShadesSet(tmp['brand-primary'], tmp)),\n distinctUntilChanged()\n );\n this.resetShadesButtonEnabled$ = merge(\n defer(() => of(this.formGroup.controls['brand-primary'].status)),\n this.formGroup.controls['brand-primary'].statusChanges\n ).pipe(\n // statusChanges emits 'PENDING' when the form control is async validating\n // https://github.com/angular/angular/issues/41519\n switchMap(status => {\n if (status === 'PENDING') {\n return interval(200).pipe(\n map(() => this.formGroup.controls['brand-primary'].status),\n filter(stat => stat !== 'PENDING'),\n take(1),\n startWith(status)\n );\n }\n return of(status);\n }),\n switchMap(status => {\n if (status !== 'VALID') {\n return of(false);\n }\n return hasCustomShades$;\n })\n );\n\n const brandPrimaryFormControl = this.formGroup.controls['brand-primary'];\n brandPrimaryFormControl.valueChanges\n .pipe(\n filter(color => this.brandingShades.isValidShadeColor(color)),\n takeUntilDestroyed(),\n distinctUntilChanged(),\n pairwise(),\n delay(5)\n )\n .subscribe(([prev, curr]) => {\n try {\n if (!this.brandingShades.hasCustomShadesSet(prev, this.formGroup.value)) {\n this.regenerateShadesBasedOnPrimaryColor(curr);\n }\n } catch (e) {\n console.log(e);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.themeSwitcher.resetTemporaryTheme();\n }\n\n regenerateShadesBasedOnPrimaryColor(color?: string) {\n const newShades = this.brandingShades.getShadeColorBrandingCssVars(\n color || this.formGroup.value['brand-primary']\n );\n this.formGroup.patchValue(newShades);\n }\n\n writeValue(obj: string): void {\n try {\n const parsedObj = JSON.parse(obj);\n this.externalValue = parsedObj;\n this.applyStateToForm(parsedObj);\n } catch (e) {\n // failed to parse\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.formGroupValueChanges$.subscribe(value => fn(this.convertFormToState(value)));\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n onBlur(): void {\n this.onTouched();\n }\n\n initForm() {\n return createBrandingForm(this.formBuilder);\n }\n\n applyStateToForm(branding: BrandingOptionsJson) {\n if (!branding) {\n return;\n }\n const toBePatched = {};\n\n const prefix = this.getPrefix();\n Object.entries(branding.brandingCssVars || {}).forEach(([key, value]) => {\n if (prefix && !key.startsWith(prefix)) {\n return;\n }\n const keyInForm = key.replace(prefix, '');\n if (this.varsToConvertToHeight.includes(keyInForm as any) && typeof value === 'string') {\n toBePatched[keyInForm] = Number.parseInt(value.replace(/[a-zA-Z%]/, '') || '0');\n return;\n }\n toBePatched[keyInForm] = value;\n });\n this.formGroup.patchValue(toBePatched);\n }\n\n convertFormToState(value: BrandingThemeFormComponent['formGroup']['value']): string {\n const prefixedBrandingCssVars = {};\n const prefix = this.getPrefix();\n Object.entries(value).forEach(([key, value]) => {\n prefixedBrandingCssVars[`${prefix}${key}`] = value;\n });\n const externalValue: BrandingOptionsJson = cloneDeep(this.externalValue || {});\n const currentCSSVars = externalValue['brandingCssVars'] || {};\n const assignedNewValues = Object.assign(currentCSSVars, prefixedBrandingCssVars);\n for (const key of this.varsToConvertToHeight) {\n const value = assignedNewValues[key];\n if (typeof value === 'number') {\n assignedNewValues[key] += 'px';\n }\n }\n externalValue['brandingCssVars'] = assignedNewValues;\n return JSON.stringify(externalValue, null, 2);\n }\n\n private getPrefix() {\n return this.addDarkThemePrefix ? 'dark-' : '';\n }\n}\n","<c8y-help [src]=\"'/docs/enterprise-tenant/customization/#light-dark-theme-tab'\"></c8y-help>\n\n<div\n class=\"inner-scroll\"\n [formGroup]=\"formGroup\"\n>\n <!-- Logos -->\n <div class=\"card-block\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Logos\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend translate>Brand logo</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"brand-logo-img\"\n translate\n >\n Brand logo file\n </label>\n <c8y-static-assets-file-picker\n name=\"brand-logo-img\"\n [supportedFileExtensions]=\"imageFileExtensions\"\n [isCSSURL]=\"true\"\n [size]=\"150\"\n formControlName=\"brand-logo-img\"\n ></c8y-static-assets-file-picker>\n <c8y-messages [helpMessage]=\"'Supported files: *.png, *.svg, *.jpg' | translate\"></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"brand-logo-img-height\"\n for=\"brand-logo-img-height\"\n translate\n >\n Brand logo height\n </label>\n <input\n class=\"form-control\"\n id=\"brand-logo-img-height\"\n placeholder=\"{{ 'e.g. {{ example }}' | translate: { example: '50' } }}\"\n name=\"brand-logo-img-height\"\n type=\"number\"\n formControlName=\"brand-logo-img-height\"\n />\n <c8y-messages [helpMessage]=\"'Value is applied in px' | translate\"></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend translate>Navigator logo</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"navigator-platform-logo\"\n translate\n >\n Navigator logo file\n </label>\n <c8y-static-assets-file-picker\n name=\"navigator-platform-logo\"\n [supportedFileExtensions]=\"imageFileExtensions\"\n [isCSSURL]=\"true\"\n [size]=\"150\"\n formControlName=\"navigator-platform-logo\"\n ></c8y-static-assets-file-picker>\n <c8y-messages [helpMessage]=\"'Supported files: *.png, *.svg, *.jpg' | translate\"></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"navigator-platform-logo-height\"\n for=\"navigator-platform-logo-height\"\n translate\n >\n Navigator logo height\n </label>\n <input\n class=\"form-control\"\n id=\"navigator-platform-logo-height\"\n placeholder=\"{{ 'e.g. {{ example }}' | translate: { example: '50' } }}\"\n name=\"navigator-platform-logo-height\"\n type=\"number\"\n [min]=\"1\"\n formControlName=\"navigator-platform-logo-height\"\n />\n <c8y-messages [helpMessage]=\"'Value is applied in px' | translate\"></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend translate>Login image</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"login-platform-animation-img\"\n translate\n >\n Login image file\n </label>\n <c8y-static-assets-file-picker\n name=\"login-platform-animation-img\"\n [supportedFileExtensions]=\"imageFileExtensions\"\n [isCSSURL]=\"false\"\n [size]=\"150\"\n formControlName=\"login-platform-animation-img\"\n ></c8y-static-assets-file-picker>\n <c8y-messages [helpMessage]=\"'Supported files: *.png, *.svg, *.jpg' | translate\"></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Brand colors -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.brandColors.label | translate}}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend>{{ formStructure.brandColors.brandColors.label | translate}}</legend>\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of formStructure.brandColors.brandColors.colors\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-8\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend>{{ formStructure.brandColors.shades.label | translate }}</legend>\n <div class=\"row\">\n <div class=\"col-md-6\" *ngFor=\"let colorColumn of formStructure.brandColors.shades.colorColumn\">\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of colorColumn\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n data-cy=\"branding-reset-shades-button\"\n (click)=\"regenerateShadesBasedOnPrimaryColor()\"\n [disabled]=\"!(resetShadesButtonEnabled$ | async)\"\n >\n <i [c8yIcon]=\"'reset'\"></i>\n <span translate>Reset shades</span>\n </button>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Status colors -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.statusColors.label | translate }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-6\" *ngFor=\"let subCategory of formStructure.statusColors.subCategories\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend>{{ subCategory.label | translate }}</legend>\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of subCategory.colors\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Generic -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n translate\n >\n Generic\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend translate>Generic colors</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"body-background-color\"\n for=\"body-background-color\"\n translate\n >\n Body background color\n </label>\n <c8y-color-input\n name=\"body-background-color\"\n formControlName=\"body-background-color\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"text-color\"\n for=\"text-color\"\n translate\n >\n Text color\n </label>\n <c8y-color-input\n name=\"text-color\"\n formControlName=\"text-color\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"text-muted\"\n for=\"text-muted\"\n translate\n >\n Text muted color\n </label>\n <c8y-color-input\n name=\"text-muted\"\n formControlName=\"text-muted\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n <div class=\"col-md-6\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend translate>Interactive</legend>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"link-color\"\n for=\"link-color\"\n translate\n >\n Link color\n </label>\n <c8y-color-input\n name=\"link-color\"\n formControlName=\"link-color\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"link-hover-color\"\n for=\"link-hover-color\"\n translate\n >\n Link hover color\n </label>\n <c8y-color-input\n name=\"link-hover-color\"\n formControlName=\"link-hover-color\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n <c8y-form-group class=\"m-b-32\">\n <label\n title=\"btn-border-radius-base\"\n for=\"btn-border-radius-base\"\n translate\n >\n Button border-radius\n </label>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'e.g. 4' | translate }}\"\n name=\"btn-border-radius-base\"\n type=\"number\"\n formControlName=\"btn-border-radius-base\"\n />\n <c8y-messages [helpMessage]=\"'Value is applied in px' | translate\"></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Action bar -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.actionBar.label | translate }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <fieldset class=\"c8y-fieldset p-24\" *ngFor=\"let colorColumn of formStructure.actionBar.colorColumns\">\n <legend>{{ colorColumn.label | translate }}</legend>\n <div class=\"row\">\n <div class=\"col-md-6\" *ngFor=\"let subColorColumn of colorColumn.colorColumns\">\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of subColorColumn\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <!-- Main header -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.mainHeader.label | translate }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <fieldset class=\"c8y-fieldset p-24\" *ngFor=\"let colorColumn of formStructure.mainHeader.colorColumns\">\n <legend>{{ colorColumn.label | translate }}</legend>\n <div class=\"row\">\n <div class=\"col-md-6\" *ngFor=\"let subColorColumn of colorColumn.colorColumns\">\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of subColorColumn\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <!-- Navigator -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.navigator.label }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-4\" *ngFor=\"let colorColumn of formStructure.navigator.colorColumns\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend>{{ colorColumn.label | translate }}</legend>\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of colorColumn.colors\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Right drawer -->\n <div class=\"card-block separator-top\">\n <div class=\"row\">\n <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n <h4\n class=\"text-normal text-right text-left-xs m-b-16\"\n >\n {{ formStructure.rightDrawer.label | translate }}\n </h4>\n </div>\n <div class=\"col-xs-12 col-sm-9 col-md-10\">\n <div class=\"row\">\n <div class=\"col-md-6\" *ngFor=\"let colorColumn of formStructure.rightDrawer.colorColumns\">\n <fieldset class=\"c8y-fieldset p-24\">\n <legend>{{ colorColumn.label | translate }}</legend>\n <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of colorColumn.colors\">\n <label\n [title]=\"color.formControlName\"\n [for]=\"color.formControlName\"\n >\n {{ color.label | translate }}\n </label>\n <c8y-color-input\n [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n [formControlName]=\"color.formControlName\"\n ></c8y-color-input>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </fieldset>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnDestroy } from '@angular/core';\nimport { ActivatedRoute, Router, RouterOutlet } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlertService, AppStateService, CoreModule } from '@c8y/ngx-components';\nimport { BehaviorSubject, Observable, firstValueFrom } from 'rxjs';\nimport { map, distinctUntilChanged, switchMap } from 'rxjs/operators';\nimport { cloneDeep } from 'lodash-es';\nimport {\n ApplyBrandingLocallyService,\n BrandingOptionsJson,\n StoreBrandingService\n} from '@c8y/ngx-components/branding/shared/data';\nimport { AsyncValidator, ControlValueAccessor, FormControl } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'c8y-edit-branding-router-outlet',\n templateUrl: './edit-branding-router-outlet.component.html',\n standalone: true,\n imports: [RouterOutlet, CoreModule]\n})\nexport class EditBrandingRouterOutletComponent implements OnDestroy {\n brandingName$: Observable<string>;\n formControl = new FormControl<string>(undefined);\n fallbackBranding$: Observable<BrandingOptionsJson>;\n tabName$: Observable<string>;\n isGlobalBranding$: Observable<boolean>;\n private newBranding = new BehaviorSubject<BrandingOptionsJson>(null);\n private currentlyDisplayedComponent = new BehaviorSubject<\n (ControlValueAccessor & Partial<AsyncValidator>) | null\n >(null);\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private store: StoreBrandingService,\n private router: Router,\n private alert: AlertService,\n private applyBrandingService: ApplyBrandingLocallyService,\n private appState: AppStateService\n ) {\n this.isGlobalBranding$ = this.activatedRoute.data.pipe(\n map(({ tags }) => {\n return tags?.includes('latest');\n })\n );\n this.tabName$ = this.currentlyDisplayedComponent.pipe(\n switchMap(() => this.activatedRoute.firstChild.data),\n map(data => data.tabName)\n );\n this.brandingName$ = this.activatedRoute.params.pipe(map(params => params.name));\n this.formControl.addValidators(control => {\n try {\n JSON.parse(control.value);\n return null;\n } catch (e) {\n return { invalidJson: true };\n }\n });\n this.fallbackBranding$ = this.activatedRoute.data.pipe(map(data => data.fallbackBranding));\n this.activatedRoute.data\n .pipe(takeUntilDestroyed(), distinctUntilChanged())\n .subscribe(({ branding }) => {\n this.applyBrandingService.applyBranding(branding);\n this.formControl.setValue(JSON.stringify(branding, null, 2));\n });\n this.currentlyDisplayedComponent.pipe(takeUntilDestroyed()).subscribe(component => {\n if (!component) {\n return;\n }\n this.formControl.clearAsyncValidators();\n component.registerOnChange(value => this.onBrandingVarChanges(value));\n component.writeValue(this.formControl.value);\n if (component.validate) {\n this.formControl.addAsyncValidators(form => component.validate(form));\n if (component.registerOnValidatorChange) {\n component.registerOnValidatorChange(() => this.formControl.updateValueAndValidity());\n }\n }\n\n this.formControl.updateValueAndValidity();\n });\n }\n\n ngOnDestroy(): void {\n this.applyBrandingService.resetBranding();\n }\n\n routeActivated(event: ControlValueAccessor & Partial<AsyncValidator>) {\n this.currentlyDisplayedComponent.next(event);\n }\n\n async saveBranding() {\n try {\n const currentBranding = this.newBranding.value;\n const tagsOfCurrentVersion = await firstValueFrom(\n this.activatedRoute.data.pipe(map(data => data.tags))\n );\n\n const currentBrandingName = this.activatedRoute.snapshot.params.name;\n const { variants } = await this.store.loadBrandingVariants();\n const currentBrandingObj = variants.find(v => v.tags.includes(currentBrandingName));\n const currentVersion = currentBrandingObj.version;\n await this.store.saveExistingBranding(currentBranding, currentVersion, tagsOfCurrentVersion);\n this.router.navigate(\n ['../../', currentBrandingName, this.activatedRoute.snapshot.routeConfig.path],\n {\n relativeTo: this.activatedRoute,\n replaceUrl: true\n }\n );\n this.alert.success(\n gettext(\n 'Branding saved. To apply this branding, refresh any open window that might be affected.'\n )\n );\n } catch (e) {\n this.alert.addServerFailure(e, 'danger');\n console.warn(e);\n }\n }\n\n cancel() {\n this.router.navigate(['branding-editor']);\n }\n\n async openPreview() {\n const name = this.activatedRoute.snapshot.params.name;\n this.store.openPreviewForBranding(name);\n }\n\n async markAsActive() {\n const currentBrandingName = this.activatedRoute.snapshot.params.name;\n const { variants } = await this.store.loadBrandingVariants();\n const currentBrandingObj = variants.find(v => v.tags.includes(currentBrandingName));\n await this.store.markAsActive(currentBrandingObj);\n }\n\n async onBrandingVarChanges(value: string) {\n this.formControl.setValue(value);\n\n try {\n const parsedValue: BrandingOptionsJson = JSON.parse(value);\n const fallbackBranding: BrandingOptionsJson = cloneDeep(\n await firstValueFrom(this.fallbackBranding$)\n );\n this.cleanUpObjects(parsedValue);\n this.cleanUpObjects(parsedValue.brandingCssVars);\n for (const key in fallbackBranding) {\n if (parsedValue[key] === undefined) {\n parsedValue[key] = fallbackBranding[key];\n }\n\n if (typeof parsedValue[key] === 'object' && typeof fallbackBranding[key] === 'object') {\n parsedValue[key] = Object.assign(fallbackBranding[key], parsedValue[key]);\n }\n }\n this.applyBrandingService.applyBranding(parsedValue);\n this.newBranding.next(parsedValue);\n } catch (e) {\n // not valid JSON;\n }\n }\n\n private cleanUpObjects(value: Record<string, any>) {\n if (!value) {\n return;\n }\n Object.keys(value).forEach(key => {\n if (value[key] === null || value[key] === '') {\n delete value[key];\n }\n });\n }\n}\n","<c8y-title>{{ brandingName$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Settings' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'palette'\"\n [label]=\"'Branding' | translate\"\n [path]=\"'/branding-editor'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"brandingName$ | async\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div class=\"card card--fullpage content-fullpage\">\n <div class=\"card-header separator\">\n <div class=\"card-title\">{{ brandingName$ | async }} — {{ tabName$ | async | translate }}</div>\n </div>\n <router-outlet\n class=\"d-contents\"\n (activate)=\"routeActivated($event)\"\n ></router-outlet>\n\n <div class=\"card-footer separator\">\n <!-- footer content -->\n <button\n class=\"btn btn-default\"\n data-cy=\"branding-cancel\"\n (click)=\"cancel()\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n data-cy=\"branding-save\"\n [disabled]=\"formControl.invalid\"\n (click)=\"saveBranding()\"\n translate\n >\n Save\n </button>\n <button\n class=\"btn btn-default\"\n data-cy=\"branding-save-as\"\n [disabled]=\"formControl.invalid\"\n (click)=\"openPreview()\"\n translate\n >\n Open preview\n </button>\n <button\n class=\"btn btn-default\"\n data-cy=\"branding-set-as-latest\"\n (click)=\"markAsActive()\"\n [disabled]=\"isGlobalBranding$ | async\"\n translate\n >\n Set as global\n </button>\n </div>\n</div>\n","import { Component } from '@angular/core';\nimport { StaticAssetsFileListComponent } from '@c8y/ngx-components/static-assets/modal';\nimport {\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n C8yTranslateDirective,\n C8yTranslatePipe,\n ClipboardService,\n TitleComponent,\n ActionBarItemComponent,\n FilesService,\n GENERIC_FILE_TYPE\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { StaticAsset } from '@c8y/ngx-components/static-assets/data';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'c8y-branding-assets',\n templateUrl: './branding-assets.component.html',\n standalone: true,\n imports: [\n StaticAssetsFileListComponent,\n TitleComponent,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n C8yTranslateDirective,\n C8yTranslatePipe,\n ActionBarItemComponent,\n FormsModule\n ]\n})\nexport class BrandingAssetsComponent {\n filterOptions = [\n {\n label: gettext('All'),\n value: []\n },\n {\n label: gettext('Images'),\n value: this.filesService.mapGenericFileTypesToExtensions([GENERIC_FILE_TYPE.IMAGE])\n },\n {\n label: gettext('Fonts'),\n value: this.filesService.mapGenericFileTypesToExtensions([GENERIC_FILE_TYPE.FONT])\n }\n ];\n supportedFileExtensions = this.filterOptions[0].value;\n\n constructor(\n private clipboard: ClipboardService,\n private filesService: FilesService,\n private translate: TranslateService\n ) {}\n\n onItemSelected(file: StaticAsset) {\n const successMessage = this.translate.instant(\n gettext('Copied asset file path to clipboard. You can use it e.g. in custom CSS.')\n );\n this.clipboard.writeText(file.path, { success: successMessage });\n }\n}\n","<c8y-title>{{ 'Branding assets' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'cog'\"\n [label]=\"'Settings' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'palette'\"\n [label]=\"'Branding' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'files'\"\n [label]=\"'Branding assets' | translate\"\n [path]=\"'/branding-editor/assets'\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'left'\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [(ngModel)]=\"supportedFileExtensions\"\n >\n @for (filterOption of filterOptions; track $index) {\n <option [ngValue]=\"filterOption.value\">\n {{ filterOption.label | translate }}\n </option>\n }\n </select>\n </div>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage inner-scroll\">\n <c8y-static-assets-file-list\n [supportedFileExtensions]=\"supportedFileExtensions\"\n (itemSelected)=\"onItemSelected($event)\"\n ></c8y-static-assets-file-list>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ApplyBrandingToAppService","i1","i2","i3","i4","i5","i6","i7","i8.BrandingImportModalService"],"mappings":"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"}