@c8y/ngx-components 1010.0.12 → 1010.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/bundles/c8y-ngx-components-search.umd.js +34 -3
  2. package/bundles/c8y-ngx-components-search.umd.js.map +1 -1
  3. package/bundles/c8y-ngx-components-search.umd.min.js +1 -1
  4. package/bundles/c8y-ngx-components-search.umd.min.js.map +1 -1
  5. package/bundles/c8y-ngx-components.umd.js +16 -13
  6. package/bundles/c8y-ngx-components.umd.js.map +1 -1
  7. package/bundles/c8y-ngx-components.umd.min.js +1 -1
  8. package/bundles/c8y-ngx-components.umd.min.js.map +1 -1
  9. package/c8y-ngx-components.metadata.json +1 -1
  10. package/core/data-grid/data-grid.model.d.ts +4 -0
  11. package/core/product-experience/gainsight.service.d.ts +5 -5
  12. package/esm2015/core/data-grid/data-grid.component.js +2 -2
  13. package/esm2015/core/data-grid/data-grid.model.js +1 -1
  14. package/esm2015/core/data-grid/grid-data-source.js +2 -2
  15. package/esm2015/core/product-experience/gainsight.service.js +14 -11
  16. package/esm2015/core/product-experience/product-experience.module.js +2 -2
  17. package/esm2015/search/search-grid.component.js +25 -4
  18. package/esm2015/search/search-results.component.js +12 -2
  19. package/esm2015/search/search.service.js +1 -1
  20. package/esm5/core/data-grid/data-grid.component.js +2 -2
  21. package/esm5/core/data-grid/data-grid.model.js +1 -1
  22. package/esm5/core/data-grid/grid-data-source.js +2 -2
  23. package/esm5/core/product-experience/gainsight.service.js +14 -11
  24. package/esm5/core/product-experience/product-experience.module.js +2 -2
  25. package/esm5/search/search-grid.component.js +25 -4
  26. package/esm5/search/search-results.component.js +13 -2
  27. package/esm5/search/search.service.js +1 -1
  28. package/fesm2015/c8y-ngx-components-search.js +35 -5
  29. package/fesm2015/c8y-ngx-components-search.js.map +1 -1
  30. package/fesm2015/c8y-ngx-components.js +16 -13
  31. package/fesm2015/c8y-ngx-components.js.map +1 -1
  32. package/fesm5/c8y-ngx-components-search.js +36 -5
  33. package/fesm5/c8y-ngx-components-search.js.map +1 -1
  34. package/fesm5/c8y-ngx-components.js +16 -13
  35. package/fesm5/c8y-ngx-components.js.map +1 -1
  36. package/locales/ja_JP.po +5 -5
  37. package/locales/locales.pot +6 -0
  38. package/package.json +2 -2
  39. package/search/c8y-ngx-components-search.metadata.json +1 -1
  40. package/search/search-grid.component.d.ts +2 -1
  41. package/search/search-results.component.d.ts +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-search.js","sources":["ng://@c8y/ngx-components/search/search.service.ts","ng://@c8y/ngx-components/search/search-box.component.ts","ng://@c8y/ngx-components/search/search-grid.component.ts","ng://@c8y/ngx-components/search/search-results.component.ts","ng://@c8y/ngx-components/search/search.module.ts","ng://@c8y/ngx-components/search/c8y-ngx-components-search.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { Pagination } from '@c8y/ngx-components';\nimport { SubAssetsService } from '@c8y/ngx-components/sub-assets';\nimport { find, get, isUndefined, some } from 'lodash-es';\n\n@Injectable()\nexport class SearchService extends SubAssetsService {\n protected GRID_CONFIG_STORAGE_KEY = 'search-grid-config';\n protected DEFAULT_PAGE_SIZE = 50;\n private readonly FRAGMENTS_FOR_NO_DEVICE = [\n 'c8y_Dashboard',\n 'c8y_Report',\n 'c8y_Kpi',\n 'c8y_ExportConfiguration',\n 'c8y_IsBinary',\n 'c8y_NoDevice',\n 'c8y_IsDeviceGroup',\n 'c8y_Group',\n 'com_cumulocity_model_smartrest_SmartRestTemplate',\n 'com_cumulocity_model_devicesimulator_SensorTemplate',\n '_attachments',\n 'c8y_IsDeviceType',\n 'c8y_objectmapping_ObjectMapping'\n ];\n private readonly TYPES_FOR_NO_DEVICE = [\n 'c8y_ConfigurationDump',\n 'c8y_Firmware',\n 'c8y_SmartRule',\n 'c8y_Software',\n 'impact_object_mapping',\n 'c8y_UserPreference',\n 'c8y_TenantPolicy',\n 'c8y_PrivateSmartRule',\n 'c8y_SmartRest2Template',\n 'c8y_JsonSchema',\n 'c8y_DeviceShellTemplate',\n 'c8y_DemoStatus',\n 'c8y_DataBroker',\n 'c8y_Application_',\n 'brandingVariables',\n 'c8y_DeviceSimulator',\n 'c8y_CertificateMetadata',\n 'lwm2m_post_registration',\n 'c8y_microservice_manifest_',\n 'c8y_CepAgent'\n ];\n private readonly DEVICE_FRAGMENT_TYPE = 'c8y_IsDevice';\n\n /**\n * Will return only valid assets (groups and devices) and filter out\n * none useful inventories (e.g. c8y_JsonSchema).\n * @param data All managed objects that should be filtered.\n */\n filterOnlyAssets(data: IManagedObject[]) {\n return data.filter(mo => mo.c8y_IsDeviceGroup || this.isAnyDevice(mo));\n }\n\n buildCombinedRootQueryFilter(columns, pagination) {\n const rootQuery = {\n __filter: {\n __and: { __not: { __has: `c8y_IsBinary` } }\n }\n };\n const userQuery = this.getQueryObj(columns, pagination);\n const queryPart = this.queriesUtil.addOrderbys(rootQuery, userQuery.__orderby, 'append');\n const fullQuery = this.queriesUtil.addAndFilter(queryPart, userQuery.__filter);\n return this.queriesUtil.buildQuery(fullQuery);\n }\n\n /**\n * Returns the full-text search results.\n *\n * @param term The search term.\n */\n search(term: string) {\n return this.inventoryService.list({\n text: term,\n withTotalPages: true,\n pageSize: this.DEFAULT_PAGE_SIZE,\n withChildren: false\n });\n }\n\n private isRootDevice(mo) {\n return !!mo[this.DEVICE_FRAGMENT_TYPE];\n }\n\n private isAnyDevice(mo) {\n const isDevice = this.isRootDevice(mo) || !this.hasFragmentOrTypeFromBlacklist(mo);\n return isDevice;\n }\n\n private hasFragmentOrTypeFromBlacklist(mo) {\n return this.hasTypeFromBlacklist(mo) || this.hasFragmentFromBlacklist(mo);\n }\n\n private hasTypeFromBlacklist(mo) {\n const moType = get(mo, 'type', '');\n return some(this.TYPES_FOR_NO_DEVICE, type => moType.includes(type));\n }\n\n private hasFragmentFromBlacklist(mo) {\n return find(this.FRAGMENTS_FOR_NO_DEVICE, f => !isUndefined(mo[f]));\n }\n}\n","import { Component, ViewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { IManagedObject, InventoryService, IResultList, Paging } from '@c8y/client';\nimport { TypeaheadComponent } from '@c8y/ngx-components';\nimport { DeviceGridService } from '@c8y/ngx-components/device-grid';\nimport { BsDropdownDirective } from 'ngx-bootstrap/dropdown';\nimport { defer, empty, merge, Observable, of, pipe } from 'rxjs';\nimport { map, switchMap, tap } from 'rxjs/operators';\nimport { SearchService } from './search.service';\n\n@Component({\n selector: 'c8y-search-box',\n templateUrl: './search-box.component.html'\n})\nexport class SearchBoxComponent {\n term = '';\n selected;\n filterPipe = pipe(\n map((data: IManagedObject[]) => {\n return this.searchService.filterOnlyAssets(data);\n })\n );\n results$: Observable<IResultList<IManagedObject>>;\n recentSearchResults: IManagedObject[] = [];\n recentlyRegisteredResults$: Observable<IResultList<IManagedObject>>;\n isLoading = false;\n noMatch = false;\n\n private readonly RECENT_SEARCH_STORAGE_KEY = 'recent_search_view';\n private readonly MAX_RECENT_SEARCH_RESULTS = 5;\n private readonly DEFAULT_FILTER: object = {\n withTotalPages: true,\n pageSize: 5,\n withChildren: false\n };\n private readonly KEYCODE_ENTER = 13;\n private readonly KEYCODE_ESC = 27;\n\n @ViewChild(TypeaheadComponent, { static: false })\n private typeahead: TypeaheadComponent;\n\n @ViewChild('dropdown', { static: false })\n private dropdown: BsDropdownDirective;\n\n constructor(\n private router: Router,\n private inventory: InventoryService,\n private deviceGridService: DeviceGridService,\n private searchService: SearchService\n ) {}\n\n async ngOnInit() {\n const recentSearchIds = JSON.parse(localStorage.getItem(this.RECENT_SEARCH_STORAGE_KEY));\n if (recentSearchIds && recentSearchIds.length > 0) {\n const { data } = await this.inventory.list({ ids: recentSearchIds.join(',') });\n this.recentSearchResults = data;\n this.recentlyRegisteredResults$ = defer(() =>\n this.inventory.list({\n q: '$orderby=creationTime desc',\n ...this.DEFAULT_FILTER\n })\n );\n }\n }\n\n onOpenChange(isOpen: boolean): void {\n if (isOpen) {\n // needs to request an animation frame as\n // otherwise the typeahead is undefined\n requestAnimationFrame(() => {\n this.subscribeOnSearch();\n this.typeahead.dropdown.show();\n this.typeahead.searchControl.nativeElement.focus();\n });\n }\n }\n\n open(event: Event, mo: IManagedObject) {\n event.stopPropagation();\n const isAlreadyRecent = this.recentSearchResults.find(({ id }) => id === mo.id);\n if (!isAlreadyRecent) {\n this.recentSearchResults.unshift(mo);\n this.recentSearchResults = this.recentSearchResults.slice(0, this.MAX_RECENT_SEARCH_RESULTS);\n }\n const recentSearchIds = this.recentSearchResults.map(({ id }) => id);\n localStorage.setItem(this.RECENT_SEARCH_STORAGE_KEY, JSON.stringify(recentSearchIds));\n this.router.navigateByUrl(this.deviceGridService.getHref(mo, '/'));\n this.dropdown.hide();\n }\n\n reset() {\n this.typeahead.onSearch.emit('');\n this.selected = undefined;\n this.typeahead.searchControl.nativeElement.focus();\n }\n\n keyDown(event: KeyboardEvent) {\n const keyCode = event.keyCode;\n if (keyCode === this.KEYCODE_ENTER) {\n // enter hit can be faster then typeahead debounce,\n // therefore we take the term from the DOM element\n // itself:\n const searchTerm = (event.target as any).value;\n this.navigate(['/assetsearch'], { queryParams: { search: searchTerm } });\n this.dropdown.hide();\n } else if (keyCode === this.KEYCODE_ESC) {\n if (this.term === '') {\n this.dropdown.hide();\n }\n this.reset();\n }\n }\n\n filter(on) {\n this.navigate(['/assetsearch'], { queryParams: { filter: on } });\n this.dropdown.hide();\n }\n\n openSearch() {\n this.router.navigateByUrl('/assetsearch');\n this.dropdown.hide();\n }\n\n private subscribeOnSearch() {\n if (!this.results$) {\n this.results$ = this.typeahead.onSearch.pipe(\n tap(term => this.onTypingStarted(term)),\n switchMap(term => this.mergeRequest(term))\n );\n }\n }\n\n private navigate(commands, extras?) {\n this.router\n .navigateByUrl('/', { skipLocationChange: true })\n .then(() => this.router.navigate(commands, extras));\n }\n\n private mergeRequest(term: string): Observable<IResultList<IManagedObject>> {\n return merge(\n of({ data: [] } as IResultList<IManagedObject>),\n this.queryInventoryService(term).pipe(\n tap(({ data, paging }) => this.onLoadingDone(data, paging))\n )\n );\n }\n\n private queryInventoryService(term: string) {\n if (term) {\n return defer(() => this.searchService.search(term));\n }\n return empty();\n }\n\n private onLoadingDone(data: IManagedObject[], paging: Paging<IManagedObject>) {\n this.isLoading = false;\n this.noMatch =\n paging && paging.nextPage === null && this.searchService.filterOnlyAssets(data).length === 0;\n }\n\n private onTypingStarted(term) {\n this.noMatch = false;\n this.term = term;\n this.isLoading = term.length > 0;\n }\n}\n","import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport {\n ActionControl,\n BuiltInActionType,\n BulkActionControl,\n DataGridComponent,\n DataSourceModifier,\n FilteringActionType,\n FilteringModifier,\n gettext,\n Pagination,\n Row,\n ServerSideDataResult\n} from '@c8y/ngx-components';\nimport { DeviceGridColumn } from '@c8y/ngx-components/device-grid';\nimport { IManagedObject, SmartGroupsService } from '@c8y/client';\nimport { SearchService } from './search.service';\nimport {\n DeleteAssetsModalComponent,\n DeleteModalCheckboxes,\n SubAssetsService\n} from '@c8y/ngx-components/sub-assets';\nimport { BsModalService } from 'ngx-bootstrap/modal';\n\n@Component({\n selector: 'c8y-search-grid',\n templateUrl: './search-grid.component.html'\n})\nexport class SearchGridComponent {\n @Input('parent-group') parentGroup: IManagedObject;\n @Input() title: string = '';\n @Input() loadingItemsLabel: string = gettext('Loading results…');\n @Input('columns') set _columns(value: DeviceGridColumn[]) {\n if (value) {\n this.columns = value;\n } else {\n this.columns = this.searchService.getDefaultColumns();\n }\n }\n @Input('pagination') set _pagination(value: Pagination) {\n if (value) {\n this.pagination = value;\n } else {\n this.pagination = this.searchService.getDefaultPagination();\n }\n }\n @Input('actionControls') set _actionControls(value: ActionControl[]) {\n if (value) {\n this.actionControls = value;\n } else {\n this.actionControls = this.searchService.getDefaultActionControls();\n }\n }\n @Input() selectable: boolean = false;\n @Input('bulkActionControls') set _bulkActionControls(value: BulkActionControl[]) {\n if (value) {\n this.bulkActionControls = value;\n } else {\n this.bulkActionControls = this.searchService.getDefaultBulkActionControls();\n }\n }\n @Output() onColumnsChange: EventEmitter<DeviceGridColumn[]> = new EventEmitter<\n DeviceGridColumn[]\n >();\n\n @Input()\n searchText = '';\n\n columns: DeviceGridColumn[] = this.searchService.getDefaultColumns();\n pagination: Pagination = this.searchService.getDefaultPagination();\n actionControls: ActionControl[];\n bulkActionControls: BulkActionControl[] = this.searchService.getDefaultBulkActionControls();\n serverSideDataCallback: any;\n refresh: EventEmitter<any> = new EventEmitter();\n\n @ViewChild(DataGridComponent, { static: true })\n dataGrid: DataGridComponent;\n\n private sizeCount = 0;\n\n constructor(\n public searchService: SearchService,\n private bsModalService: BsModalService,\n private smartGroupsService: SmartGroupsService,\n private subAssetsGridService: SubAssetsService\n ) {}\n\n ngAfterViewInit(): void {\n this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n this.setActionControls();\n }\n\n trackByName(_index, column: DeviceGridColumn): string {\n return column.name;\n }\n\n async onDataSourceModifier(\n dataSourceModifier: DataSourceModifier\n ): Promise<ServerSideDataResult> {\n let response;\n if (dataSourceModifier.searchText) {\n response = await this.searchService.search(dataSourceModifier.searchText);\n } else {\n response = await this.searchService.getData(\n dataSourceModifier.columns,\n dataSourceModifier.pagination,\n undefined\n );\n }\n const { res, data, paging } = response;\n const filteredData = this.searchService.filterOnlyAssets(data);\n\n if (paging.currentPage === 1) {\n this.sizeCount = 0;\n }\n this.sizeCount += filteredData.length;\n this.onColumnsChange.emit(dataSourceModifier.columns);\n\n return {\n res,\n data: filteredData,\n paging,\n filteredSize: this.sizeCount,\n size: undefined\n };\n }\n\n setActionControls() {\n const actionControls: ActionControl[] = [];\n const deleteAction: ActionControl = {\n type: BuiltInActionType.Delete,\n callback: (asset: Row) => this.onDeleteAsset(asset as IManagedObject, this.parentGroup)\n };\n actionControls.push(deleteAction);\n if (!this.actionControls) {\n this.actionControls = actionControls;\n }\n }\n\n updateFiltering(\n columnNames: string[],\n action: {\n type: FilteringActionType;\n payload?: { filteringModifier: FilteringModifier };\n }\n ) {\n const { type } = action;\n if (type === FilteringActionType.ResetFilter) {\n this.dataGrid.clearFilters();\n } else {\n this.dataGrid.updateFiltering(columnNames, action);\n }\n }\n\n configChange(config) {\n this.searchService.saveConfig(config);\n }\n\n private onDeleteAsset(asset, parentRef) {\n const initialState = {\n showWithDeviceUserCheckbox: this.subAssetsGridService.shouldShowWithDeviceUserCheckbox(asset),\n asset,\n showWithCascadeCheckbox:\n !this.smartGroupsService.isSmartGroup(asset) &&\n !this.smartGroupsService.isSmartGroupV2(asset)\n };\n\n const modalRef = this.bsModalService.show(DeleteAssetsModalComponent, { initialState });\n\n modalRef.content.closeSubject.subscribe(async (result: DeleteModalCheckboxes) => {\n if (result) {\n await this.subAssetsGridService.deleteAsset(asset, parentRef, result);\n this.refresh.emit();\n }\n });\n }\n}\n","import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { SearchGridComponent } from './search-grid.component';\nimport { FilteringActionType, AlertService, Status, gettext, Alert } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-search-results',\n templateUrl: './search-results.component.html'\n})\nexport class SearchResultsComponent implements OnDestroy {\n filter: string = '';\n searchTerm: string = '';\n @ViewChild(SearchGridComponent, { static: true })\n searchGrid: SearchGridComponent;\n\n private unsubscribe$ = new Subject<any>();\n\n constructor(private route: ActivatedRoute, private alert: AlertService) {}\n\n ngAfterViewInit(): void {\n this.route.queryParams\n .pipe(takeUntil(this.unsubscribe$))\n .subscribe(({ filter, search }) => this.onQueryParamsChange(filter, search));\n\n this.searchGrid.dataGrid.searchText$.pipe(takeUntil(this.unsubscribe$)).subscribe(text => {\n if (text) {\n this.resetFilter();\n }\n this.searchTerm = text;\n });\n\n this.searchGrid.dataGrid.onFilter\n .pipe(takeUntil(this.unsubscribe$))\n .subscribe(() => this.resetSearch());\n\n // to prevent race condition (search empty):\n this.searchTerm = this.route.snapshot.queryParams.search || '';\n }\n\n resetSearch() {\n this.searchTerm = '';\n if (this.searchTerm) {\n this.alert.add({\n text: gettext('Search reset. Full text search does not support filtering.'),\n type: Status.WARNING,\n timeout: 5000\n } as Alert);\n }\n }\n\n resetFilter() {\n this.filter = '';\n if (this.searchGrid.dataGrid.filteringApplied) {\n this.alert.add({\n text: gettext('Filter reset. Full text search does not support filtering.'),\n type: Status.WARNING,\n timeout: 5000\n } as Alert);\n this.searchGrid.dataGrid.clearFilters();\n }\n }\n\n ngOnDestroy() {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n\n private onQueryParamsChange(filter: string, searchTerm: string) {\n if (!this.shouldFilter(filter) && searchTerm) {\n this.search(searchTerm);\n }\n }\n\n private shouldFilter(filter) {\n if (!filter) {\n return false;\n }\n this.resetSearch();\n this.filter = filter || '';\n this.searchGrid.updateFiltering(['name'], {\n type: FilteringActionType.ApplyFilter,\n payload: {\n filteringModifier: {\n externalFilterQuery: {\n names: [this.filter]\n }\n }\n }\n });\n return true;\n }\n\n private search(searchTerm: string) {\n this.searchTerm = searchTerm || '';\n this.searchGrid.dataGrid.searchText$.next(this.searchTerm);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CoreModule, HOOK_ONCE_ROUTE, HOOK_SEARCH, Search } from '@c8y/ngx-components';\nimport { DeviceGridModule } from '@c8y/ngx-components/device-grid';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { SearchBoxComponent } from './search-box.component';\nimport { SearchResultsComponent } from './search-results.component';\nimport { SearchGridComponent } from './search-grid.component';\nimport { SearchService } from './search.service';\n\n@NgModule({\n declarations: [SearchResultsComponent, SearchBoxComponent, SearchGridComponent],\n imports: [CoreModule, DeviceGridModule, BsDropdownModule],\n entryComponents: [SearchResultsComponent, SearchBoxComponent],\n exports: [SearchResultsComponent, SearchBoxComponent, SearchGridComponent],\n providers: [\n SearchService,\n {\n provide: HOOK_ONCE_ROUTE,\n useValue: [\n {\n path: 'assetsearch',\n component: SearchResultsComponent\n }\n ],\n multi: true\n },\n {\n provide: HOOK_SEARCH,\n useValue: [\n {\n template: SearchBoxComponent\n }\n ] as Search[],\n multi: true\n }\n ]\n})\nexport class SearchModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tslib_1.__decorate"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-search.js","sources":["ng://@c8y/ngx-components/search/search.service.ts","ng://@c8y/ngx-components/search/search-box.component.ts","ng://@c8y/ngx-components/search/search-grid.component.ts","ng://@c8y/ngx-components/search/search-results.component.ts","ng://@c8y/ngx-components/search/search.module.ts","ng://@c8y/ngx-components/search/c8y-ngx-components-search.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { SubAssetsService } from '@c8y/ngx-components/sub-assets';\nimport { find, get, isUndefined, some } from 'lodash-es';\n\n@Injectable()\nexport class SearchService extends SubAssetsService {\n protected GRID_CONFIG_STORAGE_KEY = 'search-grid-config';\n protected DEFAULT_PAGE_SIZE = 50;\n private readonly FRAGMENTS_FOR_NO_DEVICE = [\n 'c8y_Dashboard',\n 'c8y_Report',\n 'c8y_Kpi',\n 'c8y_ExportConfiguration',\n 'c8y_IsBinary',\n 'c8y_NoDevice',\n 'c8y_IsDeviceGroup',\n 'c8y_Group',\n 'com_cumulocity_model_smartrest_SmartRestTemplate',\n 'com_cumulocity_model_devicesimulator_SensorTemplate',\n '_attachments',\n 'c8y_IsDeviceType',\n 'c8y_objectmapping_ObjectMapping'\n ];\n private readonly TYPES_FOR_NO_DEVICE = [\n 'c8y_ConfigurationDump',\n 'c8y_Firmware',\n 'c8y_SmartRule',\n 'c8y_Software',\n 'impact_object_mapping',\n 'c8y_UserPreference',\n 'c8y_TenantPolicy',\n 'c8y_PrivateSmartRule',\n 'c8y_SmartRest2Template',\n 'c8y_JsonSchema',\n 'c8y_DeviceShellTemplate',\n 'c8y_DemoStatus',\n 'c8y_DataBroker',\n 'c8y_Application_',\n 'brandingVariables',\n 'c8y_DeviceSimulator',\n 'c8y_CertificateMetadata',\n 'lwm2m_post_registration',\n 'c8y_microservice_manifest_',\n 'c8y_CepAgent'\n ];\n private readonly DEVICE_FRAGMENT_TYPE = 'c8y_IsDevice';\n\n /**\n * Will return only valid assets (groups and devices) and filter out\n * none useful inventories (e.g. c8y_JsonSchema).\n * @param data All managed objects that should be filtered.\n */\n filterOnlyAssets(data: IManagedObject[]) {\n return data.filter(mo => mo.c8y_IsDeviceGroup || this.isAnyDevice(mo));\n }\n\n buildCombinedRootQueryFilter(columns, pagination) {\n const rootQuery = {\n __filter: {\n __and: { __not: { __has: `c8y_IsBinary` } }\n }\n };\n const userQuery = this.getQueryObj(columns, pagination);\n const queryPart = this.queriesUtil.addOrderbys(rootQuery, userQuery.__orderby, 'append');\n const fullQuery = this.queriesUtil.addAndFilter(queryPart, userQuery.__filter);\n return this.queriesUtil.buildQuery(fullQuery);\n }\n\n /**\n * Returns the full-text search results.\n *\n * @param term The search term.\n */\n search(term: string) {\n return this.inventoryService.list({\n text: term,\n withTotalPages: true,\n pageSize: this.DEFAULT_PAGE_SIZE,\n withChildren: false\n });\n }\n\n private isRootDevice(mo) {\n return !!mo[this.DEVICE_FRAGMENT_TYPE];\n }\n\n private isAnyDevice(mo) {\n const isDevice = this.isRootDevice(mo) || !this.hasFragmentOrTypeFromBlacklist(mo);\n return isDevice;\n }\n\n private hasFragmentOrTypeFromBlacklist(mo) {\n return this.hasTypeFromBlacklist(mo) || this.hasFragmentFromBlacklist(mo);\n }\n\n private hasTypeFromBlacklist(mo) {\n const moType = get(mo, 'type', '');\n return some(this.TYPES_FOR_NO_DEVICE, type => moType.includes(type));\n }\n\n private hasFragmentFromBlacklist(mo) {\n return find(this.FRAGMENTS_FOR_NO_DEVICE, f => !isUndefined(mo[f]));\n }\n}\n","import { Component, ViewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { IManagedObject, InventoryService, IResultList, Paging } from '@c8y/client';\nimport { TypeaheadComponent } from '@c8y/ngx-components';\nimport { DeviceGridService } from '@c8y/ngx-components/device-grid';\nimport { BsDropdownDirective } from 'ngx-bootstrap/dropdown';\nimport { defer, empty, merge, Observable, of, pipe } from 'rxjs';\nimport { map, switchMap, tap } from 'rxjs/operators';\nimport { SearchService } from './search.service';\n\n@Component({\n selector: 'c8y-search-box',\n templateUrl: './search-box.component.html'\n})\nexport class SearchBoxComponent {\n term = '';\n selected;\n filterPipe = pipe(\n map((data: IManagedObject[]) => {\n return this.searchService.filterOnlyAssets(data);\n })\n );\n results$: Observable<IResultList<IManagedObject>>;\n recentSearchResults: IManagedObject[] = [];\n recentlyRegisteredResults$: Observable<IResultList<IManagedObject>>;\n isLoading = false;\n noMatch = false;\n\n private readonly RECENT_SEARCH_STORAGE_KEY = 'recent_search_view';\n private readonly MAX_RECENT_SEARCH_RESULTS = 5;\n private readonly DEFAULT_FILTER: object = {\n withTotalPages: true,\n pageSize: 5,\n withChildren: false\n };\n private readonly KEYCODE_ENTER = 13;\n private readonly KEYCODE_ESC = 27;\n\n @ViewChild(TypeaheadComponent, { static: false })\n private typeahead: TypeaheadComponent;\n\n @ViewChild('dropdown', { static: false })\n private dropdown: BsDropdownDirective;\n\n constructor(\n private router: Router,\n private inventory: InventoryService,\n private deviceGridService: DeviceGridService,\n private searchService: SearchService\n ) {}\n\n async ngOnInit() {\n const recentSearchIds = JSON.parse(localStorage.getItem(this.RECENT_SEARCH_STORAGE_KEY));\n if (recentSearchIds && recentSearchIds.length > 0) {\n const { data } = await this.inventory.list({ ids: recentSearchIds.join(',') });\n this.recentSearchResults = data;\n this.recentlyRegisteredResults$ = defer(() =>\n this.inventory.list({\n q: '$orderby=creationTime desc',\n ...this.DEFAULT_FILTER\n })\n );\n }\n }\n\n onOpenChange(isOpen: boolean): void {\n if (isOpen) {\n // needs to request an animation frame as\n // otherwise the typeahead is undefined\n requestAnimationFrame(() => {\n this.subscribeOnSearch();\n this.typeahead.dropdown.show();\n this.typeahead.searchControl.nativeElement.focus();\n });\n }\n }\n\n open(event: Event, mo: IManagedObject) {\n event.stopPropagation();\n const isAlreadyRecent = this.recentSearchResults.find(({ id }) => id === mo.id);\n if (!isAlreadyRecent) {\n this.recentSearchResults.unshift(mo);\n this.recentSearchResults = this.recentSearchResults.slice(0, this.MAX_RECENT_SEARCH_RESULTS);\n }\n const recentSearchIds = this.recentSearchResults.map(({ id }) => id);\n localStorage.setItem(this.RECENT_SEARCH_STORAGE_KEY, JSON.stringify(recentSearchIds));\n this.router.navigateByUrl(this.deviceGridService.getHref(mo, '/'));\n this.dropdown.hide();\n }\n\n reset() {\n this.typeahead.onSearch.emit('');\n this.selected = undefined;\n this.typeahead.searchControl.nativeElement.focus();\n }\n\n keyDown(event: KeyboardEvent) {\n const keyCode = event.keyCode;\n if (keyCode === this.KEYCODE_ENTER) {\n // enter hit can be faster then typeahead debounce,\n // therefore we take the term from the DOM element\n // itself:\n const searchTerm = (event.target as any).value;\n this.navigate(['/assetsearch'], { queryParams: { search: searchTerm } });\n this.dropdown.hide();\n } else if (keyCode === this.KEYCODE_ESC) {\n if (this.term === '') {\n this.dropdown.hide();\n }\n this.reset();\n }\n }\n\n filter(on) {\n this.navigate(['/assetsearch'], { queryParams: { filter: on } });\n this.dropdown.hide();\n }\n\n openSearch() {\n this.router.navigateByUrl('/assetsearch');\n this.dropdown.hide();\n }\n\n private subscribeOnSearch() {\n if (!this.results$) {\n this.results$ = this.typeahead.onSearch.pipe(\n tap(term => this.onTypingStarted(term)),\n switchMap(term => this.mergeRequest(term))\n );\n }\n }\n\n private navigate(commands, extras?) {\n this.router\n .navigateByUrl('/', { skipLocationChange: true })\n .then(() => this.router.navigate(commands, extras));\n }\n\n private mergeRequest(term: string): Observable<IResultList<IManagedObject>> {\n return merge(\n of({ data: [] } as IResultList<IManagedObject>),\n this.queryInventoryService(term).pipe(\n tap(({ data, paging }) => this.onLoadingDone(data, paging))\n )\n );\n }\n\n private queryInventoryService(term: string) {\n if (term) {\n return defer(() => this.searchService.search(term));\n }\n return empty();\n }\n\n private onLoadingDone(data: IManagedObject[], paging: Paging<IManagedObject>) {\n this.isLoading = false;\n this.noMatch =\n paging && paging.nextPage === null && this.searchService.filterOnlyAssets(data).length === 0;\n }\n\n private onTypingStarted(term) {\n this.noMatch = false;\n this.term = term;\n this.isLoading = term.length > 0;\n }\n}\n","import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport {\n ActionControl,\n BuiltInActionType,\n BulkActionControl,\n DataGridComponent,\n DataSourceModifier,\n FilteringActionType,\n FilteringModifier,\n gettext,\n Pagination,\n Row,\n ServerSideDataResult\n} from '@c8y/ngx-components';\nimport { DeviceGridColumn } from '@c8y/ngx-components/device-grid';\nimport { IManagedObject, SmartGroupsService } from '@c8y/client';\nimport { SearchService } from './search.service';\nimport {\n AssetTypeGridColumn,\n DeleteAssetsModalComponent,\n DeleteModalCheckboxes,\n SubAssetsService\n} from '@c8y/ngx-components/sub-assets';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport {\n AlarmsDeviceGridColumn,\n DeviceGridService,\n ImeiDeviceGridColumn,\n ModelDeviceGridColumn,\n NameDeviceGridColumn,\n RegistrationDateDeviceGridColumn,\n SerialNumberDeviceGridColumn,\n SystemIdDeviceGridColumn\n} from '@c8y/ngx-components/device-grid';\n\n@Component({\n selector: 'c8y-search-grid',\n templateUrl: './search-grid.component.html'\n})\nexport class SearchGridComponent {\n @Input('parent-group') parentGroup: IManagedObject;\n @Input() title: string = '';\n @Input() loadingItemsLabel: string = gettext('Loading results…');\n @Input('columns') set _columns(value: DeviceGridColumn[]) {\n if (value) {\n this.columns = value;\n } else {\n this.columns = this.searchService.getDefaultColumns();\n }\n }\n @Input('pagination') set _pagination(value: Pagination) {\n if (value) {\n this.pagination = value;\n } else {\n this.pagination = this.searchService.getDefaultPagination();\n }\n }\n @Input('actionControls') set _actionControls(value: ActionControl[]) {\n if (value) {\n this.actionControls = value;\n } else {\n this.actionControls = this.searchService.getDefaultActionControls();\n }\n }\n @Input() selectable: boolean = false;\n @Input('bulkActionControls') set _bulkActionControls(value: BulkActionControl[]) {\n if (value) {\n this.bulkActionControls = value;\n } else {\n this.bulkActionControls = this.searchService.getDefaultBulkActionControls();\n }\n }\n @Output() onColumnsChange: EventEmitter<DeviceGridColumn[]> = new EventEmitter<\n DeviceGridColumn[]\n >();\n\n @Input()\n searchText = '';\n\n @Input()\n filteringName: string;\n\n columns: DeviceGridColumn[];\n pagination: Pagination = this.searchService.getDefaultPagination();\n actionControls: ActionControl[];\n bulkActionControls: BulkActionControl[] = this.searchService.getDefaultBulkActionControls();\n serverSideDataCallback: any;\n refresh: EventEmitter<any> = new EventEmitter();\n\n @ViewChild(DataGridComponent, { static: true })\n dataGrid: DataGridComponent;\n\n private sizeCount = 0;\n\n constructor(\n public searchService: SearchService,\n private bsModalService: BsModalService,\n private smartGroupsService: SmartGroupsService,\n private subAssetsGridService: SubAssetsService\n ) {}\n\n ngOnInit(): void {\n if (!this.filteringName) {\n this.columns = this.searchService.getDefaultColumns();\n } else {\n this.columns = [\n new AssetTypeGridColumn({ sortOrder: 'desc' }),\n new NameDeviceGridColumn({\n sortOrder: 'asc',\n filter: { externalFilterQuery: { names: [this.filteringName] } }\n }),\n new ModelDeviceGridColumn(),\n new SerialNumberDeviceGridColumn({ visible: false }),\n new RegistrationDateDeviceGridColumn({ visible: false }),\n new SystemIdDeviceGridColumn({ visible: false }),\n new ImeiDeviceGridColumn({ visible: false }),\n new AlarmsDeviceGridColumn()\n ];\n }\n this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n this.setActionControls();\n }\n\n trackByName(_index, column: DeviceGridColumn): string {\n return column.name;\n }\n\n async onDataSourceModifier(\n dataSourceModifier: DataSourceModifier\n ): Promise<ServerSideDataResult> {\n let response;\n if (dataSourceModifier.searchText) {\n response = await this.searchService.search(dataSourceModifier.searchText);\n } else {\n response = await this.searchService.getData(\n dataSourceModifier.columns,\n dataSourceModifier.pagination,\n undefined\n );\n }\n const { res, data, paging } = response;\n const filteredData = this.searchService.filterOnlyAssets(data);\n\n if (paging.currentPage === 1) {\n this.sizeCount = 0;\n }\n this.sizeCount += filteredData.length;\n this.onColumnsChange.emit(dataSourceModifier.columns);\n\n return {\n res,\n data: filteredData,\n paging,\n filteredSize: this.sizeCount,\n size: undefined\n };\n }\n\n setActionControls() {\n const actionControls: ActionControl[] = [];\n const deleteAction: ActionControl = {\n type: BuiltInActionType.Delete,\n callback: (asset: Row) => this.onDeleteAsset(asset as IManagedObject, this.parentGroup)\n };\n actionControls.push(deleteAction);\n if (!this.actionControls) {\n this.actionControls = actionControls;\n }\n }\n\n updateFiltering(\n columnNames: string[],\n action: {\n type: FilteringActionType;\n payload?: { filteringModifier: FilteringModifier };\n }\n ) {\n const { type } = action;\n if (type === FilteringActionType.ResetFilter) {\n this.dataGrid.clearFilters();\n } else {\n this.dataGrid.updateFiltering(columnNames, action);\n }\n }\n\n configChange(config) {\n this.searchService.saveConfig(config);\n }\n\n private onDeleteAsset(asset, parentRef) {\n const initialState = {\n showWithDeviceUserCheckbox: this.subAssetsGridService.shouldShowWithDeviceUserCheckbox(asset),\n asset,\n showWithCascadeCheckbox:\n !this.smartGroupsService.isSmartGroup(asset) &&\n !this.smartGroupsService.isSmartGroupV2(asset)\n };\n\n const modalRef = this.bsModalService.show(DeleteAssetsModalComponent, { initialState });\n\n modalRef.content.closeSubject.subscribe(async (result: DeleteModalCheckboxes) => {\n if (result) {\n await this.subAssetsGridService.deleteAsset(asset, parentRef, result);\n this.refresh.emit();\n }\n });\n }\n}\n","import { Component, OnDestroy, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { SearchGridComponent } from './search-grid.component';\nimport { FilteringActionType, AlertService, Status, gettext, Alert } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-search-results',\n templateUrl: './search-results.component.html'\n})\nexport class SearchResultsComponent implements OnDestroy {\n filter: string = '';\n searchTerm: string = '';\n @ViewChild(SearchGridComponent, { static: true })\n searchGrid: SearchGridComponent;\n filteringName: string;\n private unsubscribe$ = new Subject<any>();\n\n constructor(private route: ActivatedRoute, private alert: AlertService) {}\n\n ngOnInit() {\n this.route.queryParams.subscribe(params => {\n if (params.filter) {\n this.filteringName = params.filter;\n }\n });\n }\n\n ngAfterViewInit(): void {\n this.route.queryParams\n .pipe(takeUntil(this.unsubscribe$))\n .subscribe(({ filter, search }) => this.onQueryParamsChange(filter, search));\n\n this.searchGrid.dataGrid.searchText$.pipe(takeUntil(this.unsubscribe$)).subscribe(text => {\n if (text) {\n this.resetFilter();\n }\n this.searchTerm = text;\n });\n\n this.searchGrid.dataGrid.onFilter\n .pipe(takeUntil(this.unsubscribe$))\n .subscribe(() => this.resetSearch());\n\n // to prevent race condition (search empty):\n this.searchTerm = this.route.snapshot.queryParams.search || '';\n }\n\n resetSearch() {\n this.searchTerm = '';\n if (this.searchTerm) {\n this.alert.add({\n text: gettext('Search reset. Full text search does not support filtering.'),\n type: Status.WARNING,\n timeout: 5000\n } as Alert);\n }\n }\n\n resetFilter() {\n this.filter = '';\n if (this.searchGrid.dataGrid.filteringApplied) {\n this.alert.add({\n text: gettext('Filter reset. Full text search does not support filtering.'),\n type: Status.WARNING,\n timeout: 5000\n } as Alert);\n this.searchGrid.dataGrid.clearFilters();\n }\n }\n\n ngOnDestroy() {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n\n private onQueryParamsChange(filter: string, searchTerm: string) {\n if (!this.shouldFilter(filter) && searchTerm) {\n this.search(searchTerm);\n } else if (this.shouldFilter(filter) && searchTerm) {\n this.search(searchTerm);\n }\n }\n\n private shouldFilter(filter) {\n if (!filter) {\n return false;\n }\n this.resetSearch();\n this.filter = filter || '';\n this.searchGrid.updateFiltering(['name'], {\n type: FilteringActionType.ApplyFilter,\n payload: {\n filteringModifier: {\n externalFilterQuery: {\n names: [this.filter]\n }\n }\n }\n });\n return true;\n }\n\n private search(searchTerm: string) {\n this.searchTerm = searchTerm || '';\n this.searchGrid.dataGrid.searchText$.next(this.searchTerm);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CoreModule, HOOK_ONCE_ROUTE, HOOK_SEARCH, Search } from '@c8y/ngx-components';\nimport { DeviceGridModule } from '@c8y/ngx-components/device-grid';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { SearchBoxComponent } from './search-box.component';\nimport { SearchResultsComponent } from './search-results.component';\nimport { SearchGridComponent } from './search-grid.component';\nimport { SearchService } from './search.service';\n\n@NgModule({\n declarations: [SearchResultsComponent, SearchBoxComponent, SearchGridComponent],\n imports: [CoreModule, DeviceGridModule, BsDropdownModule],\n entryComponents: [SearchResultsComponent, SearchBoxComponent],\n exports: [SearchResultsComponent, SearchBoxComponent, SearchGridComponent],\n providers: [\n SearchService,\n {\n provide: HOOK_ONCE_ROUTE,\n useValue: [\n {\n path: 'assetsearch',\n component: SearchResultsComponent\n }\n ],\n multi: true\n },\n {\n provide: HOOK_SEARCH,\n useValue: [\n {\n template: SearchBoxComponent\n }\n ] as Search[],\n multi: true\n }\n ]\n})\nexport class SearchModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tslib_1.__decorate"],"mappings":"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"}
