137 lines
7.2 KiB
HTML
137 lines
7.2 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_list') }}" class="mission-toolbar-grid">
|
|
<input type="hidden" name="sim_time" value="{{ simulation_time_input }}">
|
|
|
|
<div class="mission-toolbar-block mission-toolbar-span-two">
|
|
<span class="field-label">Mission Label 检索与筛选</span>
|
|
<div class="mission-filter-grid">
|
|
<label>
|
|
<span class="field-label">Mission Label 搜索</span>
|
|
<input type="search" name="q" value="{{ search_term }}" placeholder="支持模糊搜索 Mission Label">
|
|
</label>
|
|
<label>
|
|
<span class="field-label">Asset</span>
|
|
<select name="asset_id">
|
|
<option value="">全部资产</option>
|
|
{% for option in asset_options %}
|
|
<option value="{{ option.value }}" {% if option.value == asset_id_filter %}selected{% endif %}>{{ option.label }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</label>
|
|
<label>
|
|
<span class="field-label">Mission Label</span>
|
|
<select name="mission_label">
|
|
<option value="">全部 Mission Label</option>
|
|
{% for option in mission_label_options %}
|
|
<option value="{{ option }}" {% if option == mission_label_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>
|
|
{{ datetime_picker_field('开始', 'start', range_start_input, field_id='mission-list-start') }}
|
|
{{ datetime_picker_field('结束', 'end', range_end_input, field_id='mission-list-end') }}
|
|
<button class="primary-button" type="submit">应用</button>
|
|
<a class="secondary-button" href="{{ url_for('web.mission_list', sim_time=simulation_time_input) }}">重置</a>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</section>
|
|
|
|
<section class="panel panel-wide top-gap">
|
|
<div class="mission-filter-pill-row">
|
|
<span class="mission-filter-pill"><strong>Asset:</strong> {{ selected_asset_name }}</span>
|
|
<span class="mission-filter-pill"><strong>Mission:</strong> {{ mission_label_filter or (search_term or '全部') }}</span>
|
|
<span class="mission-filter-pill"><strong>地点:</strong> {{ location_filter or '全部地点' }}</span>
|
|
<span class="mission-filter-pill"><strong>日志:</strong> {{ filtered_entry_count }} / {{ total_entry_count }}</span>
|
|
</div>
|
|
</section>
|
|
|
|
{% if mission_groups %}
|
|
{% for group in mission_groups %}
|
|
<section class="panel mission-group-panel top-gap">
|
|
<div class="mission-group-header">
|
|
<div>
|
|
<p class="eyebrow">Mission Label</p>
|
|
<h2>{{ group.mission_label }}</h2>
|
|
<p class="mission-group-subtitle">{{ group.status_label }} · {{ group.asset_count }} 个 Asset · {{ group.entry_count }} 条日志</p>
|
|
</div>
|
|
<span class="mission-group-count">最近条目 {{ group.latest_timestamp }}</span>
|
|
</div>
|
|
|
|
<div class="mission-filter-pill-row">
|
|
<span class="mission-filter-pill"><strong>Assets:</strong> {{ group.asset_names|join(' · ') }}</span>
|
|
<span class="mission-filter-pill"><strong>地点:</strong> {{ group.locations|join(' · ') }}</span>
|
|
</div>
|
|
|
|
<div class="table-shell top-gap">
|
|
<table class="data-table compact-table mission-log-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Time</th>
|
|
<th>Asset</th>
|
|
<th>Entry</th>
|
|
<th>Location</th>
|
|
<th>Action</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for entry in group.entries %}
|
|
<tr>
|
|
<td class="two-line-cell">
|
|
<strong class="table-title">{{ entry.timestamp }}</strong>
|
|
{% if entry.end_timestamp %}
|
|
<div class="table-subline">→ {{ entry.end_timestamp }}</div>
|
|
{% endif %}
|
|
<div class="table-subline">{{ entry.status_label }}</div>
|
|
</td>
|
|
<td class="two-line-cell">
|
|
<strong><a class="table-link" href="{{ url_for('web.asset_detail', asset_id=entry.asset.id, sim_time=simulation_time_input) }}">{{ entry.asset_name }}</a></strong>
|
|
<div class="table-subline">{{ entry.asset_type }}</div>
|
|
</td>
|
|
<td class="two-line-cell">
|
|
<strong class="table-title">{{ entry.title }}</strong>
|
|
<div class="table-subline">{{ entry.mode_label }}</div>
|
|
<div class="table-subline clamp-line">{{ entry.summary }}</div>
|
|
{% if entry.state_labels or entry.mission_labels %}
|
|
<div class="mission-asset-chip-row mission-entry-label-row">
|
|
{% for label in entry.state_labels %}<span class="chip">{{ label }}</span>{% endfor %}
|
|
{% for label in entry.mission_labels %}<span class="chip">{{ label }}</span>{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ entry.location }}</td>
|
|
<td>
|
|
<div class="table-actions">
|
|
<a class="table-link" href="{{ url_for('web.asset_detail', asset_id=entry.asset.id, sim_time=simulation_time_input) }}">查看资产</a>
|
|
<a class="table-link" href="{{ url_for('web.asset_entry_edit', asset_id=entry.asset.id, entry_id=entry.entry_id, sim_time=simulation_time_input) }}">编辑条目</a>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
{% endfor %}
|
|
{% else %}
|
|
<section class="panel empty-state compact-empty top-gap">
|
|
<h2>当前筛选条件下没有 Mission 日志</h2>
|
|
<p>调整 Asset、时间、Mission Label、地点筛选,或者清空 Mission Label 搜索后重试。</p>
|
|
</section>
|
|
{% endif %}
|
|
{% endblock %} |