Templates: - mission_timeline_preview: client-side rendering with lane stacking, wheel zoom, drag pan, percentage-based layout, event dedup, scale labels - asset_detail: dock/undock modals with time selection, future event warning, Mission Label column replacing Location/State - asset_entry_form: all_locations expanded to 72 items (draft board hierarchy), all_states dynamic from DB, event point dropdown uses same list - Remove sim_time from all template url_for links - base.html: remove Today button JS: - app.js: sim_time controls use POST /api/v1/sim-time API instead of URL param Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
63 lines
2.6 KiB
HTML
63 lines
2.6 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block content %}
|
|
<div class="ph-row fi">
|
|
<div class="ph">
|
|
<div class="ey">Reference Data</div>
|
|
<h1>引擎目录</h1>
|
|
</div>
|
|
<a class="b ac" href="{{ url_for('web.engine_new') }}">+ New Engine</a>
|
|
</div>
|
|
|
|
<div class="fb fi">
|
|
<form method="get" action="{{ url_for('web.engine_list') }}" style="display:flex;gap:8px;align-items:center;flex-wrap:wrap">
|
|
<input type="text" name="q" value="{{ search_term }}" placeholder="Search engines...">
|
|
<select name="fuel_type" onchange="this.form.submit()">
|
|
<option value="">All Fuel</option>
|
|
{% for f in fuel_options %}<option value="{{ f }}" {% if f == fuel_filter %}selected{% endif %}>{{ f }}</option>{% endfor %}
|
|
</select>
|
|
<select name="cycle" onchange="this.form.submit()">
|
|
<option value="">All Cycles</option>
|
|
{% for c in cycle_options %}<option value="{{ c }}" {% if c == cycle_filter %}selected{% endif %}>{{ c }}</option>{% endfor %}
|
|
</select>
|
|
<select name="mod_source" onchange="this.form.submit()">
|
|
<option value="">All Mods</option>
|
|
{% for m in mod_source_options %}<option value="{{ m }}" {% if m == mod_source_filter %}selected{% endif %}>{{ m }}</option>{% endfor %}
|
|
</select>
|
|
<button class="b" type="submit">Search</button>
|
|
</form>
|
|
</div>
|
|
|
|
<table class="fi">
|
|
<thead><tr>
|
|
<th>Name</th><th>Cycle</th><th>Mass</th><th>Vac Thrust</th><th>Vac ISP</th><th>Fuel</th><th>Mod</th><th>Action</th>
|
|
</tr></thead>
|
|
<tbody>
|
|
{% for row in catalog_rows %}
|
|
<tr>
|
|
<td><a href="{{ url_for('web.engine_detail', family_id=row.family.id) }}">{{ row.family.engine_name }}</a></td>
|
|
<td>{{ row.family.cycle or '—' }}</td>
|
|
<td>{{ '%.2f'|format(row.max_mass_t) if row.max_mass_t else '—' }}t</td>
|
|
<td>{{ '%.0f'|format(row.max_vac_thrust_kn) if row.max_vac_thrust_kn else '—' }}kN</td>
|
|
<td>{{ '%.0f'|format(row.max_vac_isp) if row.max_vac_isp else '—' }}s</td>
|
|
<td>{{ row.fuel_types or '—' }}</td>
|
|
<td class="mt">{{ row.mod_source or '—' }}</td>
|
|
<td><div class="act-btn"><a href="{{ url_for('web.engine_edit', family_id=row.family.id) }}">Edit</a></div></td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
|
|
{% if total_pages > 1 %}
|
|
<div class="pg-bar fi">
|
|
{% if has_prev %}<a href="{{ prev_url }}">← Prev</a>{% endif %}
|
|
{% for link in page_links %}
|
|
{% if link.is_current %}<span class="cur">{{ link.page }}</span>
|
|
{% elif link.is_ellipsis %}<span>...</span>
|
|
{% else %}<a href="{{ link.url }}">{{ link.page }}</a>{% endif %}
|
|
{% endfor %}
|
|
{% if has_next %}<a href="{{ next_url }}">Next →</a>{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
{% endblock %}
|