Files
KSP_project/app/templates/mission_status_board_preview.html
ArmorandClaude Opus 4.7 2fef743e83 feat: timeline refactor, docking UI, location/state dropdowns, sim_time cleanup
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>
2026-06-01 15:29:10 +08:00

112 lines
4.6 KiB
HTML

{% extends "base.html" %}
{% from "_datetime_picker_field.html" import datetime_picker_field %}
{% block content %}
{% include "_mission_ops_tabs.html" %}
{% include "_mission_preview_header.html" %}
<section class="panel mission-control-panel top-gap">
<form method="get" action="{{ url_for('web.mission_status_board_preview') }}" class="mission-toolbar-grid">
<div class="mission-toolbar-block">
<span class="field-label">面板筛选</span>
<div class="mission-filter-grid">
<label>
<span class="field-label">资产类型</span>
<select name="asset_type">
<option value="">全部类型</option>
{% for option in asset_type_options %}
<option value="{{ option }}" {% if option == asset_type_filter %}selected{% endif %}>{{ option }}</option>
{% endfor %}
</select>
</label>
<label>
<span class="field-label">地点</span>
<select name="location">
<option value="">全部地点</option>
{% for option in location_options %}
<option value="{{ option }}" {% if option == location_filter %}selected{% endif %}>{{ option }}</option>
{% endfor %}
</select>
</label>
<label>
<span class="field-label">记录范围</span>
<select name="record_scope">
{% for option in record_scope_options %}
<option value="{{ option.value }}" {% if option.value == record_scope %}selected{% endif %}>{{ option.label }}</option>
{% endfor %}
</select>
</label>
<button class="primary-button" type="submit">应用</button>
<a class="secondary-button" href="{{ reset_url }}">重置</a>
</div>
</div>
</form>
</section>
<section class="mission-board-shell top-gap">
<div class="mission-board-main">
{% if status_groups %}
{% for group in status_groups %}
<section class="panel mission-group-panel">
<div class="mission-group-header">
<div>
<p class="eyebrow">状态分组</p>
<h2>{{ group.title }}</h2>
</div>
<span class="mission-group-count">{{ group['items']|length }} 项资产</span>
</div>
<div class="mission-card-grid">
{% for item in group['items'] %}
<article class="mission-asset-card mission-tone-{{ group.accent }}">
<div class="mission-card-top">
<div>
<h3>{{ item.name }}</h3>
<p class="small-muted mission-type">{{ item.asset_type }}</p>
</div>
<span class="mission-status-pill">{{ item.record_status }}</span>
</div>
<div class="mission-meta-grid">
<div class="mission-meta-item">
<dt>Location</dt>
<dd>{{ item.location }}</dd>
</div>
<div class="mission-meta-item">
<dt>Mission</dt>
<dd>{{ item.mission }}</dd>
</div>
<div class="mission-meta-item">
<dt>State Window</dt>
<dd>{{ item.state_window }}</dd>
</div>
<div class="mission-meta-item">
<dt>Next Event</dt>
<dd>{{ item.next_event }}</dd>
</div>
</div>
<p class="mission-summary-text">{{ item.summary }}</p>
<div class="mission-card-foot">
<a class="table-link" href="{{ url_for('web.asset_list', q=item.name
) }}">查看任务资产</a>
</div>
</article>
{% endfor %}
</div>
</section>
{% endfor %}
{% else %}
<section class="panel empty-state compact-empty">
<h2>当前筛选条件下没有资产</h2>
</section>
{% endif %}
</div>
<div class="mission-board-side">
{% include "_mission_upcoming_events.html" %}
</div>
</section>
{% endblock %}