Adding fits
This commit is contained in:
1 parent
8185f1f8b3
commit
ab39191af5
19 files changed
+1253
-1
No files matched your search
@@ -0,0 +1,62 @@
|
||||
{% macro conn_desc(ap) -%}
|
||||
{%- if ap.iso_thread -%}
|
||||
ISO M{{ ap.iso_thread.diameter_mm }}×{{ ap.iso_thread.pitch_mm }}
|
||||
{%- elif ap.unc_thread -%}
|
||||
UNC {{ ap.unc_thread.diameter_fraction }}-{{ ap.unc_thread.tpi }} {{ ap.unc_thread.series.value }}
|
||||
{%- elif ap.clamp_connection -%}
|
||||
Clamp {{ ap.clamp_connection.min_mm if ap.clamp_connection.min_mm is not none else ap.clamp_connection.min_in }}–{{ ap.clamp_connection.max_mm if ap.clamp_connection.max_mm is not none else ap.clamp_connection.max_in }}
|
||||
{%- elif ap.static_connection -%}
|
||||
Static {{ ap.static_connection.od_mm }} mm OD
|
||||
{%- else -%}
|
||||
—
|
||||
{%- endif -%}
|
||||
{%- endmacro %}
|
||||
|
||||
<div id="fit-{{ fit.id }}" class="fit-item">
|
||||
<div class="fit-item-main">
|
||||
<span class="fit-badge fit-badge-{{ fit.label.value }}">{{ fit.label.value | capitalize }}</span>
|
||||
<span class="fit-item-side"><strong>{{ own_ap.attachment_point_name.name }}</strong> ({{ conn_desc(own_ap) }})</span>
|
||||
<span class="fit-item-arrow">↔</span>
|
||||
<span class="fit-item-side">{{ other_part.description if other_part else "Unknown part" }} — <strong>{{ other_ap.attachment_point_name.name }}</strong> ({{ conn_desc(other_ap) }})</span>
|
||||
</div>
|
||||
<div class="row-actions">
|
||||
{% if fit.label.value != "exact" %}
|
||||
<button class="btn btn-ghost"
|
||||
hx-post="/admin/augmented-parts/{{ augmented_part_id }}/fits/{{ fit.id }}/label"
|
||||
hx-vals='{"label": "exact"}'
|
||||
hx-target="#fit-{{ fit.id }}" hx-swap="outerHTML">Mark Exact</button>
|
||||
{% endif %}
|
||||
{% if fit.label.value != "possible" %}
|
||||
<button class="btn btn-ghost"
|
||||
hx-post="/admin/augmented-parts/{{ augmented_part_id }}/fits/{{ fit.id }}/label"
|
||||
hx-vals='{"label": "possible"}'
|
||||
hx-target="#fit-{{ fit.id }}" hx-swap="outerHTML">Mark Possible</button>
|
||||
{% endif %}
|
||||
{% if fit.label.value != "none" %}
|
||||
<button class="btn btn-ghost"
|
||||
hx-post="/admin/augmented-parts/{{ augmented_part_id }}/fits/{{ fit.id }}/label"
|
||||
hx-vals='{"label": "none"}'
|
||||
hx-target="#fit-{{ fit.id }}" hx-swap="outerHTML">Mark Impossible</button>
|
||||
{% endif %}
|
||||
<button class="btn btn-danger"
|
||||
hx-delete="/admin/augmented-parts/{{ augmented_part_id }}/fits/{{ fit.id }}"
|
||||
hx-target="#ap-{{ augmented_part_id }}-fits"
|
||||
hx-swap="outerHTML"
|
||||
hx-confirm="Delete this fit?">Delete</button>
|
||||
</div>
|
||||
|
||||
<div class="fit-notes">
|
||||
{% for note in fit.notes %}
|
||||
<div class="fit-note">
|
||||
<span class="fit-note-meta">{{ note.username }} · {{ note.created_at.strftime("%Y-%m-%d %H:%M") }}</span>
|
||||
<p class="fit-note-body">{{ note.body }}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<form hx-post="/admin/augmented-parts/{{ augmented_part_id }}/fits/{{ fit.id }}/notes"
|
||||
hx-target="#fit-{{ fit.id }}" hx-swap="outerHTML"
|
||||
class="inline-edit fit-note-form">
|
||||
<input type="text" name="body" placeholder="Add a note…" required>
|
||||
<button type="submit" class="btn btn-ghost">Add note</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,49 @@
|
||||
<div id="ap-{{ augmented_part_id }}-fits" class="ap-inline-section">
|
||||
<h3>Fits</h3>
|
||||
|
||||
{% if message %}<p class="alert alert-success">{{ message }}</p>{% endif %}
|
||||
{% if error %}<p class="alert alert-error">{{ error }}</p>{% endif %}
|
||||
|
||||
{% for view in fit_views %}
|
||||
{% with fit=view.fit, own_ap=view.own_ap, other_ap=view.other_ap, other_part=view.other_part %}
|
||||
{% include "admin/_augmented_part_fit_row.html" %}
|
||||
{% endwith %}
|
||||
{% else %}
|
||||
<p class="muted" style="font-size:0.85rem;margin:0 0 0.5rem">No fits recorded yet.</p>
|
||||
{% endfor %}
|
||||
|
||||
<div class="row-actions" style="margin:0.5rem 0">
|
||||
<form hx-post="/admin/augmented-parts/{{ augmented_part_id }}/fits/recompute"
|
||||
hx-target="#ap-{{ augmented_part_id }}-fits" hx-swap="outerHTML">
|
||||
<button type="submit" class="btn btn-ghost">Recompute possible fits</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<form hx-post="/admin/augmented-parts/{{ augmented_part_id }}/fits"
|
||||
hx-target="#ap-{{ augmented_part_id }}-fits"
|
||||
hx-swap="outerHTML"
|
||||
class="inline-edit" style="margin-top:0.5rem">
|
||||
<label>This part's point
|
||||
<select name="own_attachment_point_id" required>
|
||||
<option value="">— select —</option>
|
||||
{% for p in own_points %}
|
||||
<option value="{{ p.id }}">{{ p.attachment_point_name.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</label>
|
||||
<label>Fits with part
|
||||
<select name="other_augmented_part_id" required
|
||||
hx-get="/admin/augmented-parts/{{ augmented_part_id }}/fits/other-points"
|
||||
hx-target="#ap-{{ augmented_part_id }}-fit-other-points"
|
||||
hx-trigger="change"
|
||||
hx-include="[name='other_augmented_part_id']">
|
||||
<option value="">— select —</option>
|
||||
{% for p in other_parts %}
|
||||
<option value="{{ p.id }}">{{ p.description | truncate(40) }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</label>
|
||||
<div id="ap-{{ augmented_part_id }}-fit-other-points"></div>
|
||||
<button type="submit" class="btn btn-primary">Add fit</button>
|
||||
</form>
|
||||
</div>
|
||||
@@ -58,5 +58,10 @@
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML">
|
||||
</div>
|
||||
|
||||
<div hx-get="/admin/augmented-parts/{{ ap.id }}/fits"
|
||||
hx-trigger="load"
|
||||
hx-swap="outerHTML">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -0,0 +1,6 @@
|
||||
<select name="other_attachment_point_id" required>
|
||||
<option value="">— select —</option>
|
||||
{% for p in points %}
|
||||
<option value="{{ p.id }}">{{ p.attachment_point_name.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
@@ -65,6 +65,17 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h2>Recompute Fits</h2>
|
||||
<p class="muted">Re-runs the fit-matching algorithm across every part, adding newly Possible fits and pruning stale ones. Exact and Impossible labels are never changed.</p>
|
||||
<div class="row-actions">
|
||||
<form hx-post="/admin/augmented-parts/fits/recompute" hx-target="#fits-recompute-result" hx-swap="innerHTML">
|
||||
<button type="submit" class="btn btn-primary">Recompute all fits</button>
|
||||
</form>
|
||||
</div>
|
||||
<p id="fits-recompute-result" class="muted"></p>
|
||||
</div>
|
||||
|
||||
{% include "admin/_augmented_parts_table.html" %}
|
||||
</main>
|
||||
{% endblock %}
|
||||
Reference in new issue
Block a user