@openedx/frontend-app-instructor-dashboard 1.0.0-alpha.2 → 1.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/app.js CHANGED
@@ -2,20 +2,17 @@ import { appId } from './constants';
2
2
  import routes from './routes';
3
3
  import slots from './slots';
4
4
  import providers from './providers';
5
+ import provides from './provides';
5
6
  const app = {
6
7
  appId,
7
8
  routes,
8
9
  providers,
10
+ provides,
9
11
  slots,
10
12
  config: {
11
13
  NODE_ENV: 'development',
12
14
  LMS_BASE_URL: 'http://local.openedx.io:8000'
13
15
  },
14
- provides: {
15
- 'org.openedx.frontend.provides.courseNavigationRoles.v1': {
16
- courseNavigationRoles: ['org.openedx.frontend.role.instructor'],
17
- },
18
- },
19
16
  };
20
17
  export default app;
21
18
  //# sourceMappingURL=app.js.map
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,MAAM,GAAG,GAAQ;IACf,KAAK;IACL,MAAM;IACN,SAAS;IACT,KAAK;IACL,MAAM,EAAE;QACN,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,8BAA8B;KAC7C;IACD,QAAQ,EAAE;QACR,wDAAwD,EAAE;YACxD,qBAAqB,EAAE,CAAC,sCAAsC,CAAC;SAChE;KACF;CACF,CAAC;AAEF,eAAe,GAAG,CAAC","sourcesContent":["import { App } from '@openedx/frontend-base';\nimport { appId } from '@src/constants';\nimport routes from '@src/routes';\nimport slots from '@src/slots';\nimport providers from '@src/providers';\n\nconst app: App = {\n appId,\n routes,\n providers,\n slots,\n config: {\n NODE_ENV: 'development',\n LMS_BASE_URL: 'http://local.openedx.io:8000'\n },\n provides: {\n 'org.openedx.frontend.provides.courseNavigationRoles.v1': {\n courseNavigationRoles: ['org.openedx.frontend.role.instructor'],\n },\n },\n};\n\nexport default app;\n"]}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,MAAM,GAAG,GAAQ;IACf,KAAK;IACL,MAAM;IACN,SAAS;IACT,QAAQ;IACR,KAAK;IACL,MAAM,EAAE;QACN,QAAQ,EAAE,aAAa;QACvB,YAAY,EAAE,8BAA8B;KAC7C;CACF,CAAC;AAEF,eAAe,GAAG,CAAC","sourcesContent":["import { App } from '@openedx/frontend-base';\nimport { appId } from '@src/constants';\nimport routes from '@src/routes';\nimport slots from '@src/slots';\nimport providers from '@src/providers';\nimport provides from '@src/provides';\n\nconst app: App = {\n appId,\n routes,\n providers,\n provides,\n slots,\n config: {\n NODE_ENV: 'development',\n LMS_BASE_URL: 'http://local.openedx.io:8000'\n },\n};\n\nexport default app;\n"]}
@@ -1,7 +1,7 @@
1
1
  export declare const cohortsQueryKeys: {
2
- all: readonly ["org.openedx.frontend.app.instructor", "cohorts"];
3
- byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "cohorts", "byCourse", string];
4
- list: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "cohorts", "byCourse", string, string, "list"];
2
+ all: readonly ["org.openedx.frontend.app.instructorDashboard", "cohorts"];
3
+ byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "cohorts", "byCourse", string];
4
+ list: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "cohorts", "byCourse", string, string, "list"];
5
5
  enabled: (courseId: string) => readonly ["cohortsEnabled", string];
6
- contentGroups: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "cohorts", "byCourse", string, "contentGroups"];
6
+ contentGroups: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "cohorts", "byCourse", string, "contentGroups"];
7
7
  };
