@c8y/ngx-components 1023.0.2 → 1023.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/ai/agent-chat/index.d.ts +114 -0
  2. package/ai/agent-chat/index.d.ts.map +1 -0
  3. package/ai/ai-chat/index.d.ts +145 -0
  4. package/ai/ai-chat/index.d.ts.map +1 -0
  5. package/ai/index.d.ts +203 -0
  6. package/ai/index.d.ts.map +1 -0
  7. package/context-dashboard/device/add/index.d.ts +15 -1
  8. package/context-dashboard/device/add/index.d.ts.map +1 -1
  9. package/context-dashboard/device/view/index.d.ts +14 -2
  10. package/context-dashboard/device/view/index.d.ts.map +1 -1
  11. package/context-dashboard/devicemanagement/index.d.ts +10 -0
  12. package/context-dashboard/devicemanagement/index.d.ts.map +1 -0
  13. package/context-dashboard/index.d.ts +6 -30
  14. package/context-dashboard/index.d.ts.map +1 -1
  15. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs +387 -0
  16. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.map +1 -0
  17. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +258 -0
  18. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs.map +1 -0
  19. package/fesm2022/c8y-ngx-components-ai.mjs +291 -0
  20. package/fesm2022/c8y-ngx-components-ai.mjs.map +1 -0
  21. package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs +1 -1
  22. package/fesm2022/c8y-ngx-components-context-dashboard-cockpit-home-dashboard.mjs.map +1 -1
  23. package/fesm2022/c8y-ngx-components-context-dashboard-device-add.mjs +1 -1
  24. package/fesm2022/c8y-ngx-components-context-dashboard-device-view.mjs +2 -2
  25. package/fesm2022/c8y-ngx-components-context-dashboard-devicemanagement.mjs +68 -0
  26. package/fesm2022/c8y-ngx-components-context-dashboard-devicemanagement.mjs.map +1 -0
  27. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +27 -45
  28. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  29. package/fesm2022/c8y-ngx-components-global-context.mjs +10 -10
  30. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  31. package/fesm2022/c8y-ngx-components-register-device.mjs +4 -6
  32. package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
  33. package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs +2 -2
  34. package/fesm2022/c8y-ngx-components-sensor-phone-sensor-phone-modal.mjs.map +1 -1
  35. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget-ai-config.mjs +574 -0
  36. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget-ai-config.mjs.map +1 -0
  37. package/fesm2022/c8y-ngx-components-widgets-exports.mjs +8 -1
  38. package/fesm2022/c8y-ngx-components-widgets-exports.mjs.map +1 -1
  39. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +176 -41
  40. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
  41. package/fesm2022/c8y-ngx-components.mjs +96 -44
  42. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  43. package/index.d.ts +25 -4
  44. package/index.d.ts.map +1 -1
  45. package/locales/de.po +15 -15
  46. package/locales/es.po +15 -15
  47. package/locales/fr.po +14 -15
  48. package/locales/ja_JP.po +12 -12
  49. package/locales/ko.po +14 -15
  50. package/locales/locales.pot +144 -9
  51. package/locales/nl.po +15 -15
  52. package/locales/pl.po +14 -14
  53. package/locales/pt_BR.po +14 -15
  54. package/locales/zh_CN.po +14 -14
  55. package/locales/zh_TW.po +13 -13
  56. package/package.json +1 -1
  57. package/register-device/index.d.ts.map +1 -1
  58. package/widgets/cockpit-exports/index.d.ts +6 -0
  59. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  60. package/widgets/definitions/html-widget-ai-config/index.d.ts +6 -0
  61. package/widgets/definitions/html-widget-ai-config/index.d.ts.map +1 -0
  62. package/widgets/device-management-exports/index.d.ts +6 -0
  63. package/widgets/device-management-exports/index.d.ts.map +1 -1
  64. package/widgets/exports/index.d.ts +8 -1
  65. package/widgets/exports/index.d.ts.map +1 -1
  66. package/widgets/implementations/html-widget/index.d.ts +72 -16
  67. package/widgets/implementations/html-widget/index.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"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 { NgIf, NgClass, NgFor, 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 NgIf,\n FormsModule,\n PopoverDirective,\n FormlyModule,\n NgClass,\n C8yStepperButtons,\n OperationResultComponent,\n ListGroupComponent,\n NgFor,\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: 'string',\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 <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\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 </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 <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n class=\"lead\"\n type=\"success\"\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n class=\"lead\"\n type=\"error\"\n *ngIf=\"success.length === 0\"\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 </ng-container>\n\n <div\n class=\"p-l-24 p-r-24 text-center\"\n data-cy=\"device-registration-failure-message\"\n *ngIf=\"success.length > 0 && failed.length > 0\"\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 <div\n class=\"m-b-8 p-l-24 p-r-24\"\n data-cy=\"device-registration-success-message\"\n *ngIf=\"success.length > 0\"\n >\n <span\n *ngIf=\"!(useEST$ | async)\"\n translate\n >\n Turn on the registered devices and wait for connections to be established. Once a device\n is connected, its status will change to \"Pending acceptance\". You will need to approve\n it by clicking on the \"Accept\" button.\n </span>\n <span\n *ngIf=\"useEST$ | async\"\n translate\n >\n The successfully enrolled devices can now request signed certificates and use them to\n connect and authenticate to the platform via certificate-based authentication.\n </span>\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\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 <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon\n class=\"text-success\"\n [icon]=\"'check-circle'\"\n ></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\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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"}
1
+ {"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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"}