@c8y/ngx-components 1024.2.4 → 1024.8.3
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.
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-DhfJagxU.mjs → c8y-ngx-components-asset-property-grid.component-Ddva2QJW.mjs} +35 -19
- package/fesm2022/c8y-ngx-components-asset-property-grid.component-Ddva2QJW.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-bookmarks.mjs +33 -23
- package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +30 -16
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +3 -2
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +2 -2
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs +27 -9
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs +1538 -59
- package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +9 -11
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs +52 -2
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +17 -3
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +184 -41
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +94 -49
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +5 -4
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +10 -4
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +5 -4
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +6 -5
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +10 -5
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +327 -8
- package/locales/es.po +327 -8
- package/locales/fr.po +327 -8
- package/locales/ja_JP.po +325 -9
- package/locales/ko.po +327 -8
- package/locales/locales.pot +326 -7
- package/locales/nl.po +327 -8
- package/locales/pl.po +327 -8
- package/locales/pt_BR.po +327 -8
- package/locales/zh_CN.po +327 -8
- package/locales/zh_TW.po +327 -8
- package/package.json +1 -1
- package/types/c8y-ngx-components-bookmarks.d.ts +7 -7
- package/types/c8y-ngx-components-bookmarks.d.ts.map +1 -1
- package/types/c8y-ngx-components-context-dashboard.d.ts +7 -3
- package/types/c8y-ngx-components-context-dashboard.d.ts.map +1 -1
- package/types/c8y-ngx-components-device-profile.d.ts +5 -2
- package/types/c8y-ngx-components-device-profile.d.ts.map +1 -1
- package/types/c8y-ngx-components-icon-selector.d.ts +286 -32
- package/types/c8y-ngx-components-icon-selector.d.ts.map +1 -1
- package/types/c8y-ngx-components-protocol-opcua.d.ts.map +1 -1
- package/types/c8y-ngx-components-remote-access-data.d.ts +27 -1
- package/types/c8y-ngx-components-remote-access-data.d.ts.map +1 -1
- package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts +10 -3
- package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts.map +1 -1
- package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts +20 -2
- package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts.map +1 -1
- package/types/c8y-ngx-components-repository-configuration.d.ts +20 -10
- package/types/c8y-ngx-components-repository-configuration.d.ts.map +1 -1
- package/types/c8y-ngx-components-repository-firmware.d.ts.map +1 -1
- package/types/c8y-ngx-components-repository-software.d.ts +2 -0
- package/types/c8y-ngx-components-repository-software.d.ts.map +1 -1
- package/types/c8y-ngx-components-trusted-certificates.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-asset-table.d.ts.map +1 -1
- package/types/c8y-ngx-components.d.ts +5 -1
- package/types/c8y-ngx-components.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-property-grid.component-DhfJagxU.mjs.map +0 -1
|
@@ -157,6 +157,12 @@ class AssetPropertyGridComponent {
|
|
|
157
157
|
hover: true
|
|
158
158
|
};
|
|
159
159
|
this.onAddCustomColumn = new EventEmitter();
|
|
160
|
+
/**
|
|
161
|
+
* Maps a selectable node path to its column header, derived while building the
|
|
162
|
+
* tree. Lets a selected column be resolved locally, without a redundant fetch
|
|
163
|
+
* for a definition whose header the list response already provides.
|
|
164
|
+
*/
|
|
165
|
+
this.headersByPath = new Map();
|
|
160
166
|
}
|
|
161
167
|
async onDataSourceModifier(dataSourceModifier) {
|
|
162
168
|
const { columns, pagination, parentRow } = dataSourceModifier;
|
|
@@ -174,6 +180,7 @@ class AssetPropertyGridComponent {
|
|
|
174
180
|
};
|
|
175
181
|
});
|
|
176
182
|
const treeNodes = data.map(d => this.toTreeNode(d));
|
|
183
|
+
this.cacheHeaders(treeNodes);
|
|
177
184
|
return {
|
|
178
185
|
res,
|
|
179
186
|
data: treeNodes,
|
|
@@ -182,34 +189,43 @@ class AssetPropertyGridComponent {
|
|
|
182
189
|
size: paging?.totalElements
|
|
183
190
|
};
|
|
184
191
|
}
|
|
185
|
-
|
|
192
|
+
selectItem(identifiers) {
|
|
186
193
|
if (this.bottomDrawerRef) {
|
|
187
194
|
this.bottomDrawerRef.close();
|
|
188
195
|
}
|
|
189
196
|
this.addColumn(identifiers[0]);
|
|
190
197
|
}
|
|
191
|
-
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
const header = childSchema?.title || childKey || def.jsonSchema?.title;
|
|
197
|
-
this.onAddCustomColumn.emit({
|
|
198
|
-
name: camelCase(path),
|
|
199
|
-
header,
|
|
200
|
-
path,
|
|
201
|
-
type: 'property',
|
|
202
|
-
custom: true,
|
|
203
|
-
visible: true
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
catch (err) {
|
|
207
|
-
this.alertService.addServerFailure(err);
|
|
198
|
+
addColumn(path) {
|
|
199
|
+
const header = this.headersByPath.get(path);
|
|
200
|
+
if (!header) {
|
|
201
|
+
this.alertService.danger(gettext('Unable to add the column because the property definition could not be found.'));
|
|
202
|
+
return;
|
|
208
203
|
}
|
|
204
|
+
this.onAddCustomColumn.emit({
|
|
205
|
+
name: camelCase(path),
|
|
206
|
+
header,
|
|
207
|
+
path,
|
|
208
|
+
type: 'property',
|
|
209
|
+
custom: true,
|
|
210
|
+
visible: true
|
|
211
|
+
});
|
|
209
212
|
}
|
|
210
213
|
close() {
|
|
211
214
|
this.bottomDrawerRef?.close();
|
|
212
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Records the header (node title) for every node path in the given tree,
|
|
218
|
+
* recursing into children. Merges with previously loaded pages so selections
|
|
219
|
+
* stay resolvable after "Load more".
|
|
220
|
+
*/
|
|
221
|
+
cacheHeaders(nodes) {
|
|
222
|
+
for (const node of nodes) {
|
|
223
|
+
this.headersByPath.set(node.id, node.title);
|
|
224
|
+
if (node.children?.length) {
|
|
225
|
+
this.cacheHeaders(node.children);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
213
229
|
buildChildGridData(parentRow) {
|
|
214
230
|
const children = parentRow.children ?? [];
|
|
215
231
|
const currentPage = parentRow.pagination?.currentPage ?? 1;
|
|
@@ -282,4 +298,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
282
298
|
}] } });
|
|
283
299
|
|
|
284
300
|
export { AssetPropertyGridComponent };
|
|
285
|
-
//# sourceMappingURL=c8y-ngx-components-asset-property-grid.component-
|
|
301
|
+
//# sourceMappingURL=c8y-ngx-components-asset-property-grid.component-Ddva2QJW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-asset-property-grid.component-Ddva2QJW.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 /**\n * Maps a selectable node path to its column header, derived while building the\n * tree. Lets a selected column be resolved locally, without a redundant fetch\n * for a definition whose header the list response already provides.\n */\n private readonly headersByPath = new Map<string, string>();\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 this.cacheHeaders(treeNodes);\n\n return {\n res,\n data: treeNodes,\n paging,\n filteredSize: paging?.totalElements,\n size: paging?.totalElements\n };\n }\n\n selectItem(identifiers: string[]): void {\n if (this.bottomDrawerRef) {\n this.bottomDrawerRef.close();\n }\n this.addColumn(identifiers[0]);\n }\n\n addColumn(path: string): void {\n const header = this.headersByPath.get(path);\n\n if (!header) {\n this.alertService.danger(\n gettext('Unable to add the column because the property definition could not be found.')\n );\n return;\n }\n\n this.onAddCustomColumn.emit({\n name: camelCase(path),\n header,\n path,\n type: 'property',\n custom: true,\n visible: true\n });\n }\n\n close(): void {\n this.bottomDrawerRef?.close();\n }\n\n /**\n * Records the header (node title) for every node path in the given tree,\n * recursing into children. Merges with previously loaded pages so selections\n * stay resolvable after \"Load more\".\n */\n private cacheHeaders(nodes: TreeNode[]): void {\n for (const node of nodes) {\n this.headersByPath.set(node.id, node.title);\n if (node.children?.length) {\n this.cacheHeaders(node.children);\n }\n }\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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"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle, DragDropModule } from '@angular/cdk/drag-drop';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { Injectable,
|
|
4
|
-
import * as
|
|
3
|
+
import { Injectable, inject, ChangeDetectorRef, Input, ChangeDetectionStrategy, Component, DOCUMENT, Inject, NgModule } from '@angular/core';
|
|
4
|
+
import * as i1$1 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
8
|
import * as i1 from '@c8y/ngx-components';
|
|
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
|
-
import {
|
|
9
|
+
import { AlertService, IconDirective, C8yTranslateDirective, ListGroupComponent, ListItemComponent, ListItemDragHandleComponent, ListItemIconComponent, ChangeIconComponent, InputGroupEditableComponent, PopoverConfirmComponent, EmptyStateComponent, C8yTranslatePipe, CoreModule, CommonModule, ListGroupModule, FormsModule as FormsModule$1, ModalModule, hookDrawer } from '@c8y/ngx-components';
|
|
10
|
+
import { AsyncPipe } from '@angular/common';
|
|
11
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
|
-
import * as
|
|
14
|
+
import * as i3$1 from 'ngx-bootstrap/modal';
|
|
15
|
+
import { BsModalRef } from 'ngx-bootstrap/modal';
|
|
15
16
|
import * as i3 from '@ngx-translate/core';
|
|
16
17
|
import { firstValueFrom, map } from 'rxjs';
|
|
17
|
-
import
|
|
18
|
+
import { IconSelectorService } from '@c8y/ngx-components/icon-selector';
|
|
18
19
|
|
|
19
20
|
class BookmarkService {
|
|
20
21
|
static { this.DEFAULT_ICON = 'bookmark'; }
|
|
@@ -107,11 +108,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
107
108
|
}], ctorParameters: () => [{ type: i1.NavigatorService }, { type: i1.OptionsService }, { type: i2.Router }, { type: i3.TranslateService }, { type: i1.UserPreferencesService }] });
|
|
108
109
|
|
|
109
110
|
class EditBookmarksComponent {
|
|
110
|
-
constructor(
|
|
111
|
-
this
|
|
112
|
-
|
|
113
|
-
this.
|
|
114
|
-
this.
|
|
111
|
+
constructor() {
|
|
112
|
+
// @Input is intentional: this component is opened via BsModalService with initialState,
|
|
113
|
+
// which sets the property directly on the instance and is incompatible with signal inputs.
|
|
114
|
+
this.bookmarks = [];
|
|
115
|
+
this.bookmarksToUpdate = [];
|
|
115
116
|
this.confirmRemoveColumnButtons = [
|
|
116
117
|
{
|
|
117
118
|
label: gettext('Cancel'),
|
|
@@ -126,6 +127,11 @@ class EditBookmarksComponent {
|
|
|
126
127
|
this.result = new Promise(resolve => {
|
|
127
128
|
this._close = resolve;
|
|
128
129
|
});
|
|
130
|
+
this.bsModalRef = inject(BsModalRef);
|
|
131
|
+
this.alertService = inject(AlertService);
|
|
132
|
+
this.bookmarkService = inject(BookmarkService);
|
|
133
|
+
this.iconSelector = inject(IconSelectorService);
|
|
134
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
129
135
|
}
|
|
130
136
|
ngOnInit() {
|
|
131
137
|
this.bookmarksToUpdate = cloneDeep(this.bookmarks);
|
|
@@ -166,6 +172,10 @@ class EditBookmarksComponent {
|
|
|
166
172
|
}
|
|
167
173
|
}
|
|
168
174
|
}
|
|
175
|
+
onLabelSaved(bookmark, label) {
|
|
176
|
+
bookmark.label = label;
|
|
177
|
+
this.updateBookmark(bookmark, 'label');
|
|
178
|
+
}
|
|
169
179
|
updateBookmarkProperty(updatedBookmark, type) {
|
|
170
180
|
const update = {
|
|
171
181
|
icon: (bookmark) => ({ ...bookmark, icon: updatedBookmark.icon }),
|
|
@@ -179,6 +189,7 @@ class EditBookmarksComponent {
|
|
|
179
189
|
const newIcon = await this.iconSelector.selectIcon();
|
|
180
190
|
updatedBookmark.icon = newIcon;
|
|
181
191
|
await this.updateBookmark(updatedBookmark, 'icon');
|
|
192
|
+
this.cdr.markForCheck();
|
|
182
193
|
}
|
|
183
194
|
catch {
|
|
184
195
|
// nothing to do
|
|
@@ -197,6 +208,7 @@ class EditBookmarksComponent {
|
|
|
197
208
|
return;
|
|
198
209
|
}
|
|
199
210
|
this.bookmarks.splice(bookmarkIndex, 1);
|
|
211
|
+
this.cdr.markForCheck();
|
|
200
212
|
this.alertService.success(gettext('Bookmark removed.'));
|
|
201
213
|
}
|
|
202
214
|
catch (err) {
|
|
@@ -208,18 +220,18 @@ class EditBookmarksComponent {
|
|
|
208
220
|
}
|
|
209
221
|
}
|
|
210
222
|
}
|
|
211
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: EditBookmarksComponent, deps: [
|
|
212
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
223
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: EditBookmarksComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
224
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", 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 @if (bookmarks.length) {\n <c8y-list-group\n class=\"cdk-droplist no-border-last\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"bookmarks.length < 2\"\n >\n @for (bookmark of bookmarks; track bookmark.id) {\n <c8y-li cdkDrag>\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 @if (bookmark.icon) {\n <c8y-li-icon\n class=\"a-s-stretch\"\n [style.padding-left]=\"bookmarks.length < 2 ? '16px !important' : null\"\n >\n <c8y-change-icon\n [currentIcon]=\"bookmark.icon\"\n (onButtonClick)=\"changeBookmarkIcon(bookmark)\"\n ></c8y-change-icon>\n </c8y-li-icon>\n }\n\n <div class=\"d-flex gap-8 a-i-center\">\n <div class=\"flex-grow\">\n <c8y-input-group-editable\n [ariaLabel]=\"'Bookmark label' | translate\"\n formGroupClass=\"m-b-0\"\n [placeholder]=\"'e.g. My bookmark' | translate\"\n [maxLength]=\"50\"\n [ngModel]=\"bookmark.label\"\n (ngModelChange)=\"onLabelSaved(bookmark, $event)\"\n ></c8y-input-group-editable>\n </div>\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 }\n </c8y-list-group>\n } @else {\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 "Add current page" button.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\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", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { 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: "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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputGroupEditableComponent, selector: "c8y-input-group-editable", inputs: ["ariaLabel", "name", "size", "placeholder", "multiline", "maxHeight", "maxLength", "noSaveButton", "formGroupClass", "validators", "asyncValidators", "autocomplete"], outputs: ["save", "cancel"] }, { 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" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
213
225
|
}
|
|
214
226
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: EditBookmarksComponent, decorators: [{
|
|
215
227
|
type: Component,
|
|
216
|
-
args: [{ selector: 'c8y-edit-bookmarks',
|
|
228
|
+
args: [{ selector: 'c8y-edit-bookmarks', changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
229
|
+
'(document:keydown)': 'handleKeyboardEvent($event)'
|
|
230
|
+
}, imports: [
|
|
217
231
|
IconDirective,
|
|
218
232
|
C8yTranslateDirective,
|
|
219
|
-
NgIf,
|
|
220
233
|
ListGroupComponent,
|
|
221
234
|
CdkDropList,
|
|
222
|
-
NgFor,
|
|
223
235
|
ListItemComponent,
|
|
224
236
|
CdkDrag,
|
|
225
237
|
ListItemDragHandleComponent,
|
|
@@ -227,15 +239,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
227
239
|
ListItemIconComponent,
|
|
228
240
|
ChangeIconComponent,
|
|
229
241
|
FormsModule,
|
|
242
|
+
InputGroupEditableComponent,
|
|
230
243
|
PopoverConfirmComponent,
|
|
231
244
|
EmptyStateComponent,
|
|
232
245
|
C8yTranslatePipe
|
|
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
|
|
234
|
-
}],
|
|
246
|
+
], 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 @if (bookmarks.length) {\n <c8y-list-group\n class=\"cdk-droplist no-border-last\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"bookmarks.length < 2\"\n >\n @for (bookmark of bookmarks; track bookmark.id) {\n <c8y-li cdkDrag>\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 @if (bookmark.icon) {\n <c8y-li-icon\n class=\"a-s-stretch\"\n [style.padding-left]=\"bookmarks.length < 2 ? '16px !important' : null\"\n >\n <c8y-change-icon\n [currentIcon]=\"bookmark.icon\"\n (onButtonClick)=\"changeBookmarkIcon(bookmark)\"\n ></c8y-change-icon>\n </c8y-li-icon>\n }\n\n <div class=\"d-flex gap-8 a-i-center\">\n <div class=\"flex-grow\">\n <c8y-input-group-editable\n [ariaLabel]=\"'Bookmark label' | translate\"\n formGroupClass=\"m-b-0\"\n [placeholder]=\"'e.g. My bookmark' | translate\"\n [maxLength]=\"50\"\n [ngModel]=\"bookmark.label\"\n (ngModelChange)=\"onLabelSaved(bookmark, $event)\"\n ></c8y-input-group-editable>\n </div>\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 }\n </c8y-list-group>\n } @else {\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 "Add current page" button.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\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" }]
|
|
247
|
+
}], propDecorators: { bookmarks: [{
|
|
235
248
|
type: Input
|
|
236
|
-
}], handleKeyboardEvent: [{
|
|
237
|
-
type: HostListener,
|
|
238
|
-
args: ['document:keydown', ['$event']]
|
|
239
249
|
}] } });
|
|
240
250
|
|
|
241
251
|
class BookmarksComponent {
|
|
@@ -329,7 +339,7 @@ class BookmarksComponent {
|
|
|
329
339
|
return url;
|
|
330
340
|
}
|
|
331
341
|
}
|
|
332
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BookmarksComponent, deps: [{ token: DOCUMENT }, { token: i1.AlertService }, { token: BookmarkService }, { token:
|
|
342
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BookmarksComponent, deps: [{ token: DOCUMENT }, { token: i1.AlertService }, { token: BookmarkService }, { token: i3$1.BsModalService }, { token: i2.Router }, { token: i1.HeaderService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
333
343
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", 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" }] }); }
|
|
334
344
|
}
|
|
335
345
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BookmarksComponent, decorators: [{
|
|
@@ -338,7 +348,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
338
348
|
}], ctorParameters: () => [{ type: DOCUMENT, decorators: [{
|
|
339
349
|
type: Inject,
|
|
340
350
|
args: [DOCUMENT]
|
|
341
|
-
}] }, { type: i1.AlertService }, { type: BookmarkService }, { type:
|
|
351
|
+
}] }, { type: i1.AlertService }, { type: BookmarkService }, { type: i3$1.BsModalService }, { type: i2.Router }, { type: i1.HeaderService }] });
|
|
342
352
|
|
|
343
353
|
class BookmarksModule {
|
|
344
354
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", 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 { 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 "Add current page" 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 {\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(`${this.document.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(`${this.document.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(this.document.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":";;;;;;;;;;;;;;;;;;MAea,eAAe,CAAA;aACF,IAAA,CAAA,YAAY,GAAG,UAAH,CAAc;IAMlD,WAAA,CACU,gBAAkC,EAClC,OAAuB,EACvB,MAAc,EACd,gBAAkC,EAClC,sBAA8C,EAAA;QAJ9C,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,sBAAsB,GAAtB,sBAAsB;QATvB,IAAA,CAAA,8BAA8B,GAAG,WAAW;IAUlD;IAEH,MAAM,wBAAwB,CAAC,YAAwB,EAAA;AACrD,QAAA,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE;QACnD,MAAM,eAAe,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,iBAAiB,CAAC;QAC/D,MAAM,gBAAgB,GAAG,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,MAAM,CAC3D,CAAC,QAAkB,KAAK,CAAC,QAAQ,CAAC,YAAY,CAC/C;AAED,QAAA,IAAI,CAAC,2BAA2B,CAAC,gBAAgB,CAAC;IACpD;AAEA,IAAA,MAAM,iBAAiB,GAAA;AACrB,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE;AAC9C,QAAA,OAAO,UAAU,EAAE,IAAI,IAAI,eAAe,CAAC,YAAY;IACzD;AAEA,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,MAAM,SAAS,GAAG,qCAAqC;QACvD,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC9C,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE,GAAG,EAAE;QAE5B,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI;QACb;QACA,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,GAAG,KAAK;QAE9B,OAAO,MAAM,GAAG,IAAI,GAAG,CAAA,IAAA,EAAO,IAAI,CAAA,CAAE;IACtC;AAEA,IAAA,MAAM,YAAY,GAAA;AAChB,QAAA,OAAO,MAAM,cAAc,CACzB,IAAI,CAAC;AACF,aAAA,GAAG,CAAC,IAAI,CAAC,8BAA8B;AACvC,aAAA,IAAI,CAAC,GAAG,CAAC,CAAC,SAAqB,KAAK,SAAS,IAAI,EAAE,CAAC,CAAC,CACzD;IACH;IAEA,gBAAgB,GAAA;AACd,QAAA,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC;AAChC,QAAA,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC;AAE7B,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/E;AAEA,IAAA,2BAA2B,CAAC,KAAa,EAAE,GAAW,EAAE,IAAY,EAAA;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,YAAY;QAC5D,OAAO;AACL,YAAA,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE;AAC3B,YAAA,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW;kBAC7B,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,CAAA,GAAA,CAAK,EAAE,EAAE;kBACrC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACtD,GAAG;YACH;SACD;IACH;AAEQ,IAAA,MAAM,cAAc,GAAA;QAC1B,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAChE,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;IACrC;AAEQ,IAAA,gBAAgB,CAAC,KAAsB,EAAA;AAC7C,QAAA,IAAI,MAAiC;AAErC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;gBACxC,MAAM,GAAG,IAAI;YACf;AACA,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;gBACzB,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACvD,IAAI,UAAU,EAAE;oBACd,MAAM,GAAG,UAAU;gBACrB;YACF;QACF;AAEA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,YAAY,CAAC,IAAmB,EAAA;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;YACrC,KAAK,EAAE,IAAI,CAAC,eAAe,GAAG,OAAO,GAAG,QAAQ;AAChD,YAAA,WAAW,EAAE,SAAS;AACtB,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,YAAY,EAAE;AACf,SAAA,CAAC;IACJ;AAEQ,IAAA,2BAA2B,CAAC,SAAqB,EAAA;QACvD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE,SAAS,CAAC;AAC/E,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;IACnC;+GAzGW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA,CAAA;;4FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCuCrB,sBAAsB,CAAA;AAsBjC,IAAA,WAAA,CACU,UAAsB,EACtB,YAA0B,EAC1B,eAAgC,EAChC,YAAiC,EAAA;QAHjC,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,YAAY,GAAZ,YAAY;AAtBtB,QAAA,IAAA,CAAA,0BAA0B,GAA4B;AACpD,YAAA;AACE,gBAAA,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC;gBACxB,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK;AACpC,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC;AACxB,gBAAA,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI;AACnC;SACF;AAED,QAAA,IAAA,CAAA,MAAM,GAAwB,IAAI,OAAO,CAAC,OAAO,IAAG;AAClD,YAAA,IAAI,CAAC,MAAM,GAAG,OAAO;AACvB,QAAA,CAAC,CAAC;IASC;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;IACpD;AAGA,IAAA,mBAAmB,CAAC,KAAoB,EAAA;AACtC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,IAAI,CAAC,KAAK,EAAE;QACd;IACF;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;YACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC;QACpD;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEA,MAAM,IAAI,CAAC,KAA8B,EAAA;AACvC,QAAA,IAAI;AACF,YAAA,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AACxE,YAAA,eAAe,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;YAEhF,MAAM,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,IAAI,CAAC,iBAAiB,CAAC;YAC3E,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAChE;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;QACzE;IACF;AAEA,IAAA,MAAM,cAAc,CAClB,eAAyB,EACzB,IAA6D,EAAA;AAE7D,QAAA,IAAI;YACF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,IAAI,CAAC;YAC3E,MAAM,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAC3E,YAAA,IAAI,IAAI,KAAK,cAAc,EAAE;gBAC3B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACzD;QACF;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,IAAI,KAAK,cAAc,EAAE;gBAC3B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;YAC9D;QACF;IACF;IAEA,sBAAsB,CACpB,eAAyB,EACzB,IAA6D,EAAA;AAE7D,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,IAAI,EAAE,CAAC,QAAkB,MAAM,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;AAC3E,YAAA,KAAK,EAAE,CAAC,QAAkB,MAAM,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC;AAC9E,YAAA,YAAY,EAAE,CAAC,QAAkB,MAAM,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE;SAC3E,CAAC,IAAI,CAAC;AAEP,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,IACxC,QAAQ,CAAC,EAAE,KAAK,eAAe,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ,CACjE;IACH;IAEA,MAAM,kBAAkB,CAAC,eAAyB,EAAA;AAChD,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AACpD,YAAA,eAAe,CAAC,IAAI,GAAG,OAAO;YAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,MAAM,CAAC;QACpD;AAAE,QAAA,MAAM;;QAER;IACF;AAEA,IAAA,MAAM,cAAc,CAClB,SAAkC,EAClC,gBAA0B,EAAA;AAE1B,QAAA,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC,8BAA8B,CAAC;AAE3D,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC;YACpE,IAAI,CAAC,MAAM,EAAE;gBACX;YACF;YAEA,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,cAAc,CAAC;YAE3D,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAC5C,QAAQ,IAAI,QAAQ,CAAC,EAAE,KAAK,gBAAgB,CAAC,EAAE,CAChD;AAED,YAAA,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE;gBACxB;YACF;YAEA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACzD;QAAE,OAAO,GAAG,EAAE;AACZ;;AAEG;YACH,IAAI,GAAG,EAAE;gBACP,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YAClE;QACF;IACF;+GArIW,sBAAsB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,kBAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrDnC,szHA2HA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxFI,aAAa,2EACb,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,WAAW,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,KAAK,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,iBAAiB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,2BAA2B,EAAA,QAAA,EAAA,+CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,aAAa,+FACb,qBAAqB,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,yEAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,OAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,mBAAmB,+GACnB,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAGP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAtBlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,OAAA,EAErB;wBACP,aAAa;wBACb,qBAAqB;wBACrB,IAAI;wBACJ,kBAAkB;wBAClB,WAAW;wBACX,KAAK;wBACL,iBAAiB;wBACjB,OAAO;wBACP,2BAA2B;wBAC3B,aAAa;wBACb,qBAAqB;wBACrB,mBAAmB;wBACnB,WAAW;wBACX,uBAAuB;wBACvB,mBAAmB;wBACnB;AACD,qBAAA,EAAA,QAAA,EAAA,szHAAA,EAAA;;sBAGA;;sBAgCA,YAAY;uBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;;;MEpEjC,kBAAkB,CAAA;IAS7B,WAAA,CAC4B,QAAkB,EACpC,YAA0B,EAC1B,eAAgC,EAChC,cAA8B,EAC9B,MAAc,EACd,aAA4B,EAAA;QALV,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAC1B,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,aAAa,GAAb,aAAa;QAbvB,IAAA,CAAA,SAAS,GAAe,EAAE;AAC1B,QAAA,IAAA,CAAA,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;AAChD,QAAA,IAAA,CAAA,gBAAgB,GAAG,OAAO,CACxB,mJAAmJ,CACpJ;AACD,QAAA,IAAA,CAAA,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC;QAUzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB;IACxD;AAEA,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;IAC5D;AAEA,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE;QACxC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,EAAE;YACpF,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;YAClF;QACF;QACA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE;AAC3D,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,2BAA2B,CACjE,IAAI,CAAC,QAAQ,CAAC,KAAK,EACnB,UAAU,EACV,IAAI,CACL;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;QAC/B,MAAM,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC;QACnE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvD;AAEA,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,IAAI;AACF,YAAA,MAAM,YAAY,GAA8C;AAC9D,gBAAA,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS;aACpC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,sBAAsB,EAAE;AAChE,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,eAAe,EAAE,YAAY;AAC7B,gBAAA,cAAc,EAAE,aAAa;AAC7B,gBAAA,YAAY,EAAE,YAAY;AAC1B,gBAAA,mBAAmB,EAAE;aACtB,CAAC,CAAC,OAAiC;AACpC,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM;QACxC;AAAE,QAAA,MAAM;YACN;QACF;IACF;AAEA,IAAA,OAAO,CAAC,GAAW,EAAA;AACjB,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;AACvB,gBAAA,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG;AAC1E,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;YACjC;iBAAO;AACL,gBAAA,MAAM,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAA,EAAG,GAAG,EAAE,EAAE,OAAO,CAAC;YAChE;YACA;QACF;;AAGA,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;QAC9B,MAAM,YAAY,GAAG,CAAA,EAAG,SAAS,CAAC,QAAQ,CAAA,EAAG,SAAS,CAAC,IAAI,CAAA,CAAE;AAE7D,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;YAChC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG;AAC/D,YAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;QACjC;aAAO;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAA,EAAG,YAAY,EAAE,EAAE,OAAO,CAAC;QACzE;IACF;IAEQ,cAAc,GAAA;QACpB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ;AACjD,QAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAI,EAAE;IAC7B;AAEQ,IAAA,aAAa,CAAC,GAAW,EAAA;AAC/B,QAAA,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;IAC5B;AAEQ,IAAA,SAAS,CAAC,GAAW,EAAA;AAC3B,QAAA,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACxD;AAEQ,IAAA,aAAa,CAAC,GAAW,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,OAAO,GAAG;QACZ;AACA,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;YAC3B,OAAO,CAAA,EAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAA,CAAE;QAC3C;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,GAAG;QACZ;IACF;AAzGW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,kBAUnBC,QAAQ,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAVP,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClB/B,8wEA8EA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED9DY,aAAa,2EAAE,gBAAgB,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE3D,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,SAAS;+BACE,eAAe,EAAA,OAAA,EAEhB,CAAC,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,8wEAAA,EAAA;;0BAYpE,MAAM;2BAACH,QAAQ;;;MEYP,eAAe,CAAA;+GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,YAtBxB,UAAU;YACV,YAAY;YACZ,eAAe;YACf,cAAc;YACd,WAAW;YACXI,aAAc;AACd,YAAA,WAAW,sBAEX,mBAAmB;YACnB,kBAAkB;AAClB,YAAA,sBAAsB,aAEd,kBAAkB,CAAA,EAAA,CAAA,CAAA;AAUjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EAAA,SAAA,EATf;AACT,YAAA,UAAU,CAAC;AACT,gBAAA,SAAS,EAAE,kBAAkB;AAC7B,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,EAAE,EAAE;aACL;AACF,SAAA,EAAA,OAAA,EAAA,CApBC,UAAU;YACV,YAAY;YACZ,eAAe;YACf,cAAc;YACd,WAAW;YACXA,aAAc;YACd,WAAW;YACX,aAAa,CAAC,OAAO,EAAE;YACvB,mBAAmB;YAEnB,sBAAsB,CAAA,EAAA,CAAA,CAAA;;4FAYb,eAAe,EAAA,UAAA,EAAA,CAAA;kBAxB3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,UAAU;wBACV,YAAY;wBACZ,eAAe;wBACf,cAAc;wBACd,WAAW;wBACXA,aAAc;wBACd,WAAW;wBACX,aAAa,CAAC,OAAO,EAAE;wBACvB,mBAAmB;wBACnB,kBAAkB;wBAClB;AACD,qBAAA;oBACD,OAAO,EAAE,CAAC,kBAAkB,CAAC;AAC7B,oBAAA,SAAS,EAAE;AACT,wBAAA,UAAU,CAAC;AACT,4BAAA,SAAS,EAAE,kBAAkB;AAC7B,4BAAA,QAAQ,EAAE,OAAO;AACjB,4BAAA,QAAQ,EAAE,EAAE;AACZ,4BAAA,EAAE,EAAE;yBACL;AACF;AACF,iBAAA;;;ACvCD;;AAEG;;;;"}
|
|
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 {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnInit,\n inject\n} from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n InputGroupEditableComponent,\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 { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'c8y-edit-bookmarks',\n templateUrl: './edit-bookmarks.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '(document:keydown)': 'handleKeyboardEvent($event)'\n },\n imports: [\n IconDirective,\n C8yTranslateDirective,\n ListGroupComponent,\n CdkDropList,\n ListItemComponent,\n CdkDrag,\n ListItemDragHandleComponent,\n CdkDragHandle,\n ListItemIconComponent,\n ChangeIconComponent,\n FormsModule,\n InputGroupEditableComponent,\n PopoverConfirmComponent,\n EmptyStateComponent,\n C8yTranslatePipe\n ]\n})\nexport class EditBookmarksComponent implements OnInit {\n // @Input is intentional: this component is opened via BsModalService with initialState,\n // which sets the property directly on the instance and is incompatible with signal inputs.\n @Input()\n 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 private readonly bsModalRef = inject(BsModalRef);\n private readonly alertService = inject(AlertService);\n private readonly bookmarkService = inject(BookmarkService);\n private readonly iconSelector = inject(IconSelectorService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n ngOnInit(): void {\n this.bookmarksToUpdate = cloneDeep(this.bookmarks);\n }\n\n handleKeyboardEvent(event: KeyboardEvent): void {\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 onLabelSaved(bookmark: Bookmark, label: string): void {\n bookmark.label = label;\n this.updateBookmark(bookmark, 'label');\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 this.cdr.markForCheck();\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.cdr.markForCheck();\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 @if (bookmarks.length) {\n <c8y-list-group\n class=\"cdk-droplist no-border-last\"\n cdkDropList\n (cdkDropListDropped)=\"drop($event)\"\n [cdkDropListDisabled]=\"bookmarks.length < 2\"\n >\n @for (bookmark of bookmarks; track bookmark.id) {\n <c8y-li cdkDrag>\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 @if (bookmark.icon) {\n <c8y-li-icon\n class=\"a-s-stretch\"\n [style.padding-left]=\"bookmarks.length < 2 ? '16px !important' : null\"\n >\n <c8y-change-icon\n [currentIcon]=\"bookmark.icon\"\n (onButtonClick)=\"changeBookmarkIcon(bookmark)\"\n ></c8y-change-icon>\n </c8y-li-icon>\n }\n\n <div class=\"d-flex gap-8 a-i-center\">\n <div class=\"flex-grow\">\n <c8y-input-group-editable\n [ariaLabel]=\"'Bookmark label' | translate\"\n formGroupClass=\"m-b-0\"\n [placeholder]=\"'e.g. My bookmark' | translate\"\n [maxLength]=\"50\"\n [ngModel]=\"bookmark.label\"\n (ngModelChange)=\"onLabelSaved(bookmark, $event)\"\n ></c8y-input-group-editable>\n </div>\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 }\n </c8y-list-group>\n } @else {\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 "Add current page" button.'\n | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\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","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 {\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(`${this.document.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(`${this.document.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(this.document.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","Document","i2.BookmarkService","i3","i4","c8yFormsModule"],"mappings":"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"}
|