@@ -1 +1,2 @@
1
- export declare const appId = "org.openedx.frontend.app.instructor";
1
+ export declare const appId = "org.openedx.frontend.app.instructorDashboard";
2
+ export declare const instructorDashboardRole = "org.openedx.frontend.role.instructorDashboard";
package/dist/constants.js CHANGED
@@ -1,2 +1,3 @@
1
- export const appId = 'org.openedx.frontend.app.instructor';
1
+ export const appId = 'org.openedx.frontend.app.instructorDashboard';
2
+ export const instructorDashboardRole = 'org.openedx.frontend.role.instructorDashboard';
2
3
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,qCAAqC,CAAC","sourcesContent":["export const appId = 'org.openedx.frontend.app.instructor';\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,8CAA8C,CAAC;AACpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,+CAA+C,CAAC","sourcesContent":["export const appId = 'org.openedx.frontend.app.instructorDashboard';\nexport const instructorDashboardRole = 'org.openedx.frontend.role.instructorDashboard';\n"]}
@@ -1,12 +1,12 @@
1
1
  export declare const courseInfoQueryKeys: {
2
- all: readonly ["org.openedx.frontend.app.instructor", "courseInfo"];
3
- byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "courseInfo", string];
2
+ all: readonly ["org.openedx.frontend.app.instructorDashboard", "courseInfo"];
3
+ byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "courseInfo", string];
4
4
  };
5
5
  export declare const pendingTasksQueryKey: {
6
- all: readonly ["org.openedx.frontend.app.instructor", "pendingTasks"];
7
- byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "pendingTasks", string];
6
+ all: readonly ["org.openedx.frontend.app.instructorDashboard", "pendingTasks"];
7
+ byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "pendingTasks", string];
8
8
  };
9
9
  export declare const learnerQueryKeys: {
10
- all: readonly ["org.openedx.frontend.app.instructor", "learner"];
11
- byCourseAndLearner: (courseId: string, emailOrUsername: string) => readonly ["org.openedx.frontend.app.instructor", "learner", string, string];
10
+ all: readonly ["org.openedx.frontend.app.instructorDashboard", "learner"];
11
+ byCourseAndLearner: (courseId: string, emailOrUsername: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "learner", string, string];
12
12
  };
@@ -1,5 +1,5 @@
1
1
  export declare const dataDownloadsQueryKeys: {
2
- all: readonly ["org.openedx.frontend.app.instructor", "dataDownloads"];
3
- generatedReports: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "dataDownloads", "generatedReports", string];
4
- generateReportLink: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "dataDownloads", "reportLink", string];
2
+ all: readonly ["org.openedx.frontend.app.instructorDashboard", "dataDownloads"];
3
+ generatedReports: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "dataDownloads", "generatedReports", string];
4
+ generateReportLink: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "dataDownloads", "reportLink", string];
5
5
  };
@@ -1,10 +1,10 @@
1
1
  import { DateExtensionQueryParams } from '../types';
2
2
  export declare const dateExtensionsQueryKeys: {
3
- all: readonly ["org.openedx.frontend.app.instructor", "dateExtensions"];
4
- byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "dateExtensions", string];
5
- byCoursePaginated: (courseId: string, params: DateExtensionQueryParams) => readonly ["org.openedx.frontend.app.instructor", "dateExtensions", string, number, number, string, string];
3
+ all: readonly ["org.openedx.frontend.app.instructorDashboard", "dateExtensions"];
4
+ byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "dateExtensions", string];
5
+ byCoursePaginated: (courseId: string, params: DateExtensionQueryParams) => readonly ["org.openedx.frontend.app.instructorDashboard", "dateExtensions", string, number, number, string, string];
6
6
  };
7
7
  export declare const gradedSubsectionsQueryKeys: {
8
- all: readonly ["org.openedx.frontend.app.instructor", "gradedSubsections"];
9
- byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "gradedSubsections", string];
8
+ all: readonly ["org.openedx.frontend.app.instructorDashboard", "gradedSubsections"];
9
+ byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "gradedSubsections", string];
10
10
  };
@@ -1,7 +1,7 @@
1
1
  import { EnrollmentsParams } from '../types';
2
2
  export declare const enrollmentsQueryKeys: {
3
- all: readonly ["org.openedx.frontend.app.instructor", "enrollments"];
4
- byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructor", "enrollments", string];
5
- byCoursePaginated: (courseId: string, params: EnrollmentsParams) => readonly ["org.openedx.frontend.app.instructor", "enrollments", string, number, number, string, string];
6
- byUserId: (courseId: string, userIdentifier: string) => readonly ["org.openedx.frontend.app.instructor", "enrollments", string, "enrollment", string];
3
+ all: readonly ["org.openedx.frontend.app.instructorDashboard", "enrollments"];
4
+ byCourse: (courseId: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "enrollments", string];
5
+ byCoursePaginated: (courseId: string, params: EnrollmentsParams) => readonly ["org.openedx.frontend.app.instructorDashboard", "enrollments", string, number, number, string, string];
6
+ byUserId: (courseId: string, userIdentifier: string) => readonly ["org.openedx.frontend.app.instructorDashboard", "enrollments", string, "enrollment", string];
7
7
  };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,2 @@
