Page | WBS | Acceptance Criteria | Comments | Status |
---|
Course Outline [CO] | | |
| Top level page (BE) | New REST endpoint to get initial data for the page using legacy functionality by URI https://cms-studio-mfe-dev.raccoongang.com/course/course-v1:2u_rerun+1+123 , def course_index - contains all necessary data to render whole page Main Serializer with methods, which use ready utils to get appropriate data (course_structure, initial_state, lms_link etc.)
| Volodymyr Bergman Status |
---|
colour | Green |
---|
title | investigated |
---|
|
see: Status Bar API (BE)
we need to investigate two endpoint when user enter to the page, and create ticket for creatingcourse/{course_id} we need to figure out if we're going to rewrite them or union with with the previous one endpoint course_index http://localhost:18010/api/courses/v1/quality/course-v1:edx+10101+1012/?exclude_graded=true&all=true http://localhost:18010/api/courses/v1/validation/course-v1:edx+10101+1012/?graded_only=true&all=true Because it give us additional variables for status bar | Delivered https://github.com/openedx/edx-platform/pull/32856 |
| Top level page (FE) | Create a new page with path /course/:course_id/outline Display Sections A,B,D from the screen
| | Delivered |
| Status Bar (FE)start date pacing type checklists
| | Current implementation sfe stands for studiofrontend
Assumptions | Delivered |
| Status Bar: Course Highlight Emails (FE) | course highlight emails depends on: course.highlights_enabled_for_messaging uses global page state data activated not activated docs link
UI: docs navigation button UI: activation button (relation: backend handler) UI: modal confirmation dialog UI component
| Assumptions | |
| Porting: Video Sharing - blocker - (legacy backport) | | | |
| Status Bar: Video Sharing (FE) - | by Video Sharing legacy backportdepends on: waffle video_config.public_video_share optional feature (can be deactivated) how initial state is fulfilled? dropdown selector for sharing mode update docs URL: help-tokens "social_sharing"
|
Official docs backend is available in edx-platform#master BE app: openedx/core/djangoapps/video_config widget template (legacy, for reference): cms/templates/js/course-video-sharing-enable.underscore
BE utils: | |
| Status Bar: Video Sharing (BE) - | by Video Sharing legacy backport | Assumptions | |
| Status Bar API (BE) | | | |
| | Course validation metrics API | upstream PR GET details Code Block |
---|
# URL
<CMS>/api/courses/v1/validation/course-v1:RG+DEV+TL0/?graded_only=true&all=true
# params
- graded_only: true
- all: true
# response
{
"is_self_paced": false,
"dates": {
"has_start_date": false,
"has_end_date": false
},
"assignments": {
"total_number": 0,
"total_visible": 0,
"assignments_with_dates_before_start": [],
"assignments_with_dates_after_end": [],
"assignments_with_ora_dates_before_start": [],
"assignments_with_ora_dates_after_end": []
},
"grades": {
"has_grading_policy": false,
"sum_of_weights": 1.0
},
"certificates": {
"is_activated": false,
"has_certificate": false,
"is_enabled": true
},
"updates": {
"has_update": false
},
"proctoring": {
"needs_proctoring_escalation_email": false,
"has_proctoring_escalation_email": false
}
} |
| |
| | Course quality metrics API | upstream PR GET details Code Block |
---|
# URL
<CMS>/api/courses/v1/quality/course-v1:RG+DEV+TL0/?exclude_graded=true&all=true
# params
- exclude_graded: true
- all: true
# response
{
"is_self_paced": false,
"sections": {
"total_number": 0,
"total_visible": 0,
"number_with_highlights": 0,
"highlights_active_for_course": false,
"highlights_enabled": true
},
"subsections": {
"total_visible": 0,
"num_with_one_block_type": 0,
"num_block_types": {
"min": null,
"max": null,
"mean": null,
"median": null,
"mode": null
}
},
"units": {
"total_visible": 0,
"num_blocks": {
"min": null,
"max": null,
"mean": null,
"median": null,
"mode": null
}
},
"videos": {
"total_number": 0,
"num_mobile_encoded": 0,
"num_with_val_id": 0,
"durations": {
"min": null,
"max": null,
"mean": null,
"median": null,
"mode": null
}
}
} |
| |
| Tool Bar: New Section (FE) | AC
Tech | POST details Code Block |
---|
# URL
<CMS>/xblock/
# payload
{
"parent_locator":"block-v1:RG+DEV+TL0+type@course+block@course",
"category":"chapter",
"display_name":"Section"
}
# response
{
courseKey: "course-v1:RG+DEV+TL0"
locator: "block-v1:RG+DEV+TL0+type@chapter+block@c11e7df2bd8449fa8c7782ef46ba77df"
} |
GET details Code Block |
---|
# URL
<CMS>/xblock/outline/block-v1:RG+DEV+TL0+type@course+block@course
# response
{
"id": "block-v1:RG+DEV+TL0+type@course+block@course",
"display_name": "Course Outline",
"category": "course",
"has_children": true,
"unit_level_discussions": false,
"edited_on": "Jul 29, 2023 at 15:51 UTC",
"published": true,
"published_on": "Jul 29, 2023 at 15:51 UTC",
"studio_url": "/course/course-v1:RG+DEV+TL0",
"released_to_students": false,
"release_date": null,
"visibility_state": null,
"has_explicit_staff_lock": false,
"start": "2030-01-01T00:00:00Z",
"graded": false,
"due_date": "",
"due": null,
"relative_weeks_due": null,
"format": null,
"course_graders": [
"Homework",
"Lab",
"Midterm Exam",
"Final Exam"
],
"has_changes": false,
"actions": {
"deletable": true,
"draggable": true,
"childAddable": true,
"duplicable": true
},
"explanatory_message": null,
"group_access": {},
"user_partitions": [
{
"id": 50,
"name": "Enrollment Track Groups",
"scheme": "enrollment_track",
"groups": [
{
"id": 1,
"name": "Audit",
"selected": false,
"deleted": false
}
]
}
],
"show_correctness": "always",
"highlights_enabled_for_messaging": false,
"highlights_enabled": true,
"highlights_preview_only": false,
"highlights_doc_url": "http://edx.readthedocs.io/projects/open-edx-building-and-running-a-course/en/open-release-olive.master/developing_course/course_sections.html#set-section-highlights-for-weekly-course-highlight-messages",
"enable_proctored_exams": false,
"create_zendesk_tickets": true,
"enable_timed_exams": true,
"child_info": {
"category": "chapter",
"display_name": "Section",
"children": [
{
"id": "block-v1:RG+DEV+TL0+type@chapter+block@c11e7df2bd8449fa8c7782ef46ba77df",
"display_name": "Section",
"category": "chapter",
"has_children": true,
"edited_on": "Jul 29, 2023 at 15:51 UTC",
"published": true,
"published_on": "Jul 29, 2023 at 15:51 UTC",
"studio_url": "/course/course-v1:RG+DEV+TL0?show=block-v1%3ARG%2BDEV%2BTL0%2Btype%40chapter%2Bblock%40c11e7df2bd8449fa8c7782ef46ba77df",
"released_to_students": false,
"release_date": null,
"visibility_state": "unscheduled",
"has_explicit_staff_lock": false,
"start": "2030-01-01T00:00:00Z",
"graded": false,
"due_date": "",
"due": null,
"relative_weeks_due": null,
"format": null,
"course_graders": [
"Homework",
"Lab",
"Midterm Exam",
"Final Exam"
],
"has_changes": false,
"actions": {
"deletable": true,
"draggable": true,
"childAddable": true,
"duplicable": true
},
"explanatory_message": null,
"group_access": {},
"user_partitions": [
{
"id": 50,
"name": "Enrollment Track Groups",
"scheme": "enrollment_track",
"groups": [
{
"id": 1,
"name": "Audit",
"selected": false,
"deleted": false
}
]
}
],
"show_correctness": "always",
"highlights": [],
"highlights_enabled": true,
"highlights_preview_only": false,
"highlights_doc_url": "http://edx.readthedocs.io/projects/open-edx-building-and-running-a-course/en/open-release-olive.master/developing_course/course_sections.html#set-section-highlights-for-weekly-course-highlight-messages",
"child_info": {
"category": "sequential",
"display_name": "Subsection",
"children": []
},
"ancestor_has_staff_lock": false,
"staff_only_message": false,
"has_partition_group_components": false,
"user_partition_info": {
"selectable_partitions": [],
"selected_partition_index": -1,
"selected_groups_label": ""
}
}
]
},
"ancestor_has_staff_lock": false,
"staff_only_message": false,
"has_partition_group_components": false,
"user_partition_info": {
"selectable_partitions": [],
"selected_partition_index": -1,
"selected_groups_label": ""
}
} |
| |
| Tool Bar: New Section (BE) | use existing API name='xblock_handler'
| | |
| Tool Bar: Reindex (FE) | uses global page state data optional feature (button renders conditionally) button is disabled while reindex depends on setting ‘reindex_link' uses legacy API endpoint implement Success Alert component (generic) use Success Alert when reindex has succeeded display error alert when reindex has failed (see legacy for text/title) Note: course re-run uses similar UI feedback component tooltip: Reindex current course
| | Delivered |
| Tool Bar: Reindex (BE) | | | Delivered |
| Tool Bar: View Live (FE) | | | Delivered |
| Generic: Processing Feedback (FE) | | | Delivered |
| Content: Empty (FE) | uses global page state data UI component: empty course placeholder
API interactions: on New Section button click tooltip: Click to add a new section
| | Delivered |
| Content: Not empty (FE) | uses global page state data UI component: full-width New Section button conditional rendering: not empty course content the button must be displayed in the end of course content API interactions: on New Section button click - another course Section is created (appears on the last position)
| Assumptions | |
| Content: Sections list (FE) | renders course content (Section cards list) actions menu items - non-functioning edit mode - out of scope content (subsections) - out of scope highlights - out of scope
uses global page state data UI component: Section card
| | Partially delivered |
| Update Section card | AC
Tech | | Delivered |
| | AC A new widget is added to a Section card; Section Highlights widget displays a number of highlights for the given Section;
The whole widget is interactive - if clicked a modal window opens; Modal’s descriptions must include corresponding documentation link (a part of the help-tokens feature) Section highlights modal allows section highlights items editing;
Tech uses global page state data widget placement: Section card status zone (see: new design) UI component: highlights widget UI component: Section highlights modal dialog elements: title description form (see new design) actions: Cancel button
Save highlights button
disabled until form is dirty and valid closes dialog updates section (API POST) displays Saving Processing Feedback
| Section highlights update: Code Block |
---|
# API details
POST <CMS>/xblock/<section-id>
## payload
{
"publish":"republish",
"metadata": {
"highlights":[
"asdfasdfasdfasdfasdfasdfasdfasdfasAPI detailsasdfasdfasdfasdfasdfasdfasdfasdfasdfasAPI detailsasdfasdfasdfasdfasdfasdfasdfasdfasdfasAPI detailsasdfasdfasdfasdfasdfasdfasdfasdfasdfasAPI detailsasdfasdfasdfasdfasdfasdfasdfasdfasdfasAPI detailsasdfasdgg"
]
}
}
## response example
{
"id": "block-v1:RG+DEV+TL0+type@chapter+block@060085dc25e34eeb958d6cb6540d4f8c",
"data": null,
"metadata": {
"display_name": "Section1",
"highlights": [
"asdfasdfasdfasdfasdfasdfasdfasdfasAPI detailsasdfasdfasdfasdfasdfasdfasdfasdfasdfasAPI detailsasdfasdfasdfasdfasdfasdfasdfasdfasdfasAPI detailsasdfasdfasdfasdfasdfasdfasdfasdfasdfasAPI detailsasdfasdfasdfasdfasdfasdfasdfasdfasdfasAPI detailsasdfasdgg"
]
}
} |
| Delivered |
| Content: Section Highlights (BE) | | | |
| Content: Section Edit (FE) | AC Section card edit modeallows Section title editing; Section card enters edit mode: on its options menu Edit item click
on card Edit (pencil icon) button click Edit button becomes disabled
Section card exits edit mode:
Tech | Design Section editing save: Code Block |
---|
# API details
POST <CMS>/xblock/<chapter-block-id>
## payload
{
metadata: {
display_name: <new-value>
}
}
## response example
{
"id": "block-v1:RG+DEV+TL0+type@chapter+block@060085dc25e34eeb958d6cb6540d4f8c",
"data": null,
"metadata": {
"display_name": <saved-value>
}
} |
| Delivered |
| Content: Section Edit (BE) | | | |
| Content: Section Publish (FE) | AC
Tech | Section publishing: Code Block |
---|
# API details
POST <CMS>/xblock/<section-id>
## payload
{
"publish":"make_public"
}
## response example
{
"id": "block-v1:RG+DEV+TL0+type@chapter+block@060085dc25e34eeb958d6cb6540d4f8c",
"data": null,
"metadata": {
"display_name": "Section1",
"highlights": [
...
]
}
} |
| Delivered |
| Content: Section Publish (BE) | | | |
| Content: Section Configure (FE) | AC Section settings can be updated Settings are configured via Section Settings modal dialog Configurations available:
Tech | Section configuration: Code Block |
---|
# API details
POST <CMS>/xblock/<section-id>
## payload
{
"publish":"republish",
"metadata":{
"visible_to_staff_only":true,
"start":"2031-01-01T00:00:00.000Z"
}
}
## response example
{
"id": "block-v1:RG+DEV+TL0+type@chapter+block@060085dc25e34eeb958d6cb6540d4f8c",
"data": null,
"metadata": {
"display_name": "Section1",
"visible_to_staff_only": true,
"start": "2031-01-01T00:00:00Z",
"highlights": [
...
]
}
} |
| |
| Content: Section Configure (BE) | | | |
| Content: Section Duplicate (FE) | AC
Tech | Section duplication: Code Block |
---|
# API details
POST <CMS>/xblock/
## payload
{
"duplicate_source_locator":<section-block-id>,
"parent_locator":<course-block-id>
}
## response example
{
"locator": <new-section-block-id>,
"courseKey": "course-v1:RG+DEV+TL0"
} |
| Delivered |
| Duplicated Section scroll effect - | | | |
| Content: Section Duplicate (BE) | | | |
| Content: Section Delete (FE) | AC Section can be deleted (removed) Section deletion action happens via confirmation modal dialog Once deleted Section disappears from sections list
Tech | Section deletion: Code Block |
---|
# API details
DELETE <CMS>/xblock/<section-id>
## response HTTP code
204 |
| Delivered |
| Content: Section Delete (BE) | | | |
| Content: Section Move (FE) - | How exactly moving action should work? as it works in legacy (drag&drop section card; no action in menu) new approach (e.g. on click in options menu Move button section card enters moving mode and can be moved by arrow keys + or entering a number key it is moved to that numeric position…) via Slackhybrid (always draggable + moving mode for keyboard actions)
| Only drag-n-drop is available. | |
| Content: Subsections list (FE) | AC Section card renders its children subsections in the content zone Subsections are expanded after initial page loading Nothing is rendered if there are no subsection in section
Tech renders section content (Subsection cards list) uses global page state data UI component: Subsection card
| Subsection card hover cursors Pointer Move Subsection card elements | |
| Content: New Subsection (FE) | AC Section’s content zone provides New subsection full-width button which allows new subsection creation Newly created subsection appears in the corresponding Section card’s content zone on the last position
Tech New subsection button is always displayed in section’s content
the button must be displayed in the end of the section content UI component: full-width New Subsection button on New subsection button click: new section’s Subsection is created (appears on the last position)
| UI:
Section editing save: Code Block |
---|
# API details
POST <CMS>/xblock/
## payload
{
"parent_locator":<chapter-block-id>,
"category":"sequential",
"display_name":"Subsection"
}
## response example
{
"locator": <new-sequential-block-id>,
"courseKey": "course-v1:RG+DEV+TL0"
} |
| |
| Content: New Subsection (BE) | | | |
| Content: Subsection Edit (FE) | AC Subsection card edit modeallows Subsection title editing; Subsection card enters edit mode: on its options menu Edit item click
on card Edit (create icon) button click Edit button becomes disabled
Subsection card exits edit mode:
Tech |
Subsection editing save: Code Block |
---|
# API details
POST <CMS>/xblock/<sequential-block-id>
## payload
{
metadata: {
display_name: <new-value>
}
}
## response example
{
"id": <sequential-block-id>,
"data": null,
"metadata": {
"display_name": <saved-value>
}
} |
| |
| Content: Subsection Edit (BE) | | | |
| Content: Subsection Publish (FE) | AC
Tech | Subsection publishing: Code Block |
---|
# API details
POST <CMS>/xblock/<sequential-block-id>
## payload
{
"publish":"make_public"
}
## response example
{
"id": <sequential-block-id>,
"data": null,
"metadata": {
"display_name": "Subsection1",
"highlights": [
...
]
}
} |
| |
| Content: Subsection Edit (BE) | | | |
| Content: Subsection Configure (FE) | AC Subsection settings can be updated Settings are configured via Section Settings modal dialog Configurations available: Subsection release date Subsection release time (UTC) Subsection grading Subsection due date Subsection due time (UTC) Subsection Visibility Subsection Assessment Results Visibility
Tech | Section configuration: Code Block |
---|
# API details
POST <CMS>/xblock/<sequential-block-id>
## payload example
{
"graderType":"notgraded",
"metadata":{
"due":null,
"visible_to_staff_only":null,
"hide_after_due":true,
"show_correctness":"never",
"is_practice_exam":false,
"is_time_limited":false,
"exam_review_rules":"",
"is_proctored_enabled":false,
"default_time_limit_minutes":0,
"is_onboarding_exam":false
},
"publish":"republish"
}
## response example
{
"id": "block-v1:RG+DEV+TL0+type@sequential+block@6c953a45b291461a8648a1157ca6bdb8",
"data": null,
"metadata": {
"display_name": "Subsection Name",
"show_correctness": "never",
"default_time_limit_minutes": 0,
"exam_review_rules": "",
"hide_after_due": true,
"is_onboarding_exam": false,
"is_practice_exam": false,
"is_proctored_enabled": false,
"is_time_limited": false
},
"graderType": "notgraded"
} |
| |
| Content: Subsection Configure (FE) | Status |
---|
colour | Yellow |
---|
title | depends on previous |
---|
|
Advanced tab:
| | |
| Content: Subsection Configure (BE) | | | |
| Tool Bar: Collapse All Sections (FE) | AC
Tech does not track each section state updates (single direction effect) button shouldn’t be displayed on empty outline button has 2 states: behaviour: repeats legacy completely
| | |
| Content: Subsection Duplicate (FE) | AC
Tech | Subsection duplication: Code Block |
---|
# API details
POST <CMS>/xblock/
## payload
{
"duplicate_source_locator":<subsection-block-id>,
"parent_locator":<section-block-id>
}
## response example
{
"locator": <new-subsection-block-id>,
"courseKey": "course-v1:RG+DEV+TL0"
} |
| |
| Content: Subsection Duplicate (BE) | | | |
| Content: Subsection Delete (FE) | AC Subsection can be deleted (removed) Subsection deletion action happens via confirmation modal dialog Once deleted Subsection disappears from subsections list
Tech | Subsection deletion: Code Block |
---|
# API details
DELETE <CMS>/xblock/<subsection-id>
## response HTTP code
204 |
| |
| Content: Subsection Delete (BE) | | | |
| Content: Subsection Move (FE) - via Slack | How exactly moving action should work? as it works in legacy (drag&drop subsection card; no action in menu) new approach (e.g. on click in options menu Move button section card enters moving mode and can be moved by arrow keys hybrid (always draggable + moving mode for keyboard actions)
| Only drag-n-drop is available. | |
| Content: Subsection Units list (FE) | AC Subsection card renders its children units in the content zone Units are not collapsible Units are draggable (out of scope) Units are editable (out of scope) Nothing is rendered if there are no units in subsection
Tech | Unit card hover cursors Subsection card elements Unit card zones (legacy)
header status
| |
| Content: New Unit (FE) | AC
Tech New unit button is always displayed in subsection’s content
the button must be displayed in the end of the subsection content UI component: full-width New unit button on New unit button click:
| UI: Section editing save: Code Block |
---|
# API details
POST <CMS>/xblock/
## payload
{
"parent_locator":<sequential-block-id>,
"category":"vertical",
"display_name":<unit-title>
} |
| |
| Content: New Unit (BE) | | | |
| Content: Unit Edit (FE) | AC Unit card edit modeallows Unit title editing; Unit card enters edit mode: on its options menu Edit item click
on card Edit (pencil icon) button click Edit button becomes disabled
Unit card exits edit mode:
Tech editable Unit elements on save event:
| Design Unit editing save: Code Block |
---|
# API details
POST <CMS>/xblock/<vertical-block-id>
## payload
{
metadata: {
display_name: <new-value>
}
}
## response example
{
"id": <vertical-block-id>,
"data": null,
"metadata": {
"display_name": <saved-value>
}
} |
| |
| Content: Unit Edit (BE) | | | |
| Content: Unit Publish (FE) | AC
Tech | Unit publishing: Code Block |
---|
# API details
POST <CMS>/xblock/<unit-id>
## payload
{
"publish":"make_public"
}
## response example
{
"id": "block-v1:RG+DEV+TL0+type@chapter+block@060085dc25e34eeb958d6cb6540d4f8c",
"data": null,
"metadata": {
"display_name": <unit-title>,
"highlights": [
...
]
}
} |
| |
| Content: Unit Publish (BE) | | | |
| Content: Unit Configure (FE) - | AC Unit settings can be updated Settings are configured via Unit Settings modal dialog Configurations available:
Tech | Unit configuration: Code Block |
---|
# API details
POST <CMS>/xblock/<vertical-block-id>
## payload
{
"publish":"republish",
"metadata":{
"visible_to_staff_only":true
}
}
## response example
{
"id": <vertical-block-id>,
"data": null,
"metadata": {
"display_name": <unit-title>,
"visible_to_staff_only": true
}
} |
| |
| Content: Unit Configure (BE) | | | |
| Content: Unit Duplicate (FE) | AC
Tech | Unit duplication: Code Block |
---|
# API details
POST <CMS>/xblock/
## payload
{
"duplicate_source_locator":<vertical-block-id>,
"parent_locator":<sequential-block-id>
}
## response example
{
"locator": <new-vertical-block-id>,
"courseKey": "course-v1:RG+DEV+TL0"
} |
| |
| Content: Unit Duplicate (BE) | | | |
| Content: Unit Delete (FE) | AC Unit can be deleted (removed) Unit deletion action happens via confirmation modal dialog Once deleted Unit disappears from units list
Tech | Unit deletion: Code Block |
---|
# API details
DELETE <CMS>/xblock/<vertical-block-id>
## response HTTP code
204 |
| |
| Content: Unit Delete (BE) | | | |
| Content: Unit Move (FE) - | | Only drag-n-drop is available. | |
| Content: Entrance Exam (FE) - | | | |