UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

1 lines • 23 kB
{"version":3,"file":"c8y-ngx-components-feature-toggles-list.mjs","sources":["../../feature-toggles/list/can-toggle-status-of-feature-toggle.pipe.ts","../../feature-toggles/list/feature-toggle-list/feature-toggle-list.component.ts","../../feature-toggles/list/feature-toggle-list/feature-toggle-list.component.html","../../feature-toggles/list/index.ts","../../feature-toggles/list/c8y-ngx-components-feature-toggles-list.ts"],"sourcesContent":["import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { IFeatureToggle } from '@c8y/client';\nimport { AppStateService, Permissions } from '@c8y/ngx-components';\n\n@Pipe({\n name: 'canToggleStatusOfFeatureToggle'\n})\nexport class CanToggleStatusOfFeatureTogglePipe implements PipeTransform {\n private permissions = inject(Permissions);\n private appState = inject(AppStateService);\n\n transform(value: IFeatureToggle): boolean {\n if (!this.permissions.hasRole(Permissions.ROLE_TENANT_MANAGEMENT_ADMIN)) {\n return false;\n }\n if (this.appState.currentTenant.value?.name === 'management') {\n return true;\n }\n if (value.phase === 'PUBLIC_PREVIEW' || value.phase === 'GENERALLY_AVAILABLE') {\n return true;\n }\n return false;\n }\n}\n","import { NgClass } from '@angular/common';\nimport { Component, inject, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { FeatureService, IFeatureToggle } from '@c8y/client';\nimport {\n C8yTranslateDirective,\n TitleComponent,\n DataGridComponent,\n Column,\n C8yTranslatePipe,\n EmptyStateComponent,\n Pagination,\n DisplayOptions,\n CellRendererDefDirective,\n ColumnDirective,\n ActionControl,\n AlertService,\n Permissions,\n AppStateService,\n ContextRouteService,\n HeaderCellRendererDefDirective\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { FormsModule } from '@angular/forms';\nimport { CanToggleStatusOfFeatureTogglePipe } from '../can-toggle-status-of-feature-toggle.pipe';\n\n@Component({\n selector: 'c8y-feature-toggle-list',\n templateUrl: './feature-toggle-list.component.html',\n imports: [\n TitleComponent,\n C8yTranslateDirective,\n C8yTranslatePipe,\n DataGridComponent,\n EmptyStateComponent,\n CellRendererDefDirective,\n ColumnDirective,\n PopoverDirective,\n NgClass,\n FormsModule,\n CanToggleStatusOfFeatureTogglePipe,\n HeaderCellRendererDefDirective\n ]\n})\nexport class FeatureToggleListComponent implements OnInit {\n columns: Column[] = [\n { name: 'name', header: gettext('Name'), sortable: true, path: 'name' },\n { name: 'description', header: gettext('Description'), sortable: true, path: 'description' },\n { name: 'key', header: gettext('Toggle key'), sortable: true, path: 'key' },\n { name: 'status', header: gettext('Status'), sortable: true, path: 'active' },\n { name: 'phase', header: gettext('Phase'), sortable: true, path: 'phase' },\n { name: 'strategy', header: gettext('Strategy'), sortable: true, path: 'strategy' }\n ];\n actionControls: ActionControl[] = [\n {\n name: 'clearOverride',\n icon: 'reset',\n type: 'clearOverride',\n text: gettext('Reset the toggle to the default state depending on the phase'),\n callback: async (item: IFeatureToggle, reload) => {\n await this.removeTenantOverride(item);\n reload();\n },\n showIf: (item: IFeatureToggle) =>\n item.strategy !== 'DEFAULT' &&\n this.permissions.hasRole('ROLE_TENANT_MANAGEMENT_ADMIN') &&\n (this.isManagementTenant ||\n item.phase === 'PUBLIC_PREVIEW' ||\n item.phase === 'GENERALLY_AVAILABLE')\n }\n ];\n items: (IFeatureToggle & { id: string })[] = [];\n pagination: Pagination = {\n pageSize: 50,\n currentPage: 1\n };\n displayOptions: DisplayOptions = {\n bordered: false,\n striped: true,\n filter: true,\n gridHeader: true,\n hover: true\n };\n hasPrivatePreviewFeatures = false;\n phaseDetails = {\n PUBLIC_PREVIEW: {\n class: 'tag--info',\n name: gettext('Public preview`feature phase`'),\n description: gettext(\n 'The feature is available for public preview and can be used by all users. It is disabled by default.'\n )\n },\n PRIVATE_PREVIEW: {\n class: 'tag--default',\n name: gettext('Private preview`feature phase`'),\n description: gettext(\n 'The feature is in private preview and available to a selected set of users. It is disabled by default.'\n )\n },\n GENERALLY_AVAILABLE: {\n class: 'tag--success',\n name: gettext('Generally available`feature phase`'),\n description: gettext(\n 'The feature is generally available and can be used by all users. It is enabled by default.'\n )\n }\n };\n phaseKeysOrder = [\n 'PRIVATE_PREVIEW',\n 'PUBLIC_PREVIEW',\n 'GENERALLY_AVAILABLE'\n ] as const satisfies Array<keyof typeof this.phaseDetails>;\n strategyDetails = [\n {\n key: 'DEFAULT',\n class: 'tag--success',\n name: gettext('Default`strategy`'),\n description: gettext('The feature toggle is using the default state based on its phase.')\n },\n {\n key: 'TENANT',\n class: 'tag--info',\n name: gettext('Custom`strategy`'),\n description: gettext(\n 'The feature toggle has been customized. When the phase of the feature changes, the custom state remains unchanged.'\n )\n }\n ];\n\n activatedRoute: ActivatedRoute = inject(ActivatedRoute, { optional: true });\n private featureToggle = inject(FeatureService);\n private alertService = inject(AlertService);\n private permissions = inject(Permissions);\n private isManagementTenant = inject(AppStateService).currentTenant.value?.name === 'management';\n private contextRouteService = inject(ContextRouteService);\n\n constructor() {\n this.items = this.activatedRoute?.snapshot.data['features'] || [];\n }\n\n async ngOnInit(): Promise<void> {\n await this.reload();\n }\n\n async reload() {\n let { data: toggles } = await this.featureToggle.list({ pageSize: 1000 });\n toggles = toggles.filter(\n toggle =>\n toggle.phase !== 'IN_DEVELOPMENT' &&\n (toggle.phase !== 'PRIVATE_PREVIEW' || toggle.active === true)\n );\n this.hasPrivatePreviewFeatures = toggles.some(toggle => toggle.phase === 'PRIVATE_PREVIEW');\n const contextData = this.contextRouteService.getContextData(this.activatedRoute);\n if (!contextData) {\n this.items = toggles.map(toggle => ({ ...toggle, id: toggle.key }));\n return;\n }\n\n const tenantId = contextData.contextData.id;\n const promises = toggles.map(toggle => {\n return this.featureToggle.detailByTenant(toggle.key).then(({ data }) => {\n const override = data.find(ft => ft.tenantId === tenantId);\n if (override) {\n return {\n ...toggle,\n id: toggle.key,\n strategy: 'TENANT',\n active: override.active\n } as const;\n }\n return {\n ...toggle,\n id: toggle.key,\n strategy: 'DEFAULT',\n active: toggle.phase === 'GENERALLY_AVAILABLE'\n } as const;\n });\n });\n const results = await Promise.all(promises);\n this.items = results;\n }\n\n async updateFeature(feature: IFeatureToggle, newActiveValue: boolean) {\n try {\n const contextData = this.contextRouteService.getContextData(this.activatedRoute);\n if (contextData) {\n const tenantId = contextData.contextData.id as string;\n await this.featureToggle.updateFeatureByTenant(\n {\n key: feature.key,\n active: newActiveValue\n },\n tenantId\n );\n } else {\n await this.featureToggle.updateFeature({ key: feature.key, active: newActiveValue });\n }\n\n if (newActiveValue) {\n this.alertService.success(gettext('Feature enabled.'));\n } else {\n this.alertService.success(gettext('Feature disabled.'));\n }\n } catch (e) {\n console.error('Error updating feature:', e);\n if (newActiveValue) {\n this.alertService.warning(gettext('Failed to enable feature.'));\n } else {\n this.alertService.warning(gettext('Failed to disable feature.'));\n }\n }\n await this.reload();\n }\n\n async removeTenantOverride(feature: IFeatureToggle) {\n try {\n const contextData = this.contextRouteService.getContextData(this.activatedRoute);\n if (contextData) {\n const tenantId = contextData.contextData.id as string;\n await this.featureToggle.removeTenantOverrideByTenant(feature, tenantId);\n } else {\n await this.featureToggle.removeTenantOverride(feature);\n }\n this.alertService.success(gettext('Feature reset to default state.'));\n } catch (e) {\n console.error('Error removing feature override:', e);\n this.alertService.warning(gettext('Failed to reset feature state.'));\n }\n await this.reload();\n }\n}\n","<c8y-title>{{ 'Feature toggles' | translate }}</c8y-title>\n\n<div class=\"content-fullpage d-flex d-col border-top border-bottom\">\n <c8y-data-grid\n [title]=\"'Feature toggles' | translate\"\n [actionControls]=\"actionControls\"\n [columns]=\"columns\"\n [rows]=\"items\"\n [pagination]=\"pagination\"\n [displayOptions]=\"displayOptions\"\n (onReload)=\"reload()\"\n >\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <strong>{{ context.value || '--' | translate }}</strong>\n </ng-container>\n </c8y-column>\n <c8y-column name=\"description\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <p>{{ context.value || '--' | translate }}</p>\n </ng-container>\n </c8y-column>\n <c8y-column name=\"status\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n type=\"checkbox\"\n [ngModel]=\"context.value\"\n [disabled]=\"!(context.item | canToggleStatusOfFeatureToggle)\"\n (ngModelChange)=\"updateFeature(context.item, !context.value)\"\n [ngModelOptions]=\"{ standalone: true }\"\n />\n <span></span>\n <span class=\"text-12 a-s-center\">\n @if (context.value) {\n {{ 'Enabled' | translate }}\n } @else {\n {{ 'Disabled' | translate }}\n }\n </span>\n </label>\n </ng-container>\n </c8y-column>\n <c8y-column name=\"phase\">\n <ng-template #phasePopoverHelp>\n <p>\n <strong>{{ 'Feature phases' | translate }}</strong>\n </p>\n @for (phaseKey of phaseKeysOrder; track phaseKey) {\n @if (phaseKey !== 'PRIVATE_PREVIEW' || hasPrivatePreviewFeatures) {\n <span\n class=\"tag chip m-b-4\"\n [ngClass]=\"phaseDetails[phaseKey].class\"\n >\n {{ phaseDetails[phaseKey].name | translate }}\n </span>\n <p class=\"text-12 m-b-8\">\n {{ phaseDetails[phaseKey].description | translate }}\n </p>\n }\n }\n </ng-template>\n <ng-container *c8yHeaderCellRendererDef>\n {{ 'Phase' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"phasePopoverHelp\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </ng-container>\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n class=\"tag\"\n [ngClass]=\"phaseDetails[context.value]?.class || 'tag--warning'\"\n >\n {{ phaseDetails[context.value]?.name || context.value | translate }}\n </span>\n </ng-container>\n </c8y-column>\n <c8y-column name=\"strategy\">\n <ng-template #strategyPopoverHelp>\n <p>\n <strong>{{ 'Feature strategies' | translate }}</strong>\n </p>\n @for (strategy of strategyDetails; track strategy) {\n <span\n class=\"tag chip m-b-4\"\n [ngClass]=\"strategy.class\"\n >\n {{ strategy.name | translate }}\n </span>\n <p class=\"text-12 m-b-8\">\n {{ strategy.description | translate }}\n </p>\n }\n </ng-template>\n <ng-container *c8yHeaderCellRendererDef>\n {{ 'Strategy' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"strategyPopoverHelp\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </ng-container>\n <ng-container *c8yCellRendererDef=\"let context\">\n @for (strategy of strategyDetails; track strategy) {\n @if (context.value === strategy.key) {\n <span\n class=\"tag\"\n [ngClass]=\"strategy.class\"\n >\n {{ strategy.name | translate }}\n </span>\n }\n }\n </ng-container>\n </c8y-column>\n <c8y-ui-empty-state\n [icon]=\"'toggle-on'\"\n [title]=\"'No feature toggles available.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </c8y-data-grid>\n</div>\n","import { Routes } from '@angular/router';\nimport { FeatureToggleListComponent } from './feature-toggle-list/feature-toggle-list.component';\n\nexport * from './feature-toggle-list/feature-toggle-list.component';\n\nexport const childRoutes: Routes = [\n {\n path: '',\n pathMatch: 'full',\n component: FeatureToggleListComponent\n }\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}