fix(content): add missing datetimeformat filter; move preview column first
- Add _datetimeformat Jinja2 filter to _render_pattern() — templates
use {{ 'now' | datetimeformat('%Y') }} but the filter was never
registered, causing "No filter named 'datetimeformat'" on preview.
- Move Preview button to first column in template detail data table
so it's visible without scrolling on wide tables.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -81,24 +81,24 @@
|
|||||||
<table class="table text-sm">
|
<table class="table text-sm">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
<th></th>
|
||||||
{% for col in columns %}
|
{% for col in columns %}
|
||||||
<th>{{ col.name }}</th>
|
<th>{{ col.name }}</th>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<th>Preview</th>
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for row in sample_rows %}
|
{% for row in sample_rows %}
|
||||||
<tr>
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="{{ url_for('admin.template_preview', slug=config_data.slug, row_key=row[config_data.natural_key]) }}"
|
||||||
|
class="btn-outline btn-sm">Preview</a>
|
||||||
|
</td>
|
||||||
{% for col in columns %}
|
{% for col in columns %}
|
||||||
<td class="mono" style="max-width:200px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap">
|
<td class="mono" style="max-width:200px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap">
|
||||||
{{ row[col.name] }}
|
{{ row[col.name] }}
|
||||||
</td>
|
</td>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<td>
|
|
||||||
<a href="{{ url_for('admin.template_preview', slug=config_data.slug, row_key=row[config_data.natural_key]) }}"
|
|
||||||
class="btn-outline btn-sm">Preview</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
@@ -133,10 +133,22 @@ def _validate_table_name(data_table: str) -> None:
|
|||||||
|
|
||||||
# ── Rendering helpers ────────────────────────────────────────────────────────
|
# ── Rendering helpers ────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
def _datetimeformat(value: str, fmt: str = "%Y-%m-%d") -> str:
|
||||||
|
"""Jinja2 filter: format a date string (or 'now') with strftime."""
|
||||||
|
from datetime import datetime, UTC
|
||||||
|
|
||||||
|
if value == "now":
|
||||||
|
dt = datetime.now(UTC)
|
||||||
|
else:
|
||||||
|
dt = datetime.fromisoformat(value)
|
||||||
|
return dt.strftime(fmt)
|
||||||
|
|
||||||
|
|
||||||
def _render_pattern(pattern: str, context: dict) -> str:
|
def _render_pattern(pattern: str, context: dict) -> str:
|
||||||
"""Render a Jinja2 pattern string with context variables."""
|
"""Render a Jinja2 pattern string with context variables."""
|
||||||
env = Environment()
|
env = Environment()
|
||||||
env.filters["slugify"] = slugify
|
env.filters["slugify"] = slugify
|
||||||
|
env.filters["datetimeformat"] = _datetimeformat
|
||||||
return env.from_string(pattern).render(**context)
|
return env.from_string(pattern).render(**context)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user