Skip to content

Commit 69bac44

Browse files
committed
Register navGroupUpdater in workspace plugin
Signed-off-by: Lin Wang <wonglam@amazon.com>
1 parent e57195d commit 69bac44

File tree

4 files changed

+79
-1
lines changed

4 files changed

+79
-1
lines changed

src/plugins/workspace/public/plugin.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,4 +189,38 @@ describe('Workspace plugin', () => {
189189
workspacePlugin.start(startMock);
190190
expect(startMock.chrome.setBreadcrumbs).not.toHaveBeenCalled();
191191
});
192+
193+
it('#start should call navGroupUpdater$.next after currentWorkspace set', async () => {
194+
const workspacePlugin = new WorkspacePlugin();
195+
const setupMock = getSetupMock();
196+
const coreStart = coreMock.createStart();
197+
await workspacePlugin.setup(setupMock, {});
198+
199+
expect(setupMock.chrome.navGroup.registerNavGroupUpdater).toHaveBeenCalled();
200+
const navGroupUpdater$ = setupMock.chrome.navGroup.registerNavGroupUpdater.mock.calls[0][0];
201+
202+
expect(navGroupUpdater$).toBeTruthy();
203+
jest.spyOn(navGroupUpdater$, 'next');
204+
205+
expect(navGroupUpdater$.next).not.toHaveBeenCalled();
206+
workspacePlugin.start(coreStart);
207+
208+
waitFor(() => {
209+
expect(navGroupUpdater$.next).toHaveBeenCalled();
210+
});
211+
});
212+
213+
it('#stop should call unregisterNavGroupUpdater', async () => {
214+
const workspacePlugin = new WorkspacePlugin();
215+
const setupMock = getSetupMock();
216+
const unregisterNavGroupUpdater = jest.fn();
217+
setupMock.chrome.navGroup.registerNavGroupUpdater.mockReturnValueOnce(
218+
unregisterNavGroupUpdater
219+
);
220+
await workspacePlugin.setup(setupMock, {});
221+
222+
workspacePlugin.stop();
223+
224+
expect(unregisterNavGroupUpdater).toHaveBeenCalled();
225+
});
192226
});

src/plugins/workspace/public/plugin.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import {
1818
PublicAppInfo,
1919
ChromeBreadcrumb,
2020
WorkspaceAvailability,
21+
ChromeNavGroupUpdater,
22+
NavGroupStatus,
2123
} from '../../../core/public';
2224
import {
2325
WORKSPACE_FATAL_ERROR_APP_ID,
@@ -33,7 +35,11 @@ import { SavedObjectsManagementPluginSetup } from '../../../plugins/saved_object
3335
import { ManagementSetup } from '../../../plugins/management/public';
3436
import { WorkspaceMenu } from './components/workspace_menu/workspace_menu';
3537
import { getWorkspaceColumn } from './components/workspace_column';
36-
import { filterWorkspaceConfigurableApps, isAppAccessibleInWorkspace } from './utils';
38+
import {
39+
filterWorkspaceConfigurableApps,
40+
isAppAccessibleInWorkspace,
41+
isNavGroupInFeatureConfigs,
42+
} from './utils';
3743

3844
type WorkspaceAppType = (
3945
params: AppMountParameters,
@@ -53,7 +59,10 @@ export class WorkspacePlugin implements Plugin<{}, {}, WorkspacePluginSetupDeps>
5359
private currentWorkspaceIdSubscription?: Subscription;
5460
private managementCurrentWorkspaceIdSubscription?: Subscription;
5561
private appUpdater$ = new BehaviorSubject<AppUpdater>(() => undefined);
62+
private navGroupUpdater$ = new BehaviorSubject<ChromeNavGroupUpdater>(() => undefined);
5663
private workspaceConfigurableApps$ = new BehaviorSubject<PublicAppInfo[]>([]);
64+
private unregisterNavGroupUpdater?: () => void;
65+
5766
private _changeSavedObjectCurrentWorkspace() {
5867
if (this.coreStart) {
5968
return this.coreStart.workspaces.currentWorkspaceId$.subscribe((currentWorkspaceId) => {
@@ -89,6 +98,17 @@ export class WorkspacePlugin implements Plugin<{}, {}, WorkspacePluginSetupDeps>
8998
*/
9099
return { status: AppStatus.inaccessible };
91100
});
101+
102+
this.navGroupUpdater$.next((navGroup) => {
103+
if (
104+
currentWorkspace.features &&
105+
!isNavGroupInFeatureConfigs(navGroup.id, currentWorkspace.features)
106+
) {
107+
return {
108+
status: NavGroupStatus.Hidden,
109+
};
110+
}
111+
});
92112
}
93113
});
94114
};
@@ -166,6 +186,9 @@ export class WorkspacePlugin implements Plugin<{}, {}, WorkspacePluginSetupDeps>
166186
const workspaceClient = new WorkspaceClient(core.http, core.workspaces);
167187
await workspaceClient.init();
168188
core.application.registerAppUpdater(this.appUpdater$);
189+
this.unregisterNavGroupUpdater = core.chrome.navGroup.registerNavGroupUpdater(
190+
this.navGroupUpdater$
191+
);
169192

170193
// Hide advance settings and dataSource menus and disable in setup
171194
if (management) {
@@ -331,5 +354,6 @@ export class WorkspacePlugin implements Plugin<{}, {}, WorkspacePluginSetupDeps>
331354
this.currentWorkspaceIdSubscription?.unsubscribe();
332355
this.managementCurrentWorkspaceIdSubscription?.unsubscribe();
333356
this.breadcrumbsSubscription?.unsubscribe();
357+
this.unregisterNavGroupUpdater?.();
334358
}
335359
}

src/plugins/workspace/public/utils.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
filterWorkspaceConfigurableApps,
1010
isAppAccessibleInWorkspace,
1111
isFeatureIdInsideUseCase,
12+
isNavGroupInFeatureConfigs,
1213
} from './utils';
1314
import { WorkspaceAvailability } from '../../../core/public';
1415

@@ -276,3 +277,19 @@ describe('workspace utils: isFeatureIdInsideUseCase', () => {
276277
expect(isFeatureIdInsideUseCase('discover', 'use-case-invalid')).toBe(false);
277278
});
278279
});
280+
281+
describe('workspace utils: isNavGroupInFeatureConfigs', () => {
282+
it('should return false if nav group not in feature configs', () => {
283+
expect(
284+
isNavGroupInFeatureConfigs('dataAdministration', [
285+
'use-case-observability',
286+
'use-case-search',
287+
])
288+
).toBe(false);
289+
});
290+
it('should return true if nav group in feature configs', () => {
291+
expect(
292+
isNavGroupInFeatureConfigs('observability', ['use-case-observability', 'use-case-search'])
293+
).toBe(true);
294+
});
295+
});

src/plugins/workspace/public/utils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ export const isFeatureIdInsideUseCase = (featureId: string, featureConfig: strin
4141
return false;
4242
};
4343

44+
export const isNavGroupInFeatureConfigs = (navGroupId: string, featureConfigs: string[]) =>
45+
featureConfigs.includes(getUseCaseFeatureConfig(navGroupId));
46+
4447
/**
4548
* Checks if a given feature matches the provided feature configuration.
4649
*

0 commit comments

Comments
 (0)