From 56bfce45cab924fe042b6620e1d0c22177ea07a7 Mon Sep 17 00:00:00 2001 From: tygao Date: Mon, 15 Apr 2024 09:46:49 +0800 Subject: [PATCH 1/3] hide datasource and settings menu when workspace enabled and entering workspace Signed-off-by: tygao --- .../workspace/opensearch_dashboards.json | 2 +- src/plugins/workspace/public/plugin.test.ts | 14 ++++++-- src/plugins/workspace/public/plugin.ts | 32 ++++++++++++++++++- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/plugins/workspace/opensearch_dashboards.json b/src/plugins/workspace/opensearch_dashboards.json index e6ff1e2d017..cf67547f788 100644 --- a/src/plugins/workspace/opensearch_dashboards.json +++ b/src/plugins/workspace/opensearch_dashboards.json @@ -7,6 +7,6 @@ "savedObjects", "opensearchDashboardsReact" ], - "optionalPlugins": ["savedObjectsManagement"], + "optionalPlugins": ["savedObjectsManagement","management"], "requiredBundles": ["opensearchDashboardsReact"] } diff --git a/src/plugins/workspace/public/plugin.test.ts b/src/plugins/workspace/public/plugin.test.ts index 867f2a9e73c..4a58acfe26b 100644 --- a/src/plugins/workspace/public/plugin.test.ts +++ b/src/plugins/workspace/public/plugin.test.ts @@ -10,6 +10,7 @@ import { applicationServiceMock, chromeServiceMock, coreMock } from '../../../co import { WorkspacePlugin } from './plugin'; import { WORKSPACE_FATAL_ERROR_APP_ID, WORKSPACE_OVERVIEW_APP_ID } from '../common/constants'; import { savedObjectsManagementPluginMock } from '../../saved_objects_management/public/mocks'; +import { managementPluginMock } from '../../management/public/mocks'; describe('Workspace plugin', () => { const getSetupMock = () => ({ @@ -26,6 +27,7 @@ describe('Workspace plugin', () => { const workspacePlugin = new WorkspacePlugin(); await workspacePlugin.setup(setupMock, { savedObjectsManagement: savedObjectManagementSetupMock, + management: managementPluginMock.createSetupContract(), }); expect(setupMock.application.register).toBeCalledTimes(4); expect(WorkspaceClientMock).toBeCalledTimes(1); @@ -74,7 +76,9 @@ describe('Workspace plugin', () => { }); const workspacePlugin = new WorkspacePlugin(); - await workspacePlugin.setup(setupMock, {}); + await workspacePlugin.setup(setupMock, { + management: managementPluginMock.createSetupContract(), + }); expect(setupMock.application.register).toBeCalledTimes(4); expect(WorkspaceClientMock).toBeCalledTimes(1); expect(workspaceClientMock.enterWorkspace).toBeCalledWith('workspaceId'); @@ -128,7 +132,9 @@ describe('Workspace plugin', () => { }); const workspacePlugin = new WorkspacePlugin(); - await workspacePlugin.setup(setupMock, {}); + await workspacePlugin.setup(setupMock, { + management: managementPluginMock.createSetupContract(), + }); currentAppIdSubscriber?.next(WORKSPACE_FATAL_ERROR_APP_ID); expect(applicationStartMock.navigateToApp).toBeCalledWith(WORKSPACE_OVERVIEW_APP_ID); windowSpy.mockRestore(); @@ -137,7 +143,9 @@ describe('Workspace plugin', () => { it('#setup register workspace dropdown menu when setup', async () => { const setupMock = coreMock.createSetup(); const workspacePlugin = new WorkspacePlugin(); - await workspacePlugin.setup(setupMock, {}); + await workspacePlugin.setup(setupMock, { + management: managementPluginMock.createSetupContract(), + }); expect(setupMock.chrome.registerCollapsibleNavHeader).toBeCalledTimes(1); }); }); diff --git a/src/plugins/workspace/public/plugin.ts b/src/plugins/workspace/public/plugin.ts index b27c4b3bdd4..d01392f6bc9 100644 --- a/src/plugins/workspace/public/plugin.ts +++ b/src/plugins/workspace/public/plugin.ts @@ -26,6 +26,7 @@ import { getWorkspaceIdFromUrl } from '../../../core/public/utils'; import { Services } from './types'; import { WorkspaceClient } from './workspace_client'; import { SavedObjectsManagementPluginSetup } from '../../../plugins/saved_objects_management/public'; +import { ManagementSetup } from '../../../plugins/management/public'; import { WorkspaceMenu } from './components/workspace_menu/workspace_menu'; import { getWorkspaceColumn } from './components/workspace_column'; import { isAppAccessibleInWorkspace } from './utils'; @@ -34,12 +35,14 @@ type WorkspaceAppType = (params: AppMountParameters, services: Services) => () = interface WorkspacePluginSetupDeps { savedObjectsManagement?: SavedObjectsManagementPluginSetup; + management?: ManagementSetup; } export class WorkspacePlugin implements Plugin<{}, {}, WorkspacePluginSetupDeps> { private coreStart?: CoreStart; private currentWorkspaceSubscription?: Subscription; private currentWorkspaceIdSubscription?: Subscription; + private managementCurrentWorkspaceIdSubscription?: Subscription; private appUpdater$ = new BehaviorSubject(() => undefined); private _changeSavedObjectCurrentWorkspace() { if (this.coreStart) { @@ -75,11 +78,37 @@ export class WorkspacePlugin implements Plugin<{}, {}, WorkspacePluginSetupDeps> }); } - public async setup(core: CoreSetup, { savedObjectsManagement }: WorkspacePluginSetupDeps) { + /** + * If workspace is enabled and user has entered workspace, hide advance settings and dataSource menu and disable + */ + private disableManagementApps(core: CoreSetup, management: ManagementSetup) { + const currentWorkspaceId$ = core.workspaces.currentWorkspaceId$; + this.managementCurrentWorkspaceIdSubscription?.unsubscribe(); + + this.managementCurrentWorkspaceIdSubscription = currentWorkspaceId$.subscribe( + (currentWorkspaceId) => { + if (currentWorkspaceId) { + ['settings', 'dataSources'].forEach((appId) => + management.sections.section.opensearchDashboards.getApp(appId)?.disable() + ); + } + } + ); + } + + public async setup( + core: CoreSetup, + { savedObjectsManagement, management }: WorkspacePluginSetupDeps + ) { const workspaceClient = new WorkspaceClient(core.http, core.workspaces); await workspaceClient.init(); core.application.registerAppUpdater(this.appUpdater$); + // Hide advance settings and dataSource menus and disable in setup + if (management) { + this.disableManagementApps(core, management); + } + /** * Retrieve workspace id from url */ @@ -212,5 +241,6 @@ export class WorkspacePlugin implements Plugin<{}, {}, WorkspacePluginSetupDeps> public stop() { this.currentWorkspaceSubscription?.unsubscribe(); this.currentWorkspaceIdSubscription?.unsubscribe(); + this.managementCurrentWorkspaceIdSubscription?.unsubscribe(); } } From 0c1b3ab9e8e61b60be70ba7e85f23644b4f25b14 Mon Sep 17 00:00:00 2001 From: tygao Date: Mon, 15 Apr 2024 17:54:58 +0800 Subject: [PATCH 2/3] doc: update changelog Signed-off-by: tygao --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48c2d6561e4..d553246aa5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -99,6 +99,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - [Workspace] Support workspace in saved objects client in server side. ([#6365](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6365)) - [MD] Add dropdown header to data source single selector ([#6431](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6431)) - [Workspace] Add permission tab to workspace create update page ([#6378](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6378)) +- [Workspace] Hide datasource and advanced settings menu in dashboard management when in workspace. ([#6455](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/6455)) ### 🐛 Bug Fixes From 8d074c3cb174f1e974dab566a927f0d228298857 Mon Sep 17 00:00:00 2001 From: tygao Date: Tue, 16 Apr 2024 11:49:17 +0800 Subject: [PATCH 3/3] update comments Co-authored-by: Yulong Ruan Signed-off-by: tygao --- src/plugins/workspace/public/plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/workspace/public/plugin.ts b/src/plugins/workspace/public/plugin.ts index d01392f6bc9..2155eabea84 100644 --- a/src/plugins/workspace/public/plugin.ts +++ b/src/plugins/workspace/public/plugin.ts @@ -79,7 +79,7 @@ export class WorkspacePlugin implements Plugin<{}, {}, WorkspacePluginSetupDeps> } /** - * If workspace is enabled and user has entered workspace, hide advance settings and dataSource menu and disable + * If workspace is enabled and user has entered workspace, hide advance settings and dataSource menu by disabling the corresponding apps. */ private disableManagementApps(core: CoreSetup, management: ManagementSetup) { const currentWorkspaceId$ = core.workspaces.currentWorkspaceId$;