feat: add the libraries authz management view

This commit is contained in:
Diana Olarte
2025-09-24 23:02:12 +10:00
committed by Adolfo R. Brandes
parent 21a3b9278b
commit 9a8d0d21d7
3 changed files with 135 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
import { screen } from '@testing-library/react';
import LibrariesAuthZManager from './LibrariesAuthZManager';
import { useLibraryAuthZ } from './context';
import { renderWrapper } from '@src/setupTest';
import { initializeMockApp } from '@edx/frontend-platform/testing';
jest.mock('./context', () => {
const actual = jest.requireActual('./context');
return {
...actual,
useLibraryAuthZ: jest.fn(),
LibraryAuthZProvider: ({ children }: { children: React.ReactNode }) => <div>{children}</div>,
};
});
const mockedUseLibraryAuthZ = useLibraryAuthZ as jest.Mock;
jest.mock('./components/TeamTable', () => ({
__esModule: true,
default: () => <div data-testid="team-table">MockTeamTable</div>,
}));
describe('LibrariesAuthZManager', () => {
beforeEach(() => {
initializeMockApp({
authenticatedUser: {
username: 'admin'
}
})
mockedUseLibraryAuthZ.mockReturnValue({
libraryId: 'lib-001',
libraryName: 'Mock Library',
libraryOrg: 'MockOrg',
username: 'mockuser',
roles: ['admin'],
permissions: [],
canManageTeam: true,
});
});
it('renders tabs and layout content correctly', () => {
renderWrapper(<div>hola<LibrariesAuthZManager /></div>);
// Tabs
expect(screen.getByRole('tab', { name: /Team Members/i })).toBeInTheDocument();
expect(screen.getByRole('tab', { name: /Roles/i })).toBeInTheDocument();
expect(screen.getByRole('tab', { name: /Permissions/i })).toBeInTheDocument();
// Breadcrumb/page title
expect(screen.getByText('Manage Access')).toBeInTheDocument(); // from intl.formatMessage
expect(screen.getByText('lib-001')).toBeInTheDocument(); // subtitle
// TeamTable is rendered
expect(screen.getByTestId('team-table')).toBeInTheDocument();
});
});

View File

@@ -0,0 +1,49 @@
import { useIntl } from '@edx/frontend-platform/i18n';
import { Tab, Tabs } from '@openedx/paragon';
import TeamTable from './components/TeamTable';
import AuthZLayout from '../components/AuthZLayout';
import { LibraryAuthZProvider, useLibraryAuthZ } from './context';
import messages from './messages';
const LibrariesAuthZView = () => {
const intl = useIntl();
const { libraryId, libraryName, libraryOrg } = useLibraryAuthZ();
const rootBradecrumb = intl.formatMessage(messages['library.authz.breadcrumb.root']) || '';
const pageTitle = intl.formatMessage(messages['library.authz.manage.page.title']);
return (
<div className="authz-libraries">
<AuthZLayout
context={{ id: libraryId, title: libraryName, org: libraryOrg }}
navLinks={[{ label: rootBradecrumb }]}
activeLabel={pageTitle}
pageTitle={pageTitle}
pageSubtitle={libraryId}
actions={[]}
>
<Tabs
variant="tabs"
defaultActiveKey="team"
className="bg-light-100 px-5"
>
<Tab eventKey="team" title={intl.formatMessage(messages['library.authz.tabs.team'])} className="p-5">
<TeamTable />
</Tab>
<Tab eventKey="roles" title={intl.formatMessage(messages['library.authz.tabs.roles'])}>
Role tab.
</Tab>
<Tab eventKey="permissions" title={intl.formatMessage(messages['library.authz.tabs.permissions'])}>
Permissions tab.
</Tab>
</Tabs>
</AuthZLayout>
</div>
);
};
const LibrariesAuthZManager = () => (
<LibraryAuthZProvider>
<LibrariesAuthZView />
</LibraryAuthZProvider>
);
export default LibrariesAuthZManager;

View File

@@ -0,0 +1,31 @@
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
'library.authz.manage.page.title': {
id: 'library.authz.manage.page.title',
defaultMessage: 'Library Team Management',
description: 'Libreries AuthZ page title',
},
'library.authz.breadcrumb.root': {
id: 'library.authz.breadcrumb.root',
defaultMessage: 'Manage Access',
description: 'Libreries AuthZ root breafcrumb',
},
'library.authz.tabs.team': {
id: 'library.authz.tabs.team',
defaultMessage: 'Team Members',
description: 'Libreries AuthZ title for the team management tab',
},
'library.authz.tabs.roles': {
id: 'library.authz.tabs.roles',
defaultMessage: 'Roles',
description: 'Libreries AuthZ title for the roles tab',
},
'library.authz.tabs.permissions': {
id: 'library.authz.tabs.permissions',
defaultMessage: 'Permissions',
description: 'Libreries AuthZ title for the permissions tab',
},
});
export default messages;