@c8y/ngx-components 1021.76.3 → 1021.77.2

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 (88) hide show
  1. package/core/common/ApplicationOptions.d.ts +2 -2
  2. package/core/login/login.component.d.ts.map +1 -1
  3. package/core/login/login.service.d.ts +1 -0
  4. package/core/login/login.service.d.ts.map +1 -1
  5. package/datapoint-explorer/view/datapoint-explorer.component.d.ts.map +1 -1
  6. package/echart/charts.component.d.ts.map +1 -1
  7. package/echart/models/datapoints-graph-widget.model.d.ts +10 -0
  8. package/echart/models/datapoints-graph-widget.model.d.ts.map +1 -1
  9. package/echart/services/chart-realtime.service.d.ts +2 -5
  10. package/echart/services/chart-realtime.service.d.ts.map +1 -1
  11. package/echart/services/echarts-options.service.d.ts +4 -13
  12. package/echart/services/echarts-options.service.d.ts.map +1 -1
  13. package/echart/services/y-axis.service.d.ts +1 -1
  14. package/echart/services/y-axis.service.d.ts.map +1 -1
  15. package/esm2022/core/beta-feature/beta-preview-button.component.mjs +3 -3
  16. package/esm2022/core/beta-feature/beta-preview.component.mjs +3 -3
  17. package/esm2022/core/common/ApplicationOptions.mjs +1 -1
  18. package/esm2022/core/login/login.component.mjs +2 -1
  19. package/esm2022/core/login/login.service.mjs +5 -1
  20. package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +4 -3
  21. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.mjs +3 -3
  22. package/esm2022/echart/charts.component.mjs +8 -2
  23. package/esm2022/echart/models/datapoints-graph-widget.model.mjs +1 -1
  24. package/esm2022/echart/services/chart-realtime.service.mjs +1 -1
  25. package/esm2022/echart/services/echarts-options.service.mjs +23 -15
  26. package/esm2022/echart/services/y-axis.service.mjs +32 -1
  27. package/esm2022/operations/bulk-operations-service/bulk-operations.service.mjs +21 -2
  28. package/esm2022/operations/bulk-single-operations-list/bulk-single-operations-list.module.mjs +9 -7
  29. package/esm2022/operations/bulk-single-operations-list/single-operation-item.component.mjs +4 -1
  30. package/esm2022/operations/bulk-single-operations-list/single-operations-list.component.mjs +94 -20
  31. package/esm2022/operations/grid-columns/c8y-ngx-components-operations-grid-columns.mjs +5 -0
  32. package/esm2022/operations/grid-columns/creation-time.cell-renderer.component.mjs +28 -0
  33. package/esm2022/operations/grid-columns/creation-time.grid-column.mjs +14 -0
  34. package/esm2022/operations/grid-columns/device.cell-renderer.component.mjs +50 -0
  35. package/esm2022/operations/grid-columns/device.grid-column.mjs +14 -0
  36. package/esm2022/operations/grid-columns/failure-reason.cell-renderer.component.mjs +54 -0
  37. package/esm2022/operations/grid-columns/failure-reason.grid-column.mjs +14 -0
  38. package/esm2022/operations/grid-columns/index.mjs +9 -0
  39. package/esm2022/operations/grid-columns/status.cell-renderer.component.mjs +43 -0
  40. package/esm2022/operations/grid-columns/status.grid-column.mjs +15 -0
  41. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.mjs +4 -3
  42. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +3 -2
  43. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  44. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +2 -2
  45. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  46. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
  47. package/fesm2022/c8y-ngx-components-echart.mjs +60 -15
  48. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  49. package/fesm2022/c8y-ngx-components-operations-bulk-operations-service.mjs +20 -1
  50. package/fesm2022/c8y-ngx-components-operations-bulk-operations-service.mjs.map +1 -1
  51. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +102 -21
  52. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
  53. package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs +214 -0
  54. package/fesm2022/c8y-ngx-components-operations-grid-columns.mjs.map +1 -0
  55. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +3 -2
  56. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  57. package/fesm2022/c8y-ngx-components.mjs +9 -4
  58. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  59. package/locales/locales.pot +16 -7
  60. package/operations/bulk-operations-service/bulk-operations.service.d.ts +5 -3
  61. package/operations/bulk-operations-service/bulk-operations.service.d.ts.map +1 -1
  62. package/operations/bulk-single-operations-list/bulk-single-operations-list.module.d.ts +10 -8
  63. package/operations/bulk-single-operations-list/bulk-single-operations-list.module.d.ts.map +1 -1
  64. package/operations/bulk-single-operations-list/single-operation-item.component.d.ts +3 -0
  65. package/operations/bulk-single-operations-list/single-operation-item.component.d.ts.map +1 -1
  66. package/operations/bulk-single-operations-list/single-operations-list.component.d.ts +18 -4
  67. package/operations/bulk-single-operations-list/single-operations-list.component.d.ts.map +1 -1
  68. package/operations/grid-columns/c8y-ngx-components-operations-grid-columns.d.ts.map +1 -0
  69. package/operations/grid-columns/creation-time.cell-renderer.component.d.ts +9 -0
  70. package/operations/grid-columns/creation-time.cell-renderer.component.d.ts.map +1 -0
  71. package/operations/grid-columns/creation-time.grid-column.d.ts +5 -0
  72. package/operations/grid-columns/creation-time.grid-column.d.ts.map +1 -0
  73. package/operations/grid-columns/device.cell-renderer.component.d.ts +14 -0
  74. package/operations/grid-columns/device.cell-renderer.component.d.ts.map +1 -0
  75. package/operations/grid-columns/device.grid-column.d.ts +5 -0
  76. package/operations/grid-columns/device.grid-column.d.ts.map +1 -0
  77. package/operations/grid-columns/failure-reason.cell-renderer.component.d.ts +9 -0
  78. package/operations/grid-columns/failure-reason.cell-renderer.component.d.ts.map +1 -0
  79. package/operations/grid-columns/failure-reason.grid-column.d.ts +5 -0
  80. package/operations/grid-columns/failure-reason.grid-column.d.ts.map +1 -0
  81. package/operations/grid-columns/index.d.ts +9 -0
  82. package/operations/grid-columns/index.d.ts.map +1 -0
  83. package/operations/grid-columns/status.cell-renderer.component.d.ts +11 -0
  84. package/operations/grid-columns/status.cell-renderer.component.d.ts.map +1 -0
  85. package/operations/grid-columns/status.grid-column.d.ts +5 -0
  86. package/operations/grid-columns/status.grid-column.d.ts.map +1 -0
  87. package/package.json +1 -1
  88. package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts.map +1 -1
@@ -107,14 +107,33 @@ class BulkOperationsService {
107
107
  };
108
108
  await this.createBulkOperation(bulkOperation);
109
109
  }