@@ -7886,10 +7886,10 @@ let GainsightService = class GainsightService {
7886
7886
  }
7887
7887
  /**
7888
7888
  * Load the script tag and calls the identify function to start the tracking.
7889
- * @param accountId The account where the user is registered. Could be the name of the tenant.
7889
+ * @param currentTenant The current tenant.
7890
7890
  * @param identify If set to false, only the tag is loaded.
7891
7891
  */
7892
- loadTag(accountId, identify = true) {
7892
+ loadTag(currentTenant, identify = true) {
7893
7893
  return __awaiter(this, void 0, void 0, function* () {
7894
7894
  const scriptTag = document.createElement('script');
7895
7895
  const key = yield this.getGainsightKey();
@@ -7900,7 +7900,7 @@ let GainsightService = class GainsightService {
7900
7900
  .subscribe(([user, scriptEvent, versions]) => {
7901
7901
  const instanceId = this.getInstanceIdFromUrl();
7902
7902
  if (identify) {
7903
- this.identify(user, accountId, instanceId, versions.ui.ngx, versions.backend);
7903
+ this.identify(user, currentTenant, instanceId, versions.ui.ngx, versions.backend);
7904
7904
  }
7905
7905
  this.isScriptLoaded = true;
7906
7906
  this.tagFunction$.next(this.tagFunction);
@@ -7910,16 +7910,18 @@ let GainsightService = class GainsightService {
7910
7910
  }
7911
7911
  /**
7912
7912
  * Identifies the user/account at Gainsight.
7913
- * @param userId The user id which is given to Gainsight.
7914
- * @param accountId The account id which is given to Gainsight (e.g. the tenant name)
7913
+ * @param user The user which is given to Gainsight.
7914
+ * @param tenant The tenant which is given to Gainsight.
7915
7915
  * @param versionUI The UI version used.
7916
7916
  * @param versionBE The BE version used.
7917
7917
  */
7918
- identify(user, accountId, instanceId, versionUI, versionBE) {
7918
+ identify(user, tenant, instanceId, versionUI, versionBE) {
7919
7919
  const windowRef = window;
7920
- const { id: userId, email, userName, phone, firstName, lastName } = user;
7920
+ const { id: userId, email, userName, firstName, lastName } = user;
7921
+ const { name, customProperties } = tenant;
7922
+ const externalReference = customProperties && customProperties.externalReference;
7921
7923
  windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', {
7922
- id: `${userId}_${accountId}_${instanceId}`,
7924
+ id: `${userId}_${name}_${instanceId}`,
7923
7925
  email,
7924
7926
  userName,
7925
7927
  firstName,
@@ -7927,9 +7929,10 @@ let GainsightService = class GainsightService {
7927
7929
  versionUI,
7928
7930
  versionBE,
7929
7931
  userLanguage: TranslateService.defaultLang(),
7930
- instanceId
7932
+ instanceId,
7933
+ externalReference
7931
7934
  }, {
7932
- id: `${accountId}_${instanceId}`,
7935
+ id: `${name}_${instanceId}`,
7933
7936
  instanceId
7934
7937
  });
7935
7938
  }
@@ -8052,7 +8055,7 @@ let ProductExperienceModule = class ProductExperienceModule {
8052
8055
  const { customProperties, name } = currentTenant;
8053
8056
  if (this.gainsightService.shouldLoadGainsightTag(customProperties) &&
8054
8057
  !(yield this.gainsightService.isGainsightDisabledInUserPreferences())) {
8055
- this.gainsightService.loadTag(name);
8058
+ this.gainsightService.loadTag(currentTenant);
8056
8059
  }
8057
8060
  }));
8058
8061
  }
@@ -15915,7 +15918,7 @@ var FilteringActionType;
15915
15918
 
15916
15919
  class GridDataSource {
15917
15920
  constructor() {
15918
- this.loadingSubject = new BehaviorSubject(false);
15921
+ this.loadingSubject = new BehaviorSubject(true);
15919
15922
  this.dataSourceSubject = new BehaviorSubject([]);
15920
15923
  this.dataStatsSubject = new BehaviorSubject({
15921
15924
  size: 0,
@@ -16637,7 +16640,7 @@ __decorate([
16637
16640
  DataGridComponent = __decorate([
16638
16641
  Component({
16639
16642
  selector: 'c8y-data-grid',
16640
- template: "<div class=\"table-data-grid-scroll\" #scroll>\n <div *ngIf=\"displayOptions.gridHeader\" class=\"table-data-grid-header separator large-padding\">\n <h4 class=\"m-r-16\">{{ title | translate }}</h4>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <span class=\"label label-warning m-r-4\" translate>No filters</span>\n <small\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n class=\"m-r-4\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >{{ filteredItemsCount }} of {{ allItemsCount }} items</small\n >\n </span>\n <span *ngIf=\"filteringApplied\">\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small ngNonBindable translate [translateParams]=\"filteringLabelsParams\"\n >of {{ allItemsCount }} items</small\n >\n </ng-container>\n <button\n title=\" {{ 'Clear filters' | translate }}\"\n class=\"m-l-8 btn btn-xs btn-default m-r-4\"\n (click)=\"clearFilters()\"\n >\n {{ 'Clear filters' | translate }}\n </button>\n </span>\n <span class=\"hidden-xs hidden-sm\">\n <button\n class=\"btn-clean text-primary\"\n popover=\"{{ 'Click the column headers to apply filters.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button> </span\n ></ng-container>\n\n <div class=\"flex-item-right\">\n <div class=\"btnbar flex-row\">\n <label class=\"c8y-switch\" *ngIf=\"showChildDevices.show\">\n <input type=\"checkbox\" [(ngModel)]=\"showChildDevices.value\" (click)=\"loadChildDevices()\"/>\n <span></span>\n {{ 'Show child devices' | translate }}\n </label>\n\n <div\n class=\"dropdown\"\n dropdown\n [insideClick]=\"true\"\n container=\"body\"\n placement=\"bottom left\"\n >\n <button\n title=\"{{ 'Configure columns' | translate }}\"\n class=\"btnbar-btn c8y-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"columns\" class=\"m-r-4\"></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul *dropdownMenu class=\"dropdown-menu\" (click)=\"$event.stopPropagation()\">\n <li class=\"bg-white\">\n <div cdkDropList (cdkDropListDropped)=\"onColumnDrop($event)\" class=\"list-group m-0\">\n <div *ngFor=\"let column of columns\" cdkDrag cdkDragLockAxis=\"y\">\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 \">\n <label\n title=\"{{ (column.header | translate) || column.name }}\"\n class=\"c8y-checkbox p-l-16 p-r-32 p-t-8 p-b-8 flex-item-v-stretch\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"updateGridColumnsSize()\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n </ul>\n </div>\n\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btnbar-btn btn-link\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"searchText = ''; reload()\"\n >\n <i c8yIcon=\"refresh\" class=\"m-r-4\"></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div *ngIf=\"!serverSideDataCallback || showSearch\" class=\"input-group input-group-search\">\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n [ngModel]=\"searchText\"\n (input)=\"searchText$.emit($event.target.value)\"\n />\n <div class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"searchText.length === 0\"></i>\n <i\n c8yIcon=\"times\"\n class=\"pointer\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <span\n *ngIf=\"!itemsSelectLimit; else limit\"\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n <ng-template #limit>\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length, limit: itemsSelectLimit }\"\n >\n {{ count }} selected items out of {{ limit }} allowed\n </span>\n </ng-template>\n\n <br class=\"visible-xs\" />\n <small *ngIf=\"selectedItemIds.length >= pagination.pageSize && !itemsSelectLimit\">\n <a (click)=\"setAllItemsSelected(true)\" class=\"interact\" >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"flex-item-right\">\n <div class=\"btnbar flex-row\">\n <ng-container\n *ngFor=\"let bulkActionControl of bulkActionControls\"\n [ngSwitch]=\"bulkActionControl.type\"\n >\n <button\n title=\"{{ 'Export' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Export\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n title=\"{{ 'Delete' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n >\n <i c8yIcon=\"trash\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n title=\"{{ bulkActionControl.text | translate }}\"\n *ngSwitchDefault\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n >\n <i c8yIcon=\"{{ bulkActionControl.icon }}\"></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n\n <button title=\"{{ 'Cancel' | translate }}\" class=\"btnbar-btn\" (click)=\"cancel()\">\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-hover table-filtered-sorted table-data-grid large-padding\"\n cdk-table\n [dataSource]=\"dataSource\"\n [trackBy]=\"trackByName\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n >\n <ng-container *ngFor=\"let column of columns; trackBy: trackByName\" [cdkColumnDef]=\"column.name\">\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\">\n <div *ngIf=\"!itemsSelectLimit\">\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td cdk-cell *cdkCellDef=\"let row\">\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n [disabled]=\"selectedItemIds.length >= itemsSelectLimit && !isItemSelected(row)\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\"></th>\n\n <td cdk-cell *cdkCellDef=\"let row\">\n <ng-container *ngIf=\"actionControls.length <= 2\">\n <ng-container\n *ngFor=\"let actionControl of actionControls\"\n [ngSwitch]=\"actionControl.type\"\n >\n <ng-container *ngIf=\"actionControl.showIf ? actionControl.showIf(row) : true\">\n <button\n *ngSwitchCase=\"builtInActionType.Edit\"\n class=\"btn btn-icon btn-xs btn-default\"\n title=\"{{ 'Edit' | translate }}\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n <button\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btn btn-dot showOnHover\"\n title=\"{{ 'Delete' | translate }}\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i class=\"text-danger\" c8yIcon=\"minus-circle\"></i>\n </button>\n <button\n *ngSwitchDefault\n class=\"btn btn-icon btn-xs btn-default\"\n title=\"{{ actionControl.text | translate }}\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"{{ actionControl.icon }}\"></i>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div *ngIf=\"actionControls.length > 2\" class=\"dropdown\" dropdown>\n <button\n title=\"{{ 'Actions' | translate }}\"\n class=\"dropdown-toggle c8y-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul class=\"dropdown-menu dropdown-menu-right\" *dropdownMenu>\n <li *ngFor=\"let actionControl of actionControls\" [ngSwitch]=\"actionControl.type\">\n <ng-container *ngIf=\"actionControl.showIf ? actionControl.showIf(row) : true\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"trash\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"{{ actionControl.icon }}\"></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n >\n <div *ngIf=\"!column.filterable\" [title]=\"(column.header | translate) || column.name\">\n <ng-container\n *ngIf=\"\n (\n [{\n columnName: column.name,\n value: ((column.header | translate) || column.name)\n }]\n | map:getHeaderCellRendererSpec:this\n ) as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <div\n *ngIf=\"column.filterable\"\n class=\"dropdown\"\n dropdown\n #dropdown=\"bs-dropdown\"\n container=\"body\"\n placement=\"bottom left\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header c8y-dropdown\"\n dropdownToggle\n [title]=\"(column.header | translate) || column.name\"\n >\n <ng-container\n *ngIf=\"\n (\n [{\n columnName: column.name,\n value: ((column.header | translate) || column.name)\n }]\n | map:getHeaderCellRendererSpec:this\n ) as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n <i c8yIcon=\"filter\" title=\"{{ 'Filter' | translate }}\"></i>\n </button>\n\n <ul *dropdownMenu class=\"dropdown-menu\" (click)=\"$event.stopPropagation()\">\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n (\n [{\n column: column,\n dropdown: dropdown\n }]\n | map:getFilteringFormRendererSpec:this\n ) as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer [spec]=\"filteringFormRendererSpec\">\n </c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n *ngIf=\"column.sortable\"\n class=\"btn-sort\"\n title=\"{{ 'Sort' | translate }}\"\n (click)=\"changeSortOrder(column.name)\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i *ngSwitchCase=\"'asc'\" c8yIcon=\"long-arrow-up\"></i>\n <i *ngSwitchCase=\"'desc'\" c8yIcon=\"long-arrow-down\"></i>\n <i *ngSwitchDefault c8yIcon=\"exchange\"></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n >\n </span>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cell-title]=\"column.header | translate\"\n [class.hidden]=\"!column.visible\"\n >\n <ng-container\n *ngIf=\"\n (\n [{\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }]\n | map:getCellRendererSpec:this\n ) as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td cdk-footer-cell *cdkFooterCellDef [style.grid-column]=\"styles.gridInfiniteScrollColumn\">\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr cdk-header-row *cdkHeaderRowDef=\"columnNames\"></tr>\n\n <tr\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"rowClick.emit(row)\"\n ></tr>\n\n <ng-container *ngIf=\"infiniteScroll\">\n <tr cdk-footer-row *cdkFooterRowDef=\"['infiniteScrollFooter']\"></tr>\n </ng-container>\n </table>\n\n <div *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent\" class=\"text-center\">\n <c8y-progress-bar [message]=\"loadingItemsLabel\"></c8y-progress-bar>\n </div>\n\n <div\n class=\"row m-0 p-t-40 p-b-40\"\n *ngIf=\"!(dataSource.loading$ | async) && (dataSource.stats$ | async).filteredSize === 0\"\n >\n <div class=\"col-md-4 col-md-offset-4\">\n <ng-content select=\".c8y-empty-state\"></ng-content>\n </div>\n </div>\n\n <div *ngIf=\"pagination && !infiniteScroll\" class=\"table-data-grid-footer separator large-padding\">\n <div class=\"col-sm-4 no-gutter\">\n <div *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\" class=\"counter\">\n <span class=\"text-muted\" ngNonBindable translate [translateParams]=\"paginationLabelParams\"\n >{{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}</span\n >\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n class=\"form-group form-inline\"\n >\n <label class=\"m-r-4\">{{ 'Items per page' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option *ngFor=\"let pageSize of possiblePageSizes\" [ngValue]=\"pageSize\">\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"totalPagesCount <= 1\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount = $event\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\" \"\n nextText=\" \"\n ></pagination>\n </div>\n </div>\n</div>\n"
16643
+ template: "<div class=\"table-data-grid-scroll\" #scroll>\n <div *ngIf=\"displayOptions.gridHeader\" class=\"table-data-grid-header separator large-padding\">\n <h4 class=\"m-r-16\">{{ title | translate }}</h4>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <span class=\"label label-warning m-r-4\" translate>No filters</span>\n <small\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n class=\"m-r-4\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >{{ filteredItemsCount }} of {{ allItemsCount }} items</small\n >\n </span>\n <span *ngIf=\"filteringApplied\">\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small ngNonBindable translate [translateParams]=\"filteringLabelsParams\"\n >of {{ allItemsCount }} items</small\n >\n </ng-container>\n <button\n title=\" {{ 'Clear filters' | translate }}\"\n class=\"m-l-8 btn btn-xs btn-default m-r-4\"\n (click)=\"clearFilters()\"\n >\n {{ 'Clear filters' | translate }}\n </button>\n </span>\n <span class=\"hidden-xs hidden-sm\">\n <button\n class=\"btn-clean text-primary\"\n popover=\"{{ 'Click the column headers to apply filters.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button> </span\n ></ng-container>\n\n <div class=\"flex-item-right\">\n <div class=\"btnbar flex-row\">\n <label class=\"c8y-switch\" *ngIf=\"showChildDevices.show\">\n <input type=\"checkbox\" [(ngModel)]=\"showChildDevices.value\" (click)=\"loadChildDevices()\"/>\n <span></span>\n {{ 'Show child devices' | translate }}\n </label>\n\n <div\n class=\"dropdown\"\n dropdown\n [insideClick]=\"true\"\n container=\"body\"\n placement=\"bottom left\"\n >\n <button\n title=\"{{ 'Configure columns' | translate }}\"\n class=\"btnbar-btn c8y-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"columns\" class=\"m-r-4\"></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul *dropdownMenu class=\"dropdown-menu\" (click)=\"$event.stopPropagation()\">\n <li class=\"bg-white\">\n <div cdkDropList (cdkDropListDropped)=\"onColumnDrop($event)\" class=\"list-group m-0\">\n <div *ngFor=\"let column of columns\" cdkDrag cdkDragLockAxis=\"y\">\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 \">\n <label\n title=\"{{ (column.header | translate) || column.name }}\"\n class=\"c8y-checkbox p-l-16 p-r-32 p-t-8 p-b-8 flex-item-v-stretch\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"updateGridColumnsSize()\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n </ul>\n </div>\n\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btnbar-btn btn-link\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"searchText = ''; reload()\"\n >\n <i c8yIcon=\"refresh\" class=\"m-r-4\"></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div *ngIf=\"!serverSideDataCallback || showSearch\" class=\"input-group input-group-search m-l-sm-32\">\n <input\n type=\"search\"\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n [ngModel]=\"searchText\"\n (input)=\"searchText$.emit($event.target.value)\"\n />\n <div class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"searchText.length === 0\"></i>\n <i\n c8yIcon=\"times\"\n class=\"pointer\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <span\n *ngIf=\"!itemsSelectLimit; else limit\"\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n <ng-template #limit>\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length, limit: itemsSelectLimit }\"\n >\n {{ count }} selected items out of {{ limit }} allowed\n </span>\n </ng-template>\n\n <br class=\"visible-xs\" />\n <small *ngIf=\"selectedItemIds.length >= pagination.pageSize && !itemsSelectLimit\">\n <a (click)=\"setAllItemsSelected(true)\" class=\"interact\" >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"flex-item-right\">\n <div class=\"btnbar flex-row\">\n <ng-container\n *ngFor=\"let bulkActionControl of bulkActionControls\"\n [ngSwitch]=\"bulkActionControl.type\"\n >\n <button\n title=\"{{ 'Export' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Export\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n title=\"{{ 'Delete' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n >\n <i c8yIcon=\"trash\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n title=\"{{ bulkActionControl.text | translate }}\"\n *ngSwitchDefault\n class=\"btnbar-btn\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n >\n <i c8yIcon=\"{{ bulkActionControl.icon }}\"></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n\n <button title=\"{{ 'Cancel' | translate }}\" class=\"btnbar-btn\" (click)=\"cancel()\">\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-hover table-filtered-sorted table-data-grid large-padding\"\n cdk-table\n [dataSource]=\"dataSource\"\n [trackBy]=\"trackByName\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n >\n <ng-container *ngFor=\"let column of columns; trackBy: trackByName\" [cdkColumnDef]=\"column.name\">\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\">\n <div *ngIf=\"!itemsSelectLimit\">\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td cdk-cell *cdkCellDef=\"let row\">\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n [disabled]=\"selectedItemIds.length >= itemsSelectLimit && !isItemSelected(row)\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th cdk-header-cell *cdkHeaderCellDef data-type=\"icon\"></th>\n\n <td cdk-cell *cdkCellDef=\"let row\">\n <ng-container *ngIf=\"actionControls.length <= 2\">\n <ng-container\n *ngFor=\"let actionControl of actionControls\"\n [ngSwitch]=\"actionControl.type\"\n >\n <ng-container *ngIf=\"actionControl.showIf ? actionControl.showIf(row) : true\">\n <button\n *ngSwitchCase=\"builtInActionType.Edit\"\n class=\"btn btn-icon btn-xs btn-default\"\n title=\"{{ 'Edit' | translate }}\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n <button\n *ngSwitchCase=\"builtInActionType.Delete\"\n class=\"btn btn-dot showOnHover\"\n title=\"{{ 'Delete' | translate }}\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i class=\"text-danger\" c8yIcon=\"minus-circle\"></i>\n </button>\n <button\n *ngSwitchDefault\n class=\"btn btn-icon btn-xs btn-default\"\n title=\"{{ actionControl.text | translate }}\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"{{ actionControl.icon }}\"></i>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div *ngIf=\"actionControls.length > 2\" class=\"dropdown\" dropdown>\n <button\n title=\"{{ 'Actions' | translate }}\"\n class=\"dropdown-toggle c8y-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul class=\"dropdown-menu dropdown-menu-right\" *dropdownMenu>\n <li *ngFor=\"let actionControl of actionControls\" [ngSwitch]=\"actionControl.type\">\n <ng-container *ngIf=\"actionControl.showIf ? actionControl.showIf(row) : true\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"trash\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n >\n <i c8yIcon=\"{{ actionControl.icon }}\"></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n >\n <div *ngIf=\"!column.filterable\" [title]=\"(column.header | translate) || column.name\">\n <ng-container\n *ngIf=\"\n (\n [{\n columnName: column.name,\n value: ((column.header | translate) || column.name)\n }]\n | map:getHeaderCellRendererSpec:this\n ) as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <div\n *ngIf=\"column.filterable\"\n class=\"dropdown\"\n dropdown\n #dropdown=\"bs-dropdown\"\n container=\"body\"\n placement=\"bottom left\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header c8y-dropdown\"\n dropdownToggle\n [title]=\"(column.header | translate) || column.name\"\n >\n <ng-container\n *ngIf=\"\n (\n [{\n columnName: column.name,\n value: ((column.header | translate) || column.name)\n }]\n | map:getHeaderCellRendererSpec:this\n ) as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n <i c8yIcon=\"filter\" title=\"{{ 'Filter' | translate }}\"></i>\n </button>\n\n <ul *dropdownMenu class=\"dropdown-menu\" (click)=\"$event.stopPropagation()\">\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n (\n [{\n column: column,\n dropdown: dropdown\n }]\n | map:getFilteringFormRendererSpec:this\n ) as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer [spec]=\"filteringFormRendererSpec\">\n </c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n *ngIf=\"column.sortable\"\n class=\"btn-sort\"\n title=\"{{ 'Sort' | translate }}\"\n (click)=\"changeSortOrder(column.name)\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i *ngSwitchCase=\"'asc'\" c8yIcon=\"long-arrow-up\"></i>\n <i *ngSwitchCase=\"'desc'\" c8yIcon=\"long-arrow-down\"></i>\n <i *ngSwitchDefault c8yIcon=\"exchange\"></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n >\n </span>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cell-title]=\"column.header | translate\"\n [class.hidden]=\"!column.visible\"\n >\n <ng-container\n *ngIf=\"\n (\n [{\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }]\n | map:getCellRendererSpec:this\n ) as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td cdk-footer-cell *cdkFooterCellDef [style.grid-column]=\"styles.gridInfiniteScrollColumn\">\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr cdk-header-row *cdkHeaderRowDef=\"columnNames\"></tr>\n\n <tr\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"rowClick.emit(row)\"\n ></tr>\n\n <ng-container *ngIf=\"infiniteScroll\">\n <tr cdk-footer-row *cdkFooterRowDef=\"['infiniteScrollFooter']\"></tr>\n </ng-container>\n </table>\n\n <div *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent\" class=\"text-center\">\n <c8y-progress-bar [message]=\"loadingItemsLabel\"></c8y-progress-bar>\n </div>\n\n <div\n class=\"row m-0 p-t-40 p-b-40\"\n *ngIf=\"!(dataSource.loading$ | async) && (dataSource.stats$ | async).filteredSize === 0\"\n >\n <div class=\"col-md-4 col-md-offset-4\">\n <ng-content select=\".c8y-empty-state\"></ng-content>\n </div>\n </div>\n\n <div *ngIf=\"pagination && !infiniteScroll\" class=\"table-data-grid-footer separator large-padding\">\n <div class=\"col-sm-4 no-gutter\">\n <div *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\" class=\"counter\">\n <span class=\"text-muted\" ngNonBindable translate [translateParams]=\"paginationLabelParams\"\n >{{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}</span\n >\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n class=\"form-group form-inline\"\n >\n <label class=\"m-r-4\">{{ 'Items per page' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option *ngFor=\"let pageSize of possiblePageSizes\" [ngValue]=\"pageSize\">\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"totalPagesCount <= 1\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount = $event\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\" \"\n nextText=\" \"\n ></pagination>\n </div>\n </div>\n</div>\n"
16641
16644
  })
16642
16645
  ], DataGridComponent);
16643
16646