1
- export { default as instructApp } from './app';
2
- export { default as instructRoutes } from './routes';
3
- export { default as instructMessages } from './i18n';
1
+ export { default as instructorDashboardApp } from './app';
2
+ export { default as instructorDashboardRoutes } from './routes';
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- export { default as instructApp } from './app';
2
- export { default as instructRoutes } from './routes';
3
- export { default as instructMessages } from './i18n';
1
+ export { default as instructorDashboardApp } from './app';
2
+ export { default as instructorDashboardRoutes } from './routes';
4
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,QAAQ,CAAC","sourcesContent":["export { default as instructApp } from './app';\nexport { default as instructRoutes } from './routes';\nexport { default as instructMessages } from './i18n';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,UAAU,CAAC","sourcesContent":["export { default as instructorDashboardApp } from './app';\nexport { default as instructorDashboardRoutes } from './routes';\n"]}
@@ -8,7 +8,7 @@ import { useWidgetProps } from '../slots/SlotUtils';
8
8
  const InstructorNav = () => {
9
9
  const { courseId = '', tabId = '' } = useParams();
10
10
  const { data: courseInfo, isLoading } = useCourseInfo(courseId);
11
- const widgetPropsArray = useWidgetProps('org.openedx.frontend.slot.instructor.tabs.v1');
11
+ const widgetPropsArray = useWidgetProps('org.openedx.frontend.slot.instructorDashboard.tabs.v1');
12
12
  const { clearAlerts } = useAlert();
13
13
  const sortedTabs = useMemo(() => {
14
14
  var _a;
@@ -1 +1 @@
1
- {"version":3,"file":"InstructorNav.js","sourceRoot":"","sources":["../../src/instructorNav/InstructorNav.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from 'react';\nimport { useParams, Link } from 'react-router-dom';\nimport { Nav, Navbar, Skeleton } from '@openedx/paragon';\nimport { useCourseInfo } from '@src/data/apiHook';\nimport { useAlert } from '@src/providers/AlertProvider';\nimport { useWidgetProps } from '../slots/SlotUtils';\n\nexport interface TabProps {\n tabId: string,\n url: string,\n title: string,\n sortOrder: number,\n}\n\nconst InstructorNav = () => {\n const { courseId = '', tabId = '' } = useParams<{ courseId: string, tabId?: string }>();\n const { data: courseInfo, isLoading } = useCourseInfo(courseId);\n const widgetPropsArray = useWidgetProps('org.openedx.frontend.slot.instructor.tabs.v1') as TabProps[];\n const { clearAlerts } = useAlert();\n\n const sortedTabs = useMemo(() => {\n if (isLoading) return [];\n const apiTabs: TabProps[] = courseInfo?.tabs ?? [];\n const tabMap = new Map<string, TabProps>();\n\n // Adding tabs from API and from slot into a map to avoid duplicates\n apiTabs.forEach(tab => {\n tabMap.set(tab.tabId, tab);\n });\n\n widgetPropsArray.forEach(slotTab => {\n // If the slotTab doesn't have a tabId or title, we can't render it properly, so we skip it.\n if (!slotTab.tabId || !slotTab.title) {\n return;\n }\n\n tabMap.set(slotTab.tabId, slotTab);\n });\n\n const allTabs = Array.from(tabMap.values());\n\n // Tabs are sorted by sortOrder, with a fallback to 1000 to be placed at the end for tabs that don't have sortOrder defined (to avoid NaN issues)\n return allTabs.sort((a, b) => (a.sortOrder ?? 1000) - (b.sortOrder ?? 1000));\n }, [courseInfo?.tabs, isLoading, widgetPropsArray]);\n\n if (isLoading) {\n return <Skeleton className=\"lead\" />;\n }\n\n if (sortedTabs.length === 0) return null;\n\n return (\n <Navbar expand=\"md\" className=\"py-0\">\n <Nav\n variant=\"tabs\"\n activeKey={tabId}\n >\n <Navbar.Toggle aria-controls=\"instructor-nav\" />\n <Navbar.Collapse id=\"instructor-nav\">\n {\n sortedTabs.map((tab) => (\n <Nav.Item key={tab.tabId}>\n <Nav.Link\n as={Link}\n to={tab.url}\n active={tab.tabId === tabId}\n onClick={() => clearAlerts()}\n >\n {tab.title}\n </Nav.Link>\n </Nav.Item>\n ))\n }\n </Navbar.Collapse>\n </Nav>\n </Navbar>\n );\n};\n\nexport default InstructorNav;\n"]}
1
+ {"version":3,"file":"InstructorNav.js","sourceRoot":"","sources":["../../src/instructorNav/InstructorNav.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from 'react';\nimport { useParams, Link } from 'react-router-dom';\nimport { Nav, Navbar, Skeleton } from '@openedx/paragon';\nimport { useCourseInfo } from '@src/data/apiHook';\nimport { useAlert } from '@src/providers/AlertProvider';\nimport { useWidgetProps } from '../slots/SlotUtils';\n\nexport interface TabProps {\n tabId: string,\n url: string,\n title: string,\n sortOrder: number,\n}\n\nconst InstructorNav = () => {\n const { courseId = '', tabId = '' } = useParams<{ courseId: string, tabId?: string }>();\n const { data: courseInfo, isLoading } = useCourseInfo(courseId);\n const widgetPropsArray = useWidgetProps('org.openedx.frontend.slot.instructorDashboard.tabs.v1') as TabProps[];\n const { clearAlerts } = useAlert();\n\n const sortedTabs = useMemo(() => {\n if (isLoading) return [];\n const apiTabs: TabProps[] = courseInfo?.tabs ?? [];\n const tabMap = new Map<string, TabProps>();\n\n // Adding tabs from API and from slot into a map to avoid duplicates\n apiTabs.forEach(tab => {\n tabMap.set(tab.tabId, tab);\n });\n\n widgetPropsArray.forEach(slotTab => {\n // If the slotTab doesn't have a tabId or title, we can't render it properly, so we skip it.\n if (!slotTab.tabId || !slotTab.title) {\n return;\n }\n\n tabMap.set(slotTab.tabId, slotTab);\n });\n\n const allTabs = Array.from(tabMap.values());\n\n // Tabs are sorted by sortOrder, with a fallback to 1000 to be placed at the end for tabs that don't have sortOrder defined (to avoid NaN issues)\n return allTabs.sort((a, b) => (a.sortOrder ?? 1000) - (b.sortOrder ?? 1000));\n }, [courseInfo?.tabs, isLoading, widgetPropsArray]);\n\n if (isLoading) {\n return <Skeleton className=\"lead\" />;\n }\n\n if (sortedTabs.length === 0) return null;\n\n return (\n <Navbar expand=\"md\" className=\"py-0\">\n <Nav\n variant=\"tabs\"\n activeKey={tabId}\n >\n <Navbar.Toggle aria-controls=\"instructor-nav\" />\n <Navbar.Collapse id=\"instructor-nav\">\n {\n sortedTabs.map((tab) => (\n <Nav.Item key={tab.tabId}>\n <Nav.Link\n as={Link}\n to={tab.url}\n active={tab.tabId === tabId}\n onClick={() => clearAlerts()}\n >\n {tab.title}\n </Nav.Link>\n </Nav.Item>\n ))\n }\n </Navbar.Collapse>\n </Nav>\n </Navbar>\n );\n};\n\nexport default InstructorNav;\n"]}
@@ -0,0 +1,4 @@
1
+ declare const provides: {
2
+ "org.openedx.frontend.provides.courseNavigationRoles.v1": string;
3
+ };
4
+ export default provides;
@@ -0,0 +1,7 @@
1
+ import { providesCourseNavigationRolesId } from '@openedx/frontend-base';
2
+ import { instructorDashboardRole } from './constants';
3
+ const provides = {
4
+ [providesCourseNavigationRolesId]: instructorDashboardRole
5
+ };
6
+ export default provides;
7
+ //# sourceMappingURL=provides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provides.js","sourceRoot":"","sources":["../src/provides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,QAAQ,GAAG;IACf,CAAC,+BAA+B,CAAC,EAAE,uBAAuB;CAC3D,CAAC;AAEF,eAAe,QAAQ,CAAC","sourcesContent":["import { providesCourseNavigationRolesId } from '@openedx/frontend-base';\nimport { instructorDashboardRole } from './constants';\n\nconst provides = {\n [providesCourseNavigationRolesId]: instructorDashboardRole\n};\n\nexport default provides;\n"]}
package/dist/routes.js CHANGED
@@ -21,6 +21,7 @@ import OpenResponsesPage from './openResponses/OpenResponsesPage';
21
21
  import SpecialExamsPage from './specialExams/SpecialExamsPage';
22
22
  import PageNotFound from './components/PageNotFound';
23
23
  import { useWidgetProps } from './slots/SlotUtils';
24
+ import { instructorDashboardRole } from './constants';
24
25
  const defaultTabs = [
25
26
  { tabId: 'course_info', content: _jsx(CourseInfoPage, {}) },
26
27
  { tabId: 'enrollments', content: _jsx(EnrollmentsPage, {}) },
@@ -35,7 +36,7 @@ const defaultTabs = [
35
36
  ];
36
37
  const TabContent = () => {
37
38
  const { tabId } = useParams();
38
- const routeWidgets = useWidgetProps('org.openedx.frontend.slot.instructor.routes.v1');
39
+ const routeWidgets = useWidgetProps('org.openedx.frontend.slot.instructorDashboard.routes.v1');
39
40
  const tabRoutes = [
40
41
  ...defaultTabs.filter(defaultTab => !routeWidgets.some(slotTab => slotTab.tabId === defaultTab.tabId)),
41
42
  ...routeWidgets
@@ -45,10 +46,10 @@ const TabContent = () => {
45
46
  };
46
47
  const routes = [
47
48
  {
48
- id: 'org.openedx.frontend.route.instructor.main',
49
+ id: 'org.openedx.frontend.route.instructorDashboard.main',
49
50
  path: 'instructor-dashboard/:courseId',
50
51
  handle: {
51
- role: 'org.openedx.frontend.role.instructor'
52
+ role: instructorDashboardRole
52
53
  },
53
54
  lazy() {
54
55
  return __awaiter(this, void 0, void 0, function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useParams, Navigate } from 'react-router-dom';\nimport CohortsPage from '@src/cohorts/CohortsPage';\nimport CourseInfoPage from '@src/courseInfo/CourseInfoPage';\nimport CertificatesPage from '@src/certificates/CertificatesPage';\nimport CourseTeamPage from '@src/courseTeam/CourseTeamPage';\nimport DataDownloadsPage from '@src/dataDownloads/DataDownloadsPage';\nimport DateExtensionsPage from '@src/dateExtensions/DateExtensionsPage';\nimport EnrollmentsPage from '@src/enrollments/EnrollmentsPage';\nimport GradingPage from '@src/grading/GradingPage';\nimport OpenResponsesPage from '@src/openResponses/OpenResponsesPage';\nimport SpecialExamsPage from '@src/specialExams/SpecialExamsPage';\nimport PageNotFound from '@src/components/PageNotFound';\nimport { useWidgetProps } from './slots/SlotUtils';\n\ninterface InstructorRouteProps {\n tabId: string,\n content: React.ReactNode,\n}\n\nconst defaultTabs: InstructorRouteProps[] = [\n { tabId: 'course_info', content: <CourseInfoPage /> },\n { tabId: 'enrollments', content: <EnrollmentsPage /> },\n { tabId: 'course_team', content: <CourseTeamPage /> },\n { tabId: 'cohorts', content: <CohortsPage /> },\n { tabId: 'date_extensions', content: <DateExtensionsPage /> },\n { tabId: 'grading', content: <GradingPage /> },\n { tabId: 'data_downloads', content: <DataDownloadsPage /> },\n { tabId: 'special_exams', content: <SpecialExamsPage /> },\n { tabId: 'certificates', content: <CertificatesPage /> },\n { tabId: 'open_responses', content: <OpenResponsesPage /> },\n];\n\nconst TabContent = () => {\n const { tabId } = useParams<{ tabId: string }>();\n const routeWidgets = useWidgetProps('org.openedx.frontend.slot.instructor.routes.v1') as InstructorRouteProps[];\n\n const tabRoutes = [\n ...defaultTabs.filter(\n defaultTab => !routeWidgets.some(slotTab => slotTab.tabId === defaultTab.tabId)\n ),\n ...routeWidgets\n ];\n\n const foundTab = tabRoutes.find(tab => tab.tabId === tabId);\n\n return foundTab ? foundTab.content : <PageNotFound />;\n};\n\nconst routes = [\n {\n id: 'org.openedx.frontend.route.instructor.main',\n path: 'instructor-dashboard/:courseId',\n handle: {\n role: 'org.openedx.frontend.role.instructor'\n },\n async lazy() {\n const module = await import('./Main');\n return { Component: module.default };\n },\n children: [\n {\n index: true,\n element: <Navigate to=\"course_info\" replace />\n },\n {\n path: ':tabId',\n element: <TabContent />\n },\n ]\n }\n];\n\nexport default routes;\n"]}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useParams, Navigate } from 'react-router-dom';\nimport CohortsPage from '@src/cohorts/CohortsPage';\nimport CourseInfoPage from '@src/courseInfo/CourseInfoPage';\nimport CertificatesPage from '@src/certificates/CertificatesPage';\nimport CourseTeamPage from '@src/courseTeam/CourseTeamPage';\nimport DataDownloadsPage from '@src/dataDownloads/DataDownloadsPage';\nimport DateExtensionsPage from '@src/dateExtensions/DateExtensionsPage';\nimport EnrollmentsPage from '@src/enrollments/EnrollmentsPage';\nimport GradingPage from '@src/grading/GradingPage';\nimport OpenResponsesPage from '@src/openResponses/OpenResponsesPage';\nimport SpecialExamsPage from '@src/specialExams/SpecialExamsPage';\nimport PageNotFound from '@src/components/PageNotFound';\nimport { useWidgetProps } from './slots/SlotUtils';\nimport { instructorDashboardRole } from './constants';\n\ninterface InstructorRouteProps {\n tabId: string,\n content: React.ReactNode,\n}\n\nconst defaultTabs: InstructorRouteProps[] = [\n { tabId: 'course_info', content: <CourseInfoPage /> },\n { tabId: 'enrollments', content: <EnrollmentsPage /> },\n { tabId: 'course_team', content: <CourseTeamPage /> },\n { tabId: 'cohorts', content: <CohortsPage /> },\n { tabId: 'date_extensions', content: <DateExtensionsPage /> },\n { tabId: 'grading', content: <GradingPage /> },\n { tabId: 'data_downloads', content: <DataDownloadsPage /> },\n { tabId: 'special_exams', content: <SpecialExamsPage /> },\n { tabId: 'certificates', content: <CertificatesPage /> },\n { tabId: 'open_responses', content: <OpenResponsesPage /> },\n];\n\nconst TabContent = () => {\n const { tabId } = useParams<{ tabId: string }>();\n const routeWidgets = useWidgetProps('org.openedx.frontend.slot.instructorDashboard.routes.v1') as InstructorRouteProps[];\n\n const tabRoutes = [\n ...defaultTabs.filter(\n defaultTab => !routeWidgets.some(slotTab => slotTab.tabId === defaultTab.tabId)\n ),\n ...routeWidgets\n ];\n\n const foundTab = tabRoutes.find(tab => tab.tabId === tabId);\n\n return foundTab ? foundTab.content : <PageNotFound />;\n};\n\nconst routes = [\n {\n id: 'org.openedx.frontend.route.instructorDashboard.main',\n path: 'instructor-dashboard/:courseId',\n handle: {\n role: instructorDashboardRole\n },\n async lazy() {\n const module = await import('./Main');\n return { Component: module.default };\n },\n children: [\n {\n index: true,\n element: <Navigate to=\"course_info\" replace />\n },\n {\n path: ':tabId',\n element: <TabContent />\n },\n ]\n }\n];\n\nexport default routes;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openedx/frontend-app-instructor-dashboard",
3
- "version": "1.0.0-alpha.2",
3
+ "version": "1.0.0-alpha.3",
4
4
  "description": "The Open edX Instructor Dashboard",
5
5
  "repository": {
6
6
  "type": "git",