{"version":3,"file":"c8y-ngx-components-register-device.mjs","sources":["../../register-device/register-device.service.ts","../../register-device/general/general-device-registration.component.ts","../../register-device/general/general-device-registration.component.html","../../register-device/general/general-device-registration.service.ts","../../register-device/general/general-device-registration-button.component.ts","../../register-device/general/general-device-registration-button.component.html","../../register-device/dropdown/register-device-extension.service.ts","../../register-device/dropdown/register-device-dropdown.component.ts","../../register-device/dropdown/register-device-dropdown.component.html","../../register-device/device-registration-view.component.ts","../../register-device/device-registration-view.component.html","../../register-device/register-device-navigation.factory.ts","../../register-device/extensible/base-extensible-device-registration.service.ts","../../register-device/extensible/single/extensible-device-registration.service.ts","../../register-device/extensible/base-device-registration.model.ts","../../register-device/extensible/single/extensible-device-registration-stepper.component.ts","../../register-device/extensible/single/extensible-device-registration-stepper.component.html","../../register-device/extensible/single/extensible-device-registration-modal.component.ts","../../register-device/extensible/single/extensible-device-registration-modal.component.html","../../register-device/extensible/single/extensible-device-registration-button.component.ts","../../register-device/extensible/single/extensible-device-registration-button.component.html","../../register-device/extensible/bulk/extensible-bulk-device-registration.service.ts","../../register-device/extensible/bulk/extensible-bulk-device-registration-modal.component.ts","../../register-device/extensible/bulk/extensible-bulk-device-registration-modal.component.html","../../register-device/bulk/bulk-device-registration-modal.component.ts","../../register-device/bulk/bulk-device-registration-modal.component.html","../../register-device/extensible/bulk/extensible-bulk-device-registration-button.component.ts","../../register-device/extensible/bulk/extensible-bulk-device-registration-button.component.html","../../register-device/bulk/bulk-device-registration-button.component.ts","../../register-device/bulk/bulk-device-registration-button.component.html","../../register-device/register-device.factory.ts","../../register-device/register-device.module.ts","../../register-device/c8y-ngx-components-register-device.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n  DeviceRegistrationService,\n  DeviceRegistrationStatus,\n  IDeviceRegistration,\n  IDeviceRegistrationAccept,\n  IDeviceRegistrationCreate,\n  IDeviceRegistrationLimit,\n  IResult,\n  Paging\n} from '@c8y/client';\nimport { get, pick } from 'lodash-es';\nimport { BehaviorSubject, forkJoin, from, Observable, Subject } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlertService, IRealtimeDeviceBootstrap } from '@c8y/ngx-components';\nimport { finalize, map, mergeMap, takeLast, takeUntil } from 'rxjs/operators';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class RegisterDeviceService {\n  readonly _loading: Subject<boolean> = new Subject();\n  readonly _limit: BehaviorSubject<IDeviceRegistrationLimit> = new BehaviorSubject({\n    isReached: false\n  });\n  readonly _deviceRegistrationRequests: BehaviorSubject<{\n    data: IDeviceRegistration[];\n    paging?: Paging<IDeviceRegistration>;\n  }> = new BehaviorSubject({ data: [] });\n  readonly deviceRegistrationRequests$: Observable<{\n    data: IDeviceRegistration[];\n    paging?: Paging<IDeviceRegistration>;\n  }> = this._deviceRegistrationRequests.asObservable();\n  readonly loading$: Observable<boolean> = this._loading.asObservable();\n  readonly limit$: Observable<IDeviceRegistrationLimit> = this._limit.asObservable();\n  paging: Paging<IDeviceRegistration>;\n\n  private readonly deviceRegUrl = '/deviceregistration';\n  private endSubscriptions: Subject<void> = new Subject();\n\n  constructor(\n    private router: Router,\n    private deviceRegService: DeviceRegistrationService,\n    private alertService: AlertService\n  ) {}\n\n  isDeviceRegistration(): boolean {\n    return get(this.router, 'url') === this.deviceRegUrl;\n  }\n\n  internalListUpdate(\n    deviceRequests: IDeviceRegistration[],\n    pagingObject?: Paging<IDeviceRegistration>\n  ) {\n    let { paging, data } = this._deviceRegistrationRequests.getValue();\n    if (pagingObject) {\n      paging = pagingObject;\n    }\n    data = [...data, ...deviceRequests].filter(deviceReq => deviceReq.type !== 'c8y_DataBroker');\n    this._deviceRegistrationRequests.next({ data, paging });\n  }\n\n  onDeviceBootstrap(bsData: IRealtimeDeviceBootstrap) {\n    const { id, status } = bsData;\n    this._deviceRegistrationRequests.next({\n      data: this.updateStatusById(id, status)\n    });\n  }\n\n  list(pageSize = 100) {\n    this._loading.next(true);\n    this._deviceRegistrationRequests.next({ data: [], paging: undefined });\n\n    from(this.deviceRegService.list({ pageSize, withTotalPages: true }))\n      .pipe(\n        takeUntil(this.endSubscriptions),\n        finalize(() => this.limit())\n      )\n      .subscribe(\n        res => {\n          const { data, paging } = res;\n          this.internalListUpdate(data, paging);\n          this._loading.next(false);\n        },\n        err => {\n          this._loading.next(false);\n          this.alertService.addServerFailure(err);\n        }\n      );\n  }\n\n  createMultiple(newDeviceRequests: IDeviceRegistrationCreate[]) {\n    if (newDeviceRequests && newDeviceRequests.length > 0) {\n      this._loading.next(true);\n      const newRequests$ = newDeviceRequests.map(element => {\n        return from(\n          this.deviceRegService.create(element).catch((err: IResult<IDeviceRegistration>) => ({\n            res: err.res,\n            data: { ...err.data, id: element.id }\n          }))\n        );\n      });\n\n      const groupedRequests: {\n        success: IDeviceRegistration[];\n        failed: IDeviceRegistration[];\n      } = {\n        success: [],\n        failed: []\n      };\n\n      return forkJoin(newRequests$).pipe(\n        mergeMap(resp =>\n          resp.map(el => {\n            el.res.ok\n              ? groupedRequests.success.push(el.data)\n              : groupedRequests.failed.push(el.data);\n            return groupedRequests;\n          })\n        ),\n        takeLast(1),\n        finalize(() => {\n          this.internalListUpdate(groupedRequests.success);\n          this._loading.next(false);\n        })\n      );\n    }\n  }\n\n  remove(id: string) {\n    this._loading.next(true);\n    from(this.deviceRegService.delete(id))\n      .pipe(takeUntil(this.endSubscriptions))\n      .subscribe(\n        () => {\n          this._deviceRegistrationRequests.next({\n            data: this.removeDeviceRegistrationRequestById(id)\n          });\n          this._loading.next(false);\n          this.alertService.success(gettext('Device registration cancelled.'));\n        },\n        err => {\n          this._loading.next(false);\n          this.alertService.addServerFailure(err);\n        }\n      );\n  }\n\n  accept(request: IDeviceRegistration) {\n    this._loading.next(true);\n    const payload = pick(request, ['id', 'securityToken']);\n    from(this.deviceRegService.accept(payload))\n      .pipe(takeUntil(this.endSubscriptions))\n      .subscribe(\n        () => {\n          this._deviceRegistrationRequests.next({\n            data: this.removeDeviceRegistrationRequestById(payload.id)\n          });\n          this.limit();\n          this._loading.next(false);\n          this.alertService.success(gettext('Device registration accepted.'));\n        },\n        err => {\n          this._loading.next(false);\n          this.alertService.addServerFailure(err);\n        }\n      );\n  }\n\n  acceptAll() {\n    const acceptedDeviceRequests: IDeviceRegistrationAccept[] = [];\n    const failedDeviceRequests: IDeviceRegistrationAccept[] = [];\n    this._loading.next(true);\n\n    from(this.deviceRegService.acceptAll())\n      .pipe(\n        takeUntil(this.endSubscriptions),\n        map(({ data }) => {\n          data.map(deviceRegistrationRequest => {\n            if (deviceRegistrationRequest.successful) {\n              acceptedDeviceRequests.push(deviceRegistrationRequest);\n              this.removeDeviceRegistrationRequestById(deviceRegistrationRequest.id);\n            } else {\n              failedDeviceRequests.push(deviceRegistrationRequest);\n            }\n          });\n          return data;\n        }),\n        finalize(() => {\n          // update rendered list with successful accepted device registrations\n          // see: this.updateStatusById(...)\n          this.internalListUpdate([]);\n          this.limit();\n          this._loading.next(false);\n          if (failedDeviceRequests.length > 0) {\n            this.alertService.warning(\n              gettext('Could not accept all pending registration requests.'),\n              JSON.stringify(\n                {\n                  failedDeviceRequests,\n                  acceptedDeviceRequests\n                },\n                undefined,\n                2\n              )\n            );\n          } else {\n            this.alertService.success(gettext('Accepted all pending registration requests.'));\n          }\n        })\n      )\n      .subscribe(\n        () => {\n          // empty by design\n        },\n        err => {\n          this._loading.next(false);\n          this.alertService.addServerFailure(err);\n        }\n      );\n  }\n\n  limit() {\n    from(this.deviceRegService.limit())\n      .pipe(takeUntil(this.endSubscriptions))\n      .subscribe(\n        res => this._limit.next(res.data),\n        err => this.alertService.addServerFailure(err)\n      );\n  }\n\n  getRequestByStatus(status: DeviceRegistrationStatus): IDeviceRegistration[] {\n    return this._deviceRegistrationRequests.getValue().data.filter(req => req.status === status);\n  }\n\n  ngOnDestroy(): void {\n    this.endSubscriptions.next();\n    this.endSubscriptions.complete();\n  }\n\n  private updateStatusById(id: string, status: DeviceRegistrationStatus) {\n    const items = this._deviceRegistrationRequests.getValue().data;\n    const matchingElementIndex = items.findIndex(element => element.id === id);\n    if (matchingElementIndex >= 0) {\n      items[matchingElementIndex].status = status;\n    }\n    return items;\n  }\n\n  private removeDeviceRegistrationRequestById(id: string) {\n    const items = this._deviceRegistrationRequests.getValue().data;\n    const matchingElementIndex = items.findIndex(element => element.id === id);\n    if (matchingElementIndex >= 0) {\n      items.splice(matchingElementIndex, 1);\n    }\n    this._loading.next(false);\n    return items;\n  }\n}\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  OnDestroy\n} from '@angular/core';\nimport { FormlyFieldConfig, FormlyFormOptions, FormlyModule } from '@ngx-formly/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  TenantUiService,\n  C8yStepper,\n  memoize,\n  GainsightService,\n  FeatureCacheService,\n  ModalComponent,\n  IconDirective,\n  C8yTranslateDirective,\n  C8yStepperButtons,\n  OperationResultComponent,\n  ListGroupComponent,\n  ListItemComponent,\n  ListItemIconComponent,\n  ListItemCollapseComponent,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { FormArray, FormControl, FormGroup, FormsModule } from '@angular/forms';\nimport { from, Observable, Subject, defer, BehaviorSubject } from 'rxjs';\nimport { filter, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport { IManagedObject, InventoryService, IResultList, ITenant, TenantService } from '@c8y/client';\nimport { RegisterDeviceService } from '../register-device.service';\nimport { CdkStep } from '@angular/cdk/stepper';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\n\nimport { NgClass, AsyncPipe, JsonPipe } from '@angular/common';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\n\ninterface GeneralDeviceRegistrationModelType {\n  id: string;\n  tenant?: { id: string };\n  group?: { id: string; name?: string };\n  oneTimePassword?: string;\n}\n\n@Component({\n  selector: 'c8y-general-device-registration',\n  templateUrl: 'general-device-registration.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    ModalComponent,\n    IconDirective,\n    C8yStepper,\n    CdkStep,\n    C8yTranslateDirective,\n    FormsModule,\n    PopoverDirective,\n    FormlyModule,\n    NgClass,\n    C8yStepperButtons,\n    OperationResultComponent,\n    ListGroupComponent,\n    ListItemComponent,\n    ListItemIconComponent,\n    ListItemCollapseComponent,\n    C8yTranslatePipe,\n    AsyncPipe,\n    JsonPipe\n  ]\n})\nexport class GeneralDeviceRegistrationComponent implements AfterViewInit, OnDestroy {\n  readonly MANAGEMENT = 'management';\n  readonly FILTER: object = {\n    withTotalPages: true,\n    pageSize: 25\n  };\n\n  useEST$ = new BehaviorSubject<boolean>(false);\n  certificateAuthorityFeatureEnabled =\n    this.featureCacheService.getFeatureState('certificate-authority');\n\n  form = new FormGroup({});\n  model = {\n    devicesToCreate: [{} as GeneralDeviceRegistrationModelType]\n  };\n  options: FormlyFormOptions = {\n    formState: {\n      canLoadTenants: true,\n      useEST: this.useEST$.getValue()\n    }\n  };\n\n  PRODUCT_EXPERIENCE = {\n    EVENT: 'deviceRegistration',\n    COMPONENT: 'single-general-registration',\n    RESULT: { SUCCESS: 'registrationSuccess', FAILURE: 'registrationFailure' }\n  };\n\n  isLoading$: Observable<boolean>;\n  success: { id: string }[] = [];\n  failed: { id: string; message?: string; details?: any }[] = [];\n\n  fields: FormlyFieldConfig[] = [\n    {\n      type: 'array',\n      key: 'devicesToCreate',\n      props: {\n        addText: gettext('Add device'),\n        addTextDataCy: 'add-device'\n      },\n      fieldArray: {\n        fieldGroup: [\n          {\n            key: 'id',\n            type: 'string',\n            focus: true,\n            props: {\n              placeholder: '0123ab32fcd',\n              label: gettext('Device ID'),\n              required: true\n            },\n            validators: {\n              unique: {\n                expression: (control: FormControl) => {\n                  const found = (\n                    control.root.get('devicesToCreate') as FormArray<\n                      FormGroup<{ id: FormControl<string> }>\n                    >\n                  ).controls\n                    .map(el => el.controls.id)\n                    .find(el => el !== control && el.value === control.value);\n                  return !found;\n                },\n                message: () => gettext('Device ID duplicates are not allowed')\n              }\n            }\n          },\n          {\n            key: 'tenant',\n            type: 'typeahead',\n            expressions: {\n              hide: field => {\n                const formState = field.options?.formState;\n                if (!formState?.canLoadTenants) {\n                  field.formControl.setValue(null);\n                }\n                return !formState?.canLoadTenants || false;\n              }\n            },\n            defaultValue: { id: this.MANAGEMENT },\n            props: {\n              label: gettext('Add to tenant'),\n              required: true,\n              c8yForOptions: this.canLoadTenants$().pipe(\n                filter(canLoad => canLoad),\n                switchMap(() => this.getTenants$())\n              ) as Observable<IResultList<ITenant>>,\n              container: 'body',\n              displayProperty: 'id',\n              valueProperties: ['id']\n            },\n            hooks: {\n              onInit: _field =>\n                this.canLoadTenants$().pipe(\n                  tap(canLoad => {\n                    this.options.formState.canLoadTenants = canLoad;\n                    this.cd.detectChanges();\n                  })\n                )\n            }\n          },\n          {\n            key: 'group',\n            type: 'typeahead',\n            expressions: {\n              'props.disabled': (field: FormlyFieldConfig) => {\n                const formState = field.options?.formState;\n                const model = field.model;\n                if (formState?.canLoadTenants) {\n                  if (model?.tenant?.id !== this.MANAGEMENT) {\n                    field.formControl.setValue(null);\n                  }\n                  return !(model?.tenant?.id === this.MANAGEMENT);\n                }\n                delete field?.props?.description;\n                return false;\n              }\n            },\n            props: {\n              disabled: false,\n              label: gettext('Add to group'),\n              description: gettext(\n                'You can add device to specific group for management tenant only.'\n              ),\n              container: 'body',\n              displayProperty: 'name',\n              valueProperties: ['id'],\n              c8yForOptions: this.getGroups$()\n            },\n            hooks: {\n              onInit: _field =>\n                this.canLoadTenants$().pipe(\n                  tap(canLoad => {\n                    this.options.formState.canLoadTenants = canLoad;\n                    this.cd.detectChanges();\n                  })\n                )\n            }\n          },\n          {\n            key: 'oneTimePassword',\n            type: 'password',\n            expressions: {\n              hide: field => !field.options?.formState?.useEST\n            },\n            props: {\n              placeholder: 'TruDN3H45L0',\n              label: gettext('One-time password'),\n              required: true\n            },\n            hooks: {\n              onInit: _field =>\n                this.useEST$.pipe(\n                  tap(useEST => {\n                    this.options.formState.useEST = useEST;\n                    this.cd.detectChanges();\n                  })\n                )\n            }\n          }\n        ]\n      }\n    }\n  ];\n\n  result = new Promise<void>((resolve, reject) => {\n    this.onSuccessfulClosing = resolve;\n    this.onCancel = reject;\n  });\n\n  private onSuccessfulClosing: () => void;\n  private onCancel: () => void;\n\n  private destroy$: Subject<void> = new Subject();\n  private lastCreatedDevices: GeneralDeviceRegistrationModelType[] = [];\n\n  constructor(\n    private tenantUIService: TenantUiService,\n    private tenantService: TenantService,\n    private registerDeviceService: RegisterDeviceService,\n    private inventoryService: InventoryService,\n    private cd: ChangeDetectorRef,\n    public bsModalRef: BsModalRef,\n    private gainsightService: GainsightService,\n    private featureCacheService: FeatureCacheService\n  ) {\n    this.isLoading$ = this.registerDeviceService.loading$;\n  }\n\n  ngAfterViewInit() {\n    this.cd.detectChanges();\n  }\n\n  ngOnDestroy() {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  registerDevice(eventObject: { stepper: C8yStepper; step: CdkStep }) {\n    this.create(eventObject);\n  }\n\n  fixErrors(event: { stepper: C8yStepper; step: CdkStep }, failedRequests: any) {\n    if (failedRequests && failedRequests.length > 0) {\n      this.options.resetModel({\n        devicesToCreate: [\n          ...this.lastCreatedDevices.filter(el =>\n            failedRequests.map(data => data.id).includes(el.id)\n          )\n        ]\n      });\n      this.cd.detectChanges();\n    }\n    event?.stepper.previous();\n  }\n\n  close() {\n    this.bsModalRef.hide();\n    this.onSuccessfulClosing();\n  }\n\n  cancel() {\n    this.bsModalRef.hide();\n    this.onCancel();\n  }\n\n  private create(eventObject: { stepper: C8yStepper; step: CdkStep }) {\n    if (this.model?.devicesToCreate?.length > 0) {\n      this.lastCreatedDevices = [...this.model.devicesToCreate];\n\n      const dataToSend = this.model.devicesToCreate.map(\n        (el: GeneralDeviceRegistrationModelType) => {\n          const { id, tenant, group, oneTimePassword } = el;\n          let data: { id: string; tenantId?: string; groupId?: string; enrollmentToken?: string } =\n            { id };\n\n          if (tenant?.id) {\n            data = { ...data, tenantId: tenant.id };\n          }\n\n          if (group?.id) {\n            data = { ...data, groupId: group.id };\n          }\n\n          if (oneTimePassword) {\n            data = { ...data, enrollmentToken: oneTimePassword };\n          }\n\n          return data;\n        }\n      );\n\n      this.registerDeviceService\n        .createMultiple(dataToSend)\n        .pipe(takeUntil(this.destroy$))\n        .subscribe(requests => {\n          this.success = requests.success ?? [];\n          if (this.success.length > 0) {\n            this.gainsightService.triggerEvent(this.PRODUCT_EXPERIENCE.EVENT, {\n              result: this.PRODUCT_EXPERIENCE.RESULT.SUCCESS,\n              component: this.PRODUCT_EXPERIENCE.COMPONENT\n            });\n          }\n\n          this.failed = requests.failed ?? [];\n          if (this.failed.length > 0) {\n            this.gainsightService.triggerEvent(this.PRODUCT_EXPERIENCE.EVENT, {\n              result: this.PRODUCT_EXPERIENCE.RESULT.FAILURE,\n              component: this.PRODUCT_EXPERIENCE.COMPONENT\n            });\n          }\n\n          if (eventObject) {\n            eventObject.stepper.next();\n          }\n        });\n    }\n  }\n\n  @memoize()\n  private canLoadTenants$(): Observable<boolean> {\n    return defer(() => from(this.tenantUIService.isManagementTenant())).pipe(shareReplay(1));\n  }\n\n  @memoize()\n  private getTenants$(): Observable<IResultList<ITenant>> {\n    return defer(() => from(this.tenantService.list(this.FILTER))).pipe(shareReplay(1));\n  }\n\n  @memoize()\n  private getGroups$(): Observable<IResultList<IManagedObject>> {\n    return defer(() =>\n      from(\n        this.inventoryService.listQuery(\n          { __filter: { __has: 'c8y_IsDeviceGroup' }, __orderby: [{ name: 1 }] },\n          { ...this.FILTER }\n        )\n      )\n    ).pipe(shareReplay(1));\n  }\n}\n","<c8y-modal\n  [title]=\"'Register devices' | translate\"\n  [headerClasses]=\"'dialog-header'\"\n  [customFooter]=\"true\"\n>\n  <ng-container c8y-modal-title>\n    <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n  </ng-container>\n  <c8y-stepper\n    [hideStepProgress]=\"true\"\n    linear\n    c8y-modal-body\n  >\n    <cdk-step [stepControl]=\"form\">\n      <div class=\"text-center sticky-top bg-component\">\n        <p\n          class=\"text-medium text-16 separator-bottom p-16\"\n          translate\n        >\n          Register general devices\n        </p>\n        @if (certificateAuthorityFeatureEnabled | async) {\n          <label\n            class=\"c8y-switch m-24 a-i-center\"\n            title=\"{{ 'Create device certificates during device registration' | translate }}\"\n            for=\"useEST\"\n          >\n            <input\n              id=\"useEST\"\n              name=\"useEST\"\n              type=\"checkbox\"\n              [ngModel]=\"useEST$.getValue()\"\n              (ngModelChange)=\"useEST$.next($event)\"\n            />\n            <span></span>\n            <span class=\"control-label\">\n              {{ 'Create device certificates during device registration' | translate }}\n            </span>\n            <button\n              class=\"btn-help\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{\n                'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).'\n                  | translate\n              }}\"\n              placement=\"right\"\n              triggers=\"focus\"\n              container=\"body\"\n              type=\"button\"\n            ></button>\n          </label>\n        }\n      </div>\n      <div>\n        <formly-form\n          class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n          [form]=\"form\"\n          [fields]=\"fields\"\n          [model]=\"model\"\n          [options]=\"options\"\n          [ngClass]=\"{ 'p-t-24': !(certificateAuthorityFeatureEnabled | async) }\"\n        ></formly-form>\n      </div>\n      <c8y-stepper-buttons\n        class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n        (onNext)=\"registerDevice($event)\"\n        (onCancel)=\"cancel()\"\n        [showButtons]=\"{ cancel: true, next: true }\"\n        [disabled]=\"!form?.valid\"\n        [pending]=\"isLoading$ | async\"\n      ></c8y-stepper-buttons>\n    </cdk-step>\n    <cdk-step state=\"final\">\n      <div class=\"p-24 min-height-fit\">\n        @if (success.length === 1 && failed.length === 0) {\n          <c8y-operation-result\n            class=\"lead\"\n            type=\"success\"\n            text=\"{{ 'Device registered' | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n          ></c8y-operation-result>\n        } @else if (success.length === 0 && failed.length === 1) {\n          <c8y-operation-result\n            class=\"lead\"\n            type=\"error\"\n            text=\"{{ 'Failed to register device' | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n          ></c8y-operation-result>\n        } @else if (success.length > 1 && failed.length === 0) {\n          <c8y-operation-result\n            class=\"lead\"\n            type=\"success\"\n            [text]=\"\n              '{{ successfulDevicesCount }} devices registered'\n                | translate: { successfulDevicesCount: success.length }\n            \"\n            [size]=\"84\"\n            [vertical]=\"true\"\n          ></c8y-operation-result>\n        } @else if (success.length === 0 && failed.length > 1) {\n          <c8y-operation-result\n            class=\"lead\"\n            type=\"error\"\n            [text]=\"\n              '{{ failedDevicesCount }} devices failed to register'\n                | translate: { failedDevicesCount: failed.length }\n            \"\n            [size]=\"84\"\n            [vertical]=\"true\"\n          ></c8y-operation-result>\n        } @else if (success.length > 0 && failed.length > 0) {\n          <div\n            class=\"p-l-24 p-r-24 text-center\"\n            data-cy=\"device-registration-failure-message\"\n          >\n            <c8y-operation-result\n              class=\"lead\"\n              type=\"error\"\n              text=\"{{ 'Several devices failed to register' | translate }}\"\n              [size]=\"84\"\n              [vertical]=\"true\"\n            ></c8y-operation-result>\n            <p\n              class=\"p-b-16 text-danger\"\n              ngNonBindable\n              translate\n              [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n            >\n              Registration failed for {{ count }} devices out of {{ total }}.\n            </p>\n          </div>\n        }\n\n        @if (success.length > 0) {\n          <div\n            class=\"m-b-8 p-l-24 p-r-24\"\n            data-cy=\"device-registration-success-message\"\n          >\n            @if (!(useEST$ | async)) {\n              <span translate>\n                Turn on the registered devices and wait for connections to be established. Once a\n                device is connected, its status will change to \"Pending acceptance\". You will need\n                to approve it by clicking on the \"Accept\" button.\n              </span>\n            } @else {\n              <span translate>\n                The successfully enrolled devices can now request signed certificates and use them\n                to connect and authenticate to the platform via certificate-based authentication.\n              </span>\n            }\n          </div>\n        }\n\n        <c8y-list-group class=\"separator-top m-t-16\">\n          @for (fail of failed; track $index) {\n            <c8y-li>\n              <c8y-li-icon\n                class=\"text-danger\"\n                [icon]=\"'ban'\"\n              ></c8y-li-icon>\n              <p>{{ fail?.id }}</p>\n              <small>{{ fail?.message | translate }}</small>\n              <c8y-li-collapse>\n                <pre><code>{{ fail?.details | json }}</code></pre>\n              </c8y-li-collapse>\n            </c8y-li>\n          }\n\n          @for (s of success; track $index) {\n            <c8y-li>\n              <c8y-li-icon\n                class=\"text-success\"\n                [icon]=\"'check-circle'\"\n              ></c8y-li-icon>\n              {{ s?.id }}\n            </c8y-li>\n          }\n        </c8y-list-group>\n      </div>\n      <c8y-stepper-buttons\n        class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n        (onCustom)=\"close()\"\n        (onBack)=\"fixErrors($event, failed)\"\n        [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n        [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n      ></c8y-stepper-buttons>\n    </cdk-step>\n  </c8y-stepper>\n</c8y-modal>\n","import { inject, Injectable } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { GeneralDeviceRegistrationComponent } from './general-device-registration.component';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class GeneralDeviceRegistrationService {\n  private modalService = inject(BsModalService);\n\n  async open(initialState?: Partial<GeneralDeviceRegistrationComponent>) {\n    const modalRef = this.modalService.show(GeneralDeviceRegistrationComponent, {\n      class: 'modal-lg',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      ignoreBackdropClick: true,\n      initialState: {\n        ...initialState\n      }\n    });\n\n    return await modalRef.content.result;\n  }\n}\n","import { Component } from '@angular/core';\nimport { GeneralDeviceRegistrationService } from './general-device-registration.service';\nimport { IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-general-device-registration-button',\n  templateUrl: 'general-device-registration-button.component.html',\n  imports: [IconDirective, C8yTranslatePipe]\n})\nexport class GeneralDeviceRegistrationButtonComponent {\n  constructor(private registrationService: GeneralDeviceRegistrationService) {}\n\n  async open() {\n    try {\n      await this.registrationService.open();\n    } catch {\n      // modal was closed\n    }\n  }\n}\n","<button title=\"{{ 'General' | translate }}\" type=\"button\" (click)=\"open()\">\n  <i c8yIcon=\"c8y-device-connect\"></i>\n  {{ 'General' | translate }}\n</button>\n","import { Injectable, InjectionToken, Injector } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n  ExtensionFactory,\n  ExtensionPointWithoutStateForPlugins,\n  fromTriggerOnce,\n  GenericHookType,\n  hookGeneric,\n  PluginsResolveService,\n  GenericHookOptions\n} from '@c8y/ngx-components';\nimport { flatten } from 'lodash';\nimport { Observable } from 'rxjs';\nimport { shareReplay, startWith } from 'rxjs/operators';\nimport { RegisterDeviceItem } from './RegisterDeviceItem';\n\n/**\n * An extension HOOK can use either a pure value:\n * ```typescript\n *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }\n * ```\n *\n * Or an array to directly register multiple:\n * ```typescript\n *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }\n * ```\n *\n * Or an ExtensionFactory which allows to define a get() function. This function\n * gets called on each navigation with the current route and can return values\n * async (observable or promise).\n * ```typescript\n *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }\n * ```\n */\nexport type RegisterDeviceExtension =\n  | RegisterDeviceItem\n  | RegisterDeviceItem[]\n  | ExtensionFactory<RegisterDeviceItem>;\n/**\n * A hook to use for Multi Provider extension.\n * @deprecated Consider using the `hookDeviceRegistration` function instead.\n */\nexport const HOOK_DEVICE_REGISTRATION = new InjectionToken<RegisterDeviceExtension>(\n  'HOOK_DEVICE_REGISTRATION'\n);\n\n/**\n * You can either provide a single `RegisterDeviceExtension` as parameter:\n * ```typescript\n *  hookDeviceRegistration(...)\n * ```\n *\n * Or an array to directly register multiple:\n * ```typescript\n *  hookDeviceRegistration([...])\n * ```\n *\n * Or you provide an Service that implements `ExtensionFactory<RegisterDeviceExtension>`\n * ```typescript\n *  export class MyDeviceRegistrationFactory implements ExtensionFactory<RegisterDeviceExtension> {...}\n *  ...\n *  hookDeviceRegistration(MyDeviceRegistrationFactory)\n * ```\n * A typed alternative to `HOOK_DEVICE_REGISTRATION`.\n * @param registration The `RegisterDeviceExtension`'s or `ExtensionFactory` to be provided.\n * @returns An `Provider` to be provided in your module.\n */\nexport function hookDeviceRegistration(\n  registration: GenericHookType<RegisterDeviceExtension>,\n  options?: Partial<GenericHookOptions>\n) {\n  return hookGeneric<RegisterDeviceExtension>(registration, HOOK_DEVICE_REGISTRATION, options);\n}\n\n/**\n * A service which defines device registration options.\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class RegisterDeviceExtensionService extends ExtensionPointWithoutStateForPlugins<RegisterDeviceItem> {\n  constructor(\n    rootInjector: Injector,\n    private router: Router,\n    plugins: PluginsResolveService\n  ) {\n    super(rootInjector, plugins);\n    this.items$ = this.setupItemsObservable();\n  }\n\n  protected setupItemsObservable(): Observable<RegisterDeviceItem[]> {\n    return fromTriggerOnce<RegisterDeviceItem>(this.router, this.refresh$, [\n      () =>\n        flatten(\n          this.injectors.map(injector => injector.get(HOOK_DEVICE_REGISTRATION, [], { self: true }))\n        ),\n      () => this.factories\n    ]).pipe(startWith([]), shareReplay(1));\n  }\n}\n","import { Component } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { RegisterDeviceService } from '../register-device.service';\nimport { RegisterDeviceExtensionService } from './register-device-extension.service';\nimport {\n  BsDropdownDirective,\n  BsDropdownToggleDirective,\n  BsDropdownMenuDirective\n} from 'ngx-bootstrap/dropdown';\nimport { NgIf, NgTemplateOutlet, NgFor, AsyncPipe } from '@angular/common';\nimport {\n  C8yTranslateDirective,\n  IconDirective,\n  OutletDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-register-device-dropdown',\n  templateUrl: './register-device-dropdown.component.html',\n  imports: [\n    BsDropdownDirective,\n    NgIf,\n    BsDropdownToggleDirective,\n    C8yTranslateDirective,\n    IconDirective,\n    BsDropdownMenuDirective,\n    NgTemplateOutlet,\n    NgFor,\n    OutletDirective,\n    C8yTranslatePipe,\n    AsyncPipe\n  ]\n})\nexport class RegisterDeviceDropdownComponent {\n  single$ = this.registerDeviceExtensionService.items$.pipe(\n    map(items =>\n      items.filter(item => item.category === 'single').sort((a, b) => b.priority - a.priority)\n    )\n  );\n\n  bulk$ = this.registerDeviceExtensionService.items$.pipe(\n    map(items =>\n      items.filter(item => item.category === 'bulk').sort((a, b) => b.priority - a.priority)\n    )\n  );\n\n  limit$: Observable<boolean> = this.registerDeviceService.limit$.pipe(\n    map(limit => limit.isReached)\n  );\n\n  constructor(\n    private registerDeviceExtensionService: RegisterDeviceExtensionService,\n    private registerDeviceService: RegisterDeviceService\n  ) {}\n}\n","<div class=\"dropdown\" dropdown>\n  <button\n    *ngIf=\"!(limit$ | async); else disable\"\n    title=\"{{ 'Register device' | translate }}\"\n    type=\"button\"\n    class=\"dropdown-toggle c8y-dropdown d-flex a-i-center\"\n    dropdownToggle\n    aria-haspopup=\"true\"\n    data-cy=\"register-device--dropdown-button\"\n  >\n    <span class=\"text-truncate\" translate>Register device</span>\n    <i [c8yIcon]=\"'caret-down'\" class=\"m-l-4 text-primary\"></i>\n  </button>\n  <ng-template #disable>\n    <button\n      title=\"{{ 'Device registration disabled' | translate }}\"\n      type=\"button\"\n      class=\"btn btn-clean d-flex p-l-8\"\n      disabled\n    >\n      <span class=\"text-truncate\" translate>Register device</span>\n      <i [c8yIcon]=\"'caret-down'\"></i>\n    </button>\n  </ng-template>\n\n  <!-- dropdown for normal screen sizes -->\n  <ul class=\"dropdown-menu dropdown-menu-right hidden-xs\" data-cy=\"register-device--dropdown\" *dropdownMenu>\n    <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n  </ul>\n\n  <!-- fake dropdown for mobile screen sizes. *dropdownMenu is missing by design! -->\n  <ul class=\"dropdown-menu dropdown-menu visible-xs\">\n    <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n  </ul>\n\n  <ng-template #dropdown>\n    <ng-container *ngIf=\"single$ | async as single\">\n      <li class=\"dropdown-header\" *ngIf=\"single.length > 0\" translate data-cy=\"single-group\">Single registration</li>\n      <li *ngFor=\"let item of single\">\n        <ng-container *c8yOutlet=\"item.template\"></ng-container>\n      </li>\n    </ng-container>\n    <ng-container *ngIf=\"bulk$ | async as bulk\">\n      <li class=\"dropdown-header\" *ngIf=\"bulk.length > 0\" translate data-cy=\"bulk-group\">Bulk registration</li>\n      <li *ngFor=\"let item of bulk\">\n        <ng-container *c8yOutlet=\"item.template\"></ng-container>\n      </li>\n    </ng-container>\n  </ng-template>\n</div>\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport {\n  DeviceRegistrationSecurityMode,\n  DeviceRegistrationStatus,\n  IDeviceRegistration,\n  IDeviceRegistrationLimit,\n  Paging\n} from '@c8y/client';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { filter, map, switchMap, takeUntil } from 'rxjs/operators';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  DeviceBootstrapRealtimeService,\n  IRealtimeDeviceBootstrap,\n  TenantUiService,\n  ModalService,\n  Status,\n  OptionsService,\n  TitleComponent,\n  BreadcrumbComponent,\n  BreadcrumbItemComponent,\n  ActionBarItemComponent,\n  ListDisplaySwitchComponent,\n  IfAllowedDirective,\n  IconDirective,\n  HelpComponent,\n  C8yTranslateDirective,\n  RequiredInputPlaceholderDirective,\n  LoadMoreComponent,\n  C8yTranslatePipe,\n  DatePipe\n} from '@c8y/ngx-components';\nimport { RegisterDeviceService } from './register-device.service';\nimport { sortBy } from 'lodash-es';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { GeneralDeviceRegistrationService } from './general/general-device-registration.service';\nimport { NgIf, NgClass, NgFor, AsyncPipe } from '@angular/common';\nimport { RegisterDeviceDropdownComponent } from './dropdown/register-device-dropdown.component';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n  selector: 'c8y-device-registration-view',\n  templateUrl: 'device-registration-view.component.html',\n  imports: [\n    NgIf,\n    TitleComponent,\n    BreadcrumbComponent,\n    BreadcrumbItemComponent,\n    ActionBarItemComponent,\n    ListDisplaySwitchComponent,\n    IfAllowedDirective,\n    IconDirective,\n    NgClass,\n    RegisterDeviceDropdownComponent,\n    HelpComponent,\n    C8yTranslateDirective,\n    PopoverDirective,\n    NgFor,\n    FormsModule,\n    RequiredInputPlaceholderDirective,\n    LoadMoreComponent,\n    C8yTranslatePipe,\n    AsyncPipe,\n    DatePipe\n  ]\n})\nexport class DeviceRegistrationViewComponent implements OnInit, OnDestroy {\n  deviceRequests$: Observable<{\n    data: IDeviceRegistration[];\n    paging?: Paging<IDeviceRegistration>;\n  }>;\n  limit$: Observable<IDeviceRegistrationLimit>;\n  limitReachedInfo$: Observable<string>;\n  requireSecurityToken = false;\n  isManagementTenant = false;\n  isLoading = false;\n  gridOrList: 'interact-list' | 'interact-grid' = 'interact-grid';\n  status = DeviceRegistrationStatus;\n\n  readonly statusProps = {\n    [DeviceRegistrationStatus.WAITING_FOR_CONNECTION]: {\n      label: gettext('Waiting for connection'),\n      icon: 'unlink',\n      cls: 'text-danger'\n    },\n    [DeviceRegistrationStatus.PENDING_ACCEPTANCE]: {\n      label: gettext('Pending acceptance'),\n      icon: 'circle',\n      cls: 'text-info'\n    },\n    [DeviceRegistrationStatus.ACCEPTED]: {\n      label: gettext('Accepted'),\n      icon: 'check-circle',\n      cls: 'text-success'\n    },\n    [DeviceRegistrationStatus.BLOCKED]: {\n      label: gettext('Blocked'),\n      icon: 'ban',\n      cls: 'text-danger'\n    }\n  };\n\n  private unsubscribe$: Subject<void> = new Subject();\n  private readonly _securityTokenPolicy: BehaviorSubject<DeviceRegistrationSecurityMode> =\n    new BehaviorSubject(DeviceRegistrationSecurityMode.OPTIONAL);\n\n  constructor(\n    private registerDeviceService: RegisterDeviceService,\n    private bootstrapRealtimeService: DeviceBootstrapRealtimeService,\n    private tenantUiService: TenantUiService,\n    private modalService: ModalService,\n    private translateService: TranslateService,\n    private optionsService: OptionsService,\n    private activatedRoute: ActivatedRoute,\n    private generalRegistration: GeneralDeviceRegistrationService\n  ) {}\n\n  ngOnInit() {\n    this.loadAll();\n    this.setIsManagementTenant();\n    this.setRequireSecurityToken();\n\n    this.deviceRequests$ = this.registerDeviceService.deviceRegistrationRequests$.pipe(\n      map(req => ({\n        data: sortBy(req.data, [\n          ({ status }) => (status === DeviceRegistrationStatus.PENDING_ACCEPTANCE ? 0 : 1),\n          '-creationTime'\n        ]),\n        paging: req.paging\n      }))\n    );\n    this.limit$ = this.registerDeviceService.limit$;\n    this.limitReachedInfo$ = this.limit$.pipe(\n      filter(deviceRegistrationLimit => deviceRegistrationLimit.isReached),\n      switchMap(({ limit }) =>\n        this.translateService.stream(\n          gettext(\n            'You reached the limit of {{ maxDevices }} devices. No more devices can be registered.'\n          ),\n          { maxDevices: limit }\n        )\n      )\n    );\n    this.registerDeviceService.loading$\n      .pipe(takeUntil(this.unsubscribe$))\n      .subscribe(value => (this.isLoading = value));\n\n    this.bootstrapRealtimeService\n      .onUpdate$()\n      .pipe(takeUntil(this.unsubscribe$))\n      .subscribe((bootstrap: IRealtimeDeviceBootstrap) => {\n        this.registerDeviceService.onDeviceBootstrap(bootstrap);\n      });\n\n    this.handleQueryParams();\n  }\n\n  ngOnDestroy() {\n    this.unsubscribe$.next();\n    this.unsubscribe$.complete();\n  }\n\n  updateList(data) {\n    this.registerDeviceService.internalListUpdate(data);\n  }\n\n  async handleQueryParams() {\n    const { externalId, 'one-time-password': oneTimePassword } =\n      this.activatedRoute.snapshot.queryParams;\n\n    if (!externalId) {\n      return;\n    }\n    try {\n      await this.generalRegistration.open({\n        useEST$: new BehaviorSubject<boolean>(!!oneTimePassword),\n        model: {\n          devicesToCreate: [\n            {\n              id: externalId,\n              oneTimePassword\n            }\n          ]\n        }\n      });\n      this.loadAll();\n    } catch (e) {\n      // modal closed\n    }\n  }\n\n  async delete(id: string) {\n    const confirmed = await this.modalService.confirm(\n      gettext('Cancel device registration'),\n      this.translateService.instant(\n        gettext(\n          'You are about to cancel device registration for ID \"{{id}}\". Do you want to proceed?'\n        ),\n        { id }\n      ),\n      Status.DANGER,\n      {\n        ok: gettext('Cancel registration'),\n        cancel: gettext('Close')\n      }\n    );\n\n    if (confirmed) {\n      this.registerDeviceService.remove(id);\n    }\n  }\n\n  accept(request: IDeviceRegistration) {\n    this.registerDeviceService.accept(request);\n  }\n\n  acceptAll() {\n    this.registerDeviceService.acceptAll();\n  }\n\n  canAcceptAll() {\n    const pendingRequests = this.registerDeviceService.getRequestByStatus(\n      DeviceRegistrationStatus.PENDING_ACCEPTANCE\n    );\n    return !(pendingRequests.length > 0 && !this.requireSecurityToken);\n  }\n\n  loadAll() {\n    this.registerDeviceService.list();\n  }\n\n  displayMode(listClass: 'interact-list' | 'interact-grid') {\n    this.gridOrList = listClass;\n  }\n\n  async setRequireSecurityToken() {\n    const mode: DeviceRegistrationSecurityMode =\n      (await this.optionsService.getTenantOption<DeviceRegistrationSecurityMode>(\n        'device-registration',\n        'security-token.policy',\n        DeviceRegistrationSecurityMode.OPTIONAL\n      )) as DeviceRegistrationSecurityMode;\n    this._securityTokenPolicy.next(mode);\n    this.requireSecurityToken = mode === DeviceRegistrationSecurityMode.REQUIRED;\n  }\n\n  async setIsManagementTenant() {\n    this.isManagementTenant = await this.tenantUiService.isManagementTenant();\n  }\n\n  shouldShowSecurityTokenInput(data: IDeviceRegistration) {\n    return (\n      data &&\n      data.status === DeviceRegistrationStatus.PENDING_ACCEPTANCE &&\n      this.showTokenInputBasedOnSecurityMode()\n    );\n  }\n\n  showTokenInputBasedOnSecurityMode() {\n    return this._securityTokenPolicy.getValue() !== DeviceRegistrationSecurityMode.IGNORED;\n  }\n}\n","<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n  <c8y-title>\n    {{ 'Device registration' | translate }}\n    <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n    <small *ngIf=\"deviceRequestList.data.length > 1\">\n      {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n    </small>\n  </c8y-title>\n\n  <c8y-breadcrumb>\n    <c8y-breadcrumb-item\n      [icon]=\"'exchange'\"\n      [label]=\"'Devices' | translate\"\n    ></c8y-breadcrumb-item>\n    <c8y-breadcrumb-item\n      [icon]=\"'c8y-device-connect'\"\n      [label]=\"'Device registration' | translate\"\n    ></c8y-breadcrumb-item>\n  </c8y-breadcrumb>\n\n  <c8y-action-bar-item\n    [placement]=\"'left'\"\n    itemClass=\"navbar-form hidden-xs\"\n  >\n    <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n  </c8y-action-bar-item>\n\n  <ng-container *ngIf=\"limit$ | async as limitStatus\">\n    <c8y-action-bar-item\n      [placement]=\"'right'\"\n      [priority]=\"10\"\n    >\n      <button\n        class=\"btn btn-link\"\n        title=\"{{ 'Accept all' | translate }}\"\n        type=\"button\"\n        *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n        (click)=\"acceptAll()\"\n        [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n      >\n        <i [c8yIcon]=\"'check'\"></i>\n        {{ 'Accept all' | translate }}\n      </button>\n    </c8y-action-bar-item>\n\n    <c8y-action-bar-item\n      [placement]=\"'right'\"\n      [priority]=\"9\"\n    >\n      <button\n        class=\"btn btn-link\"\n        title=\"{{ 'Reload' | translate }}\"\n        type=\"button\"\n        (click)=\"loadAll()\"\n        [disabled]=\"isLoading\"\n      >\n        <i\n          [c8yIcon]=\"'refresh'\"\n          [ngClass]=\"{ 'icon-spin': isLoading }\"\n        ></i>\n        {{ 'Reload' | translate }}\n      </button>\n    </c8y-action-bar-item>\n\n    <c8y-action-bar-item\n      [placement]=\"'right'\"\n      *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n    >\n      <c8y-register-device-dropdown></c8y-register-device-dropdown>\n    </c8y-action-bar-item>\n\n    <c8y-help\n      src=\"/docs/device-management-application/registering-devices/#registering-devices\"\n    ></c8y-help>\n\n    <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n      <div\n        class=\"card-group\"\n        [ngClass]=\"gridOrList\"\n      >\n        <!-- START interact-list sticky header START -->\n        <div\n          class=\"page-sticky-header hidden-xs\"\n          *ngIf=\"gridOrList === 'interact-list'\"\n        >\n          <div class=\"d-flex\">\n            <div class=\"card-header p-l-40\">\n              <p translate>Device</p>\n            </div>\n            <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n              <p translate>Status</p>\n            </div>\n            <div\n              class=\"card-block card-column-30 p-0\"\n              *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n            >\n              <p translate>Security token</p>\n              <button\n                class=\"btn-help\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{\n                  'Security token is required if the connected device uses it.' | translate\n                }}\"\n                placement=\"right\"\n                triggers=\"focus\"\n                container=\"body\"\n                type=\"button\"\n              ></button>\n            </div>\n            <div class=\"card-footer card-column-50\">\n              <div\n                class=\"d-contents\"\n                *ngIf=\"isManagementTenant; else noManagement\"\n              >\n                <div class=\"card-column-50\">\n                  {{ 'Created' | translate }}\n                </div>\n                <div class=\"card-column-30\">\n                  {{ 'By`user`' | translate }}\n                </div>\n                <div class=\"card-column-20\">\n                  {{ 'Tenant ID' | translate }}\n                </div>\n              </div>\n              <ng-template #noManagement>\n                <div class=\"d-contents\">\n                  <div class=\"card-column-50\">\n                    {{ 'Created' | translate }}\n                  </div>\n                  <div class=\"card-column-50\">\n                    {{ 'By`user`' | translate }}\n                  </div>\n                </div>\n              </ng-template>\n            </div>\n            <div\n              class=\"card-actions-group\"\n              style=\"min-width: 176px\"\n            >\n              <div class=\"btn btn-xs invisible\">\n                <!--EMPTY by design-->\n              </div>\n            </div>\n          </div>\n        </div>\n        <!-- END interact-list sticky header END -->\n\n        <div\n          class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\"\n          *ngIf=\"limitStatus?.isReached\"\n        >\n          <p\n            class=\"alert alert-warning center-block\"\n            role=\"alert\"\n          >\n            <strong>\n              {{ limitReachedInfo$ | async }}\n            </strong>\n            <br />\n            <span translate>Please contact your platform administrator.</span>\n          </p>\n        </div>\n\n        <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n          <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n            <div class=\"card\">\n              <div class=\"card-header separator\">\n                <div class=\"card-icon\">\n                  <i\n                    [class]=\"statusProps[singleRequest.status].cls\"\n                    [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n                  ></i>\n                </div>\n                <p\n                  class=\"card-title text-truncate\"\n                  title=\"{{ singleRequest.id }}\"\n                >\n                  {{ singleRequest.id }}\n                </p>\n              </div>\n\n              <div class=\"card-block text-center card-column-30\">\n                <span\n                  class=\"text-label-small\"\n                  translate\n                >\n                  Status\n                </span>\n                <p>\n                  <i\n                    class=\"icon-spin text-primary\"\n                    c8yIcon=\"refresh\"\n                    *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n                  ></i>\n                  {{ statusProps[singleRequest.status].label | translate }}\n                </p>\n              </div>\n\n              <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n                <div\n                  class=\"card-block text-center card-column-30 p-t-0\"\n                  [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n                  *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n                >\n                  <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n                    <span\n                      class=\"text-label-small\"\n                      *ngIf=\"gridOrList !== 'interact-list'\"\n                      translate\n                    >\n                      Security token\n                    </span>\n                    <input\n                      class=\"form-control\"\n                      type=\"text\"\n                      [(ngModel)]=\"singleRequest.securityToken\"\n                      [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n                      [required]=\"requireSecurityToken\"\n                    />\n                  </ng-container>\n                </div>\n\n                <div\n                  class=\"card-actions-group d-flex a-i-center j-c-center\"\n                  style=\"min-width: 176px\"\n                >\n                  <button\n                    class=\"btn btn-sm\"\n                    title=\"{{\n                      singleRequest.status === status.PENDING_ACCEPTANCE\n                        ? ('Remove' | translate)\n                        : ('Cancel' | translate)\n                    }}\"\n                    type=\"button\"\n                    [ngClass]=\"{\n                      'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n                      'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n                    }\"\n                    (click)=\"delete(singleRequest.id)\"\n                    [disabled]=\"isLoading\"\n                  >\n                    <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n                      {{ 'Remove' | translate }}\n                    </span>\n                    <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n                      {{ 'Cancel' | translate }}\n                    </span>\n                  </button>\n                  <button\n                    class=\"btn btn-primary btn-sm\"\n                    title=\"{{ 'Accept' | translate }}\"\n                    type=\"button\"\n                    (click)=\"accept(singleRequest)\"\n                    *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n                    [disabled]=\"\n                      isLoading ||\n                      limitStatus?.isReached ||\n                      (!singleRequest.securityToken && requireSecurityToken)\n                    \"\n                  >\n                    {{ 'Accept' | translate }}\n                  </button>\n                </div>\n              </ng-container>\n\n              <div class=\"card-footer separator text-center card-column-50\">\n                <small\n                  class=\"d-contents\"\n                  *ngIf=\"isManagementTenant; else noManagement\"\n                >\n                  <div\n                    class=\"d-contents\"\n                    *ngIf=\"singleRequest.creationTime && singleRequest.owner\"\n                  >\n                    <span class=\"card-column-50\">\n                      <span\n                        class=\"text-label-small m-l-4 m-r-4\"\n                        translate\n                      >\n                        Created on`date`\n                      </span>\n                      <span data-cy=\"device-registration--creation-date\">\n                        {{ singleRequest.creationTime | c8yDate }}\n                      </span>\n                    </span>\n                    <span class=\"card-column-30 text-truncate\">\n                      <span\n                        class=\"text-label-small m-l-4 m-r-4\"\n                        translate\n                      >\n                        by`user`\n                      </span>\n                      <span\n                        title=\"{{ singleRequest.owner }}\"\n                        data-cy=\"device-registration--created-by\"\n                      >\n                        {{ singleRequest.owner }}\n                      </span>\n                    </span>\n                    <span class=\"card-column-20\">\n                      <span\n                        class=\"text-label-small m-l-4 m-r-4\"\n                        translate\n                      >\n                        in`tenant`\n                      </span>\n                      <span>{{ singleRequest.tenantId }}</span>\n                    </span>\n                  </div>\n                  <div\n                    class=\"d-contents\"\n                    *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n                  >\n                    <div class=\"card-column-50\"></div>\n                    <div class=\"card-column-30\"></div>\n                    <span\n                      class=\"text-label-small\"\n                      translate\n                    >\n                      Created in`tenant`\n                    </span>\n                    <div class=\"card-column-20\">\n                      <span>\n                        {{ singleRequest.tenantId }}\n                      </span>\n                    </div>\n                  </div>\n                </small>\n                <ng-template #noManagement>\n                  <small class=\"d-contents\">\n                    <span class=\"card-column-50\">\n                      <span\n                        class=\"text-label-small m-l-4 m-r-4\"\n                        translate\n                      >\n                        Created on`date`\n                      </span>\n                      <span data-cy=\"device-registration--creation-date\">\n                        {{ singleRequest.creationTime | c8yDate }}\n                      </span>\n                    </span>\n                    <span class=\"card-column-50 text-truncate\">\n                      <span\n                        class=\"text-label-small m-l-4 m-r-4\"\n                        translate\n                      >\n                        by`user`\n                      </span>\n                      <span\n                        title=\"{{ singleRequest.owner }}\"\n                        data-cy=\"device-registration--created-by\"\n                      >\n                        {{ singleRequest.owner }}\n                      </span>\n                    </span>\n                  </small>\n                </ng-template>\n              </div>\n            </div>\n          </div>\n        </ng-container>\n      </div>\n      <c8y-load-more\n        [paging]=\"deviceRequestList.paging\"\n        [hidden]=\"true\"\n        (onLoad)=\"updateList($event)\"\n      ></c8y-load-more>\n    </ng-container>\n\n    <ng-template #noData>\n      <div class=\"c8y-empty-state m-t-40 text-center\">\n        <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n        <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n          <h3>\n            {{ limitReachedInfo$ | async }}\n          </h3>\n          <p translate>Please contact your platform administrator.</p>\n        </ng-container>\n        <ng-template #limitNotReached>\n          <h3 translate>No pending registrations to display.</h3>\n          <p\n            *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n            translate\n          >\n            Use the \"Register device\" dropdown in the top right corner.\n          </p>\n        </ng-template>\n      </div>\n    </ng-template>\n  </ng-container>\n</ng-container>\n","import { Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { NavigatorNode, NavigatorNodeFactory, Permissions } from '@c8y/ngx-components';\n\n@Injectable()\nexport class RegisterDeviceNavigationFactory implements NavigatorNodeFactory {\n  constructor(private permissions: Permissions) {}\n  get() {\n    const userHasPermission = this.permissions.hasAnyRole([\n      Permissions.ROLE_DEVICE_CONTROL_ADMIN,\n      Permissions.ROLE_DEVICE_CONTROL_READ\n    ]);\n    const nav: NavigatorNode[] = [];\n    if (userHasPermission) {\n      nav.push(\n        new NavigatorNode({\n          label: gettext('Registration'),\n          icon: 'c8y-device-connect',\n          path: '/deviceregistration',\n          parent: gettext('Devices'),\n          preventDuplicates: true,\n          priority: 3000\n        })\n      );\n    }\n    return nav;\n  }\n}\n","import { ApplicationService, ApplicationType, IApplication } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AppStateService } from '@c8y/ngx-components';\nimport { flatMap } from 'lodash-es';\nimport {\n  ApplicationExtension,\n  ExtensibleDeviceRegistrationProvider\n} from './base-device-registration.model';\n\nexport class BaseExtensibleDeviceRegistrationService {\n  constructor(\n    protected applicationService: ApplicationService,\n    protected stateService: AppStateService\n  ) {}\n\n  protected getMetadataUrl(contextPath: string): string {\n    return `${this.getServiceBaseUrl(contextPath)}/metadata`;\n  }\n\n  protected getServiceBaseUrl(contextPath: string): string {\n    if (!contextPath || contextPath.length === 0) {\n      throw new Error(\n        gettext('The URL of the microservice is misconfigured. A context path is missing.')\n      );\n    }\n    return `/service/${contextPath}/deviceRegistration`;\n  }\n\n  protected async getDeviceRegistrationProviders(\n    bulk: boolean\n  ): Promise<ExtensibleDeviceRegistrationProvider[]> {\n    let providers: ExtensibleDeviceRegistrationProvider[] = [];\n    const microservices = await this.listMicroservicesByUser();\n    if (microservices && microservices.length > 0) {\n      providers = this.getProvidersFromManifestExtensions(microservices, bulk).concat(\n        this.getProvidersFromExtensions(microservices, bulk)\n      );\n    }\n    return providers;\n  }\n\n  private async listMicroservicesByUser() {\n    const { data } = await this.applicationService.listByUser(\n      this.stateService?.currentUser?.value?.userName,\n      {\n        dropOverwrittenApps: true,\n        noPaging: true,\n        pageSize: 100,\n        withTotalPages: true\n      }\n    );\n    return data?.filter(({ type }) => type === ApplicationType.MICROSERVICE);\n  }\n\n  private getProvidersFromManifestExtensions(\n    applications: IApplication[],\n    bulk: boolean\n  ): ExtensibleDeviceRegistrationProvider[] {\n    return flatMap(applications, application => {\n      return application?.manifest?.extensions?.map(extension => {\n        return { ...extension, contextPath: application.contextPath } as ApplicationExtension;\n      });\n    }).filter(provider => this.appSupportingExtensibleDeviceRegistrationForm(provider, bulk));\n  }\n\n  private getProvidersFromExtensions(\n    applications: IApplication[],\n    bulk: boolean\n  ): ExtensibleDeviceRegistrationProvider[] {\n    return flatMap(applications, application => {\n      return application.extensions?.map(extension => {\n        return {\n          ...extension,\n          contextPath: application.contextPath\n        } as ExtensibleDeviceRegistrationProvider;\n      });\n    }).filter(provider => this.appSupportingExtensibleDeviceRegistrationForm(provider, bulk));\n  }\n\n  private appSupportingExtensibleDeviceRegistrationForm(\n    extension: ExtensibleDeviceRegistrationProvider,\n    bulk: boolean\n  ): boolean {\n    if (bulk) {\n      return extension?.type === 'extensibleBulkDeviceRegistration';\n    } else {\n      return extension?.type === 'extensibleDeviceRegistration';\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ApplicationService, FetchClient, IResult } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AppStateService } from '@c8y/ngx-components';\nimport { BaseExtensibleDeviceRegistrationService } from '../base-extensible-device-registration.service';\nimport { ExtensibleDeviceRegistrationSchema } from './extensible-device-registration.model';\nimport { ExtensibleDeviceRegistrationProvider } from '../base-device-registration.model';\n\n@Injectable()\nexport class ExtensibleDeviceRegistrationService extends BaseExtensibleDeviceRegistrationService {\n  constructor(\n    protected applicationService: ApplicationService,\n    protected stateService: AppStateService,\n    private client: FetchClient\n  ) {\n    super(applicationService, stateService);\n  }\n\n  async getSchema(contextPath: string): Promise<ExtensibleDeviceRegistrationSchema> {\n    const response = await this.client.fetch(this.getMetadataUrl(contextPath), {\n      params: { lang: this.stateService.state.lang }\n    });\n    const data = await response.json();\n\n    if (!data || !data.c8y_DeviceRegistration) {\n      throw new Error(\n        gettext(\n          'The response of the microservice is incomplete. The device registration information is missing.'\n        )\n      );\n    }\n\n    return data.c8y_DeviceRegistration;\n  }\n\n  getDeviceRegistrationProviders(): Promise<ExtensibleDeviceRegistrationProvider[]> {\n    return super.getDeviceRegistrationProviders(false);\n  }\n\n  async registerDevice(contextPath: string, model: any): Promise<IResult<any>> {\n    const method = 'POST';\n    const body = JSON.stringify(model);\n    const headers = { 'content-type': 'application/json', accept: 'application/json' };\n    const res = await this.client.fetch(this.getServiceBaseUrl(contextPath), {\n      method,\n      body,\n      headers\n    });\n    const data = await res.json();\n    return { res, data };\n  }\n}\n","export interface ApplicationExtension {\n  name: string;\n  description: string;\n  type: string;\n}\n\nexport interface ExtensibleDeviceRegistrationProvider extends ApplicationExtension {\n  contextPath: string;\n}\n\nexport const PRODUCT_EXPERIENCE_BASE_REGISTRATION = {\n  EVENT: 'deviceRegistration',\n  COMPONENT: {\n    BULK: 'bulk-registration',\n    EXTENSIBLE_BULK: 'bulk-extensible-registration',\n    EXTENSIBLE_SINGLE: 'single-extensible-registration'\n  },\n  RESULT: { SUCCESS: 'registrationSuccess', FAILURE: 'registrationFailure' }\n} as const;\n","import { Component, Input, OnInit, ViewChild } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  C8yStepper,\n  GainsightService,\n  FormGroupComponent,\n  C8yStepperButtons,\n  OperationResultComponent,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { FormGroup } from '@angular/forms';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { ExtensibleDeviceRegistrationService } from './extensible-device-registration.service';\nimport { RegisterDeviceService } from '../../register-device.service';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { STEP_STATE, CdkStep } from '@angular/cdk/stepper';\nimport { PRODUCT_EXPERIENCE_BASE_REGISTRATION } from '../base-device-registration.model';\n\nimport { NgFor, NgIf } from '@angular/common';\n\n@Component({\n  selector: 'c8y-extensible-device-registration-stepper',\n  templateUrl: 'extensible-device-registration-stepper.component.html',\n  imports: [\n    C8yStepper,\n    NgFor,\n    CdkStep,\n    FormGroupComponent,\n    FormlyModule,\n    NgIf,\n    C8yStepperButtons,\n    OperationResultComponent,\n    C8yTranslatePipe\n  ]\n})\nexport class ExtensibleDeviceRegistrationStepperComponent implements OnInit {\n  message: string;\n  errorMessage: string;\n  pendingStatus = false;\n  forms: FormGroup[] = [];\n  model: any = {};\n  @ViewChild(C8yStepper, { static: true })\n  stepper: C8yStepper;\n\n  @Input() contextPath: string;\n  @Input() labels: string[];\n  @Input() steps: FormlyFieldConfig[][];\n\n  private readonly SERVER_ERROR = gettext('Cannot register your device.');\n  private readonly SUCCESSFUL_REGISTRATION = gettext('Your device was successfully registered.');\n  private readonly NO_CONNECTION = gettext('Unable to reach the microservice.');\n\n  constructor(\n    private customProviderService: ExtensibleDeviceRegistrationService,\n    private registerDeviceService: RegisterDeviceService,\n    private bsModalRef: BsModalRef,\n    private gainsightService: GainsightService\n  ) {}\n\n  ngOnInit() {\n    this.steps.forEach(() => this.forms.push(new FormGroup({})));\n  }\n\n  async save() {\n    this.pendingStatus = true;\n    this.errorMessage = null;\n    const { res, data } = await this.customProviderService\n      .registerDevice(this.contextPath, this.model)\n      .catch(() => {\n        return {\n          res: undefined,\n          data: undefined\n        };\n      })\n      .finally(() => {\n        this.pendingStatus = false;\n        this.stepper.next();\n      });\n\n    if (res && data) {\n      if (res.status >= 400 && res.status < 500) {\n        this.handleError(data.message || this.SERVER_ERROR);\n      } else if (res.status >= 500) {\n        this.handleError(this.SERVER_ERROR);\n      } else {\n        this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n          result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.SUCCESS,\n          component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_SINGLE\n        });\n        this.message = this.SUCCESSFUL_REGISTRATION;\n      }\n    } else {\n      this.handleError(this.NO_CONNECTION);\n    }\n  }\n\n  close() {\n    this.bsModalRef.hide();\n  }\n\n  complete() {\n    this.registerDeviceService.list();\n    this.bsModalRef.hide();\n  }\n\n  goToFirstStep() {\n    this.stepper.selectedIndex = 0;\n  }\n\n  isRegistrationStep() {\n    return this.stepper.selectedIndex === this.steps.length - 1;\n  }\n\n  finalStepStatus() {\n    if (this.stepper.selectedIndex === this.steps.length) {\n      if (this.errorMessage) {\n        return STEP_STATE.ERROR;\n      } else {\n        return STEP_STATE.DONE;\n      }\n    } else {\n      return STEP_STATE.NUMBER;\n    }\n  }\n\n  private handleError(message: string) {\n    this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n      result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,\n      component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_SINGLE\n    });\n    this.errorMessage = message;\n  }\n}\n","<c8y-stepper\n  [disableProgressButtons]=\"true\"\n  [disableDefaultIcons]=\"{ edit: true, done: false }\"\n  [customClasses]=\"['m-40', 'm-t-8', 'm-b-16']\"\n>\n  <cdk-step *ngFor=\"let step of steps; let i = index\" [stepControl]=\"forms[i]\" [label]=\"labels[i]\">\n    <c8y-form-group class=\"form-group p-24 p-b-0 p-t-16\">\n      <formly-form [form]=\"forms[i]\" [fields]=\"step\" [model]=\"model\"></formly-form>\n    </c8y-form-group>\n    <c8y-stepper-buttons\n      class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n      *ngIf=\"isRegistrationStep()\"\n      [showButtons]=\"{ cancel: true, back: true, next: true }\"\n      [labels]=\"{ next: 'Register' }\"\n      (onCancel)=\"close()\"\n      (onNext)=\"save()\"\n      [pending]=\"pendingStatus\"\n      [disabled]=\"forms[i].invalid\"\n    ></c8y-stepper-buttons>\n    <c8y-stepper-buttons\n      class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n      *ngIf=\"!isRegistrationStep()\"\n      [showButtons]=\"{ cancel: true, back: i !== 0, next: true }\"\n      [disabled]=\"forms[i].invalid\"\n      (onCancel)=\"close()\"\n    ></c8y-stepper-buttons>\n  </cdk-step>\n  <cdk-step [state]=\"finalStepStatus()\" label=\"{{ 'Summary' | translate }}\">\n    <c8y-operation-result\n      *ngIf=\"!errorMessage; else errorInfo\"\n      text=\"{{ message | translate }}\"\n      [size]=\"84\"\n      [vertical]=\"true\"\n      type=\"success\"\n      class=\"lead\"\n      data-cy=\"success\"\n    ></c8y-operation-result>\n    <ng-template #errorInfo>\n      <c8y-operation-result\n        text=\"{{ errorMessage | translate }}\"\n        [size]=\"84\"\n        [vertical]=\"true\"\n        type=\"error\"\n        class=\"lead\"\n        data-cy=\"error\"\n      ></c8y-operation-result>\n    </ng-template>\n    <c8y-stepper-buttons\n      class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n      [showButtons]=\"{ cancel: errorMessage, back: errorMessage, next: !errorMessage }\"\n      [labels]=\"{ back: 'Fix issue', next: 'Close' }\"\n      (onCancel)=\"close()\"\n      (onNext)=\"complete()\"\n      (onBack)=\"goToFirstStep()\"\n    ></c8y-stepper-buttons>\n  </cdk-step>\n</c8y-stepper>\n","import { Component, OnInit } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  C8yJSONSchema,\n  ModalComponent,\n  OperationResultComponent,\n  LoadingComponent,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { ExtensibleDeviceRegistrationService } from './extensible-device-registration.service';\nimport { ExtensibleDeviceRegistrationSchema } from './extensible-device-registration.model';\nimport { JSONSchema7 } from 'json-schema';\nimport { FormlyFieldConfig } from '@ngx-formly/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { NgIf } from '@angular/common';\nimport { ExtensibleDeviceRegistrationStepperComponent } from './extensible-device-registration-stepper.component';\n\n@Component({\n  selector: 'extensible-device-registration-modal',\n  templateUrl: 'extensible-device-registration-modal.component.html',\n  imports: [\n    ModalComponent,\n    NgIf,\n    ExtensibleDeviceRegistrationStepperComponent,\n    OperationResultComponent,\n    LoadingComponent,\n    C8yTranslatePipe\n  ]\n})\nexport class ExtensibleDeviceRegistrationModalComponent implements OnInit {\n  title: string;\n  loadingErrorMessage: string;\n  pages: FormlyFieldConfig[][];\n  labels: string[] = [];\n  contextPath: string;\n\n  constructor(\n    public bsModalRef: BsModalRef,\n    private jsonschema: C8yJSONSchema,\n    private registrationService: ExtensibleDeviceRegistrationService\n  ) {}\n\n  async ngOnInit() {\n    const { title, pages }: ExtensibleDeviceRegistrationSchema = await this.registrationService\n      .getSchema(this.contextPath)\n      .catch(error => {\n        this.loadingErrorMessage =\n          error?.message || gettext('Cannot fetch a form definition from the microservice.');\n        return {\n          title: gettext('Error')\n        };\n      });\n    this.title = title;\n    this.pages = pages?.map((step: JSONSchema7) => {\n      this.labels.push(step.title);\n      return [this.jsonschema.toFieldConfig(step) as FormlyFieldConfig];\n    });\n  }\n}\n","<c8y-modal\n  [title]=\"title | translate\"\n  [headerClasses]=\"'dialog-header'\"\n  [customFooter]=\"true\"\n>\n  <ng-container c8y-modal-title>\n    <span class=\"c8y-icon c8y-icon-device-connect\"></span>\n  </ng-container>\n  <ng-container *ngIf=\"pages as steps; else loadingOrError\">\n    <c8y-extensible-device-registration-stepper\n      c8y-modal-body\n      [steps]=\"steps\"\n      [labels]=\"labels\"\n      [contextPath]=\"contextPath\"\n    ></c8y-extensible-device-registration-stepper>\n  </ng-container>\n  <ng-template #loadingOrError>\n    <ng-container *ngIf=\"loadingErrorMessage; else loading\">\n      <c8y-operation-result\n        class=\"lead text-regular\"\n        type=\"error\"\n        text=\"{{ loadingErrorMessage | translate }}\"\n        [size]=\"84\"\n        [vertical]=\"true\"\n        data-cy=\"error\"\n      ></c8y-operation-result>\n      <div class=\"modal-footer\">\n        <button\n          class=\"btn btn-default\"\n          title=\"{{ 'Close' | translate }}\"\n          type=\"button\"\n          (click)=\"bsModalRef.hide()\"\n        >\n          {{ 'Close' | translate }}\n        </button>\n      </div>\n    </ng-container>\n    <ng-template #loading>\n      <div class=\"modal-header modal-header-info text-center\">\n        <c8y-loading\n          class=\"text-center\"\n          layout=\"application\"\n          [message]=\"'Loading the registration form definition…' | translate\"\n        ></c8y-loading>\n      </div>\n    </ng-template>\n  </ng-template>\n</c8y-modal>\n","import { Component, OnInit } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ExtensibleDeviceRegistrationService } from './extensible-device-registration.service';\nimport { ExtensibleDeviceRegistrationModalComponent } from './extensible-device-registration-modal.component';\nimport { ExtensibleDeviceRegistrationProvider } from '../base-device-registration.model';\nimport { NgFor, AsyncPipe } from '@angular/common';\nimport { IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'extensible-device-registration-provider',\n  templateUrl: 'extensible-device-registration-button.component.html',\n  imports: [NgFor, IconDirective, C8yTranslatePipe, AsyncPipe]\n})\nexport class ExtensibleDeviceRegistrationButtonComponent implements OnInit {\n  providersMetaData: Promise<ExtensibleDeviceRegistrationProvider[]>;\n\n  constructor(\n    private deviceRegistrationService: ExtensibleDeviceRegistrationService,\n    private modalService: BsModalService\n  ) {}\n\n  ngOnInit() {\n    this.providersMetaData = this.deviceRegistrationService.getDeviceRegistrationProviders();\n  }\n\n  click(providerMetaData: ExtensibleDeviceRegistrationProvider) {\n    const { name, contextPath } = providerMetaData;\n    this.modalService.show(ExtensibleDeviceRegistrationModalComponent, {\n      initialState: { name, contextPath } as Partial<ExtensibleDeviceRegistrationModalComponent>,\n      class: 'modal-sm',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      ignoreBackdropClick: true\n    });\n  }\n}\n","<div *ngFor=\"let provider of providersMetaData | async\">\n  <button title=\"{{ provider.name | translate }}\" type=\"button\" (click)=\"click(provider)\">\n    <i c8yIcon=\"c8y-device-connect\"></i>\n    {{ provider.name | translate }}\n  </button>\n</div>\n","import { Injectable } from '@angular/core';\nimport { ApplicationService, FetchClient, IResult } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AppStateService } from '@c8y/ngx-components';\nimport { BulkDescription, BulkResult } from './extensible-bulk-device-registration.model';\nimport { BaseExtensibleDeviceRegistrationService } from '../base-extensible-device-registration.service';\nimport { ExtensibleDeviceRegistrationProvider } from '../base-device-registration.model';\n\n@Injectable()\nexport class BulkExtensibleDeviceRegistrationService extends BaseExtensibleDeviceRegistrationService {\n  constructor(\n    protected applicationService: ApplicationService,\n    protected stateService: AppStateService,\n    private client: FetchClient\n  ) {\n    super(applicationService, stateService);\n  }\n\n  getDeviceRegistrationProviders(): Promise<ExtensibleDeviceRegistrationProvider[]> {\n    return super.getDeviceRegistrationProviders(true);\n  }\n\n  async getBulkDescription(contextPath: string): Promise<BulkDescription> {\n    const res = await this.client.fetch(this.getMetadataUrl(contextPath), {\n      params: { lang: this.stateService.state.lang }\n    });\n    const { c8y_DeviceRegistration } = await res.json();\n\n    if (!c8y_DeviceRegistration || !c8y_DeviceRegistration.bulk) {\n      throw new Error(\n        gettext(\n          'The response of the microservice is incomplete. The bulk registration information is missing.'\n        )\n      );\n    }\n\n    return c8y_DeviceRegistration.bulk;\n  }\n\n  async upload(csv: File, contextPath): Promise<IResult<BulkResult>> {\n    const method = 'POST';\n    const body = this.createBinaryRequestBody(csv);\n    const res = await this.client.fetch(this.getBulkUrl(contextPath), { method, body });\n    const data = await res.json();\n    return { res, data };\n  }\n\n  getBulkUrl(contextPath: string): string {\n    return `${this.getServiceBaseUrl(contextPath)}/bulk`;\n  }\n\n  private createBinaryRequestBody(file: any): FormData {\n    const body = new FormData();\n    const newFile = new File([file], file.name, { type: 'text/csv' });\n    body.append('file', newFile, newFile.name);\n    return body;\n  }\n}\n","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { IResult } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  C8yJSONSchema,\n  C8yStepper,\n  GainsightService,\n  ModalComponent,\n  IconDirective,\n  C8yTranslateDirective,\n  FormGroupComponent,\n  C8yStepperButtons,\n  OperationResultComponent,\n  ListGroupComponent,\n  ListItemComponent,\n  ListItemIconComponent,\n  ListItemCollapseComponent,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { RegisterDeviceService } from '../../register-device.service';\nimport { PRODUCT_EXPERIENCE_BASE_REGISTRATION } from '../base-device-registration.model';\nimport {\n  BulkDescription,\n  BulkFailedResult,\n  BulkFileExample,\n  BulkResult\n} from './extensible-bulk-device-registration.model';\nimport { BulkExtensibleDeviceRegistrationService } from './extensible-bulk-device-registration.service';\n\nimport { NgIf, NgFor, JsonPipe } from '@angular/common';\nimport { CdkStep } from '@angular/cdk/stepper';\n\nconst extensibleDeviceRegistrationBulkSchema: object = {\n  $schema: 'https://json-schema.org/draft/2019-09/schema',\n  type: 'object',\n  properties: {\n    csvBulkFile: {\n      type: 'array',\n      title: gettext('CSV file upload'),\n      description: gettext(\n        'You can use file upload component to let users send files. This input accepts only a single CSV file.'\n      ),\n      contentMediaType: 'csv'\n    }\n  },\n  required: ['csvBulkFile'],\n  additionalProperties: false\n};\n\n@Component({\n  selector: 'extensible-device-registration-modal-component',\n  templateUrl: 'extensible-bulk-device-registration-modal.component.html',\n  imports: [\n    ModalComponent,\n    IconDirective,\n    C8yStepper,\n    NgIf,\n    CdkStep,\n    C8yTranslateDirective,\n    FormGroupComponent,\n    FormlyModule,\n    NgFor,\n    C8yStepperButtons,\n    OperationResultComponent,\n    ListGroupComponent,\n    ListItemComponent,\n    ListItemIconComponent,\n    ListItemCollapseComponent,\n    C8yTranslatePipe,\n    JsonPipe\n  ]\n})\nexport class ExtensibleBulkDeviceRegistrationModalComponent implements OnInit {\n  @ViewChild(C8yStepper, { static: true }) stepper: C8yStepper;\n  title: string;\n  examples: BulkFileExample[];\n  message: string;\n  success: boolean;\n  loadingError = false;\n  pending = false;\n  contextPath: string;\n  result: BulkResult | BulkFailedResult;\n  form = new FormGroup({});\n  model = {};\n  template: FormlyFieldConfig[];\n\n  constructor(\n    private jsonschema: C8yJSONSchema,\n    private bulkExtensibleDeviceRegistrationService: BulkExtensibleDeviceRegistrationService,\n    private registerDeviceService: RegisterDeviceService,\n    private bsModalRef: BsModalRef,\n    private gainsightService: GainsightService\n  ) {}\n\n  async ngOnInit() {\n    const { title, exampleFileUrls }: BulkDescription =\n      await this.bulkExtensibleDeviceRegistrationService\n        .getBulkDescription(this.contextPath)\n        .catch(error => {\n          this.message = error.message;\n          this.loadingError = true;\n\n          return {\n            title: gettext('Error'),\n            exampleFileUrls: []\n          };\n        });\n\n    this.title = title;\n    this.template = [this.jsonschema.toFieldConfig(extensibleDeviceRegistrationBulkSchema)];\n    this.examples = exampleFileUrls;\n  }\n\n  async upload() {\n    this.pending = true;\n    const { res, data }: IResult<BulkResult> = await this.bulkExtensibleDeviceRegistrationService\n      .upload(this.getFile(this.model), this.contextPath)\n      .catch(() => {\n        return {\n          res: undefined,\n          data: undefined\n        };\n      })\n      .finally(() => {\n        this.pending = false;\n        this.stepper.next();\n      });\n\n    this.result = data;\n    this.success = res?.status < 400;\n\n    if (this.success) {\n      this.message = gettext('Device registration created.');\n      this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n        result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.SUCCESS,\n        component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_BULK\n      });\n      this.model = {};\n    }\n\n    if (res) {\n      if (res.status >= 400 && res.status < 500) {\n        this.message = gettext('Device registration failed.');\n        this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n          result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,\n          component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_BULK\n        });\n      } else if (res.status >= 500) {\n        this.message = gettext('Error occurred while processing the uploaded file.');\n        this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n          result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,\n          component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_BULK\n        });\n      }\n    } else {\n      this.message = gettext('No internet connection. Unable to reach the microservice.');\n    }\n  }\n\n  getFile(model) {\n    const csvBulkFile = (model as any)?.csvBulkFile;\n    return csvBulkFile ? csvBulkFile[0]?.file : undefined;\n  }\n\n  complete() {\n    this.registerDeviceService.list();\n    this.bsModalRef.hide();\n  }\n\n  cancel() {\n    this.bsModalRef.hide();\n  }\n}\n","<c8y-modal\n  [title]=\"title | translate\"\n  [headerClasses]=\"'dialog-header'\"\n  [customFooter]=\"true\"\n>\n  <ng-container c8y-modal-title>\n    <i c8yIcon=\"c8y-device-connect\"></i>\n  </ng-container>\n  <c8y-stepper [hideStepProgress]=\"true\" linear class=\"p-t-16\" c8y-modal-body>\n    <ng-container *ngIf=\"!loadingError\">\n      <cdk-step>\n        <div class=\"sticky-top bg-component separator-bottom\">\n          <p\n            class=\"p-l-24 p-r-24 p-t-16 p-b-16 m-b-0 separator-bottom text-16 text-medium text-center bg-component\"\n            translate\n          >\n            Register devices in bulk\n          </p>\n          <c8y-form-group class=\"p-24 p-t-16 p-b-8 m-b-0\">\n            <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n          </c8y-form-group>\n        </div>\n        <div\n          *ngFor=\"let example of examples\"\n          class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\"\n        >\n          <p class=\"m-b-8 text-medium\">\n            {{ example.title | translate }}\n          </p>\n          <p class=\"small m-b-8\">{{ example.description | translate }}</p>\n          <a\n            title=\"{{ 'Download template' | translate }}\"\n            class=\"btn btn-default btn-sm\"\n            target=\"_self\"\n            [href]=\"example.url\"\n            download=\"{{ 'Example bulk registration - template.csv' | translate }}\"\n          >\n            <i c8yIcon=\"download\"></i>\n            <span translate>Download template</span>\n          </a>\n        </div>\n        <c8y-stepper-buttons\n          class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n          [showButtons]=\"{ cancel: true, next: true }\"\n          [disabled]=\"form.invalid\"\n          [pending]=\"pending\"\n          (onCancel)=\"cancel()\"\n          (onNext)=\"upload()\"\n          [labels]=\"{ next: 'Upload' }\"\n        ></c8y-stepper-buttons>\n      </cdk-step>\n    </ng-container>\n    <cdk-step state=\"final\">\n      <div class=\"p-24\">\n        <div *ngIf=\"success; else fail\">\n          <c8y-operation-result\n            text=\"{{ message | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"success\"\n            class=\"lead\"\n            data-cy=\"success\"\n          ></c8y-operation-result>\n          <c8y-list-group class=\"separator-top m-t-16\">\n            <c8y-li>\n              <c8y-li-icon class=\"text-success\" [icon]=\"'check-circle'\"></c8y-li-icon>\n              <p translate>File successfully uploaded.</p>\n              <c8y-li-collapse>\n                <pre><code>{{ result | json }}</code></pre>\n              </c8y-li-collapse>\n            </c8y-li>\n          </c8y-list-group>\n        </div>\n        <ng-template #fail>\n          <c8y-operation-result\n            text=\"{{ message | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"error\"\n            class=\"lead\"\n            data-cy=\"error\"\n          ></c8y-operation-result>\n          <c8y-list-group *ngIf=\"result\" class=\"separator-top m-t-16\">\n            <c8y-li>\n              <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n              <p translate>Bulk operation failed.</p>\n              <c8y-li-collapse>\n                <pre><code>{{ result | json }}</code></pre>\n              </c8y-li-collapse>\n            </c8y-li>\n          </c8y-list-group>\n        </ng-template>\n      </div>\n      <c8y-stepper-buttons\n        class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-component\"\n        [showButtons]=\"{ next: true }\"\n        (onNext)=\"complete()\"\n        [labels]=\"{ next: success ? 'Complete' : 'Cancel' }\"\n      ></c8y-stepper-buttons>\n    </cdk-step>\n  </c8y-stepper>\n</c8y-modal>\n","import { Component, ViewChild } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { DeviceRegistrationBulkService, IDeviceRegistrationBulkResult } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  C8yJSONSchema,\n  C8yStepper,\n  FeatureCacheService,\n  GainsightService,\n  ModalComponent,\n  IconDirective,\n  C8yTranslateDirective,\n  FormGroupComponent,\n  C8yStepperButtons,\n  OperationResultComponent,\n  ListGroupComponent,\n  ListItemComponent,\n  ListItemIconComponent,\n  ListItemCollapseComponent,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { saveAs } from 'file-saver';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { PRODUCT_EXPERIENCE_BASE_REGISTRATION } from '../extensible/base-device-registration.model';\nimport { BulkFailedResult } from '../extensible/bulk/extensible-bulk-device-registration.model';\nimport { RegisterDeviceService } from '../register-device.service';\nimport { TranslateService } from '@ngx-translate/core';\n\nimport { CdkStep } from '@angular/cdk/stepper';\nimport { NgIf, AsyncPipe, JsonPipe } from '@angular/common';\n\nconst registerDeviceBulkSchema: object = {\n  $schema: 'https://json-schema.org/draft/2019-09/schema',\n  type: 'object',\n  properties: {\n    csvBulkFile: {\n      type: 'array',\n      title: gettext('CSV file upload'),\n      description: gettext(\n        'You can use file upload component to let users send files. This input accepts only a single CSV file.'\n      ),\n      contentMediaType: 'csv'\n    }\n  },\n  required: ['csvBulkFile'],\n  additionalProperties: false\n};\n\nconst simpleCsvHeaders: string[] = ['ID', 'PATH'];\nconst csvHeaders: string[] = [\n  'ID',\n  'TYPE',\n  'NAME',\n  'ICCID',\n  'IDTYPE',\n  'PATH',\n  'SHELL',\n  'AUTH_TYPE'\n];\nconst fullCsvHeaders: string[] = [...csvHeaders, 'CREDENTIALS'];\nexport const ESTCsvHeaders: string[] = [...csvHeaders, 'ENROLLMENT_OTP'];\n\n@Component({\n  selector: 'bulk-device-registration',\n  templateUrl: 'bulk-device-registration-modal.component.html',\n  imports: [\n    ModalComponent,\n    IconDirective,\n    C8yStepper,\n    CdkStep,\n    C8yTranslateDirective,\n    FormGroupComponent,\n    FormlyModule,\n    NgIf,\n    C8yStepperButtons,\n    OperationResultComponent,\n    ListGroupComponent,\n    ListItemComponent,\n    ListItemIconComponent,\n    ListItemCollapseComponent,\n    C8yTranslatePipe,\n    AsyncPipe,\n    JsonPipe\n  ]\n})\nexport class BulkDeviceRegistrationModalComponent {\n  @ViewChild(C8yStepper, { static: true }) stepper: C8yStepper;\n  message: string;\n  success: boolean;\n  pending: boolean;\n  result: IDeviceRegistrationBulkResult;\n  failedResult: BulkFailedResult;\n  form = new FormGroup({});\n  model = {};\n  template: FormlyFieldConfig[];\n  certificateAuthorityFeatureEnabled =\n    this.featureCacheService.getFeatureState('certificate-authority');\n\n  constructor(\n    private jsonschema: C8yJSONSchema,\n    private deviceRegistrationService: DeviceRegistrationBulkService,\n    private registerDeviceService: RegisterDeviceService,\n    private bsModalRef: BsModalRef,\n    private gainsightService: GainsightService,\n    private featureCacheService: FeatureCacheService,\n    private translateService: TranslateService\n  ) {}\n\n  ngOnInit() {\n    this.template = [this.jsonschema.toFieldConfig(registerDeviceBulkSchema)];\n  }\n\n  upload() {\n    this.pending = true;\n    const file = this.getFile(this.model);\n    this.deviceRegistrationService\n      .create(file)\n      .then(({ res, data }) => {\n        if (res.status < 400) {\n          this.result = data;\n          this.success = data.numberOfFailed === 0 && data.numberOfSuccessful === data.numberOfAll;\n          this.message = this.success\n            ? gettext('Device registration created.')\n            : (this.message = gettext('Device registration failed.'));\n          if (this.success) {\n            this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n              result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.SUCCESS,\n              component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK\n            });\n          } else {\n            this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n              result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,\n              component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK\n            });\n          }\n        } else {\n          this.failedResult = data as unknown as BulkFailedResult;\n          this.message = gettext('Device registration failed.');\n          this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n            result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,\n            component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK\n          });\n        }\n        this.model = {};\n        this.pending = false;\n        this.stepper.next();\n      })\n      .catch(() => {\n        this.message = gettext('Error occurred while processing the uploaded file.');\n        this.pending = false;\n        this.stepper.next();\n      });\n  }\n\n  downloadSimple() {\n    return this.download(simpleCsvHeaders, gettext('Simple bulk registration - template.csv'));\n  }\n\n  downloadFull() {\n    return this.download(fullCsvHeaders, gettext('Full bulk registration - template.csv'));\n  }\n\n  downloadEst() {\n    return this.download(ESTCsvHeaders, gettext('EST registration - template.csv'));\n  }\n\n  download(headers: string[], fileName: string) {\n    const headerRaw = headers.map(header => `\"${header}\"`).join(';');\n    const binaryFile = new Blob([headerRaw], { type: 'text/csv' });\n    saveAs(binaryFile, this.translateService.instant(fileName));\n  }\n\n  complete() {\n    this.registerDeviceService.list();\n    this.bsModalRef.hide();\n  }\n\n  cancel() {\n    this.bsModalRef.hide();\n  }\n\n  private getFile(model): File {\n    const csvBulkFile = (model as any)?.csvBulkFile;\n    return csvBulkFile ? csvBulkFile[0]?.file : undefined;\n  }\n}\n","<c8y-modal\n  [title]=\"'Bulk device registration' | translate\"\n  [headerClasses]=\"'dialog-header'\"\n  [customFooter]=\"true\"\n>\n  <ng-container c8y-modal-title>\n    <i c8yIcon=\"upload\"></i>\n  </ng-container>\n\n  <c8y-stepper [hideStepProgress]=\"true\" linear id=\"modal-body\">\n    <cdk-step>\n      <p class=\"modal-subtitle sticky-top\" translate>Register devices in bulk</p>\n\n      <c8y-form-group class=\"d-block p-24 p-t-16 p-b-0 m-b-0\">\n        <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n      </c8y-form-group>\n\n      <div class=\"p-24 m-t-0 bg-level-1\">\n          <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\">\n            <div>\n              <p class=\"m-b-8 text-medium\">\n                <strong translate>Simple registration</strong>\n              </p>\n              <small class=\"text-muted\" translate>\n                Creates all registration requests at once, then each one needs to go through regular\n                acceptance process.\n              </small>\n            </div>\n            <div class=\"m-b-16 m-t-16\">\n              <a\n                title=\"{{ 'Download template' | translate }}\"\n                class=\"btn btn-default btn-sm\"\n                target=\"_self\"\n                (click)=\"downloadSimple()\"\n              >\n                <i c8yIcon=\"download\" translate></i>\n                {{ 'Download template' | translate }}\n              </a>\n            </div>\n          </div>\n          <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\">\n            <div>\n              <p class=\"m-b-8 text-medium\">\n                <strong translate>Full registration</strong>\n              </p>\n              <small class=\"text-muted\" translate>\n                Creates all device credentials and devices using provided list of property values.\n                Devices can start communicating with the platform immediately.\n              </small>\n            </div>\n            <div class=\"m-b-16 m-t-16\">\n              <a\n                title=\"{{ 'Download template' | translate }}\"\n                class=\"btn btn-default btn-sm\"\n                target=\"_self\"\n                (click)=\"downloadFull()\"\n              >\n                <i c8yIcon=\"download\" translate></i>\n                {{ 'Download template' | translate }}\n              </a>\n            </div>\n          </div>\n          <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\" *ngIf=\"certificateAuthorityFeatureEnabled | async\">\n            <div>\n              <p class=\"m-b-8 text-medium\">\n                <strong translate>Full registration with device certificate creation</strong>\n              </p>\n              <small class=\"text-muted\" translate>\n                Creates device certificates and devices using the provided list of property values. Once the certificates are provisioned, the devices can immediately start communicating with the platform\n              </small>\n            </div>\n            <div class=\"m-b-16 m-t-16\">\n              <a\n                title=\"{{ 'Download template' | translate }}\"\n                class=\"btn btn-default btn-sm\"\n                target=\"_self\"\n                (click)=\"downloadEst()\"\n              >\n                <i c8yIcon=\"download\"></i>\n                {{ 'Download template' | translate }}\n              </a>\n            </div>\n          </div>\n      </div>\n\n      <c8y-stepper-buttons\n        class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n        [showButtons]=\"{ cancel: true, next: true }\"\n        [disabled]=\"form.invalid\"\n        [pending]=\"pending\"\n        (onCancel)=\"cancel()\"\n        (onNext)=\"upload()\"\n        [labels]=\"{ next: 'Upload' }\"\n      ></c8y-stepper-buttons>\n    </cdk-step>\n\n    <cdk-step state=\"final\">\n      <div class=\"m-24\">\n        <div *ngIf=\"success; else warning\">\n          <c8y-operation-result\n            text=\"{{ message | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"success\"\n            class=\"lead\"\n          ></c8y-operation-result>\n        </div>\n        <ng-template #warning>\n          <c8y-operation-result\n            text=\"{{ message | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"error\"\n            class=\"lead\"\n          ></c8y-operation-result>\n        </ng-template>\n        <c8y-list-group class=\"separator-top m-t-16\">\n          <ng-container *ngIf=\"result; else failedResponse\">\n            <c8y-li *ngIf=\"success; else fail\">\n              <c8y-li-icon class=\"text-success\" icon=\"check-circle\"></c8y-li-icon>\n              <p>{{ 'All devices have been processed.' | translate }}</p>\n              <c8y-li-collapse>\n                <pre><code>{{ result | json }}</code></pre>\n              </c8y-li-collapse>\n            </c8y-li>\n            <ng-template #fail>\n              <c8y-li>\n                <c8y-li-icon class=\"text-danger\" icon=\"ban\"></c8y-li-icon>\n                <p\n                  ngNonBindable\n                  [translateParams]=\"{ count: result?.numberOfFailed, total: result?.numberOfAll }\"\n                  translate\n                >\n                  Failed to process {{ count }} out of {{ total }}.\n                </p>\n                <c8y-li-collapse>\n                  <pre><code>{{ result | json }}</code></pre>\n                </c8y-li-collapse>\n              </c8y-li>\n            </ng-template>\n          </ng-container>\n          <ng-template #failedResponse>\n            <c8y-li>\n              <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n              <small>{{ failedResult?.message | translate }}</small>\n              <c8y-li-collapse>\n                <pre><code>{{ failedResult | json }}</code></pre>\n              </c8y-li-collapse>\n            </c8y-li>\n          </ng-template>\n        </c8y-list-group>\n      </div>\n      <c8y-stepper-buttons\n        class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n        [showButtons]=\"{ next: true }\"\n        (onNext)=\"complete()\"\n        [labels]=\"{ next: success ? 'Close' : 'Cancel' }\"\n      ></c8y-stepper-buttons>\n    </cdk-step>\n  </c8y-stepper>\n</c8y-modal>\n","import { Component, OnInit } from '@angular/core';\nimport { BulkExtensibleDeviceRegistrationService } from './extensible-bulk-device-registration.service';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ExtensibleBulkDeviceRegistrationModalComponent } from './extensible-bulk-device-registration-modal.component';\nimport { ExtensibleDeviceRegistrationProvider } from '../base-device-registration.model';\nimport { NgFor, AsyncPipe } from '@angular/common';\nimport { IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'extensible-device-registration-component',\n  templateUrl: 'extensible-bulk-device-registration-button.component.html',\n  imports: [NgFor, IconDirective, C8yTranslatePipe, AsyncPipe]\n})\nexport class ExtensibleBulkDeviceRegistrationButtonComponent implements OnInit {\n  bulkProvidersMetaData: Promise<ExtensibleDeviceRegistrationProvider[]>;\n\n  constructor(\n    private bulkExtensibleDeviceRegistrationService: BulkExtensibleDeviceRegistrationService,\n    private modalService: BsModalService\n  ) {}\n\n  ngOnInit() {\n    this.bulkProvidersMetaData =\n      this.bulkExtensibleDeviceRegistrationService.getDeviceRegistrationProviders();\n  }\n\n  click(contextPath) {\n    this.modalService.show(ExtensibleBulkDeviceRegistrationModalComponent, {\n      initialState: { contextPath } as Partial<ExtensibleBulkDeviceRegistrationModalComponent>,\n      class: 'modal-sm',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      ignoreBackdropClick: true\n    });\n  }\n}\n","<div *ngFor=\"let provider of bulkProvidersMetaData | async\">\n  <button\n    title=\"{{ provider.name | translate }}\"\n    type=\"button\"\n    (click)=\"click(provider.contextPath)\"\n  >\n    <i c8yIcon=\"upload\"></i>\n    {{ provider.name | translate }}\n  </button>\n</div>\n","import { Component } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { BulkDeviceRegistrationModalComponent } from './bulk-device-registration-modal.component';\nimport { ExtensibleDeviceRegistrationProvider } from '../extensible/base-device-registration.model';\nimport { IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'extensible-device-registration-component',\n  templateUrl: 'bulk-device-registration-button.component.html',\n  imports: [IconDirective, C8yTranslatePipe]\n})\nexport class BulkDeviceRegistrationButtonComponent {\n  bulkProvidersMetaData: Promise<ExtensibleDeviceRegistrationProvider[]>;\n\n  constructor(private modalService: BsModalService) {}\n\n  click() {\n    this.modalService.show(BulkDeviceRegistrationModalComponent, {\n      class: 'modal-sm',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      ignoreBackdropClick: true\n    });\n  }\n}\n","<button title=\"{{ 'General' | translate }}\" type=\"button\" (click)=\"click()\">\n  <i c8yIcon=\"upload\"></i>\n  {{ 'General' | translate }}\n</button>\n","import { Injectable } from '@angular/core';\nimport { GeneralDeviceRegistrationButtonComponent } from './general/general-device-registration-button.component';\nimport { ExtensibleDeviceRegistrationButtonComponent } from './extensible/single/extensible-device-registration-button.component';\nimport { ExtensibleBulkDeviceRegistrationButtonComponent } from './extensible/bulk/extensible-bulk-device-registration-button.component';\nimport { BulkDeviceRegistrationButtonComponent } from './bulk/bulk-device-registration-button.component';\nimport { RegisterDeviceItem, RegisterDeviceFactory } from './dropdown/RegisterDeviceItem';\n\n@Injectable()\nexport class DeviceRegistrationFactory implements RegisterDeviceFactory {\n  get() {\n    return [\n      {\n        template: GeneralDeviceRegistrationButtonComponent,\n        priority: 100,\n        category: 'single'\n      } as RegisterDeviceItem,\n      {\n        template: ExtensibleDeviceRegistrationButtonComponent,\n        priority: 50,\n        category: 'single'\n      } as RegisterDeviceItem,\n      {\n        template: ExtensibleBulkDeviceRegistrationButtonComponent,\n        priority: 50,\n        category: 'bulk'\n      } as RegisterDeviceItem,\n      {\n        template: BulkDeviceRegistrationButtonComponent,\n        priority: 100,\n        category: 'bulk'\n      } as RegisterDeviceItem\n    ];\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport {\n  CommonModule,\n  CoreModule,\n  DeviceBootstrapRealtimeService,\n  DynamicFormsModule,\n  hookNavigator,\n  StepperModule\n} from '@c8y/ngx-components';\nimport { DeviceRegistrationViewComponent } from './device-registration-view.component';\nimport { GeneralDeviceRegistrationComponent } from './general/general-device-registration.component';\nimport { GeneralDeviceRegistrationButtonComponent } from './general/general-device-registration-button.component';\nimport { RegisterDeviceNavigationFactory } from './register-device-navigation.factory';\nimport { ExtensibleDeviceRegistrationButtonComponent } from './extensible/single/extensible-device-registration-button.component';\nimport { ExtensibleDeviceRegistrationModalComponent } from './extensible/single/extensible-device-registration-modal.component';\nimport { ExtensibleDeviceRegistrationService } from './extensible/single/extensible-device-registration.service';\nimport { ExtensibleDeviceRegistrationStepperComponent } from './extensible/single/extensible-device-registration-stepper.component';\nimport { ExtensibleBulkDeviceRegistrationModalComponent } from './extensible/bulk/extensible-bulk-device-registration-modal.component';\nimport { BulkExtensibleDeviceRegistrationService } from './extensible/bulk/extensible-bulk-device-registration.service';\nimport { BulkDeviceRegistrationModalComponent } from './bulk/bulk-device-registration-modal.component';\nimport { ExtensibleBulkDeviceRegistrationButtonComponent } from './extensible/bulk/extensible-bulk-device-registration-button.component';\nimport { BulkDeviceRegistrationButtonComponent } from './bulk/bulk-device-registration-button.component';\nimport { RegisterDeviceDropdownComponent } from './dropdown/register-device-dropdown.component';\nimport { hookDeviceRegistration } from './dropdown/register-device-extension.service';\nimport { DeviceRegistrationFactory } from './register-device.factory';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\n\nconst deviceRegistrationRoutes: Routes = [\n  {\n    path: 'deviceregistration',\n    component: DeviceRegistrationViewComponent\n  }\n];\n\n@NgModule({\n  imports: [\n    BsDropdownModule,\n    PopoverModule,\n    CommonModule,\n    CoreModule,\n    StepperModule,\n    DynamicFormsModule,\n    RouterModule.forChild(deviceRegistrationRoutes),\n    DeviceRegistrationViewComponent,\n    GeneralDeviceRegistrationComponent,\n    GeneralDeviceRegistrationButtonComponent,\n    BulkDeviceRegistrationModalComponent,\n    BulkDeviceRegistrationButtonComponent,\n    ExtensibleDeviceRegistrationButtonComponent,\n    ExtensibleDeviceRegistrationModalComponent,\n    ExtensibleDeviceRegistrationStepperComponent,\n    ExtensibleBulkDeviceRegistrationModalComponent,\n    ExtensibleBulkDeviceRegistrationButtonComponent,\n    RegisterDeviceDropdownComponent\n  ],\n  providers: [\n    hookDeviceRegistration(DeviceRegistrationFactory),\n    hookNavigator(RegisterDeviceNavigationFactory),\n    DeviceBootstrapRealtimeService,\n    ExtensibleDeviceRegistrationService,\n    BulkExtensibleDeviceRegistrationService\n  ]\n})\nexport class RegisterDeviceModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i3","i1","i3.RegisterDeviceService","i5","i6","i1.GeneralDeviceRegistrationService","i1.RegisterDeviceExtensionService","i2.RegisterDeviceService","i1.RegisterDeviceService","i4","i5.GeneralDeviceRegistrationService","i1.ExtensibleDeviceRegistrationService","i3.ExtensibleDeviceRegistrationService","i2.BulkExtensibleDeviceRegistrationService","i1.BulkExtensibleDeviceRegistrationService"],"mappings":"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"}