crudkit/crudkit/html/templates/crudkit/_macros.html
2025-08-26 13:28:01 -05:00

86 lines
3.9 KiB
HTML

{% macro options(items, value_attr="id", label_path="name", getp=None) -%}
{%- for obj in items -%}
<option value="{{ getp(obj, value_attr) }}">{{ getp(obj, label_path) }}</option>
{%- endfor -%}
{% endmacro %}
{% macro lis(items, label_path="name", sublabel_path=None, getp=None) -%}
{%- for obj in items -%}
<li data-id="{{ obj.id }}">
<div class="li-main">{{ getp(obj, label_path) }}</div>
{%- if sublabel_path %}
<div class="li-sub">{{ getp(obj, sublabel_path) }}</div>
{%- endif %}
</li>
{%- else -%}
<li class="empty"><em>No results.</em></li>
{%- endfor -%}
{% endmacro %}
{% macro rows(items, fields, getp=None) -%}
{%- for obj in items -%}
<tr id="row-{{ obj.id }}">
{%- for f in fields -%}
<td data-field="{{ f }}">{{ getp(obj, f) }}</td>
{%- endfor -%}
</tr>
{%- else -%}
<tr><td colspan="{{ fields|length }}"><em>No results.</em></td></tr>
{%- endfor -%}
{%- endmacro %}
{% macro pager(model, page, pages, per_page, sort, filters) -%}
<nav class="pager">
{%- if page > 1 -%}
<a hx-get="/{{ model }}/frag/rows?page={{ page-1 }}&per_page={{ per_page }}{% if sort %}&sort={{ sort }}{% endif %}{% for k,v in filters.items() %}&{{k}}={{v}}{% endfor %}"
hx-target="#rows" hx-push-url="true">Prev</a>
{%- endif -%}
<span>Page {{ page }} / {{ pages }}</span>
{%- if page < pages -%}
<a hx-get="/{{ model }}/frag/rows?page={{ page+1 }}&per_page={{ per_page }}{% if sort %}&sort={{ sort }}{% endif %}{% for k,v in filters.items() %}&{{k}}={{v}}{% endfor %}"
hx-target="#rows" hx-push-url="true">Next</a>
{%- endif -%}
</nav>
{%- endmacro %}
{% macro form(schema, action, method="POST", obj_id=None, hx=False, csrf_token=None) -%}
<form action="{{ action }}" method="post"
{%- if hx %}
hx-{{ "patch" if obj_id else "post" }}="{{ action }}"
hx-target="closest dialog, #modal-body, body"
hx-swap="innerHTML"
{%- endif -%}>
{%- if csrf_token %}<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">{% endif -%}
{%- if obj_id %}<input type="hidden" name="id" value="{{ obj_id }}">{% endif -%}
{%- for f in schema -%}
<div class="field" data-name="{{ f.name }}">
<label>{{ f.name|replace("_", " ")|title }}
{%- if f.type == "textarea" -%}
<textarea name="{{ f.name }}" {%- if f.required %} required{% endif %}{% if f.maxlength %} maxlength="{{ f.maxlength }}"{% endif %}>{{ f.value or "" }}</textarea>
{%- elif f.type == "select" -%}
<select name="{{ f.name }}" {%- if f.required %} required{% endif %}>
<option value="">---</option>
{% for val, lbl in f.choices %}
<option value="{{ val }}" {{ "selected" if (f.value == val) else "" }}>{{ lbl }}</option>
{% endfor %}
</select>
{%- elif f.type == "checkbox" -%}
<input type="checkbox" name="{{ f.name }}" value="1" {{ "checked" if f.value else "" }}>
{%- else -%}
<input type="{{ f.type }}" name="{{ f.name }}"
value="{{ f.value if f.value is not none else '' }}"
{%- if f.required %} required{% endif %}
{%- if f.maxlength %} maxlength="{{ f.maxlength }}"{% endif %}>
{%- endif -%}
</label>
{%- if f.help %}<div class="help">{{ f.help }}</div>{% endif -%}
</div>
{%- endfor -%}
<div class="actions">
<button type="submit">Save</button>
</div>
</form>
{%- endmacro %}