Browse Course Catalog › Course Catalog
🎬 Simulate: Alt success · AF-1A Reset

Find the Right Course for You

πŸ›οΈ
Your institute does not have any courses yet

Contact your institute administrator or browse all available courses across the platform.

View All Courses
πŸ“ Spec notes β€” UC-LMS.06 / SCR-LMS.01 (fields, actions, requirements)
Identity
  • Screen: SCR-LMS.01 β€” Course Catalog
  • Use case: UC-LMS.06 β€” Browse Course Catalog
Brief description

Displays published Courses and Specializations based on login state. Users can search by keyword, filter by tags (multi-select AND logic), and sort results. Results paginated at 20 per page. Each card shows: title, cover image, institute name, tags, difficulty, Free/Paid badge, and Enrolled badge (logged-in only).

Visibility rules (UC-LMS.06 updated 2026-06-25)
  • Guest (not logged in): sees all published Courses and Specializations from every institute, including shared ones
  • Logged-in user: sees only Courses and Specializations from their own institute, plus shared ones (cross-institute shared); courses from other institutes are hidden
Fields
  • search_query "Search Courses" β€” text Β· max_length:200 Β· Search and filter bar Β· default: "" (param ?q=)
  • sort_order "Sort By" β€” enum [newest, popular, alphabetical_asc] Β· required Β· default: newest (param ?sort=)
  • selected_tags "Category (Tag)" β€” enum multi-select Β· Tag.id Β· default: [] (param ?tags=)
  • result_count_label "Result Count" β€” text Β· computed Β· read-only
  • institute_name "Institute" β€” text Β· Catalog grid Β· data_ref: Institute.name Β· read-only (displayed on each card)
  • tags_on_card "Tags" β€” enum Β· Catalog grid Β· computed (CourseTag + InstituteCourseTag union) Β· read-only (tag chips on card)
  • visibility_mode "Visibility Scope" β€” enum [guest, authenticated, empty_institute] Β· Catalog grid Β· computed Β· read-only (drives banner + AF-1A)
  • item_title "Title" β€” text Β· Catalog grid Β· read-only
  • cover_image "Cover Image" β€” file Β· Catalog grid Β· read-only
  • difficulty_level "Difficulty Level" β€” enum [beginner, intermediate, advanced] Β· Catalog grid Β· read-only Β· course cards only
  • price_badge "Free/Paid Badge" β€” enum [free, paid] Β· Catalog grid Β· computed Β· read-only
  • enrolled_badge "Enrolled Badge" β€” boolean Β· Catalog grid Β· computed Β· read-only Β· visible when logged_in==true
Actions
  • search "Search" β€” always enabled Β· triggers UC-LMS.06-M-2
  • toggle_tag "Select/Deselect Tag" β€” always enabled Β· triggers UC-LMS.06-M-4
  • change_sort "Sort" β€” always enabled Β· triggers UC-LMS.06-M-6
  • change_page "Change Page" β€” enabled when result_count > 20 Β· triggers UC-LMS.06-M-6
  • clear_filters "Clear Filters" β€” enabled when search_query != '' || selected_tags.length > 0 Β· triggers UC-LMS.06-A-3A-2
  • open_item_detail "Open Detail" β€” always enabled Β· triggers UC-LMS.06-M-7
  • view_all_courses "View All Courses" β€” enabled when visibility_mode == empty_institute (AF-1A only) Β· triggers UC-LMS.06-A-1A-1
Additional requirements
  1. Course card: cover image (field 9), title (field 8), institute name (field 5), tag chips (field 6 β€” CourseTag + InstituteCourseTag), difficulty (field 10), Free/Paid badge (field 11 β€” no price), Enrolled badge (field 12 β€” logged-in + Enrollment.status=active) [refs: UC-LMS.06, UC-LMS.11]
  2. Specialization card: cover image (field 9), title (field 8), institute name (field 5), tag chips (field 6), member course count, Free/Paid badge (field 11), Enrolled badge (field 12 β€” logged-in) [refs: UC-LMS.06]
  3. Guest visitors see no Enrolled badges [refs: NFR-10]
  4. URL supports ?q=, ?tags=, ?sort=; browser back from detail restores filters
  5. Empty catalog state: show empty state + guidance if no published items exist
  6. Pagination: 20 items/page default; no-results shows a "Clear Filters" button
  7. Cover images use lazy loading [refs: NFR-02]
  8. Visibility banner (field 7) always visible at top of Catalog grid: guest β†’ "Showing all published courses…"; authenticated β†’ "Showing your institute's courses + shared"; empty_institute (AF-1A) β†’ "Your institute has no courses" + View All Courses button [refs: UC-LMS.06]
  9. tags_on_card (field 6) = union of CourseTag (Paid Tags, Central Reviewer) + InstituteCourseTag (Free Tags, Program Admin via UC-LMS.11); tag filter sidebar uses same tag universe [refs: UC-LMS.06, UC-LMS.11, UC-LMS.12]
  10. If a clicked Course/Specialization no longer exists, the User is informed it is no longer available with a way back to the Catalog (UC-LMS.06 additional_requirement #1) β€” not modeled as a separate scenario here (system-level condition, not a screen-specific alternative flow)
⚠ Open issues
  • Definition of "popular" sort β€” enrollment count, views, or rating?
  • Items per page β€” 20/50 default or infinite scroll?
  • SEO: meta tags, sitemap, canonical URL strategy
  • Card spec differences: Course vs Specialization cards show different data (price, rating, duration)
  • Additional filters (difficulty, duration, access type) β€” future scope
  • Personalization for logged-in users β€” out of scope v1
  • Cache strategy for high-traffic catalog queries (expensive per-request)
  • Filter state persistence when guest logs in and returns