{% extends "base.html" %} {% block title %}Lessons — devcoach{% endblock %} {% block head %} {% endblock %} {% block content %} {# ── helpers ── #} {% set custom_date = selected_date_from or selected_date_to %} {% set any_filter = (selected_period != 'all' and not custom_date) or custom_date or selected_category or selected_level or selected_project or selected_repository or selected_branch or selected_commit or selected_starred or selected_search or selected_feedback %} {# period label shown on the button #} {% if custom_date %} {% if selected_date_from and selected_date_to %} {% set period_label = selected_date_from ~ ' → ' ~ selected_date_to %} {% elif selected_date_from %} {% set period_label = 'From ' ~ selected_date_from %} {% else %} {% set period_label = 'Until ' ~ selected_date_to %} {% endif %} {% else %} {% set _pl = {'all':'All time','today':'Today','week':'Last 7 days','month':'Last 30 days','year':'Last year'} %} {% set period_label = _pl.get(selected_period, 'All time') %} {% endif %} {# feedback label #} {% set _fl = {'know':'✓ Known','dont_know':'✗ Don\'t know','none':'— No response'} %} {% set feedback_label = _fl.get(selected_feedback, 'Feedback') if selected_feedback else 'Feedback' %}
{# preserve all current filters as hidden inputs — individual controls override them #} {# ── Search bar ── #}
🔍 {% if selected_search %} {% endif %}

{% if total == 0 %}No lessons {% elif total_pages == 1 %}{{ total }} lesson{{ 's' if total != 1 }} {% else %}{{ (page - 1) * per_page + 1 }}–{{ [page * per_page, total] | min }} of {{ total }} {% endif %}

{# ── Filter bar ── #}
{# Starred toggle #} {# Period dropdown #}
{# Dropdown panel #}
{# Feedback dropdown #}
{# Level dropdown #} {% set _lc = {'junior':'🟢','mid':'🟡','senior':'🔴'} %}
{# More filters #} {% if all_categories or all_projects or all_repositories or all_branches or all_commits %}
{% endif %} {# Clear all #} {% if any_filter %} Clear all {% endif %}
{# ── Active filter chips ── #} {% if any_filter %}
{% macro chip(label, clear_url) %} {{ label }}× {% endmacro %} {% set base = '?period=' ~ selected_period ~ '&category=' ~ selected_category ~ '&level=' ~ selected_level ~ '&project=' ~ selected_project ~ '&repository=' ~ selected_repository ~ '&branch=' ~ selected_branch ~ '&commit=' ~ selected_commit ~ '&feedback=' ~ selected_feedback ~ '&search=' ~ selected_search ~ '&date_from=' ~ selected_date_from ~ '&date_to=' ~ selected_date_to ~ ('&starred=1' if selected_starred else '') ~ '&sort=' ~ selected_sort ~ '&order=' ~ selected_order %} {% if custom_date %}{{ chip('📅 ' ~ period_label, base | replace('&date_from=' ~ selected_date_from, '&date_from=') | replace('&date_to=' ~ selected_date_to, '&date_to=')) }}{% endif %} {% if selected_period != 'all' and not custom_date %}{{ chip('🕐 ' ~ period_label, base | replace('period=' ~ selected_period, 'period=all')) }}{% endif %} {% if selected_feedback %}{{ chip(_fl.get(selected_feedback, selected_feedback), base | replace('&feedback=' ~ selected_feedback, '&feedback=')) }}{% endif %} {% if selected_starred %}★ Starred×{% endif %} {% if selected_search %}{{ chip('🔍 "' ~ selected_search ~ '"', base | replace('&search=' ~ selected_search, '&search=')) }}{% endif %} {% if selected_category %}{{ chip(selected_category, base | replace('&category=' ~ selected_category, '&category=')) }}{% endif %} {% if selected_level %}{{ chip(_lc.get(selected_level, '') ~ ' ' ~ selected_level, base | replace('&level=' ~ selected_level, '&level=')) }}{% endif %} {% if selected_project %}{{ chip('📁 ' ~ selected_project, base | replace('&project=' ~ selected_project, '&project=')) }}{% endif %} {% if selected_repository %}{{ chip('⎇ ' ~ selected_repository, base | replace('&repository=' ~ selected_repository, '&repository=')) }}{% endif %} {% if selected_branch %}{{ chip('⎇ ' ~ selected_branch, base | replace('&branch=' ~ selected_branch, '&branch=')) }}{% endif %} {% if selected_commit %}{{ chip(selected_commit[:7], base | replace('&commit=' ~ selected_commit, '&commit=')) }}{% endif %}
{% endif %}
{# ── Table ── #} {% if lessons %}
{# qs without sort/order/page so sort links preserve all filters #} {% set sort_base = '?period=' ~ selected_period ~ '&date_from=' ~ selected_date_from ~ '&date_to=' ~ selected_date_to ~ '&category=' ~ selected_category ~ '&level=' ~ selected_level ~ '&project=' ~ selected_project ~ '&repository=' ~ selected_repository ~ '&branch=' ~ selected_branch ~ '&commit=' ~ selected_commit ~ '&feedback=' ~ selected_feedback ~ '&search=' ~ selected_search ~ ('&starred=1' if selected_starred else '') %} {% macro sort_th(label, col, extra_class='') %} {% set active = (selected_sort == col) %} {% set next_order = 'asc' if (active and selected_order == 'desc') else 'desc' %} {% endmacro %} {{ sort_th('Date', 'timestamp') }} {{ sort_th('Topic', 'topic_id', 'hidden sm:table-cell') }} {{ sort_th('Title', 'title') }} {{ sort_th('Level', 'level') }} {{ sort_th('Feedback', 'feedback', 'hidden xl:table-cell') }} {% for lesson in lessons %} {% set lc = {'junior':'text-emerald-600 dark:text-emerald-400 bg-emerald-50 dark:bg-emerald-900/20', 'mid':'text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20', 'senior':'text-rose-600 dark:text-rose-400 bg-rose-50 dark:bg-rose-900/20'} %} {# Star #} {# Date — relative label + exact tooltip on hover #} {# Topic #} {# Title #} {# Level badge #} {# Categories #} {# Feedback #} {% endfor %}
{{ label }} {% if active %} {{ '↑' if selected_order == 'asc' else '↓' }} {% else %} {% endif %}
{{ lesson.timestamp_iso[:10] }}
{{ lesson.timestamp_iso[:16].replace('T', ' ') }}
{{ lesson.title }} {{ lesson.level }}
{# ── Pagination ── #} {% if total_pages > 1 %} {% set qs_base = '?period=' ~ selected_period ~ '&category=' ~ selected_category ~ '&level=' ~ selected_level ~ '&project=' ~ selected_project ~ '&repository=' ~ selected_repository ~ '&branch=' ~ selected_branch ~ '&commit=' ~ selected_commit ~ '&feedback=' ~ selected_feedback ~ '&search=' ~ selected_search ~ '&date_from=' ~ selected_date_from ~ '&date_to=' ~ selected_date_to ~ ('&starred=1' if selected_starred else '') ~ '&sort=' ~ selected_sort ~ '&order=' ~ selected_order %}

Page {{ page }} of {{ total_pages }}

{# Prev #} {% if page > 1 %} ← Prev {% else %} ← Prev {% endif %} {# Page numbers — show first, last, and a window around current #} {% for p in range(1, total_pages + 1) %} {% if p == 1 or p == total_pages or (p >= page - 2 and p <= page + 2) %} {% if loop.changed(p > 1 and p != page - 2 and p != 2) %} {% endif %} {% if p == page %} {{ p }} {% else %} {{ p }} {% endif %} {% endif %} {% endfor %} {# Next #} {% if page < total_pages %} Next → {% else %} Next → {% endif %}
{% endif %} {% else %}

📭

No lessons match the current filters.

{% if any_filter %}Clear all filters{% endif %}
{% endif %} {% endblock %} {% block scripts %} {% endblock %}