UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

556 lines (539 loc) 31.2 kB
import * as i0 from '@angular/core'; import { Component, InjectionToken, Injectable, Optional, Inject, EventEmitter, NgModule } from '@angular/core'; import * as i1 from '@c8y/ngx-components'; import { BaseColumn, gettext, getBasicInputArrayFormFieldConfig, hookGeneric, ViewContext, CoreModule, hookRoute, hookBreadcrumb } from '@c8y/ngx-components'; import { FormGroup } from '@angular/forms'; import * as i1$1 from '@angular/router'; import { RouterModule } from '@angular/router'; import { flatten, entries, get } from 'lodash-es'; import * as i3 from '@angular/common'; import * as i4 from 'ngx-bootstrap/tooltip'; import { TooltipModule } from 'ngx-bootstrap/tooltip'; import * as i1$2 from '@c8y/client'; import { QueriesUtil } from '@c8y/client'; import * as i5 from '@c8y/ngx-components/services/shared'; import { SERVICE_FRAGMENT } from '@c8y/ngx-components/services/shared'; import { serviceCommandTabFeatureProvider } from '@c8y/ngx-components/services/service-command-tab'; class LastUpdatedDateCellRendererComponent { constructor(context) { this.context = context; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LastUpdatedDateCellRendererComponent, deps: [{ token: i1.CellRendererContext }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LastUpdatedDateCellRendererComponent, selector: "c8y-last-updated-date-cell-renderer", ngImport: i0, template: `{{ context.value | c8yDate }}`, isInline: true, dependencies: [{ kind: "pipe", type: i1.DatePipe, name: "c8yDate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LastUpdatedDateCellRendererComponent, decorators: [{ type: Component, args: [{ template: `{{ context.value | c8yDate }}`, selector: 'c8y-last-updated-date-cell-renderer' }] }], ctorParameters: () => [{ type: i1.CellRendererContext }] }); class LastUpdatedDateGridColumn extends BaseColumn { constructor(initialColumnConfig) { super(initialColumnConfig); this.path = 'lastUpdated'; this.name = 'lastUpdatedDate'; this.header = gettext('Last updated'); this.cellRendererComponent = LastUpdatedDateCellRendererComponent; this.filterable = true; this.filteringConfig = { fields: [ { type: 'object', key: 'lastUpdated', templateOptions: { label: gettext('Show services updated`between dates`') }, fieldGroup: [ { type: 'date-time', key: 'after', templateOptions: { label: gettext('from`date`') }, expressionProperties: { 'templateOptions.maxDate': (model) => model?.before } }, { type: 'date-time', key: 'before', templateOptions: { label: gettext('to`date`') }, expressionProperties: { 'templateOptions.minDate': (model) => model?.after } } ] } ], formGroup: new FormGroup({}), getFilter: model => { const filter = {}; const dates = model && model.lastUpdated; if (dates && (dates.after || dates.before)) { filter.__and = []; if (dates.after) { const after = this.formatDate(dates.after); filter.__and.push({ 'lastUpdated.date': { __gt: after } }); } if (dates.before) { const before = this.formatDate(dates.before); filter.__and.push({ 'lastUpdated.date': { __lt: before } }); } } return filter; } }; this.sortable = true; this.sortingConfig = { pathSortingConfigs: [{ path: 'lastUpdated.date' }] }; } formatDate(dateToFormat) { return new Date(dateToFormat).toISOString(); } } class ServicesNameCellRendererComponent { constructor(context) { this.context = context; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesNameCellRendererComponent, deps: [{ token: i1.CellRendererContext }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ServicesNameCellRendererComponent, selector: "c8y-services-name-cell-renderer", ngImport: i0, template: ` <a class="interact" [title]="context.item.name" [routerLink]="['/service', context.item.id]"> {{ context.item.name }} </a> `, isInline: true, dependencies: [{ kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesNameCellRendererComponent, decorators: [{ type: Component, args: [{ template: ` <a class="interact" [title]="context.item.name" [routerLink]="['/service', context.item.id]"> {{ context.item.name }} </a> `, selector: 'c8y-services-name-cell-renderer' }] }], ctorParameters: () => [{ type: i1.CellRendererContext }] }); class ServiceNameGridColumn extends BaseColumn { constructor(initialColumnConfig) { super(initialColumnConfig); this.name = 'name'; this.path = 'name'; this.header = gettext('Name'); this.cellRendererComponent = ServicesNameCellRendererComponent; this.filterable = true; this.filteringConfig = { fields: getBasicInputArrayFormFieldConfig({ key: 'names', label: gettext('Filter services by name'), addText: gettext('Add next`name`'), tooltip: gettext('Use * as a wildcard character'), placeholder: gettext('daemon`SERVICE_NAME`') }), getFilter(model) { const filter = {}; if (model.names.length) { filter.name = { __in: model.names }; } return filter; } }; this.sortable = true; this.sortingConfig = { pathSortingConfigs: [{ path: this.path }] }; } } class ServiceTypeGridColumn extends BaseColumn { constructor(initialColumnConfig) { super(initialColumnConfig); this.name = 'serviceType'; this.path = 'serviceType'; this.header = gettext('Type'); this.filterable = true; this.filteringConfig = { fields: getBasicInputArrayFormFieldConfig({ key: 'serviceTypes', label: gettext('Filter services by type'), addText: gettext('Add next`type`'), tooltip: gettext('Use * as a wildcard character'), placeholder: 'systemd' }), getFilter(model) { const filter = {}; if (model.serviceTypes.length) { filter.serviceType = { __in: model.serviceTypes }; } return filter; } }; this.sortable = true; this.sortingConfig = { pathSortingConfigs: [{ path: this.path }] }; } } /** * Extension hook allowing to register custom service statuses and configure their visual presentation. * @deprecated Consider using the `hookServiceStatus` function instead. */ const HOOK_SERVICE_STATUS = new InjectionToken('HOOK_SERVICE_STATUS'); /** * Extension hook allowing to register custom service statuses and configure their visual presentation. * * You can either provide a single `StatusOption` as parameter: * ```typescript * hookServiceStatus(...) * ``` * * Or an array to directly register multiple: * ```typescript * hookServiceStatus([...]) * ``` * * Or you provide an Service that implements `ExtensionFactory<StatusOption>` * ```typescript * export class MyServiceStatusFactory implements ExtensionFactory<StatusOption> {...} * ... * hookServiceStatus(MyServiceStatusFactory) * ``` * A typed alternative to `HOOK_SERVICE_STATUS`. * @param status The `StatusOption`'s or `ExtensionFactory` to be provided. * @returns An `Provider` to be provided in your module. */ function hookServiceStatus(status, options) { return hookGeneric(status, HOOK_SERVICE_STATUS, options); } /** * Standard status options supported by the platform. */ const SERVICE_STATUS_OPTIONS = [ { key: 'up', label: gettext('Up'), icon: 'check-circle', class: 'text-success' }, { key: 'down', label: gettext('Down'), icon: 'exclamation-circle', class: 'text-danger' }, { key: 'unknown', label: gettext('Unknown'), icon: 'inactive-state' } ]; /** * The service for system wide registered service status options. * It provides the standard service statuses plus all custom status options * registered with the <code>HOOK_SERVICE_STATUS</code> extension hook. */ class StatusOptionsService { get options() { return this._options; } constructor(options) { this._options = [...SERVICE_STATUS_OPTIONS, ...flatten(options)]; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StatusOptionsService, deps: [{ token: HOOK_SERVICE_STATUS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StatusOptionsService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StatusOptionsService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: Array, decorators: [{ type: Optional }, { type: Inject, args: [HOOK_SERVICE_STATUS] }] }] }); class ServicesStatusCellRendererComponent { constructor(context, statusOptionsService) { this.context = context; this.statusOptionsService = statusOptionsService; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesStatusCellRendererComponent, deps: [{ token: i1.CellRendererContext }, { token: StatusOptionsService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ServicesStatusCellRendererComponent, selector: "c8y-services-status-cell-renderer", ngImport: i0, template: "<span [ngSwitch]=\"context.item.status\">\n <ng-container *ngFor=\"let option of statusOptionsService.options\">\n <i\n *ngSwitchCase=\"option.key\"\n [c8yIcon]=\"option.icon\"\n class=\"{{ option.class }}\"\n [tooltip]=\"option.label | translate\"\n container=\"body\"\n placement=\"top\"\n ></i>\n </ng-container>\n <i\n *ngSwitchDefault\n c8yIcon=\"job\"\n class=\"text-primary\"\n [tooltip]=\"context.item.status\"\n container=\"body\"\n placement=\"top\"\n ></i>\n</span>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesStatusCellRendererComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-services-status-cell-renderer', template: "<span [ngSwitch]=\"context.item.status\">\n <ng-container *ngFor=\"let option of statusOptionsService.options\">\n <i\n *ngSwitchCase=\"option.key\"\n [c8yIcon]=\"option.icon\"\n class=\"{{ option.class }}\"\n [tooltip]=\"option.label | translate\"\n container=\"body\"\n placement=\"top\"\n ></i>\n </ng-container>\n <i\n *ngSwitchDefault\n c8yIcon=\"job\"\n class=\"text-primary\"\n [tooltip]=\"context.item.status\"\n container=\"body\"\n placement=\"top\"\n ></i>\n</span>\n" }] }], ctorParameters: () => [{ type: i1.CellRendererContext }, { type: StatusOptionsService }] }); class StatusGridColumn extends BaseColumn { constructor(statusOptionsService, initialColumnConfig) { super(initialColumnConfig); this.name = 'status'; this.path = 'status'; this.header = gettext('Status'); this.dataType = "icon" /* ColumnDataType.Icon */; this.cellRendererComponent = ServicesStatusCellRendererComponent; this.filterable = true; this.resizable = false; this.filteringConfig = { fields: [ { key: 'statusOptions', type: 'object', props: { label: gettext('Show devices with status') }, fieldGroup: [ ...statusOptionsService.options.map(option => ({ key: option.key, type: 'switch', props: { label: option.label, optionDataCy: option.key } })) ] }, ...getBasicInputArrayFormFieldConfig({ key: 'custom', label: gettext('or filter by custom status'), addText: gettext('Add next`custom status`'), tooltip: gettext('Use * as a wildcard character'), placeholder: gettext('restarting`SERVICE_STATUS`'), optional: true }) ], getFilter(model) { const filter = {}; filter.status = { __in: [ ...entries(model?.statusOptions || {}) .filter(([_, value]) => !!value) .map(([key, _]) => key), ...model.custom.filter(c => !!c) ] }; return filter; } }; this.sortable = true; this.sortingConfig = { pathSortingConfigs: [{ path: this.path }] }; } } class ServicesDeviceTabComponent { constructor(route, inventoryService, gridService, statusOptionsService, serviceCommand) { this.route = route; this.inventoryService = inventoryService; this.gridService = gridService; this.statusOptionsService = statusOptionsService; this.serviceCommand = serviceCommand; this.deviceId = this.route.snapshot.parent.data.contextData.id; this.sizeRequestDone = false; this.refresh$ = new EventEmitter(); this.pagination = { pageSize: 50, currentPage: 1 }; this.actionControls = []; this.columns = [ new StatusGridColumn(this.statusOptionsService), new ServiceNameGridColumn(), new ServiceTypeGridColumn(), new LastUpdatedDateGridColumn() ]; this.noResultsMessage = gettext('No results to display.'); this.noDataMessage = gettext('No services to display.'); this.noResultsSubtitle = gettext('Refine your search terms or check your spelling.'); this.queriesUtil = new QueriesUtil(); this.serverSideDataCallback = this.onDataSourceModifier.bind(this); this.sizeRequest = this.inventoryService .childAdditionsList(this.deviceId, { query: `type eq ${SERVICE_FRAGMENT}`, withTotalPages: true, pageSize: 1 }) .then(response => { this.sizeRequestDone = true; return response?.paging?.totalPages; }); } async onDataSourceModifier(dataSourceModifier) { const query = this.queriesUtil.buildQuery(this.queriesUtil.addAndFilter(this.gridService.getQueryObj(dataSourceModifier.columns), { type: SERVICE_FRAGMENT })); const dataRequest = this.inventoryService.childAdditionsList(this.deviceId, { query, withTotalPages: true, pageSize: dataSourceModifier.pagination.pageSize, currentPage: dataSourceModifier.pagination.currentPage }); const filtererdSizeRequest = this.inventoryService .childAdditionsList(this.deviceId, { query, withTotalPages: true, pageSize: 1 }) .then(response => response?.paging?.totalPages); const [dataResponse, size, filteredSize] = await Promise.all([ dataRequest, this.sizeRequest, filtererdSizeRequest ]); const { res, data, paging } = dataResponse; const commands = this.serviceCommand.getAllSupportedCommands(data); this.actionControls = this.serviceCommand.generateActionControls(commands); const serverSideDataResult = { res, data, paging, filteredSize, size }; return serverSideDataResult; } trackByName(_index, column) { return column.name; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabComponent, deps: [{ token: i1$1.ActivatedRoute }, { token: i1$2.InventoryService }, { token: i1.DataGridService }, { token: StatusOptionsService }, { token: i5.ServiceCommandService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ServicesDeviceTabComponent, selector: "c8y-services-device-tab", ngImport: i0, template: "<div class=\"content-fullpage\">\n <c8y-data-grid\n [title]=\"'Services' | translate\"\n [refresh]=\"refresh$\"\n [actionControls]=\"actionControls\"\n [pagination]=\"pagination\"\n [columns]=\"columns\"\n [infiniteScroll]=\"'auto'\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-tools'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : null\"\n *emptyStateContext=\"let stats; isLoading as isLoading\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n <ng-container *ngFor=\"let column of columns; trackBy: trackByName\">\n <c8y-column [name]=\"column.name\"></c8y-column>\n </ng-container>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "component", type: i1.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i1.EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-services-device-tab', template: "<div class=\"content-fullpage\">\n <c8y-data-grid\n [title]=\"'Services' | translate\"\n [refresh]=\"refresh$\"\n [actionControls]=\"actionControls\"\n [pagination]=\"pagination\"\n [columns]=\"columns\"\n [infiniteScroll]=\"'auto'\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'c8y-tools'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : null\"\n *emptyStateContext=\"let stats; isLoading as isLoading\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n <ng-container *ngFor=\"let column of columns; trackBy: trackByName\">\n <c8y-column [name]=\"column.name\"></c8y-column>\n </ng-container>\n </c8y-data-grid>\n</div>\n" }] }], ctorParameters: () => [{ type: i1$1.ActivatedRoute }, { type: i1$2.InventoryService }, { type: i1.DataGridService }, { type: StatusOptionsService }, { type: i5.ServiceCommandService }] }); class ServicesDeviceTabGuard { constructor(inventoryService) { this.inventoryService = inventoryService; } canActivate(route) { const id = get(route, 'params.id') || get(route, 'parent.params.id'); return this.inventoryService .childAdditionsList({ id }, { query: `type eq ${SERVICE_FRAGMENT}`, pageSize: 1 }) .then(result => !!result?.data?.length); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabGuard, deps: [{ token: i1$2.InventoryService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabGuard, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabGuard, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1$2.InventoryService }] }); class ServicesBreadcrumbFactory { constructor(inventoryService) { this.inventoryService = inventoryService; } async get(route) { const { context, contextData } = route.snapshot.data; const { routeConfig } = route.snapshot; this.contextData = contextData || this.contextData; if ((context === ViewContext.Service || routeConfig?.context === ViewContext.Service) && !!this.contextData) { const serviceMO = (await this.inventoryService.detail(this.contextData, { withParents: true }))?.data; const breadcrumb = { items: [] }; const breadcrumbItems = []; const device = serviceMO?.additionParents?.references[0]?.managedObject; if (device) { breadcrumbItems.push({ label: gettext('Devices'), icon: 'exchange' }); breadcrumbItems.push({ label: gettext('All devices'), path: '/device' }); breadcrumbItems.push({ label: device.name, path: `/device/${device.id}` }); breadcrumbItems.push({ label: gettext('Services'), path: `/device/${device.id}/services` }); breadcrumbItems.push({ label: serviceMO.name }); const label = routeConfig?.label; if (!!label) { breadcrumbItems.push({ label }); } } breadcrumb.items = breadcrumbItems; return breadcrumb; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesBreadcrumbFactory, deps: [{ token: i1$2.InventoryService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesBreadcrumbFactory }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesBreadcrumbFactory, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1$2.InventoryService }] }); class ServicesDeviceTabModule { static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); } static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabModule, declarations: [ServicesDeviceTabComponent, LastUpdatedDateCellRendererComponent, ServicesNameCellRendererComponent, ServicesStatusCellRendererComponent], imports: [CoreModule, RouterModule, TooltipModule] }); } static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabModule, providers: [ ServicesBreadcrumbFactory, hookRoute({ context: ViewContext.Device, path: 'services', component: ServicesDeviceTabComponent, label: gettext('Services'), icon: 'statistics', priority: 500, canActivate: [ServicesDeviceTabGuard] }), hookBreadcrumb(ServicesBreadcrumbFactory) ], imports: [CoreModule, RouterModule, TooltipModule] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesDeviceTabModule, decorators: [{ type: NgModule, args: [{ imports: [CoreModule, RouterModule, TooltipModule], declarations: [ ServicesDeviceTabComponent, LastUpdatedDateCellRendererComponent, ServicesNameCellRendererComponent, ServicesStatusCellRendererComponent ], providers: [ ServicesBreadcrumbFactory, hookRoute({ context: ViewContext.Device, path: 'services', component: ServicesDeviceTabComponent, label: gettext('Services'), icon: 'statistics', priority: 500, canActivate: [ServicesDeviceTabGuard] }), hookBreadcrumb(ServicesBreadcrumbFactory) ] }] }] }); class ServicesModule { static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); } static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: ServicesModule, imports: [CoreModule, ServicesDeviceTabModule] }); } static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesModule, providers: [serviceCommandTabFeatureProvider], imports: [CoreModule, ServicesDeviceTabModule] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServicesModule, decorators: [{ type: NgModule, args: [{ providers: [serviceCommandTabFeatureProvider], imports: [CoreModule, ServicesDeviceTabModule] }] }] }); /** * Generated bundle index. Do not edit. */ export { HOOK_SERVICE_STATUS, LastUpdatedDateCellRendererComponent, LastUpdatedDateGridColumn, SERVICE_STATUS_OPTIONS, ServiceNameGridColumn, ServiceTypeGridColumn, ServicesBreadcrumbFactory, ServicesDeviceTabComponent, ServicesDeviceTabGuard, ServicesDeviceTabModule, ServicesModule, ServicesNameCellRendererComponent, ServicesStatusCellRendererComponent, StatusGridColumn, StatusOptionsService, hookServiceStatus }; //# sourceMappingURL=c8y-ngx-components-services.mjs.map