@c8y/ngx-components 1023.30.0 → 1023.42.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 (125) hide show
  1. package/alarms/cockpit/index.d.ts.map +1 -1
  2. package/alarms/devicemanagement/index.d.ts.map +1 -1
  3. package/alarms/index.d.ts +25 -2
  4. package/alarms/index.d.ts.map +1 -1
  5. package/asset-properties/index.d.ts +20 -2
  6. package/asset-properties/index.d.ts.map +1 -1
  7. package/bookmarks/index.d.ts +15 -7
  8. package/bookmarks/index.d.ts.map +1 -1
  9. package/context-dashboard/index.d.ts.map +1 -1
  10. package/datapoint-explorer/view/index.d.ts +2 -0
  11. package/datapoint-explorer/view/index.d.ts.map +1 -1
  12. package/device-grid/index.d.ts.map +1 -1
  13. package/echart/index.d.ts +19 -3
  14. package/echart/index.d.ts.map +1 -1
  15. package/feature-toggles/index.d.ts +6 -0
  16. package/feature-toggles/index.d.ts.map +1 -0
  17. package/feature-toggles/list/index.d.ts +63 -0
  18. package/feature-toggles/list/index.d.ts.map +1 -0
  19. package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +6 -11
  20. package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs +37 -11
  22. package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs.map +1 -1
  23. package/fesm2022/c8y-ngx-components-alarms.mjs +58 -10
  24. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  25. package/fesm2022/c8y-ngx-components-asset-properties.mjs +36 -12
  26. package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
  27. package/fesm2022/{c8y-ngx-components-asset-property-grid.component-B04ixTyA.mjs → c8y-ngx-components-asset-property-grid.component-BoVrIpap.mjs} +5 -12
  28. package/fesm2022/c8y-ngx-components-asset-property-grid.component-BoVrIpap.mjs.map +1 -0
  29. package/fesm2022/c8y-ngx-components-bookmarks.mjs +86 -39
  30. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  31. package/fesm2022/c8y-ngx-components-cockpit-config.mjs +2 -2
  32. package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
  33. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +3 -2
  34. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  35. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +21 -36
  36. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  37. package/fesm2022/c8y-ngx-components-device-grid.mjs +5 -2
  38. package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
  39. package/fesm2022/c8y-ngx-components-echart.mjs +101 -42
  40. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  41. package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs +3 -3
  42. package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs.map +1 -1
  43. package/fesm2022/c8y-ngx-components-feature-toggles-list.mjs +242 -0
  44. package/fesm2022/c8y-ngx-components-feature-toggles-list.mjs.map +1 -0
  45. package/fesm2022/c8y-ngx-components-feature-toggles.mjs +36 -0
  46. package/fesm2022/c8y-ngx-components-feature-toggles.mjs.map +1 -0
  47. package/fesm2022/c8y-ngx-components-global-context.mjs +60 -17
  48. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  49. package/fesm2022/c8y-ngx-components-map.mjs +127 -33
  50. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  51. package/fesm2022/c8y-ngx-components-tenants.mjs +2 -2
  52. package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
  53. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +7 -3
  54. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  55. package/fesm2022/c8y-ngx-components-upgrade-not-found.component-CuCuYAkK.mjs +19 -0
  56. package/fesm2022/c8y-ngx-components-upgrade-not-found.component-CuCuYAkK.mjs.map +1 -0
  57. package/fesm2022/c8y-ngx-components-upgrade.mjs +46 -4
  58. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  59. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +3 -3
  60. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
  61. package/fesm2022/c8y-ngx-components-widgets-definitions-pie-chart.mjs +30 -0
  62. package/fesm2022/c8y-ngx-components-widgets-definitions-pie-chart.mjs.map +1 -0
  63. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +2 -1
  64. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  65. package/fesm2022/c8y-ngx-components-widgets-exports.mjs +8 -1
  66. package/fesm2022/c8y-ngx-components-widgets-exports.mjs.map +1 -1
  67. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +5 -5
  68. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  69. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +3 -3
  70. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  71. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +4 -4
  72. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  73. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +4 -3
  74. package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
  75. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +18 -11
  76. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  77. package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs +156 -67
  78. package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
  79. package/fesm2022/c8y-ngx-components-widgets-implementations-pie-chart.mjs +366 -0
  80. package/fesm2022/c8y-ngx-components-widgets-implementations-pie-chart.mjs.map +1 -0
  81. package/fesm2022/c8y-ngx-components-widgets-widget-providers.mjs +5 -2
  82. package/fesm2022/c8y-ngx-components-widgets-widget-providers.mjs.map +1 -1
  83. package/fesm2022/c8y-ngx-components.mjs +44 -15
  84. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  85. package/global-context/index.d.ts +23 -4
  86. package/global-context/index.d.ts.map +1 -1
  87. package/index.d.ts +11 -1
  88. package/index.d.ts.map +1 -1
  89. package/locales/de.po +261 -143
  90. package/locales/es.po +155 -53
  91. package/locales/fr.po +299 -193
  92. package/locales/ja_JP.po +346 -252
  93. package/locales/ko.po +154 -54
  94. package/locales/locales.pot +142 -41
  95. package/locales/nl.po +156 -54
  96. package/locales/pl.po +155 -53
  97. package/locales/pt_BR.po +154 -54
  98. package/locales/zh_CN.po +155 -53
  99. package/locales/zh_TW.po +156 -54
  100. package/map/index.d.ts +41 -10
  101. package/map/index.d.ts.map +1 -1
  102. package/package.json +1 -1
  103. package/trusted-certificates/index.d.ts +2 -0
  104. package/trusted-certificates/index.d.ts.map +1 -1
  105. package/upgrade/index.d.ts.map +1 -1
  106. package/widgets/cockpit-exports/index.d.ts +6 -0
  107. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  108. package/widgets/definitions/index.d.ts +1 -0
  109. package/widgets/definitions/index.d.ts.map +1 -1
  110. package/widgets/definitions/pie-chart/index.d.ts +25 -0
  111. package/widgets/definitions/pie-chart/index.d.ts.map +1 -0
  112. package/widgets/device-management-exports/index.d.ts +6 -0
  113. package/widgets/device-management-exports/index.d.ts.map +1 -1
  114. package/widgets/exports/index.d.ts +8 -1
  115. package/widgets/exports/index.d.ts.map +1 -1
  116. package/widgets/implementations/html-widget/index.d.ts +2 -2
  117. package/widgets/implementations/html-widget/index.d.ts.map +1 -1
  118. package/widgets/implementations/map/index.d.ts +1 -0
  119. package/widgets/implementations/map/index.d.ts.map +1 -1
  120. package/widgets/implementations/markdown/index.d.ts +52 -18
  121. package/widgets/implementations/markdown/index.d.ts.map +1 -1
  122. package/widgets/implementations/pie-chart/index.d.ts +129 -0
  123. package/widgets/implementations/pie-chart/index.d.ts.map +1 -0
  124. package/widgets/widget-providers/index.d.ts.map +1 -1
  125. package/fesm2022/c8y-ngx-components-asset-property-grid.component-B04ixTyA.mjs.map +0 -1
@@ -148,14 +148,7 @@ class AssetPropertyGridComponent {
148
148
  this.childNodePagination = { pageSize: CHILD_PAGE_SIZE, currentPage: 1 };
149
149
  this.serverSideDataCallback = this.onDataSourceModifier.bind(this);
150
150
  this.loadError = null;
151
- this.headerActionControls = [
152
- {
153
- text: gettext('Close'),
154
- callback: () => this.close(),
155
- icon: 'clear',
156
- type: 'custom'
157
- }
158
- ];
151
+ this.headerActionControls = [];
159
152
  this.displayOptions = {
160
153
  bordered: false,
161
154
  striped: true,
@@ -273,20 +266,20 @@ class AssetPropertyGridComponent {
273
266
  });
274
267
  }
