{"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 } from '@angular/core';\nimport {\n  ActionControl,\n  AlertService,\n  Column,\n  DisplayOptions,\n  gettext,\n  ModalService,\n  Pagination,\n  PX_ACTIONS,\n  Row,\n  Status\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';\n\nexport type ProvisionedCertificate = { serialNumber: string; validTill: string };\n\n@Component({\n  selector: 'device-tab-serials-component',\n  templateUrl: './device-tab-provisioned-certificates.component.html'\n})\nexport class DeviceTabProvisionedCertificatesComponent implements OnInit {\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: 'validTill',\n      path: 'validTill',\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) => this.revokeProvisionedCertificate(item)\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  highlightDependingOnExpirationStatus(item: ProvisionedCertificate) {\n    const warningOffset = 24 * 60 * 60 * 1000 * 90; // 90 days\n    const todayTimestamp = new Date().getTime();\n    const warningTimestamp = new Date().getTime() + warningOffset;\n    const notAfterTimestamp = new Date(item.validTill).getTime();\n    const expired = notAfterTimestamp < todayTimestamp;\n    const expiresInLessThan90Days = notAfterTimestamp < warningTimestamp;\n    if (expired) {\n      return 'text-danger';\n    }\n    if (expiresInLessThan90Days) {\n      return 'text-warning';\n    }\n    return '';\n  }\n\n  async revokeProvisionedCertificate(provisionedCertificate: ProvisionedCertificate) {\n    if (provisionedCertificate) {\n      try {\n        const serialNumberInHex = provisionedCertificate.serialNumber;\n        await this.confirmRevocation(serialNumberInHex);\n        await this.crlService.uploadCrls([{ serialNumberInHex }]);\n      } catch (error) {\n        this.alertService.addServerFailure(error);\n      } finally {\n        this.reload();\n      }\n    }\n  }\n\n  private async confirmRevocation(serialNumber: string) {\n    return await this.modalService.confirm(\n      gettext('Revoke provisioned certificate'),\n      this.translateService.instant(\n        gettext(\n          `You are about to revoke provisioned certificate {{ serialNumber }}. Do you want to proceed?`\n        ),\n        { serialNumber }\n      ),\n      Status.DANGER,\n      { ok: gettext('Revoke'), 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  [columns]=\"columns\"\n  [rows]=\"rows$ | async\"\n  [pagination]=\"pagination\"\n  [actionControls]=\"actionControls\"\n  [displayOptions]=\"displayOptions\"\n  [hideReload]=\"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=\"validTill\">\n    <ng-container *c8yCellRendererDef=\"let context\">\n      <span\n        class=\"text-truncate\"\n        title=\"{{ context.property.header | translate }}: {{ context.value | c8yDate }}\"\n      >\n        <span\n          *ngIf=\"context.value\"\n          [ngClass]=\"highlightDependingOnExpirationStatus(context.item)\"\n        >\n          <i\n            class=\"m-r-4\"\n            c8yIcon=\"calendar\"\n            *ngIf=\"!highlightDependingOnExpirationStatus(context.item)\"\n          ></i>\n          <i\n            class=\"m-r-4\"\n            c8yIcon=\"warning\"\n            *ngIf=\"highlightDependingOnExpirationStatus(context.item)\"\n          ></i>\n          <span>{{ context.value | c8yDate }}</span>\n        </span>\n      </span>\n    </ng-container>\n  </c8y-column>\n</c8y-data-grid>\n","import { NgModule } from '@angular/core';\nimport { CoreModule, hookRoute, gettext, 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  declarations: [DeviceTabProvisionedCertificatesComponent],\n  exports: [],\n  imports: [CoreModule, TooltipModule, ReactiveFormsModule, ButtonsModule, PopoverModule],\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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"}