{% extends "brickwork/shell/app.html" %} {% comment %} A work queue: items waiting on a person, triaged by status and priority, with bulk actions over a selection. COPY THIS FILE into your project and edit it. It is not on the template loader path, so you cannot extend it (ADR-056). What your view must supply: queue_tabs / queue_active the triage tabs, and which one is open queue_columns / queue_rows the table's columns and pre-rendered rows queue_page a page of items (a Django Page from Paginator) filter_form your own filter form (the bar renders its fields) nav_items / nav_active as in app/list.html The counts, headings and copy below are typed into the template, which is where you change them. A queue is a list whose rows are WORK, not records: every row is waiting on somebody, so the page answers "what is mine, what is stuck, what is late" before it answers "what exists". That is why the tabs carry counts, why the oldest item leads the stat row, and why the table's first column is the item rather than an id. On status: build each status cell as a rendered {% templatetag openblock %} bw_badge {% templatetag closeblock %} in your view, so the state reaches the reader as a word ("Blocked", "In review") and not as a colour. The badge variants (neutral, info, success, warning, danger) tint that word; they never replace it. Same rule for priority. A table row's own selected state IS colour-only in the component, which is why the checkbox, not the row tint, is the accessible signal for selection. The bulk actions bar and the table share ONE form, so the checkboxes the table renders are the inputs the bar's buttons submit. Read them server-side with request.POST.getlist("selected"). The live "n selected" count is an Alpine enhancement; with JavaScript off the bar still submits the checked rows. States: the tab set's active/inactive per tab (see _tabs.html's own header); the table's loading/empty/row-link/selected states and its sortable-column ascending/descending/unsorted states (see _data_table.html's own header); pagination rendered/absent (a single page renders no controls); the bulk bar's own empty/populated selection count, which is populated by Alpine and empty without it. Accessibility: inherits shell/app.html's skip link, sidebar/drawer nav and page-header region; every status, priority and outcome reading is a badge whose label carries the meaning in words, never colour alone, and each row's checkbox carries a visually-hidden label naming its row. Covered by the archetype harness's full gate sweep (render, axe WCAG 2.2 AA, no horizontal overflow, light/dark distinctness, skip-link first-tab-stop with JS disabled) at every W0.1 breakpoint, both themes. Responsive: no breakpoint switch of its own; inherits shell/app.html's sidebar-to-drawer collapse at --bw-breakpoint-md (48rem). The stat row (bw-stat-grid) reflows continuously with an auto-fit grid; the composed table carries unconditional horizontal scroll (responsive="scroll", the default) at every width. {% endcomment %} {% load brickwork_components brickwork_interactions brickwork_nav %} {% block page_title %}Review queue - Northwind{% endblock %} {% block sidebar %}{% bw_nav nav_items nav_active %}{% endblock %} {% block sidebar_mobile %}{% bw_nav nav_items nav_active %}{% endblock %} {% block brand_wordmark %}Northwind{% endblock %} {% block page_header %} {% include "brickwork/components/_page_header.html" with title="Review queue" description="Claims waiting on a decision. Oldest first, so nothing ages out unseen." %} {% endblock %} {% block page_actions %} {% bw_button "Export queue" variant="secondary" icon="download" href="/queue/export/" %} {% endblock %} {% block content %}