{% extends "base.html" %} {% block title %}{{ name }} · The Booth{% endblock %} {% block content %}
‹ all booths

{{ name }}

{% if uploaded %}⬆ pickup {% endif %}{% if board %}{{ board|length }} link{{ '' if board|length == 1 else 's' }}{% if items %} · {{ items|length }} file{{ '' if items|length == 1 else 's' }}{% endif %}{% else %}{% set open_asks = asks|selectattr('answer', 'none')|rejectattr('error')|list|length %}{% if open_asks %}{{ open_asks }} open ask{{ '' if open_asks == 1 else 's' }} · {% endif %}{{ items|length }} item{{ '' if items|length == 1 else 's' }} · expires in {{ expires_in|dur }}{% endif %} {% if items %}⬇ zip{% endif %} {# A durable multi-writer board gets no one-click wipe — same rule as the kept lane on the index. Remove rows with the per-row ×, or release the board from the index and wipe it from there. #} {% if not board %}
{% endif %}
{% if uploaded %}
📦 Pickup {{ name }} — download files below, or on nh3-dev grab ~/booth-data/{{ name }}/
{% endif %} {% if asks %} {% include "_asks.html" %} {% endif %} {% if board %} {# THE STANDING LINK BOARD. Every agent session on the fleet appends here, so this is the one booth where the useful granularity is the ROW, not the folder. Rendered as real UI rather than a markdown blob so a dead link can be removed without hand-editing the file — and so provenance (who posted it, when) is readable at a glance, which is the whole reason a bare URL three days old is useless. ORDER: pinned rows first, then newest-first (order_for_display). Pin a row with the ★ so the ones you care about stop scrolling off the bottom. ONE
, not one-per-row: checkboxes drive the bulk delete, while the per-row × and ★ are submit buttons with their own `formaction`. That keeps all three actions in a single form (nested forms are invalid HTML) AND lets every one work with JS off — JS only adds select-all and the live count. Every action posts a CONTENT ID, never a row number: another session can append between this page rendering and a click, and an index would then hit a neighbour. An id matches the row the operator saw, or nothing. #} {% set pinned_n = board | selectattr('pinned') | list | length %}
{{ board|length }} link{{ '' if board|length == 1 else 's' }}{% if pinned_n %} · {{ pinned_n }} pinned{% endif %} pinned first · newest on top · ★ pins a row · tick rows to delete
{% for e in board %}
{{ e.desc }}
{{ e.url }}
{% if e.who %}{{ e.who }}{% endif %} {% if e.when %}{{ e.when }}{% endif %}
{% endfor %}
{% endif %} {% if not items and not board and not asks %}
This booth is empty.
{% elif items %} {# `elif items` and not a bare `else`: a board booth has NO gallery items (its links.md is rendered as the board above and filtered out), so a plain else would emit an empty