275
268
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AssetPropertyGridComponent, deps: [{ token: AssetPropertyService }, { token: BottomDrawerRef }, { token: AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
276
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AssetPropertyGridComponent, isStandalone: true, selector: "c8y-asset-property-grid", outputs: { onAddCustomColumn: "onAddCustomColumn" }, ngImport: i0, template: "<c8y-data-grid\n class=\"content-fullpage d-flex d-col border-top border-bottom\"\n [title]=\"'Asset properties' | translate\"\n [loadMoreItemsLabel]=\"'Load more asset properties' | translate\"\n [loadingItemsLabel]=\"'Loading asset properties\u2026' | translate\"\n [displayOptions]=\"displayOptions\"\n [headerActionControls]=\"headerActionControls\"\n [columns]=\"columns\"\n [treeGrid]=\"true\"\n [childNodePagination]=\"childNodePagination\"\n parentNodeLabelProperty=\"title\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [selectable]=\"true\"\n [singleSelection]=\"true\"\n (itemsSelect)=\"selectItem($event)\"\n></c8y-data-grid>\n", dependencies: [{ kind: "component", type: DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "loading", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
269
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AssetPropertyGridComponent, isStandalone: true, selector: "c8y-asset-property-grid", outputs: { onAddCustomColumn: "onAddCustomColumn" }, host: { classAttribute: "d-contents" }, ngImport: i0, template: "<div class=\"card-block flex-no-shrink separator-bottom col-xs-12 large-padding p-t-24 p-b-24\">\n <div\n class=\"h4 text-center text-medium\"\n id=\"drawerTitle\"\n translate\n >\n Add custom column\n </div>\n</div>\n<c8y-data-grid\n class=\"min-height-0 flex-grow d-col\"\n [title]=\"'Asset properties' | translate\"\n [loadMoreItemsLabel]=\"'Load more asset properties' | translate\"\n [loadingItemsLabel]=\"'Loading asset properties\u2026' | translate\"\n [displayOptions]=\"displayOptions\"\n [headerActionControls]=\"headerActionControls\"\n [columns]=\"columns\"\n [treeGrid]=\"true\"\n [childNodePagination]=\"childNodePagination\"\n parentNodeLabelProperty=\"title\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [selectable]=\"true\"\n [singleSelection]=\"true\"\n (itemsSelect)=\"selectItem($event)\"\n></c8y-data-grid>\n<div class=\"card-footer p-24 separator text-center\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ ' Cancel' | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "component", type: DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "loading", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
277
270
  }
278
271
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AssetPropertyGridComponent, decorators: [{
279
272
  type: Component,
280
- args: [{ selector: 'c8y-asset-property-grid', standalone: true, imports: [
273
+ args: [{ selector: 'c8y-asset-property-grid', host: { class: 'd-contents' }, standalone: true, imports: [
281
274
  C8yTranslatePipe,
282
275
  DataGridComponent,
283
276
  IdentifierCellRendererComponent,
284
277
  TitleCellRendererComponent,
285
278
  TagsCellRendererComponent
286
- ], template: "<c8y-data-grid\n class=\"content-fullpage d-flex d-col border-top border-bottom\"\n [title]=\"'Asset properties' | translate\"\n [loadMoreItemsLabel]=\"'Load more asset properties' | translate\"\n [loadingItemsLabel]=\"'Loading asset properties\u2026' | translate\"\n [displayOptions]=\"displayOptions\"\n [headerActionControls]=\"headerActionControls\"\n [columns]=\"columns\"\n [treeGrid]=\"true\"\n [childNodePagination]=\"childNodePagination\"\n parentNodeLabelProperty=\"title\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [selectable]=\"true\"\n [singleSelection]=\"true\"\n (itemsSelect)=\"selectItem($event)\"\n></c8y-data-grid>\n" }]
279
+ ], template: "<div class=\"card-block flex-no-shrink separator-bottom col-xs-12 large-padding p-t-24 p-b-24\">\n <div\n class=\"h4 text-center text-medium\"\n id=\"drawerTitle\"\n translate\n >\n Add custom column\n </div>\n</div>\n<c8y-data-grid\n class=\"min-height-0 flex-grow d-col\"\n [title]=\"'Asset properties' | translate\"\n [loadMoreItemsLabel]=\"'Load more asset properties' | translate\"\n [loadingItemsLabel]=\"'Loading asset properties\u2026' | translate\"\n [displayOptions]=\"displayOptions\"\n [headerActionControls]=\"headerActionControls\"\n [columns]=\"columns\"\n [treeGrid]=\"true\"\n [childNodePagination]=\"childNodePagination\"\n parentNodeLabelProperty=\"title\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [selectable]=\"true\"\n [singleSelection]=\"true\"\n (itemsSelect)=\"selectItem($event)\"\n></c8y-data-grid>\n<div class=\"card-footer p-24 separator text-center\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ ' Cancel' | translate }}\n </button>\n</div>\n" }]
287
280
  }], ctorParameters: () => [{ type: AssetPropertyService }, { type: BottomDrawerRef }, { type: AlertService }], propDecorators: { onAddCustomColumn: [{
288
281
  type: Output
289
282
  }] } });
290
283
 
291
284
  export { AssetPropertyGridComponent };
292
- //# sourceMappingURL=c8y-ngx-components-asset-property-grid.component-B04ixTyA.mjs.map
285
+ //# sourceMappingURL=c8y-ngx-components-asset-property-grid.component-BoVrIpap.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c8y-ngx-components-asset-property-grid.component-BoVrIpap.mjs","sources":["../../core/data-grid/configure-custom-column/columns/identifier.cell-renderer.component.ts","../../core/data-grid/configure-custom-column/columns/identifier.data-grid-column.ts","../../core/data-grid/configure-custom-column/columns/tags.cell-renderer.components.ts","../../core/data-grid/configure-custom-column/columns/tags.data-grid-column.ts","../../core/data-grid/configure-custom-column/columns/title.cell-renderer.component.ts","../../core/data-grid/configure-custom-column/columns/title.data-grid-column.ts","../../core/data-grid/configure-custom-column/asset-property-grid.component.ts","../../core/data-grid/configure-custom-column/asset-property-grid.component.html"],"sourcesContent":["import { Component } from '@angular/core';\nimport { CellRendererContext } from '../../column/cell-renderer';\n\n@Component({\n template: ` {{ context.item.id }} `,\n selector: 'c8y-identifier-cell-renderer',\n standalone: true\n})\nexport class IdentifierCellRendererComponent {\n constructor(public context: CellRendererContext) {}\n}\n","import { getBasicInputArrayFormFieldConfig } from '../../../dynamic-forms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { BaseColumn } from '../../column/base.column';\nimport { ColumnConfig } from '../../data-grid.model';\nimport { IdentifierCellRendererComponent } from './identifier.cell-renderer.component';\n\nexport class IdentifierGridColumn extends BaseColumn {\n constructor(initialColumnConfig?: ColumnConfig) {\n super(initialColumnConfig);\n\n this.name = 'key';\n this.header = gettext('Key');\n this.cellRendererComponent = IdentifierCellRendererComponent;\n\n this.filterable = true;\n this.filteringConfig = {\n fields: getBasicInputArrayFormFieldConfig({\n key: 'identifiers',\n label: gettext('Show items with identifier'),\n addText: gettext('Add next`identifier`'),\n placeholder: 'c8y_Position'\n }),\n getFilter(_model) {\n return _model;\n }\n };\n\n this.sortable = false;\n }\n}\n","import { Component } from '@angular/core';\nimport { CellRendererContext } from '../../column/cell-renderer';\n\n@Component({\n template: ` {{ context.item.tags }} `,\n selector: 'c8y-tags-cell-renderer',\n standalone: true\n})\nexport class TagsCellRendererComponent {\n constructor(public context: CellRendererContext) {}\n}\n","import { getBasicInputArrayFormFieldConfig } from '../../../dynamic-forms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { BaseColumn } from '../../column/base.column';\nimport { ColumnConfig } from '../../data-grid.model';\nimport { TagsCellRendererComponent } from './tags.cell-renderer.components';\n\nexport class TagsGridColumn extends BaseColumn {\n constructor(initialColumnConfig?: ColumnConfig) {\n super(initialColumnConfig);\n\n this.name = 'tags';\n this.header = gettext('Tags');\n this.cellRendererComponent = TagsCellRendererComponent;\n\n this.filterable = true;\n this.filteringConfig = {\n fields: getBasicInputArrayFormFieldConfig({\n key: 'tags',\n label: gettext('Show items with tags'),\n addText: gettext('Add next`tag`'),\n placeholder: 'tag1'\n }),\n getFilter(_model) {\n return _model;\n }\n };\n\n this.sortable = false;\n }\n}\n","import { Component } from '@angular/core';\nimport { CellRendererContext } from '../..';\n\n@Component({\n template: ` {{ context.item.title }} `,\n selector: 'c8y-title-cell-renderer',\n standalone: true\n})\nexport class TitleCellRendererComponent {\n constructor(public context: CellRendererContext) {}\n}\n","import { getBasicInputArrayFormFieldConfig } from '../../../dynamic-forms';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { BaseColumn } from '../../column/base.column';\nimport { ColumnConfig } from '../../data-grid.model';\nimport { TitleCellRendererComponent } from './title.cell-renderer.component';\n\nexport class TitleGridColumn extends BaseColumn {\n constructor(initialColumnConfig?: ColumnConfig) {\n super(initialColumnConfig);\n\n this.name = 'title';\n this.header = gettext('Title');\n this.cellRendererComponent = TitleCellRendererComponent;\n\n this.filterable = true;\n this.filteringConfig = {\n fields: getBasicInputArrayFormFieldConfig({\n key: 'titles',\n label: gettext('Show items with title'),\n addText: gettext('Add next`title`'),\n placeholder: 'location'\n }),\n getFilter(_model) {\n return _model;\n }\n };\n\n this.sortable = false;\n }\n}\n","import { Component, EventEmitter, Output } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { camelCase } from 'lodash-es';\nimport { alertOnError, AlertService } from '../../alert';\nimport {\n AssetPropertyDefinition,\n SchemaNode,\n TreeNode\n} from '../../asset-property/asset-property.model';\nimport { AssetPropertyService } from '../../asset-property/asset-property.service';\nimport { BottomDrawerRef } from '../../bottom-drawer';\nimport { C8yTranslatePipe } from '../../i18n/c8y-translate.pipe';\nimport { DataGridComponent } from '../data-grid.component';\nimport {\n Column,\n CustomColumnConfig,\n DataSourceModifier,\n DisplayOptions,\n Pagination,\n ServerSideDataCallback,\n ServerSideDataResult\n} from '../data-grid.model';\nimport { IdentifierCellRendererComponent } from './columns/identifier.cell-renderer.component';\nimport { IdentifierGridColumn } from './columns/identifier.data-grid-column';\nimport { TagsCellRendererComponent } from './columns/tags.cell-renderer.components';\nimport { TagsGridColumn } from './columns/tags.data-grid-column';\nimport { TitleCellRendererComponent } from './columns/title.cell-renderer.component';\nimport { TitleGridColumn } from './columns/title.data-grid-column';\n\nconst CHILD_PAGE_SIZE = 5;\nconst ROOT_PAGE_SIZE = 25;\n\n@Component({\n selector: 'c8y-asset-property-grid',\n host: { class: 'd-contents' },\n standalone: true,\n imports: [\n C8yTranslatePipe,\n DataGridComponent,\n IdentifierCellRendererComponent,\n TitleCellRendererComponent,\n TagsCellRendererComponent\n ],\n templateUrl: './asset-property-grid.component.html'\n})\nexport class AssetPropertyGridComponent {\n columns: readonly Column[] = [\n new TitleGridColumn(),\n new IdentifierGridColumn(),\n new TagsGridColumn(),\n {\n name: 'description',\n header: gettext('Description'),\n path: 'description',\n filterable: false,\n sortable: false\n },\n {\n name: 'dataType',\n header: gettext('Data Type'),\n path: 'type',\n filterable: false,\n sortable: false\n }\n ];\n\n pagination: Pagination = { pageSize: ROOT_PAGE_SIZE, currentPage: 1 };\n childNodePagination: Pagination = { pageSize: CHILD_PAGE_SIZE, currentPage: 1 };\n serverSideDataCallback: ServerSideDataCallback = this.onDataSourceModifier.bind(this);\n loadError: string | null = null;\n\n headerActionControls = [];\n\n displayOptions: DisplayOptions = {\n bordered: false,\n striped: true,\n filter: true,\n gridHeader: true,\n hover: true\n };\n\n @Output() onAddCustomColumn = new EventEmitter<CustomColumnConfig>();\n\n constructor(\n private service: AssetPropertyService,\n private bottomDrawerRef: BottomDrawerRef<AssetPropertyGridComponent>,\n private alertService: AlertService\n ) {}\n\n async onDataSourceModifier(\n dataSourceModifier: DataSourceModifier\n ): Promise<ServerSideDataResult> {\n const { columns, pagination, parentRow } = dataSourceModifier;\n\n if (parentRow) {\n return this.buildChildGridData(parentRow);\n }\n\n const {\n res,\n data = [],\n paging\n } = await alertOnError(this.service.list(this.buildFilter(columns, pagination))).catch(() => {\n this.loadError = gettext('Unable to load asset properties. Please try again later.');\n return {\n res: null,\n data: [],\n paging: null,\n filteredSize: 0,\n size: 0\n };\n });\n\n const treeNodes = data.map(d => this.toTreeNode(d));\n\n return {\n res,\n data: treeNodes,\n paging,\n filteredSize: paging?.totalElements,\n size: paging?.totalElements\n };\n }\n\n async selectItem(identifiers: string[]) {\n if (this.bottomDrawerRef) {\n this.bottomDrawerRef.close();\n }\n this.addColumn(identifiers[0]);\n }\n\n async addColumn(path: string): Promise<void> {\n const [parentId, childKey] = path.split('.');\n try {\n const def = await this.service.getByIdentifier(parentId);\n const childSchema = def.jsonSchema?.properties?.[childKey];\n\n const header = childSchema?.title || childKey || def.jsonSchema?.title;\n\n this.onAddCustomColumn.emit({\n name: camelCase(path),\n header,\n path,\n type: 'property',\n custom: true,\n visible: true\n });\n } catch (err) {\n this.alertService.addServerFailure(err);\n }\n }\n\n close(): void {\n this.bottomDrawerRef?.close();\n }\n\n private buildChildGridData(parentRow) {\n const children = parentRow.children ?? [];\n const currentPage = parentRow.pagination?.currentPage ?? 1;\n\n const start = (currentPage - 1) * CHILD_PAGE_SIZE;\n const data = children.slice(start, start + CHILD_PAGE_SIZE);\n const totalPages = Math.ceil(children.length / CHILD_PAGE_SIZE);\n\n return {\n data,\n filteredSize: children.length,\n size: children.length,\n paging: {\n currentPage,\n pageSize: CHILD_PAGE_SIZE,\n totalPages,\n totalElements: children.length,\n nextPage: currentPage < totalPages ? currentPage + 1 : null,\n prevPage: currentPage > 1 ? currentPage - 1 : null\n },\n parentRow\n } as ServerSideDataResult;\n }\n\n private buildFilter(columns: Column[], pagination: Pagination) {\n const predicates = columns\n .filter(column => column.filterable && column.externalFilterQuery)\n .reduce((acc, column) => ({ ...acc, ...column.externalFilterQuery }), {});\n\n return { currentPage: pagination.currentPage, pageSize: pagination.pageSize, ...predicates };\n }\n\n private toTreeNode({ identifier, jsonSchema = {}, tags }: AssetPropertyDefinition): TreeNode {\n const { title, description, type, properties } = jsonSchema;\n\n return {\n id: identifier,\n title: title ?? identifier,\n description,\n type,\n tags,\n children: this.mapSchema(properties, identifier),\n hasChildren: !!properties\n };\n }\n\n private mapSchema(props: Record<string, SchemaNode> | undefined, base = ''): TreeNode[] {\n if (!props) return [];\n\n return Object.entries(props).map(([key, schema]) => {\n const id = base ? `${base}.${key}` : key;\n const children = this.mapSchema(schema.properties, id);\n return {\n id,\n title: schema.title ?? key,\n description: schema.description,\n type: schema.type,\n children,\n hasChildren: children.length > 0\n };\n });\n }\n}\n","<div class=\"card-block flex-no-shrink separator-bottom col-xs-12 large-padding p-t-24 p-b-24\">\n <div\n class=\"h4 text-center text-medium\"\n id=\"drawerTitle\"\n translate\n >\n Add custom column\n </div>\n</div>\n<c8y-data-grid\n class=\"min-height-0 flex-grow d-col\"\n [title]=\"'Asset properties' | translate\"\n [loadMoreItemsLabel]=\"'Load more asset properties' | translate\"\n [loadingItemsLabel]=\"'Loading asset properties…' | translate\"\n [displayOptions]=\"displayOptions\"\n [headerActionControls]=\"headerActionControls\"\n [columns]=\"columns\"\n [treeGrid]=\"true\"\n [childNodePagination]=\"childNodePagination\"\n parentNodeLabelProperty=\"title\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [selectable]=\"true\"\n [singleSelection]=\"true\"\n (itemsSelect)=\"selectItem($event)\"\n></c8y-data-grid>\n<div class=\"card-footer p-24 separator text-center\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ ' Cancel' | translate }}\n </button>\n</div>\n"],"names":["i1.CellRendererContext","i1.AssetPropertyService","i2.BottomDrawerRef","i3.AlertService"],"mappings":"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"}
@@ -5,22 +5,25 @@ import * as i5 from '@angular/forms';
5
5
  import { FormsModule } from '@angular/forms';
6
6
  import * as i1$2 from 'ngx-bootstrap/tooltip';
7
7
  import { TooltipDirective, TooltipModule } from 'ngx-bootstrap/tooltip';
8
- import * as i2 from '@c8y/ngx-components';
8
+ import * as i1 from '@c8y/ngx-components';
9
9
  import { IconDirective, C8yTranslateDirective, ListGroupComponent, ListItemComponent, ListItemDragHandleComponent, ListItemIconComponent, ChangeIconComponent, PopoverConfirmComponent, EmptyStateComponent, C8yTranslatePipe, CoreModule, CommonModule, ListGroupModule, FormsModule as FormsModule$1, ModalModule, hookDrawer } from '@c8y/ngx-components';
10
10
  import { NgIf, NgFor, AsyncPipe } from '@angular/common';
11
- import * as i4$1 from '@angular/router';
11
+ import * as i2 from '@angular/router';
12
12
  import { gettext } from '@c8y/ngx-components/gettext';
13
13
  import { uniqBy, cloneDeep } from 'lodash-es';
14
14
  import * as i1$1 from 'ngx-bootstrap/modal';
15
- import * as i1 from '@ngx-translate/core';
15
+ import * as i3 from '@ngx-translate/core';
16
16
  import { firstValueFrom, map } from 'rxjs';
17
17
  import * as i4 from '@c8y/ngx-components/icon-selector';
18
18
 
19
19
  class BookmarkService {
20
- constructor(translateService, userPreferencesService, options) {
20
+ static { this.DEFAULT_ICON = 'bookmark'; }
21
+ constructor(navigatorService, options, router, translateService, userPreferencesService) {
22
+ this.navigatorService = navigatorService;
23
+ this.options = options;
24
+ this.router = router;
21
25
  this.translateService = translateService;
22
26
  this.userPreferencesService = userPreferencesService;
23
- this.options = options;
24
27
  this.USER_PREFERENCES_BOOKMARKS_KEY = 'bookmarks';
25
28
  }
26
29
  async updateBookmarksInStorage(newBookmarks) {
@@ -29,15 +32,9 @@ class BookmarkService {
29
32
  const cleanedBookmarks = uniqBy(mergedBookmarks, 'id').filter((bookmark) => !bookmark.markToRemove);
30
33
  this.setUserPreferencesBookmarks(cleanedBookmarks);
31
34
  }
32
- getCurrentActiveNodeIcon(document) {
33
- const BOOKMARK = 'bookmark';
34
- const iconElement = this.getIconElement(document);
35
- if (!iconElement) {
36
- return BOOKMARK;
37
- }
38
- const iconClassName = iconElement.className;
39
- const iconName = this.extractIconName(iconClassName);
40
- return iconName || BOOKMARK;
35
+ async getActiveNodeIcon() {
36
+ const activeNode = await this.findActiveNode();
37
+ return activeNode?.icon || BookmarkService.DEFAULT_ICON;
41
38
  }
42
39
  extractIconName(input) {
43
40
  const iconRegex = /\b(dlt-)?c8y-icon-(\w+(?:-\w+)*)\b/g;
@@ -70,25 +67,44 @@ class BookmarkService {
70
67
  icon
71
68
  };
72
69
  }
73
- getIconElement(document) {
74
- const currentActiveNode = document.querySelectorAll('.link.active');
75
- if (!currentActiveNode.length) {
76
- return null;
70
+ async findActiveNode() {
71
+ const nodes = await firstValueFrom(this.navigatorService.items$);
72
+ return this.findActiveInTree(nodes);
73
+ }
74
+ findActiveInTree(nodes) {
75
+ let result;
76
+ for (const node of nodes) {
77
+ if (node.path && this.isNodeActive(node)) {
78
+ result = node;
79
+ }
80
+ if (node.children?.length) {
81
+ const childMatch = this.findActiveInTree(node.children);
82
+ if (childMatch) {
83
+ result = childMatch;
84
+ }
85
+ }
77
86
  }
78
- const activeNode = currentActiveNode.item(0);
79
- return activeNode.firstElementChild.firstChild;
87
+ return result;
88
+ }
89
+ isNodeActive(node) {
90
+ return this.router.isActive(node.path, {
91
+ paths: node.routerLinkExact ? 'exact' : 'subset',
92
+ queryParams: 'ignored',
93
+ fragment: 'ignored',
94
+ matrixParams: 'ignored'
95
+ });
80
96
  }
81
97
  setUserPreferencesBookmarks(bookmarks) {
82
98
  this.userPreferencesService.set(this.USER_PREFERENCES_BOOKMARKS_KEY, bookmarks);
83
99
  this.updatedBookmarks = bookmarks;
84
100
  }
85
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BookmarkService, deps: [{ token: i1.TranslateService }, { token: i2.UserPreferencesService }, { token: i2.OptionsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
101
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BookmarkService, deps: [{ token: i1.NavigatorService }, { token: i1.OptionsService }, { token: i2.Router }, { token: i3.TranslateService }, { token: i1.UserPreferencesService }], target: i0.ɵɵFactoryTarget.Injectable }); }
86
102
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BookmarkService, providedIn: 'root' }); }
87
103
  }
88
104
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BookmarkService, decorators: [{
89
105
  type: Injectable,
90
106
  args: [{ providedIn: 'root' }]
91
- }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.UserPreferencesService }, { type: i2.OptionsService }] });
107
+ }], ctorParameters: () => [{ type: i1.NavigatorService }, { type: i1.OptionsService }, { type: i2.Router }, { type: i3.TranslateService }, { type: i1.UserPreferencesService }] });
92
108
 
