87 lines
3.1 KiB
HTML
87 lines
3.1 KiB
HTML
{% extends "base.html" %}
|
||
{% block title %}Scopes · {{ app_name }}{% endblock %}
|
||
{% block body %}
|
||
{% include "_nav.html" %}
|
||
<main class="container">
|
||
<h1>Scopes</h1>
|
||
<p class="muted">
|
||
Every scope on record, with the accessories that fit it. Each part-type
|
||
column lists matching parts; <span class="fit-badge fit-badge-exact">Exact</span>
|
||
is a confirmed fit, <span class="fit-badge fit-badge-possible">Possible</span> a candidate.
|
||
</p>
|
||
|
||
{%- macro mag(v) -%}{{ v | int if v == v | int else v | round(1) }}{%- endmacro -%}
|
||
{% macro magnification(info) -%}
|
||
{%- if info and info.magnification_min is not none and info.magnification_max is not none -%}
|
||
{{ mag(info.magnification_min) }}–{{ mag(info.magnification_max) }}×
|
||
{%- elif info and info.magnification_min is not none -%}
|
||
{{ mag(info.magnification_min) }}×
|
||
{%- elif info and info.magnification_max is not none -%}
|
||
{{ mag(info.magnification_max) }}×
|
||
{%- else -%}
|
||
<span class="muted">—</span>
|
||
{%- endif -%}
|
||
{%- endmacro %}
|
||
|
||
<div class="card" style="overflow-x:auto">
|
||
<table class="table">
|
||
<thead>
|
||
<tr>
|
||
<th>Scope</th>
|
||
<th>Manufacturer</th>
|
||
<th>Model</th>
|
||
<th>Type</th>
|
||
<th>Magnification</th>
|
||
<th>Objective thread</th>
|
||
{% for ct in column_types %}
|
||
<th>{{ ct.name }}</th>
|
||
{% endfor %}
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for row in rows %}
|
||
{% set scope = row.scope %}
|
||
{% set info = row.info %}
|
||
<tr>
|
||
<td>
|
||
<strong>{{ scope.description }}</strong>
|
||
{% if scope.sku %}<br><span class="muted">{{ scope.sku }}</span>{% endif %}
|
||
</td>
|
||
<td>{{ scope.manufacturer.name if scope.manufacturer else "—" }}</td>
|
||
<td>{{ scope.scope_model.name if scope.scope_model else "—" }}</td>
|
||
<td>{{ scope.sub_part_type.name if scope.sub_part_type else "—" }}</td>
|
||
<td>{{ magnification(info) }}</td>
|
||
<td>
|
||
{% if info and info.objective_thread_pitch %}
|
||
{{ info.objective_thread_pitch }}
|
||
{% else %}<span class="muted">—</span>{% endif %}
|
||
</td>
|
||
{% for ct in column_types %}
|
||
{% set entries = row.cells.get(ct.id) %}
|
||
<td>
|
||
{% if entries %}
|
||
{% for e in entries %}
|
||
<div class="fit-cell-item">
|
||
<span class="fit-badge fit-badge-{{ e.label }}">{{ e.label | capitalize }}</span>
|
||
{{ e.part.description | truncate(48) }}
|
||
</div>
|
||
{% endfor %}
|
||
{% else %}
|
||
<span class="muted">—</span>
|
||
{% endif %}
|
||
</td>
|
||
{% endfor %}
|
||
</tr>
|
||
{% else %}
|
||
<tr>
|
||
<td colspan="{{ 6 + column_types | length }}" class="muted">
|
||
No scopes recorded yet.
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</main>
|
||
{% endblock %}
|