@openedx/frontend-app-gradebook 2.0.0-alpha.2 → 2.0.0-alpha.4
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/components/GradebookHeader/index.js +12 -4
- package/dist/components/GradebookHeader/index.js.map +1 -1
- package/dist/components/GradesView/GradesView.scss +0 -3
- package/dist/components/WithSidebar/WithSidebar.scss +4 -3
- package/dist/containers/GradebookPage/index.js +3 -2
- package/dist/containers/GradebookPage/index.js.map +1 -1
- package/dist/data/services/lms/urls.js +9 -7
- package/dist/data/services/lms/urls.js.map +1 -1
- package/dist/routes.d.ts +3 -1
- package/dist/routes.js +16 -4
- package/dist/routes.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,14 +1,22 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Link } from 'react-router-dom';
|
|
3
|
+
import { getUrlByRouteRole, useIntl } from '@openedx/frontend-base';
|
|
3
4
|
import { Button } from '@openedx/paragon';
|
|
4
5
|
import { instructorDashboardUrl } from '../../data/services/lms/urls';
|
|
5
6
|
import useGradebookHeaderData from './hooks';
|
|
6
7
|
import messages from './messages';
|
|
8
|
+
const instructorDashboardRole = 'org.openedx.frontend.role.instructorDashboard';
|
|
7
9
|
export const GradebookHeader = () => {
|
|
10
|
+
var _a;
|
|
8
11
|
const { formatMessage } = useIntl();
|
|
9
12
|
const { areGradesFrozen, canUserViewGradebook, courseId, handleToggleViewClick, showBulkManagement, toggleViewMessage, } = useGradebookHeaderData();
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
// Prefer the instructor dashboard route if the running site provides one,
|
|
14
|
+
// so navigation stays within the SPA; otherwise fall back to a full page
|
|
15
|
+
// load of the legacy LMS dashboard.
|
|
16
|
+
const dashboardRoute = (_a = getUrlByRouteRole(instructorDashboardRole)) === null || _a === void 0 ? void 0 : _a.replace(':courseId', courseId);
|
|
17
|
+
const isInternalRoute = !!dashboardRoute && !/^[a-z][a-z0-9+.-]*:/i.test(dashboardRoute);
|
|
18
|
+
const backLinkContent = (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", children: '<< ' }), formatMessage(messages.backToDashboard)] }));
|
|
19
|
+
return (_jsxs("div", { className: "gradebook-header", children: [isInternalRoute ? (_jsx(Link, { to: dashboardRoute, className: "mb-3", children: backLinkContent })) : (_jsx("a", { href: dashboardRoute !== null && dashboardRoute !== void 0 ? dashboardRoute : instructorDashboardUrl(), className: "mb-3", children: backLinkContent })), _jsx("h1", { children: formatMessage(messages.gradebook) }), _jsxs("div", { className: "subtitle-row d-flex justify-content-between align-items-center", children: [_jsx("h2", { className: "text-break", children: courseId }), showBulkManagement && (_jsx(Button, { variant: "tertiary", onClick: handleToggleViewClick, children: formatMessage(toggleViewMessage) }))] }), areGradesFrozen && (_jsx("div", { className: "alert alert-warning", role: "alert", children: formatMessage(messages.frozenWarning) })), (canUserViewGradebook === false) && (_jsx("div", { className: "alert alert-warning", role: "alert", children: formatMessage(messages.unauthorizedWarning) }))] }));
|
|
12
20
|
};
|
|
13
21
|
export default GradebookHeader;
|
|
14
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/GradebookHeader/index.jsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/GradebookHeader/index.jsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,sBAAsB,MAAM,SAAS,CAAC;AAC7C,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,uBAAuB,GAAG,+CAA+C,CAAC;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;;IAClC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EACJ,eAAe,EACf,oBAAoB,EACpB,QAAQ,EACR,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GAClB,GAAG,sBAAsB,EAAE,CAAC;IAC7B,0EAA0E;IAC1E,yEAAyE;IACzE,oCAAoC;IACpC,MAAM,cAAc,GAAG,MAAA,iBAAiB,CAAC,uBAAuB,CAAC,0CAAE,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAClG,MAAM,eAAe,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzF,MAAM,eAAe,GAAG,CACtB,8BACE,8BAAkB,MAAM,YAAE,KAAK,GAAQ,EACtC,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,IACvC,CACJ,CAAC;IACF,OAAO,CACL,eAAK,SAAS,EAAC,kBAAkB,aAC9B,eAAe,CAAC,CAAC,CAAC,CACjB,KAAC,IAAI,IAAC,EAAE,EAAE,cAAc,EAAE,SAAS,EAAC,MAAM,YAAE,eAAe,GAAQ,CACpE,CAAC,CAAC,CAAC,CACF,YAAG,IAAI,EAAE,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,sBAAsB,EAAE,EAAE,SAAS,EAAC,MAAM,YAAE,eAAe,GAAK,CAC5F,EACD,uBAAK,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAM,EAC5C,eAAK,SAAS,EAAC,gEAAgE,aAC7E,aAAI,SAAS,EAAC,YAAY,YAAE,QAAQ,GAAM,EACzC,kBAAkB,IAAI,CACrB,KAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAE,qBAAqB,YACtD,aAAa,CAAC,iBAAiB,CAAC,GAC1B,CACV,IACG,EACL,eAAe,IAAI,CAClB,cAAK,SAAS,EAAC,qBAAqB,EAAC,IAAI,EAAC,OAAO,YAC9C,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,GAClC,CACP,EACA,CAAC,oBAAoB,KAAK,KAAK,CAAC,IAAI,CACnC,cAAK,SAAS,EAAC,qBAAqB,EAAC,IAAI,EAAC,OAAO,YAC9C,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GACxC,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC","sourcesContent":["import { Link } from 'react-router-dom';\n\nimport { getUrlByRouteRole, useIntl } from '@openedx/frontend-base';\nimport { Button } from '@openedx/paragon';\n\nimport { instructorDashboardUrl } from '@src/data/services/lms/urls';\nimport useGradebookHeaderData from './hooks';\nimport messages from './messages';\n\nconst instructorDashboardRole = 'org.openedx.frontend.role.instructorDashboard';\n\nexport const GradebookHeader = () => {\n const { formatMessage } = useIntl();\n const {\n areGradesFrozen,\n canUserViewGradebook,\n courseId,\n handleToggleViewClick,\n showBulkManagement,\n toggleViewMessage,\n } = useGradebookHeaderData();\n // Prefer the instructor dashboard route if the running site provides one,\n // so navigation stays within the SPA; otherwise fall back to a full page\n // load of the legacy LMS dashboard.\n const dashboardRoute = getUrlByRouteRole(instructorDashboardRole)?.replace(':courseId', courseId);\n const isInternalRoute = !!dashboardRoute && !/^[a-z][a-z0-9+.-]*:/i.test(dashboardRoute);\n const backLinkContent = (\n <>\n <span aria-hidden=\"true\">{'<< '}</span>\n {formatMessage(messages.backToDashboard)}\n </>\n );\n return (\n <div className=\"gradebook-header\">\n {isInternalRoute ? (\n <Link to={dashboardRoute} className=\"mb-3\">{backLinkContent}</Link>\n ) : (\n <a href={dashboardRoute ?? instructorDashboardUrl()} className=\"mb-3\">{backLinkContent}</a>\n )}\n <h1>{formatMessage(messages.gradebook)}</h1>\n <div className=\"subtitle-row d-flex justify-content-between align-items-center\">\n <h2 className=\"text-break\">{courseId}</h2>\n {showBulkManagement && (\n <Button variant=\"tertiary\" onClick={handleToggleViewClick}>\n {formatMessage(toggleViewMessage)}\n </Button>\n )}\n </div>\n {areGradesFrozen && (\n <div className=\"alert alert-warning\" role=\"alert\">\n {formatMessage(messages.frozenWarning)}\n </div>\n )}\n {(canUserViewGradebook === false) && (\n <div className=\"alert alert-warning\" role=\"alert\">\n {formatMessage(messages.unauthorizedWarning)}\n </div>\n )}\n </div>\n );\n};\n\nexport default GradebookHeader;\n"]}
|
|
@@ -4,12 +4,13 @@ $sidebar-width: 350px;
|
|
|
4
4
|
overflow-x: auto;
|
|
5
5
|
transition: margin 300ms cubic-bezier(0.4,0,0.2,1);
|
|
6
6
|
margin-left: 0;
|
|
7
|
+
// Fill the container; min-width lets the flex item shrink so
|
|
8
|
+
// overflow-x can kick in instead of widening the page.
|
|
9
|
+
flex-grow: 1;
|
|
10
|
+
min-width: 0;
|
|
7
11
|
.sidebar.open + & {
|
|
8
12
|
margin-left: $sidebar-width;
|
|
9
13
|
}
|
|
10
|
-
&.opening {
|
|
11
|
-
width: calc(100vw - #{$sidebar-width});
|
|
12
|
-
}
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
.sidebar-header {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import queryString from 'query-string';
|
|
3
3
|
import { useNavigate, useLocation } from 'react-router-dom';
|
|
4
|
+
import { Container } from '@openedx/paragon';
|
|
4
5
|
import { useGradebookUi } from '../../data/gradebookUiContext';
|
|
5
6
|
import { views } from '../../data/constants/app';
|
|
6
7
|
import WithSidebar from '../../components/WithSidebar';
|
|
@@ -32,7 +33,7 @@ export const GradebookPage = () => {
|
|
|
32
33
|
});
|
|
33
34
|
navigate({ pathname, search: `?${queryString.stringify(parsed)}` });
|
|
34
35
|
};
|
|
35
|
-
return (_jsxs(
|
|
36
|
+
return (_jsxs(Container, { size: "xl", fluid: true, children: [_jsx(GradebookDataLoader, {}), _jsx(WithSidebar, { sidebar: _jsx(GradebookFilters, { updateQueryParams: updateQueryParams }), children: _jsxs("div", { className: "gradebook-content", children: [_jsx(GradebookHeader, {}), (activeView === views.bulkManagementHistory
|
|
36
37
|
? _jsx(BulkManagementHistoryView, {})
|
|
37
38
|
: _jsx(GradesView, { updateQueryParams: updateQueryParams }))] }) })] }));
|
|
38
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/GradebookPage/index.jsx"],"names":[],"mappings":";AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,OAAO,WAAW,MAAM,6BAA6B,CAAC;AACtD,OAAO,eAAe,MAAM,iCAAiC,CAAC;AAC9D,OAAO,UAAU,MAAM,4BAA4B,CAAC;AACpD,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAChE,OAAO,yBAAyB,MAAM,2CAA2C,CAAC;AAElF,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE;IAChC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC;IAExC,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,EAAE;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;QAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/containers/GradebookPage/index.jsx"],"names":[],"mappings":";AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,OAAO,WAAW,MAAM,6BAA6B,CAAC;AACtD,OAAO,eAAe,MAAM,iCAAiC,CAAC;AAC9D,OAAO,UAAU,MAAM,4BAA4B,CAAC;AACpD,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAChE,OAAO,yBAAyB,MAAM,2CAA2C,CAAC;AAElF,OAAO,mBAAmB,MAAM,uBAAuB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE;IAChC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC;IAExC,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,EAAE;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;QAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,SAAS,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,mBACxB,KAAC,mBAAmB,KAAG,EACvB,KAAC,WAAW,IACV,OAAO,EAAE,KAAC,gBAAgB,IAAC,iBAAiB,EAAE,iBAAiB,GAAI,YAEnE,eAAK,SAAS,EAAC,mBAAmB,aAChC,KAAC,eAAe,KAAG,EAClB,CAAC,UAAU,KAAK,KAAK,CAAC,qBAAqB;4BAC1C,CAAC,CAAC,KAAC,yBAAyB,KAAG;4BAC/B,CAAC,CAAC,KAAC,UAAU,IAAC,iBAAiB,EAAE,iBAAiB,GAAI,CACvD,IACG,GACM,IACJ,CACb,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import queryString from 'query-string';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nimport { Container } from '@openedx/paragon';\n\nimport { useGradebookUi } from '@src/data/gradebookUiContext';\nimport { views } from '@src/data/constants/app';\n\nimport WithSidebar from '@src/components/WithSidebar';\nimport GradebookHeader from '@src/components/GradebookHeader';\nimport GradesView from '@src/components/GradesView';\nimport GradebookFilters from '@src/components/GradebookFilters';\nimport BulkManagementHistoryView from '@src/components/BulkManagementHistoryView';\n\nimport GradebookDataLoader from './GradebookDataLoader';\n\n/**\n * <GradebookPage />\n * Top-level view for the Gradebook MFE.\n * Organizes a header and a pair of views (Grades and BulkManagement) with a toggle-able\n * filter sidebar.\n */\nexport const GradebookPage = () => {\n const navigate = useNavigate();\n const location = useLocation();\n const { activeView } = useGradebookUi();\n\n const updateQueryParams = (queryParams) => {\n const { pathname } = location;\n const parsed = queryString.parse(location.search);\n Object.keys(queryParams).forEach((key) => {\n if (queryParams[key]) {\n parsed[key] = queryParams[key];\n } else {\n delete parsed[key];\n }\n });\n navigate({ pathname, search: `?${queryString.stringify(parsed)}` });\n };\n\n return (\n <Container size=\"xl\" fluid>\n <GradebookDataLoader />\n <WithSidebar\n sidebar={<GradebookFilters updateQueryParams={updateQueryParams} />}\n >\n <div className=\"gradebook-content\">\n <GradebookHeader />\n {(activeView === views.bulkManagementHistory\n ? <BulkManagementHistoryView />\n : <GradesView updateQueryParams={updateQueryParams} />\n )}\n </div>\n </WithSidebar>\n </Container>\n );\n};\n\nexport default GradebookPage;"]}
|
|
@@ -2,19 +2,21 @@ import { StrictDict } from '../../../utils';
|
|
|
2
2
|
import { historyRecordLimit } from './constants';
|
|
3
3
|
import { filterQuery, stringifyUrl } from './utils';
|
|
4
4
|
import { getSiteConfig } from '@openedx/frontend-base';
|
|
5
|
-
|
|
5
|
+
// Evaluated at call time: with client-side navigation, this module can be
|
|
6
|
+
// imported before the URL reflects the gradebook route.
|
|
7
|
+
const getCourseId = () => window.location.pathname.split('/').filter(Boolean).pop() || '';
|
|
6
8
|
export const getUrlPrefix = () => `${getSiteConfig().lmsBaseUrl}/api/`;
|
|
7
|
-
export const getBulkGradesUrl = () => `${getUrlPrefix()}bulk_grades/course/${
|
|
9
|
+
export const getBulkGradesUrl = () => `${getUrlPrefix()}bulk_grades/course/${getCourseId()}/`;
|
|
8
10
|
export const getEnrollmentUrl = () => `${getUrlPrefix()}enrollment/v2/`;
|
|
9
11
|
export const getGradesUrl = () => `${getUrlPrefix()}grades/v1/`;
|
|
10
|
-
export const getGradebookUrl = () => `${getGradesUrl()}gradebook/${
|
|
12
|
+
export const getGradebookUrl = () => `${getGradesUrl()}gradebook/${getCourseId()}/`;
|
|
11
13
|
export const getBulkUpdateUrl = () => `${getGradebookUrl()}bulk-update`;
|
|
12
14
|
export const getInterventionUrl = () => `${getBulkGradesUrl()}intervention/`;
|
|
13
|
-
export const getCohortsUrl = () => `${getUrlPrefix()}cohorts/v1/courses/${
|
|
14
|
-
export const getTracksUrl = () => `${getEnrollmentUrl()}course/${
|
|
15
|
+
export const getCohortsUrl = () => `${getUrlPrefix()}cohorts/v1/courses/${getCourseId()}/cohorts/`;
|
|
16
|
+
export const getTracksUrl = () => `${getEnrollmentUrl()}course/${getCourseId()}?include_expired=1`;
|
|
15
17
|
export const getBulkHistoryUrl = () => `${getBulkUpdateUrl()}history/`;
|
|
16
18
|
export const getAssignmentTypesUrl = () => stringifyUrl(`${getGradebookUrl()}grading-info`, { graded_only: true });
|
|
17
|
-
export const getRolesUrl = () => stringifyUrl(`${getEnrollmentUrl()}roles/`, { courseId });
|
|
19
|
+
export const getRolesUrl = () => stringifyUrl(`${getEnrollmentUrl()}roles/`, { courseId: getCourseId() });
|
|
18
20
|
/**
|
|
19
21
|
* bulkGradesUrlByCourseAndRow(courseId, rowId)
|
|
20
22
|
* returns the bulkGrades url with the given rowId.
|
|
@@ -25,7 +27,7 @@ export const bulkGradesUrlByRow = (rowId) => stringifyUrl(getBulkGradesUrl(), {
|
|
|
25
27
|
export const gradeCsvUrl = (options = {}) => stringifyUrl(getBulkGradesUrl(), filterQuery(options));
|
|
26
28
|
export const interventionExportCsvUrl = (options = {}) => (stringifyUrl(getInterventionUrl(), filterQuery(options)));
|
|
27
29
|
export const sectionOverrideHistoryUrl = (subsectionId, userId) => stringifyUrl(`${getGradesUrl()}subsection/${subsectionId}/`, { user_id: userId, history_record_limit: historyRecordLimit });
|
|
28
|
-
export const instructorDashboardUrl = () => (`${getSiteConfig().lmsBaseUrl}/courses/${
|
|
30
|
+
export const instructorDashboardUrl = () => (`${getSiteConfig().lmsBaseUrl}/courses/${getCourseId()}/instructor`);
|
|
29
31
|
export default StrictDict({
|
|
30
32
|
getUrlPrefix,
|
|
31
33
|
getBulkGradesUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../../src/data/services/lms/urls.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,
|
|
1
|
+
{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../../src/data/services/lms/urls.js"],"names":[],"mappings":"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","sourcesContent":["import { StrictDict } from '@src/utils';\nimport { historyRecordLimit } from './constants';\nimport { filterQuery, stringifyUrl } from './utils';\nimport { getSiteConfig } from '@openedx/frontend-base';\n\n// Evaluated at call time: with client-side navigation, this module can be\n// imported before the URL reflects the gradebook route.\nconst getCourseId = () => window.location.pathname.split('/').filter(Boolean).pop() || '';\n\nexport const getUrlPrefix = () => `${getSiteConfig().lmsBaseUrl}/api/`;\nexport const getBulkGradesUrl = () => `${getUrlPrefix()}bulk_grades/course/${getCourseId()}/`;\nexport const getEnrollmentUrl = () => `${getUrlPrefix()}enrollment/v2/`;\nexport const getGradesUrl = () => `${getUrlPrefix()}grades/v1/`;\nexport const getGradebookUrl = () => `${getGradesUrl()}gradebook/${getCourseId()}/`;\nexport const getBulkUpdateUrl = () => `${getGradebookUrl()}bulk-update`;\nexport const getInterventionUrl = () => `${getBulkGradesUrl()}intervention/`;\nexport const getCohortsUrl = () => `${getUrlPrefix()}cohorts/v1/courses/${getCourseId()}/cohorts/`;\nexport const getTracksUrl = () => `${getEnrollmentUrl()}course/${getCourseId()}?include_expired=1`;\nexport const getBulkHistoryUrl = () => `${getBulkUpdateUrl()}history/`;\nexport const getAssignmentTypesUrl = () => stringifyUrl(`${getGradebookUrl()}grading-info`, { graded_only: true });\nexport const getRolesUrl = () => stringifyUrl(`${getEnrollmentUrl()}roles/`, { courseId: getCourseId() });\n/**\n * bulkGradesUrlByCourseAndRow(courseId, rowId)\n * returns the bulkGrades url with the given rowId.\n * @param {string} rowId - row/error identifier\n * @return {string} - bulk grades fetch url\n */\nexport const bulkGradesUrlByRow = (rowId) => stringifyUrl(getBulkGradesUrl(), { error_id: rowId });\n\nexport const gradeCsvUrl = (options = {}) => stringifyUrl(getBulkGradesUrl(), filterQuery(options));\n\nexport const interventionExportCsvUrl = (options = {}) => (\n stringifyUrl(getInterventionUrl(), filterQuery(options))\n);\n\nexport const sectionOverrideHistoryUrl = (subsectionId, userId) => stringifyUrl(\n `${getGradesUrl()}subsection/${subsectionId}/`,\n { user_id: userId, history_record_limit: historyRecordLimit },\n);\n\nexport const instructorDashboardUrl = () => (\n `${getSiteConfig().lmsBaseUrl}/courses/${getCourseId()}/instructor`\n);\n\nexport default StrictDict({\n getUrlPrefix,\n getBulkGradesUrl,\n getEnrollmentUrl,\n getGradesUrl,\n getGradebookUrl,\n getBulkUpdateUrl,\n getInterventionUrl,\n getCohortsUrl,\n getTracksUrl,\n getBulkHistoryUrl,\n getAssignmentTypesUrl,\n getRolesUrl,\n bulkGradesUrlByRow,\n gradeCsvUrl,\n interventionExportCsvUrl,\n sectionOverrideHistoryUrl,\n});\n"]}
|
package/dist/routes.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ declare const routes: {
|
|
|
3
3
|
id: string;
|
|
4
4
|
path: string;
|
|
5
5
|
loader: typeof authenticatedLoader;
|
|
6
|
-
|
|
6
|
+
lazy(): Promise<{
|
|
7
|
+
Component: () => import("react").JSX.Element;
|
|
8
|
+
}>;
|
|
7
9
|
handle: {
|
|
8
10
|
roles: string[];
|
|
9
11
|
};
|
package/dist/routes.js
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
2
10
|
import { authenticatedLoader } from '@openedx/frontend-base';
|
|
3
|
-
const Main = lazy(() => import('./Main'));
|
|
4
11
|
const routes = [
|
|
5
12
|
{
|
|
6
13
|
id: 'org.openedx.frontend.route.gradebook.main',
|
|
7
|
-
path: '/:courseId',
|
|
14
|
+
path: '/gradebook/:courseId',
|
|
8
15
|
loader: authenticatedLoader,
|
|
9
|
-
|
|
16
|
+
lazy() {
|
|
17
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18
|
+
const { default: Main } = yield import('./Main');
|
|
19
|
+
return { Component: Main };
|
|
20
|
+
});
|
|
21
|
+
},
|
|
10
22
|
handle: {
|
|
11
23
|
roles: ['org.openedx.frontend.role.gradebook'],
|
|
12
24
|
},
|
package/dist/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.tsx"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,MAAM,GAAG;IACb;QACE,EAAE,EAAE,2CAA2C;QAC/C,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,mBAAmB;QACrB,IAAI;;gBACR,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC7B,CAAC;SAAA;QACD,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,qCAAqC,CAAC;SAC/C;KACF;CACF,CAAC;AAEF,eAAe,MAAM,CAAC","sourcesContent":["import { authenticatedLoader } from '@openedx/frontend-base';\n\nconst routes = [\n {\n id: 'org.openedx.frontend.route.gradebook.main',\n path: '/gradebook/:courseId',\n loader: authenticatedLoader,\n async lazy() {\n const { default: Main } = await import('./Main');\n return { Component: Main };\n },\n handle: {\n roles: ['org.openedx.frontend.role.gradebook'],\n },\n },\n];\n\nexport default routes;\n"]}
|
package/package.json
CHANGED