@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.
- package/bundles/c8y-ngx-components-search.umd.js +34 -3
- package/bundles/c8y-ngx-components-search.umd.js.map +1 -1
- package/bundles/c8y-ngx-components-search.umd.min.js +1 -1
- package/bundles/c8y-ngx-components-search.umd.min.js.map +1 -1
- package/bundles/c8y-ngx-components.umd.js +16 -13
- package/bundles/c8y-ngx-components.umd.js.map +1 -1
- package/bundles/c8y-ngx-components.umd.min.js +1 -1
- package/bundles/c8y-ngx-components.umd.min.js.map +1 -1
- package/c8y-ngx-components.metadata.json +1 -1
- package/core/data-grid/data-grid.model.d.ts +4 -0
- package/core/product-experience/gainsight.service.d.ts +5 -5
- package/esm2015/core/data-grid/data-grid.component.js +2 -2
- package/esm2015/core/data-grid/data-grid.model.js +1 -1
- package/esm2015/core/data-grid/grid-data-source.js +2 -2
- package/esm2015/core/product-experience/gainsight.service.js +14 -11
- package/esm2015/core/product-experience/product-experience.module.js +2 -2
- package/esm2015/search/search-grid.component.js +25 -4
- package/esm2015/search/search-results.component.js +12 -2
- package/esm2015/search/search.service.js +1 -1
- package/esm5/core/data-grid/data-grid.component.js +2 -2
- package/esm5/core/data-grid/data-grid.model.js +1 -1
- package/esm5/core/data-grid/grid-data-source.js +2 -2
- package/esm5/core/product-experience/gainsight.service.js +14 -11
- package/esm5/core/product-experience/product-experience.module.js +2 -2
- package/esm5/search/search-grid.component.js +25 -4
- package/esm5/search/search-results.component.js +13 -2
- package/esm5/search/search.service.js +1 -1
- package/fesm2015/c8y-ngx-components-search.js +35 -5
- package/fesm2015/c8y-ngx-components-search.js.map +1 -1
- package/fesm2015/c8y-ngx-components.js +16 -13
- package/fesm2015/c8y-ngx-components.js.map +1 -1
- package/fesm5/c8y-ngx-components-search.js +36 -5
- package/fesm5/c8y-ngx-components-search.js.map +1 -1
- package/fesm5/c8y-ngx-components.js +16 -13
- package/fesm5/c8y-ngx-components.js.map +1 -1
- package/locales/ja_JP.po +5 -5
- package/locales/locales.pot +6 -0
- package/package.json +2 -2
- package/search/c8y-ngx-components-search.metadata.json +1 -1
- package/search/search-grid.component.d.ts +2 -1
- package/search/search-results.component.d.ts +2 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { __extends, __decorate, __awaiter, __generator, __assign } from 'tslib';
|
|
2
2
|
import { Injectable, ViewChild, Component, EventEmitter, Input, Output, NgModule } from '@angular/core';
|
|
3
|
-
import { SubAssetsService, DeleteAssetsModalComponent } from '@c8y/ngx-components/sub-assets';
|
|
3
|
+
import { SubAssetsService, AssetTypeGridColumn, DeleteAssetsModalComponent } from '@c8y/ngx-components/sub-assets';
|
|
4
4
|
import { get, some, find, isUndefined } from 'lodash-es';
|
|
5
5
|
import { Router, ActivatedRoute } from '@angular/router';
|
|
6
6
|
import { InventoryService, SmartGroupsService } from '@c8y/client';
|
|
7
7
|
import { TypeaheadComponent, gettext, FilteringActionType, DataGridComponent, Status, AlertService, CoreModule, HOOK_ONCE_ROUTE, HOOK_SEARCH } from '@c8y/ngx-components';
|
|
8
|
-
import { DeviceGridService, DeviceGridModule } from '@c8y/ngx-components/device-grid';
|
|
8
|
+
import { DeviceGridService, NameDeviceGridColumn, ModelDeviceGridColumn, SerialNumberDeviceGridColumn, RegistrationDateDeviceGridColumn, SystemIdDeviceGridColumn, ImeiDeviceGridColumn, AlarmsDeviceGridColumn, DeviceGridModule } from '@c8y/ngx-components/device-grid';
|
|
9
9
|
import { pipe, defer, merge, of, empty, Subject } from 'rxjs';
|
|
10
10
|
import { map, tap, switchMap, takeUntil } from 'rxjs/operators';
|
|
11
11
|
import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
|
|
@@ -287,7 +287,6 @@ var SearchGridComponent = /** @class */ (function () {
|
|
|
287
287
|
this.selectable = false;
|
|
288
288
|
this.onColumnsChange = new EventEmitter();
|
|
289
289
|
this.searchText = '';
|
|
290
|
-
this.columns = this.searchService.getDefaultColumns();
|
|
291
290
|
this.pagination = this.searchService.getDefaultPagination();
|
|
292
291
|
this.bulkActionControls = this.searchService.getDefaultBulkActionControls();
|
|
293
292
|
this.refresh = new EventEmitter();
|
|
@@ -341,7 +340,25 @@ var SearchGridComponent = /** @class */ (function () {
|
|
|
341
340
|
enumerable: true,
|
|
342
341
|
configurable: true
|
|
343
342
|
});
|
|
344
|
-
SearchGridComponent.prototype.
|
|
343
|
+
SearchGridComponent.prototype.ngOnInit = function () {
|
|
344
|
+
if (!this.filteringName) {
|
|
345
|
+
this.columns = this.searchService.getDefaultColumns();
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
this.columns = [
|
|
349
|
+
new AssetTypeGridColumn({ sortOrder: 'desc' }),
|
|
350
|
+
new NameDeviceGridColumn({
|
|
351
|
+
sortOrder: 'asc',
|
|
352
|
+
filter: { externalFilterQuery: { names: [this.filteringName] } }
|
|
353
|
+
}),
|
|
354
|
+
new ModelDeviceGridColumn(),
|
|
355
|
+
new SerialNumberDeviceGridColumn({ visible: false }),
|
|
356
|
+
new RegistrationDateDeviceGridColumn({ visible: false }),
|
|
357
|
+
new SystemIdDeviceGridColumn({ visible: false }),
|
|
358
|
+
new ImeiDeviceGridColumn({ visible: false }),
|
|
359
|
+
new AlarmsDeviceGridColumn()
|
|
360
|
+
];
|
|
361
|
+
}
|
|
345
362
|
this.serverSideDataCallback = this.onDataSourceModifier.bind(this);
|
|
346
363
|
this.setActionControls();
|
|
347
364
|
};
|
|
@@ -466,6 +483,9 @@ var SearchGridComponent = /** @class */ (function () {
|
|
|
466
483
|
__decorate([
|
|
467
484
|
Input()
|
|
468
485
|
], SearchGridComponent.prototype, "searchText", void 0);
|
|
486
|
+
__decorate([
|
|
487
|
+
Input()
|
|
488
|
+
], SearchGridComponent.prototype, "filteringName", void 0);
|
|
469
489
|
__decorate([
|
|
470
490
|
ViewChild(DataGridComponent, { static: true })
|
|
471
491
|
], SearchGridComponent.prototype, "dataGrid", void 0);
|
|
@@ -486,6 +506,14 @@ var SearchResultsComponent = /** @class */ (function () {
|
|
|
486
506
|
this.searchTerm = '';
|
|
487
507
|
this.unsubscribe$ = new Subject();
|
|
488
508
|
}
|
|
509
|
+
SearchResultsComponent.prototype.ngOnInit = function () {
|
|
510
|
+
var _this = this;
|
|
511
|
+
this.route.queryParams.subscribe(function (params) {
|
|
512
|
+
if (params.filter) {
|
|
513
|
+
_this.filteringName = params.filter;
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
};
|
|
489
517
|
SearchResultsComponent.prototype.ngAfterViewInit = function () {
|
|
490
518
|
var _this = this;
|
|
491
519
|
this.route.queryParams
|
|
@@ -535,6 +563,9 @@ var SearchResultsComponent = /** @class */ (function () {
|
|
|
535
563
|
if (!this.shouldFilter(filter) && searchTerm) {
|
|
536
564
|
this.search(searchTerm);
|
|
537
565
|
}
|
|
566
|
+
else if (this.shouldFilter(filter) && searchTerm) {
|
|
567
|
+
this.search(searchTerm);
|
|
568
|
+
}
|
|
538
569
|
};
|
|
539
570
|
SearchResultsComponent.prototype.shouldFilter = function (filter) {
|
|
540
571
|
if (!filter) {
|
|
@@ -568,7 +599,7 @@ var SearchResultsComponent = /** @class */ (function () {
|
|
|
568
599
|
SearchResultsComponent = __decorate([
|
|
569
600
|
Component({
|
|
570
601
|
selector: 'c8y-search-results',
|
|
571
|
-
template: "<c8y-title>\n <span translate class=\"p-r-4\">Search</span>\n <small\n ngNonBindable\n translate\n *ngIf=\"searchTerm\"\n [translateParams]=\"{\n searchHint: searchTerm\n }\"\n >searching \"{{ searchHint }}\"</small\n >\n <small\n ngNonBindable\n translate\n *ngIf=\"filter\"\n [translateParams]=\"{\n filterHint: filter\n }\"\n >filtered by \"{{ filterHint }}\"</small\n >\n</c8y-title>\n\n<c8y-search-grid [searchText]=\"searchTerm\"></c8y-search-grid>\n"
|
|
602
|
+
template: "<c8y-title>\n <span translate class=\"p-r-4\">Search</span>\n <small\n ngNonBindable\n translate\n *ngIf=\"searchTerm\"\n [translateParams]=\"{\n searchHint: searchTerm\n }\"\n >searching \"{{ searchHint }}\"</small\n >\n <small\n ngNonBindable\n translate\n *ngIf=\"filter\"\n [translateParams]=\"{\n filterHint: filter\n }\"\n >filtered by \"{{ filterHint }}\"</small\n >\n</c8y-title>\n\n<c8y-search-grid [searchText]=\"searchTerm\" [filteringName]=\"filteringName\"></c8y-search-grid>\n"
|
|
572
603
|
})
|
|
573
604
|
], SearchResultsComponent);
|
|
574
605
|
return SearchResultsComponent;
|
|
@@ -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.__extends","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.__extends","tslib_1.__decorate"],"mappings":"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"}
|
|
@@ -8606,10 +8606,10 @@ var GainsightService = /** @class */ (function () {
|
|
|
8606
8606
|
});
|
|
8607
8607
|
/**
|
|
8608
8608
|
* Load the script tag and calls the identify function to start the tracking.
|
|
8609
|
-
* @param
|
|
8609
|
+
* @param currentTenant The current tenant.
|
|
8610
8610
|
* @param identify If set to false, only the tag is loaded.
|
|
8611
8611
|
*/
|
|
8612
|
-
GainsightService.prototype.loadTag = function (
|
|
8612
|
+
GainsightService.prototype.loadTag = function (currentTenant, identify) {
|
|
8613
8613
|
if (identify === void 0) { identify = true; }
|
|
8614
8614
|
return __awaiter(this, void 0, void 0, function () {
|
|
8615
8615
|
var scriptTag, key;
|
|
@@ -8638,7 +8638,7 @@ var GainsightService = /** @class */ (function () {
|
|
|
8638
8638
|
var _b = __read(_a, 3), user = _b[0], scriptEvent = _b[1], versions = _b[2];
|
|
8639
8639
|
var instanceId = _this.getInstanceIdFromUrl();
|
|
8640
8640
|
if (identify) {
|
|
8641
|
-
_this.identify(user,
|
|
8641
|
+
_this.identify(user, currentTenant, instanceId, versions.ui.ngx, versions.backend);
|
|
8642
8642
|
}
|
|
8643
8643
|
_this.isScriptLoaded = true;
|
|
8644
8644
|
_this.tagFunction$.next(_this.tagFunction);
|
|
@@ -8651,16 +8651,18 @@ var GainsightService = /** @class */ (function () {
|
|
|
8651
8651
|
};
|
|
8652
8652
|
/**
|
|
8653
8653
|
* Identifies the user/account at Gainsight.
|
|
8654
|
-
* @param
|
|
8655
|
-
* @param
|
|
8654
|
+
* @param user The user which is given to Gainsight.
|
|
8655
|
+
* @param tenant The tenant which is given to Gainsight.
|
|
8656
8656
|
* @param versionUI The UI version used.
|
|
8657
8657
|
* @param versionBE The BE version used.
|
|
8658
8658
|
*/
|
|
8659
|
-
GainsightService.prototype.identify = function (user,
|
|
8659
|
+
GainsightService.prototype.identify = function (user, tenant, instanceId, versionUI, versionBE) {
|
|
8660
8660
|
var windowRef = window;
|
|
8661
|
-
var userId = user.id, email = user.email, userName = user.userName,
|
|
8661
|
+
var userId = user.id, email = user.email, userName = user.userName, firstName = user.firstName, lastName = user.lastName;
|
|
8662
|
+
var name = tenant.name, customProperties = tenant.customProperties;
|
|
8663
|
+
var externalReference = customProperties && customProperties.externalReference;
|
|
8662
8664
|
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', {
|
|
8663
|
-
id: userId + "_" +
|
|
8665
|
+
id: userId + "_" + name + "_" + instanceId,
|
|
8664
8666
|
email: email,
|
|
8665
8667
|
userName: userName,
|
|
8666
8668
|
firstName: firstName,
|
|
@@ -8668,9 +8670,10 @@ var GainsightService = /** @class */ (function () {
|
|
|
8668
8670
|
versionUI: versionUI,
|
|
8669
8671
|
versionBE: versionBE,
|
|
8670
8672
|
userLanguage: TranslateService.defaultLang(),
|
|
8671
|
-
instanceId: instanceId
|
|
8673
|
+
instanceId: instanceId,
|
|
8674
|
+
externalReference: externalReference
|
|
8672
8675
|
}, {
|
|
8673
|
-
id:
|
|
8676
|
+
id: name + "_" + instanceId,
|
|
8674
8677
|
instanceId: instanceId
|
|
8675
8678
|
});
|
|
8676
8679
|
};
|
|
@@ -8819,7 +8822,7 @@ var ProductExperienceModule = /** @class */ (function () {
|
|
|
8819
8822
|
_d.label = 2;
|
|
8820
8823
|
case 2:
|
|
8821
8824
|
if (_c) {
|
|
8822
|
-
this.gainsightService.loadTag(
|
|
8825
|
+
this.gainsightService.loadTag(currentTenant);
|
|
8823
8826
|
}
|
|
8824
8827
|
return [2 /*return*/];
|
|
8825
8828
|
}
|
|
@@ -17492,7 +17495,7 @@ var FilteringActionType;
|
|
|
17492
17495
|
|
|
17493
17496
|
var GridDataSource = /** @class */ (function () {
|
|
17494
17497
|
function GridDataSource() {
|
|
17495
|
-
this.loadingSubject = new BehaviorSubject(
|
|
17498
|
+
this.loadingSubject = new BehaviorSubject(true);
|
|
17496
17499
|
this.dataSourceSubject = new BehaviorSubject([]);
|
|
17497
17500
|
this.dataStatsSubject = new BehaviorSubject({
|
|
17498
17501
|
size: 0,
|
|
@@ -18321,7 +18324,7 @@ var DataGridComponent = /** @class */ (function () {
|
|
|
18321
18324
|
DataGridComponent = __decorate([
|
|
18322
18325
|
Component({
|
|
18323
18326
|
selector: 'c8y-data-grid',
|
|
18324
|
-
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"
|
|
18327
|
+
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"
|
|
18325
18328
|
})
|
|
18326
18329
|
], DataGridComponent);
|
|
18327
18330
|
return DataGridComponent;
|