diff --git a/application/src/main/java/org/thingsboard/server/controller/WidgetTypeController.java b/application/src/main/java/org/thingsboard/server/controller/WidgetTypeController.java index 4d389240d7..4aeaeb2210 100644 --- a/application/src/main/java/org/thingsboard/server/controller/WidgetTypeController.java +++ b/application/src/main/java/org/thingsboard/server/controller/WidgetTypeController.java @@ -74,6 +74,7 @@ public class WidgetTypeController extends AutoCommitController { "Those properties are useful to edit the Widget Type but they are not required for Dashboard rendering. "; private static final String WIDGET_TYPE_INFO_DESCRIPTION = "Widget Type Info is a lightweight object that represents Widget Type but does not contain the heavyweight widget descriptor JSON"; private static final String TENANT_ONLY_PARAM_DESCRIPTION = "Optional boolean parameter indicating whether only tenant widget types should be returned"; + private static final String FULL_SEARCH_PARAM_DESCRIPTION = "Optional boolean parameter indicating whether search widgets by description not only by name"; private static final String UPDATE_EXISTING_BY_FQN_PARAM_DESCRIPTION = "Optional boolean parameter indicating whether to update existing widget type by FQN if present instead of creating new one"; @ApiOperation(value = "Get Widget Type Details (getWidgetTypeById)", @@ -163,15 +164,17 @@ public class WidgetTypeController extends AutoCommitController { @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES) @RequestParam(required = false) String sortOrder, @ApiParam(value = TENANT_ONLY_PARAM_DESCRIPTION) - @RequestParam(required = false) Boolean tenantOnly) throws ThingsboardException { + @RequestParam(required = false) Boolean tenantOnly, + @ApiParam(value = FULL_SEARCH_PARAM_DESCRIPTION) + @RequestParam(required = false) Boolean fullSearch) throws ThingsboardException { PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); if (Authority.SYS_ADMIN.equals(getCurrentUser().getAuthority())) { - return checkNotNull(widgetTypeService.findSystemWidgetTypesByPageLink(getTenantId(), pageLink)); + return checkNotNull(widgetTypeService.findSystemWidgetTypesByPageLink(getTenantId(), fullSearch != null && fullSearch, pageLink)); } else { if (tenantOnly != null && tenantOnly) { - return checkNotNull(widgetTypeService.findTenantWidgetTypesByTenantIdAndPageLink(getTenantId(), pageLink)); + return checkNotNull(widgetTypeService.findTenantWidgetTypesByTenantIdAndPageLink(getTenantId(), fullSearch != null && fullSearch, pageLink)); } else { - return checkNotNull(widgetTypeService.findAllTenantWidgetTypesByTenantIdAndPageLink(getTenantId(), pageLink)); + return checkNotNull(widgetTypeService.findAllTenantWidgetTypesByTenantIdAndPageLink(getTenantId(), fullSearch != null && fullSearch, pageLink)); } } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/SystemWidgetTypesEdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/SystemWidgetTypesEdgeEventFetcher.java index 7dca9c9ccc..de4218fc53 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/SystemWidgetTypesEdgeEventFetcher.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/SystemWidgetTypesEdgeEventFetcher.java @@ -31,6 +31,6 @@ public class SystemWidgetTypesEdgeEventFetcher extends BaseWidgetTypesEdgeEventF @Override protected PageData findWidgetTypes(TenantId tenantId, PageLink pageLink) { - return widgetTypeService.findSystemWidgetTypesByPageLink(tenantId, pageLink); + return widgetTypeService.findSystemWidgetTypesByPageLink(tenantId, false, pageLink); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantWidgetTypesEdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantWidgetTypesEdgeEventFetcher.java index 1415056aef..24f0527c20 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantWidgetTypesEdgeEventFetcher.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantWidgetTypesEdgeEventFetcher.java @@ -30,6 +30,6 @@ public class TenantWidgetTypesEdgeEventFetcher extends BaseWidgetTypesEdgeEventF } @Override protected PageData findWidgetTypes(TenantId tenantId, PageLink pageLink) { - return widgetTypeService.findTenantWidgetTypesByTenantIdAndPageLink(tenantId, pageLink); + return widgetTypeService.findTenantWidgetTypesByTenantIdAndPageLink(tenantId, false, pageLink); } } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeService.java index 897775e0c0..edc6bb21da 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeService.java @@ -39,11 +39,11 @@ public interface WidgetTypeService extends EntityDaoService { void deleteWidgetType(TenantId tenantId, WidgetTypeId widgetTypeId); - PageData findSystemWidgetTypesByPageLink(TenantId tenantId, PageLink pageLink); + PageData findSystemWidgetTypesByPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink); - PageData findAllTenantWidgetTypesByTenantIdAndPageLink(TenantId tenantId, PageLink pageLink); + PageData findAllTenantWidgetTypesByTenantIdAndPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink); - PageData findTenantWidgetTypesByTenantIdAndPageLink(TenantId tenantId, PageLink pageLink); + PageData findTenantWidgetTypesByTenantIdAndPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink); List findWidgetTypesByWidgetsBundleId(TenantId tenantId, WidgetsBundleId widgetsBundleId); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java index ec0b92cc5f..0548ad814d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDao.java @@ -78,33 +78,36 @@ public class JpaWidgetTypeDao extends JpaAbstractDao findSystemWidgetTypes(TenantId tenantId, PageLink pageLink) { + public PageData findSystemWidgetTypes(TenantId tenantId, boolean fullSearch, PageLink pageLink) { return DaoUtil.toPageData( widgetTypeRepository .findSystemWidgetTypes( NULL_UUID, Objects.toString(pageLink.getTextSearch(), ""), + fullSearch, DaoUtil.toPageable(pageLink))); } @Override - public PageData findAllTenantWidgetTypesByTenantId(UUID tenantId, PageLink pageLink) { + public PageData findAllTenantWidgetTypesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink) { return DaoUtil.toPageData( widgetTypeRepository .findAllTenantWidgetTypesByTenantId( tenantId, NULL_UUID, Objects.toString(pageLink.getTextSearch(), ""), + fullSearch, DaoUtil.toPageable(pageLink))); } @Override - public PageData findTenantWidgetTypesByTenantId(UUID tenantId, PageLink pageLink) { + public PageData findTenantWidgetTypesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink) { return DaoUtil.toPageData( widgetTypeRepository .findTenantWidgetTypesByTenantId( tenantId, Objects.toString(pageLink.getTextSearch(), ""), + fullSearch, DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeRepository.java index b1b96b771e..41fa293dd5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeRepository.java @@ -38,23 +38,29 @@ public interface WidgetTypeRepository extends JpaRepository findSystemWidgetTypes(@Param("systemTenantId") UUID systemTenantId, @Param("searchText") String searchText, + @Param("fullSearch") boolean fullSearch, Pageable pageable); @Query("SELECT new org.thingsboard.server.dao.model.sql.WidgetTypeInfoEntity(wtd) FROM WidgetTypeDetailsEntity wtd WHERE wtd.tenantId IN (:tenantId, :nullTenantId) " + - "AND LOWER(wtd.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (LOWER(wtd.name) LIKE LOWER(CONCAT('%', :searchText, '%')) " + + "OR ((:fullSearch) IS TRUE AND LOWER(wtd.description) LIKE LOWER(CONCAT('%', :searchText, '%'))))") Page findAllTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId, - @Param("nullTenantId") UUID nullTenantId, - @Param("textSearch") String textSearch, - Pageable pageable); + @Param("nullTenantId") UUID nullTenantId, + @Param("searchText") String searchText, + @Param("fullSearch") boolean fullSearch, + Pageable pageable); @Query("SELECT new org.thingsboard.server.dao.model.sql.WidgetTypeInfoEntity(wtd) FROM WidgetTypeDetailsEntity wtd WHERE wtd.tenantId = :tenantId " + - "AND LOWER(wtd.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") + "AND (LOWER(wtd.name) LIKE LOWER(CONCAT('%', :searchText, '%')) " + + "OR ((:fullSearch) IS TRUE AND LOWER(wtd.description) LIKE LOWER(CONCAT('%', :searchText, '%'))))") Page findTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId, - @Param("textSearch") String textSearch, - Pageable pageable); + @Param("searchText") String searchText, + @Param("fullSearch") boolean fullSearch, + Pageable pageable); @Query("SELECT wtd FROM WidgetTypeDetailsEntity wtd WHERE wtd.tenantId = :tenantId " + "AND LOWER(wtd.name) LIKE LOWER(CONCAT('%', :textSearch, '%'))") diff --git a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeDao.java b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeDao.java index c943626c90..d9d19a9617 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeDao.java @@ -53,11 +53,11 @@ public interface WidgetTypeDao extends Dao, ExportableEntityD boolean existsByTenantIdAndId(TenantId tenantId, UUID widgetTypeId); - PageData findSystemWidgetTypes(TenantId tenantId, PageLink pageLink); + PageData findSystemWidgetTypes(TenantId tenantId, boolean fullSearch, PageLink pageLink); - PageData findAllTenantWidgetTypesByTenantId(UUID tenantId, PageLink pageLink); + PageData findAllTenantWidgetTypesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink); - PageData findTenantWidgetTypesByTenantId(UUID tenantId, PageLink pageLink); + PageData findTenantWidgetTypesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink); /** * Find widget types by widgetsBundleId. diff --git a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java index 19e428f5f2..410e0e4a3f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetTypeServiceImpl.java @@ -110,26 +110,26 @@ public class WidgetTypeServiceImpl implements WidgetTypeService { } @Override - public PageData findSystemWidgetTypesByPageLink(TenantId tenantId, PageLink pageLink) { - log.trace("Executing findSystemWidgetTypesByPageLink, pageLink [{}]", pageLink); + public PageData findSystemWidgetTypesByPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink) { + log.trace("Executing findSystemWidgetTypesByPageLink, fullSearch [{}] pageLink [{}]", fullSearch, pageLink); Validator.validatePageLink(pageLink); - return widgetTypeDao.findSystemWidgetTypes(tenantId, pageLink); + return widgetTypeDao.findSystemWidgetTypes(tenantId, fullSearch, pageLink); } @Override - public PageData findAllTenantWidgetTypesByTenantIdAndPageLink(TenantId tenantId, PageLink pageLink) { - log.trace("Executing findAllTenantWidgetTypesByTenantIdAndPageLink, tenantId [{}], pageLink [{}]", tenantId, pageLink); + public PageData findAllTenantWidgetTypesByTenantIdAndPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink) { + log.trace("Executing findAllTenantWidgetTypesByTenantIdAndPageLink, tenantId [{}], fullSearch [{}], pageLink [{}]", tenantId, fullSearch, pageLink); Validator.validateId(tenantId, INCORRECT_TENANT_ID + tenantId); Validator.validatePageLink(pageLink); - return widgetTypeDao.findAllTenantWidgetTypesByTenantId(tenantId.getId(), pageLink); + return widgetTypeDao.findAllTenantWidgetTypesByTenantId(tenantId.getId(), fullSearch, pageLink); } @Override - public PageData findTenantWidgetTypesByTenantIdAndPageLink(TenantId tenantId, PageLink pageLink) { - log.trace("Executing findTenantWidgetTypesByTenantIdAndPageLink, tenantId [{}], pageLink [{}]", tenantId, pageLink); + public PageData findTenantWidgetTypesByTenantIdAndPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink) { + log.trace("Executing findTenantWidgetTypesByTenantIdAndPageLink, tenantId [{}], fullSearch [{}], pageLink [{}]", tenantId, fullSearch, pageLink); Validator.validateId(tenantId, INCORRECT_TENANT_ID + tenantId); Validator.validatePageLink(pageLink); - return widgetTypeDao.findTenantWidgetTypesByTenantId(tenantId.getId(), pageLink); + return widgetTypeDao.findTenantWidgetTypesByTenantId(tenantId.getId(), fullSearch, pageLink); } @Override @@ -227,7 +227,7 @@ public class WidgetTypeServiceImpl implements WidgetTypeService { @Override protected PageData findEntities(TenantId tenantId, TenantId id, PageLink pageLink) { - return widgetTypeDao.findTenantWidgetTypesByTenantId(id.getId(), pageLink); + return widgetTypeDao.findTenantWidgetTypesByTenantId(id.getId(), false, pageLink); } @Override diff --git a/ui-ngx/src/app/core/http/widget.service.ts b/ui-ngx/src/app/core/http/widget.service.ts index dcaef000f2..86a3a2d48d 100644 --- a/ui-ngx/src/app/core/http/widget.service.ts +++ b/ui-ngx/src/app/core/http/widget.service.ts @@ -223,8 +223,10 @@ export class WidgetService { )); } - public getWidgetTypes(pageLink: PageLink, tenantOnly = false, config?: RequestConfig): Observable> { - return this.http.get>(`/api/widgetTypes${pageLink.toQuery()}&tenantOnly=${tenantOnly}`, + public getWidgetTypes(pageLink: PageLink, tenantOnly = false, + fullSearch = false, config?: RequestConfig): Observable> { + return this.http.get>( + `/api/widgetTypes${pageLink.toQuery()}&tenantOnly=${tenantOnly}&fullSearch=${fullSearch}`, defaultHttpOptionsFromConfig(config)); } diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.html b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.html index 60b98965ed..9b5a742ecf 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.html +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.html @@ -386,8 +386,9 @@ @@ -419,6 +421,14 @@ matTooltipPosition="above"> filter_list + + {{ 'widgets-bundle.widgets-bundles' | translate }} + {{ 'widget.all-widgets' | translate }} +
-
-
-
+ +
+ +
+
+ + + + +
+
{{ widget.title }} @@ -33,22 +41,22 @@
- -
+ + +
{{ 'widget.loading-widgets' | translate }} - -
- + +
+
+ widgets-bundle.empty - - -
+ class="mat-headline-5 tb-absolute-fill">{{(selectWidgetMode === 'bundles' ? 'widgets-bundle.empty' : 'widget.no-widgets-text') | translate}} +
diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts index 09e5480bf5..8a359de66c 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts @@ -19,14 +19,18 @@ import { WidgetsBundle } from '@shared/models/widgets-bundle.model'; import { IAliasController } from '@core/api/widget-api.models'; import { NULL_UUID } from '@shared/models/id/has-uuid'; import { WidgetService } from '@core/http/widget.service'; -import { fullWidgetTypeFqn, WidgetInfo, widgetType } from '@shared/models/widget.models'; -import { distinctUntilChanged, map, publishReplay, refCount, share, switchMap, tap } from 'rxjs/operators'; -import { BehaviorSubject, combineLatest, Observable, of } from 'rxjs'; +import { fullWidgetTypeFqn, WidgetInfo, widgetType, WidgetTypeInfo } from '@shared/models/widget.models'; +import { debounceTime, distinctUntilChanged, map, share, switchMap, tap } from 'rxjs/operators'; +import { BehaviorSubject, combineLatest, Observable, of, ReplaySubject } from 'rxjs'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import { isDefinedAndNotNull } from '@core/utils'; +import { PageLink } from '@shared/models/page/page-link'; +import { Direction } from '@shared/models/page/sort-order'; type widgetsListMode = 'all' | 'actual' | 'deprecated'; +type selectWidgetMode = 'bundles' | 'allWidgets'; + @Component({ selector: 'tb-dashboard-widget-select', templateUrl: './dashboard-widget-select.component.html', @@ -37,11 +41,13 @@ export class DashboardWidgetSelectComponent implements OnInit { private search$ = new BehaviorSubject(''); private filterWidgetTypes$ = new BehaviorSubject>(null); private widgetsListMode$ = new BehaviorSubject('actual'); + private selectWidgetMode$ = new BehaviorSubject('bundles'); private widgetsInfo: Observable>; private widgetsBundleValue: WidgetsBundle; widgetTypes = new Set(); hasDeprecated = false; + allWidgets$: Observable>; widgets$: Observable>; loadingWidgetsSubject: BehaviorSubject = new BehaviorSubject(false); loadingWidgets$ = this.loadingWidgetsSubject.pipe( @@ -87,6 +93,15 @@ export class DashboardWidgetSelectComponent implements OnInit { return this.filterWidgetTypes$.value; } + @Input() + set selectWidgetMode(mode: selectWidgetMode) { + this.selectWidgetMode$.next(mode); + } + + get selectWidgetMode(): selectWidgetMode { + return this.selectWidgetMode$.value; + } + @Input() set widgetsListMode(mode: widgetsListMode) { this.widgetsListMode$.next(mode); @@ -105,13 +120,20 @@ export class DashboardWidgetSelectComponent implements OnInit { constructor(private widgetsService: WidgetService, private sanitizer: DomSanitizer, private cd: ChangeDetectorRef) { - this.widgetsBundles$ = this.search$.asObservable().pipe( - distinctUntilChanged(), - switchMap(search => this.fetchWidgetBundle(search)) + this.widgetsBundles$ = combineLatest([this.search$.asObservable(), this.selectWidgetMode$.asObservable()]).pipe( + distinctUntilChanged((oldValue, newValue) => JSON.stringify(oldValue) === JSON.stringify(newValue)), + switchMap(search => this.fetchWidgetBundle(...search)) + ); + this.allWidgets$ = combineLatest([this.search$.asObservable().pipe( + debounceTime(150) + ), this.selectWidgetMode$.asObservable()]).pipe( + distinctUntilChanged((oldValue, newValue) => JSON.stringify(oldValue) === JSON.stringify(newValue)), + switchMap(search => this.fetchAllWidgets(...search)), + share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false }) ); this.widgets$ = combineLatest([this.search$.asObservable(), this.filterWidgetTypes$.asObservable(), this.widgetsListMode$]).pipe( distinctUntilChanged((oldValue, newValue) => JSON.stringify(oldValue) === JSON.stringify(newValue)), - switchMap(search => this.fetchWidget(...search)) + switchMap(search => this.fetchWidgets(...search)) ); } @@ -128,15 +150,7 @@ export class DashboardWidgetSelectComponent implements OnInit { const hasDeprecated = widgets.some(w => w.deprecated); const widgetInfos = widgets.map((widgetTypeInfo) => { widgetTypes.add(widgetTypeInfo.widgetType); - const widget: WidgetInfo = { - typeFullFqn: fullWidgetTypeFqn(widgetTypeInfo), - type: widgetTypeInfo.widgetType, - title: widgetTypeInfo.name, - image: widgetTypeInfo.image, - description: widgetTypeInfo.description, - deprecated: widgetTypeInfo.deprecated - }; - return widget; + return this.toWidgetInfo(widgetTypeInfo); } ); setTimeout(() => { @@ -149,8 +163,7 @@ export class DashboardWidgetSelectComponent implements OnInit { tap(() => { this.loadingWidgetsSubject.next(false); }), - publishReplay(1), - refCount() + share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false }) ); } else { this.widgetsInfo = of([]); @@ -181,26 +194,29 @@ export class DashboardWidgetSelectComponent implements OnInit { return '/assets/widget-preview-empty.svg'; } - private getWidgetsBundle(): Observable> { + private getWidgetsBundles(): Observable> { return this.widgetsService.getAllWidgetsBundles().pipe( tap(() => this.loadingWidgetBundlesSubject.next(false)), - publishReplay(1), - refCount() + share({ connector: () => new ReplaySubject(1), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false }) ); } - private fetchWidgetBundle(search: string): Observable> { - return this.getWidgetsBundle().pipe( - map(bundles => search ? bundles.filter( - bundle => ( - bundle.title?.toLowerCase().includes(search.toLowerCase()) || - bundle.description?.toLowerCase().includes(search.toLowerCase()) - )) : bundles - ) - ); + private fetchWidgetBundle(search: string, mode: selectWidgetMode): Observable> { + if (mode === 'bundles') { + return this.getWidgetsBundles().pipe( + map(bundles => search ? bundles.filter( + bundle => ( + bundle.title?.toLowerCase().includes(search.toLowerCase()) || + bundle.description?.toLowerCase().includes(search.toLowerCase()) + )) : bundles + ) + ); + } else { + return of([]); + } } - private fetchWidget(search: string, filter: widgetType[], listMode: widgetsListMode): Observable> { + private fetchWidgets(search: string, filter: widgetType[], listMode: widgetsListMode): Observable> { return this.getWidgets().pipe( map(widgets => (listMode && listMode !== 'all') ? widgets.filter((widget) => listMode === 'actual' ? !widget.deprecated : widget.deprecated) : widgets), @@ -213,4 +229,37 @@ export class DashboardWidgetSelectComponent implements OnInit { ) ); } + + private fetchAllWidgets(search: string, mode: selectWidgetMode): Observable> { + if (mode === 'allWidgets') { + const pageLink = new PageLink(1024, 0, search, { + property: 'name', + direction: Direction.ASC + }); + return this.getAllWidgets(pageLink); + } else { + return of([]); + } + } + + private getAllWidgets(pageLink: PageLink): Observable> { + this.loadingWidgetsSubject.next(true); + return this.widgetsService.getWidgetTypes(pageLink, false, true).pipe( + map(data => data.data.map(w => this.toWidgetInfo(w))), + tap(() => { + this.loadingWidgetsSubject.next(false); + }) + ); + } + + private toWidgetInfo(widgetTypeInfo: WidgetTypeInfo): WidgetInfo { + return { + typeFullFqn: fullWidgetTypeFqn(widgetTypeInfo), + type: widgetTypeInfo.widgetType, + title: widgetTypeInfo.name, + image: widgetTypeInfo.image, + description: widgetTypeInfo.description, + deprecated: widgetTypeInfo.deprecated + }; + } } diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index 61778fded2..c9ea692378 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -4531,10 +4531,12 @@ "all-bundles": "All bundles", "select-widgets-bundle": "Select widgets bundle", "widgets": "Widgets", + "all-widgets": "All widgets", "widget": "Widget", "select-widget": "Select widget", "no-widgets-matching": "No widgets matching '{{entity}}' were found.", "no-widgets": "No widgets yet", + "no-widgets-text": "No widgets found", "management": "Widget management", "editor": "Widget Editor", "widget-type-not-found": "Problem loading widget configuration.
Probably associated\n widget type was removed.",