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>
23 lines
836 B
HTML
23 lines
836 B
HTML
{% extends "projects/base.html" %}
|
|
|
|
{% block page_title %}Implementations{% endblock %}
|
|
|
|
{% block project_content %}
|
|
<h1>Implementations</h1>
|
|
<p>Apps and packages that implement {{ project.name }}, and where each stands on every feature.</p>
|
|
{% if access.can_edit %}
|
|
<p><a href="{% url 'implementations:create' org_slug=project.org.slug project_slug=project.slug %}">Add an implementation</a></p>
|
|
{% endif %}
|
|
|
|
{% if active %}
|
|
{% include "implementations/_table.html" with impls=active caption="Active" %}
|
|
{% else %}
|
|
<p>No active implementations.</p>
|
|
{% endif %}
|
|
{% if archived %}
|
|
<section aria-labelledby="archived-heading">
|
|
<h2 id="archived-heading">Archived</h2>
|
|
{% include "implementations/_table.html" with impls=archived caption="Archived" %}
|
|
</section>
|
|
{% endif %}
|
|
{% endblock %}
|