From acca4b2e3814a010a45aca8aefdf6f243427fce8 Mon Sep 17 00:00:00 2001 From: Yuye Zhu Date: Fri, 25 Aug 2023 22:26:45 +0800 Subject: [PATCH] feat: filter applications according to categories (#103) * add features for public workspace Signed-off-by: yuye-aws * change default header name Signed-off-by: yuye-aws * remove recently visited category in management workspace Signed-off-by: yuye-aws * change default header name Signed-off-by: yuye-aws * change icon and title for workspace overview Signed-off-by: yuye-aws * add overview to management workspace featuer Signed-off-by: yuye-aws * bug fix: only show recently visited if the workspace has no feature Signed-off-by: yuye-aws * add recently visited when workspace disabled Signed-off-by: yuye-aws * change default value from null to undefined Signed-off-by: yuye-aws --------- Signed-off-by: yuye-aws --- .../chrome/nav_links/nav_links_service.ts | 8 ++++++-- .../chrome/ui/header/collapsible_nav.tsx | 19 +++++++++++++------ .../ui/header/collapsible_nav_header.tsx | 2 +- .../workspace_menu/workspace_menu.tsx | 2 +- src/plugins/workspace/public/plugin.ts | 4 ++-- src/plugins/workspace/server/plugin.ts | 3 ++- 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/core/public/chrome/nav_links/nav_links_service.ts b/src/core/public/chrome/nav_links/nav_links_service.ts index b6ef2e6e771e..ddbef0beed6d 100644 --- a/src/core/public/chrome/nav_links/nav_links_service.ts +++ b/src/core/public/chrome/nav_links/nav_links_service.ts @@ -126,7 +126,9 @@ type LinksUpdater = (navLinks: Map) => Map>(new Map()); + private filteredNavLinks$ = new BehaviorSubject | undefined>( + undefined + ); public start({ application, http }: StartDeps): ChromeNavLinks { const appLinks$ = application.applications$.pipe( @@ -169,7 +171,9 @@ export class NavLinksService { getFilteredNavLinks$: () => { return combineLatest([navLinks$, this.filteredNavLinks$]).pipe( map(([navLinks, filteredNavLinks]) => - filteredNavLinks.size ? sortChromeNavLinks(filteredNavLinks) : sortNavLinks(navLinks) + filteredNavLinks === undefined + ? sortNavLinks(navLinks) + : sortChromeNavLinks(filteredNavLinks) ), takeUntil(this.stop$) ); diff --git a/src/core/public/chrome/ui/header/collapsible_nav.tsx b/src/core/public/chrome/ui/header/collapsible_nav.tsx index 8673abe0550d..fe78cee63e33 100644 --- a/src/core/public/chrome/ui/header/collapsible_nav.tsx +++ b/src/core/public/chrome/ui/header/collapsible_nav.tsx @@ -56,6 +56,7 @@ import { } from './nav_link'; import { ChromeBranding } from '../../chrome_service'; import { CollapsibleNavHeader } from './collapsible_nav_header'; +import { MANAGEMENT_WORKSPACE_ID } from '../../../utils'; function getAllCategories(allCategorizedLinks: Record) { const allCategories = {} as Record; @@ -153,14 +154,20 @@ export function CollapsibleNav({ }: Props) { const navLinks = useObservable(observables.navLinks$, []).filter((link) => !link.hidden); const recentlyAccessed = useObservable(observables.recentlyAccessed$, []); + const workspaceEnabled = useObservable(workspaces.workspaceEnabled$, false); + const currentWorkspaceId = useObservable(workspaces.currentWorkspaceId$, ''); const allNavLinks: CollapsibleNavLink[] = [...navLinks]; - if (recentlyAccessed.length) { - allNavLinks.push( - ...recentlyAccessed.map((link) => createRecentChromeNavLink(link, navLinks, basePath)) - ); - } else { - allNavLinks.push(emptyRecentlyVisited); + if (!workspaceEnabled || currentWorkspaceId !== MANAGEMENT_WORKSPACE_ID) { + // no recently visited in management workspace + if (recentlyAccessed.length) { + allNavLinks.push( + ...recentlyAccessed.map((link) => createRecentChromeNavLink(link, navLinks, basePath)) + ); + } else { + allNavLinks.push(emptyRecentlyVisited); + } } + const appId = useObservable(observables.appId$, ''); const lockRef = useRef(null); const groupedNavLinks = groupBy(allNavLinks, (link) => link?.category?.id); diff --git a/src/core/public/chrome/ui/header/collapsible_nav_header.tsx b/src/core/public/chrome/ui/header/collapsible_nav_header.tsx index a3e983e9971d..8ef24a1937e4 100644 --- a/src/core/public/chrome/ui/header/collapsible_nav_header.tsx +++ b/src/core/public/chrome/ui/header/collapsible_nav_header.tsx @@ -17,7 +17,7 @@ export function CollapsibleNavHeader({ workspaces }: Props) { const defaultHeaderName = i18n.translate( 'core.ui.primaryNav.workspacePickerMenu.defaultHeaderName', { - defaultMessage: 'OpenSearch Analytics', + defaultMessage: 'OpenSearch Dashboards', } ); diff --git a/src/plugins/workspace/public/components/workspace_menu/workspace_menu.tsx b/src/plugins/workspace/public/components/workspace_menu/workspace_menu.tsx index ae48d50a2287..9cb1f3979594 100644 --- a/src/plugins/workspace/public/components/workspace_menu/workspace_menu.tsx +++ b/src/plugins/workspace/public/components/workspace_menu/workspace_menu.tsx @@ -58,7 +58,7 @@ export const WorkspaceMenu = ({ basePath, getUrlForApp, observables }: Props) => const defaultHeaderName = i18n.translate( 'core.ui.primaryNav.workspacePickerMenu.defaultHeaderName', { - defaultMessage: 'OpenSearch Analytics', + defaultMessage: 'OpenSearch Dashboards', } ); const managementWorkspaceName = diff --git a/src/plugins/workspace/public/plugin.ts b/src/plugins/workspace/public/plugin.ts index 529714026c37..d6b150609ba0 100644 --- a/src/plugins/workspace/public/plugin.ts +++ b/src/plugins/workspace/public/plugin.ts @@ -131,10 +131,10 @@ export class WorkspacePlugin implements Plugin<{}, {}, WorkspacePluginSetupDeps> core.application.register({ id: WORKSPACE_OVERVIEW_APP_ID, title: i18n.translate('workspace.settings.workspaceOverview', { - defaultMessage: 'Home', + defaultMessage: 'Overview', }), order: 0, - euiIconType: 'home', + euiIconType: 'grid', navLinkStatus: AppNavLinkStatus.default, async mount(params: AppMountParameters) { const { renderOverviewApp } = await import('./application'); diff --git a/src/plugins/workspace/server/plugin.ts b/src/plugins/workspace/server/plugin.ts index a2c18a3c7641..ad4a4418dd2f 100644 --- a/src/plugins/workspace/server/plugin.ts +++ b/src/plugins/workspace/server/plugin.ts @@ -27,6 +27,7 @@ import { WorkspaceClientWithSavedObject } from './workspace_client'; import { WorkspaceSavedObjectsClientWrapper } from './saved_objects'; import { registerRoutes } from './routes'; import { ConfigSchema } from '../config'; +import { WORKSPACE_OVERVIEW_APP_ID } from '../common/constants'; export class WorkspacePlugin implements Plugin<{}, {}> { private readonly logger: Logger; @@ -150,7 +151,7 @@ export class WorkspacePlugin implements Plugin<{}, {}> { name: i18n.translate('workspaces.management.workspace.default.name', { defaultMessage: 'Management', }), - features: [`@${DEFAULT_APP_CATEGORIES.management.id}`], + features: [`@${DEFAULT_APP_CATEGORIES.management.id}`, WORKSPACE_OVERVIEW_APP_ID], }, managementWorkspaceACL.getPermissions() ),