{#- The macro library. Import it with {% import "_macros.html" as m with context %}. Components live in templates/components/*.html (each documented at the top of its file) and are re-exported here, so m.button(...) and friends work. Override one by putting a template of the same name, such as components/button.html, in your templates_dir. icon.html icon button.html button, icon_button, button_classes badge.html badge card.html card menu.html popover, menu, menu_item, menu_separator, menu_label dialog.html dialog, dialog_footer feedback.html empty_state, stat, alert misc.html tooltip, kbd date.html date_input The macros below render admin-specific pieces (cells, row actions, filters) and need the request context. -#} {% import "components/icon.html" as _icon_module %} {% import "components/button.html" as _button_module %} {% import "components/badge.html" as _badge_module %} {% import "components/card.html" as _card_module %} {% import "components/menu.html" as _menu_module %} {% import "components/dialog.html" as _dialog_module %} {% import "components/feedback.html" as _feedback_module %} {% import "components/misc.html" as _misc_module %} {% import "components/date.html" as _date_module %} {% set icon = _icon_module.icon %} {% set button = _button_module.button %} {% set icon_button = _button_module.icon_button %} {% set button_classes = _button_module.button_classes %} {% set badge = _badge_module.badge %} {% set card = _card_module.card %} {% set popover = _menu_module.popover %} {% set menu = _menu_module.menu %} {% set menu_item = _menu_module.menu_item %} {% set menu_separator = _menu_module.menu_separator %} {% set menu_label = _menu_module.menu_label %} {% set dialog = _dialog_module.dialog %} {% set dialog_footer = _dialog_module.dialog_footer %} {% set empty_state = _feedback_module.empty_state %} {% set stat = _feedback_module.stat %} {% set alert = _feedback_module.alert %} {% set tooltip = _misc_module.tooltip %} {% set kbd = _misc_module.kbd %} {% set date_input = _date_module.date_input %} {% macro cell(view, field, value, link=True) -%} {%- if field.name in view.formatted -%} {{ value }} {%- elif value is none -%} — {%- elif field.kind == "relation" -%} {%- if field.multiple -%} {{ value|length }} {%- else -%} {%- set target = admin.view_for(field.target) -%} {%- if not link -%} {{ target.display(value) if target else admin.display(value) }} {%- elif target and target.can_view -%} {{ target.display(value) }} {%- else -%} {{ admin.display(value) }} {%- endif -%} {%- endif -%} {%- elif field.kind == "bool" and field.name in view.badges -%} {{ badge('Yes' if value else 'No', view.badge_tone(field.name, 'true' if value else 'false')) }} {%- elif field.kind == "bool" -%} {{ icon('check' if value else 'x', 'size-4 inline') }} {%- elif field.kind == "enum" -%} {%- set raw = value.value if value.value is defined else value -%} {{ badge(raw, view.badge_tone(field.name, raw)) }} {%- elif field.kind in ("datetime", "date", "time") -%} {{ value.isoformat(" ", "minutes") if field.kind == "datetime" else value.isoformat() }} {%- else -%} {{ value }} {%- endif -%} {%- endmacro %} {% macro delete_menu_item(view, obj) -%} {%- set payload = { "title": "Delete " ~ view.name|lower ~ "?", "message": "Delete " ~ view.display(obj) ~ "? This cannot be undone.", "danger": true, "action": admin.url(request, '/' ~ view.identity ~ '/' ~ view.pk_of(obj) ~ '/delete'), } -%} {{ menu_item("Delete", icon="trash-2", tone="danger", attrs={"@click": "close(true); $dispatch('confirm', " ~ (payload|tojson|forceescape) ~ ")"}) }} {%- endmacro %} {% macro bulk_bar(view) -%} {%- set bulk_actions = view.permitted_actions(request, bulk=True) -%} {%- if bulk_actions or view.export_formats %}
{%- endif -%} {%- endmacro %} {% macro action_button(view, action, obj=none, origin="detail", class="") -%} {%- set url = admin.url(request, '/' ~ view.identity ~ ('/' ~ view.pk_of(obj) if obj is not none else '') ~ '/action/' ~ action.name) -%} {%- if action.method == "POST" -%} {%- elif obj is none -%} {%- else -%} window.location.assign($el.href)})"{% endif %}>{{ action.label }} {%- endif -%} {%- endmacro %} {% macro filter_summary(filter, value, options) -%} {%- if filter.kind == "range" -%} {%- if value.min and value.max -%}{{ value.min }}–{{ value.max }} {%- elif value.min -%}≥ {{ value.min }} {%- elif value.max -%}≤ {{ value.max }} {%- endif -%} {%- if value.empty %}{{ ' + Empty' if (value.min or value.max) else 'Empty' }}{% endif -%} {%- elif filter.kind == "text" -%} {%- if value.values -%}“{{ value.values[0] }}”{%- endif -%} {%- if value.empty %}{{ ' + Empty' if value.values else 'Empty' }}{% endif -%} {%- else -%} {%- set names = dict(filter.choices) -%} {%- if filter.kind == "relation" -%}{%- set _ = names.update(dict(options)) -%}{%- endif -%} {%- if value.values|length > 2 -%} {{ value.values|length }} selected {%- elif value.values -%} {%- for raw in value.values %}{{ badge(names.get(raw, raw)) }}{% if not loop.last %} {% endif %}{% endfor -%} {%- endif -%} {%- if value.empty %}{{ ' + Empty' if value.values else 'Empty' }}{% endif -%} {%- endif -%} {%- endmacro %} {% macro filter_panel(filter, value, options) -%} {%- if filter.kind in ("choice", "relation") %}