@c8y/ngx-components 1021.80.1 → 1021.81.0
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/core/data-grid/column/tree-node-column/tree-node.cell-renderer.component.d.ts +23 -0
- package/core/data-grid/column/tree-node-column/tree-node.cell-renderer.component.d.ts.map +1 -0
- package/core/data-grid/column/tree-node-column/tree-node.data-grid-column.d.ts +23 -0
- package/core/data-grid/column/tree-node-column/tree-node.data-grid-column.d.ts.map +1 -0
- package/core/data-grid/column/tree-node-column/tree-node.header-cell-renderer.component.d.ts +6 -0
- package/core/data-grid/column/tree-node-column/tree-node.header-cell-renderer.component.d.ts.map +1 -0
- package/core/data-grid/data-grid.component.d.ts +29 -1
- package/core/data-grid/data-grid.component.d.ts.map +1 -1
- package/core/data-grid/data-grid.model.d.ts +13 -1
- package/core/data-grid/data-grid.model.d.ts.map +1 -1
- package/core/data-grid/grid-data-source.d.ts +11 -2
- package/core/data-grid/grid-data-source.d.ts.map +1 -1
- package/core/data-grid/index.d.ts +4 -1
- package/core/data-grid/index.d.ts.map +1 -1
- package/esm2022/branding/shared/lazy/branding/branding.component.mjs +2 -2
- package/esm2022/context-dashboard/dashboard-manager/type-dashboard-target-assets-grid/type-dashboard-target-assets-grid.component.mjs +1 -1
- package/esm2022/context-dashboard/dashboard-manager/type-dashboards-list/type-dashboards-list.component.mjs +1 -1
- package/esm2022/core/data-grid/column/tree-node-column/tree-node.cell-renderer.component.mjs +87 -0
- package/esm2022/core/data-grid/column/tree-node-column/tree-node.data-grid-column.mjs +15 -0
- package/esm2022/core/data-grid/column/tree-node-column/tree-node.header-cell-renderer.component.mjs +15 -0
- package/esm2022/core/data-grid/configure-custom-column/asset-property-grid.component.mjs +1 -1
- package/esm2022/core/data-grid/data-grid.component.mjs +68 -11
- package/esm2022/core/data-grid/data-grid.model.mjs +1 -1
- package/esm2022/core/data-grid/grid-data-source.mjs +92 -22
- package/esm2022/core/data-grid/index.mjs +5 -2
- package/esm2022/device-grid/device-grid.component.mjs +1 -1
- package/esm2022/device-profile/device-profile-list.component.mjs +1 -1
- package/esm2022/device-provisioned-certificates/device-tab-provisioned-certificates.component.mjs +1 -1
- package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +1 -1
- package/esm2022/files-repository/files-repository.component.mjs +1 -1
- package/esm2022/messaging-management/messaging/topic/topic-list-view.component.mjs +2 -2
- package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.mjs +2 -2
- package/esm2022/operations/bulk-single-operations-list/single-operations-list.component.mjs +2 -2
- package/esm2022/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.mjs +2 -2
- package/esm2022/repository/configuration/list/configuration-list.component.mjs +1 -1
- package/esm2022/repository/firmware/list/firmware-list.component.mjs +1 -1
- package/esm2022/repository/software/list/software-list.component.mjs +1 -1
- package/esm2022/search/search-grid.component.mjs +1 -1
- package/esm2022/services/services-device-tab/services-device-tab.component.mjs +1 -1
- package/esm2022/sub-assets/sub-assets-grid.component.mjs +1 -1
- package/esm2022/tenants/tenant-list/tenant-list.component.mjs +1 -1
- package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +2 -2
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-CmhkghTo.mjs → c8y-ngx-components-asset-property-grid.component-xQgHuomT.mjs} +3 -3
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-CmhkghTo.mjs.map → c8y-ngx-components-asset-property-grid.component-xQgHuomT.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-c8y-ngx-components-D-YOjLHK.mjs → c8y-ngx-components-c8y-ngx-components-D2rmddmn.mjs} +455 -228
- package/fesm2022/c8y-ngx-components-c8y-ngx-components-D2rmddmn.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +2 -2
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +1 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-files-repository.mjs +1 -1
- package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs +2 -2
- package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-search.mjs +1 -1
- package/fesm2022/c8y-ngx-components-search.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services.mjs +1 -1
- package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sub-assets.mjs +1 -1
- package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +1 -1
- package/locales/locales.pot +6 -0
- package/package.json +1 -1
- package/fesm2022/c8y-ngx-components-c8y-ngx-components-D-YOjLHK.mjs.map +0 -1
|
@@ -406,7 +406,7 @@ class FilesRepositoryComponent {
|
|
|
406
406
|
await this.modalService.confirm(title, body, status, labels);
|
|
407
407
|
}
|
|
408
408
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilesRepositoryComponent, deps: [{ token: FilesRepositoryService }, { token: i1.InventoryBinaryService }, { token: i3.ModalService }, { token: i3.AlertService }, { token: i4.BsModalService }, { token: i3.FilesService }, { token: i5.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
409
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FilesRepositoryComponent, selector: "c8y-files-repository", viewQueries: [{ propertyName: "dataGrid", first: true, predicate: DataGridComponent, descendants: true, static: true }], ngImport: i0, template: "<c8y-title>\n {{ title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n [label]=\"managementTitle | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"title | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Upload files' | translate }}\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_CREATE']; allowAny: true\"\n (click)=\"openFileUploadComponent()\"\n data-cy=\"c8y-files-repository--open-file-upload-component\"\n >\n <i c8yIcon=\"upload\"></i>\n {{ 'Upload files' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/standard-tenant/managing-data/#file-repository\"></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [displayOptions]=\"displayOptions\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [infiniteScroll]=\"infiniteScroll\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [actionControls]=\"actionControls\"\n [selectable]=\"selectable\"\n [showSearch]=\"true\"\n [refresh]=\"refresh\"\n [bulkActionControls]=\"bulkActionControls\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-archive'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n >\n <p *ngIf=\"stats?.size === 0\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n (click)=\"openFileUploadComponent()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Upload file' | translate }}\n </button>\n </p>\n </c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n <div class=\"d-flex j-c-between a-i-center\">\n {{ context.value }}\n <c8y-file-preview\n class=\"m-l-auto\"\n [mo]=\"context.item\"\n >\n <button\n class=\"btn btn-emphasis btn-icon\"\n [title]=\"'Preview file' | translate\"\n type=\"button\"\n customButton\n >\n <i c8yIcon=\"search\"></i>\n </button>\n </c8y-file-preview>\n </div>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"length\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }} B\">\n {{ context.value | bytes }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"lastUpdated\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | c8yDate }}\">\n {{ context.value | c8yDate }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "component", type: i3.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i3.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i3.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "directive", type: i3.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i3.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i3.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "hideReload"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "component", type: i3.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: i3.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i7.FilePreviewComponent, selector: "c8y-file-preview", inputs: ["mo"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i3.BytesPipe, name: "bytes" }] }); }
|
|
409
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FilesRepositoryComponent, selector: "c8y-files-repository", viewQueries: [{ propertyName: "dataGrid", first: true, predicate: DataGridComponent, descendants: true, static: true }], ngImport: i0, template: "<c8y-title>\n {{ title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n [label]=\"managementTitle | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"title | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Upload files' | translate }}\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_CREATE']; allowAny: true\"\n (click)=\"openFileUploadComponent()\"\n data-cy=\"c8y-files-repository--open-file-upload-component\"\n >\n <i c8yIcon=\"upload\"></i>\n {{ 'Upload files' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/standard-tenant/managing-data/#file-repository\"></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [displayOptions]=\"displayOptions\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [infiniteScroll]=\"infiniteScroll\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [actionControls]=\"actionControls\"\n [selectable]=\"selectable\"\n [showSearch]=\"true\"\n [refresh]=\"refresh\"\n [bulkActionControls]=\"bulkActionControls\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-archive'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n >\n <p *ngIf=\"stats?.size === 0\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n (click)=\"openFileUploadComponent()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Upload file' | translate }}\n </button>\n </p>\n </c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n <div class=\"d-flex j-c-between a-i-center\">\n {{ context.value }}\n <c8y-file-preview\n class=\"m-l-auto\"\n [mo]=\"context.item\"\n >\n <button\n class=\"btn btn-emphasis btn-icon\"\n [title]=\"'Preview file' | translate\"\n type=\"button\"\n customButton\n >\n <i c8yIcon=\"search\"></i>\n </button>\n </c8y-file-preview>\n </div>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"length\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }} B\">\n {{ context.value | bytes }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"lastUpdated\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | c8yDate }}\">\n {{ context.value | c8yDate }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "component", type: i3.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i3.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i3.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "directive", type: i3.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i3.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i3.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "component", type: i3.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: i3.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i7.FilePreviewComponent, selector: "c8y-file-preview", inputs: ["mo"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i3.BytesPipe, name: "bytes" }] }); }
|
|
410
410
|
}
|
|
411
411
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilesRepositoryComponent, decorators: [{
|
|
412
412
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-files-repository.mjs","sources":["../../files-repository/files-repository.guard.ts","../../files-repository/files-repository-navigation.factory.ts","../../files-repository/files-repository-product-experience.constants.ts","../../files-repository/files-repository-upload.component.ts","../../files-repository/files-repository-upload.component.html","../../files-repository/files-repository.service.ts","../../files-repository/files-repository.component.ts","../../files-repository/files-repository.component.html","../../files-repository/files-repository.module.ts","../../files-repository/c8y-ngx-components-files-repository.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesRepositoryGuard {\n constructor(private permissions: Permissions) {}\n\n /**\n * Checks if files repository should be active,\n * i.e. whether the current tenant can read or admin files in repository.\n *\n * @returns True, if the feature should be active.\n */\n canActivate(): boolean {\n return (\n this.permissions.hasRole(Permissions.ROLE_INVENTORY_READ) ||\n this.permissions.hasAllRoles([\n Permissions.ROLE_MANAGED_OBJECT_READ,\n Permissions.ROLE_BINARY_READ\n ])\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\nimport { FilesRepositoryGuard } from './files-repository.guard';\n\n@Injectable({ providedIn: 'root' })\nexport class FilesRepositoryNavigationFactory implements NavigatorNodeFactory {\n private navs: NavigatorNode[] = [];\n\n constructor(private filesRepositoryGuard: FilesRepositoryGuard) {}\n\n async get(): Promise<NavigatorNode[]> {\n if (this.filesRepositoryGuard.canActivate()) {\n if (!this.navs.length) {\n this.navs.push(\n new NavigatorNode({\n parent: gettext('Management'),\n label: gettext('Files repository'),\n icon: 'c8y-archive',\n path: 'files',\n routerLinkExact: false,\n priority: 1000\n })\n );\n }\n }\n return this.navs;\n }\n}\n","export const PRODUCT_EXPERIENCE_FILE_REPOSITORY = {\n EVENTS: {\n FILE_REPOSITORY_UPLOAD: 'filesRepositoryUpload'\n },\n COMPONENTS: {\n FILE_REPOSITORY_UPLOAD_COMPONENT: 'files-repository-upload'\n },\n RESULTS: {\n UPLOAD_ITEM_SUCCESS: 'fileUploadSuccess',\n UPLOAD_ITEM_FAILED: 'fileUploadFailed'\n }\n} as const;\n","import { Component, Output } from '@angular/core';\nimport { EventEmitter } from '@angular/core';\nimport {\n AlertService,\n GainsightService,\n FilesService,\n gettext,\n IFetchWithProgress\n} from '@c8y/ngx-components';\nimport { PRODUCT_EXPERIENCE_FILE_REPOSITORY } from './files-repository-product-experience.constants';\nimport { Observable, Subscription, combineLatest } from 'rxjs';\n\n@Component({\n selector: 'c8y-files-repository-upload',\n templateUrl: './files-repository-upload.component.html'\n})\nexport class FilesRepositoryUploadComponent {\n /** Emits an event when modal is closed. `uploaded` indicates if any files were uploaded. */\n @Output() onClose: EventEmitter<{ uploaded: boolean }> = new EventEmitter();\n isLoading = false;\n dropFilesHereMessage: string = gettext('Drop files here');\n filesToUpload: File[];\n uploadProgress: IFetchWithProgress[];\n uploadProgress$: Observable<IFetchWithProgress[]>;\n uploadSubscription: Subscription;\n\n constructor(\n private alertService: AlertService,\n private gainsightService: GainsightService,\n private filesService: FilesService\n ) {}\n\n async upload(): Promise<void> {\n this.isLoading = true;\n this.uploadProgress$ = combineLatest(\n this.filesToUpload.map(file => this.filesService.uploadFileWithProgress$(file))\n );\n\n this.uploadSubscription = this.uploadProgress$.subscribe(\n uploadProgress => {\n this.uploadProgress = uploadProgress;\n },\n e => {\n if (e) {\n this.alertService.addServerFailure(e);\n this.gainsightService.triggerEvent(\n PRODUCT_EXPERIENCE_FILE_REPOSITORY.EVENTS.FILE_REPOSITORY_UPLOAD,\n {\n component:\n PRODUCT_EXPERIENCE_FILE_REPOSITORY.COMPONENTS.FILE_REPOSITORY_UPLOAD_COMPONENT,\n action: PRODUCT_EXPERIENCE_FILE_REPOSITORY.RESULTS.UPLOAD_ITEM_FAILED\n }\n );\n }\n this.isLoading = false;\n },\n () => {\n this.alertService.success(gettext('File(s) uploaded.'));\n this.onClose.emit({ uploaded: true });\n this.gainsightService.triggerEvent(\n PRODUCT_EXPERIENCE_FILE_REPOSITORY.EVENTS.FILE_REPOSITORY_UPLOAD,\n {\n component:\n PRODUCT_EXPERIENCE_FILE_REPOSITORY.COMPONENTS.FILE_REPOSITORY_UPLOAD_COMPONENT,\n action: PRODUCT_EXPERIENCE_FILE_REPOSITORY.RESULTS.UPLOAD_ITEM_SUCCESS\n }\n );\n }\n );\n }\n\n onFileDroppedEvent(event: File[]): void {\n if (event && event.length > 0) {\n this.filesToUpload = event;\n }\n }\n}\n","<div class=\"c8y-viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"upload\"></i>\n <h4\n id=\"modal-title\"\n translate\n >\n Upload files\n </h4>\n </div>\n <div class=\"modal-inner-scroll\">\n <div\n class=\"modal-body\"\n id=\"modal-body\"\n >\n <c8y-file-picker-form-control\n #filePicker\n [uploadInProgress]=\"isLoading\"\n (dropped)=\"onFileDroppedEvent($event)\"\n [uploadProgress]=\"uploadProgress\"\n ></c8y-file-picker-form-control>\n </div>\n </div>\n <div class=\"card-footer separator d-flex j-c-center\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onClose.emit({ uploaded: false })\"\n [disabled]=\"isLoading\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n title=\"{{ 'Upload' | translate }}\"\n type=\"button\"\n (click)=\"upload()\"\n [disabled]=\"!filePicker.valid || isLoading\"\n translate\n data-cy=\"c8y-files-repository-upload--upload\"\n >\n Upload\n </button>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { QueriesUtil } from '@c8y/client';\nimport { InventoryService } from '@c8y/client';\nimport { gettext, Pagination, SortOrder, Column, Row } from '@c8y/ngx-components';\nimport { transform, has } from 'lodash-es';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesRepositoryService {\n queriesUtil: QueriesUtil;\n baseQuery = { __has: 'c8y_IsBinary' };\n constructor(private inventoryService: InventoryService) {\n this.queriesUtil = new QueriesUtil();\n }\n\n getPagination(): Pagination {\n return {\n pageSize: 10,\n currentPage: 1\n };\n }\n\n hasApplicationStorageFragment(file: Row): boolean {\n return has(file, 'c8y_applications_storage');\n }\n\n getColumns(): Column[] {\n return [\n {\n name: 'name',\n header: gettext('Name'),\n path: 'name',\n filterable: true,\n sortable: true,\n sortOrder: 'asc' as SortOrder\n },\n {\n name: 'type',\n header: gettext('Type'),\n path: 'type',\n filterable: true,\n sortable: true\n },\n {\n name: 'length',\n header: gettext('Size'),\n path: 'length',\n filterable: false,\n sortable: true\n },\n {\n name: 'owner',\n header: gettext('Owner'),\n path: 'owner',\n filterable: true,\n sortable: true\n },\n {\n name: 'lastUpdated',\n header: gettext('Last update'),\n path: 'lastUpdated',\n filterable: false,\n sortable: true\n }\n ];\n }\n\n /** Returns array with items id where item has not c8y_applications_storage fragment. */\n getDeletableItemsIds(selectedItemsIds: string[], dataFromDataGrid: Array<any>): string[] {\n const selectedItemsWithoutApplications = [];\n dataFromDataGrid.forEach(item => {\n selectedItemsIds.forEach(selectedItemId => {\n if (selectedItemId === item.id && !this.hasApplicationStorageFragment(item)) {\n selectedItemsWithoutApplications.push(selectedItemId);\n }\n });\n });\n\n return selectedItemsWithoutApplications;\n }\n\n /** Returns the total number of items (with no filters based on columns setup). */\n async getTotal(): Promise<number> {\n const filters = {\n query: this.queriesUtil.buildQuery(this.baseQuery),\n withTotalElements: true\n };\n return (await this.inventoryService.list(filters)).paging.totalElements;\n }\n\n /** Returns data for current columns and pagination setup. */\n async getData(columns: Column[], pagination: Pagination, searchText = '') {\n // build filters based on columns and pagination\n const filters = {\n text: searchText,\n ...this.getFilters(columns, pagination),\n withTotalElements: true\n };\n // execute inventory query for the list of managed objects\n\n return this.inventoryService.list(filters);\n }\n\n /** Returns filters for given columns and pagination setup. */\n private getFilters(columns: Column[], pagination: Pagination) {\n return {\n query: this.getQueryString(columns),\n pageSize: pagination.pageSize,\n currentPage: pagination.currentPage,\n withChildren: false,\n withTotalPages: true\n };\n }\n\n /** Returns a query string based on columns setup. */\n private getQueryString(columns: Column[]): string {\n let fullQuery = this.getQueryObj(columns);\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, this.baseQuery);\n return this.queriesUtil.buildQuery(fullQuery);\n }\n\n /** Returns a query object based on columns setup. */\n private getQueryObj(columns: Column[]) {\n return transform(columns, (query, column) => this.addColumnQuery(query, column), {\n __filter: {},\n __orderby: []\n });\n }\n\n /** Extends given query with a part based on the setup of given column. */\n private addColumnQuery(query, column: Column): void {\n // when a column is marked as filterable\n if (column.filterable) {\n // in the case of default filtering form, `filterPredicate` will contain the string entered by a user\n if (column.filterPredicate) {\n // so we use it as the expected value, * allow to search for it anywhere in the property\n query.__filter[column.path] = `*${column.filterPredicate}*`;\n }\n\n // in the case of custom filtering form, we're storing the query in `externalFilterQuery.query`\n if (column.externalFilterQuery) {\n query = this.queriesUtil.addAndFilter(query, column.externalFilterQuery.query);\n }\n }\n\n // when a column is sortable and has a specified sorting order\n if (column.sortable && column.sortOrder) {\n // add sorting condition for the configured column `path`\n query.__orderby.push({\n [column.path]: column.sortOrder === 'asc' ? 1 : -1\n });\n }\n\n return query;\n }\n}\n","import { Component, EventEmitter, ViewChild } from '@angular/core';\nimport { IManagedObjectBinary, InventoryBinaryService } from '@c8y/client';\nimport {\n ActionControl,\n AlertService,\n BuiltInActionType,\n BulkActionControl,\n Column,\n DataGridComponent,\n DataSourceModifier,\n DisplayOptions,\n FilesService,\n gettext,\n LoadMoreMode,\n ModalService,\n Pagination,\n Row,\n ServerSideDataCallback,\n ServerSideDataResult,\n Status\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { FilesRepositoryUploadComponent } from './files-repository-upload.component';\nimport { FilesRepositoryService } from './files-repository.service';\n\n@Component({\n selector: 'c8y-files-repository',\n templateUrl: './files-repository.component.html'\n})\nexport class FilesRepositoryComponent {\n @ViewChild(DataGridComponent, { static: true }) dataGrid: DataGridComponent;\n destroy$: Subject<boolean> = new Subject<boolean>();\n title: string = gettext('Files repository');\n managementTitle: string = gettext('Management');\n loadMoreItemsLabel: string = gettext('Load more files');\n loadingItemsLabel: string = gettext('Loading files…');\n\n isLoading = true;\n\n displayOptions: DisplayOptions = {\n bordered: false,\n striped: true,\n filter: true,\n gridHeader: true,\n hover: true\n };\n\n columns: Column[] = this.filesRepositoryService.getColumns();\n pagination: Pagination = this.filesRepositoryService.getPagination();\n infiniteScroll: LoadMoreMode = 'auto';\n serverSideDataCallback: ServerSideDataCallback;\n returnedDataSize: number;\n selectable = true;\n actionControls: ActionControl[] = [\n {\n text: gettext('Delete'),\n icon: 'trash',\n type: BuiltInActionType.Delete,\n showIf: selectedItem =>\n !this.filesRepositoryService.hasApplicationStorageFragment(selectedItem),\n callback: selectedItem => this.onDeleteItem(selectedItem)\n },\n {\n text: gettext('Download'),\n icon: 'download',\n type: BuiltInActionType.Export,\n callback: selectedItem => this.onDownloadItem(selectedItem as IManagedObjectBinary)\n }\n ];\n bulkActionControls: BulkActionControl[] = [\n {\n type: BuiltInActionType.Delete,\n callback: selectedItemIds => this.onDeleteItems(selectedItemIds)\n }\n ];\n\n refresh: EventEmitter<void> = new EventEmitter<void>();\n\n noResultsMessage = gettext('No results to display.');\n noDataMessage = gettext('No files to display.');\n noResultsSubtitle = gettext('Refine your search terms or check your spelling.');\n noDataSubtitle = gettext('Add a new file by clicking below.');\n\n constructor(\n private filesRepositoryService: FilesRepositoryService,\n private inventoryBinaryService: InventoryBinaryService,\n private modalService: ModalService,\n private alertService: AlertService,\n private bsModalService: BsModalService,\n private fileService: FilesService,\n private translateService: TranslateService\n ) {\n // we're setting up `serverSideDataCallback` to execute a method from this component with bound `this`\n this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n }\n\n async onDataSourceModifier(\n dataSourceModifier: DataSourceModifier\n ): Promise<ServerSideDataResult> {\n const { res, data, paging } = await this.filesRepositoryService.getData(\n dataSourceModifier.columns,\n dataSourceModifier.pagination,\n dataSourceModifier.searchText\n );\n const filteredSize: number = paging.totalElements;\n const size: number = await this.filesRepositoryService.getTotal();\n\n const serverSideDataResult: ServerSideDataResult = { res, data, paging, filteredSize, size };\n this.isLoading = false;\n this.returnedDataSize = serverSideDataResult.size;\n\n return serverSideDataResult;\n }\n\n async onDeleteItem(selectedItem: Row) {\n return this.deleteItemsWithConfirmation([selectedItem.id], {\n title: gettext('Delete file'),\n body: this.translateService.instant(\n gettext('You are about to delete file \"{{ name }}\". Do you want to proceed?'),\n selectedItem\n ),\n successText: gettext('File deleted.')\n });\n }\n\n async onDeleteItems(selectedItemsIds: string[]) {\n const dataGridDataSourceData = await this.dataGrid.dataSource.data$.pipe(take(1)).toPromise();\n const deletableItemsIds = this.filesRepositoryService.getDeletableItemsIds(\n selectedItemsIds,\n dataGridDataSourceData\n );\n let body: string;\n if (deletableItemsIds.length < selectedItemsIds.length) {\n body = gettext(`\n You are about to delete the selected files.\n Note: the selected files of type \"c8y_applications_storage_*\" won't be deleted though\n - such files can be deleted only from the \"Activity log\" of the associated application.\n Do you want to proceed?\n `);\n } else {\n body = gettext('You are about to delete the selected files. Do you want to proceed?');\n }\n\n return this.deleteItemsWithConfirmation(deletableItemsIds, {\n title: gettext('Delete files'),\n body,\n successText: gettext('Files deleted.')\n });\n }\n\n async onDownloadItem(selectedItem: IManagedObjectBinary) {\n return this.fileService.download(selectedItem);\n }\n\n openFileUploadComponent() {\n const modalOptions: ModalOptions<FilesRepositoryUploadComponent> = {\n class: 'modal-sm',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n ignoreBackdropClick: true\n };\n const modalRef = this.bsModalService.show(FilesRepositoryUploadComponent, modalOptions);\n modalRef.content.onClose.pipe(takeUntil(this.destroy$)).subscribe(({ uploaded }) => {\n if (uploaded) {\n this.refresh.emit();\n }\n modalRef.hide();\n });\n }\n\n private async deleteItemsWithConfirmation(\n selectedItemsIds: string[],\n options: { title: string; body: string; successText: string }\n ) {\n try {\n await this.confirmItemsDeletion(options);\n this.isLoading = true;\n const promises = selectedItemsIds.map(selectedItemId =>\n this.inventoryBinaryService.delete(selectedItemId)\n );\n await Promise.all(promises);\n this.alertService.success(options.successText);\n this.refresh.next();\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n } finally {\n this.isLoading = false;\n }\n }\n\n private async confirmItemsDeletion({ title, body }: { title: string; body: string }) {\n const status = Status.DANGER;\n const labels = { ok: gettext('Delete'), cancel: gettext('Cancel') };\n await this.modalService.confirm(title, body, status, labels);\n }\n}\n","<c8y-title>\n {{ title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n [label]=\"managementTitle | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"title | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Upload files' | translate }}\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_CREATE']; allowAny: true\"\n (click)=\"openFileUploadComponent()\"\n data-cy=\"c8y-files-repository--open-file-upload-component\"\n >\n <i c8yIcon=\"upload\"></i>\n {{ 'Upload files' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/standard-tenant/managing-data/#file-repository\"></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [displayOptions]=\"displayOptions\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [infiniteScroll]=\"infiniteScroll\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [actionControls]=\"actionControls\"\n [selectable]=\"selectable\"\n [showSearch]=\"true\"\n [refresh]=\"refresh\"\n [bulkActionControls]=\"bulkActionControls\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-archive'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n >\n <p *ngIf=\"stats?.size === 0\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n (click)=\"openFileUploadComponent()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Upload file' | translate }}\n </button>\n </p>\n </c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n <div class=\"d-flex j-c-between a-i-center\">\n {{ context.value }}\n <c8y-file-preview\n class=\"m-l-auto\"\n [mo]=\"context.item\"\n >\n <button\n class=\"btn btn-emphasis btn-icon\"\n [title]=\"'Preview file' | translate\"\n type=\"button\"\n customButton\n >\n <i c8yIcon=\"search\"></i>\n </button>\n </c8y-file-preview>\n </div>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"length\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }} B\">\n {{ context.value | bytes }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"lastUpdated\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | c8yDate }}\">\n {{ context.value | c8yDate }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { CoreModule, hookNavigator, hookRoute, DropAreaModule } from '@c8y/ngx-components';\nimport { FilesRepositoryNavigationFactory } from './files-repository-navigation.factory';\nimport { FilesRepositoryComponent } from './files-repository.component';\nimport { FilesRepositoryUploadComponent } from './files-repository-upload.component';\nimport { FilesRepositoryService } from './files-repository.service';\nimport { FilesRepositoryGuard } from './files-repository.guard';\nimport { FilePreviewModule } from '@c8y/ngx-components/file-preview';\n\n@NgModule({\n imports: [RouterModule, CoreModule, DropAreaModule, FilePreviewModule],\n exports: [],\n declarations: [FilesRepositoryComponent, FilesRepositoryUploadComponent],\n providers: [\n FilesRepositoryGuard,\n hookNavigator(FilesRepositoryNavigationFactory),\n hookRoute(\n {\n path: 'files',\n component: FilesRepositoryComponent,\n canActivate: [FilesRepositoryGuard]\n },\n { multi: true }\n ),\n FilesRepositoryService\n ]\n})\nexport class FilesRepositoryModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i1.FilesRepositoryGuard","i1.FilesRepositoryService","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-files-repository.mjs","sources":["../../files-repository/files-repository.guard.ts","../../files-repository/files-repository-navigation.factory.ts","../../files-repository/files-repository-product-experience.constants.ts","../../files-repository/files-repository-upload.component.ts","../../files-repository/files-repository-upload.component.html","../../files-repository/files-repository.service.ts","../../files-repository/files-repository.component.ts","../../files-repository/files-repository.component.html","../../files-repository/files-repository.module.ts","../../files-repository/c8y-ngx-components-files-repository.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Permissions } from '@c8y/ngx-components';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesRepositoryGuard {\n constructor(private permissions: Permissions) {}\n\n /**\n * Checks if files repository should be active,\n * i.e. whether the current tenant can read or admin files in repository.\n *\n * @returns True, if the feature should be active.\n */\n canActivate(): boolean {\n return (\n this.permissions.hasRole(Permissions.ROLE_INVENTORY_READ) ||\n this.permissions.hasAllRoles([\n Permissions.ROLE_MANAGED_OBJECT_READ,\n Permissions.ROLE_BINARY_READ\n ])\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\nimport { FilesRepositoryGuard } from './files-repository.guard';\n\n@Injectable({ providedIn: 'root' })\nexport class FilesRepositoryNavigationFactory implements NavigatorNodeFactory {\n private navs: NavigatorNode[] = [];\n\n constructor(private filesRepositoryGuard: FilesRepositoryGuard) {}\n\n async get(): Promise<NavigatorNode[]> {\n if (this.filesRepositoryGuard.canActivate()) {\n if (!this.navs.length) {\n this.navs.push(\n new NavigatorNode({\n parent: gettext('Management'),\n label: gettext('Files repository'),\n icon: 'c8y-archive',\n path: 'files',\n routerLinkExact: false,\n priority: 1000\n })\n );\n }\n }\n return this.navs;\n }\n}\n","export const PRODUCT_EXPERIENCE_FILE_REPOSITORY = {\n EVENTS: {\n FILE_REPOSITORY_UPLOAD: 'filesRepositoryUpload'\n },\n COMPONENTS: {\n FILE_REPOSITORY_UPLOAD_COMPONENT: 'files-repository-upload'\n },\n RESULTS: {\n UPLOAD_ITEM_SUCCESS: 'fileUploadSuccess',\n UPLOAD_ITEM_FAILED: 'fileUploadFailed'\n }\n} as const;\n","import { Component, Output } from '@angular/core';\nimport { EventEmitter } from '@angular/core';\nimport {\n AlertService,\n GainsightService,\n FilesService,\n gettext,\n IFetchWithProgress\n} from '@c8y/ngx-components';\nimport { PRODUCT_EXPERIENCE_FILE_REPOSITORY } from './files-repository-product-experience.constants';\nimport { Observable, Subscription, combineLatest } from 'rxjs';\n\n@Component({\n selector: 'c8y-files-repository-upload',\n templateUrl: './files-repository-upload.component.html'\n})\nexport class FilesRepositoryUploadComponent {\n /** Emits an event when modal is closed. `uploaded` indicates if any files were uploaded. */\n @Output() onClose: EventEmitter<{ uploaded: boolean }> = new EventEmitter();\n isLoading = false;\n dropFilesHereMessage: string = gettext('Drop files here');\n filesToUpload: File[];\n uploadProgress: IFetchWithProgress[];\n uploadProgress$: Observable<IFetchWithProgress[]>;\n uploadSubscription: Subscription;\n\n constructor(\n private alertService: AlertService,\n private gainsightService: GainsightService,\n private filesService: FilesService\n ) {}\n\n async upload(): Promise<void> {\n this.isLoading = true;\n this.uploadProgress$ = combineLatest(\n this.filesToUpload.map(file => this.filesService.uploadFileWithProgress$(file))\n );\n\n this.uploadSubscription = this.uploadProgress$.subscribe(\n uploadProgress => {\n this.uploadProgress = uploadProgress;\n },\n e => {\n if (e) {\n this.alertService.addServerFailure(e);\n this.gainsightService.triggerEvent(\n PRODUCT_EXPERIENCE_FILE_REPOSITORY.EVENTS.FILE_REPOSITORY_UPLOAD,\n {\n component:\n PRODUCT_EXPERIENCE_FILE_REPOSITORY.COMPONENTS.FILE_REPOSITORY_UPLOAD_COMPONENT,\n action: PRODUCT_EXPERIENCE_FILE_REPOSITORY.RESULTS.UPLOAD_ITEM_FAILED\n }\n );\n }\n this.isLoading = false;\n },\n () => {\n this.alertService.success(gettext('File(s) uploaded.'));\n this.onClose.emit({ uploaded: true });\n this.gainsightService.triggerEvent(\n PRODUCT_EXPERIENCE_FILE_REPOSITORY.EVENTS.FILE_REPOSITORY_UPLOAD,\n {\n component:\n PRODUCT_EXPERIENCE_FILE_REPOSITORY.COMPONENTS.FILE_REPOSITORY_UPLOAD_COMPONENT,\n action: PRODUCT_EXPERIENCE_FILE_REPOSITORY.RESULTS.UPLOAD_ITEM_SUCCESS\n }\n );\n }\n );\n }\n\n onFileDroppedEvent(event: File[]): void {\n if (event && event.length > 0) {\n this.filesToUpload = event;\n }\n }\n}\n","<div class=\"c8y-viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"upload\"></i>\n <h4\n id=\"modal-title\"\n translate\n >\n Upload files\n </h4>\n </div>\n <div class=\"modal-inner-scroll\">\n <div\n class=\"modal-body\"\n id=\"modal-body\"\n >\n <c8y-file-picker-form-control\n #filePicker\n [uploadInProgress]=\"isLoading\"\n (dropped)=\"onFileDroppedEvent($event)\"\n [uploadProgress]=\"uploadProgress\"\n ></c8y-file-picker-form-control>\n </div>\n </div>\n <div class=\"card-footer separator d-flex j-c-center\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"onClose.emit({ uploaded: false })\"\n [disabled]=\"isLoading\"\n translate\n >\n Cancel\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n title=\"{{ 'Upload' | translate }}\"\n type=\"button\"\n (click)=\"upload()\"\n [disabled]=\"!filePicker.valid || isLoading\"\n translate\n data-cy=\"c8y-files-repository-upload--upload\"\n >\n Upload\n </button>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { QueriesUtil } from '@c8y/client';\nimport { InventoryService } from '@c8y/client';\nimport { gettext, Pagination, SortOrder, Column, Row } from '@c8y/ngx-components';\nimport { transform, has } from 'lodash-es';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilesRepositoryService {\n queriesUtil: QueriesUtil;\n baseQuery = { __has: 'c8y_IsBinary' };\n constructor(private inventoryService: InventoryService) {\n this.queriesUtil = new QueriesUtil();\n }\n\n getPagination(): Pagination {\n return {\n pageSize: 10,\n currentPage: 1\n };\n }\n\n hasApplicationStorageFragment(file: Row): boolean {\n return has(file, 'c8y_applications_storage');\n }\n\n getColumns(): Column[] {\n return [\n {\n name: 'name',\n header: gettext('Name'),\n path: 'name',\n filterable: true,\n sortable: true,\n sortOrder: 'asc' as SortOrder\n },\n {\n name: 'type',\n header: gettext('Type'),\n path: 'type',\n filterable: true,\n sortable: true\n },\n {\n name: 'length',\n header: gettext('Size'),\n path: 'length',\n filterable: false,\n sortable: true\n },\n {\n name: 'owner',\n header: gettext('Owner'),\n path: 'owner',\n filterable: true,\n sortable: true\n },\n {\n name: 'lastUpdated',\n header: gettext('Last update'),\n path: 'lastUpdated',\n filterable: false,\n sortable: true\n }\n ];\n }\n\n /** Returns array with items id where item has not c8y_applications_storage fragment. */\n getDeletableItemsIds(selectedItemsIds: string[], dataFromDataGrid: Array<any>): string[] {\n const selectedItemsWithoutApplications = [];\n dataFromDataGrid.forEach(item => {\n selectedItemsIds.forEach(selectedItemId => {\n if (selectedItemId === item.id && !this.hasApplicationStorageFragment(item)) {\n selectedItemsWithoutApplications.push(selectedItemId);\n }\n });\n });\n\n return selectedItemsWithoutApplications;\n }\n\n /** Returns the total number of items (with no filters based on columns setup). */\n async getTotal(): Promise<number> {\n const filters = {\n query: this.queriesUtil.buildQuery(this.baseQuery),\n withTotalElements: true\n };\n return (await this.inventoryService.list(filters)).paging.totalElements;\n }\n\n /** Returns data for current columns and pagination setup. */\n async getData(columns: Column[], pagination: Pagination, searchText = '') {\n // build filters based on columns and pagination\n const filters = {\n text: searchText,\n ...this.getFilters(columns, pagination),\n withTotalElements: true\n };\n // execute inventory query for the list of managed objects\n\n return this.inventoryService.list(filters);\n }\n\n /** Returns filters for given columns and pagination setup. */\n private getFilters(columns: Column[], pagination: Pagination) {\n return {\n query: this.getQueryString(columns),\n pageSize: pagination.pageSize,\n currentPage: pagination.currentPage,\n withChildren: false,\n withTotalPages: true\n };\n }\n\n /** Returns a query string based on columns setup. */\n private getQueryString(columns: Column[]): string {\n let fullQuery = this.getQueryObj(columns);\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, this.baseQuery);\n return this.queriesUtil.buildQuery(fullQuery);\n }\n\n /** Returns a query object based on columns setup. */\n private getQueryObj(columns: Column[]) {\n return transform(columns, (query, column) => this.addColumnQuery(query, column), {\n __filter: {},\n __orderby: []\n });\n }\n\n /** Extends given query with a part based on the setup of given column. */\n private addColumnQuery(query, column: Column): void {\n // when a column is marked as filterable\n if (column.filterable) {\n // in the case of default filtering form, `filterPredicate` will contain the string entered by a user\n if (column.filterPredicate) {\n // so we use it as the expected value, * allow to search for it anywhere in the property\n query.__filter[column.path] = `*${column.filterPredicate}*`;\n }\n\n // in the case of custom filtering form, we're storing the query in `externalFilterQuery.query`\n if (column.externalFilterQuery) {\n query = this.queriesUtil.addAndFilter(query, column.externalFilterQuery.query);\n }\n }\n\n // when a column is sortable and has a specified sorting order\n if (column.sortable && column.sortOrder) {\n // add sorting condition for the configured column `path`\n query.__orderby.push({\n [column.path]: column.sortOrder === 'asc' ? 1 : -1\n });\n }\n\n return query;\n }\n}\n","import { Component, EventEmitter, ViewChild } from '@angular/core';\nimport { IManagedObjectBinary, InventoryBinaryService } from '@c8y/client';\nimport {\n ActionControl,\n AlertService,\n BuiltInActionType,\n BulkActionControl,\n Column,\n DataGridComponent,\n DataSourceModifier,\n DisplayOptions,\n FilesService,\n gettext,\n LoadMoreMode,\n ModalService,\n Pagination,\n Row,\n ServerSideDataCallback,\n ServerSideDataResult,\n Status\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { Subject } from 'rxjs';\nimport { take, takeUntil } from 'rxjs/operators';\nimport { FilesRepositoryUploadComponent } from './files-repository-upload.component';\nimport { FilesRepositoryService } from './files-repository.service';\n\n@Component({\n selector: 'c8y-files-repository',\n templateUrl: './files-repository.component.html'\n})\nexport class FilesRepositoryComponent {\n @ViewChild(DataGridComponent, { static: true }) dataGrid: DataGridComponent;\n destroy$: Subject<boolean> = new Subject<boolean>();\n title: string = gettext('Files repository');\n managementTitle: string = gettext('Management');\n loadMoreItemsLabel: string = gettext('Load more files');\n loadingItemsLabel: string = gettext('Loading files…');\n\n isLoading = true;\n\n displayOptions: DisplayOptions = {\n bordered: false,\n striped: true,\n filter: true,\n gridHeader: true,\n hover: true\n };\n\n columns: Column[] = this.filesRepositoryService.getColumns();\n pagination: Pagination = this.filesRepositoryService.getPagination();\n infiniteScroll: LoadMoreMode = 'auto';\n serverSideDataCallback: ServerSideDataCallback;\n returnedDataSize: number;\n selectable = true;\n actionControls: ActionControl[] = [\n {\n text: gettext('Delete'),\n icon: 'trash',\n type: BuiltInActionType.Delete,\n showIf: selectedItem =>\n !this.filesRepositoryService.hasApplicationStorageFragment(selectedItem),\n callback: selectedItem => this.onDeleteItem(selectedItem)\n },\n {\n text: gettext('Download'),\n icon: 'download',\n type: BuiltInActionType.Export,\n callback: selectedItem => this.onDownloadItem(selectedItem as IManagedObjectBinary)\n }\n ];\n bulkActionControls: BulkActionControl[] = [\n {\n type: BuiltInActionType.Delete,\n callback: selectedItemIds => this.onDeleteItems(selectedItemIds)\n }\n ];\n\n refresh: EventEmitter<void> = new EventEmitter<void>();\n\n noResultsMessage = gettext('No results to display.');\n noDataMessage = gettext('No files to display.');\n noResultsSubtitle = gettext('Refine your search terms or check your spelling.');\n noDataSubtitle = gettext('Add a new file by clicking below.');\n\n constructor(\n private filesRepositoryService: FilesRepositoryService,\n private inventoryBinaryService: InventoryBinaryService,\n private modalService: ModalService,\n private alertService: AlertService,\n private bsModalService: BsModalService,\n private fileService: FilesService,\n private translateService: TranslateService\n ) {\n // we're setting up `serverSideDataCallback` to execute a method from this component with bound `this`\n this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n }\n\n async onDataSourceModifier(\n dataSourceModifier: DataSourceModifier\n ): Promise<ServerSideDataResult> {\n const { res, data, paging } = await this.filesRepositoryService.getData(\n dataSourceModifier.columns,\n dataSourceModifier.pagination,\n dataSourceModifier.searchText\n );\n const filteredSize: number = paging.totalElements;\n const size: number = await this.filesRepositoryService.getTotal();\n\n const serverSideDataResult: ServerSideDataResult = { res, data, paging, filteredSize, size };\n this.isLoading = false;\n this.returnedDataSize = serverSideDataResult.size;\n\n return serverSideDataResult;\n }\n\n async onDeleteItem(selectedItem: Row) {\n return this.deleteItemsWithConfirmation([selectedItem.id], {\n title: gettext('Delete file'),\n body: this.translateService.instant(\n gettext('You are about to delete file \"{{ name }}\". Do you want to proceed?'),\n selectedItem\n ),\n successText: gettext('File deleted.')\n });\n }\n\n async onDeleteItems(selectedItemsIds: string[]) {\n const dataGridDataSourceData = await this.dataGrid.dataSource.data$.pipe(take(1)).toPromise();\n const deletableItemsIds = this.filesRepositoryService.getDeletableItemsIds(\n selectedItemsIds,\n dataGridDataSourceData\n );\n let body: string;\n if (deletableItemsIds.length < selectedItemsIds.length) {\n body = gettext(`\n You are about to delete the selected files.\n Note: the selected files of type \"c8y_applications_storage_*\" won't be deleted though\n - such files can be deleted only from the \"Activity log\" of the associated application.\n Do you want to proceed?\n `);\n } else {\n body = gettext('You are about to delete the selected files. Do you want to proceed?');\n }\n\n return this.deleteItemsWithConfirmation(deletableItemsIds, {\n title: gettext('Delete files'),\n body,\n successText: gettext('Files deleted.')\n });\n }\n\n async onDownloadItem(selectedItem: IManagedObjectBinary) {\n return this.fileService.download(selectedItem);\n }\n\n openFileUploadComponent() {\n const modalOptions: ModalOptions<FilesRepositoryUploadComponent> = {\n class: 'modal-sm',\n ariaDescribedby: 'modal-body',\n ariaLabelledBy: 'modal-title',\n ignoreBackdropClick: true\n };\n const modalRef = this.bsModalService.show(FilesRepositoryUploadComponent, modalOptions);\n modalRef.content.onClose.pipe(takeUntil(this.destroy$)).subscribe(({ uploaded }) => {\n if (uploaded) {\n this.refresh.emit();\n }\n modalRef.hide();\n });\n }\n\n private async deleteItemsWithConfirmation(\n selectedItemsIds: string[],\n options: { title: string; body: string; successText: string }\n ) {\n try {\n await this.confirmItemsDeletion(options);\n this.isLoading = true;\n const promises = selectedItemsIds.map(selectedItemId =>\n this.inventoryBinaryService.delete(selectedItemId)\n );\n await Promise.all(promises);\n this.alertService.success(options.successText);\n this.refresh.next();\n } catch (ex) {\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n } finally {\n this.isLoading = false;\n }\n }\n\n private async confirmItemsDeletion({ title, body }: { title: string; body: string }) {\n const status = Status.DANGER;\n const labels = { ok: gettext('Delete'), cancel: gettext('Cancel') };\n await this.modalService.confirm(title, body, status, labels);\n }\n}\n","<c8y-title>\n {{ title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n [label]=\"managementTitle | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"title | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Upload files' | translate }}\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_CREATE']; allowAny: true\"\n (click)=\"openFileUploadComponent()\"\n data-cy=\"c8y-files-repository--open-file-upload-component\"\n >\n <i c8yIcon=\"upload\"></i>\n {{ 'Upload files' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/standard-tenant/managing-data/#file-repository\"></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [displayOptions]=\"displayOptions\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [infiniteScroll]=\"infiniteScroll\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [actionControls]=\"actionControls\"\n [selectable]=\"selectable\"\n [showSearch]=\"true\"\n [refresh]=\"refresh\"\n [bulkActionControls]=\"bulkActionControls\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-archive'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n >\n <p *ngIf=\"stats?.size === 0\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n (click)=\"openFileUploadComponent()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Upload file' | translate }}\n </button>\n </p>\n </c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n <div class=\"d-flex j-c-between a-i-center\">\n {{ context.value }}\n <c8y-file-preview\n class=\"m-l-auto\"\n [mo]=\"context.item\"\n >\n <button\n class=\"btn btn-emphasis btn-icon\"\n [title]=\"'Preview file' | translate\"\n type=\"button\"\n customButton\n >\n <i c8yIcon=\"search\"></i>\n </button>\n </c8y-file-preview>\n </div>\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"length\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }} B\">\n {{ context.value | bytes }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"lastUpdated\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | c8yDate }}\">\n {{ context.value | c8yDate }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { CoreModule, hookNavigator, hookRoute, DropAreaModule } from '@c8y/ngx-components';\nimport { FilesRepositoryNavigationFactory } from './files-repository-navigation.factory';\nimport { FilesRepositoryComponent } from './files-repository.component';\nimport { FilesRepositoryUploadComponent } from './files-repository-upload.component';\nimport { FilesRepositoryService } from './files-repository.service';\nimport { FilesRepositoryGuard } from './files-repository.guard';\nimport { FilePreviewModule } from '@c8y/ngx-components/file-preview';\n\n@NgModule({\n imports: [RouterModule, CoreModule, DropAreaModule, FilePreviewModule],\n exports: [],\n declarations: [FilesRepositoryComponent, FilesRepositoryUploadComponent],\n providers: [\n FilesRepositoryGuard,\n hookNavigator(FilesRepositoryNavigationFactory),\n hookRoute(\n {\n path: 'files',\n component: FilesRepositoryComponent,\n canActivate: [FilesRepositoryGuard]\n },\n { multi: true }\n ),\n FilesRepositoryService\n ]\n})\nexport class FilesRepositoryModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i1.FilesRepositoryGuard","i1.FilesRepositoryService","i2"],"mappings":"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"}
|
|
@@ -706,7 +706,7 @@ class TopicListViewComponent {
|
|
|
706
706
|
.subscribe(() => this.refresh.emit());
|
|
707
707
|
}
|
|
708
708
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicListViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
709
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TopicListViewComponent, isStandalone: true, selector: "app-topic-list-view", ngImport: i0, template: "<c8y-title>{{ namespaceLabel$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'monitoring'\"\n [label]=\"'Monitoring' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Messaging service' | translate\"\n [path]=\"'/monitoring/messaging-service'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"namespaceLabel$ | async\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <a\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"refresh.emit()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': loading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </a>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-flex d-col\">\n <div class=\"bg-level-1 separator-bottom flex-no-shrink\">\n <div\n class=\"card-block\"\n style=\"min-height: 172px\"\n >\n <div\n class=\"col-md-4 m-b-24 col-xs-12 d-flex p-t-24 gap-16 text-default a-i-center a-s-stretch\"\n >\n <div class=\"text-center d-col\">\n <i\n class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"icon$ | async\"\n ></i>\n <span class=\"tag tag--info\">{{ 'Service' | translate }}</span>\n </div>\n <span class=\"h4 text-break-all\">{{ namespaceLabel$ | async }}</span>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>\n {{ 'Service usage/limits' | translate }}\n </legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceUsageLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceUsageLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.namespace as namespace\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Topics' | translate }}</label>\n <ng-container *ngIf=\"namespace?.topics?.limit !== 0\">\n <app-usage\n [count]=\"namespace?.topics?.count\"\n [limit]=\"namespace?.topics?.limit\"\n ></app-usage>\n <span class=\"m-l-16\">\n {{ namespace?.topics?.count | number }} /\n {{ namespace?.topics?.limit | backlogQuotaLimit }}\n </span>\n </ng-container>\n <ng-container *ngIf=\"namespace?.topics?.limit === 0\">\n <span class=\"m-l-16\">{{ namespace?.topics?.count | number }}</span>\n </ng-container>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Subscribers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.subscribers?.count | number }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Publishers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.publishers?.count | number }}\n </span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>{{ 'Service message backlog limits' | translate }}</legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceMessageBacklogLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceMessageBacklogLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.policies as policies\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog quota (per topic)' | translate }}\n </label>\n <span\n title=\"{{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0 : true)\n : '-'\n }}\"\n >\n {{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0)\n : '-'\n }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog time to live (TTL)' | translate }}\n </label>\n <span>{{ policies?.messageTTL | timeToLive }}</span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n </div>\n </div>\n\n <c8y-data-grid\n class=\"d-contents\"\n [title]=\"tableTitle | translate\"\n [loadingItemsLabel]=\"loadingItemsLabel | translate\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel | translate\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [refresh]=\"refresh\"\n [hideReload]=\"true\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'day-view'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value }}\"\n [routerLink]=\"['topic', context.item.id]\"\n >\n {{ context.value }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateIn\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateOut\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"subscribers\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value | number }}\"\n [routerLink]=\"['topic', context.item.id, 'subscribers']\"\n >\n {{ context.value | number }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogSize\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | bytes: 2 : true }}\">\n {{ context.value | bytes: 2 }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogUsagePercentage\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value / 100 | percent: '1.0-2' }}\">\n {{ context.value / 100 | percent: '1.0-2' }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: HeaderModule }, { kind: "component", type: i1$1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "ngmodule", type: DataGridModule }, { kind: "directive", type: i1$1.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i1$1.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i1$1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "hideReload"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: BacklogQuotaLimitPipe, name: "backlogQuotaLimit" }, { kind: "component", type: UsageComponent, selector: "app-usage", inputs: ["count", "limit", "percentage"] }, { kind: "pipe", type: BytesPipe, name: "bytes" }, { kind: "pipe", type: TimeToLivePipe, name: "timeToLive" }, { kind: "ngmodule", type: BreadcrumbModule }, { kind: "component", type: i1$1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1$1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: PercentPipe, name: "percent" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
|
|
709
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TopicListViewComponent, isStandalone: true, selector: "app-topic-list-view", ngImport: i0, template: "<c8y-title>{{ namespaceLabel$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'monitoring'\"\n [label]=\"'Monitoring' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Messaging service' | translate\"\n [path]=\"'/monitoring/messaging-service'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"namespaceLabel$ | async\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <a\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"refresh.emit()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': loading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </a>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-flex d-col\">\n <div class=\"bg-level-1 separator-bottom flex-no-shrink\">\n <div\n class=\"card-block\"\n style=\"min-height: 172px\"\n >\n <div\n class=\"col-md-4 m-b-24 col-xs-12 d-flex p-t-24 gap-16 text-default a-i-center a-s-stretch\"\n >\n <div class=\"text-center d-col\">\n <i\n class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"icon$ | async\"\n ></i>\n <span class=\"tag tag--info\">{{ 'Service' | translate }}</span>\n </div>\n <span class=\"h4 text-break-all\">{{ namespaceLabel$ | async }}</span>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>\n {{ 'Service usage/limits' | translate }}\n </legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceUsageLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceUsageLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.namespace as namespace\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Topics' | translate }}</label>\n <ng-container *ngIf=\"namespace?.topics?.limit !== 0\">\n <app-usage\n [count]=\"namespace?.topics?.count\"\n [limit]=\"namespace?.topics?.limit\"\n ></app-usage>\n <span class=\"m-l-16\">\n {{ namespace?.topics?.count | number }} /\n {{ namespace?.topics?.limit | backlogQuotaLimit }}\n </span>\n </ng-container>\n <ng-container *ngIf=\"namespace?.topics?.limit === 0\">\n <span class=\"m-l-16\">{{ namespace?.topics?.count | number }}</span>\n </ng-container>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Subscribers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.subscribers?.count | number }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Publishers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.publishers?.count | number }}\n </span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>{{ 'Service message backlog limits' | translate }}</legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceMessageBacklogLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceMessageBacklogLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.policies as policies\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog quota (per topic)' | translate }}\n </label>\n <span\n title=\"{{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0 : true)\n : '-'\n }}\"\n >\n {{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0)\n : '-'\n }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog time to live (TTL)' | translate }}\n </label>\n <span>{{ policies?.messageTTL | timeToLive }}</span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n </div>\n </div>\n\n <c8y-data-grid\n class=\"d-contents\"\n [title]=\"tableTitle | translate\"\n [loadingItemsLabel]=\"loadingItemsLabel | translate\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel | translate\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [refresh]=\"refresh\"\n [hideReload]=\"true\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'day-view'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value }}\"\n [routerLink]=\"['topic', context.item.id]\"\n >\n {{ context.value }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateIn\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateOut\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"subscribers\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value | number }}\"\n [routerLink]=\"['topic', context.item.id, 'subscribers']\"\n >\n {{ context.value | number }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogSize\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | bytes: 2 : true }}\">\n {{ context.value | bytes: 2 }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogUsagePercentage\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value / 100 | percent: '1.0-2' }}\">\n {{ context.value / 100 | percent: '1.0-2' }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: HeaderModule }, { kind: "component", type: i1$1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "ngmodule", type: DataGridModule }, { kind: "directive", type: i1$1.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i1$1.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i1$1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: BacklogQuotaLimitPipe, name: "backlogQuotaLimit" }, { kind: "component", type: UsageComponent, selector: "app-usage", inputs: ["count", "limit", "percentage"] }, { kind: "pipe", type: BytesPipe, name: "bytes" }, { kind: "pipe", type: TimeToLivePipe, name: "timeToLive" }, { kind: "ngmodule", type: BreadcrumbModule }, { kind: "component", type: i1$1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1$1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: PercentPipe, name: "percent" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
|
|
710
710
|
}
|
|
711
711
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicListViewComponent, decorators: [{
|
|
712
712
|
type: Component,
|
|
@@ -1102,7 +1102,7 @@ class TopicSubscribersViewComponent {
|
|
|
1102
1102
|
this.topicSubscribersDataGridService.bulkUnsubscribeSubscribers(subscribers, () => this.refresh.emit());
|
|
1103
1103
|
}
|
|
1104
1104
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicSubscribersViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1105
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TopicSubscribersViewComponent, isStandalone: true, selector: "app-topic-subscribers-view", viewQueries: [{ propertyName: "dataGrid", first: true, predicate: DataGridComponent, descendants: true, static: true }], ngImport: i0, template: "<c8y-title>{{ topicName$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'monitoring'\"\n [label]=\"'Monitoring' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Messaging service' | translate\"\n [path]=\"'/monitoring/messaging-service'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"namespaceLabel$ | async\"\n [path]=\"'/monitoring/messaging-service/namespace/' + (namespaceId$ | async)\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"topicName$ | async\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <a\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"refresh.emit()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': loading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </a>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-flex d-col\">\n <div class=\"bg-level-1 separator-bottom flex-no-shrink\">\n <div class=\"card-block\">\n <div\n class=\"col-md-4 m-b-24 col-xs-12 d-flex p-t-24 gap-16 text-default a-i-center a-s-stretch\"\n >\n <div class=\"text-center d-col\">\n <i\n class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"'day-view'\"\n ></i>\n <span class=\"tag tag--default\">{{ 'Topic' | translate }}</span>\n </div>\n <span class=\"h4\">{{ topicName$ | async }}</span>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend translate>Topic usage</legend>\n\n <ng-container *ngIf=\"loading$ | async; else topicSummary\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #topicSummary>\n <ng-container *ngIf=\"overview$ | async as overview\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Active subscribers' | translate }}</label>\n <span class=\"m-l-16\">{{ overview.topic.activeSubscribers | number }}</span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Total subscribers' | translate }}</label>\n <span class=\"m-l-16\">{{ overview.topic.subscribers | number }}</span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Total unacknowledged messages' | translate }}\n </label>\n <span class=\"m-l-16\">{{ overview.topic.unackMsgBacklog | number }}</span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Message rate in' | translate }}\n </label>\n <span\n class=\"m-l-16\"\n ngNonBindable\n translate\n [translateParams]=\"{\n messagesPerSecond: overview.topic.msgRateIn | number\n }\"\n >\n {{ messagesPerSecond }} msg/s\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Message rate out' | translate }}\n </label>\n <span\n class=\"m-l-16\"\n ngNonBindable\n translate\n [translateParams]=\"{\n messagesPerSecond: overview.topic.msgRateOut | number\n }\"\n >\n {{ messagesPerSecond }} msg/s\n </span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend translate>Topic message backlog</legend>\n\n <ng-container *ngIf=\"loading$ | async; else topicBacklog\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #topicBacklog>\n <ng-container *ngIf=\"overview$ | async as overview\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label\n class=\"small m-b-0 m-r-auto\"\n translate\n >\n Backlog usage\n </label>\n <app-usage [percentage]=\"overview.topic.backlogUsagePercentage\"></app-usage>\n <span class=\"m-l-16\">{{ overview.topic.backlogSize | bytes }}</span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label\n class=\"small m-b-0 m-r-auto\"\n translate\n >\n Backlog quota\n </label>\n <span class=\"m-l-16\">\n {{\n overview.policies.backlogQuota?.limit > 0\n ? (overview.policies.backlogQuota?.limit | bytes)\n : '-'\n }}\n </span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n </div>\n </div>\n <c8y-data-grid\n class=\"content-fullpage d-flex d-col border-top border-bottom\"\n [title]=\"tableTitle | translate\"\n [loadingItemsLabel]=\"loadingItemsLabel | translate\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel | translate\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [refresh]=\"refresh\"\n [hideReload]=\"true\"\n [selectable]=\"selectable\"\n [actionControls]=\"actionControls\"\n [bulkActionControls]=\"bulkActionControls\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'input'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n {{ context.value }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"activeClients\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"messageAckRate\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"lastAcknowledgeDate\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n title=\"{{ context.value }}\"\n *ngIf=\"context.value; else noLastAcknwoldegeDate\"\n >\n {{ context.value | relativeTime }}\n </span>\n <ng-template #noLastAcknwoldegeDate>–</ng-template>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"unackMsgBacklog\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogUsagePercentage\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value / 100 | percent: '1.0-2' }}\">\n {{ context.value / 100 | percent: '1.0-2' }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "ngmodule", type: DataGridModule }, { kind: "directive", type: i1$1.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i1$1.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i1$1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "hideReload"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "ngmodule", type: HeaderModule }, { kind: "component", type: i1$1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: RelativeTimePipe, name: "relativeTime" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.PercentPipe, name: "percent" }, { kind: "pipe", type: BytesPipe, name: "bytes" }, { kind: "ngmodule", type: BreadcrumbModule }, { kind: "component", type: i1$1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1$1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: UsageComponent, selector: "app-usage", inputs: ["count", "limit", "percentage"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }] }); }
|
|
1105
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TopicSubscribersViewComponent, isStandalone: true, selector: "app-topic-subscribers-view", viewQueries: [{ propertyName: "dataGrid", first: true, predicate: DataGridComponent, descendants: true, static: true }], ngImport: i0, template: "<c8y-title>{{ topicName$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'monitoring'\"\n [label]=\"'Monitoring' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Messaging service' | translate\"\n [path]=\"'/monitoring/messaging-service'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"namespaceLabel$ | async\"\n [path]=\"'/monitoring/messaging-service/namespace/' + (namespaceId$ | async)\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"topicName$ | async\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <a\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"refresh.emit()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': loading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </a>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-flex d-col\">\n <div class=\"bg-level-1 separator-bottom flex-no-shrink\">\n <div class=\"card-block\">\n <div\n class=\"col-md-4 m-b-24 col-xs-12 d-flex p-t-24 gap-16 text-default a-i-center a-s-stretch\"\n >\n <div class=\"text-center d-col\">\n <i\n class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"'day-view'\"\n ></i>\n <span class=\"tag tag--default\">{{ 'Topic' | translate }}</span>\n </div>\n <span class=\"h4\">{{ topicName$ | async }}</span>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend translate>Topic usage</legend>\n\n <ng-container *ngIf=\"loading$ | async; else topicSummary\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #topicSummary>\n <ng-container *ngIf=\"overview$ | async as overview\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Active subscribers' | translate }}</label>\n <span class=\"m-l-16\">{{ overview.topic.activeSubscribers | number }}</span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Total subscribers' | translate }}</label>\n <span class=\"m-l-16\">{{ overview.topic.subscribers | number }}</span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Total unacknowledged messages' | translate }}\n </label>\n <span class=\"m-l-16\">{{ overview.topic.unackMsgBacklog | number }}</span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Message rate in' | translate }}\n </label>\n <span\n class=\"m-l-16\"\n ngNonBindable\n translate\n [translateParams]=\"{\n messagesPerSecond: overview.topic.msgRateIn | number\n }\"\n >\n {{ messagesPerSecond }} msg/s\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Message rate out' | translate }}\n </label>\n <span\n class=\"m-l-16\"\n ngNonBindable\n translate\n [translateParams]=\"{\n messagesPerSecond: overview.topic.msgRateOut | number\n }\"\n >\n {{ messagesPerSecond }} msg/s\n </span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend translate>Topic message backlog</legend>\n\n <ng-container *ngIf=\"loading$ | async; else topicBacklog\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #topicBacklog>\n <ng-container *ngIf=\"overview$ | async as overview\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label\n class=\"small m-b-0 m-r-auto\"\n translate\n >\n Backlog usage\n </label>\n <app-usage [percentage]=\"overview.topic.backlogUsagePercentage\"></app-usage>\n <span class=\"m-l-16\">{{ overview.topic.backlogSize | bytes }}</span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label\n class=\"small m-b-0 m-r-auto\"\n translate\n >\n Backlog quota\n </label>\n <span class=\"m-l-16\">\n {{\n overview.policies.backlogQuota?.limit > 0\n ? (overview.policies.backlogQuota?.limit | bytes)\n : '-'\n }}\n </span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n </div>\n </div>\n <c8y-data-grid\n class=\"content-fullpage d-flex d-col border-top border-bottom\"\n [title]=\"tableTitle | translate\"\n [loadingItemsLabel]=\"loadingItemsLabel | translate\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel | translate\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [refresh]=\"refresh\"\n [hideReload]=\"true\"\n [selectable]=\"selectable\"\n [actionControls]=\"actionControls\"\n [bulkActionControls]=\"bulkActionControls\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'input'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value }}\">\n {{ context.value }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"activeClients\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"messageAckRate\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"lastAcknowledgeDate\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span\n title=\"{{ context.value }}\"\n *ngIf=\"context.value; else noLastAcknwoldegeDate\"\n >\n {{ context.value | relativeTime }}\n </span>\n <ng-template #noLastAcknwoldegeDate>–</ng-template>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"unackMsgBacklog\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogUsagePercentage\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value / 100 | percent: '1.0-2' }}\">\n {{ context.value / 100 | percent: '1.0-2' }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "ngmodule", type: DataGridModule }, { kind: "directive", type: i1$1.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i1$1.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i1$1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "ngmodule", type: HeaderModule }, { kind: "component", type: i1$1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: RelativeTimePipe, name: "relativeTime" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.PercentPipe, name: "percent" }, { kind: "pipe", type: BytesPipe, name: "bytes" }, { kind: "ngmodule", type: BreadcrumbModule }, { kind: "component", type: i1$1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1$1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: UsageComponent, selector: "app-usage", inputs: ["count", "limit", "percentage"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }] }); }
|
|
1106
1106
|
}
|
|
1107
1107
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicSubscribersViewComponent, decorators: [{
|
|
1108
1108
|
type: Component,
|