Commit Graph

106 Commits

Author SHA1 Message Date
Kyle McCormick
08e11b6f27 Fix logout URL 2020-04-09 12:32:43 -04:00
Kyle McCormick
a6522f5983 Prefix a bunch of routes with /learning 2020-04-09 12:32:32 -04:00
Kyle McCormick
a21be5d83c Update .env.development for devstack 2020-04-08 16:43:46 -04:00
Kyle McCormick
521483b836 Temporary: Prefix React routes with /learning 2020-04-08 15:53:44 -04:00
Kyle McCormick
6a5e906cbe Switch to kdmccormick/devstack-frontends branch of frontend-build
Required doing some reformatting in InsturctorToolbar.jsx
to make the linter happy.

Also, add dev-build command.
2020-04-07 12:01:13 -04:00
Kyle McCormick
9b76cc4d97 Make React routes relative 2020-04-07 11:32:44 -04:00
David Joy
a10e6c2826 Switching the MFE to use the new permissions fields (#43)
- “userHasAccess” becomes “canLoadCourseware”, and is loaded from “can_load_courseware”
- “isStaff” is now loaded from “is_staff” instead of “user_has_staff_access”
2020-04-06 15:32:50 -04:00
David Joy
b4fbd1cf83 fix: “current.” was left over from when the implementation used refs (#42) 2020-04-02 15:58:58 -04:00
Adam Butterworth
37610ab181 Improve access control behavior (#39)
Fixes TNL-7175: Redirect to course home if a user is not unenrolled and the course is private.

- Require authentication to use the app while course blocks api requires it
- Gracefully handle course blocks api request failures allowing app to proceed to it redirection logic

Notable changes:

- selectors related to sequences are more resilient to missing models. In the case the course blocks api returns successfully but empty (in this case of enrolled but course not yet started).
- `fetchCourse` thunk handles failures for fetchCourseMeta and fetchCourseBlocks separately using `Promise.allSettled` instead of `Promise.all`
- `denied` is a new `courseStatus`
- Access denied redirect is done using a component at a new route `redirect/course-home/:courseId`

Now handles cases

- User is unauthenticated > redirect to login
- User is authenticated but not enrolled > redirects to lms course home
- When an enrolled user attempts to access courseware before the course start date they will load the sequence (but unable to load the vertical block). This behavior should be fixed in an update to edx-platform
2020-04-02 15:12:07 -04:00
David Joy
70428228a5 fix: Fix UserMessagesProvider state references (#38)
See details in code, but this causes UserMessagesProvider to always use the most “recent” version of its messages and nextId state when its callbacks are called.
2020-04-01 16:07:58 -04:00
David Joy
1dc069dbbf Adding a separate StaffEnrollmentAlert (#41)
This is a separate component because we have no mechanism for passing context/state into these alerts right now, and I’m not sure it’s worth building.  Easier to just use different codes for different situations.
2020-04-01 15:59:05 -04:00
David Joy
9b72380dea Bumping paragon and fixing an i18n build issue (#40) 2020-04-01 15:42:10 -04:00
David Joy
d59875c45d Only redirect if the user has no access and isn’t staff (#37)
TNL-7129

This adds a third clause to our useAccessDeniedRedirect hook, which makes sure the user doesn’t have staff access (instead of normal, enrolled access) prior to redirecting.

As an aside, this redirection approach - irrespective of this PR - is not great.  The UI mostly renders prior to this redirect happening.  It would be better of this hook returned something that would help prevent the UI from rendering while the redirect is in progress.  As it stands, a redirected user will see a flash of the page content prior to being booted.  Not wonderful.
2020-04-01 10:18:54 -04:00
David Joy
834b922aff Create 0005-components-own-their-loading-state.md 2020-04-01 10:13:59 -04:00
Dave St.Germain
a1776f4366 Added calculator component (#33)
TNL-7138
2020-03-30 11:59:31 -04:00
Adam Butterworth
f8ff2e7860 Add sequence-container (#36) 2020-03-25 15:26:51 -04:00
David Joy
a923f3d8e7 fix: use history.push to preserve history for user navigation (#35)
We continue to use history.replace for building the MFE URL, which we don’t want saved in history.
2020-03-24 11:09:45 -04:00
David Joy
8f4ff79351 Rename courseUsageKey to courseId 2020-03-23 17:26:33 -04:00
David Joy
c8be4c401f Allow loading with no unit, and of sequences with no unitIds. (#34)
This requires some defensive programming here and there to let things load in a minimal state.
2020-03-23 16:40:50 -04:00
David Joy
781508dd03 fix: Sometimes a course won’t have units.
If a sequence has no unitIds, bail on changing the URL.
2020-03-23 14:15:25 -04:00
David Joy
57ca2948eb fix: unit object not always ready when course loaded
If we don’t yet have the course blocks API loaded when the course metadata finishes, `unit` will be undefined still, and `unit.id` will fail.
2020-03-23 11:59:34 -04:00
David Joy
9cbb765f8a Extensive refactor of application data management. (#32)
* Extensive refactor of application data management.

- “course-blocks” and “course-meta” are replaced with “courseware” module.  This obscures the difference between the two from the application itself.
- a generic “model-store” module is used to store all course, section, sequence, and unit data in a normalized way, agnostic to the metadata vs. blocks APIs.
- SequenceContainer has been removed, and it’s work is just done in CourseContainer instead.
- UI components are - in general - more responsible for deciding their own behavior during data loading.  If they want to show a spinner or nothing, it’s up to their discretion.
- The API layer is responsible for normalizing data into a form the app will want to use, prior to putting it into the model store.

* Organizing into some more sub-modules.

- Bookmarks becomes it’s own module.
- SequenceNavigation becomes another one.

* More modularization of data directories.

- Moving model-store up to the top.
- Moving fetchCourse and fetchSequence up to the top-level data directory, since they’re used by both courseware and outline.
- Moving getBlockCompletion and updateSequencePosition into the courseware/data directory, since they pertain to that page.

* Normalizing on using the word “title”

* Using history.replace instead of history.push

This fixes TNL-7125

* Allowing sub-components to use hooks and redux

This reduces the amount of data we need to pass around, and lets us move some complexity to more natural modules.

* Fixing bug where enrollment alert is shown for undefined isEnrolled

The enrollment alert would inadvertently be shown if a user navigated from the outline to the course.  This was because it interpreted an undefined “isEnrolled” flag as false.  Instead, we should wait for the isEnrolled flag to be explicitly true or false.

* Organizing modules.

- Renaming “outline” to “course-home”.
- Moving sequence and sequence-navigation modules under the course module.

* Some final application organization and ADR write-ups.

* Final refactoring

- Favoring passing data by ID and looking it up in the store with useModel.
- Moving headers into course-header directory.

* Updating ADRs.  Splitting model-store information out into its own ADR.
2020-03-23 11:31:09 -04:00
Adam Butterworth
720594a7cf Update index.scss
Fix media query
2020-03-16 14:29:23 -04:00
Adam Butterworth
94d11bc7c2 fix header on desktop (#31) 2020-03-16 14:21:28 -04:00
Adam Butterworth
fb83d881f6 Make header mobile responsive (#30)
TNL-7072
2020-03-13 16:46:35 -04:00
Adam Butterworth
da4711581a Responsive instructor toolbar and progressive disclosure (#29)
TNL-7072
2020-03-13 14:55:48 -04:00
Adam Butterworth
a4c978a303 Mobile responsive sequence navigation (#28)
[TNL-7072] When a sequence navigation would overflow, convert it to a dropdown.
2020-03-13 12:57:08 -04:00
Adam Butterworth
24ca1aa730 Improve sequence padding and containers on mobile (#27)
TNL-7072.
- Refactors some of the css container/content class naming
- Moved UnitNavigation out of the Sequence and into its own component.
- Fixes an issue with course tabs where multi-word titles would wrap text.
2020-03-11 11:43:17 -04:00
Adam Butterworth
a0839f0a63 Mobile layout for breadcrumbs and tabs (#26)
TNL-7072 mobile layout updates. Breadcrumbs truncate section and subsection titles with ellipsis. Tabs that would overflow are tucked under a "more" dropdown.
2020-03-11 09:37:54 -04:00
David Joy
d145c45a3b feat: Only showing instructor toolbar for course staff. (#25) 2020-03-10 09:33:36 -04:00
Adam Butterworth
fcddc2d639 Log api request errors to New Relic and display load error (#24)
TNL-7114 Logs any failed api request to New Relic. Show error in CourseContainer instead of a spinner when a course fails to load.
2020-03-09 12:43:02 -04:00
David Joy
6082ade9e0 Disabling next/previous buttons at course beginning and end (#23)
At the end, the “next” button at the bottom of the page is replaced with a friendly message.

This PR also alphabetizes some props for SequenceNavigation and Sequence, as I was adding two new ones - isFirst and isLast.
2020-03-06 16:38:47 -05:00
stvn
8358a2589e Merge PR #15 analytics/sequence-events
* Commits:
  Add logging events for sequence navigation
2020-03-06 16:16:47 -05:00
David Joy
6ba8929c97 Initial version of Course Home page (#20)
* refactor: Moving PageLoading up to the top

This way it can be used on both the courseware and outline pages.

* Adding index.js files to data directories, and PropTypes data shapes

- The course-blocks and course-meta data directories now have index files so their exports can be imported from that, rather than reaching into specific files in the directories.
- Also added “shapes” for use in React Components that use PropTypes for the course blocks data structure, and the course metadata data structure.

* Simplifying/refactoring CourseContainer rendering a bit.

* Adding course outline page.

This page is not complete.

- It contains the ‘outline’ itself with links to the Sequences in the course.
- It contains a very basic stab at displaying dates - they’re not even formatted.
- It shows logistration and enrollment alerts for anonymous and unenrolled users.

It does not include any other content in the right-hand sidebar.  It also doesn’t include a welcome message, or perhaps any number of other features on the page.  This is effectively an initial implementation for discovering how much data we’re missing from our APIs.  It should not be used as-is by any means.
2020-03-06 13:21:18 -05:00
stvn
39a0e50745 Add logging events for sequence navigation
to mirror existing behavior in `edx-platform` [2][3][4].

This adds support for the following events:
- `edx.ui.lms.sequence.next_selected`
- `edx.ui.lms.sequence.previous_selected`
- `edx.ui.lms.sequence.tab_selected`

** Outstanding Events
- `edx.ui.lms.outline.*`
- `edx.ui.lms.link_clicked`

** References
- [1] https://openedx.atlassian.net/browse/TNL-7066
- [2] https://edx.readthedocs.io/projects/devdata/en/latest/internal_data_formats/tracking_logs/student_event_types.html#course-navigation-events
- [3] https://github.com/edx/edx-platform/blob/master/common/lib/xmodule/xmodule/js/src/sequence/display.js#L315-321
- [4] https://github.com/edx/edx-platform/blob/master/common/lib/xmodule/xmodule/js/src/sequence/display.js#L373-378
2020-03-06 13:00:16 -05:00
Adam Butterworth
5a3597ac4b Remove edX from preview message 2020-03-06 12:18:46 -05:00
Adam Butterworth
ca15a0af7f Add preview message for instructors (#21)
TNL-7106
2020-03-06 12:10:50 -05:00
Adam Butterworth
8347a66375 Update minor style and visual loading (#19) 2020-03-06 09:20:34 -05:00
Adam Butterworth
31dd6b81b8 Minor style update (#18)
Basic design changes described in TNL-7105
2020-03-05 14:36:13 -05:00
David Joy
1ca797f6e8 fix: removing unused/duplicate functions from course-meta/api.js
The two functions removed here are duplicated (and actually used from) course-blocks/api.js.  Think it was just a refactoring oversight from a few weeks ago.
2020-03-05 10:52:33 -05:00
David Joy
f3e559ad9d Adding a TODO about removing the course links route. 2020-03-05 10:40:09 -05:00
David Joy
c3d0ac1417 Custom alerts for anonymous and unenrolled users. (#17)
* build: bumping version of frontend-platform

We’re going to need to use the new getLoginRedirectUrl helper.

* Adding custom alerts for anonymous and unenrolled users.

- Anonymous users are prompted to sign in or register.
- Unenrolled users are prompted to enroll.

The alerts themselves are lazy-loaded as necessary, like the ContentLock component.

This PR also adds `customAlerts` to the AlertList, allowing an application to specify custom components to be shown as Alerts for a given alert code.

* refactor: Renaming enrollmentIsActive to isEnrolled

As per review feedback that the former wasn’t clear.
2020-03-05 10:23:47 -05:00
Adam Butterworth
bda738c9d1 Add next and previous buttons below unit (#16) 2020-03-04 15:20:11 -05:00
Dave St.Germain
7824f58777 Added a verified upgrade component (#14)
* Added a verified upgrade component

* Internationalize course sock
2020-03-04 13:06:09 -05:00
David Joy
4c09d49532 Adding userHasAccess to redux so we can use it in our components. 2020-02-28 13:54:35 -05:00
David Joy
2f90b78814 If the user does not have access to the course, then redirect to the course outline. (#13)
* If the user does not have access to the course, then redirect to the course outline.

In a subsequent PR, if this API call is made on the course outline page in the MFE, we’ll need to be able to prevent the redirect.  But that view of the MFE doesn’t exist yet.

* Moving course outline redirect logic into CourseContainer.

This way, depending on the page calling fetchCourseMetadata, we can make an intelligent choice about whether we want to redirect, show a message, etc.  By redirecting in the API call handler, then we took that choice away from ourselves.
2020-02-28 12:25:03 -05:00
Adam Butterworth
ba6764de43 feat: add link to unit in existing experience (#12)
* feat: add instructor toolbar with link to lms

* fix: right align user account menu dropdown
2020-02-14 13:05:25 -05:00
Adam Butterworth
46cd511e15 feat: add bookmarking for units (#11)
* feat: add bookmarking for units

* refactor: add redux for state management
2020-02-14 09:10:43 -07:00
David Joy
ab3d3e8834 fix: updating URL when unit changes. 2020-02-04 15:00:21 -05:00
David Joy
ec7166ad5d fix: lint both js and jsx files.
Updating jsx to pass linter, too.
2020-02-04 14:58:19 -05:00