93
109
  class EditBookmarksComponent {
94
110
  constructor(bsModalRef, alertService, bookmarkService, iconSelector) {
@@ -192,7 +208,7 @@ class EditBookmarksComponent {
192
208
  }
193
209
  }
194
210
  }
195
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EditBookmarksComponent, deps: [{ token: i1$1.BsModalRef }, { token: i2.AlertService }, { token: BookmarkService }, { token: i4.IconSelectorService }], target: i0.ɵɵFactoryTarget.Component }); }
211
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EditBookmarksComponent, deps: [{ token: i1$1.BsModalRef }, { token: i1.AlertService }, { token: BookmarkService }, { token: i4.IconSelectorService }], target: i0.ɵɵFactoryTarget.Component }); }
196
212
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: EditBookmarksComponent, isStandalone: true, selector: "c8y-edit-bookmarks", inputs: { bookmarks: "bookmarks" }, host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'bookmark'\"></i>\n <div\n class=\"h4\"\n id=\"modal-title\"\n translate\n >\n Bookmarks\n </div>\n </div>\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Reorder, edit or delete bookmarks.' | translate }}\n </p>\n </div>\n <c8y-list-group\n class=\"cdk-droplist no-border-last\"\n *ngIf=\"bookmarks.length; else emptyList\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"bookmarks?.length < 2\"\n >\n <c8y-li\n *ngFor=\"let bookmark of bookmarks\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-icon\n style=\"{{ bookmarks?.length < 2 ? 'padding-left: 16px!important' : '' }}\"\n *ngIf=\"bookmark.icon\"\n >\n <c8y-change-icon\n [currentIcon]=\"bookmark.icon\"\n (onButtonClick)=\"changeBookmarkIcon(bookmark)\"\n ></c8y-change-icon>\n </c8y-li-icon>\n\n <div class=\"d-flex gap-8 a-i-center\">\n <form\n class=\"d-flex flex-grow\"\n name=\"bookmarksForm\"\n #bookmarksForm=\"ngForm\"\n >\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control fit-w\"\n title=\"{{ bookmark.label }}\"\n id=\"label\"\n name=\"label\"\n type=\"text\"\n [(ngModel)]=\"bookmark.label\"\n #label=\"ngModel\"\n maxlength=\"50\"\n [placeholder]=\"'e.g. My bookmark' | translate\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"updateBookmark(bookmark, 'label'); label.control.markAsPristine()\"\n [disabled]=\"label.invalid\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n <c8y-popover-confirm\n class=\"d-block\"\n [title]=\"'Delete bookmark' | translate\"\n [placement]=\"'left'\"\n [outsideClick]=\"true\"\n [adaptivePosition]=\"true\"\n [container]=\"''\"\n #poConfirm\n >\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"removeBookmark(poConfirm, bookmark)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </c8y-popover-confirm>\n </div>\n </c8y-li>\n </c8y-list-group>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n</div>\n<ng-template #emptyList>\n <c8y-ui-empty-state\n [icon]=\"'bookmark'\"\n [title]=\"'No bookmarks yet' | translate\"\n [subtitle]=\"\n 'Navigate to the desired page, open the right drawer and click the &quot;Add current page&quot; button.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</ng-template>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: ListItemDragHandleComponent, selector: "c8y-list-item-drag-handle, c8y-li-drag-handle" }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: ChangeIconComponent, selector: "c8y-change-icon", inputs: ["currentIcon"], outputs: ["onButtonClick"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
197
213
  }
