1540 Commits

Author SHA1 Message Date
Carla Duarte
175675da55 AA-127: Fix outline tab redirect URL (#122)
Co-authored-by: Carla Duarte <cduarte@edx.org>
2020-07-23 16:01:46 -04:00
Nick
f715fd5ed6 AA-123 welcome message (#121) 2020-07-23 12:28:56 -04:00
Carla Duarte
cdab8959ca AA-218: Course Tool Analytics (#118)
Tracking analytics for onClick events in the Course Tool widget.
Extra: Fixed intl error in the Course Dates widget.

Co-authored-by: Carla Duarte <cduarte@edx.org>
2020-07-23 10:40:52 -04:00
David Joy
be0ee18519 fix: Use reselect’s defaultMemoize instead of lodash.memoize (#120)
* fix: Use reselect’s defaultMemoize instead of lodash.memoize

Lodash memoize doesn’t examine all parameters when deciding to memoize, apparently, meaning it doesn’t re-call the function if any parameter except the first changes.

More here: https://dev.to/nioufe/you-should-not-use-lodash-for-memoization-3441

* Fixing test setup.  Improper use of sequenceMetadata factory!

Two problems:

One, we weren’t properly passing the courseId into our sequenceMetadata factories, so it was differing than the one defined in courseMetadata.  This didn’t manifest until now because we weren’t using the one from sequenceMetadata until this memoization fix!

Two, I’d updated the options for sequenceMetadata to have a “unitBlocks” option, but didn’t update all the usages of the old “unitBlock” option.  This meant it was manually creating its own unit instead of inheriting the one from courseBlocks, resulting in a different ID.
2020-07-22 10:19:53 -04:00
David Joy
c96cd87967 Change CoursewareContainer into a class component. (#115)
I find it much more legible this way.

Some thoughts… as part of refactoring it, I made some of the redux selectors more formal, and made use of reselect more thoroughly. this resulted in a reduction in re-renders from 16 to 12 on your average page load. It’s also a bit more verbose, accounting for some of the increased line count.

I hadn’t tried it before, but found the memoize method of comparing previous props/state to current props/state to be very, very nice. Much easier than manually comparing props, and much clearer to me than using react hooks’ dependency arrays.

The lack of dependency arrays feels really freeing in general to me. They’ve been such a source of hard-to-track-down bugs, and the hooks linter does not always suggest the right solution for what belongs in and out of the array.

Function names are nice. We had a ton of custom hooks in there so that we could put names to otherwise anonymous bits of functionality.

Also note: this component has a test suite. It passed without any changes. 🥳
2020-07-21 09:31:12 -04:00
Calen Pennington
854020dd67 Fix test failures due to changed snapshots, and add representative data for extra_info 2020-07-20 15:45:49 -04:00
Calen Pennington
d320c6b5bc Include assignment extraInfo on dates page 2020-07-20 14:01:02 -04:00
Carla Duarte
81c6b401fd AA-230: Dates Tab MFE styling (#111)
Co-authored-by: Carla Duarte <cduarte@edx.org>
2020-07-20 13:39:56 -04:00
Michael Terry
16bd20e0e8 AA-121: Support showing handouts in the course outline (#112)
And add translation support for the outline.
2020-07-20 09:24:26 -04:00
edX Transifex Bot
23ea255674 fix(i18n): update translations 2020-07-19 17:07:19 -04:00
edX Transifex Bot
dec5340bf3 fix(i18n): update translations 2020-07-17 15:23:15 -04:00
Patrick Cockwell
086b5d8986 TNL-7303 Add Course License details (#103) 2020-07-17 13:26:21 -04:00
David Joy
b940901400 fix: Use activeUnitIndex instead of position, and remove the latter (#110)
We were inconsistently using “position” - a 1-indexed value - in JS arrays which are 0-indexed.  We had an existing, normalized property called “activeUnitIndex” which we now use everywhere instead.  The value is modified back to 1-indexed before being returned to the server.
2020-07-16 10:14:18 -04:00
David Joy
afb4b77250 CoursewareContainer tests. (#108)
* Adding testing-library dependencies, and bumping frontend-build to be compatible with them.

* Adding a function to initialize the redux store

We need to use it in a few places.  Seems worth not-repeating, since they can easily get out of sync.  In general, tests should only test the parts of the store they care about, as well.

* Adding function to initialize a mock application.

Ultimately I’d like to move this to frontend-platform as an alternative to ‘initialize’ for tests.  ‘initialize’ is an async function which complicates matters.

* Using more explicit assertions for courseware reducer fields.

This removes the need for the snapshot file, and ensures our test is more resilient to unrelated changes in the store.

Also added a few more stages of assertions to some of the tests, showing that they have the right values over time.

* Adding a helper to build a simple course blocks response.

We can use this in the courseware data tests, and shortly in the tests for CoursewareContainer.

* Modifying sequenceMetadata factory to allow multiple units.

This will help us test sequence navigation’s behavior more fully by having multiple units in a sequence.

* A little linting and cleanup.

* Adding first round of tests for CoursewareContainer.

Tests loading, sequence navigation/unit rendering, and ‘denied’ states.

Subsequent tests will add tests for handlers.
2020-07-15 10:27:48 -04:00
Carla Duarte
bc30b20b0d AA-221: Pull in has_ended variable for dates banner logic (#107)
Co-authored-by: Carla Duarte <cduarte@edx.org>
2020-07-14 15:58:48 -04:00
Bill Currie
3e14b17271 [BD-29] [TNL-7288] Fix front-end behavior when the course has no sections or no subsections in the first section (#98)
* Do not redirect when the sequenceId is not valid

That is, if firstSequenceId is null or undefined. This prevents the url
becoming bogus but does cause the course contents display to become stuck
with the loading message.

* Detect invalid sequence when loading

If the course has no sections or the first section has no sub-sections,
then sequence will be null. Before the redirection fix, this would cause an
error, but after, the sequenceStatus never leaves the loading state. Thus,
if still loading and the sequence is null, return the no.content message.

* Check sequenceId instead of sequence

From David Joy:

During initial page load, I expect there's a period of time before the
course blocks API and the sequence metadata API come back where the
sequenceStatus is loading but the sequence is still false, meaning that
we'll see a flash of this 'no content' messaging for a moment before the
data comes in.

If we instead check whether sequenceId is null here, that may give us a
more accurate condition. The sequenceId in redux is only populated when we
begin to request a sequence (fetchSequence thunk). If we have no sequence
ID in the URL route, then fetchSequence never happens and the sequenceId in
redux stays null.

* Fix up some additional errors Piotr found

This fixes errors caused by deleting units or subsections.

* Move test for unit validity to SequenceContent
2020-07-14 15:21:33 -04:00
Kyle McCormick
c0d0895630 Do not assume HTML blocks are units (#105)
After further conversation, we decide that
we shouldn't just treat HTML blocks as units.
We've been making the assumption that Verticals
occupy the Unit-level, and we shouldn't break that
assumption for this specific case.

Reverts part of e04f588d1f.
However, the error handling changes remain.
2020-07-10 09:05:04 -04:00
Michael Terry
c2f4ba3ad0 AA-195: Don't show schedule banner if no schedule (#100)
In some cases (user schedule is close to or past the course end),
we don't actually have dates for a course, even if we would normally
have them.

When that happens, let's not show a banner saying we made a
schedule for the learner.
2020-07-09 16:10:49 -04:00
Demid
eac9bf9c92 [BD-29] [TNL-7266] Learning MFE data integration tests (#95)
* Add test for fetchCourse

* Add tests for fetchDatesTab, fetchOutlineTab, fetchSequence and resetDeadlines

* Implement fetch tabs tests

* Add fail test case for fetchSequence

* Add success test for fetchSequence

* Add test for resetDeadlines

* Update test group name

* Add empty tests for courseware and bookmarks

* Fix wrong field in saveSequencePosition thunk

* Add tests for courseware data layer

* Temporary commit

* Split tests after rebase

* Revert "Fix wrong field in saveSequencePosition thunk"

This reverts commit 4394d363c58ad929f81e587ce4da2241528494b5.

* Fix test for position

* Move executeThunk into utils

* Add test for all reducers

* Add expect statements for logs

* Remove redundant snapshot tests and add some specific checks

* Polishing

* Remove redundant checks

* Fix bug in normalizer and update test

* Upgrade @edx/frontend-platform dependency

* Utilize MockAuthService instead of manual auth package mocking

* Update tests after breaking changes in master

* Remove redundant snapshot check
2020-07-09 10:39:37 -04:00
David Joy
5332be8e65 Update README.rst 2020-07-09 10:28:57 -04:00
Kyle McCormick
e04f588d1f Treat html-type XBlocks as units (#104)
Fixes bug where courses with html-type XBlocks as children
of sequences would ignore those children instead of treating them
as units. This caused the app to later just give up and redirect
to the course home in the old experience.

Also, handle that scenario where we have sections/sequences
with children of unexpected block types more gracefully by
logging an error instead of crashing.

TNL-7305
2020-07-09 10:22:30 -04:00
daphneli-chen
fe013f57c5 AA-203: Created progress page and receiving username, email, and enrollment status (#96)
Co-authored-by: Daphne Li-Chen <dli-chen@edx.org>
2020-07-08 16:00:25 -04:00
David Joy
7df50264cf Update 0004-model-store.md (#101)
Explaining the rationale for model-store in a bit more detail.
2020-07-02 13:24:25 -04:00
David Joy
73c74119f0 Organizationing (#102)
* Moving model-store into “generic” sub-directory.

Also adding a README.md to explain what belongs in “generic”

* Moving user-messages into “generic” sub-directory.

* Moving PageLoading into “generic” sub-directory.

* Moving “tabs” module into “generic” sub-directory.

* Moving InstructorToolbar and MasqueradeWidget up to instructor-toolbar.

The masquerade widget is a sub-module of instructor-toolbar.

* Co-locating celebration APIs with celebration utils.

Also adding an ADR about thunk/API naming conventions and making some other areas of the code adhere to it.

* Moving courseware data (thunks, api) into the courseware module.

Note that cousre-home/data/api still uses normalizeBlocks - this should be fixed so it’s not reaching across.  Maybe we pull that particular API up top.

This PR includes a few TODOs for things I saw, as well as a tiny bit of whitespace cleanup.
2020-07-02 13:11:50 -04:00
Carla Duarte
a6edc9132f AA-186: Refactoring to separate Course Home logic from Courseware (#93)
- Pulled Course Home specific components into `course-home`
- Created a courseHome reducer (and all necessary data files - api, thunks, slice)
- Removed Course Home logic from Courseware's data files (api, thunks, slice, etc.)
- Renamed Outline Tab URL to end in `/home` rather than `/outline` again (per Product)

Co-authored-by: Carla Duarte <cduarte@edx.org>
2020-06-25 10:26:47 -04:00
Patrick Cockwell
8b34f8c792 TNL-7126 BD-29 Visual Updates to Learning Sequence (#88)
* BB-2569: Use faVideo instead of faFilm for video units; Set page title based on section, sequence, and course titles

* Add CourseLicense component with styling

* Reorder the pageTitleBreadCrumbs that are used for setting the page title

* Revert "Add CourseLicense component with styling"

This reverts commit 8d154998de.

* Fix package-lock.json so that only new changes for react-helmet are included
2020-06-23 16:09:12 -04:00
daphneli-chen
534b9b205f AA-122: Created Dates Widget on course home page (#82)
Including upcoming dates and a link to dates tab. Gives user ability to
look at any important upcoming dates for their course and to navigate
to upcoming assignments.

Co-authored-by: Daphne Li-Chen <daphneli-chen@MacBook-Pro.local>
2020-06-23 14:05:18 -04:00
Michael Terry
1471abe7dd dates: fix missing Today entry if it would be last entry (#94) 2020-06-23 09:39:54 -04:00
Michael Terry
d55c8b134c Don't show verified-only badge on Today (#92)
If the Today date entry on the dates tab doesn't have any items,
we were showing the Verified Only badge. This fixes that mistake.
2020-06-22 14:37:03 -04:00
Michael Terry
6c052a2661 Avoid redundant paragon sass import (#91)
Move all scss imports into the main index.scss. This will let them
all know about existing sass variables and avoid duplicate imports.
2020-06-22 11:24:15 -04:00
Michael Terry
ac47454b14 Don't show celebration modal too much (#89)
Make sure we only show it for the first unit of a sequence.
2020-06-19 14:29:13 -04:00
stvn
a18adc4112 Merge PR #71 add/masquerade
* Commits:
  Show audit content lock when masquerading
  Create masquerade widget component
2020-06-19 09:59:38 -07:00
Michael Terry
6cdd075243 AA-137: Add first-section celebration (#78)
When a learner completes their first section in a course, throw up
a modal that celebrates that fact and encourages them to share
progress.
2020-06-18 09:27:11 -04:00
David Joy
eb8c97ee86 fix: Ensure lmsWebUrl is loaded in useExamRedirect (#87)
The sequence.lmsWebUrl variable is loaded as part of the course blocks API.  The status of that API’s request is stored in courseStatus.

The useEffect hook in useExamRedirect didn’t ensure that courseStatus was equal to “loaded”.  This meant that if the sequence loaded first, it might attempt to redirect to sequence.lmsWebUrl even though that variable is still undefined.

When global.location.assign() is given `undefined` as a value, it tacks it onto the end of the URL and calls it a day.  After that, we’ve got a badly formed URL.
2020-06-17 14:07:14 -04:00
stvn
24051232af Show audit content lock when masquerading 2020-06-16 23:59:30 -07:00
stvn
dee5128448 Create masquerade widget component
on the Staff Instructor Toolbar
2020-06-16 23:59:30 -07:00
Nick
5ffc1bc599 Add logging back to the coursemetadata call (#86) 2020-06-16 14:42:18 -04:00
Nick
bf0d3b1565 AA-133 mfe dates banner fix (#85)
- mfe dates banner along with fixing previously reverted
  PR by adding back in original coursemetadata call.

This reverts commit 8df4654cf1.
2020-06-16 13:11:50 -04:00
Nick
8df4654cf1 Revert "AA-133 mfe dates banner (#79)" (#84)
This reverts commit 973f3d68aa.
2020-06-16 10:14:30 -04:00
Nick
973f3d68aa AA-133 mfe dates banner (#79)
- dates banner on dates tab
2020-06-16 09:55:04 -04:00
Carla Duarte
b51809fa50 Quick fix: Corrected Outline Tab redirect URL (#83)
Co-authored-by: Carla Duarte <cduarte@edx.org>
2020-06-15 17:54:16 -04:00
Carla Duarte
253836fa9f AA-181: Outline Tab Refactor (#80)
- Updated the Outline Tab to fetch course blocks from the Outline API.
- Changed naming conventions to more accurately portray the tab naming scheme
(ex. Outline Tab, Dates Tab, etc.)
- Removed logic from `fetchCourses` that was specific to the Outline Tab
2020-06-15 15:19:13 -04:00
David Joy
65173e9f93 fix: remove conditions for an infinite React hooks loop (#81)
The useAlert hook was being given a new payload object every time it was called, defeating any memoization happening inside.

It was also re-calling it’s useEffect hook when alertId changed, which it was changing itself. That’s a no-no.
2020-06-10 17:08:07 -04:00
David Joy
a8d01c423d Miscellaneous small refactorings (#74)
* Normalizing “courseInfo” back into “course”

Splitting it out denormalizes the data and introduces potential data inconsistencies.

* Name component JSX files with the name of the component.

* Normalizing some module exports/naming.

* Moving alerts into a sub-directory.

* DRYing up alert hook creation into reusable useAlert hook.

* Adding some comments about ‘courses’ hydration.
2020-06-02 14:15:12 -04:00
Carla Duarte
025f37cd21 AA-120: Course Tools Widget (#73)
Co-authored-by: Carla Duarte <cduarte@edx.org>
2020-06-02 13:41:23 -04:00
Michael Terry
964bde180a Further UI tweaks to the Dates tab (#76)
Allow for per-item badges if not all items in a given day match
for the badge. And some minor spacing changes.
2020-06-01 09:45:35 -04:00
Nick
209a64c29b AA-117 mfe dates tab waffle flag (#75)
- redirect back to platform dates tab if waffle flags are not
  enable for the mfe dates tab
2020-05-29 13:48:23 -04:00
Michael Terry
bdb1afe990 Finish up basic dates tab support (#70)
- Drop mock data, call real API instead
- Call course metadata API for general info, not the dates API
- Mark text as translatable
- Add badges and timeline dots, group same-day items

AA-116
2020-05-26 13:15:36 -04:00
Michael Terry
7487d8d32f Add basic dates tab (#62)
This is not the final visuals for the dates tab, but an in-progress
page to base further work on.

AA-116
2020-05-26 13:07:24 -04:00
Michael Terry
e101b41c08 Whoops, add one-liner missing from github in last commit (#72) open-release/juniper.1 open-release/juniper.3 open-release/juniper.2 2020-05-21 12:03:09 -04:00