@c8y/ngx-components 1017.0.180 → 1017.0.182

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 (34) hide show
  1. package/assets-navigator/asset-node.service.d.ts +1 -1
  2. package/assets-navigator/group.service.d.ts +1 -1
  3. package/core/asset-types/asset-types.service.d.ts +6 -14
  4. package/core/common/get-group-icon.pipe.d.ts +1 -1
  5. package/core/common/group.service.d.ts +1 -1
  6. package/esm2020/assets-navigator/asset-node.mjs +3 -3
  7. package/esm2020/assets-navigator/asset-node.service.mjs +1 -1
  8. package/esm2020/assets-navigator/group.service.mjs +1 -1
  9. package/esm2020/core/asset-types/asset-types.service.mjs +17 -36
  10. package/esm2020/core/common/get-group-icon.pipe.mjs +2 -2
  11. package/esm2020/core/common/group.service.mjs +5 -5
  12. package/esm2020/core/search/search-input.component.mjs +3 -3
  13. package/esm2020/search/columns/asset-type.cell-renderer.component.mjs +3 -3
  14. package/esm2020/sub-assets/columns/asset-type.cell-renderer.component.mjs +5 -5
  15. package/esm2020/sub-assets/group-info.component.mjs +2 -2
  16. package/fesm2015/c8y-ngx-components-assets-navigator.mjs +5 -3
  17. package/fesm2015/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  18. package/fesm2015/c8y-ngx-components-search.mjs +7 -5
  19. package/fesm2015/c8y-ngx-components-search.mjs.map +1 -1
  20. package/fesm2015/c8y-ngx-components-sub-assets.mjs +10 -8
  21. package/fesm2015/c8y-ngx-components-sub-assets.mjs.map +1 -1
  22. package/fesm2015/c8y-ngx-components.mjs +32 -49
  23. package/fesm2015/c8y-ngx-components.mjs.map +1 -1
  24. package/fesm2020/c8y-ngx-components-assets-navigator.mjs +2 -2
  25. package/fesm2020/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  26. package/fesm2020/c8y-ngx-components-search.mjs +2 -2
  27. package/fesm2020/c8y-ngx-components-search.mjs.map +1 -1
  28. package/fesm2020/c8y-ngx-components-sub-assets.mjs +5 -5
  29. package/fesm2020/c8y-ngx-components-sub-assets.mjs.map +1 -1
  30. package/fesm2020/c8y-ngx-components.mjs +23 -42
  31. package/fesm2020/c8y-ngx-components.mjs.map +1 -1
  32. package/package.json +2 -2
  33. package/search/columns/asset-type.cell-renderer.component.d.ts +1 -1
  34. package/sub-assets/columns/asset-type.cell-renderer.component.d.ts +2 -2
@@ -5019,7 +5019,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
5019
5019
  /**
5020
5020
  * AssetTypesService is being used to manage a cache of all existing asset types.
5021
5021
  * This service is injected in the AssetOverviewNavigationFactory class, which will trigger
5022
- * the initialization of the cache as the contstructor is called.
5022
+ * the initialization of the cache as the constructor is called.
5023
5023
  */