198
214
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: EditBookmarksComponent, decorators: [{
@@ -215,7 +231,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
215
231
  EmptyStateComponent,
216
232
  C8yTranslatePipe
217
233
  ], template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'bookmark'\"></i>\n <div\n class=\"h4\"\n id=\"modal-title\"\n translate\n >\n Bookmarks\n </div>\n </div>\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Reorder, edit or delete bookmarks.' | translate }}\n </p>\n </div>\n <c8y-list-group\n class=\"cdk-droplist no-border-last\"\n *ngIf=\"bookmarks.length; else emptyList\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"bookmarks?.length < 2\"\n >\n <c8y-li\n *ngFor=\"let bookmark of bookmarks\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-icon\n style=\"{{ bookmarks?.length < 2 ? 'padding-left: 16px!important' : '' }}\"\n *ngIf=\"bookmark.icon\"\n >\n <c8y-change-icon\n [currentIcon]=\"bookmark.icon\"\n (onButtonClick)=\"changeBookmarkIcon(bookmark)\"\n ></c8y-change-icon>\n </c8y-li-icon>\n\n <div class=\"d-flex gap-8 a-i-center\">\n <form\n class=\"d-flex flex-grow\"\n name=\"bookmarksForm\"\n #bookmarksForm=\"ngForm\"\n >\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control fit-w\"\n title=\"{{ bookmark.label }}\"\n id=\"label\"\n name=\"label\"\n type=\"text\"\n [(ngModel)]=\"bookmark.label\"\n #label=\"ngModel\"\n maxlength=\"50\"\n [placeholder]=\"'e.g. My bookmark' | translate\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"updateBookmark(bookmark, 'label'); label.control.markAsPristine()\"\n [disabled]=\"label.invalid\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n <c8y-popover-confirm\n class=\"d-block\"\n [title]=\"'Delete bookmark' | translate\"\n [placement]=\"'left'\"\n [outsideClick]=\"true\"\n [adaptivePosition]=\"true\"\n [container]=\"''\"\n #poConfirm\n >\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"removeBookmark(poConfirm, bookmark)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </c8y-popover-confirm>\n </div>\n </c8y-li>\n </c8y-list-group>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n</div>\n<ng-template #emptyList>\n <c8y-ui-empty-state\n [icon]=\"'bookmark'\"\n [title]=\"'No bookmarks yet' | translate\"\n [subtitle]=\"\n 'Navigate to the desired page, open the right drawer and click the &quot;Add current page&quot; button.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</ng-template>\n" }]
218
- }], ctorParameters: () => [{ type: i1$1.BsModalRef }, { type: i2.AlertService }, { type: BookmarkService }, { type: i4.IconSelectorService }], propDecorators: { bookmarks: [{
234
+ }], ctorParameters: () => [{ type: i1$1.BsModalRef }, { type: i1.AlertService }, { type: BookmarkService }, { type: i4.IconSelectorService }], propDecorators: { bookmarks: [{
219
235
  type: Input
220
236
  }], handleKeyboardEvent: [{
221
237
  type: HostListener,
@@ -223,9 +239,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
223
239
  }] } });
224
240
 
225
241
  class BookmarksComponent {
226
- constructor(document, bookmarksService, alertService, bookmarkService, bsModalService, router, headerService) {
242
+ constructor(document, alertService, bookmarkService, bsModalService, router, headerService) {
227
243
  this.document = document;
228
- this.bookmarksService = bookmarksService;
229
244
  this.alertService = alertService;
230
245
  this.bookmarkService = bookmarkService;
231
246
  this.bsModalService = bsModalService;
@@ -241,12 +256,13 @@ class BookmarksComponent {
241
256
  this.bookmarks = await this.bookmarkService.getBookmarks();
242
257
  }
243
258
  async addBookmark() {
244
- const currentHref = this.document.location.href;
245
- if (this.bookmarks.some(bookmark => bookmark.url === currentHref)) {
259
+ const currentUrl = this.getRelativeUrl();
260
+ if (this.bookmarks.some(bookmark => this.toRelativeUrl(bookmark.url) === currentUrl)) {
246
261
  this.alertService.warning(gettext('Bookmark with the same URL is already added.'));
247
262
  return;
248
263
  }
249
- const linkObject = this.bookmarkService.convertBookmarkLinkToObject(this.document.title, currentHref, this.bookmarksService.getCurrentActiveNodeIcon(this.document));
264
+ const icon = await this.bookmarkService.getActiveNodeIcon();
265
+ const linkObject = this.bookmarkService.convertBookmarkLinkToObject(this.document.title, currentUrl, icon);
250
266
  this.bookmarks.push(linkObject);
251
267
  await this.bookmarkService.updateBookmarksInStorage(this.bookmarks);
252
268
  this.alertService.success(gettext('Bookmark added.'));
@@ -270,19 +286,50 @@ class BookmarksComponent {
270
286
  }
271
287
  }
272
288
  openUrl(url) {
273
- const parsedUrl = new URL(url);
274
- if (parsedUrl.hostname === location.hostname &&
275
- parsedUrl.pathname.includes(location.pathname)) {
276
- this.router.navigateByUrl(parsedUrl.hash.substring(1));
289
+ if (this.isRelativeUrl(url)) {
290
+ if (this.isSameApp(url)) {
291
+ const hash = url.includes('#') ? url.substring(url.indexOf('#') + 1) : '/';
292
+ this.router.navigateByUrl(hash);
293
+ }
294
+ else {
295
+ window.open(`${location.origin}${url}`, '_self');
296
+ }
277
297
  return;
278
298
  }
279
- // only possible if the external bookmark URL has been saved using the API
280
- if (parsedUrl.hostname !== location.hostname) {
281
- return;
299
+ // Legacy support for absolute URLs stored before the relative URL migration
300
+ const parsedUrl = new URL(url);
301
+ const relativePath = `${parsedUrl.pathname}${parsedUrl.hash}`;
302
+ if (this.isSameApp(relativePath)) {
303
+ const hash = parsedUrl.hash ? parsedUrl.hash.substring(1) : '/';
304
+ this.router.navigateByUrl(hash);
305
+ }
306
+ else {
307
+ window.open(`${location.origin}${relativePath}`, '_self');
308
+ }
309
+ }
310
+ getRelativeUrl() {
311
+ const { pathname, hash } = this.document.location;
312
+ return `${pathname}${hash}`;
313
+ }
314
+ isRelativeUrl(url) {
315
+ return url.startsWith('/');
316
+ }
317
+ isSameApp(url) {
318
+ return url.startsWith(location.pathname);
319
+ }
320
+ toRelativeUrl(url) {
321
+ if (this.isRelativeUrl(url)) {
322
+ return url;
323
+ }
324
+ try {
325
+ const parsed = new URL(url);
326
+ return `${parsed.pathname}${parsed.hash}`;
327
+ }
328
+ catch {
329
+ return url;
282
330
  }
283
- window.open(url, '_self');
284
331
  }
285
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BookmarksComponent, deps: [{ token: DOCUMENT }, { token: BookmarkService }, { token: i2.AlertService }, { token: BookmarkService }, { token: i1$1.BsModalService }, { token: i4$1.Router }, { token: i2.HeaderService }], target: i0.ɵɵFactoryTarget.Component }); }
332
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BookmarksComponent, deps: [{ token: DOCUMENT }, { token: i1.AlertService }, { token: BookmarkService }, { token: i1$1.BsModalService }, { token: i2.Router }, { token: i1.HeaderService }], target: i0.ɵɵFactoryTarget.Component }); }
286
333
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: BookmarksComponent, isStandalone: true, selector: "c8y-bookmarks", ngImport: i0, template: "<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Bookmarks' | translate }}</span>\n <button\n class=\"btn-dot m-l-auto\"\n [attr.aria-label]=\"'Edit bookmarks' | translate\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n tooltip=\"{{ 'Edit bookmarks' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n (click)=\"editBookmarks()\"\n >\n <i\n class=\"text-14 m-0\"\n c8yIcon=\"cog\"\n ></i>\n </button>\n</div>\n@if (bookmarks?.length) {\n <div class=\"c8y-right-drawer__item p-t-0 p-b-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"addBookmark()\"\n >\n <i\n class=\"m-t-0 m-b-0 text-14\"\n c8yIcon=\"plus-circle-o\"\n ></i>\n <span>{{ addButtonText | translate }}</span>\n </button>\n </div>\n}\n@if (bookmarks?.length) {\n @for (bookmark of bookmarks; track bookmark.url) {\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ bookmark.label }}\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"openUrl(bookmark.url)\"\n >\n @if (bookmark.icon) {\n <i [c8yIcon]=\"bookmark.icon\"></i>\n }\n <span class=\"text-truncate\">{{ bookmark.label }}</span>\n </button>\n }\n}\n\n<div class=\"p-t-8 p-b-8\">\n @if (!bookmarks?.length) {\n <span class=\"c8y-right-drawer__item text-muted text-bold text-14 p-b-0\">\n {{ emptyMessageHeader | translate }}\n </span>\n <span class=\"c8y-right-drawer__item text-12 p-t-0\">\n <span class=\"text-muted\">{{ emptyMessageBody | translate }}</span>\n </span>\n <div class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"addBookmark()\"\n >\n <i\n class=\"m-t-0 m-b-0 text-14\"\n c8yIcon=\"plus-circle-o\"\n ></i>\n <span>{{ addButtonText | translate }}</span>\n </button>\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
287
334
  }
