Portfolio
Grupo IOE / UNADE · 2026

Category-based course dashboard for Moodle

Moodle block with hierarchy and progress

A Moodle block that replaces the flat "My courses" list with a navigable dashboard across three category levels, featuring course cards, color-coded progress, and a contextual Start/Continue/Completed button.

My role Full design and implementation

  • Moodle
  • PHP 8
  • core_completion API
  • File Storage API
  • Mustache
  • Bootstrap
  • AMD / JavaScript
  • localStorage
Category-based course dashboard for Moodle
621
PHP lines
3
Hierarchy levels
2
Mustache templates
3
CTA button states

Screenshots

Problem

Moodle's native "My courses" listing shows every enrolment in a flat grid, with no structure. For UNADE, whose broad catalogue is organised into training areas and sub-areas, that list became unmanageable: learners couldn't tell which programme a course belonged to, nor see at a glance which ones they had started, finished, or not yet begun. They needed a panel that mirrored the real virtual-category hierarchy already managed by the local_ioe plugin and gave immediate context on progress.

Solution

I designed and built block_ioe_multicategory, a block that rebuilds the dashboard on top of local_ioe's virtual categories. The data layer (391 lines in main.php) reads the category and enrolment tables, deduplicates results, and assembles a hierarchy of up to three levels rendered as tabs, pills, and sub-pills through two Mustache templates. Each card computes real progress via the core_completion API, resolves the course image with a two-method fallback over the File Storage API, and shows a color-coded bar (red, yellow, green) plus a contextual Start / Continue / Completed button. An AMD module persists the active tab in localStorage. The block respects "Login as" and separates admin from learner views.

Result

UNADE now has a course dashboard that replaces the flat list with hierarchical navigation faithful to its training structure, with visible progress and a clear call to action on every course. The block ships at STABLE maturity (release 1.0.0), is bilingual ES/EN, and couples to its sibling local_ioe plugin through its virtual-categories flag, reusing the existing taxonomy without duplicating configuration.