- Size all table columns to fit content (em-based) rather than loose percentages - Add white-space:nowrap to groups header and last-run cells - Sticky topbar and panel header so New Module button stays visible while scrolling - Scope min-width:0 to label.field inputs so they don't blow past two-col grid borders Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
74 lines
3.5 KiB
HTML
74 lines
3.5 KiB
HTML
{% extends "base.html" %}
|
|
{% set section = "modules" %}
|
|
{% block title %}Modules — Pipekit{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="panel">
|
|
<header>
|
|
Modules
|
|
<span class="subtitle">{{ total }} total · grouped by source connection</span>
|
|
<span style="margin-left:auto">
|
|
<a class="btn" href="/wizard">New module…</a>
|
|
</span>
|
|
</header>
|
|
<div class="body tight">
|
|
{% if grouped %}
|
|
{% for conn_name, driver_label, modules in grouped %}
|
|
<div class="group-head">{{ conn_name }} <span style="opacity:.7">({{ driver_label }})</span></div>
|
|
<table class="grid">
|
|
<thead>
|
|
<tr>
|
|
<th style="width:12em">name</th>
|
|
<th style="width:7em">strategy</th>
|
|
<th style="width:14em">dest</th>
|
|
<th style="width:13em">groups</th>
|
|
<th style="width:11em;white-space:nowrap">last run</th>
|
|
<th style="width:8em">status</th>
|
|
<th style="width:6em">rows</th>
|
|
<th style="width:12em"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for m in modules %}
|
|
<tr>
|
|
<td><a href="/modules/{{ m.id }}"><strong>{{ m.name }}</strong></a></td>
|
|
<td class="mono">{{ m.merge_strategy }}</td>
|
|
<td class="mono">{{ m.dest_table }}</td>
|
|
<td>
|
|
{% for g in m.groups %}
|
|
<a href="/groups/{{ g.group_id }}" class="tag">{{ g.group_name }}</a>
|
|
{% endfor %}
|
|
</td>
|
|
<td class="mono" style="white-space:nowrap">{{ m.last_run_at | localtime }}</td>
|
|
{% with module=m %}{% include "_module_status_pill.html" %}{% endwith %}
|
|
<td class="mono">{{ m.last_row_count if m.last_row_count is not none else "—" }}</td>
|
|
<td style="text-align:right">
|
|
<form class="inline"
|
|
hx-post="/modules/{{ m.id }}/run"
|
|
hx-target="#module-status-{{ m.id }}"
|
|
hx-swap="outerHTML">
|
|
<button type="submit">Run</button>
|
|
</form>
|
|
<form class="inline"
|
|
hx-post="/modules/{{ m.id }}/run"
|
|
hx-target="#module-status-{{ m.id }}"
|
|
hx-swap="outerHTML">
|
|
<input type="hidden" name="dry_run" value="1">
|
|
<button type="submit" class="ghost">Dry run</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endfor %}
|
|
{% else %}
|
|
<div class="empty">
|
|
No modules yet.<br>
|
|
<a class="btn" href="/wizard" style="margin-top:0.7rem; display:inline-block">Create one</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|