86 lines
3.9 KiB
HTML
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 %}
|