@c8y/ngx-components 1022.33.0 → 1022.34.0

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 (41) hide show
  1. package/branding/shared/branding-tab.factory.d.ts +1 -1
  2. package/branding/shared/branding-tab.factory.d.ts.map +1 -1
  3. package/branding/shared/data/branding.type.d.ts +3 -2
  4. package/branding/shared/data/branding.type.d.ts.map +1 -1
  5. package/branding/shared/lazy/add-branding-modal/add-branding-modal.component.d.ts.map +1 -1
  6. package/branding/shared/lazy/apply-branding-to-app-modal/apply-branding-to-app-modal.component.d.ts.map +1 -1
  7. package/branding/shared/lazy/branding/branding.component.d.ts.map +1 -1
  8. package/branding/shared/lazy/branding-assets/branding-assets.component.d.ts +25 -0
  9. package/branding/shared/lazy/branding-assets/branding-assets.component.d.ts.map +1 -0
  10. package/branding/shared/lazy/branding-theme-form/branding-theme-form.component.d.ts +1 -0
  11. package/branding/shared/lazy/branding-theme-form/branding-theme-form.component.d.ts.map +1 -1
  12. package/branding/shared/lazy/index.d.ts +1 -0
  13. package/branding/shared/lazy/index.d.ts.map +1 -1
  14. package/branding/shared/shared-branding.module.d.ts +12 -4
  15. package/branding/shared/shared-branding.module.d.ts.map +1 -1
  16. package/core/clipboard/clipboard.service.d.ts +8 -2
  17. package/core/clipboard/clipboard.service.d.ts.map +1 -1
  18. package/core/common/files.service.d.ts +5 -1
  19. package/core/common/files.service.d.ts.map +1 -1
  20. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs +5 -1
  21. package/fesm2022/c8y-ngx-components-branding-shared-data.mjs.map +1 -1
  22. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs +15 -6
  23. package/fesm2022/c8y-ngx-components-branding-shared-lazy-add-branding-modal.mjs.map +1 -1
  24. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +101 -28
  25. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  26. package/fesm2022/c8y-ngx-components-branding-shared.mjs +98 -40
  27. package/fesm2022/c8y-ngx-components-branding-shared.mjs.map +1 -1
  28. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +143 -41
  29. package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
  30. package/fesm2022/c8y-ngx-components.mjs +10 -6
  31. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  32. package/locales/locales.pot +33 -0
  33. package/package.json +1 -1
  34. package/static-assets/modal/index.d.ts +1 -0
  35. package/static-assets/modal/index.d.ts.map +1 -1
  36. package/static-assets/modal/static-asset-main-type.pipe.d.ts +10 -0
  37. package/static-assets/modal/static-asset-main-type.pipe.d.ts.map +1 -0
  38. package/static-assets/modal/static-assets-file-list/static-assets-file-list.component.d.ts +31 -0
  39. package/static-assets/modal/static-assets-file-list/static-assets-file-list.component.d.ts.map +1 -0
  40. package/static-assets/modal/static-assets-modal.component.d.ts +2 -14
  41. package/static-assets/modal/static-assets-modal.component.d.ts.map +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/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 { NgIf } from '@angular/common';\nimport { CoreModule } 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: [NgIf, ReactiveFormsModule, CoreModule]\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 for (const entry of staticAssetsZipEntries) {\n if (entry.filename === this.brandings.fileNames.manifest) {\n continue;\n }\n if (entry.filename === this.staticAssets.fileNames.contents) {\n const fileContent = await (await firstValueFrom(this.zip.getData(entry))).text();\n oldAssets = JSON.parse(fileContent);\n continue;\n }\n const file = await firstValueFrom(this.zip.getData(entry));\n filesToAdd.push(new File([file], entry.filename));\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 gettext,\n CoreModule,\n DataGridModule\n} from '@c8y/ngx-components';\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';\n\n@Component({\n selector: 'c8y-branding',\n templateUrl: './branding.component.html',\n standalone: true,\n imports: [CoreModule, DataGridModule]\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 translate>Branding</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>\n\n<ng-container *ngIf=\"availableBrandingVariants$ | async as brandingVariant; else loading\">\n <c8y-action-bar-item\n *ngIf=\"brandingVariant.publicOptions\"\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 <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 <c8y-action-bar-item\n *ngIf=\"brandingVariant.publicOptions\"\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 <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 <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 *ngIf=\"!brandingVariant.publicOptions\"\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 </c8y-data-grid>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n","import { Component } from '@angular/core';\nimport { ControlValueAccessor, FormBuilder, FormsModule } from '@angular/forms';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { CoreModule, gettext, 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","<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'\"></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","<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'\"></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'\"></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'\"></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'\"></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'\"></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 { AlertService, AppStateService, CoreModule, gettext } 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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ApplyBrandingToAppService","i1","i2","i3","i4","gettext","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 for (const entry of staticAssetsZipEntries) {\n if (entry.filename === this.brandings.fileNames.manifest) {\n continue;\n }\n if (entry.filename === this.staticAssets.fileNames.contents) {\n const fileContent = await (await firstValueFrom(this.zip.getData(entry))).text();\n oldAssets = JSON.parse(fileContent);\n continue;\n }\n const file = await firstValueFrom(this.zip.getData(entry));\n filesToAdd.push(new File([file], entry.filename));\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, NgIf } 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 NgIf,\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 translate>Branding</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<ng-container *ngIf=\"availableBrandingVariants$ | async as brandingVariant; else loading\">\n <c8y-action-bar-item\n *ngIf=\"brandingVariant.publicOptions\"\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 <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 <c8y-action-bar-item\n *ngIf=\"brandingVariant.publicOptions\"\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 <c8y-help [src]=\"'/docs/enterprise-tenant/customization/#to-configure-branding-settings'\"></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 <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 *ngIf=\"!brandingVariant.publicOptions\"\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 </c8y-data-grid>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <c8y-loading></c8y-loading>\n</ng-template>\n","import { Component } from '@angular/core';\nimport { ControlValueAccessor, FormBuilder, FormsModule } from '@angular/forms';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { CoreModule, gettext, 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 { AlertService, AppStateService, CoreModule, gettext } 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 { NgForOf } from '@angular/common';\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 NgForOf,\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 translate>Branding assets</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 <option\n *ngFor=\"let filterOption of filterOptions\"\n [ngValue]=\"filterOption.value\"\n >\n {{ filterOption.label | translate }}\n </option>\n </select>\n </div>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage\">\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","gettext"],"mappings":"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"}