WBS for Course Content Outline and Course Unit pages
Low-level WBS for Course Content Outline and Course Unit pages
High-level analysis of the page Course Content Outline
From legacy to MFE + API (w/o functional changes).
Following the example we’ll use frontend-driven-development here.
- 1 Low-level WBS for Course Content Outline and Course Unit pages
- 2 High-level analysis of the page Course Content Outline
- 2.1 Steps
- 2.2 STEP 1: Feature Set
- 2.2.1 Page decomposition
- 2.2.1.1 Page route
- 2.2.1.2 Page layout
- 2.2.2 Functions
- 2.2.3 Features implementation description
- 2.2.1 Page decomposition
- 2.3 STEP 2: Configuration
- 2.4 STEP 3: MFE extension
- 2.5 STEP 4: API Contract
- 2.6 STEP 5: API (Backend for Frontend)
- 2.7 STEP 6: Documentation
Steps
Understand (list) the feature set.
extract features - split legacy UI to functional pieces
discover optional implicit functions
Define additional configuration
waffle course flag(s) for feature(s) - rollout period
Extend MFE
feature/sub-features placement (codebase hierarchy, naming, etc.)
routing (we want to stick to legacy paths as close as possible - to keep user experience not affected: bookmarks, etc.)
state management (shape, UI, data, etc.)
data required (shape, potential API endpoints, etc.) - API contract
main UI building blocks (basic presentational components)
unit tests
Compose final API contract
endpoints list with shaped data set
Implement API (BFF)
create backend DRF wrappers around legacy utils to satisfy requested API contract
unit tests
Internatioanalization (I18N)
Update documentation
MFE README
CMS (Platform) documentation
STEP 1: Feature Set
Legacy context:
Feature context:
course
Navigation:
CMS > Content > Outline
Page path:
<STUDIO-HOST>/course/course-v1:edX+DemoX+Demo_Course
Page decomposition
Page route
Dedicated route is already present.
Page layout
top bar (full width)
heading (left)
tool bar - page actions (right)
action-button1
… …
action-buttonN
content (full width)
main section (left)
status bar
attributes
attr1
… …
attrN
highlights
outline
empty course
section1
…
… …
sectionN
aside section (right)
info-item1
… …
info-itemN
Functions
Additional functions:
Heading (A)
Tool Bar (B)
New section creation (“New Section” button) - duplicated action (see:
2.a.i.1
)Course reindex initiation (“Reindex“ button)
Expand/collapse all sections (corresponding wording button)
Learning MFE initial unit link (“View Live“ button)
Status Bar (C)
Course Schedule link (“Start Date“ clickable value)
Pacing Type (passive course type)
Checklists (out of scope?)
Course Highlight Emails
Activation “Enable Now“ button
External documentation link (“Learn more“ link) - configurable?
Side Bar (D)
“Creating your course organisation” static section
“Reorganising your course” static section
External documentation link (“Learn more about the course outline“ button) - configurable?
“Setting release dates and grading policies” static section
External documentation link (“Learn more about grading policy settings”) - configurable?
“Changing the content learners see” static section
External documentation link (“Learn more about content visibility settings“) - configurable?
Feedback Messages
“Sav“
Course structure manipulation:
Outline (E)
List sections
Empty course (initial state)
New Section - creation
Sections list
Loader
Section actions (red)
New Section - creation (j)
Delete Section - removal (f)
Duplicate Section - cloning (e)
Configure Section - configuration (d)
Reorder Section - movement (g)
Expand/Collapse Section - appearance (a)
Rename Section - edit (b, c)
Section Highlights - description (i)
Publish Section (h)
Subsection actions (yellow)
New Subsection - creation (h)
Delete Subsection - removal (f)
Duplicate Subsection - cloning (e)
Configure Subsection - configuration (d)
Reorder Subsection - movement (g)
Expand/Collapse Subsection - appearance (a)
Rename Subsection - edit (b, c)
Publish Subsection (h)
Unit actions (green)
New Unit - creation (h)
Delete Unit - removal (e)
Duplicate Unit - cloning (d)
Configure Unit - configuration (c)
Reorder Unit - movement (f)
Rename Unit - edit (a, b)
Publish Unit (g)
Feedback (F)
“Saving…“ | “Adding…“ | … (during any action processing)
“Error“ (API errors, etc.)
Page alerts (example:
Course has been successfully reindexed.
)…
Implicit functions
…
Features implementation description
Feature | Responsibility | State | Data | Presentational components |
---|---|---|---|---|
OUTLINE (top page level) |
| State: // "courseOutline" state slice
// courseOutlineReducer "subroot" reducer
... Actions: Selectors: | Template context (legacy) - cms/djangoapps/contentstore/views/course.py#course_handler
cms/djangoapps/contentstore/views/course.py#course_index
---
{
'language_code': request.LANGUAGE_CODE,
'context_course': course_module,
'lms_link': lms_link,
'sections': sections,
'course_structure': course_structure,
'initial_state': course_outline_initial_state(locator_to_show, course_structure) if locator_to_show else None,
'rerun_notification_id': current_action.id if current_action else None,
'course_release_date': course_release_date,
'settings_url': settings_url,
'reindex_link': reindex_link,
'deprecated_blocks_info': deprecated_blocks_info,
'notification_dismiss_url': reverse_course_url(
'course_notifications_handler',
current_action.course_key,
kwargs={
'action_state_id': current_action.id,
},
) if current_action else None,
'frontend_app_publisher_url': frontend_app_publisher_url,
'mfe_proctored_exam_settings_url': get_proctored_exam_settings_url(course_module.id),
'advance_settings_url': reverse_course_url('advanced_settings_handler', course_module.id),
'proctoring_errors': proctoring_errors,
} New API Is there any global non-feature-specific data? |
|
course-details |
| Shape: {
"start_date": <course-start-date>,
"pacing_type": <course-pacing-type>,
} Actions: |
|
|
course-checklists | out-of-scope? | Shape: Actions: |
|
|
course-highlights |
See OeX documentation. | Shape: Actions: Selectors: TBD | Enable “Course Highlight Emails“ (legacy) Fetch block outline data (legacy) New API |
|
section-create |
| Shape: Actions:
Selectors: TBD | Create new block (legacy) Fetch course outline data (legacy) New API
|
|
course-index |
| Shape: Actions: | Recreate course search index (legacy) New API |
|
learning-link (in progress) |
| Shape: Actions: | Template context (legacy) New API |
|
TOOLBAR |
| Shape: Actions: Selectors: | Template context (legacy) - New API Is there any global non-feature-specific data?
|
|
STATUSBAR |
| Shape: Actions: | Template context (legacy)
Fetch course attributes reuse course data (selectors) |
|
ASIDE |
| Shape: Actions: |
|
|
FEEDBACK |
| Shape: Actions: | No API data. |
|
CONTENT |
| Shape: Actions: Selectors: | Template context (legacy) - What is the initial data set? Fetch Quality data (legacy) ? - see what is it about Fetch Validation data (legacy) ? - see what is it about New API ? |
|
collapse-all-toggle |
| Shape: Actions: | No API data. Possibly, tracking events. |
|
empty-outline |
| Shape: Actions: | No API data. |
|
section-list |
| Shape: Actions: | Template context (legacy) - New API |
|
section-mode (expand/collapse) |
| Shape: Actions: | No API data. Possibly, tracking events. |
|
section-edit |
| Shape: Actions: | Delete section API (legacy) Side effects:
New API |
|
section-settings |
| Shape: Actions: | Initial state API (legacy) Template context? Section settings saving API (legacy) Side effects:
New API |
|
section-clone |
| Shape: Actions: | Duplicate section API (legacy) Side effects:
New API |
|
section-delete |
| Shape: Actions:
| Delete section API (legacy) Side effects:
New API |
|
section-move |
| Shape: Actions: | Reorder section API (legacy) Side effects:
New API |
|
section-publish (in progress) |
|
|
|
|
section |
| Shape: Actions: | No API data. Is managed by the parent feature. API actions are managed by other features. |
|
subsection-list subsection-create subsection-mode subsection-edit subsection-settings subsection-clone subsection-delete subsection-move subsection-publish subsection unit-list unit-create unit-edit unit-settings unit-clone unit-delete unit-move unit-publish ?.. |
|
|
|
|
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
|
STEP 2: Configuration
There is already prepared feature flag exists:
process.env.ENABLE_NEW_COURSE_OUTLINE_PAGE
type:
boolean
default:
true