{% extends "scitex_ui/standalone_shell.html" %} {% load static %} {% comment %} Board v3 now extends the scitex-ui workspace shell (operator-asked, TG msg 302 / 303 — wants Alt+I element-inspector + shared chrome parity with the legacy GraphView). All inline content is repacked into the shell's three blocks: extra_css holds the page-local styles, app_content holds the kanban + BLOCKING-YOU panel + detail modal, extra_js holds the page logic. Alt+I element-inspector wires up automatically via scitex-ui's context_processor (settings.py guards the install at scitex-ui ≥0.5.0). For older scitex-ui installs the inspector degrades silently; the board itself works either way. The favicon link is injected via extra_css (the shell template has no favicon block; extra_css renders inside ). {% endcomment %} {% block extra_css %} {# 08-time-grouping.css: bucket headers TODAY/WEEK/MONTH/OLDER for Group-by-time (a2a `ff1441d7`) #} {# 09-timeline.css: Timeline layout — raster + per-task simple cards (operator TODO 2026-06-17) #} {# combobox.css (loaded below the page-CSS so its specificity sits ON TOP if needed) #} {% comment %} searchQuery.js — GitHub-style qualifier-syntax parser (project:/agent:/ status:/...). Exposes window.STX.searchQuery; the page logic below delegates `fuzzyMatch` to it whenever the input contains a recognized qualifier. Operator TG 12315/12316: photographed typing `project: paper-scitex-clew` into the search bar — they already expected GitHub-style syntax. Pure JS module, no DOM deps; unit tests at tests/scitex_todo/test__search_query.js. NB: Django's `{# … #}` syntax is single-line only — a multi-line block leaks its body into the rendered HTML. Use `{% comment %}` for any multi-line note inside a template (board v0.5.4 fix — PR #105). {% endcomment %} {% comment %} searchSuggest.js — autocomplete/Tab-completion engine, extends PR #102. Pure module; the inline script in extra_js below wires it to the #f-search input. Exposes window.STX.searchSuggest. Operator TG 12318. {% endcomment %} {% comment %} timelinePack.js — pure beeswarm sub-row packer for the Timeline raster. MUST load BEFORE timeline.js: it publishes window.STX.timelinePack, which timeline.js's IIFE captures at init so co-located markers fan out into sub-rows instead of occluding each other. No DOM; also node-testable. {% endcomment %} {% comment %} timelineGeo.js — pure time→pixel geometry (ms / barGeo / makeTicks / relTime) for the Timeline raster. MUST load BEFORE timeline.js: publishes window.STX.timelineGeo, captured by timeline.js's IIFE at init. No DOM; node-testable. Factored out so timeline.js stays under the per-file cap. {% endcomment %} {% comment %} timelineGate.js — anti-flash change-detection gate for the Timeline raster. MUST load BEFORE timeline.js: publishes window.STX.timelineGate (rasterSig + a stateful gate that skips identical 4s rebuilds and preserves .tl-scroll scroll across a real rebuild), so the raster stops flashing / jumping to top. {% endcomment %} {% comment %} timelineSelect.js — marker multi-select + copy-contents + right-click menu for the Timeline raster (operator 2026-06-26). Classic {% comment %} timelineControls.js — Timeline controls-row builder (incl. the dependency- edge legend) + the edge hover-highlight. MUST load BEFORE timeline.js: publishes window.STX.timelineControls.controlsHtml (captured by timeline.js at init, like timelineGeo) and self-wires the hover delegation on #columns (mouseover/mouseout) so it survives the raster's auto-rebuilds without timeline.js re-attaching. Pure controlsHtml/edgeLegendHtml are node-testable. Factored out so timeline.js stays under the per-file cap. {% endcomment %} {% comment %} timeline.js — the Timeline layout renderer (raster by agent/project + a rich per-task "simple" list). Classic {% comment %} FIRST-PAINT status-color CSS vars — the SINGLE source of truth for the board's per-status color layer (hook-bypass: line-limit). Server-rendered (deterministic, no FE flash) from `status_colors` (views.board_v3_page → handlers.graph._status_colors → _diagram.STATUS_STYLE). Cards, timeline, and the in-board mermaid all consume `--status-fill-` / `--status-stroke-` / `--status-border-` so the 7 statuses render distinct + consistent, matching the python `build_mermaid()` artifacts. The 4 buckets still drive COLUMN placement + the blocked pulse — only the color layer is per-status. {% endcomment %} {% endblock extra_css %} {% block app_content %} {% comment %} Filterbar reorg (operator TG, lead a2a `b48f7c2c438b464698183d2e95d3bb04`, 2026-06-12). Three explicit groups end the flex-wrap chaos: .fb-left — identity (title + version + LIVE chip) .fb-center — search (input + autocomplete suggest) .fb-right — operations (Layout | Sort | Filters | Recent count | Group | Add Task | blocking me | overflow controls) Active-filter chips + qualifier hint pills move to a second row `
` shown only when populated. {% endcomment %}

scitex-todo v{{ scitex_todo_version|default:"?" }}

LIVE
{# end .fb-center / SEARCH-FILTER group #}
{% comment %} board UI overhaul part 2 (2026-06-14, operator complaint via lead a2a `d1af161e`) — explicit subgroups in the right band so the controls stop visually colliding: VIEW = Layout + Sort + Group STATUS = recent-count + Reload + hide-project + blocking-me + hidden PRIMARY = + Add Task (separated by a divider, brand-accent) The legacy `.fb-right` keeps its wrap-friendly flex; the new `.stx-todo-filterbar__group--*` wrappers add the breathing room + dividers. NB: this MUST be a `comment` block, not `{# #}` — Django's `{# #}` syntax is single-line only; newlines between `{#` and `#}` are NOT stripped, so the comment leaks as literal text onto the operator's screen. The leak shipped briefly in PR #173 (the header-declutter PR); fix-forward in this PR per lead a2a `f7a5d37930b9479ca7e53a7e316c132d`, 2026-06-14, after the operator reported it live. {% endcomment %}
{% comment %} Group-by-time toggle (operator-asked TIME-BASED VIEW — lead a2a `ff1441d7`, 2026-06-14). When ON, the column layout walks each project's visible cards and inserts collapsible bucket headers (TODAY / THIS WEEK / THIS MONTH / OLDER) keyed on `last_activity`. Default OFF — back-compat with the existing flat column view. State persists in localStorage["scitex-todo:group-by-time"]. Lives in the existing VIEW group next to Sort so the operator's time controls cluster (board UI overhaul part 2, PR #173). {% endcomment %}
{# end VIEW group #}
🙈 hide project (0)
No projects loaded yet.
👁 hidden (0)
No hidden cards.
{# end STATUS group #}
{# end PRIMARY action zone #}
{# end .fb-right #}
{# end .filterbar #} {% comment %} Filterbar second row — active filter chips + qualifier-hint pills. Hidden via CSS when both children are empty so the main filterbar stays at ~50 px on the default state. Populated by renderActiveFilterChips() / renderQualifierHints() in extra_js. {% endcomment %}
{% comment %} STATUS COLOR LEGEND (operator: "add color legends") — decodes the per-status colors used by cards / timeline / mermaid. SINGLE-SOURCED: iterates the SAME `status_colors` template context (views.board_v3_page → handlers.graph._status_colors → _diagram.STATUS_STYLE) in STATUS_STYLE order, so adding/removing a status updates the legend automatically — no hardcoded status list or hex colors here. Each chip references the first-paint `--status-fill-` / `--status-stroke-` / `--status-border-` CSS vars (rendered by #status-color-vars) so the swatch matches the cards exactly, including `deferred`'s dashed border. `data-legend-status` per chip keeps the test robust. {% endcomment %}
{% for s, c in status_colors.items %} {{ s }} {% endfor %}
{% comment %} BLOCKING-YOU 360 px aside REMOVED (P12, lead a2a 2026-06-12). The "right-end giant lane" the operator photographed is now a normal project column synthesized client-side as the `user` lane (see USER_LANE_KEY in _renderColumnView): every task with `status === "blocked" && blocker === "operator-decision"` shows up in a column titled `user` at normal width, with normal drag-reorder / pin / column-context-menu. Tasks still live in their REAL project column too; the user lane is a render-time aggregation, not a schema change. The mobile `#by-fab` drawer toggle is removed with the aside; the "🚧 blocking me" filterbar toggle (#t-block) still works because it's a filter, not a drawer. NB: PR #108 inadvertently left the aside HTML + `#block-rows` placeholder in place while removing the JS that populated it — operator saw "loading…" forever in the right sidebar. This commit finishes the job. {% endcomment %}
· selected: 0 ·
loading…
v3 LIVE · real data · operator schema (ADR-0007) · GUI→code (ADR-0006)

🛤 Route — how this card was handled (newest last)

Posts to comments[]; visible to the owning agent.

+ Add Task

{% endblock app_content %} {% block extra_js %} {% endblock extra_js %}