2026-10-27 07:58:16 -04:00
|
|
|
{% extends "projects/base.html" %}
|
|
|
|
|
|
|
|
|
|
{% block page_title %}{{ feature.key }} revision {{ snapshot.revision }}{% endblock %}
|
|
|
|
|
|
|
|
|
|
{% block project_content %}
|
|
|
|
|
<p role="note">
|
|
|
|
|
<strong>Old revision.</strong>
|
|
|
|
|
You're viewing revision {{ snapshot.revision }} of {{ feature.current_revision }}.
|
|
|
|
|
<a href="{% url 'features:detail' org_slug=project.org.slug project_slug=project.slug feature_key=feature.key %}">View the current version</a>
|
|
|
|
|
or <a href="{% url 'features:compare' org_slug=project.org.slug project_slug=project.slug feature_key=feature.key %}?old={{ snapshot.revision }}&new={{ feature.current_revision }}">compare with it</a>.
|
|
|
|
|
</p>
|
|
|
|
|
<h1><span class="muted">{{ feature.key }}</span> {{ snapshot.title }}</h1>
|
|
|
|
|
<dl>
|
|
|
|
|
<dt>Status</dt>
|
|
|
|
|
<dd>{{ snapshot.get_status_display }}{% if snapshot.superseded_by %}, by {{ snapshot.superseded_by.key }} {{ snapshot.superseded_by.title }}{% endif %}</dd>
|
|
|
|
|
<dt>Parent</dt>
|
|
|
|
|
<dd>{% if snapshot.parent %}{{ snapshot.parent.key }} {{ snapshot.parent.title }}{% else %}None (top level){% endif %}</dd>
|
|
|
|
|
<dt>Change</dt>
|
|
|
|
|
<dd>
|
|
|
|
|
<time datetime="{{ snapshot.created_at|date:'c' }}">{{ snapshot.created_at|date:"j M Y" }}</time>
|
|
|
|
|
by {{ snapshot.author.username|default:"unknown" }}: {{ snapshot.note }}
|
|
|
|
|
</dd>
|
|
|
|
|
</dl>
|
|
|
|
|
<section aria-labelledby="description-heading">
|
|
|
|
|
<h2 id="description-heading" class="visually-hidden">Description</h2>
|
|
|
|
|
<div class="prose">
|
Add issues and comment threads (Phase 3)
Issues: per-project numbers, statuses (open, accepted, rejected,
withdrawn, duplicate), feature links, edits, and a timeline of comments
and events. From an issue, collaborators create or update a feature
with the revision tied to the issue and an option to accept it.
Comments: general and line-anchored threads on features, one
discussion thread per issue, edit history, tombstone deletes, resolve,
and promoting a feature thread to an issue. Line threads attach to
top-level Markdown blocks and go outdated only when the text changes.
HTMX swaps threads in place with focus management; every action also
works as a plain form post. Markdown headings are re-levelled so user
text never skips heading levels on the page.
The example flow from concept.md (steps 1-7) is covered end to end in
tests/test_example_flow.py.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 09:18:45 -04:00
|
|
|
{% for block in blocks %}
|
|
|
|
|
<div class="block" id="{{ block.anchor }}">{{ block.html }}</div>
|
|
|
|
|
{% empty %}
|
|
|
|
|
<p class="muted">No description.</p>
|
|
|
|
|
{% endfor %}
|
2026-10-27 07:58:16 -04:00
|
|
|
</div>
|
|
|
|
|
</section>
|
Add feature files, image pins and implementations (Phase 4)
Files: prototype and documentation files on features, with versions.
Adding, replacing or removing a file is a feature revision with a
change note. Types come from the extension; uploads are capped at
25 MB and stored under opaque paths. Every file URL checks project
access, then redirects to a short-lived signed URL on the bucket, or
streams with nosniff and a CSP sandbox when no bucket is configured.
HTML prototypes run in a sandboxed iframe without same-origin access.
Threads: whole-file threads and pins at a point on an image, drawn as
an SVG overlay in percentages. Pins are placed with number fields, or
by clicking the image with JS.
Implementations: name, link and status, plus a per-feature status grid
stamped with the feature revision, marked behind when the feature
changes, and confirmable without changing the status.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 10:15:30 -04:00
|
|
|
|
|
|
|
|
{% if files %}
|
|
|
|
|
<section aria-labelledby="files-heading">
|
|
|
|
|
<h2 id="files-heading">Files at this revision</h2>
|
|
|
|
|
<ul>
|
|
|
|
|
{% for v in files %}
|
|
|
|
|
<li><a href="{% url 'files:detail' org_slug=project.org.slug project_slug=project.slug feature_key=feature.key file_id=v.file_id %}?version={{ v.version }}">{{ v.original_name }}</a> <span class="muted">({{ v.file.get_kind_display|lower }}, version {{ v.version }})</span></li>
|
|
|
|
|
{% endfor %}
|
|
|
|
|
</ul>
|
|
|
|
|
</section>
|
|
|
|
|
{% endif %}
|
2026-10-27 07:58:16 -04:00
|
|
|
{% endblock %}
|