diff --git a/.env b/.env
index 55688ba00..c84527240 100644
--- a/.env
+++ b/.env
@@ -48,3 +48,4 @@ LIBRARY_UNSUPPORTED_BLOCKS="conditional,step-builder,problem-builder"
# Fallback in local style files
PARAGON_THEME_URLS={}
COURSE_TEAM_SUPPORT_EMAIL=''
+ADMIN_CONSOLE_URL='http://localhost:2025/admin-console'
diff --git a/.env.development b/.env.development
index f634640c1..089fcad23 100644
--- a/.env.development
+++ b/.env.development
@@ -51,3 +51,4 @@ LIBRARY_UNSUPPORTED_BLOCKS="conditional,step-builder,problem-builder"
# Fallback in local style files
PARAGON_THEME_URLS={}
COURSE_TEAM_SUPPORT_EMAIL=''
+ADMIN_CONSOLE_URL='http://localhost:2025/admin-console'
diff --git a/src/index.jsx b/src/index.jsx
index 3170be854..928be99e0 100755
--- a/src/index.jsx
+++ b/src/index.jsx
@@ -178,6 +178,7 @@ initialize({
ENABLE_GRADING_METHOD_IN_PROBLEMS: process.env.ENABLE_GRADING_METHOD_IN_PROBLEMS === 'true',
LIBRARY_UNSUPPORTED_BLOCKS: (process.env.LIBRARY_UNSUPPORTED_BLOCKS || 'conditional,step-builder,problem-builder').split(','),
COURSE_TEAM_SUPPORT_EMAIL: process.env.COURSE_TEAM_SUPPORT_EMAIL || null,
+ ADMIN_CONSOLE_URL: process.env.ADMIN_CONSOLE_URL || null,
}, 'CourseAuthoringConfig');
},
},
diff --git a/src/library-authoring/library-info/LibraryInfo.test.tsx b/src/library-authoring/library-info/LibraryInfo.test.tsx
index 28f82007b..e7239c703 100644
--- a/src/library-authoring/library-info/LibraryInfo.test.tsx
+++ b/src/library-authoring/library-info/LibraryInfo.test.tsx
@@ -1,4 +1,5 @@
import type MockAdapter from 'axios-mock-adapter';
+import { mergeConfig } from '@edx/frontend-platform';
import {
fireEvent,
@@ -27,7 +28,7 @@ const {
} = mockContentLibrary;
const render = (libraryId: string = mockLibraryId) => baseRender(, {
- extraWrapper: ({ children }) => { children },
+ extraWrapper: ({ children }) => {children},
});
let axiosMock: MockAdapter;
@@ -270,4 +271,13 @@ describe('', () => {
expect(publishButton).not.toBeInTheDocument();
expect(discardButton).not.toBeInTheDocument();
});
+
+ it('display a redirection button when ADMIN_CONSOLE_URL is setted', async () => {
+ const ADMIN_CONSOLE_URL = 'http://localhost:2025/admin-console';
+ mergeConfig({ ADMIN_CONSOLE_URL });
+ render();
+ const manageTeam = await screen.getByText('Manage Access');
+ expect(manageTeam).toBeInTheDocument();
+ expect(manageTeam).toHaveAttribute('href', `${ADMIN_CONSOLE_URL}/authz/libraries/${libraryData.id}`);
+ });
});
diff --git a/src/library-authoring/library-info/LibraryInfo.tsx b/src/library-authoring/library-info/LibraryInfo.tsx
index 5269b798a..1a44937d8 100644
--- a/src/library-authoring/library-info/LibraryInfo.tsx
+++ b/src/library-authoring/library-info/LibraryInfo.tsx
@@ -1,5 +1,6 @@
import { useCallback } from 'react';
-import { Button, Stack } from '@openedx/paragon';
+import { Button, Hyperlink, Stack } from '@openedx/paragon';
+import { getConfig } from '@edx/frontend-platform';
import { FormattedDate, useIntl } from '@edx/frontend-platform/i18n';
import messages from './messages';
@@ -10,9 +11,17 @@ import { SidebarActions, useSidebarContext } from '../common/context/SidebarCont
const LibraryInfo = () => {
const intl = useIntl();
- const { libraryData, readOnly } = useLibraryContext();
+ const { libraryId, libraryData, readOnly } = useLibraryContext();
const { sidebarAction, setSidebarAction, resetSidebarAction } = useSidebarContext();
const isLibraryTeamModalOpen = (sidebarAction === SidebarActions.ManageTeam);
+ const adminConsoleUrl = getConfig().ADMIN_CONSOLE_URL;
+
+ // always show link to admin console MFE if it is being used
+ const shouldShowAdminConsoleLink = !!adminConsoleUrl;
+
+ // if the admin console MFE isn't being used, show team modal button for non–read-only users
+ const shouldShowTeamModalButton = !adminConsoleUrl && !readOnly;
+
const openLibraryTeamModal = useCallback(() => {
setSidebarAction(SidebarActions.ManageTeam);
}, [setSidebarAction]);
@@ -30,11 +39,16 @@ const LibraryInfo = () => {
{libraryData?.org}
- {!readOnly && (
+ {shouldShowTeamModalButton && (
)}
+ {shouldShowAdminConsoleLink && (
+
+ )}