288
335
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BookmarksComponent, decorators: [{
@@ -291,7 +338,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
291
338
  }], ctorParameters: () => [{ type: DOCUMENT, decorators: [{
292
339
  type: Inject,
293
340
  args: [DOCUMENT]
294
- }] }, { type: BookmarkService }, { type: i2.AlertService }, { type: BookmarkService }, { type: i1$1.BsModalService }, { type: i4$1.Router }, { type: i2.HeaderService }] });
341
+ }] }, { type: i1.AlertService }, { type: BookmarkService }, { type: i1$1.BsModalService }, { type: i2.Router }, { type: i1.HeaderService }] });
295
342
 
296
343
  class BookmarksModule {
297
344
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BookmarksModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-bookmarks.mjs","sources":["../../bookmarks/bookmarks.service.ts","../../bookmarks/edit-bookmarks/edit-bookmarks.component.ts","../../bookmarks/edit-bookmarks/edit-bookmarks.component.html","../../bookmarks/bookmarks.component.ts","../../bookmarks/bookmarks.component.html","../../bookmarks/bookmarks.module.ts","../../bookmarks/c8y-ngx-components-bookmarks.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { OptionsService, UserPreferencesService } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { uniqBy } from 'lodash-es';\nimport { firstValueFrom, map } from 'rxjs';\nimport { Bookmark } from './bookmark.model';\n\n@Injectable({ providedIn: 'root' })\nexport class BookmarkService {\n readonly USER_PREFERENCES_BOOKMARKS_KEY = 'bookmarks';\n\n updatedBookmarks: Bookmark[];\n\n constructor(\n private translateService: TranslateService,\n private userPreferencesService: UserPreferencesService,\n private options: OptionsService\n ) {}\n\n async updateBookmarksInStorage(newBookmarks: Bookmark[]): Promise<void> {\n const existingBookmarks = await this.getBookmarks();\n const mergedBookmarks = [...newBookmarks, ...existingBookmarks];\n const cleanedBookmarks = uniqBy(mergedBookmarks, 'id').filter(\n (bookmark: Bookmark) => !bookmark.markToRemove\n );\n\n this.setUserPreferencesBookmarks(cleanedBookmarks);\n }\n\n getCurrentActiveNodeIcon(document: Document): string {\n const BOOKMARK = 'bookmark';\n\n const iconElement = this.getIconElement(document);\n\n if (!iconElement) {\n return BOOKMARK;\n }\n\n const iconClassName = iconElement.className;\n const iconName = this.extractIconName(iconClassName);\n return iconName || BOOKMARK;\n }\n\n extractIconName(input: string): string | null {\n const iconRegex = /\\b(dlt-)?c8y-icon-(\\w+(?:-\\w+)*)\\b/g;\n const matches = [...input.matchAll(iconRegex)];\n const match = matches?.pop();\n\n if (!match) {\n return null;\n }\n const [, prefix, name] = match;\n\n return prefix ? name : `c8y-${name}`;\n }\n\n async getBookmarks(): Promise<Bookmark[]> {\n return await firstValueFrom(\n this.userPreferencesService\n .get(this.USER_PREFERENCES_BOOKMARKS_KEY)\n .pipe(map((bookmarks: Bookmark[]) => bookmarks ?? []))\n );\n }\n\n generateRandomID() {\n const array = new Uint8Array(16);\n crypto.getRandomValues(array);\n\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n }\n\n convertBookmarkLinkToObject(title: string, url: string, icon: string): Bookmark {\n const globalTitle = this.options.globalTitle ?? 'Cumulocity';\n return {\n id: this.generateRandomID(),\n label: title.includes(globalTitle)\n ? title.replace(`${globalTitle} - `, '')\n : this.translateService.instant(gettext('Bookmark')),\n url,\n icon\n };\n }\n\n private getIconElement(document: Document): HTMLElement | null {\n const currentActiveNode = document.querySelectorAll('.link.active') as NodeList;\n if (!currentActiveNode.length) {\n return null;\n }\n const activeNode = currentActiveNode.item(0) as HTMLElement;\n return activeNode.firstElementChild.firstChild as HTMLElement;\n }\n\n private setUserPreferencesBookmarks(bookmarks: Bookmark[]): void {\n this.userPreferencesService.set(this.USER_PREFERENCES_BOOKMARKS_KEY, bookmarks);\n this.updatedBookmarks = bookmarks;\n }\n}\n","import {\n CdkDragDrop,\n moveItemInArray,\n CdkDropList,\n CdkDrag,\n CdkDragHandle\n} from '@angular/cdk/drag-drop';\nimport { Component, HostListener, Input, OnInit } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n PopoverConfirmButtons,\n PopoverConfirmComponent,\n IconDirective,\n C8yTranslateDirective,\n ListGroupComponent,\n ListItemComponent,\n ListItemDragHandleComponent,\n ListItemIconComponent,\n ChangeIconComponent,\n EmptyStateComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { IconSelectorService } from '@c8y/ngx-components/icon-selector';\nimport { cloneDeep } from 'lodash-es';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { Bookmark } from '../bookmark.model';\nimport { BookmarkService } from '../bookmarks.service';\nimport { NgIf, NgFor } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'c8y-edit-bookmarks',\n templateUrl: './edit-bookmarks.component.html',\n imports: [\n IconDirective,\n C8yTranslateDirective,\n NgIf,\n ListGroupComponent,\n CdkDropList,\n NgFor,\n ListItemComponent,\n CdkDrag,\n ListItemDragHandleComponent,\n CdkDragHandle,\n ListItemIconComponent,\n ChangeIconComponent,\n FormsModule,\n PopoverConfirmComponent,\n EmptyStateComponent,\n C8yTranslatePipe\n ]\n})\nexport class EditBookmarksComponent implements OnInit {\n @Input() bookmarks: Bookmark[];\n private bookmarksToUpdate: Bookmark[];\n\n confirmRemoveColumnButtons: PopoverConfirmButtons[] = [\n {\n label: gettext('Cancel'),\n action: () => Promise.resolve(false)\n },\n {\n label: gettext('Delete'),\n status: 'danger',\n action: () => Promise.resolve(true)\n }\n ];\n\n result: Promise<Bookmark[]> = new Promise(resolve => {\n this._close = resolve;\n });\n\n private _close: (value: Bookmark[]) => void;\n\n constructor(\n private bsModalRef: BsModalRef,\n private alertService: AlertService,\n private bookmarkService: BookmarkService,\n private iconSelector: IconSelectorService\n ) {}\n\n ngOnInit(): void {\n this.bookmarksToUpdate = cloneDeep(this.bookmarks);\n }\n\n @HostListener('document:keydown', ['$event'])\n handleKeyboardEvent(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n this.close();\n }\n }\n\n close(): void {\n if (this.bookmarkService.updatedBookmarks) {\n this._close(this.bookmarkService.updatedBookmarks);\n }\n this.bsModalRef.hide();\n }\n\n async drop(event: CdkDragDrop<Bookmark[]>): Promise<void> {\n try {\n moveItemInArray(this.bookmarks, event.previousIndex, event.currentIndex);\n moveItemInArray(this.bookmarksToUpdate, event.previousIndex, event.currentIndex);\n\n await this.bookmarkService.updateBookmarksInStorage(this.bookmarksToUpdate);\n this.alertService.success(gettext('Bookmarks order updated.'));\n } catch {\n this.alertService.success(gettext('Bookmarks order failed to update.'));\n }\n }\n\n async updateBookmark(\n updatedBookmark: Bookmark,\n type: keyof Pick<Bookmark, 'icon' | 'label' | 'markToRemove'>\n ): Promise<void> {\n try {\n this.bookmarksToUpdate = this.updateBookmarkProperty(updatedBookmark, type);\n await this.bookmarkService.updateBookmarksInStorage(this.bookmarksToUpdate);\n if (type !== 'markToRemove') {\n this.alertService.success(gettext('Bookmark updated.'));\n }\n } catch {\n if (type !== 'markToRemove') {\n this.alertService.warning(gettext('Bookmark update failed'));\n }\n }\n }\n\n updateBookmarkProperty(\n updatedBookmark: Bookmark,\n type: keyof Pick<Bookmark, 'icon' | 'label' | 'markToRemove'>\n ): Bookmark[] {\n const update = {\n icon: (bookmark: Bookmark) => ({ ...bookmark, icon: updatedBookmark.icon }),\n label: (bookmark: Bookmark) => ({ ...bookmark, label: updatedBookmark.label }),\n markToRemove: (bookmark: Bookmark) => ({ ...bookmark, markToRemove: true })\n }[type];\n\n return this.bookmarksToUpdate.map(bookmark =>\n bookmark.id === updatedBookmark.id ? update(bookmark) : bookmark\n );\n }\n\n async changeBookmarkIcon(updatedBookmark: Bookmark): Promise<void> {\n try {\n const newIcon = await this.iconSelector.selectIcon();\n updatedBookmark.icon = newIcon;\n await this.updateBookmark(updatedBookmark, 'icon');\n } catch {\n // nothing to do\n }\n }\n\n async removeBookmark(\n poConfirm: PopoverConfirmComponent,\n bookmarkToDelete: Bookmark\n ): Promise<void> {\n poConfirm.message = gettext('This action is irreversible.');\n\n try {\n const remove = await poConfirm.show(this.confirmRemoveColumnButtons);\n if (!remove) {\n return;\n }\n\n await this.updateBookmark(bookmarkToDelete, 'markToRemove');\n\n const bookmarkIndex = this.bookmarks.findIndex(\n bookmark => bookmark.id === bookmarkToDelete.id\n );\n\n if (bookmarkIndex === -1) {\n return;\n }\n\n this.bookmarks.splice(bookmarkIndex, 1);\n this.alertService.success(gettext('Bookmark removed.'));\n } catch (err) {\n /**\n * Prevents an alert message from being displayed if the user clicks outside of a popover.\n */\n if (err) {\n this.alertService.warning(gettext('Bookmarks deletion failed.'));\n }\n }\n }\n}\n","<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'bookmark'\"></i>\n <div\n class=\"h4\"\n id=\"modal-title\"\n translate\n >\n Bookmarks\n </div>\n </div>\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Reorder, edit or delete bookmarks.' | translate }}\n </p>\n </div>\n <c8y-list-group\n class=\"cdk-droplist no-border-last\"\n *ngIf=\"bookmarks.length; else emptyList\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"bookmarks?.length < 2\"\n >\n <c8y-li\n *ngFor=\"let bookmark of bookmarks\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-icon\n style=\"{{ bookmarks?.length < 2 ? 'padding-left: 16px!important' : '' }}\"\n *ngIf=\"bookmark.icon\"\n >\n <c8y-change-icon\n [currentIcon]=\"bookmark.icon\"\n (onButtonClick)=\"changeBookmarkIcon(bookmark)\"\n ></c8y-change-icon>\n </c8y-li-icon>\n\n <div class=\"d-flex gap-8 a-i-center\">\n <form\n class=\"d-flex flex-grow\"\n name=\"bookmarksForm\"\n #bookmarksForm=\"ngForm\"\n >\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control fit-w\"\n title=\"{{ bookmark.label }}\"\n id=\"label\"\n name=\"label\"\n type=\"text\"\n [(ngModel)]=\"bookmark.label\"\n #label=\"ngModel\"\n maxlength=\"50\"\n [placeholder]=\"'e.g. My bookmark' | translate\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"updateBookmark(bookmark, 'label'); label.control.markAsPristine()\"\n [disabled]=\"label.invalid\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n <c8y-popover-confirm\n class=\"d-block\"\n [title]=\"'Delete bookmark' | translate\"\n [placement]=\"'left'\"\n [outsideClick]=\"true\"\n [adaptivePosition]=\"true\"\n [container]=\"''\"\n #poConfirm\n >\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"removeBookmark(poConfirm, bookmark)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </c8y-popover-confirm>\n </div>\n </c8y-li>\n </c8y-list-group>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n</div>\n<ng-template #emptyList>\n <c8y-ui-empty-state\n [icon]=\"'bookmark'\"\n [title]=\"'No bookmarks yet' | translate\"\n [subtitle]=\"\n 'Navigate to the desired page, open the right drawer and click the &quot;Add current page&quot; button.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</ng-template>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, Inject, DOCUMENT as Document } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlertService, HeaderService, IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { Observable } from 'rxjs';\nimport { Bookmark } from './bookmark.model';\nimport { BookmarkService } from './bookmarks.service';\nimport { EditBookmarksComponent } from './edit-bookmarks/edit-bookmarks.component';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'c8y-bookmarks',\n templateUrl: './bookmarks.component.html',\n imports: [IconDirective, TooltipDirective, C8yTranslatePipe, AsyncPipe]\n})\nexport class BookmarksComponent {\n drawerOpen$: Observable<boolean>;\n bookmarks: Bookmark[] = [];\n emptyMessageHeader = gettext('No bookmarks yet');\n emptyMessageBody = gettext(\n 'Navigate to the desired page and click the \"Add current page\" button. Editing, deleting and reordering are possible by clicking on the cog wheel.'\n );\n addButtonText = gettext('Add current page');\n\n constructor(\n @Inject(Document) private document: Document,\n private bookmarksService: BookmarkService,\n private alertService: AlertService,\n private bookmarkService: BookmarkService,\n private bsModalService: BsModalService,\n private router: Router,\n private headerService: HeaderService\n ) {\n this.drawerOpen$ = this.headerService.rightDrawerOpen$;\n }\n\n async ngOnInit(): Promise<void> {\n this.bookmarks = await this.bookmarkService.getBookmarks();\n }\n\n async addBookmark(): Promise<void> {\n const currentHref = this.document.location.href;\n if (this.bookmarks.some(bookmark => bookmark.url === currentHref)) {\n this.alertService.warning(gettext('Bookmark with the same URL is already added.'));\n return;\n }\n const linkObject = this.bookmarkService.convertBookmarkLinkToObject(\n this.document.title,\n currentHref,\n this.bookmarksService.getCurrentActiveNodeIcon(this.document)\n );\n this.bookmarks.push(linkObject);\n await this.bookmarkService.updateBookmarksInStorage(this.bookmarks);\n this.alertService.success(gettext('Bookmark added.'));\n }\n\n async editBookmarks(): Promise<void> {\n try {\n const initialState: Pick<EditBookmarksComponent, 'bookmarks'> = {\n bookmarks: cloneDeep(this.bookmarks)\n };\n const modalRef = this.bsModalService.show(EditBookmarksComponent, {\n class: 'modal-md',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n initialState: initialState,\n ignoreBackdropClick: true\n }).content as EditBookmarksComponent;\n this.bookmarks = await modalRef.result;\n } catch (err) {\n return;\n }\n }\n\n openUrl(url: string): void {\n const parsedUrl = new URL(url);\n\n if (\n parsedUrl.hostname === location.hostname &&\n parsedUrl.pathname.includes(location.pathname)\n ) {\n this.router.navigateByUrl(parsedUrl.hash.substring(1));\n return;\n }\n\n // only possible if the external bookmark URL has been saved using the API\n if (parsedUrl.hostname !== location.hostname) {\n return;\n }\n\n window.open(url, '_self');\n }\n}\n","<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Bookmarks' | translate }}</span>\n <button\n class=\"btn-dot m-l-auto\"\n [attr.aria-label]=\"'Edit bookmarks' | translate\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n tooltip=\"{{ 'Edit bookmarks' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n (click)=\"editBookmarks()\"\n >\n <i\n class=\"text-14 m-0\"\n c8yIcon=\"cog\"\n ></i>\n </button>\n</div>\n@if (bookmarks?.length) {\n <div class=\"c8y-right-drawer__item p-t-0 p-b-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"addBookmark()\"\n >\n <i\n class=\"m-t-0 m-b-0 text-14\"\n c8yIcon=\"plus-circle-o\"\n ></i>\n <span>{{ addButtonText | translate }}</span>\n </button>\n </div>\n}\n@if (bookmarks?.length) {\n @for (bookmark of bookmarks; track bookmark.url) {\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ bookmark.label }}\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"openUrl(bookmark.url)\"\n >\n @if (bookmark.icon) {\n <i [c8yIcon]=\"bookmark.icon\"></i>\n }\n <span class=\"text-truncate\">{{ bookmark.label }}</span>\n </button>\n }\n}\n\n<div class=\"p-t-8 p-b-8\">\n @if (!bookmarks?.length) {\n <span class=\"c8y-right-drawer__item text-muted text-bold text-14 p-b-0\">\n {{ emptyMessageHeader | translate }}\n </span>\n <span class=\"c8y-right-drawer__item text-12 p-t-0\">\n <span class=\"text-muted\">{{ emptyMessageBody | translate }}</span>\n </span>\n <div class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"addBookmark()\"\n >\n <i\n class=\"m-t-0 m-b-0 text-14\"\n c8yIcon=\"plus-circle-o\"\n ></i>\n <span>{{ addButtonText | translate }}</span>\n </button>\n </div>\n }\n</div>\n","import { DragDropModule } from '@angular/cdk/drag-drop';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport {\n ChangeIconComponent,\n CommonModule,\n CoreModule,\n FormsModule as c8yFormsModule,\n hookDrawer,\n ListGroupModule,\n ModalModule\n} from '@c8y/ngx-components';\nimport { BookmarksComponent } from './bookmarks.component';\nimport { EditBookmarksComponent } from './edit-bookmarks/edit-bookmarks.component';\n\n@NgModule({\n imports: [\n CoreModule,\n CommonModule,\n ListGroupModule,\n DragDropModule,\n FormsModule,\n c8yFormsModule,\n ModalModule,\n TooltipModule.forRoot(),\n ChangeIconComponent,\n BookmarksComponent,\n EditBookmarksComponent\n ],\n exports: [BookmarksComponent],\n providers: [\n hookDrawer({\n component: BookmarksComponent,\n position: 'right',\n priority: 50,\n id: 'bookmarks'\n })\n ]\n})\nexport class BookmarksModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i3.BookmarkService","Document","i1.BookmarkService","i3","i4","c8yFormsModule"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-bookmarks.mjs","sources":["../../bookmarks/bookmarks.service.ts","../../bookmarks/edit-bookmarks/edit-bookmarks.component.ts","../../bookmarks/edit-bookmarks/edit-bookmarks.component.html","../../bookmarks/bookmarks.component.ts","../../bookmarks/bookmarks.component.html","../../bookmarks/bookmarks.module.ts","../../bookmarks/c8y-ngx-components-bookmarks.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n NavigatorNode,\n NavigatorService,\n OptionsService,\n UserPreferencesService\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { TranslateService } from '@ngx-translate/core';\nimport { uniqBy } from 'lodash-es';\nimport { firstValueFrom, map } from 'rxjs';\nimport { Bookmark } from './bookmark.model';\n\n@Injectable({ providedIn: 'root' })\nexport class BookmarkService {\n private static readonly DEFAULT_ICON = 'bookmark';\n\n readonly USER_PREFERENCES_BOOKMARKS_KEY = 'bookmarks';\n\n updatedBookmarks: Bookmark[];\n\n constructor(\n private navigatorService: NavigatorService,\n private options: OptionsService,\n private router: Router,\n private translateService: TranslateService,\n private userPreferencesService: UserPreferencesService\n ) {}\n\n async updateBookmarksInStorage(newBookmarks: Bookmark[]): Promise<void> {\n const existingBookmarks = await this.getBookmarks();\n const mergedBookmarks = [...newBookmarks, ...existingBookmarks];\n const cleanedBookmarks = uniqBy(mergedBookmarks, 'id').filter(\n (bookmark: Bookmark) => !bookmark.markToRemove\n );\n\n this.setUserPreferencesBookmarks(cleanedBookmarks);\n }\n\n async getActiveNodeIcon(): Promise<string> {\n const activeNode = await this.findActiveNode();\n return activeNode?.icon || BookmarkService.DEFAULT_ICON;\n }\n\n extractIconName(input: string): string | null {\n const iconRegex = /\\b(dlt-)?c8y-icon-(\\w+(?:-\\w+)*)\\b/g;\n const matches = [...input.matchAll(iconRegex)];\n const match = matches?.pop();\n\n if (!match) {\n return null;\n }\n const [, prefix, name] = match;\n\n return prefix ? name : `c8y-${name}`;\n }\n\n async getBookmarks(): Promise<Bookmark[]> {\n return await firstValueFrom(\n this.userPreferencesService\n .get(this.USER_PREFERENCES_BOOKMARKS_KEY)\n .pipe(map((bookmarks: Bookmark[]) => bookmarks ?? []))\n );\n }\n\n generateRandomID() {\n const array = new Uint8Array(16);\n crypto.getRandomValues(array);\n\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n }\n\n convertBookmarkLinkToObject(title: string, url: string, icon: string): Bookmark {\n const globalTitle = this.options.globalTitle ?? 'Cumulocity';\n return {\n id: this.generateRandomID(),\n label: title.includes(globalTitle)\n ? title.replace(`${globalTitle} - `, '')\n : this.translateService.instant(gettext('Bookmark')),\n url,\n icon\n };\n }\n\n private async findActiveNode(): Promise<NavigatorNode | undefined> {\n const nodes = await firstValueFrom(this.navigatorService.items$);\n return this.findActiveInTree(nodes);\n }\n\n private findActiveInTree(nodes: NavigatorNode[]): NavigatorNode | undefined {\n let result: NavigatorNode | undefined;\n\n for (const node of nodes) {\n if (node.path && this.isNodeActive(node)) {\n result = node;\n }\n if (node.children?.length) {\n const childMatch = this.findActiveInTree(node.children);\n if (childMatch) {\n result = childMatch;\n }\n }\n }\n\n return result;\n }\n\n private isNodeActive(node: NavigatorNode): boolean {\n return this.router.isActive(node.path, {\n paths: node.routerLinkExact ? 'exact' : 'subset',\n queryParams: 'ignored',\n fragment: 'ignored',\n matrixParams: 'ignored'\n });\n }\n\n private setUserPreferencesBookmarks(bookmarks: Bookmark[]): void {\n this.userPreferencesService.set(this.USER_PREFERENCES_BOOKMARKS_KEY, bookmarks);\n this.updatedBookmarks = bookmarks;\n }\n}\n","import {\n CdkDragDrop,\n moveItemInArray,\n CdkDropList,\n CdkDrag,\n CdkDragHandle\n} from '@angular/cdk/drag-drop';\nimport { Component, HostListener, Input, OnInit } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n PopoverConfirmButtons,\n PopoverConfirmComponent,\n IconDirective,\n C8yTranslateDirective,\n ListGroupComponent,\n ListItemComponent,\n ListItemDragHandleComponent,\n ListItemIconComponent,\n ChangeIconComponent,\n EmptyStateComponent,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { IconSelectorService } from '@c8y/ngx-components/icon-selector';\nimport { cloneDeep } from 'lodash-es';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { Bookmark } from '../bookmark.model';\nimport { BookmarkService } from '../bookmarks.service';\nimport { NgIf, NgFor } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'c8y-edit-bookmarks',\n templateUrl: './edit-bookmarks.component.html',\n imports: [\n IconDirective,\n C8yTranslateDirective,\n NgIf,\n ListGroupComponent,\n CdkDropList,\n NgFor,\n ListItemComponent,\n CdkDrag,\n ListItemDragHandleComponent,\n CdkDragHandle,\n ListItemIconComponent,\n ChangeIconComponent,\n FormsModule,\n PopoverConfirmComponent,\n EmptyStateComponent,\n C8yTranslatePipe\n ]\n})\nexport class EditBookmarksComponent implements OnInit {\n @Input() bookmarks: Bookmark[];\n private bookmarksToUpdate: Bookmark[];\n\n confirmRemoveColumnButtons: PopoverConfirmButtons[] = [\n {\n label: gettext('Cancel'),\n action: () => Promise.resolve(false)\n },\n {\n label: gettext('Delete'),\n status: 'danger',\n action: () => Promise.resolve(true)\n }\n ];\n\n result: Promise<Bookmark[]> = new Promise(resolve => {\n this._close = resolve;\n });\n\n private _close: (value: Bookmark[]) => void;\n\n constructor(\n private bsModalRef: BsModalRef,\n private alertService: AlertService,\n private bookmarkService: BookmarkService,\n private iconSelector: IconSelectorService\n ) {}\n\n ngOnInit(): void {\n this.bookmarksToUpdate = cloneDeep(this.bookmarks);\n }\n\n @HostListener('document:keydown', ['$event'])\n handleKeyboardEvent(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n this.close();\n }\n }\n\n close(): void {\n if (this.bookmarkService.updatedBookmarks) {\n this._close(this.bookmarkService.updatedBookmarks);\n }\n this.bsModalRef.hide();\n }\n\n async drop(event: CdkDragDrop<Bookmark[]>): Promise<void> {\n try {\n moveItemInArray(this.bookmarks, event.previousIndex, event.currentIndex);\n moveItemInArray(this.bookmarksToUpdate, event.previousIndex, event.currentIndex);\n\n await this.bookmarkService.updateBookmarksInStorage(this.bookmarksToUpdate);\n this.alertService.success(gettext('Bookmarks order updated.'));\n } catch {\n this.alertService.success(gettext('Bookmarks order failed to update.'));\n }\n }\n\n async updateBookmark(\n updatedBookmark: Bookmark,\n type: keyof Pick<Bookmark, 'icon' | 'label' | 'markToRemove'>\n ): Promise<void> {\n try {\n this.bookmarksToUpdate = this.updateBookmarkProperty(updatedBookmark, type);\n await this.bookmarkService.updateBookmarksInStorage(this.bookmarksToUpdate);\n if (type !== 'markToRemove') {\n this.alertService.success(gettext('Bookmark updated.'));\n }\n } catch {\n if (type !== 'markToRemove') {\n this.alertService.warning(gettext('Bookmark update failed'));\n }\n }\n }\n\n updateBookmarkProperty(\n updatedBookmark: Bookmark,\n type: keyof Pick<Bookmark, 'icon' | 'label' | 'markToRemove'>\n ): Bookmark[] {\n const update = {\n icon: (bookmark: Bookmark) => ({ ...bookmark, icon: updatedBookmark.icon }),\n label: (bookmark: Bookmark) => ({ ...bookmark, label: updatedBookmark.label }),\n markToRemove: (bookmark: Bookmark) => ({ ...bookmark, markToRemove: true })\n }[type];\n\n return this.bookmarksToUpdate.map(bookmark =>\n bookmark.id === updatedBookmark.id ? update(bookmark) : bookmark\n );\n }\n\n async changeBookmarkIcon(updatedBookmark: Bookmark): Promise<void> {\n try {\n const newIcon = await this.iconSelector.selectIcon();\n updatedBookmark.icon = newIcon;\n await this.updateBookmark(updatedBookmark, 'icon');\n } catch {\n // nothing to do\n }\n }\n\n async removeBookmark(\n poConfirm: PopoverConfirmComponent,\n bookmarkToDelete: Bookmark\n ): Promise<void> {\n poConfirm.message = gettext('This action is irreversible.');\n\n try {\n const remove = await poConfirm.show(this.confirmRemoveColumnButtons);\n if (!remove) {\n return;\n }\n\n await this.updateBookmark(bookmarkToDelete, 'markToRemove');\n\n const bookmarkIndex = this.bookmarks.findIndex(\n bookmark => bookmark.id === bookmarkToDelete.id\n );\n\n if (bookmarkIndex === -1) {\n return;\n }\n\n this.bookmarks.splice(bookmarkIndex, 1);\n this.alertService.success(gettext('Bookmark removed.'));\n } catch (err) {\n /**\n * Prevents an alert message from being displayed if the user clicks outside of a popover.\n */\n if (err) {\n this.alertService.warning(gettext('Bookmarks deletion failed.'));\n }\n }\n }\n}\n","<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'bookmark'\"></i>\n <div\n class=\"h4\"\n id=\"modal-title\"\n translate\n >\n Bookmarks\n </div>\n </div>\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"p-16 text-center separator-bottom sticky-top bg-component\">\n <p class=\"text-medium text-16\">\n {{ 'Reorder, edit or delete bookmarks.' | translate }}\n </p>\n </div>\n <c8y-list-group\n class=\"cdk-droplist no-border-last\"\n *ngIf=\"bookmarks.length; else emptyList\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"bookmarks?.length < 2\"\n >\n <c8y-li\n *ngFor=\"let bookmark of bookmarks\"\n cdkDrag\n >\n <c8y-li-drag-handle\n title=\"{{ 'Drag to reorder' | translate }}\"\n cdkDragHandle\n >\n <i c8yIcon=\"drag-reorder\"></i>\n </c8y-li-drag-handle>\n <c8y-li-icon\n style=\"{{ bookmarks?.length < 2 ? 'padding-left: 16px!important' : '' }}\"\n *ngIf=\"bookmark.icon\"\n >\n <c8y-change-icon\n [currentIcon]=\"bookmark.icon\"\n (onButtonClick)=\"changeBookmarkIcon(bookmark)\"\n ></c8y-change-icon>\n </c8y-li-icon>\n\n <div class=\"d-flex gap-8 a-i-center\">\n <form\n class=\"d-flex flex-grow\"\n name=\"bookmarksForm\"\n #bookmarksForm=\"ngForm\"\n >\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control fit-w\"\n title=\"{{ bookmark.label }}\"\n id=\"label\"\n name=\"label\"\n type=\"text\"\n [(ngModel)]=\"bookmark.label\"\n #label=\"ngModel\"\n maxlength=\"50\"\n [placeholder]=\"'e.g. My bookmark' | translate\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"updateBookmark(bookmark, 'label'); label.control.markAsPristine()\"\n [disabled]=\"label.invalid\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n <c8y-popover-confirm\n class=\"d-block\"\n [title]=\"'Delete bookmark' | translate\"\n [placement]=\"'left'\"\n [outsideClick]=\"true\"\n [adaptivePosition]=\"true\"\n [container]=\"''\"\n #poConfirm\n >\n <button\n class=\"btn btn-dot btn-dot--danger m-l-auto\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"removeBookmark(poConfirm, bookmark)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </c8y-popover-confirm>\n </div>\n </c8y-li>\n </c8y-list-group>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n</div>\n<ng-template #emptyList>\n <c8y-ui-empty-state\n [icon]=\"'bookmark'\"\n [title]=\"'No bookmarks yet' | translate\"\n [subtitle]=\"\n 'Navigate to the desired page, open the right drawer and click the &quot;Add current page&quot; button.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</ng-template>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, Inject, DOCUMENT as Document } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlertService, HeaderService, IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { Observable } from 'rxjs';\nimport { Bookmark } from './bookmark.model';\nimport { BookmarkService } from './bookmarks.service';\nimport { EditBookmarksComponent } from './edit-bookmarks/edit-bookmarks.component';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n selector: 'c8y-bookmarks',\n templateUrl: './bookmarks.component.html',\n imports: [IconDirective, TooltipDirective, C8yTranslatePipe, AsyncPipe]\n})\nexport class BookmarksComponent {\n drawerOpen$: Observable<boolean>;\n bookmarks: Bookmark[] = [];\n emptyMessageHeader = gettext('No bookmarks yet');\n emptyMessageBody = gettext(\n 'Navigate to the desired page and click the \"Add current page\" button. Editing, deleting and reordering are possible by clicking on the cog wheel.'\n );\n addButtonText = gettext('Add current page');\n\n constructor(\n @Inject(Document) private document: Document,\n private alertService: AlertService,\n private bookmarkService: BookmarkService,\n private bsModalService: BsModalService,\n private router: Router,\n private headerService: HeaderService\n ) {\n this.drawerOpen$ = this.headerService.rightDrawerOpen$;\n }\n\n async ngOnInit(): Promise<void> {\n this.bookmarks = await this.bookmarkService.getBookmarks();\n }\n\n async addBookmark(): Promise<void> {\n const currentUrl = this.getRelativeUrl();\n if (this.bookmarks.some(bookmark => this.toRelativeUrl(bookmark.url) === currentUrl)) {\n this.alertService.warning(gettext('Bookmark with the same URL is already added.'));\n return;\n }\n const icon = await this.bookmarkService.getActiveNodeIcon();\n const linkObject = this.bookmarkService.convertBookmarkLinkToObject(\n this.document.title,\n currentUrl,\n icon\n );\n this.bookmarks.push(linkObject);\n await this.bookmarkService.updateBookmarksInStorage(this.bookmarks);\n this.alertService.success(gettext('Bookmark added.'));\n }\n\n async editBookmarks(): Promise<void> {\n try {\n const initialState: Pick<EditBookmarksComponent, 'bookmarks'> = {\n bookmarks: cloneDeep(this.bookmarks)\n };\n const modalRef = this.bsModalService.show(EditBookmarksComponent, {\n class: 'modal-md',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n initialState: initialState,\n ignoreBackdropClick: true\n }).content as EditBookmarksComponent;\n this.bookmarks = await modalRef.result;\n } catch (err) {\n return;\n }\n }\n\n openUrl(url: string): void {\n if (this.isRelativeUrl(url)) {\n if (this.isSameApp(url)) {\n const hash = url.includes('#') ? url.substring(url.indexOf('#') + 1) : '/';\n this.router.navigateByUrl(hash);\n } else {\n window.open(`${location.origin}${url}`, '_self');\n }\n return;\n }\n\n // Legacy support for absolute URLs stored before the relative URL migration\n const parsedUrl = new URL(url);\n const relativePath = `${parsedUrl.pathname}${parsedUrl.hash}`;\n\n if (this.isSameApp(relativePath)) {\n const hash = parsedUrl.hash ? parsedUrl.hash.substring(1) : '/';\n this.router.navigateByUrl(hash);\n } else {\n window.open(`${location.origin}${relativePath}`, '_self');\n }\n }\n\n private getRelativeUrl(): string {\n const { pathname, hash } = this.document.location;\n return `${pathname}${hash}`;\n }\n\n private isRelativeUrl(url: string): boolean {\n return url.startsWith('/');\n }\n\n private isSameApp(url: string): boolean {\n return url.startsWith(location.pathname);\n }\n\n private toRelativeUrl(url: string): string {\n if (this.isRelativeUrl(url)) {\n return url;\n }\n try {\n const parsed = new URL(url);\n return `${parsed.pathname}${parsed.hash}`;\n } catch {\n return url;\n }\n }\n}\n","<div class=\"separator-top p-t-8 m-t-auto c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Bookmarks' | translate }}</span>\n <button\n class=\"btn-dot m-l-auto\"\n [attr.aria-label]=\"'Edit bookmarks' | translate\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n tooltip=\"{{ 'Edit bookmarks' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n (click)=\"editBookmarks()\"\n >\n <i\n class=\"text-14 m-0\"\n c8yIcon=\"cog\"\n ></i>\n </button>\n</div>\n@if (bookmarks?.length) {\n <div class=\"c8y-right-drawer__item p-t-0 p-b-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"addBookmark()\"\n >\n <i\n class=\"m-t-0 m-b-0 text-14\"\n c8yIcon=\"plus-circle-o\"\n ></i>\n <span>{{ addButtonText | translate }}</span>\n </button>\n </div>\n}\n@if (bookmarks?.length) {\n @for (bookmark of bookmarks; track bookmark.url) {\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ bookmark.label }}\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"openUrl(bookmark.url)\"\n >\n @if (bookmark.icon) {\n <i [c8yIcon]=\"bookmark.icon\"></i>\n }\n <span class=\"text-truncate\">{{ bookmark.label }}</span>\n </button>\n }\n}\n\n<div class=\"p-t-8 p-b-8\">\n @if (!bookmarks?.length) {\n <span class=\"c8y-right-drawer__item text-muted text-bold text-14 p-b-0\">\n {{ emptyMessageHeader | translate }}\n </span>\n <span class=\"c8y-right-drawer__item text-12 p-t-0\">\n <span class=\"text-muted\">{{ emptyMessageBody | translate }}</span>\n </span>\n <div class=\"c8y-right-drawer__item\">\n <button\n class=\"btn btn-default btn-sm\"\n [tabindex]=\"(drawerOpen$ | async) ? '0' : '-1'\"\n type=\"button\"\n (click)=\"addBookmark()\"\n >\n <i\n class=\"m-t-0 m-b-0 text-14\"\n c8yIcon=\"plus-circle-o\"\n ></i>\n <span>{{ addButtonText | translate }}</span>\n </button>\n </div>\n }\n</div>\n","import { DragDropModule } from '@angular/cdk/drag-drop';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport {\n ChangeIconComponent,\n CommonModule,\n CoreModule,\n FormsModule as c8yFormsModule,\n hookDrawer,\n ListGroupModule,\n ModalModule\n} from '@c8y/ngx-components';\nimport { BookmarksComponent } from './bookmarks.component';\nimport { EditBookmarksComponent } from './edit-bookmarks/edit-bookmarks.component';\n\n@NgModule({\n imports: [\n CoreModule,\n CommonModule,\n ListGroupModule,\n DragDropModule,\n FormsModule,\n c8yFormsModule,\n ModalModule,\n TooltipModule.forRoot(),\n ChangeIconComponent,\n BookmarksComponent,\n EditBookmarksComponent\n ],\n exports: [BookmarksComponent],\n providers: [\n hookDrawer({\n component: BookmarksComponent,\n position: 'right',\n priority: 50,\n id: 'bookmarks'\n })\n ]\n})\nexport class BookmarksModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3.BookmarkService","Document","i2.BookmarkService","i3","i4","c8yFormsModule"],"mappings":"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"}
@@ -538,11 +538,11 @@ class CockpitSetupStepperButtonsComponent {
538
538
  this.onBack = new EventEmitter();
539
539
  }
540
540
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CockpitSetupStepperButtonsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
541
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CockpitSetupStepperButtonsComponent, isStandalone: true, selector: "c8y-cockpit-setup-stepper-buttons", inputs: { index: "index" }, outputs: { onNext: "onNext", onBack: "onBack" }, ngImport: i0, template: "<div class=\"card-footer separator d-flex j-c-center\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"onBack.emit()\"\n *ngIf=\"index !== 0\"\n translate\n >\n Previous\n </button>\n <button data-cy=\"c8y-cockpit-setup-stepper-buttons--save-continue-button\" class=\"btn btn-primary\" type=\"submit\" (click)=\"onNext.emit()\" translate>\n Continue\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }] }); }
541
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: CockpitSetupStepperButtonsComponent, isStandalone: true, selector: "c8y-cockpit-setup-stepper-buttons", inputs: { index: "index" }, outputs: { onNext: "onNext", onBack: "onBack" }, ngImport: i0, template: "<div class=\"card-footer separator d-flex gap-8 j-c-center\">\n @if (index !== 0) {\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"onBack.emit()\"\n translate\n >\n Previous\n </button>\n }\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n data-cy=\"c8y-cockpit-setup-stepper-buttons--save-continue-button\"\n (click)=\"onNext.emit()\"\n translate\n >\n Continue\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }] }); }
542
542
  }
543
543
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CockpitSetupStepperButtonsComponent, decorators: [{
544
544
  type: Component,
545
- args: [{ selector: 'c8y-cockpit-setup-stepper-buttons', imports: [NgIf, C8yTranslateDirective], template: "<div class=\"card-footer separator d-flex j-c-center\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"onBack.emit()\"\n *ngIf=\"index !== 0\"\n translate\n >\n Previous\n </button>\n <button data-cy=\"c8y-cockpit-setup-stepper-buttons--save-continue-button\" class=\"btn btn-primary\" type=\"submit\" (click)=\"onNext.emit()\" translate>\n Continue\n </button>\n</div>\n" }]
545
+ args: [{ selector: 'c8y-cockpit-setup-stepper-buttons', imports: [NgIf, C8yTranslateDirective], template: "<div class=\"card-footer separator d-flex gap-8 j-c-center\">\n @if (index !== 0) {\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"onBack.emit()\"\n translate\n >\n Previous\n </button>\n }\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n data-cy=\"c8y-cockpit-setup-stepper-buttons--save-continue-button\"\n (click)=\"onNext.emit()\"\n translate\n >\n Continue\n </button>\n</div>\n" }]
546
546
  }], propDecorators: { index: [{
547
547
  type: Input
548
548
  }], onNext: [{