-
Epic
-
Resolution: Unresolved
-
Major
-
None
-
4.2, 4.3, 4.4, 4.5
-
MOODLE_402_STABLE, MOODLE_403_STABLE, MOODLE_404_STABLE, MOODLE_405_STABLE
-
Course hierarchy
-
Difficult
-
Large
Indentation functionality was removed in Moodle 4.0 for reasons including: poor accessibility, poor mobile experience, and potential content formatting issues. Members of the community have expressed frustration with the removal of indentation functionality and is asking for it to be restored, citing that indentation is critical to organizing and structuring their courses.
Based on the discovery phase outcomes, the key requirement identified was the need of having a proper course structure functionality that allows content creators to add subsections within sections and the ability to create nested content to build a better course hierarchy.
The technical discussion with the team highlighted the complexity of this solution and the impossibility of including this project to the 4.2 release, so the internal stakeholders agreed on proposing a short-term temporary solution to cover the users needs around this issue while working on the long-term solution.
Initial discovery documentation
······························
Course hierarchy · Figma designs
······························
Technical proposal
After evaluating different options (link to the options summary document), the technical approach decided is:
- Incorporate single-section pages in all formats. From now on, section pages will be considered course subpages, which means they will have breadcrumb, won't display the fixed general section, and won't have the tertiary navigation tabs.
- Clean-up section methods to stop using section number as a section identifier. Most old methods will be replaced by new APIs using section id or sectioninfo to identify sections.
- Create a new section type called "delegated". Currently, sections can be regular or orphan, but the course format manages both. As the name suggests, in a "delegated" section, all section management, capabilities and display can be delegated to a plugin. By all means, the section will belong to a plugin and will use an integration class to control the section behaviour.
- Create a new activity called "mod_subsection" that uses delegate sections to present a section inside the activity card. This activity will resemble a "text and media" display but show the subsection content. This plugin will implement the delegate class to control the subsection and implement all the reactive course editor integration.
- Integrate delegate sections into the course index, course reports, backup/restore/import interfaces.
Implementations phases
Phase 1:
- Introduce the course section page. The goal is to allow course format to present a single section as it is a part of the course, with all the navigation elements similar to an activity.
MDL-79986improve the current course section page. This will adapt the visual elements to resemble the prototype and introduce section direct links.MDL-80248In the course/section.php, display the General section instead of displaying all the course sectionsMDL-80249In the course/section.php, hide secondary navigation and add breadcrumbMDL-80250Create a new section_viewed event to be triggered from the couse/section.phpMDL-80251Create a behat step to go to a sectionMDL-80418Homogenize Adding / Updating activity titles, regardless the section where it belongs
MDL-79987: improve the course layout in one section per page visualization
- Clean-up the current section methods to prepare the implementation of delegate sections in next phases. Those issues include stop using section numbers to identify sections and replace old methods by new ones using section ids or sectioninfo objects.
MDL-77038deprecate stateactions:section_move method. The course editor should only use section_move_after.MDL-79999: Refactor course_modinfo so sections are indexed primarily by Id, and secondary by number. Currently it is the other way around and it is impossible to store sections with the same section number value (including null).MDL-80000: decide the place for the new section and activities API. The clean-up issue will deprecate many global functions from course/lib.php. This file uses a very old structure, and all new methods should be replaced by classes. This task will determine the location of those new APIs. Once done, the new API classes must be created.MDL-80001: find all the places were section number is misused as a valid section id. Once done, all methods with this problem should be replaced or refactored.- (this will be more than one issue) Create section id (or sectioninfo) alternatives to the methods identified in the previous task. The new methods should be part of the new section or activity APIs determined in Task01. Also, deprecate the previous methods.
MDL-80048: a task to create a mod_subsection plugin skeleton. This stub plugin will be used in the testing instructions in Phase 2 and will be the base of the final mod_subsection in Phase 3.
Phase 2:
- Implement delegated sections. Some new delegate fields will be added to the section table in this phase. Those fields will be cached in course_modinfo. This phase will only introduce integrations to decide if the section is rendered in the course or not. Future phases will add more integrations. To integrate the issues, most testing instructions will provide adhocs "text and media" modifications so it can be used as a delegate plugin.
MDL-80186: add delegate section fields to the course_section table and make course_modinfo cache them. The field will be null by default and have the name of the delegated plugin when delegated. The delegate ID will be a number the delegate plugin must set to identify the instance. This will introduce new sectioninfo methods like is_delegated, get_delegate and get_delegateid.MDL-80187: implement course section API methods to create and destroy delegated sections from a plugin.MDL-80190: Create the first delegated section integrations to hide a section on the course page. This issue will create the core_course\section_delegate abstract class that plugins must extend to control their delegated sections.MDL-80715: syn delegated sections names with the delegate plugin
MDL-80553: fix delegate sections PHPUnit tests.- MDL-80799: fix create section zero but with the new section actions API.
MDL-80203: allow delegate plugins to override the section dropdown actions.- ¿?: disable extra format actions in delegate sections. Delegate sections do not belong to the format and, for now, they won't be able to add extra actions to the menus. There may be a way in the future, but specific format actions like highlighting won't be available for now.
MDL-80193: TASK: decide the privacy of mod_subsection and implement all the necessary class
- Update section and activity cards to match the prototype
- Sections and subsections will be created as "New section", and renumerations won't be automatic anymore
- Others:
MDL-80557: Change the default order for the course formats
Phase 3: last integrations before incorporating mod_subsection into core.
- Integrate delegated sections into the general navigation
MDL-81648: allow the delegate plugin (mod_subsection) to add new breadcrumb nodes when presenting content from a delegated section. This includes the section page but also any inner activity page.MDL-81674: TASK evaluate the best way to deal with capabilities or permissions in a delegate section.MDL-82377implement the best way to deal with user access in subsections' activities.
- Activity chooser modifications
- Fix section page action menu
MDL-81681: Make section page action menu reactive.
- Course editing
- Integrate delegate sections (now only from mod_subsection) into the course index.
MDL-81725: Add a section delegate integration the course index can use to present an activity as a subsection. The idea is that the full node will be collapsible with all inner contents below. This will include the course editor integrations to allow dragging activities in and out of the subsection.
- Backup and restore
MDL-80191: improve the activity restore steps so a plugin with delegated sections can set the delegate ID value during the restore process. Sections are restored before the activity plugins; this means the section restoration process cannot update the delegate ID and the delegate plugin should do it manually.
- Final issue of the phase: incorporate mod_subsection
MDL-81765: add mod_subsection to core. The activity will only display a link to the section page and can be created as any other activity
C -> Phase 4:
- Integrate mod_subsection into the course content so they are displayed more like a section.
MDL-81766: Add methods in the mod_subsection library to display the section content as collapsible inside the activity card. This issue will include integrating the reactive course editor so activities can be dragged inside/outside a subsection.- MDL-81768: add the "expand / collapse all sections" on the section page. This was not necessary until subsections appeared.
MDL-81767: Add buttons to create mod_subsection instances with one click directly from the course page, like the prototype. Once this is done, this issue will also hide the mod_subsection from the activity chooser. This issue will include adding a new feature to mod plugins so they can be created with default valuesMDL-82033: task to evaluate what happens when mod_subsection is disabled.MDL-82541: fix courses with subsection if mod_subsection is disabled.
MDL-82490: fix classic theme section dropdown
- New mod_subsection integrations:
-
MDL-81769: allow mod_subsection to override the activity actions dropdown (and probably replace it with a section actions dropdown). This issue may disappear if the UX team describe what happens with delegated sections depending on the current activity settings (for example, the visible stealth value)- MDL-81770: create a behat "mod_subsection > activities" step to generate activities inside a subsection.
MDL-82324: allow drop activities into the section pageMDL-82437: delegate the section edit form data to mod_subsection.
- Improve Backup and restore:
- Consistency between module and delegated section:
-
MDL-82355UX: Define subsections availability behaviorMDL-82510: Add new action menu for subsectionsMDL-82496: UX: Add 'Delete' option to subsection page
MDL-82260: Modules access restrictions should be consistent with its delegated sections' access restrictionsMDL-82617: remove completion form mod_subsection
- Some UX improvements:
Phase 5:
- Adapt existing UIs to display delegated sections below the delegate activity (mod_subsection)
MDL-81799: UX task to evaluate how to represent the new course hierarchy in the course reportsMDL-82199: UX: Display sections in user Outline report and Complete reportMDL-82495: Display sections in user Outline report and Complete report
MDL-83008: subsection completion should not be editable in bulk completion edit- MDL-83009: bulk activity completion edit should display subsections like the course page
- Implement any necessary webservice required to display mod_subsection in the mobile APP.
- Implement all changes to adapt the course content download to subsections.
- MDL-81773: Incorporate activity contents to the mod_subsection download content.
- Adapt activity chooser to delegate sections without section number
- MDL-80295: Modify the activity chooser to use section ID instead of section number
- Adapt drag and drop files into course page to work with delegate sections
- MDL-80296: Modify the course file drop to use sectionID instead of section number
- Mitigate the collapsed sections preference limit problem:
- MDL-80714 (task): evaluate n alternative preferences storing for subsection.
- Deprecate all redundant course/lib.php methods
- Removing section management from course/view.php:
- MDL-81965: task to evaluate the feasibility of stop displaying a single section in course/view.php.
- Hiding mod_subsection from places where it should not exists:
- Backup and restore
- Deprecations and cleanups:
- Make mod_subsection enabled in Moodle 5.0, or so.
- MDL-82034: make mod_subsection enabled by default.
- has a non-specific relationship to
-
MDL-74995 Ability to create further formal hierarchy in a course
- Closed
-
MDL-79916 Simplify the course format options by removing Social format
- Open
-
MDL-79918 Simplify the course settings by removing the setting Hidden sections
- Open
- has a QA test
-
MDLQA-18917 CLONE - Exploratory testing for course page visual improvements
- Passed
-
MDLQA-18438 Exploratory testing for course page visual improvements
- On Hold
- has been marked as being related by
-
MDL-74846 Move Right/Move Left are gone in Moodle 4 and should be restored
- Closed
- has to be done before
-
MOBILE-4389 Improve how course navigation works for users after re-accesing a course
- Testing in progress
- is parent of
-
MDL-73879 Clarify the use of lock icon next to section names for teachers
- Reopened
-
IDEA-4 Improve ability to define a hierarchy in a Course
- Cancelled
- will be (partly) resolved by
-
MDL-76988 Course hierarchy (Short-term solution)
- Closed
-
MDL-76892 Course hierarchy design (Long-term solution)
- Closed