119 lines
5.6 KiB
HTML
119 lines
5.6 KiB
HTML
{# The column-presentation page body — crate::pages::admin::table_definition::ui::PresentationFragment. #}
|
|
{% include "pages/admin/table_definition/feedback.html" %}
|
|
|
|
{% if page.table_is_writable() %}
|
|
{% if let Some(detail) = page.detail %}
|
|
{# One form per column, each carrying its own column id: an alias is never
|
|
posted apart from the column it was typed into. #}
|
|
<div class="presentation-layout">
|
|
<section class="panel presentation-panel">
|
|
<h2>{{ nav.tr("td-rename-column") }}</h2>
|
|
<p class="hint">{{ nav.tr("td-rename-hint") }}</p>
|
|
<div class="alias-list">
|
|
<div class="alias-list-head" aria-hidden="true">
|
|
<span>{{ nav.tr("td-current-alias") }}</span>
|
|
<span></span>
|
|
<span>{{ nav.tr("td-new-name") }}</span>
|
|
<span></span>
|
|
</div>
|
|
{% for column in detail.columns %}
|
|
{% if column.renameable %}
|
|
<form class="alias-row" hx-post="/admin/tables/presentation/alias"
|
|
hx-target="#table-panel" hx-swap="innerHTML">
|
|
<input type="hidden" name="profile" value="{{ page.selection.profile }}">
|
|
<input type="hidden" name="table" value="{{ page.selection.table }}">
|
|
<input type="hidden" name="expected_row_version" value="{{ detail.row_version }}">
|
|
<input type="hidden" name="column_id" value="{{ column.column_id }}">
|
|
<code class="alias-current">{{ column.name }}</code>
|
|
<span class="alias-arrow" aria-hidden="true">→</span>
|
|
<input name="alias" aria-label="{{ nav.tr("td-new-name") }}: {{ column.name }}"
|
|
placeholder="{{ nav.tr("td-new-name") }}" required>
|
|
<button type="submit">{{ nav.tr("td-rename-button") }}</button>
|
|
</form>
|
|
{% else %}
|
|
<div class="alias-row alias-row-locked">
|
|
<code class="alias-current">{{ column.name }}</code>
|
|
<span class="locked-label">{{ nav.tr("td-alias-locked") }}</span>
|
|
</div>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</div>
|
|
</section>
|
|
|
|
{# Ordering is staged in the browser and submitted as one id-only form.
|
|
Aliases are still absent, so saving an order cannot rename anything. #}
|
|
<section class="panel presentation-panel">
|
|
<h2>{{ nav.tr("td-order-heading") }}</h2>
|
|
<p class="hint">{{ nav.tr("td-order-hint") }}</p>
|
|
<form class="order-editor" data-order-editor
|
|
data-clean-text="{{ nav.tr("td-order-clean") }}"
|
|
data-dirty-text="{{ nav.tr("td-order-unsaved") }}"
|
|
hx-post="/admin/tables/presentation/order"
|
|
hx-target="#table-panel" hx-swap="innerHTML">
|
|
<input type="hidden" name="profile" value="{{ page.selection.profile }}">
|
|
<input type="hidden" name="table" value="{{ page.selection.table }}">
|
|
<input type="hidden" name="expected_row_version" value="{{ detail.row_version }}">
|
|
<ol class="column-order" data-order-list>
|
|
{% for column in detail.columns %}
|
|
<li data-order-item data-column-id="{{ column.column_id }}">
|
|
<input type="hidden" name="column_ids" value="{{ column.column_id }}">
|
|
<button class="drag-handle" type="button" data-drag-handle
|
|
aria-label="{{ nav.tr("td-drag-column") }}: {{ column.name }}"
|
|
title="{{ nav.tr("td-drag-column") }}">
|
|
<span aria-hidden="true">⠿</span>
|
|
</button>
|
|
<span class="order-position" aria-hidden="true">{{ loop.index }}</span>
|
|
<code class="order-name">{{ column.name }}</code>
|
|
</li>
|
|
{% endfor %}
|
|
</ol>
|
|
<div class="order-actions">
|
|
<span class="order-status" data-order-status aria-live="polite">{{ nav.tr("td-order-clean") }}</span>
|
|
<button class="secondary" type="button" data-order-reset disabled>{{ nav.tr("td-order-reset") }}</button>
|
|
<button type="submit" data-order-save disabled>{{ nav.tr("td-order-save") }}</button>
|
|
</div>
|
|
</form>
|
|
</section>
|
|
</div>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{% if let Some(detail) = page.detail %}
|
|
<section class="panel">
|
|
<h2>{{ nav.tr("td-columns-now") }} <span class="count">{{ detail.columns.len() }}</span></h2>
|
|
<table class="builder-table">
|
|
<thead><tr><th>{{ nav.tr("td-col-column") }}</th><th>{{ nav.tr("td-col-type") }}</th><th>{{ nav.tr("td-col-notes") }}</th></tr></thead>
|
|
<tbody>
|
|
{% for column in detail.columns %}
|
|
<tr>
|
|
<td><code>{{ column.name }}</code></td>
|
|
<td>{{ column.field_type }}{% if !column.sql_type.is_empty() %} <small class="hint">{{ column.sql_type }}</small>{% endif %}</td>
|
|
<td>
|
|
{%- for flag in column.flags(nav.locale) %}<span class="tag">{{ flag }}</span>{% endfor -%}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
|
|
{% if !detail.scripts.is_empty() %}
|
|
<h3 class="panel-subhead">{{ nav.tr("td-scripts") }}</h3>
|
|
<table class="builder-table">
|
|
<thead><tr><th>{{ nav.tr("td-col-target-column") }}</th><th>{{ nav.tr("td-col-type") }}</th><th>{{ nav.tr("td-col-description") }}</th></tr></thead>
|
|
<tbody>
|
|
{% for script in detail.scripts %}
|
|
<tr>
|
|
<td><code>{{ script.target_column }}</code></td>
|
|
<td>{{ script.target_column_type }}</td>
|
|
<td>
|
|
{{ script.description }}
|
|
<details><summary>{{ nav.tr("td-source") }}</summary><pre class="sql-preview">{{ script.script }}</pre></details>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
</section>
|
|
{% endif %}
|