5024
5024
  class AssetTypesService {
5025
5025
  constructor(inventory, apiService, appStateService) {
@@ -5031,9 +5031,10 @@ class AssetTypesService {
5031
5031
  __and: [{ __has: 'c8y_IsAssetType' }, { name: 'group' }]
5032
5032
  }
5033
5033
  };
5034
- this.assetTypesCache = {};
5035
5034
  this.DEFAULT_GROUP_ICON = 'c8y-group';
5036
5035
  this.DEFAULT_GROUP_ICON_OPEN = 'c8y-group-open';
5036
+ this.assetTypesCache = {};
5037
+ this.isCacheSet = false;
5037
5038
  this.appStateService.currentUser
5038
5039
  .pipe(map(user => user?.id), distinctUntilChanged(), switchMap(userId => {
5039
5040
  if (userId) {
@@ -5049,7 +5050,7 @@ class AssetTypesService {
5049
5050
  }
5050
5051
  /**
5051
5052
  * Queries available asset types and adds every asset type to the local cache.
5052
- * @returns void.
5053
+ * @returns IManagedObject table of asset types.
5053
5054
  */
5054
5055
  async initAssetTypesCache() {
5055
5056
  const { data } = await this.inventory.list({
@@ -5058,7 +5059,8 @@ class AssetTypesService {
5058
5059
  pageSize: 2000
5059
5060
  });
5060
5061
  data.forEach(assetType => this.addAssetType(assetType));
5061
- return;
5062
+ this.isCacheSet = true;
5063
+ return data;
5062
5064
  }
5063
5065
  /**
5064
5066
  * Returns an asset type from the cache based on the unique name property.
@@ -5089,42 +5091,21 @@ class AssetTypesService {
5089
5091
  * Defaults to false.
5090
5092
  * @returns Returns an icon for a given asset type.
5091
5093
  */
5092
- getIcon(type, open = false) {
5094
+ async getIcon(type, open = false) {
5095
+ if (!this.isCacheSet) {
5096
+ try {
5097
+ await this.initAssetTypesCache();
5098
+ }
5099
+ catch (error) {
5100
+ // do nothing
5101
+ }
5102
+ }
5093
5103
  const assetType = this.getAssetTypeByName(type);
5094
- const icon = assetType?.c8y_IsAssetType?.icon?.name || this.getDefaultGroupIcon(open);
5095
- return icon;
5104
+ return assetType?.c8y_IsAssetType?.icon?.name || this.getDefaultGroupIcon(open);
5096
5105
  }
5097
5106
  getDefaultGroupIcon(open = false) {
5098
5107
  return open ? this.DEFAULT_GROUP_ICON_OPEN : this.DEFAULT_GROUP_ICON;
5099
5108
  }
5100
- /**
5101
- * Checks if the default asset type 'group' already exists and if it doesn't it will be created.
5102
- * @returns void.
5103
- */
5104
- async createAssetTypeGroupIfNotExists() {
5105
- const managedObjects = (await this.inventory.listQuery(this.ASSET_TYPE_GROUP_QUERY)).data;
5106
- if (managedObjects.length > 0) {
5107
- return;
5108
- }
5109
- // if default group asset type doesn't exit create it
5110
- await this.createDefaultAssetTypeGroup();
5111
- }
5112
- /**
5113
- * create the default asset type group in the Inventory.
5114
- */
5115
- async createDefaultAssetTypeGroup() {
5116
- await this.inventory.create({
5117
- label: 'Group',
5118
- name: 'group',
5119
- description: 'Default group asset type',
5120
- c8y_IsAssetType: {
5121
- icon: 'folder',
5122
- propertyIds: [],
5123
- allowedAssetTypeIds: [],
5124
- isNoneChildAssetsAllowed: 'false'
5125
- }
5126
- });
5127
- }
5128
5109
  /**
5129
5110
  * Add an asset type to the local cache.
5130
5111
  * @param assetType Asset type which should be added to the cache.
@@ -5294,10 +5275,10 @@ class GroupService {
5294
5275
  * @param open Determines whether the method should return an alternative icon showing the open state.
5295
5276
  * @returns Returns an icon.
5296
5277
  */
5297
- getIcon(mo, open = false) {
5278
+ async getIcon(mo, open = false) {
5298
5279
  const genericMoType = this.determineMoType(mo);
5299
5280
  if (genericMoType === 'asset') {
5300
- return this.getAssetCustomIcon(mo.type, open);
5281
+ return await this.getAssetCustomIcon(mo.type, open);
5301
5282
  }
5302
5283
  const typeIcons = this.getDefaultIcon(genericMoType);
5303
5284
  return (open && typeIcons.iconOpen) || typeIcons.icon;
@@ -5392,8 +5373,8 @@ GroupService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version
5392
5373
  __decorate([
5393
5374
  memoize(property('id')),
5394
5375
  __metadata("design:type", Function),
5395
- __metadata("design:paramtypes", [Object, Boolean]),
5396
- __metadata("design:returntype", String)
5376
+ __metadata("design:paramtypes", [Object, Object]),
5377
+ __metadata("design:returntype", Promise)
5397
5378
  ], GroupService.prototype, "getIcon", null);
5398
5379
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GroupService, decorators: [{
5399
5380
  type: Injectable,
@@ -5406,7 +5387,7 @@ class GetGroupIconPipe {
5406
5387
  constructor(groupService) {
5407
5388
  this.groupService = groupService;
5408
5389
  }
5409
- transform(mo) {
5390
+ async transform(mo) {
5410
5391
  return this.groupService.getIcon(mo);
5411
5392
  }
5412
5393
  }
@@ -17765,10 +17746,10 @@ class SearchInputComponent {
17765
17746
  }
17766
17747
  }
17767
17748
  SearchInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: SearchInputComponent, deps: [{ token: i1.Router }, { token: i1$2.InventoryService }, { token: InventorySearchService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
17768
- SearchInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: SearchInputComponent, selector: "c8y-search-input", inputs: { mode: "mode", enableCustomTemplatePlaceholder: "enableCustomTemplatePlaceholder", externalTerm: "externalTerm", customDataQuery: "customDataQuery", container: "container", groupsOnly: "groupsOnly" }, outputs: { filter: "filter", search: "search", reset: "reset", onClick: "onClick" }, host: { listeners: { "document:keydown": "onKeydownHandler($event)" } }, viewQueries: [{ propertyName: "typeahead", first: true, predicate: TypeaheadComponent, descendants: true }, { propertyName: "dropdown", first: true, predicate: ["searchDropdown"], descendants: true }], ngImport: i0, template: "<div\n class=\"dropdown\"\n dropdown\n #searchDropdown=\"bs-dropdown\"\n [insideClick]=\"true\"\n (isOpenChange)=\"onOpenChange($event)\"\n *ngIf=\"mode === 'search'\"\n [cdkTrapFocus]=\"searchDropdown.isOpen\"\n>\n <button\n class=\"main-header-button dropdown-toggle c8y-dropdown\"\n dropdownToggle\n type=\"button\"\n [title]=\"'Search' | translate\"\n data-cy=\"search-input--search-btn\"\n >\n <i c8yIcon=\"search\" class=\"icon-2x\"></i>\n </button>\n\n <div\n id=\"searchDropdown\"\n *dropdownMenu\n class=\"search-header-menu dropdown-menu dropdown-menu-right\"\n >\n <ng-container *ngTemplateOutlet=\"form\"></ng-container>\n </div>\n</div>\n\n<div class=\"search-header-inline\" *ngIf=\"mode === 'select'\">\n <ng-container *ngTemplateOutlet=\"form\"></ng-container>\n</div>\n<ng-template #form>\n <form [ngClass]=\"{ 'c8y-search-form': mode === 'search' }\" novalidate #searchForm=\"ngForm\">\n <c8y-typeahead\n [(ngModel)]=\"selected\"\n placeholder=\"{{ 'Search for groups or assets\u2026' | translate }}\"\n (keydown)=\"keyDown($event)\"\n (onIconClick)=\"onReset($event)\"\n [icon]=\"term ? 'times' : 'search'\"\n [allowFreeEntries]=\"false\"\n [container]=\"container\"\n name=\"selected\"\n title=\"Search\"\n >\n <div\n *ngIf=\"enableCustomTemplatePlaceholder && mode === 'search'\"\n class=\"c8y-list__item p-l-24 p-r-24 p-b-8 separator-bottom sticky-top p-t-4\"\n >\n <ng-content></ng-content>\n </div>\n\n <!-- filter buttons -->\n <c8y-li *ngIf=\"term.length !== 0\" class=\"p-l-16 p-r-16\">\n <div class=\"d-flex\" *ngIf=\"mode === 'search'\">\n <p class=\"m-r-4 text-muted\">\n <em translate>Searching by exact match. Click for other search options:</em>\n </p>\n <div class=\"btn-group btn-group-sm\">\n <button\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Starts with' | translate }}\"\n data-cy=\"search-input--search-starts-with\"\n (click)=\"onFilter(term + '*')\"\n >\n {{ 'Starts with' | translate }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Contains' | translate }}\"\n data-cy=\"search-input--search-contains\"\n (click)=\"onFilter('*' + term + '*')\"\n >\n {{ 'Contains' | translate }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Ends with' | translate }}\"\n data-cy=\"search-input--search-ends-with\"\n (click)=\"onFilter('*' + term)\"\n >\n {{ 'Ends with' | translate }}\n </button>\n </div>\n </div>\n </c8y-li>\n\n <!-- Recent search -->\n <c8y-li\n *ngIf=\"term.length === 0 && recentSearchResults.length > 0\"\n [selectable]=\"false\"\n class=\"p-l-24 p-r-24\"\n >\n <div class=\"legend form-block\">\n <span translate>Recent search views</span>\n </div>\n </c8y-li>\n <c8y-li\n *ngFor=\"let result of term.length === 0 ? recentSearchResults : []\"\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n (click)=\"open($event, result, result.name)\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i [c8yIcon]=\"result | getGroupIcon\" class=\"c8y-icon-duocolor\"></i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- Recently registered devices -->\n <c8y-li\n *ngIf=\"term.length === 0 && (recentlyRegisteredResults$ | async)?.data?.length > 0 && !groupsOnly\"\n class=\"p-l-24 p-r-24\"\n [selectable]=\"false\"\n >\n <div class=\"legend form-block\">\n <span translate>Recently registered devices</span>\n </div>\n </c8y-li>\n <c8y-li\n *c8yFor=\"\n let result of (term.length === 0 && !groupsOnly) ? recentlyRegisteredResults$ : { data: [] };\n loadMore: 'none';\n \"\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n (click)=\"open($event, result, result.name)\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i [c8yIcon]=\"result | getGroupIcon\" class=\"c8y-icon-duocolor\"></i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- Search results -->\n <c8y-li *ngIf=\"term.length !== 0\" class=\"p-l-24 p-r-24\" [selectable]=\"false\">\n <div class=\"legend form-block\">\n <span translate>Search results</span>\n </div>\n </c8y-li>\n <c8y-li\n *c8yFor=\"\n let result of results$;\n loadMore: 'auto';\n notFound: notFoundTemplate;\n loadingTemplate: loading;\n loadNextLabel: 'Find more\u2026'\n \"\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n (click)=\"open($event, result, result.name)\"\n [title]=\"result.name\"\n data-cy=\"search-input--search-results\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i [c8yIcon]=\"result | getGroupIcon\" class=\"c8y-icon-duocolor\"></i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- No search results found entry -->\n <ng-template #notFoundTemplate>\n <c8y-li *ngIf=\"noMatch\" class=\"p-16 c8y-empty-state\" data-cy=\"search-input--empty-state\" [selectable]=\"false\">\n <c8y-li-icon [icon]=\"'search'\"></c8y-li-icon>\n <p><strong translate>No match found.</strong></p>\n <small translate *ngIf=\"mode === 'search'\">\n Try to filter or open the asset grid to show all devices and groups.\n </small>\n <small translate *ngIf=\"mode === 'select'\">Try to rephrase your search word.</small>\n </c8y-li>\n </ng-template>\n\n <!-- loading bar first entries -->\n <c8y-li *ngIf=\"isLoading\" class=\"p-t-32 p-b-0\" style=\"position: relative\">\n <div class=\"spinner\" style=\"right: 0\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n </div>\n </c8y-li>\n\n <!-- loading bar for loading more entries (inventory roles) -->\n <ng-template #loading>\n <c8y-li class=\"text-center p-t-32 p-b-0\" style=\"position: relative\">\n <div class=\"spinner\" style=\"right: 0\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n </div>\n </c8y-li>\n </ng-template>\n\n <!-- more filter possibilities -->\n <c8y-li\n class=\"m-t-24 bg-level-2 p-t-16 p-b-16 p-l-24 p-r-24 sticky-bottom\"\n [selectable]=\"false\"\n *ngIf=\"mode === 'search'\"\n >\n <div class=\"d-flex a-i-center\">\n <i c8yIcon=\"info-circle\" class=\"text-info m-r-4\"></i>\n <p translate class=\"m-r-8\">Need more filter possibilities?</p>\n <button\n title=\"{{ 'Go to the asset data table' | translate }}\"\n data-cy=\"search-input--asset-table-btn\"\n type=\"button\"\n class=\"m-l-16 btn btn-default btn-sm\"\n (mousedown)=\"onOpenAssetTable()\"\n >\n {{ 'Go to the asset data table' | translate }}\n </button>\n </div>\n </c8y-li>\n </c8y-typeahead>\n </form>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$7.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$7.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$7.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected"], outputs: ["onSearch", "onIconClick"] }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: DeviceStatusComponent, selector: "device-status", inputs: ["mo"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: ShouldShowMoPipe, name: "shouldShowMo" }, { kind: "pipe", type: GetGroupIconPipe, name: "getGroupIcon" }] });
17749
+ SearchInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: SearchInputComponent, selector: "c8y-search-input", inputs: { mode: "mode", enableCustomTemplatePlaceholder: "enableCustomTemplatePlaceholder", externalTerm: "externalTerm", customDataQuery: "customDataQuery", container: "container", groupsOnly: "groupsOnly" }, outputs: { filter: "filter", search: "search", reset: "reset", onClick: "onClick" }, host: { listeners: { "document:keydown": "onKeydownHandler($event)" } }, viewQueries: [{ propertyName: "typeahead", first: true, predicate: TypeaheadComponent, descendants: true }, { propertyName: "dropdown", first: true, predicate: ["searchDropdown"], descendants: true }], ngImport: i0, template: "<div\n class=\"dropdown\"\n dropdown\n #searchDropdown=\"bs-dropdown\"\n [insideClick]=\"true\"\n (isOpenChange)=\"onOpenChange($event)\"\n *ngIf=\"mode === 'search'\"\n [cdkTrapFocus]=\"searchDropdown.isOpen\"\n>\n <button\n class=\"main-header-button dropdown-toggle c8y-dropdown\"\n [title]=\"'Search' | translate\"\n type=\"button\"\n dropdownToggle\n data-cy=\"search-input--search-btn\"\n >\n <i\n class=\"icon-2x\"\n c8yIcon=\"search\"\n ></i>\n </button>\n\n <div\n class=\"search-header-menu dropdown-menu dropdown-menu-right\"\n id=\"searchDropdown\"\n *dropdownMenu\n >\n <ng-container *ngTemplateOutlet=\"form\"></ng-container>\n </div>\n</div>\n\n<div \n class=\"search-header-inline\" \n *ngIf=\"mode === 'select'\"\n>\n <ng-container *ngTemplateOutlet=\"form\"></ng-container>\n</div>\n<ng-template #form>\n <form \n [ngClass]=\"{ 'c8y-search-form': mode === 'search' }\" \n novalidate \n #searchForm=\"ngForm\"\n >\n <c8y-typeahead\n [(ngModel)]=\"selected\"\n placeholder=\"{{ 'Search for groups or assets\u2026' | translate }}\"\n (keydown)=\"keyDown($event)\"\n (onIconClick)=\"onReset($event)\"\n [icon]=\"term ? 'times' : 'search'\"\n [allowFreeEntries]=\"false\"\n [container]=\"container\"\n name=\"selected\"\n title=\"Search\"\n >\n <div\n class=\"c8y-list__item p-l-24 p-r-24 p-b-8 separator-bottom sticky-top p-t-4\"\n *ngIf=\"enableCustomTemplatePlaceholder && mode === 'search'\"\n >\n <ng-content></ng-content>\n </div>\n\n <!-- filter buttons -->\n <c8y-li *ngIf=\"term.length !== 0\" class=\"p-l-16 p-r-16\">\n <div class=\"d-flex\" *ngIf=\"mode === 'search'\">\n <p class=\"m-r-4 text-muted\">\n <em translate>Searching by exact match. Click for other search options:</em>\n </p>\n <div class=\"btn-group btn-group-sm\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Starts with' | translate }}\"\n data-cy=\"search-input--search-starts-with\"\n (click)=\"onFilter(term + '*')\"\n >\n {{ 'Starts with' | translate }}\n </button>\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Contains' | translate }}\"\n data-cy=\"search-input--search-contains\"\n (click)=\"onFilter('*' + term + '*')\"\n >\n {{ 'Contains' | translate }}\n </button>\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Ends with' | translate }}\"\n data-cy=\"search-input--search-ends-with\"\n (click)=\"onFilter('*' + term)\"\n >\n {{ 'Ends with' | translate }}\n </button>\n </div>\n </div>\n </c8y-li>\n\n <!-- Recent search -->\n <c8y-li\n class=\"p-l-24 p-r-24\"\n *ngIf=\"term.length === 0 && recentSearchResults.length > 0\"\n [selectable]=\"false\"\n >\n <div class=\"legend form-block\">\n <span translate>Recent search views</span>\n </div>\n </c8y-li>\n <c8y-li\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n *ngFor=\"let result of term.length === 0 ? recentSearchResults : []\"\n (click)=\"open($event, result, result.name)\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i \n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"result | getGroupIcon | async\"\n >\n </i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- Recently registered devices -->\n <c8y-li\n *ngIf=\"term.length === 0 && (recentlyRegisteredResults$ | async)?.data?.length > 0 && !groupsOnly\"\n class=\"p-l-24 p-r-24\"\n [selectable]=\"false\"\n >\n <div class=\"legend form-block\">\n <span translate>Recently registered devices</span>\n </div>\n </c8y-li>\n <c8y-li\n *c8yFor=\"\n let result of (term.length === 0 && !groupsOnly) ? recentlyRegisteredResults$ : { data: [] };\n loadMore: 'none';\n \"\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n (click)=\"open($event, result, result.name)\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i \n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"result | getGroupIcon | async\" \n >\n </i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- Search results -->\n <c8y-li *ngIf=\"term.length !== 0\" class=\"p-l-24 p-r-24\" [selectable]=\"false\">\n <div class=\"legend form-block\">\n <span translate>Search results</span>\n </div>\n </c8y-li>\n <c8y-li\n *c8yFor=\"\n let result of results$;\n loadMore: 'auto';\n notFound: notFoundTemplate;\n loadingTemplate: loading;\n loadNextLabel: 'Find more\u2026'\n \"\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n (click)=\"open($event, result, result.name)\"\n [title]=\"result.name\"\n data-cy=\"search-input--search-results\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i \n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"result | getGroupIcon | async\"\n >\n </i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- No search results found entry -->\n <ng-template #notFoundTemplate>\n <c8y-li *ngIf=\"noMatch\" class=\"p-16 c8y-empty-state\" data-cy=\"search-input--empty-state\" [selectable]=\"false\">\n <c8y-li-icon [icon]=\"'search'\"></c8y-li-icon>\n <p><strong translate>No match found.</strong></p>\n <small translate *ngIf=\"mode === 'search'\">\n Try to filter or open the asset grid to show all devices and groups.\n </small>\n <small translate *ngIf=\"mode === 'select'\">Try to rephrase your search word.</small>\n </c8y-li>\n </ng-template>\n\n <!-- loading bar first entries -->\n <c8y-li *ngIf=\"isLoading\" class=\"p-t-32 p-b-0\" style=\"position: relative\">\n <div class=\"spinner\" style=\"right: 0\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n </div>\n </c8y-li>\n\n <!-- loading bar for loading more entries (inventory roles) -->\n <ng-template #loading>\n <c8y-li class=\"text-center p-t-32 p-b-0\" style=\"position: relative\">\n <div class=\"spinner\" style=\"right: 0\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n </div>\n </c8y-li>\n </ng-template>\n\n <!-- more filter possibilities -->\n <c8y-li\n class=\"m-t-24 bg-level-2 p-t-16 p-b-16 p-l-24 p-r-24 sticky-bottom\"\n [selectable]=\"false\"\n *ngIf=\"mode === 'search'\"\n >\n <div class=\"d-flex a-i-center\">\n <i c8yIcon=\"info-circle\" class=\"text-info m-r-4\"></i>\n <p translate class=\"m-r-8\">Need more filter possibilities?</p>\n <button\n class=\"m-l-16 btn btn-default btn-sm\"\n title=\"{{ 'Go to the asset data table' | translate }}\"\n data-cy=\"search-input--asset-table-btn\"\n type=\"button\"\n (mousedown)=\"onOpenAssetTable()\"\n >\n {{ 'Go to the asset data table' | translate }}\n </button>\n </div>\n </c8y-li>\n </c8y-typeahead>\n </form>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$7.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$7.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$7.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: TypeaheadComponent, selector: "c8y-typeahead", inputs: ["required", "maxlength", "disabled", "allowFreeEntries", "placeholder", "displayProperty", "icon", "name", "autoClose", "hideNew", "container", "selected"], outputs: ["onSearch", "onIconClick"] }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: DeviceStatusComponent, selector: "device-status", inputs: ["mo"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: ShouldShowMoPipe, name: "shouldShowMo" }, { kind: "pipe", type: GetGroupIconPipe, name: "getGroupIcon" }] });
17769
17750
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: SearchInputComponent, decorators: [{
17770
17751
  type: Component,
17771
- args: [{ selector: 'c8y-search-input', template: "<div\n class=\"dropdown\"\n dropdown\n #searchDropdown=\"bs-dropdown\"\n [insideClick]=\"true\"\n (isOpenChange)=\"onOpenChange($event)\"\n *ngIf=\"mode === 'search'\"\n [cdkTrapFocus]=\"searchDropdown.isOpen\"\n>\n <button\n class=\"main-header-button dropdown-toggle c8y-dropdown\"\n dropdownToggle\n type=\"button\"\n [title]=\"'Search' | translate\"\n data-cy=\"search-input--search-btn\"\n >\n <i c8yIcon=\"search\" class=\"icon-2x\"></i>\n </button>\n\n <div\n id=\"searchDropdown\"\n *dropdownMenu\n class=\"search-header-menu dropdown-menu dropdown-menu-right\"\n >\n <ng-container *ngTemplateOutlet=\"form\"></ng-container>\n </div>\n</div>\n\n<div class=\"search-header-inline\" *ngIf=\"mode === 'select'\">\n <ng-container *ngTemplateOutlet=\"form\"></ng-container>\n</div>\n<ng-template #form>\n <form [ngClass]=\"{ 'c8y-search-form': mode === 'search' }\" novalidate #searchForm=\"ngForm\">\n <c8y-typeahead\n [(ngModel)]=\"selected\"\n placeholder=\"{{ 'Search for groups or assets\u2026' | translate }}\"\n (keydown)=\"keyDown($event)\"\n (onIconClick)=\"onReset($event)\"\n [icon]=\"term ? 'times' : 'search'\"\n [allowFreeEntries]=\"false\"\n [container]=\"container\"\n name=\"selected\"\n title=\"Search\"\n >\n <div\n *ngIf=\"enableCustomTemplatePlaceholder && mode === 'search'\"\n class=\"c8y-list__item p-l-24 p-r-24 p-b-8 separator-bottom sticky-top p-t-4\"\n >\n <ng-content></ng-content>\n </div>\n\n <!-- filter buttons -->\n <c8y-li *ngIf=\"term.length !== 0\" class=\"p-l-16 p-r-16\">\n <div class=\"d-flex\" *ngIf=\"mode === 'search'\">\n <p class=\"m-r-4 text-muted\">\n <em translate>Searching by exact match. Click for other search options:</em>\n </p>\n <div class=\"btn-group btn-group-sm\">\n <button\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Starts with' | translate }}\"\n data-cy=\"search-input--search-starts-with\"\n (click)=\"onFilter(term + '*')\"\n >\n {{ 'Starts with' | translate }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Contains' | translate }}\"\n data-cy=\"search-input--search-contains\"\n (click)=\"onFilter('*' + term + '*')\"\n >\n {{ 'Contains' | translate }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Ends with' | translate }}\"\n data-cy=\"search-input--search-ends-with\"\n (click)=\"onFilter('*' + term)\"\n >\n {{ 'Ends with' | translate }}\n </button>\n </div>\n </div>\n </c8y-li>\n\n <!-- Recent search -->\n <c8y-li\n *ngIf=\"term.length === 0 && recentSearchResults.length > 0\"\n [selectable]=\"false\"\n class=\"p-l-24 p-r-24\"\n >\n <div class=\"legend form-block\">\n <span translate>Recent search views</span>\n </div>\n </c8y-li>\n <c8y-li\n *ngFor=\"let result of term.length === 0 ? recentSearchResults : []\"\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n (click)=\"open($event, result, result.name)\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i [c8yIcon]=\"result | getGroupIcon\" class=\"c8y-icon-duocolor\"></i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- Recently registered devices -->\n <c8y-li\n *ngIf=\"term.length === 0 && (recentlyRegisteredResults$ | async)?.data?.length > 0 && !groupsOnly\"\n class=\"p-l-24 p-r-24\"\n [selectable]=\"false\"\n >\n <div class=\"legend form-block\">\n <span translate>Recently registered devices</span>\n </div>\n </c8y-li>\n <c8y-li\n *c8yFor=\"\n let result of (term.length === 0 && !groupsOnly) ? recentlyRegisteredResults$ : { data: [] };\n loadMore: 'none';\n \"\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n (click)=\"open($event, result, result.name)\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i [c8yIcon]=\"result | getGroupIcon\" class=\"c8y-icon-duocolor\"></i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- Search results -->\n <c8y-li *ngIf=\"term.length !== 0\" class=\"p-l-24 p-r-24\" [selectable]=\"false\">\n <div class=\"legend form-block\">\n <span translate>Search results</span>\n </div>\n </c8y-li>\n <c8y-li\n *c8yFor=\"\n let result of results$;\n loadMore: 'auto';\n notFound: notFoundTemplate;\n loadingTemplate: loading;\n loadNextLabel: 'Find more\u2026'\n \"\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n (click)=\"open($event, result, result.name)\"\n [title]=\"result.name\"\n data-cy=\"search-input--search-results\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i [c8yIcon]=\"result | getGroupIcon\" class=\"c8y-icon-duocolor\"></i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- No search results found entry -->\n <ng-template #notFoundTemplate>\n <c8y-li *ngIf=\"noMatch\" class=\"p-16 c8y-empty-state\" data-cy=\"search-input--empty-state\" [selectable]=\"false\">\n <c8y-li-icon [icon]=\"'search'\"></c8y-li-icon>\n <p><strong translate>No match found.</strong></p>\n <small translate *ngIf=\"mode === 'search'\">\n Try to filter or open the asset grid to show all devices and groups.\n </small>\n <small translate *ngIf=\"mode === 'select'\">Try to rephrase your search word.</small>\n </c8y-li>\n </ng-template>\n\n <!-- loading bar first entries -->\n <c8y-li *ngIf=\"isLoading\" class=\"p-t-32 p-b-0\" style=\"position: relative\">\n <div class=\"spinner\" style=\"right: 0\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n </div>\n </c8y-li>\n\n <!-- loading bar for loading more entries (inventory roles) -->\n <ng-template #loading>\n <c8y-li class=\"text-center p-t-32 p-b-0\" style=\"position: relative\">\n <div class=\"spinner\" style=\"right: 0\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n </div>\n </c8y-li>\n </ng-template>\n\n <!-- more filter possibilities -->\n <c8y-li\n class=\"m-t-24 bg-level-2 p-t-16 p-b-16 p-l-24 p-r-24 sticky-bottom\"\n [selectable]=\"false\"\n *ngIf=\"mode === 'search'\"\n >\n <div class=\"d-flex a-i-center\">\n <i c8yIcon=\"info-circle\" class=\"text-info m-r-4\"></i>\n <p translate class=\"m-r-8\">Need more filter possibilities?</p>\n <button\n title=\"{{ 'Go to the asset data table' | translate }}\"\n data-cy=\"search-input--asset-table-btn\"\n type=\"button\"\n class=\"m-l-16 btn btn-default btn-sm\"\n (mousedown)=\"onOpenAssetTable()\"\n >\n {{ 'Go to the asset data table' | translate }}\n </button>\n </div>\n </c8y-li>\n </c8y-typeahead>\n </form>\n</ng-template>\n" }]
17752
+ args: [{ selector: 'c8y-search-input', template: "<div\n class=\"dropdown\"\n dropdown\n #searchDropdown=\"bs-dropdown\"\n [insideClick]=\"true\"\n (isOpenChange)=\"onOpenChange($event)\"\n *ngIf=\"mode === 'search'\"\n [cdkTrapFocus]=\"searchDropdown.isOpen\"\n>\n <button\n class=\"main-header-button dropdown-toggle c8y-dropdown\"\n [title]=\"'Search' | translate\"\n type=\"button\"\n dropdownToggle\n data-cy=\"search-input--search-btn\"\n >\n <i\n class=\"icon-2x\"\n c8yIcon=\"search\"\n ></i>\n </button>\n\n <div\n class=\"search-header-menu dropdown-menu dropdown-menu-right\"\n id=\"searchDropdown\"\n *dropdownMenu\n >\n <ng-container *ngTemplateOutlet=\"form\"></ng-container>\n </div>\n</div>\n\n<div \n class=\"search-header-inline\" \n *ngIf=\"mode === 'select'\"\n>\n <ng-container *ngTemplateOutlet=\"form\"></ng-container>\n</div>\n<ng-template #form>\n <form \n [ngClass]=\"{ 'c8y-search-form': mode === 'search' }\" \n novalidate \n #searchForm=\"ngForm\"\n >\n <c8y-typeahead\n [(ngModel)]=\"selected\"\n placeholder=\"{{ 'Search for groups or assets\u2026' | translate }}\"\n (keydown)=\"keyDown($event)\"\n (onIconClick)=\"onReset($event)\"\n [icon]=\"term ? 'times' : 'search'\"\n [allowFreeEntries]=\"false\"\n [container]=\"container\"\n name=\"selected\"\n title=\"Search\"\n >\n <div\n class=\"c8y-list__item p-l-24 p-r-24 p-b-8 separator-bottom sticky-top p-t-4\"\n *ngIf=\"enableCustomTemplatePlaceholder && mode === 'search'\"\n >\n <ng-content></ng-content>\n </div>\n\n <!-- filter buttons -->\n <c8y-li *ngIf=\"term.length !== 0\" class=\"p-l-16 p-r-16\">\n <div class=\"d-flex\" *ngIf=\"mode === 'search'\">\n <p class=\"m-r-4 text-muted\">\n <em translate>Searching by exact match. Click for other search options:</em>\n </p>\n <div class=\"btn-group btn-group-sm\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Starts with' | translate }}\"\n data-cy=\"search-input--search-starts-with\"\n (click)=\"onFilter(term + '*')\"\n >\n {{ 'Starts with' | translate }}\n </button>\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Contains' | translate }}\"\n data-cy=\"search-input--search-contains\"\n (click)=\"onFilter('*' + term + '*')\"\n >\n {{ 'Contains' | translate }}\n </button>\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Ends with' | translate }}\"\n data-cy=\"search-input--search-ends-with\"\n (click)=\"onFilter('*' + term)\"\n >\n {{ 'Ends with' | translate }}\n </button>\n </div>\n </div>\n </c8y-li>\n\n <!-- Recent search -->\n <c8y-li\n class=\"p-l-24 p-r-24\"\n *ngIf=\"term.length === 0 && recentSearchResults.length > 0\"\n [selectable]=\"false\"\n >\n <div class=\"legend form-block\">\n <span translate>Recent search views</span>\n </div>\n </c8y-li>\n <c8y-li\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n *ngFor=\"let result of term.length === 0 ? recentSearchResults : []\"\n (click)=\"open($event, result, result.name)\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i \n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"result | getGroupIcon | async\"\n >\n </i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- Recently registered devices -->\n <c8y-li\n *ngIf=\"term.length === 0 && (recentlyRegisteredResults$ | async)?.data?.length > 0 && !groupsOnly\"\n class=\"p-l-24 p-r-24\"\n [selectable]=\"false\"\n >\n <div class=\"legend form-block\">\n <span translate>Recently registered devices</span>\n </div>\n </c8y-li>\n <c8y-li\n *c8yFor=\"\n let result of (term.length === 0 && !groupsOnly) ? recentlyRegisteredResults$ : { data: [] };\n loadMore: 'none';\n \"\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n (click)=\"open($event, result, result.name)\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i \n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"result | getGroupIcon | async\" \n >\n </i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- Search results -->\n <c8y-li *ngIf=\"term.length !== 0\" class=\"p-l-24 p-r-24\" [selectable]=\"false\">\n <div class=\"legend form-block\">\n <span translate>Search results</span>\n </div>\n </c8y-li>\n <c8y-li\n *c8yFor=\"\n let result of results$;\n loadMore: 'auto';\n notFound: notFoundTemplate;\n loadingTemplate: loading;\n loadNextLabel: 'Find more\u2026'\n \"\n class=\"c8y-list__item--link m-l-16 m-r-16\"\n (click)=\"open($event, result, result.name)\"\n [title]=\"result.name\"\n data-cy=\"search-input--search-results\"\n >\n <c8y-li-icon>\n <ng-container *ngIf=\"result | shouldShowMo: deviceType.DEVICE; else group\">\n <device-status [mo]=\"result\"></device-status>\n </ng-container>\n <ng-template #group>\n <i \n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"result | getGroupIcon | async\"\n >\n </i>\n </ng-template>\n </c8y-li-icon>\n {{ result.name || '--' }}\n </c8y-li>\n\n <!-- No search results found entry -->\n <ng-template #notFoundTemplate>\n <c8y-li *ngIf=\"noMatch\" class=\"p-16 c8y-empty-state\" data-cy=\"search-input--empty-state\" [selectable]=\"false\">\n <c8y-li-icon [icon]=\"'search'\"></c8y-li-icon>\n <p><strong translate>No match found.</strong></p>\n <small translate *ngIf=\"mode === 'search'\">\n Try to filter or open the asset grid to show all devices and groups.\n </small>\n <small translate *ngIf=\"mode === 'select'\">Try to rephrase your search word.</small>\n </c8y-li>\n </ng-template>\n\n <!-- loading bar first entries -->\n <c8y-li *ngIf=\"isLoading\" class=\"p-t-32 p-b-0\" style=\"position: relative\">\n <div class=\"spinner\" style=\"right: 0\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n </div>\n </c8y-li>\n\n <!-- loading bar for loading more entries (inventory roles) -->\n <ng-template #loading>\n <c8y-li class=\"text-center p-t-32 p-b-0\" style=\"position: relative\">\n <div class=\"spinner\" style=\"right: 0\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n </div>\n </c8y-li>\n </ng-template>\n\n <!-- more filter possibilities -->\n <c8y-li\n class=\"m-t-24 bg-level-2 p-t-16 p-b-16 p-l-24 p-r-24 sticky-bottom\"\n [selectable]=\"false\"\n *ngIf=\"mode === 'search'\"\n >\n <div class=\"d-flex a-i-center\">\n <i c8yIcon=\"info-circle\" class=\"text-info m-r-4\"></i>\n <p translate class=\"m-r-8\">Need more filter possibilities?</p>\n <button\n class=\"m-l-16 btn btn-default btn-sm\"\n title=\"{{ 'Go to the asset data table' | translate }}\"\n data-cy=\"search-input--asset-table-btn\"\n type=\"button\"\n (mousedown)=\"onOpenAssetTable()\"\n >\n {{ 'Go to the asset data table' | translate }}\n </button>\n </div>\n </c8y-li>\n </c8y-typeahead>\n </form>\n</ng-template>\n" }]
17772
17753
  }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1$2.InventoryService }, { type: InventorySearchService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
17773
17754
  type: Input
17774
17755
  }], enableCustomTemplatePlaceholder: [{