Skip to content

Commit d7cd6b1

Browse files
committed
feat: library settings menu
1 parent 82a3c28 commit d7cd6b1

9 files changed

Lines changed: 71 additions & 34 deletions

File tree

src/header/Header.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { type Container, useToggle } from '@openedx/paragon';
66
import { useWaffleFlags } from '../data/apiHooks';
77
import { SearchModal } from '../search-modal';
88
import {
9-
useContentMenuItems, useLibraryToolsMenuItems, useSettingMenuItems, useToolsMenuItems,
9+
useContentMenuItems, useLibrarySettingsMenuItems, useLibraryToolsMenuItems, useSettingMenuItems, useToolsMenuItems,
1010
} from './hooks';
1111
import messages from './messages';
1212

@@ -43,6 +43,7 @@ const Header = ({
4343
const settingMenuItems = useSettingMenuItems(contextId);
4444
const toolsMenuItems = useToolsMenuItems(contextId);
4545
const libraryToolsMenuItems = useLibraryToolsMenuItems(contextId);
46+
const libraryToolsSettingsItems = useLibrarySettingsMenuItems();
4647
const mainMenuDropdowns = !isLibrary ? [
4748
{
4849
id: `${intl.formatMessage(messages['header.links.content'])}-dropdown-menu`,
@@ -59,11 +60,18 @@ const Header = ({
5960
buttonTitle: intl.formatMessage(messages['header.links.tools']),
6061
items: toolsMenuItems,
6162
},
62-
] : [{
63-
id: `${intl.formatMessage(messages['header.links.tools'])}-dropdown-menu`,
64-
buttonTitle: intl.formatMessage(messages['header.links.tools']),
65-
items: libraryToolsMenuItems,
66-
}];
63+
] : [
64+
{
65+
id: `${intl.formatMessage(messages['header.links.settings'])}-dropdown-menu`,
66+
buttonTitle: intl.formatMessage(messages['header.links.settings']),
67+
items: libraryToolsSettingsItems,
68+
},
69+
{
70+
id: `${intl.formatMessage(messages['header.links.tools'])}-dropdown-menu`,
71+
buttonTitle: intl.formatMessage(messages['header.links.tools']),
72+
items: libraryToolsMenuItems,
73+
},
74+
];
6775

6876
const getOutlineLink = () => {
6977
if (isLibrary) {
Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ import { useIntl } from '@edx/frontend-platform/i18n';
33
import { useSelector } from 'react-redux';
44
import { Badge } from '@openedx/paragon';
55

6-
import { getPagePath } from '../utils';
7-
import { useWaffleFlags } from '../data/apiHooks';
8-
import { getStudioHomeData } from '../studio-home/data/selectors';
6+
import { getPagePath } from '@src/utils';
7+
import { useWaffleFlags } from '@src/data/apiHooks';
8+
import { getStudioHomeData } from '@src/studio-home/data/selectors';
99
import messages from './messages';
10-
import courseOptimizerMessages from '../optimizer-page/messages';
10+
import courseOptimizerMessages from '@src/optimizer-page/messages';
11+
import { LibQueryParamKeys, SidebarActions } from '@src/library-authoring/common/context/SidebarContext';
1112

12-
export const useContentMenuItems = courseId => {
13+
export const useContentMenuItems = (courseId: string) => {
1314
const intl = useIntl();
1415
const studioBaseUrl = getConfig().STUDIO_BASE_URL;
1516
const waffleFlags = useWaffleFlags();
@@ -50,7 +51,7 @@ export const useContentMenuItems = courseId => {
5051
return items;
5152
};
5253

53-
export const useSettingMenuItems = courseId => {
54+
export const useSettingMenuItems = (courseId: string) => {
5455
const intl = useIntl();
5556
const studioBaseUrl = getConfig().STUDIO_BASE_URL;
5657
const { canAccessAdvancedSettings } = useSelector(getStudioHomeData);
@@ -89,7 +90,7 @@ export const useSettingMenuItems = courseId => {
8990
return items;
9091
};
9192

92-
export const useToolsMenuItems = (courseId) => {
93+
export const useToolsMenuItems = (courseId: string) => {
9394
const intl = useIntl();
9495
const studioBaseUrl = getConfig().STUDIO_BASE_URL;
9596
const waffleFlags = useWaffleFlags();
@@ -127,7 +128,7 @@ export const useToolsMenuItems = (courseId) => {
127128
return items;
128129
};
129130

130-
export const useLibraryToolsMenuItems = itemId => {
131+
export const useLibraryToolsMenuItems = (itemId: string) => {
131132
const intl = useIntl();
132133

133134
const items = [
@@ -139,3 +140,23 @@ export const useLibraryToolsMenuItems = itemId => {
139140

140141
return items;
141142
};
143+
144+
export const useLibrarySettingsMenuItems = () => {
145+
const intl = useIntl();
146+
147+
const openTeamAccessModalUrl = () => {
148+
const url = new URL(window.location.href);
149+
// Set ?sa=manage-team in url which in turn opens team access modal
150+
url.searchParams.set(LibQueryParamKeys.SidebarActions, SidebarActions.ManageTeam);
151+
return url.toString();
152+
}
153+
154+
const items = [
155+
{
156+
title: intl.formatMessage(messages['header.menu.teamAccess']),
157+
href: openTeamAccessModalUrl(),
158+
},
159+
];
160+
161+
return items;
162+
};

src/header/messages.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ const messages = defineMessages({
106106
defaultMessage: 'Backup to local archive',
107107
description: 'Link to Studio Backup Library page',
108108
},
109+
'header.menu.teamAccess': {
110+
id: 'header.links.teamAccess',
111+
defaultMessage: 'Team Access',
112+
description: 'Menu item to open team access popup',
113+
},
109114
'header.links.optimizer': {
110115
id: 'header.links.optimizer',
111116
defaultMessage: 'Course Optimizer',

src/library-authoring/LibraryLayout.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { CreateContainerModal } from './create-container';
1818
import { ROUTES } from './routes';
1919
import { LibrarySectionPage, LibrarySubsectionPage } from './section-subsections';
2020
import { LibraryUnitPage } from './units';
21+
import { LibraryTeamModal } from './library-team';
2122

2223
const LibraryLayoutWrapper: React.FC<React.PropsWithChildren> = ({ children }) => {
2324
const {
@@ -48,6 +49,7 @@ const LibraryLayoutWrapper: React.FC<React.PropsWithChildren> = ({ children }) =
4849
<CreateCollectionModal />
4950
<CreateContainerModal />
5051
<ComponentEditorModal />
52+
<LibraryTeamModal />
5153
</SidebarProvider>
5254
</LibraryProvider>
5355
);

src/library-authoring/common/context/SidebarContext.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ export enum SidebarActions {
8181
None = '',
8282
}
8383

84+
export enum LibQueryParamKeys {
85+
SidebarActions = 'sa',
86+
SidebarTab = 'st',
87+
}
88+
8489
export type SidebarContextData = {
8590
closeLibrarySidebar: () => void;
8691
openAddContentSidebar: () => void;
@@ -129,14 +134,14 @@ export const SidebarProvider = ({
129134

130135
const [sidebarTab, setSidebarTab] = useStateWithUrlSearchParam<SidebarInfoTab>(
131136
defaultTab.component,
132-
'st',
137+
LibQueryParamKeys.SidebarTab,
133138
(value: string) => toSidebarInfoTab(value),
134139
(value: SidebarInfoTab) => value.toString(),
135140
);
136141

137142
const [sidebarAction, setSidebarAction] = useStateWithUrlSearchParam<SidebarActions>(
138143
SidebarActions.None,
139-
'sa',
144+
LibQueryParamKeys.SidebarActions,
140145
(value: string) => Object.values(SidebarActions).find((enumValue) => value === enumValue),
141146
(value: SidebarActions) => value.toString(),
142147
);

src/library-authoring/library-info/LibraryInfo.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,16 @@ import { FormattedDate, useIntl } from '@edx/frontend-platform/i18n';
44

55
import messages from './messages';
66
import LibraryPublishStatus from './LibraryPublishStatus';
7-
import { LibraryTeamModal } from '../library-team';
87
import { useLibraryContext } from '../common/context/LibraryContext';
98
import { SidebarActions, useSidebarContext } from '../common/context/SidebarContext';
109

1110
const LibraryInfo = () => {
1211
const intl = useIntl();
1312
const { libraryData, readOnly } = useLibraryContext();
14-
const { sidebarAction, setSidebarAction, resetSidebarAction } = useSidebarContext();
15-
const isLibraryTeamModalOpen = (sidebarAction === SidebarActions.ManageTeam);
13+
const { setSidebarAction } = useSidebarContext();
1614
const openLibraryTeamModal = useCallback(() => {
1715
setSidebarAction(SidebarActions.ManageTeam);
1816
}, [setSidebarAction]);
19-
const closeLibraryTeamModal = useCallback(() => {
20-
resetSidebarAction();
21-
}, [resetSidebarAction]);
2217

2318
return (
2419
<Stack direction="vertical" gap={2.5}>
@@ -67,7 +62,6 @@ const LibraryInfo = () => {
6762
</span>
6863
</Stack>
6964
</Stack>
70-
{isLibraryTeamModalOpen && <LibraryTeamModal onClose={closeLibraryTeamModal} />}
7165
</Stack>
7266
);
7367
};

src/library-authoring/library-team/LibraryTeamModal.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
import React from 'react';
2-
31
import { StandardModal } from '@openedx/paragon';
42
import { useIntl } from '@edx/frontend-platform/i18n';
53

64
import LibraryTeam from './LibraryTeam';
75
import messages from './messages';
6+
import { SidebarActions, useSidebarContext } from '../common/context/SidebarContext';
7+
import { useCallback } from 'react';
88

9-
interface LibraryTeamModalProps {
10-
onClose: () => void;
11-
}
12-
13-
export const LibraryTeamModal: React.FC<LibraryTeamModalProps> = ({
14-
onClose,
15-
}) => {
9+
export const LibraryTeamModal = () => {
1610
const intl = useIntl();
11+
const { sidebarAction, resetSidebarAction } = useSidebarContext();
12+
// Open the library team modal only when Manage Team sidebar action is set
13+
const isOpen = (sidebarAction === SidebarActions.ManageTeam);
14+
const onClose = useCallback(() => {
15+
resetSidebarAction();
16+
}, [resetSidebarAction]);
1717

1818
// Show Library Team modal in full screen
1919
return (
2020
<StandardModal
21-
isOpen
21+
isOpen={isOpen}
2222
title={intl.formatMessage(messages.modalTitle)}
2323
onClose={onClose}
2424
size="lg"

src/library-authoring/routes.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
useSearchParams,
1212
} from 'react-router-dom';
1313
import { ContainerType, getBlockType } from '../generic/key-utils';
14+
import { LibQueryParamKeys } from './common/context/SidebarContext';
1415

1516
export const BASE_ROUTE = '/library/:libraryId';
1617

@@ -231,7 +232,7 @@ export const useLibraryRoutes = (): LibraryRoutesData => {
231232
}
232233

233234
// Also remove the `sa` (sidebar action) search param if it exists.
234-
searchParams.delete('sa');
235+
searchParams.delete(LibQueryParamKeys.SidebarActions);
235236

236237
const newPath = generatePath(BASE_ROUTE + route, routeParams);
237238
// Prevent unnecessary navigation if the path is the same.

src/studio-home/data/slice.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ const slice = createSlice({
6363
studioShortName?: string;
6464
techSupportEmail?: string;
6565
userIsActive?: boolean;
66+
canAccessAdvancedSettings?: boolean;
6667
},
6768
studioHomeCoursesRequestParams: studioHomeCoursesRequestParamsDefault,
6869
},

0 commit comments

Comments
 (0)