110
- getSingleOperationsByStatus(status, bulkOperationId) {
110
+ getSingleOperationsByStatus(status, bulkOperationId, pagination) {
111
111
  const filter = {
112
112
  withTotalPages: true,
113
+ pageSize: pagination?.pageSize,
114
+ currentPage: pagination?.currentPage,
113
115
  bulkOperationId,
114
116
  status: (status && status.toUpperCase()) || ''
115
117
  };
116
118
  return this.operationService.list(filter);
117
119
  }
120
+ async getSingleOperationsCountByStatus(status, bulkOperationId) {
121
+ const filter = {
122
+ withTotalPages: true,
123
+ bulkOperationId,
124
+ status: (status && status.toUpperCase()) || '',
125
+ pageSize: 1
126
+ };
127
+ return (await this.operationService.list(filter))?.paging?.totalPages;
128
+ }
129
+ async getSingleOperationsTotal(bulkOperationId) {
130
+ const filter = {
131
+ withTotalPages: true,
132
+ bulkOperationId,
133
+ pageSize: 1
134
+ };
135
+ return (await this.operationService.list(filter))?.paging?.totalPages;
136
+ }
118
137
  updateSingleOperation(partialUpdateObject) {
119
138
  return this.operationService.update(partialUpdateObject);
120
139
  }
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-operations-bulk-operations-service.mjs","sources":["../../operations/bulk-operations-service/bulk-operations.service.ts","../../operations/bulk-operations-service/bulk-operations-service.module.ts","../../operations/bulk-operations-service/bulk-operation.model.ts","../../operations/bulk-operations-service/c8y-ngx-components-operations-bulk-operations-service.ts"],"sourcesContent":["import { Location } from '@angular/common';\nimport { Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { flatten, has, isUndefined } from 'lodash-es';\nimport { Subject } from 'rxjs';\n\nimport {\n IdReference,\n IManagedObject,\n InventoryService,\n IOperation,\n IOperationBulk,\n IResult,\n OperationBulkService,\n OperationService\n} from '@c8y/client';\n\nimport { OperationDetails } from './operation-details.model';\nimport { OperationType } from './operation-type.model';\nimport { BulkOperationType } from './bulk-operation.model';\nimport { GenericHookType, hookGeneric, GenericHookOptions } from '@c8y/ngx-components';\n\nexport const baseUrl = 'devicecontrol/bulk/creation/';\n\n/**\n * @deprecated Consider using the `hookListBulkType` function instead.\n */\nexport const HOOK_LIST_BULK_TYPE = new InjectionToken<OperationType | OperationType[]>(\n 'HOOK_LIST_BULK_TYPE'\n);\n\n/**\n * You can either provide a single `OperationType` as parameter:\n * ```typescript\n * hookListBulkType(...)\n * ```\n *\n * Or an array to directly register multiple:\n * ```typescript\n * hookListBulkType([...])\n * ```\n *\n * Or you provide an Service that implements `ExtensionFactory<OperationType>`\n * ```typescript\n * export class MyListBulkTypeFactory implements ExtensionFactory<OperationType> {...}\n * ...\n * hookListBulkType(MyListBulkTypeFactory)\n * ```\n * A typed alternative to `HOOK_LIST_BULK_TYPE`.\n * @param type The `OperationType`'s or `ExtensionFactory` to be provided.\n * @returns An `Provider` to be provided in your module.\n */\nexport function hookListBulkType(\n type: GenericHookType<OperationType>,\n options?: Partial<GenericHookOptions>\n) {\n return hookGeneric<OperationType>(type, HOOK_LIST_BULK_TYPE, options);\n}\n\n@Injectable()\nexport class BulkOperationsService {\n readonly DD_LOW_COUNT: number = 10;\n firmwareId: Subject<IdReference> = new Subject<IdReference>();\n\n private bulkTypes: OperationType[];\n\n constructor(\n private operationBulkService: OperationBulkService,\n private operationService: OperationService,\n private inventoryService: InventoryService,\n private location: Location,\n\n @Optional() @Inject(HOOK_LIST_BULK_TYPE) bulkTypes: Array<OperationType | OperationType[]>\n ) {\n this.bulkTypes = flatten(bulkTypes);\n\n this.bulkTypes = this.bulkTypes.map(type => {\n if (isUndefined(type.selected)) {\n type.selected = false;\n }\n return type;\n });\n }\n\n getBulkOperations(customFilter = {}) {\n const filter = {\n withTotalPages: true,\n withDeleted: true,\n pageSize: 50,\n ...customFilter\n };\n\n return this.operationBulkService.list(filter);\n }\n\n getBulkOperationById(bulkOperationId: string | number) {\n return this.operationBulkService.detail(bulkOperationId);\n }\n\n createBulkOperation(bulkOperation: Partial<IOperationBulk>) {\n return this.operationBulkService.create(bulkOperation);\n }\n\n deleteBulkOperation(bulkOperationId) {\n return this.operationBulkService.delete(bulkOperationId);\n }\n\n updateBulkOperation(bulkOperation: Partial<IOperationBulk>) {\n return this.operationBulkService.update(bulkOperation);\n }\n\n getOperation(id: string): Promise<IResult<IOperation>> {\n return this.operationService.detail(id);\n }\n\n returnToBulkOperationOverview() {\n this.location.back();\n }\n\n setBulkTypes(list: OperationType[]) {\n this.bulkTypes = list;\n }\n\n getBulkTypes(): OperationType[] {\n return this.bulkTypes;\n }\n\n setFirmwareId(id: IdReference) {\n this.firmwareId.next(id);\n }\n\n createGroup(deviceQueryDataString: string) {\n const dynamicGroup: Partial<IManagedObject> = {\n name: 'Bulk operations group',\n type: 'c8y_DynamicGroup',\n c8y_IsDynamicGroup: { invisible: {} },\n c8y_DeviceQueryString: deviceQueryDataString\n };\n\n return this.inventoryService.create(dynamicGroup);\n }\n\n async scheduleBulkOperation(deviceQueryString: string, details: OperationDetails) {\n const dynamicGroup = await this.createGroup(deviceQueryString);\n\n const bulkOperation: IOperationBulk = {\n groupId: dynamicGroup.data.id,\n operationPrototype: details.prototype,\n creationRamp: details.schedule.delayInSeconds,\n startDate: details.schedule.scheduledDate.toISOString(),\n note: details.note\n };\n\n await this.createBulkOperation(bulkOperation);\n }\n\n getSingleOperationsByStatus(status, bulkOperationId) {\n const filter = {\n withTotalPages: true,\n bulkOperationId,\n status: (status && status.toUpperCase()) || ''\n };\n\n return this.operationService.list(filter);\n }\n\n updateSingleOperation(partialUpdateObject: Partial<IOperation>) {\n return this.operationService.update(partialUpdateObject);\n }\n\n retrieveBulkOperationType(operation: IOperation): BulkOperationType {\n let type: BulkOperationType;\n\n this.bulkTypes.some(t => {\n if (t.fragments.some(fragment => has(operation, fragment))) {\n type = t.type;\n return true;\n }\n });\n\n return type;\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { BulkOperationsService } from './bulk-operations.service';\n\n/**\n * This module provides a shared bulk operations service.\n */\n@NgModule({\n imports: [],\n providers: [BulkOperationsService]\n})\nexport class BulkOperationsServiceModule {}\n","export enum BulkOperationType {\n SOFTWARE = 'software',\n FIRMWARE = 'firmware',\n CONFIGURATION = 'configuration',\n DEVICE_PROFILE = 'device-profile'\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-operations-bulk-operations-service.mjs","sources":["../../operations/bulk-operations-service/bulk-operations.service.ts","../../operations/bulk-operations-service/bulk-operations-service.module.ts","../../operations/bulk-operations-service/bulk-operation.model.ts","../../operations/bulk-operations-service/c8y-ngx-components-operations-bulk-operations-service.ts"],"sourcesContent":["import { Location } from '@angular/common';\nimport { Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { flatten, has, isUndefined } from 'lodash-es';\nimport { Subject } from 'rxjs';\n\nimport {\n IdReference,\n IManagedObject,\n InventoryService,\n IOperation,\n IOperationBulk,\n IResult,\n OperationBulkService,\n OperationService\n} from '@c8y/client';\n\nimport { GenericHookOptions, GenericHookType, hookGeneric, Pagination } from '@c8y/ngx-components';\nimport { BulkOperationType } from './bulk-operation.model';\nimport { OperationDetails } from './operation-details.model';\nimport { OperationType } from './operation-type.model';\n\nexport const baseUrl = 'devicecontrol/bulk/creation/';\n\n/**\n * @deprecated Consider using the `hookListBulkType` function instead.\n */\nexport const HOOK_LIST_BULK_TYPE = new InjectionToken<OperationType | OperationType[]>(\n 'HOOK_LIST_BULK_TYPE'\n);\n\n/**\n * You can either provide a single `OperationType` as parameter:\n * ```typescript\n * hookListBulkType(...)\n * ```\n *\n * Or an array to directly register multiple:\n * ```typescript\n * hookListBulkType([...])\n * ```\n *\n * Or you provide an Service that implements `ExtensionFactory<OperationType>`\n * ```typescript\n * export class MyListBulkTypeFactory implements ExtensionFactory<OperationType> {...}\n * ...\n * hookListBulkType(MyListBulkTypeFactory)\n * ```\n * A typed alternative to `HOOK_LIST_BULK_TYPE`.\n * @param type The `OperationType`'s or `ExtensionFactory` to be provided.\n * @returns An `Provider` to be provided in your module.\n */\nexport function hookListBulkType(\n type: GenericHookType<OperationType>,\n options?: Partial<GenericHookOptions>\n) {\n return hookGeneric<OperationType>(type, HOOK_LIST_BULK_TYPE, options);\n}\n\n@Injectable()\nexport class BulkOperationsService {\n readonly DD_LOW_COUNT: number = 10;\n firmwareId: Subject<IdReference> = new Subject<IdReference>();\n\n private bulkTypes: OperationType[];\n\n constructor(\n private operationBulkService: OperationBulkService,\n private operationService: OperationService,\n private inventoryService: InventoryService,\n private location: Location,\n\n @Optional() @Inject(HOOK_LIST_BULK_TYPE) bulkTypes: Array<OperationType | OperationType[]>\n ) {\n this.bulkTypes = flatten(bulkTypes);\n\n this.bulkTypes = this.bulkTypes.map(type => {\n if (isUndefined(type.selected)) {\n type.selected = false;\n }\n return type;\n });\n }\n\n getBulkOperations(customFilter = {}) {\n const filter = {\n withTotalPages: true,\n withDeleted: true,\n pageSize: 50,\n ...customFilter\n };\n\n return this.operationBulkService.list(filter);\n }\n\n getBulkOperationById(bulkOperationId: string | number) {\n return this.operationBulkService.detail(bulkOperationId);\n }\n\n createBulkOperation(bulkOperation: Partial<IOperationBulk>) {\n return this.operationBulkService.create(bulkOperation);\n }\n\n deleteBulkOperation(bulkOperationId) {\n return this.operationBulkService.delete(bulkOperationId);\n }\n\n updateBulkOperation(bulkOperation: Partial<IOperationBulk>) {\n return this.operationBulkService.update(bulkOperation);\n }\n\n getOperation(id: string): Promise<IResult<IOperation>> {\n return this.operationService.detail(id);\n }\n\n returnToBulkOperationOverview() {\n this.location.back();\n }\n\n setBulkTypes(list: OperationType[]) {\n this.bulkTypes = list;\n }\n\n getBulkTypes(): OperationType[] {\n return this.bulkTypes;\n }\n\n setFirmwareId(id: IdReference) {\n this.firmwareId.next(id);\n }\n\n createGroup(deviceQueryDataString: string) {\n const dynamicGroup: Partial<IManagedObject> = {\n name: 'Bulk operations group',\n type: 'c8y_DynamicGroup',\n c8y_IsDynamicGroup: { invisible: {} },\n c8y_DeviceQueryString: deviceQueryDataString\n };\n\n return this.inventoryService.create(dynamicGroup);\n }\n\n async scheduleBulkOperation(deviceQueryString: string, details: OperationDetails) {\n const dynamicGroup = await this.createGroup(deviceQueryString);\n\n const bulkOperation: IOperationBulk = {\n groupId: dynamicGroup.data.id,\n operationPrototype: details.prototype,\n creationRamp: details.schedule.delayInSeconds,\n startDate: details.schedule.scheduledDate.toISOString(),\n note: details.note\n };\n\n await this.createBulkOperation(bulkOperation);\n }\n\n getSingleOperationsByStatus(status, bulkOperationId, pagination?: Pagination) {\n const filter = {\n withTotalPages: true,\n pageSize: pagination?.pageSize,\n currentPage: pagination?.currentPage,\n bulkOperationId,\n status: (status && status.toUpperCase()) || ''\n };\n\n return this.operationService.list(filter);\n }\n\n async getSingleOperationsCountByStatus(status, bulkOperationId): Promise<number> {\n const filter = {\n withTotalPages: true,\n bulkOperationId,\n status: (status && status.toUpperCase()) || '',\n pageSize: 1\n };\n\n return (await this.operationService.list(filter))?.paging?.totalPages;\n }\n\n async getSingleOperationsTotal(bulkOperationId): Promise<number> {\n const filter = {\n withTotalPages: true,\n bulkOperationId,\n pageSize: 1\n };\n\n return (await this.operationService.list(filter))?.paging?.totalPages;\n }\n\n updateSingleOperation(partialUpdateObject: Partial<IOperation>) {\n return this.operationService.update(partialUpdateObject);\n }\n\n retrieveBulkOperationType(operation: IOperation): BulkOperationType {\n let type: BulkOperationType;\n\n this.bulkTypes.some(t => {\n if (t.fragments.some(fragment => has(operation, fragment))) {\n type = t.type;\n return true;\n }\n });\n\n return type;\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { BulkOperationsService } from './bulk-operations.service';\n\n/**\n * This module provides a shared bulk operations service.\n */\n@NgModule({\n imports: [],\n providers: [BulkOperationsService]\n})\nexport class BulkOperationsServiceModule {}\n","export enum BulkOperationType {\n SOFTWARE = 'software',\n FIRMWARE = 'firmware',\n CONFIGURATION = 'configuration',\n DEVICE_PROFILE = 'device-profile'\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,23 +1,30 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, Input, ViewChild, EventEmitter, Output, NgModule } from '@angular/core';
2
+ import { Component, Input, ViewChild, EventEmitter, inject, Output, NgModule } from '@angular/core';
3
3
  import * as i5 from '@angular/router';
4
4
  import { RouterModule } from '@angular/router';
5
+ import * as i1 from '@c8y/ngx-components';
6
+ import { gettext, AlertService, DataGridComponent, C8yTranslatePipe, IconDirective, DataGridModule, EmptyStateComponent, CoreModule } from '@c8y/ngx-components';
5
7
  import * as i4 from 'ngx-bootstrap/popover';
6
8
  import { PopoverModule } from 'ngx-bootstrap/popover';
7
9
  import * as i6 from 'ngx-bootstrap/tooltip';
8
10
  import { TooltipModule } from 'ngx-bootstrap/tooltip';
9
- import * as i1 from '@c8y/ngx-components';
10
- import { gettext, CoreModule } from '@c8y/ngx-components';
11
- import * as i4$1 from '@c8y/ngx-components/operations/status-filter';
12
- import { StatusFilterComponent, StatusFilterModule } from '@c8y/ngx-components/operations/status-filter';
13
11
  import * as i2 from '@c8y/client';
14
- import { OperationStatus } from '@c8y/client';
12
+ import { OperationStatus, OperationService } from '@c8y/client';
15
13
  import { BULK_OPERATION_EVENT, ACTIONS_OPERATIONS, COMPONENTS } from '@c8y/ngx-components/operations/product-experience';
16
14
  import { OPERATION_STATUS_LABELS, OPERATION_STATUS_OPTIONS_MAP } from '@c8y/ngx-components/operations/shared';
17
15
  import { omit } from 'lodash-es';
18
16
  import * as i3 from '@angular/common';
17
+ import { NgIf } from '@angular/common';
18
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
19
19
  import * as i1$1 from '@c8y/ngx-components/operations/bulk-operations-service';
20
+ import { OperationStatusGridColumn, DeviceGridColumn, CreationTimeGridColumn, FailureReasonGridColumn } from '@c8y/ngx-components/operations/grid-columns';
21
+ import * as i2$1 from '@c8y/ngx-components/operations/status-filter';
22
+ import { StatusFilterComponent, StatusFilterModule } from '@c8y/ngx-components/operations/status-filter';
23
+ import { Subject, merge, throttleTime } from 'rxjs';
20
24
 
25
+ /**
26
+ * @deprecated Single operations list in bulk operations details has been replaced by data grid. This component will be removed in the future.
27
+ */
21
28
  class SingleOperationItemComponent {
22
29
  constructor(alertService, inventoryService, operationService) {
23
30
  this.alertService = alertService;
@@ -74,30 +81,77 @@ class SingleOperationsListComponent {
74
81
  this.OPERATION_STATUS = { ...OperationStatus, ALL: gettext('ALL') };
75
82
  this.OPERATION_STATUS_LABELS = OPERATION_STATUS_LABELS;
76
83
  this.OPERATION_STATUS_OPTIONS_MAP = OPERATION_STATUS_OPTIONS_MAP;
84
+ this.displayOptions = {
85
+ gridHeader: false
86
+ };
87
+ this.pagination = {
88
+ pageSize: 25,
89
+ currentPage: 1
90
+ };
91
+ this.columns = [
92
+ new OperationStatusGridColumn(),
93
+ new DeviceGridColumn(),
94
+ new CreationTimeGridColumn(),
95
+ new FailureReasonGridColumn()
96
+ ];
97
+ this.actions = [
98
+ {
99
+ type: 'retry',
100
+ icon: 'repeat',
101
+ label: gettext('Retry operation'),
102
+ text: gettext('Retry operation'),
103
+ callback: operation => {
104
+ this.retrySingleOperation(operation);
105
+ },
106
+ showIf: operation => !this.readOnly &&
107
+ operation.status.toString() === OPERATION_STATUS_OPTIONS_MAP.FAILED.status.toString()
108
+ }
109
+ ];
110
+ this.operationService = inject(OperationService);
111
+ this.alertService = inject(AlertService);
112
+ this.reload$ = new Subject();
113
+ this.reloadThrottled$ = new Subject();
114
+ this.serverSideDataCallback = this.onDataSourceModifier.bind(this);
115
+ merge(this.reload$, this.reloadThrottled$.pipe(throttleTime(30_000)))
116
+ .pipe(takeUntilDestroyed())
117
+ .subscribe(() => this.dataGrid?.reload(false));
77
118
  }
78
119
  async ngAfterViewInit() {
79
120
  if (this.statusFilter) {
80
- this.filterOperationsByType();
121
+ this.setStatusFilter(false);
81
122
  }
82
123
  }
83
124
  ngOnChanges(changes) {
84
125
  if (changes.bulkOperation && !changes.bulkOperation.firstChange) {
85
- this.filterOperationsByType();
126
+ this.reloadThrottled$.next();
86
127
  }
87
128
  }
88
- filterOperationsByType() {
129
+ reload(option) {
130
+ const [opt] = option ?? [];
131
+ this.filterStatus = opt?.status ?? this.filterStatus;
132
+ this.reload$.next();
133
+ }
134
+ async onDataSourceModifier(dataSourceModifier) {
135
+ const filter = this.filterStatus ?? this.getFilterTypeOfSingleOperations();
136
+ const { res, data, paging } = await this.bulkOperationsService.getSingleOperationsByStatus(filter, this.bulkOperation.id, dataSourceModifier.pagination);
137
+ const filteredSize = await this.bulkOperationsService.getSingleOperationsCountByStatus(filter, this.bulkOperation.id);
138
+ const size = await this.bulkOperationsService.getSingleOperationsTotal(this.bulkOperation.id);
139
+ const serverSideDataResult = { res, data, paging, filteredSize, size };
140
+ return serverSideDataResult;
141
+ }
142
+ setStatusFilter(emit = true) {
89
143
  if (this.statusFilter) {
90
144
  const typeFilter = this.getFilterTypeOfSingleOperations();
91
145
  this.statusFilter.preset(typeFilter === this.OPERATION_STATUS.ALL
92
146
  ? []
93
- : [{ label: this.OPERATION_STATUS_LABELS[typeFilter] }]);
147
+ : [{ label: this.OPERATION_STATUS_LABELS[typeFilter] }], emit);
94
148
  }
95
149
  else {
96
- setTimeout(this.filterOperationsByType.bind(this));
150
+ setTimeout(this.setStatusFilter.bind(this, emit));
97
151
  }
98
152
  }
99
153
  getFilterTypeOfSingleOperations() {
100
- const progress = this.bulkOperation.progress;
154
+ const { progress } = this.bulkOperation;
101
155
  if (progress.failed > 0) {
102
156
  return this.OPERATION_STATUS.FAILED;
103
157
  }
@@ -112,18 +166,39 @@ class SingleOperationsListComponent {
112
166
  }
113
167
  return this.OPERATION_STATUS.ALL;
114
168
  }
115
- async getOperationsByStatus(filter) {
116
- this.singleOperations = await this.bulkOperationsService.getSingleOperationsByStatus(filter[0] && filter[0].label, this.bulkOperation.id);
117
- }
118
169
  retryBulkOperation() {
119
170
  this.onRetryFailedOperations.emit(this.bulkOperation);
120
171
  }
172
+ async retrySingleOperation(singleOperation) {
173
+ const operationToCreate = omit(singleOperation, [
174
+ 'id',
175
+ 'self',
176
+ 'status',
177
+ 'failureReason',
178
+ 'creationTime',
179
+ 'delivery'
180
+ ]);
181
+ try {
182
+ await this.operationService.create(operationToCreate);
183
+ this.alertService.success(gettext('Operation created.'));
184
+ }
185
+ catch (er) {
186
+ this.alertService.addServerFailure(er);
187
+ }
188
+ }
121
189
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SingleOperationsListComponent, deps: [{ token: i1$1.BulkOperationsService }], target: i0.ɵɵFactoryTarget.Component }); }
122
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SingleOperationsListComponent, selector: "c8y-single-operations-list", inputs: { bulkOperation: "bulkOperation", readOnly: "readOnly" }, outputs: { onRetryFailedOperations: "onRetryFailedOperations" }, viewQueries: [{ propertyName: "statusFilter", first: true, predicate: StatusFilterComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container\n *ngIf=\"\n bulkOperation.progress.failed ||\n bulkOperation.progress.executing ||\n bulkOperation.progress.pending ||\n bulkOperation.progress.successful\n \"\n>\n <div class=\"legend form-block p-t-16 m-b-0\" translate>Operations</div>\n <div class=\"d-flex a-i-center\">\n <div class=\"d-flex a-i-center p-b-8\">\n <span class=\"m-r-4 text-medium\" translate>Filter by status</span>\n <c8y-status-filter\n small\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"getOperationsByStatus($event)\"\n ></c8y-status-filter>\n </div>\n <div class=\"m-l-auto p-b-8\" *ngIf=\"!readOnly && bulkOperation.progress.failed > 0\">\n <button\n class=\"btn btn-navbar\"\n (click)=\"retryBulkOperation()\"\n title=\"{{ 'Retry failed operations' | translate }}\"\n >\n <i c8yIcon=\"repeat\" class=\"m-r-4\"></i> <span translate>Retry failed operations</span>\n </button>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group>\n <div class=\"d-contents\" *c8yFor=\"let operation of singleOperations; loadMore: 'auto'\">\n <c8y-single-operation-item [operation]=\"operation\" [readOnly]=\"readOnly\" class=\"d-contents\">\n </c8y-single-operation-item>\n </div>\n\n <c8y-li *ngIf=\"singleOperations && singleOperations.data.length === 0\">\n <c8y-li-body>\n <div class=\"c8y-empty-state text-center\">\n <h2 class=\"c8y-icon c8y-icon-energy c8y-icon-duocolor m-b-16\"></h2>\n <div>\n <h3 translate>No single operations of the selected status to display.</h3>\n <p class=\"m-b-16\" translate>Single operations will be displayed here</p>\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i4$1.StatusFilterComponent, selector: "c8y-status-filter", inputs: ["options", "multiple", "small"], outputs: ["onFilterChanged"] }, { kind: "component", type: SingleOperationItemComponent, selector: "c8y-single-operation-item", inputs: ["operation", "readOnly"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); }
190
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SingleOperationsListComponent, isStandalone: true, selector: "c8y-single-operations-list", inputs: { bulkOperation: "bulkOperation", readOnly: "readOnly" }, outputs: { onRetryFailedOperations: "onRetryFailedOperations" }, viewQueries: [{ propertyName: "statusFilter", first: true, predicate: StatusFilterComponent, descendants: true }, { propertyName: "dataGrid", first: true, predicate: DataGridComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container\n *ngIf=\"\n bulkOperation.progress.failed ||\n bulkOperation.progress.executing ||\n bulkOperation.progress.pending ||\n bulkOperation.progress.successful\n \"\n>\n <div\n class=\"legend form-block p-t-16 m-b-0\"\n translate\n >\n Operations\n </div>\n <div class=\"d-flex a-i-center\">\n <div class=\"d-flex a-i-center p-b-8\">\n <span\n class=\"m-r-4 text-medium\"\n translate\n >\n Filter by status\n </span>\n <c8y-status-filter\n small\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"reload($event)\"\n ></c8y-status-filter>\n </div>\n <div\n class=\"m-l-auto p-b-8\"\n *ngIf=\"!readOnly && bulkOperation.progress.failed > 0\"\n >\n <button\n class=\"btn btn-navbar\"\n title=\"{{ 'Retry failed operations' | translate }}\"\n (click)=\"retryBulkOperation()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"repeat\"\n ></i>\n <span translate>Retry failed operations</span>\n </button>\n </div>\n </div>\n <c8y-data-grid\n [actionControls]=\"actions\"\n [columns]=\"columns\"\n [displayOptions]=\"displayOptions\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [pagination]=\"pagination\"\n >\n <c8y-ui-empty-state\n icon=\"search\"\n [title]=\"'No single operations of the selected status to display.' | translate\"\n [subtitle]=\"'Single operations will be displayed here' | translate\"\n horizontal\n ></c8y-ui-empty-state>\n </c8y-data-grid>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: StatusFilterModule }, { kind: "component", type: i2$1.StatusFilterComponent, selector: "c8y-status-filter", inputs: ["options", "multiple", "small"], outputs: ["onFilterChanged"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: DataGridModule }, { kind: "component", type: i1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "hideReload"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }] }); }
123
191
  }
124
192
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SingleOperationsListComponent, decorators: [{
125
193
  type: Component,
126
- args: [{ selector: 'c8y-single-operations-list', template: "<ng-container\n *ngIf=\"\n bulkOperation.progress.failed ||\n bulkOperation.progress.executing ||\n bulkOperation.progress.pending ||\n bulkOperation.progress.successful\n \"\n>\n <div class=\"legend form-block p-t-16 m-b-0\" translate>Operations</div>\n <div class=\"d-flex a-i-center\">\n <div class=\"d-flex a-i-center p-b-8\">\n <span class=\"m-r-4 text-medium\" translate>Filter by status</span>\n <c8y-status-filter\n small\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"getOperationsByStatus($event)\"\n ></c8y-status-filter>\n </div>\n <div class=\"m-l-auto p-b-8\" *ngIf=\"!readOnly && bulkOperation.progress.failed > 0\">\n <button\n class=\"btn btn-navbar\"\n (click)=\"retryBulkOperation()\"\n title=\"{{ 'Retry failed operations' | translate }}\"\n >\n <i c8yIcon=\"repeat\" class=\"m-r-4\"></i> <span translate>Retry failed operations</span>\n </button>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group>\n <div class=\"d-contents\" *c8yFor=\"let operation of singleOperations; loadMore: 'auto'\">\n <c8y-single-operation-item [operation]=\"operation\" [readOnly]=\"readOnly\" class=\"d-contents\">\n </c8y-single-operation-item>\n </div>\n\n <c8y-li *ngIf=\"singleOperations && singleOperations.data.length === 0\">\n <c8y-li-body>\n <div class=\"c8y-empty-state text-center\">\n <h2 class=\"c8y-icon c8y-icon-energy c8y-icon-duocolor m-b-16\"></h2>\n <div>\n <h3 translate>No single operations of the selected status to display.</h3>\n <p class=\"m-b-16\" translate>Single operations will be displayed here</p>\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n</ng-container>\n" }]
194
+ args: [{ standalone: true, selector: 'c8y-single-operations-list', imports: [
195
+ StatusFilterModule,
196
+ NgIf,
197
+ C8yTranslatePipe,
198
+ IconDirective,
199
+ DataGridModule,
200
+ EmptyStateComponent
201
+ ], template: "<ng-container\n *ngIf=\"\n bulkOperation.progress.failed ||\n bulkOperation.progress.executing ||\n bulkOperation.progress.pending ||\n bulkOperation.progress.successful\n \"\n>\n <div\n class=\"legend form-block p-t-16 m-b-0\"\n translate\n >\n Operations\n </div>\n <div class=\"d-flex a-i-center\">\n <div class=\"d-flex a-i-center p-b-8\">\n <span\n class=\"m-r-4 text-medium\"\n translate\n >\n Filter by status\n </span>\n <c8y-status-filter\n small\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"reload($event)\"\n ></c8y-status-filter>\n </div>\n <div\n class=\"m-l-auto p-b-8\"\n *ngIf=\"!readOnly && bulkOperation.progress.failed > 0\"\n >\n <button\n class=\"btn btn-navbar\"\n title=\"{{ 'Retry failed operations' | translate }}\"\n (click)=\"retryBulkOperation()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"repeat\"\n ></i>\n <span translate>Retry failed operations</span>\n </button>\n </div>\n </div>\n <c8y-data-grid\n [actionControls]=\"actions\"\n [columns]=\"columns\"\n [displayOptions]=\"displayOptions\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [pagination]=\"pagination\"\n >\n <c8y-ui-empty-state\n icon=\"search\"\n [title]=\"'No single operations of the selected status to display.' | translate\"\n [subtitle]=\"'Single operations will be displayed here' | translate\"\n horizontal\n ></c8y-ui-empty-state>\n </c8y-data-grid>\n</ng-container>\n" }]
127
202
  }], ctorParameters: () => [{ type: i1$1.BulkOperationsService }], propDecorators: { bulkOperation: [{
128
203
  type: Input
129
204
  }], readOnly: [{
@@ -133,21 +208,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
133
208
  }], statusFilter: [{
134
209
  type: ViewChild,
135
210
  args: [StatusFilterComponent, { static: false }]
211
+ }], dataGrid: [{
212
+ type: ViewChild,
213
+ args: [DataGridComponent, { static: false }]
136
214
  }] } });
137
215
 
138
216
  /**
139
217
  * This module allows for displaying the list of single operations in a bulk operations details.
218
+ *
219
+ * @deprecated This module is deprecated and will be removed in a future version. I
220
+ * nstead, use the `SingleOperationsListComponent` as a standalone component directly.
140
221
  */
141
222
  class BulkSingleOperationsListModule {
142
223
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BulkSingleOperationsListModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
143
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: BulkSingleOperationsListModule, declarations: [SingleOperationsListComponent, SingleOperationItemComponent], imports: [CoreModule, PopoverModule, RouterModule, TooltipModule, StatusFilterModule], exports: [SingleOperationsListComponent, SingleOperationItemComponent] }); }
144
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BulkSingleOperationsListModule, imports: [CoreModule, PopoverModule, RouterModule, TooltipModule, StatusFilterModule] }); }
224
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: BulkSingleOperationsListModule, declarations: [SingleOperationItemComponent], imports: [CoreModule, PopoverModule, RouterModule, TooltipModule, SingleOperationsListComponent], exports: [SingleOperationsListComponent, SingleOperationItemComponent] }); }
225
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BulkSingleOperationsListModule, imports: [CoreModule, PopoverModule, RouterModule, TooltipModule, SingleOperationsListComponent] }); }
145
226
  }
