@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
1 lines • 23.6 kB
Source Map (JSON)
{"version":3,"file":"c8y-ngx-components-device-provisioned-certificates.mjs","sources":["../../device-provisioned-certificates/device-provisioned-certificates.service.ts","../../device-provisioned-certificates/device-provisioned-certificates.guard.ts","../../device-provisioned-certificates/device-tab-provisioned-certificates.component.ts","../../device-provisioned-certificates/device-tab-provisioned-certificates.component.html","../../device-provisioned-certificates/device-provisioned-certificates.module.ts","../../device-provisioned-certificates/c8y-ngx-components-device-provisioned-certificates.ts"],"sourcesContent":["import { FetchClient, IManagedObject, UserService } from '@c8y/client';\nimport { Injectable } from '@angular/core';\nimport { ProvisionedCertificate } from './device-tab-provisioned-certificates.component';\n\n@Injectable()\nexport class DeviceProvisionedCertificatesService {\n constructor(\n private userService: UserService,\n private client: FetchClient\n ) {}\n\n async getDeviceProvisionedCertificates(\n device: IManagedObject\n ): Promise<ProvisionedCertificate[] | undefined> {\n const deviceUserName = await this.getDeviceUserName(device);\n\n // Avoid additional requests if the device does not have a user.\n // This case does not really occur in real-life scenarios, but e.g. in cypress tests only\n if (!deviceUserName) {\n return undefined;\n }\n\n const { data } = await this.userService.detail(deviceUserName, { withCertificates: true });\n return data.provisionedCertificates;\n }\n\n private async getDeviceUserName(device): Promise<string> {\n const method = 'GET';\n const url = `/inventory/managedObjects/${device.id}/user`;\n const res = await this.client.fetch(url, { method });\n const data = await res.json();\n if (res.status >= 400) {\n throw new Error(data.message);\n }\n return data.userName;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { DeviceProvisionedCertificatesService } from './device-provisioned-certificates.service';\nimport { ActivatedRouteSnapshot } from '@angular/router';\n\n@Injectable()\nexport class DeviceProvisionedCertificatesGuard {\n constructor(private deviceProvisionedCertificatesService: DeviceProvisionedCertificatesService) {}\n\n async canActivate(route: ActivatedRouteSnapshot) {\n const contextData = route.data.contextData || route.parent.data.contextData;\n if (!contextData) {\n return false;\n }\n try {\n const provisionedCertificates =\n await this.deviceProvisionedCertificatesService.getDeviceProvisionedCertificates(\n contextData\n );\n return provisionedCertificates?.length > 0;\n } catch (error) {\n return false;\n }\n }\n}\n","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ActionControl,\n AlertService,\n BulkActionControl,\n Column,\n DataGridComponent,\n DisplayOptions,\n ModalService,\n Pagination,\n PX_ACTIONS,\n Row,\n Status,\n ActionBarItemComponent,\n IconDirective,\n EmptyStateComponent,\n ColumnDirective,\n CellRendererDefDirective,\n C8yTranslatePipe,\n DatePipe\n} from '@c8y/ngx-components';\nimport { DeviceProvisionedCertificatesService } from './device-provisioned-certificates.service';\nimport { ActivatedRoute } from '@angular/router';\nimport { CrlService, IManagedObject } from '@c8y/client';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { switchMap, map, tap, finalize, shareReplay } from 'rxjs/operators';\nimport { TranslateService } from '@ngx-translate/core';\nimport { NgClass, NgIf, AsyncPipe, NgTemplateOutlet } from '@angular/common';\n\nexport type ProvisionedCertificate = { serialNumber: string; notBefore: string; notAfter: string };\n\n@Component({\n selector: 'device-tab-serials-component',\n templateUrl: './device-tab-provisioned-certificates.component.html',\n imports: [\n ActionBarItemComponent,\n IconDirective,\n NgClass,\n DataGridComponent,\n NgIf,\n EmptyStateComponent,\n ColumnDirective,\n CellRendererDefDirective,\n C8yTranslatePipe,\n AsyncPipe,\n DatePipe,\n NgTemplateOutlet\n ]\n})\nexport class DeviceTabProvisionedCertificatesComponent implements OnInit {\n @ViewChild('dataGrid') dataGrid: DataGridComponent;\n\n reloading = false;\n reload$: BehaviorSubject<void> = new BehaviorSubject(null);\n\n tableTitle = gettext('Provisioned certificates');\n columns: Column[] = [\n {\n name: 'serialNumber',\n path: 'serialNumber',\n header: gettext('Serial number')\n },\n {\n name: 'notBefore',\n path: 'notBefore',\n header: gettext('Valid from')\n },\n {\n name: 'notAfter',\n path: 'notAfter',\n header: gettext('Expiration date')\n }\n ];\n rows$: Observable<Array<Row & ProvisionedCertificate>> = this.reload$.pipe(\n tap(() => {\n this.reloading = true;\n }),\n map(() => this.route.snapshot.parent.data.contextData as IManagedObject),\n switchMap(device => this.deviceSerialsService.getDeviceProvisionedCertificates(device)),\n map(provisionedCertificates =>\n provisionedCertificates.map(cert => ({\n ...cert,\n id: cert.serialNumber\n }))\n ),\n tap(() => {\n this.reloading = false;\n }),\n shareReplay(1),\n finalize(() => {\n this.reloading = false;\n })\n );\n pagination: Pagination = {\n pageSize: 20,\n currentPage: 1\n };\n actionControls: ActionControl[] = [\n {\n type: 'REVOKE',\n text: gettext('Revoke'),\n icon: 'trash',\n iconClasses: 'text-danger',\n showOnHover: false,\n callback: (item: Row & ProvisionedCertificate) =>\n this.revokeProvisionedCertificates([item.serialNumber])\n }\n ];\n bulkActionControls: BulkActionControl[] = [\n {\n type: 'REVOKE',\n text: gettext('Revoke'),\n icon: 'trash',\n callback: (selectedItemsIds: string[]) => this.revokeProvisionedCertificates(selectedItemsIds)\n }\n ];\n displayOptions: DisplayOptions = {\n filter: false,\n striped: true,\n hover: true,\n bordered: false,\n gridHeader: true\n };\n\n protected readonly PX_ACTIONS = PX_ACTIONS;\n\n constructor(\n private alertService: AlertService,\n private modalService: ModalService,\n private deviceSerialsService: DeviceProvisionedCertificatesService,\n private crlService: CrlService,\n private route: ActivatedRoute,\n private translateService: TranslateService\n ) {}\n\n ngOnInit(): void {\n this.reload();\n }\n\n reload() {\n this.reload$.next();\n }\n\n getExpirationHighlight(item: ProvisionedCertificate) {\n const now = Date.now();\n const notAfter = new Date(item.notAfter).getTime();\n const ninetyDays = 90 * 24 * 60 * 60 * 1000;\n\n const result = {\n expired: false,\n icon: 'calendar',\n textClass: '',\n tooltipText: ''\n };\n\n if (notAfter < now) {\n result.expired = true;\n result.icon = 'warning';\n result.textClass = 'text-muted';\n result.tooltipText = gettext('Certificate expired');\n } else if (notAfter < now + ninetyDays) {\n result.icon = 'warning';\n result.textClass = 'text-danger';\n result.tooltipText = gettext('Certificate expires in less than 90 days');\n }\n\n return result;\n }\n\n async revokeProvisionedCertificates(serialNumbersInHex: string[]) {\n if (serialNumbersInHex && serialNumbersInHex.length > 0) {\n try {\n await this.confirmRevocation(serialNumbersInHex);\n await this.crlService.uploadCrls(\n serialNumbersInHex.map(serialNumber => ({ serialNumberInHex: serialNumber }))\n );\n if (serialNumbersInHex.length === 1) {\n this.alertService.success(gettext('Selected provisioned certificate was revoked.'));\n } else {\n this.alertService.success(gettext('Selected provisioned certificates were revoked.'));\n }\n this.dataGrid.setAllItemsSelected(false);\n } catch (error) {\n this.alertService.addServerFailure(error);\n } finally {\n this.reload();\n }\n }\n }\n\n private async confirmRevocation(serialNumbers: string[]) {\n const hasMany = serialNumbers.length > 1;\n const serialsDisplay = serialNumbers.join(', ');\n\n const title = hasMany\n ? gettext('Revoke provisioned certificates?')\n : gettext('Revoke provisioned certificate?');\n const messageTpl = hasMany\n ? gettext(\n `You are about to revoke provisioned certificates: {{ serialNumbers }}. Do you want to proceed?`\n )\n : gettext(\n `You are about to revoke provisioned certificate {{ serialNumber }}. Do you want to proceed?`\n );\n const message = this.translateService.instant(messageTpl, {\n serialNumbers: serialsDisplay,\n serialNumber: serialsDisplay\n });\n\n return await this.modalService.confirm(title, message, Status.DANGER, {\n ok: gettext('Revoke'),\n cancel: gettext('Cancel')\n });\n }\n}\n","<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-data-grid\n [title]=\"tableTitle | translate\"\n #dataGrid\n [columns]=\"columns\"\n [rows]=\"rows$ | async\"\n [pagination]=\"pagination\"\n [actionControls]=\"actionControls\"\n [bulkActionControls]=\"bulkActionControls\"\n [displayOptions]=\"displayOptions\"\n [hideReload]=\"true\"\n [selectable]=\"true\"\n>\n <c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No provisioned certificates to display.' | translate\"\n *ngIf=\"(rows$ | async)?.length === 0\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"serialNumber\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n class=\"text-truncate\"\n title=\"{{ context.property.header | translate }}: {{ context.value }}\"\n >\n {{ context.value }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"notBefore\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n class=\"text-truncate\"\n title=\"{{ context.property.header | translate }}: {{ context.value | c8yDate }}\"\n >\n <span *ngIf=\"context.value\">\n <i\n class=\"m-r-4\"\n c8yIcon=\"calendar\"\n ></i>\n <span>{{ context.value | c8yDate }}</span>\n </span>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"notAfter\">\n <ng-container *c8yCellRendererDef=\"let context\">\n @let expirationHighlight = getExpirationHighlight(context.item);\n <span\n [title]=\"\n (context.property.header | translate) +\n ': ' +\n (context.value | c8yDate) +\n (expirationHighlight?.tooltipText\n ? ' - ' + (expirationHighlight?.tooltipText | translate)\n : '')\n \"\n [ngClass]=\"expirationHighlight?.textClass\"\n >\n <ng-container *ngIf=\"expirationHighlight?.expired; else notExpiredYet\">\n <del>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </del>\n </ng-container>\n <ng-template #notExpiredYet>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </ng-template>\n <ng-template #expirationDateTpl>\n <i\n class=\"m-r-4\"\n c8yIcon=\"{{ expirationHighlight?.icon }}\"\n *ngIf=\"expirationHighlight?.icon\"\n ></i>\n <span>{{ context.value | c8yDate }}</span>\n </ng-template>\n </span>\n </ng-container>\n </c8y-column>\n</c8y-data-grid>\n","import { NgModule } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { CoreModule, hookRoute, ViewContext } from '@c8y/ngx-components';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { DeviceProvisionedCertificatesGuard } from './device-provisioned-certificates.guard';\nimport { DeviceTabProvisionedCertificatesComponent } from './device-tab-provisioned-certificates.component';\nimport { DeviceProvisionedCertificatesService } from './device-provisioned-certificates.service';\n\n@NgModule({\n exports: [],\n imports: [\n CoreModule,\n TooltipModule,\n ReactiveFormsModule,\n ButtonsModule,\n PopoverModule,\n DeviceTabProvisionedCertificatesComponent\n ],\n providers: [\n hookRoute([\n {\n context: ViewContext.Device,\n path: 'device-provisioned-certificates',\n component: DeviceTabProvisionedCertificatesComponent,\n label: gettext('x509'),\n icon: 'c8y-device-profile',\n canActivate: [DeviceProvisionedCertificatesGuard]\n }\n ]),\n DeviceProvisionedCertificatesService,\n DeviceProvisionedCertificatesGuard\n ]\n})\nexport class DeviceProvisionedCertificatesModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.DeviceProvisionedCertificatesService","i1","i2.DeviceProvisionedCertificatesService","i3"],"mappings":"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"}