{% extends "admin_base.html" %} {% import "macros/admin_management_header.html" as mh %} {% import "macros/modal.html" as modal %} {% import "macros/loading_spinner.html" as spinner %} {% block extra_head %} {% endblock %} {% block page_title %}Relational Sheets{% endblock %} {% block admin_content %}
{{ mh::management_header_simple( title="Relational Sheets", subtitle="Define schema-agnostic sheet profiles. Open the workbook for Excel-style tab navigation.", actions_html=' Open workbook ' ) }}
{% for p in profiles %} {% else %} {{ spinner::table_skeleton(colspan=5, lines=2, label="Loading profiles…") }} {% endfor %}
Profile Slug Description Updated
{{ p.title }} {{ p.slug }} {{ p.description | default(value="—") }} {% if p.updated_at %} {{ p.updated_at | date_in_tz(timezone=timezone, format="%Y-%m-%d %H:%M") }} {% else %}—{% endif %} Open sheet
{{ modal::modal(id="rs-profile-modal", title="Sheet profile", body_html='

SQL that powers the sheet. Use column aliases matching your row key and editable fields.

Define visible columns, editability, validation, and write mappings.

Full profile JSON (updates as you edit tabs).

', footer_html='') }}
{% endblock %} {% block scripts %} {% endblock %}