Skip to content

Commit 01996e1

Browse files
SuZhou-JoeruanylHailong-amwanglamzhichao-aws
committed
Feature: hide workspace from saved objects management page. (opensearch-project#45)
* setup workspace plugin project skeleton Signed-off-by: Yulong Ruan <ruanyl@amazon.com> * test: add unit tests add license header Signed-off-by: Yulong Ruan <ruanyl@amazon.com> * workspace template init commit Signed-off-by: Hailong Cui <ihailong@amazon.com> * refacter workspace template into hooks Signed-off-by: Hailong Cui <ihailong@amazon.com> * refacter workspace template hooks Signed-off-by: Hailong Cui <ihailong@amazon.com> * update coverImage comments Signed-off-by: Hailong Cui <ihailong@amazon.com> * feature: add public/workspaces service Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: add interfaces for workspaces client Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: add interfaces for workspaces client Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: add interfaces for workspaces client Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: implement workspaces service Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: changes to client type interface Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: changes to client implement Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: implement more for workspaces service Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: implement more for workspaces service Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: implement more for workspaces service Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: add workspace creator page (opensearch-project#5) * feat: add workspace creator page Signed-off-by: Lin Wang <wonglam@amazon.com> * feat: integrate with application workspace template Signed-off-by: Lin Wang <wonglam@amazon.com> * feat: add max-width and remove image wrapper if not exists Signed-off-by: Lin Wang <wonglam@amazon.com> * feat: update filter condition to align with collapsible nav Signed-off-by: Lin Wang <wonglam@amazon.com> --------- Signed-off-by: Lin Wang <wonglam@amazon.com> * Add validation when load page (opensearch-project#8) * fix: validation & query Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: modify file name to reduce confusion Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: add landing logic to retrive workspace id Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: add worklist observable Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: add worklist observable Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: add worklist observable Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * fix: type error Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * fix: type error Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: make client more robust Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: use Subject Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> --------- Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: use BehaviorObject and optimize code (opensearch-project#14) Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: integrate with workspace create API (opensearch-project#13) * feat: integrate with workspace create API Signed-off-by: Lin Wang <wonglam@amazon.com> * feat: update to i18n text for toast Signed-off-by: Lin Wang <wonglam@amazon.com> --------- Signed-off-by: Lin Wang <wonglam@amazon.com> * Add currentWorkspace$ (opensearch-project#15) * feat: add currentWorkspace$ Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * fix: type error Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: add emit on currentWorkspace$ Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> --------- Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * register plugin with workspace template (opensearch-project#16) Signed-off-by: Hailong Cui <ihailong@amazon.com> * workspace dropdown list (opensearch-project#9) Add workspace dropdown list --------- Signed-off-by: zhichao-aws <zhichaog@amazon.com> Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> Signed-off-by: suzhou <suzhou@amazon.com> Co-authored-by: SuZhoue-Joe <suzhou@amazon.com> * init workspace menu stage 1 (opensearch-project#12) * feat: init workspace menu stage 1 Signed-off-by: tygao <tygao@amazon.com> * fix: remove port diff Signed-off-by: tygao <tygao@amazon.com> * feat: update menu logic Signed-off-by: tygao <tygao@amazon.com> --------- Signed-off-by: tygao <tygao@amazon.com> * Fix template registration import error (opensearch-project#21) * fix import error Signed-off-by: Hailong Cui <ihailong@amazon.com> * fix osd bootstrap failure Signed-off-by: Hailong Cui <ihailong@amazon.com> --------- Signed-off-by: Hailong Cui <ihailong@amazon.com> * Add workspace overview page (opensearch-project#19) * feat: add workspace overview page Signed-off-by: Lin Wang <wonglam@amazon.com> * refactor: move paths to common constants Signed-off-by: Lin Wang <wonglam@amazon.com> * feat: add workspace overview item by custom nav in start phase Signed-off-by: Lin Wang <wonglam@amazon.com> * refactor: change to currentWorkspace$ in workspace client Signed-off-by: Lin Wang <wonglam@amazon.com> --------- Signed-off-by: Lin Wang <wonglam@amazon.com> * feat: navigate to workspace create page after button clicked (opensearch-project#23) Signed-off-by: Lin Wang <wonglam@amazon.com> * fix failed test snapshots (opensearch-project#22) fix failed test snapshots temporary fix: fetch functional test from main branch fixed git error which cannot find ref due to feature branch `workspace` not exists on repo opensearch-dashboards-functional-test Signed-off-by: Yulong Ruan <ruanyl@amazon.com> --------- Signed-off-by: Yulong Ruan <ruanyl@amazon.com> * change to currentWorkspace, wrap title using i18n (opensearch-project#20) * change to currentWorkspace, wrap title using i18n Signed-off-by: zhichao-aws <zhichaog@amazon.com> * change import Signed-off-by: zhichao-aws <zhichaog@amazon.com> * directly return [] if currentWorkspace is null Signed-off-by: zhichao-aws <zhichaog@amazon.com> --------- Signed-off-by: zhichao-aws <zhichaog@amazon.com> * add workspace switch (opensearch-project#17) * feat: update workspace switch Signed-off-by: tygao <tygao@amazon.com> * fix: fix switch error Signed-off-by: tygao <tygao@amazon.com> * fix: fix prettier after merge Signed-off-by: tygao <tygao@amazon.com> * chore: remove extra code after merge Signed-off-by: tygao <tygao@amazon.com> --------- Signed-off-by: tygao <tygao@amazon.com> * Add update workspace page (opensearch-project#25) Signed-off-by: gaobinlong <gbinlong@amazon.com> * Delete Workspace (opensearch-project#24) * add delete workspace modal Signed-off-by: yuye-aws <yuyezhu@amazon.com> * implement delete on workspace overview page Signed-off-by: yuye-aws <yuyezhu@amazon.com> * fix export on delete workspace modal Signed-off-by: yuye-aws <yuyezhu@amazon.com> * add try catch to handle errors for workspace delete Signed-off-by: yuye-aws <yuyezhu@amazon.com> * move visibility control to workspace overview page exlusively Signed-off-by: yuye-aws <yuyezhu@amazon.com> * remove unused import Signed-off-by: yuye-aws <yuyezhu@amazon.com> --------- Signed-off-by: yuye-aws <yuyezhu@amazon.com> * feat: redirect to overview page after workspace switch (opensearch-project#26) Signed-off-by: Lin Wang <wonglam@amazon.com> * update menu filter logic (opensearch-project#28) * feat: update menu logic Signed-off-by: tygao <tygao@amazon.com> * fix: use navLinks to filter Signed-off-by: tygao <tygao@amazon.com> --------- Signed-off-by: tygao <tygao@amazon.com> * feat: redirect to workspace overview page after created success (opensearch-project#29) Signed-off-by: Lin Wang <wonglam@amazon.com> * [Feature] Complied saved_objects create/find (opensearch-project#18) * temp: save Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: make create/find support workspaces Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: extract management code Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * fix: type check Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * fix: build error Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: enable workspaces on saved client server side Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: some optimization Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: extract management code Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: merge fix Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: optimize code Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: reuse common function Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: optimize code when create Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: remove useless test code Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> --------- Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: redirect to workspace update page after workspace switch (opensearch-project#30) * Move delete button to update page (opensearch-project#27) * add delete workspace modal Signed-off-by: yuye-aws <yuyezhu@amazon.com> * implement delete on workspace overview page Signed-off-by: yuye-aws <yuyezhu@amazon.com> * fix export on delete workspace modal Signed-off-by: yuye-aws <yuyezhu@amazon.com> * add try catch to handle errors for workspace delete Signed-off-by: yuye-aws <yuyezhu@amazon.com> * move visibility control to workspace overview page exlusively Signed-off-by: yuye-aws <yuyezhu@amazon.com> * remove unused import Signed-off-by: yuye-aws <yuyezhu@amazon.com> * change workspace overview route to workspace update Signed-off-by: yuye-aws <yuyezhu@amazon.com> * move delete button from workspace overview page to update page Signed-off-by: yuye-aws <yuyezhu@amazon.com> * remove update button from workspace overview page Signed-off-by: yuye-aws <yuyezhu@amazon.com> * recover router to workspace overview page Signed-off-by: yuye-aws <yuyezhu@amazon.com> * change navigation url for workspace overview button on left side panel Signed-off-by: yuye-aws <yuyezhu@amazon.com> --------- Signed-off-by: yuye-aws <yuyezhu@amazon.com> * fix: linting error Signed-off-by: Yulong Ruan <ruanyl@amazon.com> * remove duplicate EuiPage (opensearch-project#34) * remove duplicate EuiPage Signed-off-by: Hailong Cui <ihailong@amazon.com> * fix: remove duplicate workspace template Signed-off-by: Hailong Cui <ihailong@amazon.com> --------- Signed-off-by: Hailong Cui <ihailong@amazon.com> * remove clear button, add the width of create button (opensearch-project#33) Signed-off-by: zhichao-aws <zhichaog@amazon.com> * rename OpenSearch Plugins to OpenSearch Features this is a temporary fix just for demo, should be reverted later Signed-off-by: Yulong Ruan <ruanyl@amazon.com> * Add some logic check when overwrite a saved object (opensearch-project#32) * feat: add some logic check when overwrite a saved object Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * fix: type check Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: update Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> --------- Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * Add color, icon and defaultVISTheme for workspace (opensearch-project#36) * feat: add color, icon and defaultVISTheme field for workspace saved object Signed-off-by: Lin Wang <wonglam@amazon.com> * add new fields to workspace form Signed-off-by: Lin Wang <wonglam@amazon.com> * feat: remove feature or group name hack Signed-off-by: Lin Wang <wonglam@amazon.com> --------- Signed-off-by: Lin Wang <wonglam@amazon.com> * feat: add workspace list (opensearch-project#39) Signed-off-by: tygao <tygao@amazon.com> * Feature/menu change (opensearch-project#37) * feat: register library menus Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: some update Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: optimize code Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: optimize code Signed-off-by: SuZhou-Joe <suzhou@amazon.com> --------- Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: different left menu and exit workspace (opensearch-project#38) * Exit workspace from left menu Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Show exit workspace button with small window size Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Remove recently viewed and workspace overview on left menu Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Add buttons for outside, inside workspace case Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Implement home button and workspace over view button on left menu Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Implement workspace dropdown list in left menu Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Add props on recently accessed and custom nav link Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Add three props to mock props for collapsible nav: exitWorkspace, getWorkspaceUrl, workspaceList$ Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Add three props to mock props for header: exitWorkspace, getWorkspaceUrl, workspaceList$ Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Fix bugs for function createWorkspaceNavLink Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Remove unused constants Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Reuse method getWorkspaceUrl Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Remove recently accessed and custom nav props in test Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Revert "Remove recently accessed and custom nav props in test" This reverts commit 7895e5c. * Wrap title with i18n Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Add redirect for workspace app Signed-off-by: yuye-aws <yuyezhu@amazon.com> * Enable users to go to workspace lists page via see more under workspaces in left menu Signed-off-by: yuye-aws <yuyezhu@amazon.com> --------- Signed-off-by: yuye-aws <yuyezhu@amazon.com> * feat: make url stateful (opensearch-project#35) * feat: make url stateful Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: optimize code Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: remove useless change Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: optimize url listener Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: make formatUrlWithWorkspaceId extensible Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: modify to related components Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: modify the async format to be sync function Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: modify the async format to be sync function Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * fix: type check Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> * feat: use path to maintain workspace info Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: optimize code Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: optimize code Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: optimize code Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: optimize code Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: optimize code Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: optimize code Signed-off-by: SuZhou-Joe <suzhou@amazon.com> --------- Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * Fix build error and part of test error (opensearch-project#42) * fix: fix build error and some ut Signed-off-by: tygao <tygao@amazon.com> * chore: remove saved object client test diff Signed-off-by: tygao <tygao@amazon.com> --------- Signed-off-by: tygao <tygao@amazon.com> * feat: optimize code (opensearch-project#40) Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * fix: bootstrap error (opensearch-project#43) Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: add workspace permission control interface (opensearch-project#41) * feat: add workspace permission control interface Signed-off-by: Lin Wang <wonglam@amazon.com> * feat: add request parameter for workspace permission control Signed-off-by: Lin Wang <wonglam@amazon.com> --------- Signed-off-by: Lin Wang <wonglam@amazon.com> * allow user to turn on/off workspace from advance settings (opensearch-project#46) return 404 if accessing a workspace path when workspace is disabled --------- Signed-off-by: Yulong Ruan <ruanyl@amazon.com> * fix: unit test failure (opensearch-project#50) Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * Add workspace column into saved objects table (opensearch-project#44) * Add workspace column into saved management page Signed-off-by: Hailong Cui <ihailong@amazon.com> * savedObjectsManagement as optional dependency Signed-off-by: Hailong Cui <ihailong@amazon.com> * i18n for column title Signed-off-by: Hailong Cui <ihailong@amazon.com> --------- Signed-off-by: Hailong Cui <ihailong@amazon.com> * feat: make edit url clickable Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: add ui capability path Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: add ui capability path Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * fet: remove useless jump code Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: hide workspace from saved objects management page Signed-off-by: SuZhou-Joe <suzhou@amazon.com> * feat: hide workspace from saved objects management page Signed-off-by: SuZhou-Joe <suzhou@amazon.com> --------- Signed-off-by: Yulong Ruan <ruanyl@amazon.com> Signed-off-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: SuZhoue-Joe <suzhou@amazon.com> Signed-off-by: Lin Wang <wonglam@amazon.com> Signed-off-by: zhichao-aws <zhichaog@amazon.com> Signed-off-by: suzhou <suzhou@amazon.com> Signed-off-by: tygao <tygao@amazon.com> Signed-off-by: gaobinlong <gbinlong@amazon.com> Signed-off-by: yuye-aws <yuyezhu@amazon.com> Signed-off-by: SuZhou-Joe <suzhou@amazon.com> Co-authored-by: Yulong Ruan <ruanyl@amazon.com> Co-authored-by: Hailong Cui <ihailong@amazon.com> Co-authored-by: Lin Wang <wonglam@amazon.com> Co-authored-by: zhichao-aws <zhichaog@amazon.com> Co-authored-by: raintygao <tygao@amazon.com> Co-authored-by: gaobinlong <gbl_long@163.com> Co-authored-by: Yuye Zhu <yuyezhu@amazon.com>
1 parent 356e96d commit 01996e1

File tree

16 files changed

+71
-49
lines changed

16 files changed

+71
-49
lines changed

src/core/public/http/base_path.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
*/
3030

3131
import { modifyUrl } from '@osd/std';
32+
import type { PrependOptions } from './types';
3233

3334
export class BasePath {
3435
constructor(
@@ -45,7 +46,8 @@ export class BasePath {
4546
return this.basePath;
4647
};
4748

48-
public prepend = (path: string, withoutWorkspace: boolean = false): string => {
49+
public prepend = (path: string, prependOptions?: PrependOptions): string => {
50+
const { withoutWorkspace } = prependOptions || {};
4951
const basePath = withoutWorkspace ? this.basePath : this.get();
5052
if (!basePath) return path;
5153
return modifyUrl(path, (parts) => {
@@ -55,17 +57,19 @@ export class BasePath {
5557
});
5658
};
5759

58-
public remove = (path: string): string => {
59-
if (!this.get()) {
60+
public remove = (path: string, prependOptions?: PrependOptions): string => {
61+
const { withoutWorkspace } = prependOptions || {};
62+
const basePath = withoutWorkspace ? this.basePath : this.get();
63+
if (!basePath) {
6064
return path;
6165
}
6266

63-
if (path === this.get()) {
67+
if (path === basePath) {
6468
return '/';
6569
}
6670

67-
if (path.startsWith(`${this.get()}/`)) {
68-
return path.slice(this.get().length);
71+
if (path.startsWith(`${basePath}/`)) {
72+
return path.slice(basePath.length);
6973
}
7074

7175
return path;

src/core/public/http/http_service.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { LoadingCountService } from './loading_count_service';
3737
import { Fetch } from './fetch';
3838
import { CoreService } from '../../types';
3939
import { getWorkspaceIdFromUrl } from '../utils';
40+
import { WORKSPACE_PATH_PREFIX } from '../../utils/constants';
4041

4142
interface HttpDeps {
4243
injectedMetadata: InjectedMetadataSetup;
@@ -54,7 +55,7 @@ export class HttpService implements CoreService<HttpSetup, HttpStart> {
5455
let workspaceBasePath = '';
5556
const workspaceId = getWorkspaceIdFromUrl(window.location.href);
5657
if (workspaceId) {
57-
workspaceBasePath = `/w/${workspaceId}`;
58+
workspaceBasePath = `${WORKSPACE_PATH_PREFIX}/${workspaceId}`;
5859
}
5960
const basePath = new BasePath(
6061
injectedMetadata.getBasePath(),

src/core/public/http/types.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,16 @@ export interface HttpSetup {
8787
*/
8888
export type HttpStart = HttpSetup;
8989

90+
/**
91+
* prepend options
92+
*
93+
* withoutWorkspace option will prepend a relative url with only basePath
94+
* workspaceId will rewrite the /w/{workspaceId} part, if workspace id is an empty string, prepend will remove the workspaceId part
95+
*/
96+
export interface PrependOptions {
97+
withoutWorkspace?: boolean;
98+
}
99+
90100
/**
91101
* APIs for manipulating the basePath on URL segments.
92102
* @public
@@ -105,12 +115,12 @@ export interface IBasePath {
105115
/**
106116
* Prepends `path` with the basePath + workspace.
107117
*/
108-
prepend: (url: string) => string;
118+
prepend: (url: string, prependOptions?: PrependOptions) => string;
109119

110120
/**
111121
* Removes the prepended basePath + workspace from the `path`.
112122
*/
113-
remove: (url: string) => string;
123+
remove: (url: string, prependOptions?: PrependOptions) => string;
114124

115125
/**
116126
* Returns the server's root basePath as configured, without any namespace prefix.

src/core/public/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -357,3 +357,5 @@ export {
357357
WorkspaceAttribute,
358358
WorkspaceFindOptions,
359359
} from './workspace';
360+
361+
export { getWorkspaceIdFromUrl, WORKSPACE_TYPE } from './utils';

src/core/public/utils/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@
3131
export { shareWeakReplay } from './share_weak_replay';
3232
export { Sha256 } from './crypto';
3333
export { MountWrapper, mountReactNode } from './mount';
34-
export { getWorkspaceIdFromUrl } from './workspace';
34+
export { getWorkspaceIdFromUrl, WORKSPACE_TYPE } from './workspace';
35+
export { WORKSPACE_PATH_PREFIX } from '../../utils';

src/core/public/utils/workspace.ts

+2
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ export const getWorkspaceIdFromUrl = (url: string): string => {
1313

1414
return '';
1515
};
16+
17+
export const WORKSPACE_TYPE = 'workspace';

src/core/server/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -509,4 +509,4 @@ export const config = {
509509
},
510510
};
511511

512-
export { formatWorkspaces, workspacesValidator } from './workspaces';
512+
export { formatWorkspaces, workspacesValidator, WORKSPACE_TYPE } from './workspaces';
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
export const WORKSPACE_TYPE = 'workspace';

src/core/server/workspaces/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ export { WorkspaceAttribute, WorkspaceFindOptions } from './types';
1414

1515
export { WorkspacePermissionControl } from './workspace_permission_control';
1616
export { workspacesValidator, formatWorkspaces } from './utils';
17+
export { WORKSPACE_TYPE } from './constants';

src/core/server/workspaces/saved_objects/workspace.ts

+5-18
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,15 @@
44
*/
55

66
import { SavedObjectsType } from 'opensearch-dashboards/server';
7+
import { WORKSPACE_TYPE } from '../constants';
78

89
export const workspace: SavedObjectsType = {
9-
name: 'workspace',
10+
name: WORKSPACE_TYPE,
1011
namespaceType: 'agnostic',
1112
hidden: false,
12-
management: {
13-
icon: 'apps', // todo: pending ux #2034
14-
defaultSearchField: 'title',
15-
importableAndExportable: true,
16-
getTitle(obj) {
17-
return obj.attributes.title;
18-
},
19-
getEditUrl(obj) {
20-
return `/management/opensearch-dashboards/dataSources/${encodeURIComponent(obj.id)}`;
21-
},
22-
getInAppUrl(obj) {
23-
return {
24-
path: `/app/management/opensearch-dashboards/dataSources/${encodeURIComponent(obj.id)}`,
25-
uiCapabilitiesPath: 'management.opensearchDashboards.dataSources',
26-
};
27-
},
28-
},
13+
/**
14+
* workspace won't appear in management page.
15+
*/
2916
mappings: {
3017
dynamic: false,
3118
properties: {

src/core/server/workspaces/workspaces_client.ts

+6-10
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import {
1212
} from './types';
1313
import { WorkspacesSetupDeps } from './workspaces_service';
1414
import { workspace } from './saved_objects';
15-
16-
export const WORKSPACES_TYPE_FOR_SAVED_OBJECT = 'workspace';
15+
import { WORKSPACE_TYPE } from './constants';
1716

1817
export class WorkspacesClientWithSavedObject implements IWorkspaceDBImpl {
1918
private setupDep: WorkspacesSetupDeps;
@@ -50,7 +49,7 @@ export class WorkspacesClientWithSavedObject implements IWorkspaceDBImpl {
5049
try {
5150
const result = await this.getSavedObjectClientsFromRequestDetail(requestDetail).create<
5251
Omit<WorkspaceAttribute, 'id'>
53-
>(WORKSPACES_TYPE_FOR_SAVED_OBJECT, payload);
52+
>(WORKSPACE_TYPE, payload);
5453
return {
5554
success: true,
5655
result: {
@@ -75,7 +74,7 @@ export class WorkspacesClientWithSavedObject implements IWorkspaceDBImpl {
7574
} = await this.getSavedObjectClientsFromRequestDetail(requestDetail).find<WorkspaceAttribute>(
7675
{
7776
...options,
78-
type: WORKSPACES_TYPE_FOR_SAVED_OBJECT,
77+
type: WORKSPACE_TYPE,
7978
}
8079
);
8180
return {
@@ -99,7 +98,7 @@ export class WorkspacesClientWithSavedObject implements IWorkspaceDBImpl {
9998
try {
10099
const result = await this.getSavedObjectClientsFromRequestDetail(requestDetail).get<
101100
WorkspaceAttribute
102-
>(WORKSPACES_TYPE_FOR_SAVED_OBJECT, id);
101+
>(WORKSPACE_TYPE, id);
103102
return {
104103
success: true,
105104
result: this.getFlatternedResultWithSavedObject(result),
@@ -119,7 +118,7 @@ export class WorkspacesClientWithSavedObject implements IWorkspaceDBImpl {
119118
try {
120119
await this.getSavedObjectClientsFromRequestDetail(requestDetail).update<
121120
Omit<WorkspaceAttribute, 'id'>
122-
>(WORKSPACES_TYPE_FOR_SAVED_OBJECT, id, payload);
121+
>(WORKSPACE_TYPE, id, payload);
123122
return {
124123
success: true,
125124
result: true,
@@ -133,10 +132,7 @@ export class WorkspacesClientWithSavedObject implements IWorkspaceDBImpl {
133132
}
134133
public async delete(requestDetail: IRequestDetail, id: string): Promise<IResponse<boolean>> {
135134
try {
136-
await this.getSavedObjectClientsFromRequestDetail(requestDetail).delete(
137-
WORKSPACES_TYPE_FOR_SAVED_OBJECT,
138-
id
139-
);
135+
await this.getSavedObjectClientsFromRequestDetail(requestDetail).delete(WORKSPACE_TYPE, id);
140136
return {
141137
success: true,
142138
result: true,

src/core/utils/constants.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
export const WORKSPACE_PATH_PREFIX = '/w';

src/core/utils/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,4 @@ export {
3838
} from './context';
3939
export { DEFAULT_APP_CATEGORIES } from './default_app_categories';
4040
export { DEFAULT_WORKSPACE_TEMPLATES } from './default_workspace_templates';
41+
export { WORKSPACE_PATH_PREFIX } from './constants';

src/plugins/saved_objects_management/public/management_section/mount_section.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import { ManagementAppMountParams } from 'src/plugins/management/public';
3838
import { StartDependencies, SavedObjectsManagementPluginStart } from '../plugin';
3939
import { ISavedObjectsManagementServiceRegistry } from '../services';
4040
import { getAllowedTypes } from './../lib';
41+
import { WORKSPACE_TYPE } from '../../../../core/public';
4142

4243
interface MountParams {
4344
core: CoreSetup<StartDependencies, SavedObjectsManagementPluginStart>;
@@ -67,7 +68,12 @@ export const mountManagementSection = async ({
6768
const setBreadcrumbs = mountParams?.setBreadcrumbs || chrome.setBreadcrumbs;
6869
let finalAllowedObjectTypes = allowedObjectTypes;
6970
if (finalAllowedObjectTypes === undefined) {
70-
finalAllowedObjectTypes = await getAllowedTypes(coreStart.http);
71+
/**
72+
* Workspace needs to be filtered out since it is a concept with higher level than normal saved objects.
73+
*/
74+
finalAllowedObjectTypes = (await getAllowedTypes(coreStart.http)).filter(
75+
(item) => item !== WORKSPACE_TYPE
76+
);
7177
}
7278

7379
coreStart.chrome.docTitle.change(title);

src/plugins/workspace/public/components/utils/workspace_column.tsx

-4
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ function WorkspaceColumn({ coreSetup, workspaces, record }: WorkspaceColumnProps
3131
});
3232
wsLookUp?.set('public', publicWsName);
3333

34-
if (record.type === 'workspace') {
35-
return null;
36-
}
37-
3834
if (!workspaces) {
3935
return <EuiText>{publicWsName}</EuiText>;
4036
}

src/plugins/workspace/public/plugin.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import {
1414
} from '../../../core/public';
1515
import { WORKSPACE_APP_ID } from '../common/constants';
1616
import { mountDropdownList } from './mount';
17-
import { getWorkspaceIdFromUrl } from '../../../core/public/utils';
1817
import { SavedObjectsManagementPluginSetup } from '../../saved_objects_management/public';
1918
import { getWorkspaceColumn } from './components/utils/workspace_column';
19+
import { getWorkspaceIdFromUrl, WORKSPACE_PATH_PREFIX } from '../../../core/public/utils';
2020

2121
interface WorkspacesPluginSetupDeps {
2222
savedObjectsManagement?: SavedObjectsManagementPluginSetup;
@@ -36,13 +36,16 @@ export class WorkspacesPlugin implements Plugin<{}, {}, WorkspacesPluginSetupDep
3636
*/
3737
newUrl.pathname = this.coreSetup?.http.basePath.remove(newUrl.pathname) || '';
3838
if (workspaceId) {
39-
newUrl.pathname = `${this.coreSetup?.http.basePath.serverBasePath || ''}/w/${workspaceId}${
40-
newUrl.pathname
41-
}`;
39+
newUrl.pathname = `${WORKSPACE_PATH_PREFIX}/${workspaceId}${newUrl.pathname}`;
4240
} else {
43-
newUrl.pathname = `${this.coreSetup?.http.basePath.serverBasePath || ''}${newUrl.pathname}`;
41+
newUrl.pathname = newUrl.pathname.replace(/^\/w\/([^\/]*)/, '');
4442
}
4543

44+
newUrl.pathname =
45+
this.coreSetup?.http.basePath.prepend(newUrl.pathname, {
46+
withoutWorkspace: true,
47+
}) || '';
48+
4649
return newUrl.toString();
4750
};
4851
public async setup(core: CoreSetup, { savedObjectsManagement }: WorkspacesPluginSetupDeps) {

0 commit comments

Comments
 (0)