146
227
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BulkSingleOperationsListModule, decorators: [{
147
228
  type: NgModule,
148
229
  args: [{
149
- imports: [CoreModule, PopoverModule, RouterModule, TooltipModule, StatusFilterModule],
150
- declarations: [SingleOperationsListComponent, SingleOperationItemComponent],
230
+ imports: [CoreModule, PopoverModule, RouterModule, TooltipModule, SingleOperationsListComponent],
231
+ declarations: [SingleOperationItemComponent],
151
232
  exports: [SingleOperationsListComponent, SingleOperationItemComponent]
152
233
  }]
153
234
  }] });
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-operations-bulk-single-operations-list.mjs","sources":["../../operations/bulk-single-operations-list/single-operation-item.component.ts","../../operations/bulk-single-operations-list/single-operation-item.component.html","../../operations/bulk-single-operations-list/single-operations-list.component.ts","../../operations/bulk-single-operations-list/single-operations-list.component.html","../../operations/bulk-single-operations-list/bulk-single-operations-list.module.ts","../../operations/bulk-single-operations-list/c8y-ngx-components-operations-bulk-single-operations-list.ts"],"sourcesContent":["import { Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { InventoryService, IOperation, OperationService } from '@c8y/client';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport {\n ACTIONS_OPERATIONS,\n BULK_OPERATION_EVENT,\n COMPONENTS\n} from '@c8y/ngx-components/operations/product-experience';\nimport {\n OperationStatusOptionsMapShared,\n OPERATION_STATUS_LABELS,\n OPERATION_STATUS_OPTIONS_MAP\n} from '@c8y/ngx-components/operations/shared';\nimport { omit } from 'lodash-es';\n\n@Component({\n selector: 'c8y-single-operation-item',\n templateUrl: './single-operation-item.component.html'\n})\nexport class SingleOperationItemComponent {\n BULK_OPERATION_EVENT = BULK_OPERATION_EVENT;\n ACTIONS = ACTIONS_OPERATIONS;\n COMPONENTS = COMPONENTS;\n device = {};\n OPERATION_STATUS_LABELS = OPERATION_STATUS_LABELS;\n OPERATION_STATUS_OPTIONS_MAP: OperationStatusOptionsMapShared = OPERATION_STATUS_OPTIONS_MAP;\n @Input()\n operation: IOperation;\n @Input()\n readOnly = false;\n @ViewChild('failureReason', { static: true }) failureReasonRef: ElementRef;\n\n constructor(\n private alertService: AlertService,\n private inventoryService: InventoryService,\n private operationService: OperationService\n ) {}\n\n async ngOnInit() {\n this.device = (await this.inventoryService.detail(this.operation.deviceId))?.data;\n }\n\n async retrySingleOperation(singleOperation) {\n const operationToCreate = omit(singleOperation, [\n 'id',\n 'self',\n 'status',\n 'failureReason',\n 'creationTime',\n 'delivery'\n ]);\n\n try {\n await this.operationService.create(operationToCreate);\n this.alertService.success(gettext('Operation created.'));\n } catch (er) {\n this.alertService.addServerFailure(er);\n }\n }\n}\n","<c8y-li class=\"c8y-list__item--double-actions\">\n <c8y-li-icon>\n <i\n [c8yIcon]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].icon\"\n [tooltip]=\"operation.status.toString() | translate\"\n [ngClass]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].styleClass\"\n ></i>\n </c8y-li-icon>\n <div [ngClass]=\"{ 'content-flex-80': !readOnly, 'content-flex-50': readOnly }\">\n <div class=\"col-4\">\n <span class=\"m-r-4\">\n <device-status [mo]=\"device\"></device-status>\n </span>\n <a\n [routerLink]=\"['/device', operation.deviceId, 'device-info']\"\n routerLinkActive=\"active\"\n >\n {{ operation.deviceName }}\n </a>\n </div>\n <div class=\"col-3\">\n <small class=\"icon-flex text-muted\">\n <i\n class=\"m-r-4\"\n c8yIcon=\"calendar\"\n ></i>\n {{ operation.creationTime | c8yDate }}\n </small>\n </div>\n <div class=\"col-5\">\n <div class=\"d-flex a-i-center\">\n <span\n class=\"text-truncate\"\n #failureReason\n >\n {{ operation.failureReason | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ operation.failureReason | translate }}\"\n placement=\"left\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"failureReason.offsetWidth < failureReason.scrollWidth\"\n >\n <i [c8yIcon]=\"'info-circle'\"></i>\n </button>\n <div\n class=\"showOnHover p-l-8 p-r-8 fit-h-20 m-l-auto\"\n *ngIf=\"\n !readOnly &&\n operation.status.toString() == OPERATION_STATUS_OPTIONS_MAP.FAILED.status.toString()\n \"\n >\n <button\n class=\"btn btn-default btn-xs\"\n title=\"{{ 'Retry operation' | translate }}\"\n type=\"button\"\n (click)=\"retrySingleOperation(operation)\"\n c8yProductExperience\n [actionName]=\"BULK_OPERATION_EVENT\"\n [actionData]=\"{ action: ACTIONS.RETRY, component: COMPONENTS.SINGLE_OPERATION_ITEM }\"\n >\n <i [c8yIcon]=\"'repeat m-r-4'\"></i>\n {{ 'Retry operation' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</c8y-li>\n","import {\n AfterViewInit,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { IOperation, IOperationBulk, IResultList, OperationStatus } from '@c8y/client';\nimport { StatusFilterComponent } from '@c8y/ngx-components/operations/status-filter';\nimport { BulkOperationsService } from '@c8y/ngx-components/operations/bulk-operations-service';\nimport {\n OperationStatusOption,\n OperationStatusOptionsMapShared,\n OPERATION_STATUS_LABELS,\n OPERATION_STATUS_OPTIONS_MAP\n} from '@c8y/ngx-components/operations/shared';\n\n@Component({\n selector: 'c8y-single-operations-list',\n templateUrl: './single-operations-list.component.html'\n})\nexport class SingleOperationsListComponent implements AfterViewInit, OnChanges {\n @Input()\n bulkOperation: Partial<IOperationBulk>;\n @Input()\n readOnly = false;\n @Output() onRetryFailedOperations: EventEmitter<Partial<IOperationBulk>> = new EventEmitter();\n\n @ViewChild(StatusFilterComponent, { static: false })\n statusFilter: StatusFilterComponent;\n\n OPERATION_STATUS = { ...OperationStatus, ALL: gettext('ALL') };\n OPERATION_STATUS_LABELS = OPERATION_STATUS_LABELS;\n OPERATION_STATUS_OPTIONS_MAP: OperationStatusOptionsMapShared = OPERATION_STATUS_OPTIONS_MAP;\n singleOperations: IResultList<IOperation>;\n\n constructor(private bulkOperationsService: BulkOperationsService) {}\n\n async ngAfterViewInit() {\n if (this.statusFilter) {\n this.filterOperationsByType();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.bulkOperation && !changes.bulkOperation.firstChange) {\n this.filterOperationsByType();\n }\n }\n\n filterOperationsByType() {\n if (this.statusFilter) {\n const typeFilter = this.getFilterTypeOfSingleOperations();\n this.statusFilter.preset(\n typeFilter === this.OPERATION_STATUS.ALL\n ? []\n : [{ label: this.OPERATION_STATUS_LABELS[typeFilter] }]\n );\n } else {\n setTimeout(this.filterOperationsByType.bind(this));\n }\n }\n\n getFilterTypeOfSingleOperations() {\n const progress = this.bulkOperation.progress;\n\n if (progress.failed > 0) {\n return this.OPERATION_STATUS.FAILED;\n } else if (progress.failed === 0 && progress.successful === 0 && progress.pending === 0) {\n return this.OPERATION_STATUS.EXECUTING;\n } else if (progress.failed === 0 && progress.successful === 0 && progress.executing === 0) {\n return this.OPERATION_STATUS.PENDING;\n } else if (progress.failed === 0 && progress.pending === 0 && progress.executing === 0) {\n return this.OPERATION_STATUS.SUCCESSFUL;\n }\n\n return this.OPERATION_STATUS.ALL;\n }\n\n async getOperationsByStatus(filter: OperationStatusOption[]) {\n this.singleOperations = await this.bulkOperationsService.getSingleOperationsByStatus(\n filter[0] && filter[0].label,\n this.bulkOperation.id\n );\n }\n\n retryBulkOperation() {\n this.onRetryFailedOperations.emit(this.bulkOperation);\n }\n}\n","<ng-container\n *ngIf=\"\n bulkOperation.progress.failed ||\n bulkOperation.progress.executing ||\n bulkOperation.progress.pending ||\n bulkOperation.progress.successful\n \"\n>\n <div class=\"legend form-block p-t-16 m-b-0\" translate>Operations</div>\n <div class=\"d-flex a-i-center\">\n <div class=\"d-flex a-i-center p-b-8\">\n <span class=\"m-r-4 text-medium\" translate>Filter by status</span>\n <c8y-status-filter\n small\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"getOperationsByStatus($event)\"\n ></c8y-status-filter>\n </div>\n <div class=\"m-l-auto p-b-8\" *ngIf=\"!readOnly && bulkOperation.progress.failed > 0\">\n <button\n class=\"btn btn-navbar\"\n (click)=\"retryBulkOperation()\"\n title=\"{{ 'Retry failed operations' | translate }}\"\n >\n <i c8yIcon=\"repeat\" class=\"m-r-4\"></i> <span translate>Retry failed operations</span>\n </button>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group>\n <div class=\"d-contents\" *c8yFor=\"let operation of singleOperations; loadMore: 'auto'\">\n <c8y-single-operation-item [operation]=\"operation\" [readOnly]=\"readOnly\" class=\"d-contents\">\n </c8y-single-operation-item>\n </div>\n\n <c8y-li *ngIf=\"singleOperations && singleOperations.data.length === 0\">\n <c8y-li-body>\n <div class=\"c8y-empty-state text-center\">\n <h2 class=\"c8y-icon c8y-icon-energy c8y-icon-duocolor m-b-16\"></h2>\n <div>\n <h3 translate>No single operations of the selected status to display.</h3>\n <p class=\"m-b-16\" translate>Single operations will be displayed here</p>\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\n\nimport { CoreModule } from '@c8y/ngx-components';\nimport { StatusFilterModule } from '@c8y/ngx-components/operations/status-filter';\n\nimport { SingleOperationItemComponent } from './single-operation-item.component';\nimport { SingleOperationsListComponent } from './single-operations-list.component';\n\n/**\n * This module allows for displaying the list of single operations in a bulk operations details.\n */\n@NgModule({\n imports: [CoreModule, PopoverModule, RouterModule, TooltipModule, StatusFilterModule],\n declarations: [SingleOperationsListComponent, SingleOperationItemComponent],\n exports: [SingleOperationsListComponent, SingleOperationItemComponent]\n})\nexport class BulkSingleOperationsListModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i4","i5.SingleOperationItemComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;MAmBa,4BAA4B,CAAA;AAavC,IAAA,WAAA,CACU,YAA0B,EAC1B,gBAAkC,EAClC,gBAAkC,EAAA;QAFlC,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAf5C,IAAoB,CAAA,oBAAA,GAAG,oBAAoB,CAAC;QAC5C,IAAO,CAAA,OAAA,GAAG,kBAAkB,CAAC;QAC7B,IAAU,CAAA,UAAA,GAAG,UAAU,CAAC;QACxB,IAAM,CAAA,MAAA,GAAG,EAAE,CAAC;QACZ,IAAuB,CAAA,uBAAA,GAAG,uBAAuB,CAAC;QAClD,IAA4B,CAAA,4BAAA,GAAoC,4BAA4B,CAAC;QAI7F,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAC;KAOb;AAEJ,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;KACnF;IAED,MAAM,oBAAoB,CAAC,eAAe,EAAA;AACxC,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,EAAE;YAC9C,IAAI;YACJ,MAAM;YACN,QAAQ;YACR,eAAe;YACf,cAAc;YACd,UAAU;AACX,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;SAC1D;QAAC,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SACxC;KACF;+GAvCU,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,4PCnBzC,q4EAwEA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDrDa,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAJxC,SAAS;+BACE,2BAA2B,EAAA,QAAA,EAAA,q4EAAA,EAAA,CAAA;+IAWrC,SAAS,EAAA,CAAA;sBADR,KAAK;gBAGN,QAAQ,EAAA,CAAA;sBADP,KAAK;gBAEwC,gBAAgB,EAAA,CAAA;sBAA7D,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;;;MELjC,6BAA6B,CAAA;AAexC,IAAA,WAAA,CAAoB,qBAA4C,EAAA;QAA5C,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAuB;QAXhE,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAC;AACP,QAAA,IAAA,CAAA,uBAAuB,GAA0C,IAAI,YAAY,EAAE,CAAC;AAK9F,QAAA,IAAA,CAAA,gBAAgB,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,IAAuB,CAAA,uBAAA,GAAG,uBAAuB,CAAC;QAClD,IAA4B,CAAA,4BAAA,GAAoC,4BAA4B,CAAC;KAGzB;AAEpE,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,sBAAsB,EAAE,CAAC;SAC/B;KACF;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE;YAC/D,IAAI,CAAC,sBAAsB,EAAE,CAAC;SAC/B;KACF;IAED,sBAAsB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;YAC1D,IAAI,CAAC,YAAY,CAAC,MAAM,CACtB,UAAU,KAAK,IAAI,CAAC,gBAAgB,CAAC,GAAG;AACtC,kBAAE,EAAE;AACJ,kBAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,EAAE,CAAC,CAC1D,CAAC;SACH;aAAM;YACL,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SACpD;KACF;IAED,+BAA+B,GAAA;AAC7B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AAE7C,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;SACrC;AAAM,aAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,UAAU,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,EAAE;AACvF,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;SACxC;AAAM,aAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,UAAU,KAAK,CAAC,IAAI,QAAQ,CAAC,SAAS,KAAK,CAAC,EAAE;AACzF,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;SACtC;AAAM,aAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,QAAQ,CAAC,SAAS,KAAK,CAAC,EAAE;AACtF,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;SACzC;AAED,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;KAClC;IAED,MAAM,qBAAqB,CAAC,MAA+B,EAAA;AACzD,QAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,2BAA2B,CAClF,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAC5B,IAAI,CAAC,aAAa,CAAC,EAAE,CACtB,CAAC;KACH;IAED,kBAAkB,GAAA;QAChB,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;KACvD;+GAnEU,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAA7B,6BAA6B,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAO7B,qBAAqB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChClC,62DAiDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,2BAAA,EAAA,gCAAA,EAAA,6BAAA,EAAA,oCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,cAAA,EAAA,yBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,4BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAF,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDxBa,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAJzC,SAAS;+BACE,4BAA4B,EAAA,QAAA,EAAA,62DAAA,EAAA,CAAA;4FAKtC,aAAa,EAAA,CAAA;sBADZ,KAAK;gBAGN,QAAQ,EAAA,CAAA;sBADP,KAAK;gBAEI,uBAAuB,EAAA,CAAA;sBAAhC,MAAM;gBAGP,YAAY,EAAA,CAAA;sBADX,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,qBAAqB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;;;AErBrD;;AAEG;MAMU,8BAA8B,CAAA;+GAA9B,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,8BAA8B,iBAH1B,6BAA6B,EAAE,4BAA4B,CAAA,EAAA,OAAA,EAAA,CADhE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,CAE1E,EAAA,OAAA,EAAA,CAAA,6BAA6B,EAAE,4BAA4B,CAAA,EAAA,CAAA,CAAA,EAAA;gHAE1D,8BAA8B,EAAA,OAAA,EAAA,CAJ/B,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAIzE,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAL1C,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,CAAC;AACrF,oBAAA,YAAY,EAAE,CAAC,6BAA6B,EAAE,4BAA4B,CAAC;AAC3E,oBAAA,OAAO,EAAE,CAAC,6BAA6B,EAAE,4BAA4B,CAAC;AACvE,iBAAA,CAAA;;;AClBD;;AAEG;;;;"}
1
+ {"version":3,"file":"c8y-ngx-components-operations-bulk-single-operations-list.mjs","sources":["../../operations/bulk-single-operations-list/single-operation-item.component.ts","../../operations/bulk-single-operations-list/single-operation-item.component.html","../../operations/bulk-single-operations-list/single-operations-list.component.ts","../../operations/bulk-single-operations-list/single-operations-list.component.html","../../operations/bulk-single-operations-list/bulk-single-operations-list.module.ts","../../operations/bulk-single-operations-list/c8y-ngx-components-operations-bulk-single-operations-list.ts"],"sourcesContent":["import { Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { InventoryService, IOperation, OperationService } from '@c8y/client';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport {\n ACTIONS_OPERATIONS,\n BULK_OPERATION_EVENT,\n COMPONENTS\n} from '@c8y/ngx-components/operations/product-experience';\nimport {\n OPERATION_STATUS_LABELS,\n OPERATION_STATUS_OPTIONS_MAP,\n OperationStatusOptionsMapShared\n} from '@c8y/ngx-components/operations/shared';\nimport { omit } from 'lodash-es';\n\n/**\n * @deprecated Single operations list in bulk operations details has been replaced by data grid. This component will be removed in the future.\n */\n@Component({\n selector: 'c8y-single-operation-item',\n templateUrl: './single-operation-item.component.html'\n})\nexport class SingleOperationItemComponent {\n BULK_OPERATION_EVENT = BULK_OPERATION_EVENT;\n ACTIONS = ACTIONS_OPERATIONS;\n COMPONENTS = COMPONENTS;\n device = {};\n OPERATION_STATUS_LABELS = OPERATION_STATUS_LABELS;\n OPERATION_STATUS_OPTIONS_MAP: OperationStatusOptionsMapShared = OPERATION_STATUS_OPTIONS_MAP;\n @Input()\n operation: IOperation;\n @Input()\n readOnly = false;\n @ViewChild('failureReason', { static: true }) failureReasonRef: ElementRef;\n\n constructor(\n private alertService: AlertService,\n private inventoryService: InventoryService,\n private operationService: OperationService\n ) {}\n\n async ngOnInit() {\n this.device = (await this.inventoryService.detail(this.operation.deviceId))?.data;\n }\n\n async retrySingleOperation(singleOperation) {\n const operationToCreate = omit(singleOperation, [\n 'id',\n 'self',\n 'status',\n 'failureReason',\n 'creationTime',\n 'delivery'\n ]);\n\n try {\n await this.operationService.create(operationToCreate);\n this.alertService.success(gettext('Operation created.'));\n } catch (er) {\n this.alertService.addServerFailure(er);\n }\n }\n}\n","<c8y-li class=\"c8y-list__item--double-actions\">\n <c8y-li-icon>\n <i\n [c8yIcon]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].icon\"\n [tooltip]=\"operation.status.toString() | translate\"\n [ngClass]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].styleClass\"\n ></i>\n </c8y-li-icon>\n <div [ngClass]=\"{ 'content-flex-80': !readOnly, 'content-flex-50': readOnly }\">\n <div class=\"col-4\">\n <span class=\"m-r-4\">\n <device-status [mo]=\"device\"></device-status>\n </span>\n <a\n [routerLink]=\"['/device', operation.deviceId, 'device-info']\"\n routerLinkActive=\"active\"\n >\n {{ operation.deviceName }}\n </a>\n </div>\n <div class=\"col-3\">\n <small class=\"icon-flex text-muted\">\n <i\n class=\"m-r-4\"\n c8yIcon=\"calendar\"\n ></i>\n {{ operation.creationTime | c8yDate }}\n </small>\n </div>\n <div class=\"col-5\">\n <div class=\"d-flex a-i-center\">\n <span\n class=\"text-truncate\"\n #failureReason\n >\n {{ operation.failureReason | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ operation.failureReason | translate }}\"\n placement=\"left\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"failureReason.offsetWidth < failureReason.scrollWidth\"\n >\n <i [c8yIcon]=\"'info-circle'\"></i>\n </button>\n <div\n class=\"showOnHover p-l-8 p-r-8 fit-h-20 m-l-auto\"\n *ngIf=\"\n !readOnly &&\n operation.status.toString() == OPERATION_STATUS_OPTIONS_MAP.FAILED.status.toString()\n \"\n >\n <button\n class=\"btn btn-default btn-xs\"\n title=\"{{ 'Retry operation' | translate }}\"\n type=\"button\"\n (click)=\"retrySingleOperation(operation)\"\n c8yProductExperience\n [actionName]=\"BULK_OPERATION_EVENT\"\n [actionData]=\"{ action: ACTIONS.RETRY, component: COMPONENTS.SINGLE_OPERATION_ITEM }\"\n >\n <i [c8yIcon]=\"'repeat m-r-4'\"></i>\n {{ 'Retry operation' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</c8y-li>\n","import { NgIf } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n EventEmitter,\n inject,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n IOperation,\n IOperationBulk,\n IResultList,\n OperationService,\n OperationStatus\n} from '@c8y/client';\nimport {\n ActionControl,\n AlertService,\n C8yTranslatePipe,\n Column,\n DataGridComponent,\n DataGridModule,\n DataSourceModifier,\n DisplayOptions,\n EmptyStateComponent,\n gettext,\n IconDirective,\n Pagination,\n ServerSideDataCallback,\n ServerSideDataResult\n} from '@c8y/ngx-components';\nimport { BulkOperationsService } from '@c8y/ngx-components/operations/bulk-operations-service';\nimport {\n CreationTimeGridColumn,\n DeviceGridColumn,\n FailureReasonGridColumn,\n OperationStatusGridColumn\n} from '@c8y/ngx-components/operations/grid-columns';\nimport {\n OPERATION_STATUS_LABELS,\n OPERATION_STATUS_OPTIONS_MAP,\n OperationStatusOption,\n OperationStatusOptionsMapShared\n} from '@c8y/ngx-components/operations/shared';\nimport {\n StatusFilterComponent,\n StatusFilterModule\n} from '@c8y/ngx-components/operations/status-filter';\nimport { omit } from 'lodash-es';\nimport { merge, Subject, throttleTime } from 'rxjs';\n\n@Component({\n standalone: true,\n selector: 'c8y-single-operations-list',\n templateUrl: './single-operations-list.component.html',\n imports: [\n StatusFilterModule,\n NgIf,\n C8yTranslatePipe,\n IconDirective,\n DataGridModule,\n EmptyStateComponent\n ]\n})\nexport class SingleOperationsListComponent implements AfterViewInit, OnChanges {\n @Input()\n bulkOperation: Partial<IOperationBulk>;\n @Input()\n readOnly = false;\n @Output() onRetryFailedOperations: EventEmitter<Partial<IOperationBulk>> = new EventEmitter();\n\n @ViewChild(StatusFilterComponent, { static: false })\n statusFilter: StatusFilterComponent;\n @ViewChild(DataGridComponent, { static: false })\n dataGrid: DataGridComponent;\n\n OPERATION_STATUS = { ...OperationStatus, ALL: gettext('ALL') };\n OPERATION_STATUS_LABELS = OPERATION_STATUS_LABELS;\n OPERATION_STATUS_OPTIONS_MAP: OperationStatusOptionsMapShared = OPERATION_STATUS_OPTIONS_MAP;\n singleOperations: IResultList<IOperation>;\n\n displayOptions: Partial<DisplayOptions> = {\n gridHeader: false\n };\n pagination: Pagination = {\n pageSize: 25,\n currentPage: 1\n };\n\n columns: Column[] = [\n new OperationStatusGridColumn(),\n new DeviceGridColumn(),\n new CreationTimeGridColumn(),\n new FailureReasonGridColumn()\n ];\n\n actions: ActionControl[] = [\n {\n type: 'retry',\n icon: 'repeat',\n label: gettext('Retry operation'),\n text: gettext('Retry operation'),\n callback: operation => {\n this.retrySingleOperation(operation);\n },\n showIf: operation =>\n !this.readOnly &&\n operation.status.toString() === OPERATION_STATUS_OPTIONS_MAP.FAILED.status.toString()\n }\n ];\n\n serverSideDataCallback: ServerSideDataCallback;\n\n private operationService = inject(OperationService);\n private alertService = inject(AlertService);\n private filterStatus: OperationStatus;\n private reload$ = new Subject<void>();\n private reloadThrottled$ = new Subject<void>();\n\n constructor(private bulkOperationsService: BulkOperationsService) {\n this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n merge(this.reload$, this.reloadThrottled$.pipe(throttleTime(30_000)))\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.dataGrid?.reload(false));\n }\n\n async ngAfterViewInit() {\n if (this.statusFilter) {\n this.setStatusFilter(false);\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.bulkOperation && !changes.bulkOperation.firstChange) {\n this.reloadThrottled$.next();\n }\n }\n\n reload(option?: OperationStatusOption[]) {\n const [opt] = option ?? [];\n this.filterStatus = opt?.status ?? this.filterStatus;\n this.reload$.next();\n }\n\n async onDataSourceModifier(\n dataSourceModifier: DataSourceModifier\n ): Promise<ServerSideDataResult> {\n const filter = this.filterStatus ?? this.getFilterTypeOfSingleOperations();\n const { res, data, paging } = await this.bulkOperationsService.getSingleOperationsByStatus(\n filter,\n this.bulkOperation.id,\n dataSourceModifier.pagination\n );\n\n const filteredSize = await this.bulkOperationsService.getSingleOperationsCountByStatus(\n filter,\n this.bulkOperation.id\n );\n\n const size = await this.bulkOperationsService.getSingleOperationsTotal(this.bulkOperation.id);\n\n const serverSideDataResult: ServerSideDataResult = { res, data, paging, filteredSize, size };\n\n return serverSideDataResult;\n }\n\n setStatusFilter(emit = true) {\n if (this.statusFilter) {\n const typeFilter = this.getFilterTypeOfSingleOperations();\n this.statusFilter.preset(\n typeFilter === this.OPERATION_STATUS.ALL\n ? []\n : [{ label: this.OPERATION_STATUS_LABELS[typeFilter] }],\n emit\n );\n } else {\n setTimeout(this.setStatusFilter.bind(this, emit));\n }\n }\n\n getFilterTypeOfSingleOperations() {\n const { progress } = this.bulkOperation;\n\n if (progress.failed > 0) {\n return this.OPERATION_STATUS.FAILED;\n } else if (progress.failed === 0 && progress.successful === 0 && progress.pending === 0) {\n return this.OPERATION_STATUS.EXECUTING;\n } else if (progress.failed === 0 && progress.successful === 0 && progress.executing === 0) {\n return this.OPERATION_STATUS.PENDING;\n } else if (progress.failed === 0 && progress.pending === 0 && progress.executing === 0) {\n return this.OPERATION_STATUS.SUCCESSFUL;\n }\n\n return this.OPERATION_STATUS.ALL;\n }\n\n retryBulkOperation() {\n this.onRetryFailedOperations.emit(this.bulkOperation);\n }\n\n async retrySingleOperation(singleOperation) {\n const operationToCreate = omit(singleOperation, [\n 'id',\n 'self',\n 'status',\n 'failureReason',\n 'creationTime',\n 'delivery'\n ]);\n\n try {\n await this.operationService.create(operationToCreate);\n this.alertService.success(gettext('Operation created.'));\n } catch (er) {\n this.alertService.addServerFailure(er);\n }\n }\n}\n","<ng-container\n *ngIf=\"\n bulkOperation.progress.failed ||\n bulkOperation.progress.executing ||\n bulkOperation.progress.pending ||\n bulkOperation.progress.successful\n \"\n>\n <div\n class=\"legend form-block p-t-16 m-b-0\"\n translate\n >\n Operations\n </div>\n <div class=\"d-flex a-i-center\">\n <div class=\"d-flex a-i-center p-b-8\">\n <span\n class=\"m-r-4 text-medium\"\n translate\n >\n Filter by status\n </span>\n <c8y-status-filter\n small\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"reload($event)\"\n ></c8y-status-filter>\n </div>\n <div\n class=\"m-l-auto p-b-8\"\n *ngIf=\"!readOnly && bulkOperation.progress.failed > 0\"\n >\n <button\n class=\"btn btn-navbar\"\n title=\"{{ 'Retry failed operations' | translate }}\"\n (click)=\"retryBulkOperation()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"repeat\"\n ></i>\n <span translate>Retry failed operations</span>\n </button>\n </div>\n </div>\n <c8y-data-grid\n [actionControls]=\"actions\"\n [columns]=\"columns\"\n [displayOptions]=\"displayOptions\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [pagination]=\"pagination\"\n >\n <c8y-ui-empty-state\n icon=\"search\"\n [title]=\"'No single operations of the selected status to display.' | translate\"\n [subtitle]=\"'Single operations will be displayed here' | translate\"\n horizontal\n ></c8y-ui-empty-state>\n </c8y-data-grid>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { SingleOperationItemComponent } from './single-operation-item.component';\nimport { SingleOperationsListComponent } from './single-operations-list.component';\n\n/**\n * This module allows for displaying the list of single operations in a bulk operations details.\n *\n * @deprecated This module is deprecated and will be removed in a future version. I\n * nstead, use the `SingleOperationsListComponent` as a standalone component directly.\n */\n@NgModule({\n imports: [CoreModule, PopoverModule, RouterModule, TooltipModule, SingleOperationsListComponent],\n declarations: [SingleOperationItemComponent],\n exports: [SingleOperationsListComponent, SingleOperationItemComponent]\n})\nexport class BulkSingleOperationsListModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}