Own events domain templates (Phase 6)
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 2m6s

Calendar, day, entry, slot, ticket templates + date macro moved
from shared to events/templates/. Cross-domain copies: post header,
post admin entries, cart mini.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
giles
2026-02-24 16:55:50 +00:00
parent 2a723af201
commit 77c5fc716a
44 changed files with 733 additions and 1 deletions

2
shared

Submodule shared updated: 65c4989d08...322ae481ee

View File

@@ -0,0 +1,12 @@
{% macro description(calendar, oob=False) %}
<div
id="calendar-description-title"
{% if oob %}
hx-swap-oob="outerHTML"
{% endif %}
class="text-base font-normal break-words whitespace-normal min-w-0 break-all w-full text-center block"
>
{{ calendar.description or ''}}
</div>
{% endmacro %}

View File

@@ -0,0 +1,22 @@
{% extends "oob_elements.html" %}
{# OOB elements for post admin page #}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('post-header-child', 'calendar-header-child', '_types/calendar/header/_header.html')}}
{% from '_types/post/header/_header.html' import header_row with context %}
{{ header_row(oob=True) }}
{% endblock %}
{% block mobile_menu %}
{% include '_types/calendar/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/calendar/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,2 @@
{% from 'macros/admin_nav.html' import placeholder_nav %}
{{ placeholder_nav() }}

View File

@@ -0,0 +1,25 @@
{% extends 'oob_elements.html' %}
{# OOB elements for calendar admin page #}
{# Import shared OOB macros #}
{% from '_types/root/header/_oob.html' import root_header_start, root_header_end with context %}
{% from '_types/root/_oob_menu.html' import mobile_menu with context %}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('calendar-header-child', 'calendar-admin-header-child', '_types/calendar/admin/header/_header.html')}}
{% from '_types/calendar/header/_header.html' import header_row with context %}
{{header_row(oob=True)}}
{% endblock %}
{% block mobile_menu %}
{% include '_types/calendar/admin/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/calendar/admin/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,24 @@
{% extends '_types/calendar/index.html' %}
{% import 'macros/layout.html' as layout %}
{% block calendar_header_child %}
{% from '_types/root/_n/macros.html' import header with context %}
{% call header() %}
{% from '_types/calendar/admin/header/_header.html' import header_row with context %}
{{ header_row() }}
<div id="calendar-admin-header-child">
{% block calendar_admin_header_child %}
{% endblock %}
</div>
{% endcall %}
{% endblock %}
{% block _main_mobile_menu %}
{% include '_types/calendar/admin/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/calendar/admin/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,2 @@
{% from 'macros/admin_nav.html' import placeholder_nav %}
{{ placeholder_nav() }}

View File

@@ -0,0 +1,28 @@
{% extends 'oob_elements.html' %}
{# OOB elements for HTMX navigation - all elements that need updating #}
{% from '_types/root/_oob_menu.html' import mobile_menu with context %}
{# Header with app title - includes cart-mini, navigation, and market-specific header #}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('post-admin-header-child', 'calendars-header-child', '_types/calendars/header/_header.html')}}
{% from '_types/post/admin/header/_header.html' import header_row with context %}
{{ header_row(oob=True) }}
{% endblock %}
{% block mobile_menu %}
{% include '_types/calendars/_nav.html' %}
{% endblock %}
{% block content %}
{% include "_types/calendars/_main_panel.html" %}
{% endblock %}

View File

@@ -0,0 +1,45 @@
{% macro mini(oob=False, count=None) %}
<div id="cart-mini" {% if oob %}hx-swap-oob="{{oob}}"{% endif %} >
{# cart_count is set by the context processor in all apps.
Cart app computes it from g.cart + calendar_cart_entries;
other apps get it from the cart internal API.
count param allows explicit override when macro is imported without context. #}
{% if count is not none %}
{% set _count = count %}
{% elif cart_count is defined and cart_count is not none %}
{% set _count = cart_count %}
{% elif cart is defined and cart is not none %}
{% set _count = (cart | sum(attribute="quantity")) + ((calendar_cart_entries | length) if calendar_cart_entries else 0) %}
{% else %}
{% set _count = 0 %}
{% endif %}
{% if _count == 0 %}
<div class="h-12 w-12 rounded-full overflow-hidden border border-stone-300 flex-shrink-0">
<a
href="{{ blog_url('/') }}"
class="h-full w-full font-bold text-5xl flex-shrink-0 flex flex-row items-center gap-1"
>
<img
src="{{ site().logo }}"
class="h-full w-full rounded-full object-cover border border-stone-300 flex-shrink-0"
>
</a>
</div>
{% else %}
<a
href="{{ cart_url('/') }}"
class="relative inline-flex items-center justify-center text-stone-700 hover:text-emerald-700"
>
<i class="fa fa-shopping-cart text-5xl" aria-hidden="true"></i>
<span
class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 inline-flex items-center justify-center rounded-full bg-emerald-600 text-white text-sm w-5 h-5"
>
{{ _count }}
</span>
</a>
{% endif %}
</div>
{% endmacro %}

View File

@@ -0,0 +1,28 @@
<section id="day-entries" class="{{styles.list_container}}">
<table class="w-full text-sm border table-fixed">
<thead class="bg-stone-100">
<tr>
<th class="p-2 text-left w-2/6">Name</th>
<th class="text-left p-2 w-1/6">Slot/Time</th>
<th class="text-left p-2 w-1/6">State</th>
<th class="text-left p-2 w-1/6">Cost</th>
<th class="text-left p-2 w-1/6">Tickets</th>
<th class="text-left p-2 w-1/6">Actions</th>
</tr>
</thead>
<tbody>
{% for entry in day_entries %}
{% include '_types/day/_row.html' %}
{% else %}
<tr><td colspan="6" class="p-3 text-stone-500">No entries yet.</td></tr>
{% endfor %}
</tbody>
</table>
<div id="entry-add-container" class="mt-4">
{% include '_types/day/_add_button.html' %}
</div>
</section>

View File

@@ -0,0 +1,18 @@
{% extends "oob_elements.html" %}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('calendar-header-child', 'day-header-child', '_types/day/header/_header.html')}}
{% from '_types/calendar/header/_header.html' import header_row with context %}
{{ header_row(oob=True) }}
{% endblock %}
{% block mobile_menu %}
{% include '_types/day/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/day/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,2 @@
{% from 'macros/admin_nav.html' import placeholder_nav %}
{{ placeholder_nav() }}

View File

@@ -0,0 +1,2 @@
{% from 'macros/admin_nav.html' import placeholder_nav %}
{{ placeholder_nav() }}

View File

@@ -0,0 +1,25 @@
{% extends 'oob_elements.html' %}
{# OOB elements for calendar admin page #}
{# Import shared OOB macros #}
{% from '_types/root/header/_oob.html' import root_header_start, root_header_end with context %}
{% from '_types/root/_oob_menu.html' import mobile_menu with context %}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('day-header-child', 'day-admin-header-child', '_types/day/admin/header/_header.html')}}
{% from '_types/calendar/header/_header.html' import header_row with context %}
{{header_row(oob=True)}}
{% endblock %}
{% block mobile_menu %}
{% include '_types/day/admin/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/day/admin/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,24 @@
{% extends '_types/day/index.html' %}
{% import 'macros/layout.html' as layout %}
{% import 'macros/links.html' as links %}
{% block day_header_child %}
{% from '_types/root/_n/macros.html' import header with context %}
{% call header() %}
{% from '_types/day/admin/header/_header.html' import header_row with context %}
{{ header_row() }}
<div id="day-admin-header-child">
{% block day_admin_header_child %}
{% endblock %}
</div>
{% endcall %}
{% endblock %}
{% block _main_mobile_menu %}
{% include '_types/day/admin/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/day/admin/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,18 @@
{% extends '_types/calendar/index.html' %}
{% block calendar_header_child %}
{% from '_types/root/_n/macros.html' import index_row with context %}
{% call index_row('day-header-child', '_types/day/header/_header.html') %}
{% block day_header_child %}
{% endblock %}
{% endcall %}
{% endblock %}
{% block _main_mobile_menu %}
{% include '_types/day/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/day/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,18 @@
{% extends "oob_elements.html" %}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('day-header-child', 'entry-header-child', '_types/entry/header/_header.html')}}
{% from '_types/day/header/_header.html' import header_row with context %}
{{ header_row(oob=True) }}
{% endblock %}
{% block mobile_menu %}
{% include '_types/entry/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/entry/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,9 @@
{% include '_types/entry/_options.html' %}
<div id="entry-title-{{entry.id}}" hx-swap-oob="innerHTML">
{% include '_types/entry/_title.html' %}
</div>
<div id="entry-state-{{entry.id}}" hx-swap-oob="innerHTML">
{% include '_types/entry/_state.html' %}
</div>

View File

@@ -0,0 +1,15 @@
{% if entry.state %}
<span class="inline-flex items-center rounded-full px-2 py-0.5 text-[11px] font-medium
{% if entry.state == 'confirmed' %}
bg-emerald-100 text-emerald-800
{% elif entry.state == 'provisional' %}
bg-amber-100 text-amber-800
{% elif entry.state == 'ordered' %}
bg-blue-100 text-blue-800
{% else %}
bg-stone-100 text-stone-700
{% endif %}
">
{{ entry.state|capitalize }}
</span>
{% endif %}

View File

@@ -0,0 +1,5 @@
{% from 'macros/date.html' import t %}
<div class="text-sm text-gray-600">
{{ t(entry.start_at) }}
{% if entry.end_at %} → {{ t(entry.end_at) }}{% endif %}
</div>

View File

@@ -0,0 +1,3 @@
<i class="fa fa-clock"></i>
{{ entry.name }}
{% include '_types/entry/_state.html' %}

View File

@@ -0,0 +1,2 @@
{% from 'macros/admin_nav.html' import placeholder_nav %}
{{ placeholder_nav() }}

View File

@@ -0,0 +1,31 @@
{# OOB swap for entry posts nav when posts are associated/disassociated #}
{% import 'macros/links.html' as links %}
{# Associated Posts - vertical on mobile, horizontal with arrows on desktop #}
{% if entry_posts %}
<div class="flex flex-col sm:flex-row sm:items-center gap-2 border-r border-stone-200 mr-2 sm:max-w-2xl"
id="entry-posts-nav-wrapper"
hx-swap-oob="true">
{% from 'macros/scrolling_menu.html' import scrolling_menu with context %}
{% call(entry_post) scrolling_menu('entry-posts-container', entry_posts) %}
<a
href="{{ blog_url('/' + entry_post.slug + '/') }}"
class="{{styles.nav_button}}"
>
{% if entry_post.feature_image %}
<img src="{{ entry_post.feature_image }}"
alt="{{ entry_post.title }}"
class="w-8 h-8 rounded-full object-cover flex-shrink-0" />
{% else %}
<div class="w-8 h-8 rounded-full bg-stone-200 flex-shrink-0"></div>
{% endif %}
<div class="flex-1 min-w-0">
<div class="font-medium truncate">{{ entry_post.title }}</div>
</div>
</a>
{% endcall %}
</div>
{% else %}
{# Empty placeholder to remove nav posts when all are disassociated #}
<div id="entry-posts-nav-wrapper" hx-swap-oob="true"></div>
{% endif %}

View File

@@ -0,0 +1,25 @@
{% extends 'oob_elements.html' %}
{# OOB elements for calendar admin page #}
{# Import shared OOB macros #}
{% from '_types/root/header/_oob.html' import root_header_start, root_header_end with context %}
{% from '_types/root/_oob_menu.html' import mobile_menu with context %}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('entry-header-child', 'entry-admin-header-child', '_types/entry/admin/header/_header.html')}}
{% from '_types/entry/header/_header.html' import header_row with context %}
{{header_row(oob=True)}}
{% endblock %}
{% block mobile_menu %}
{% include '_types/entry/admin/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/entry/admin/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,24 @@
{% extends '_types/entry/index.html' %}
{% import 'macros/layout.html' as layout %}
{% import 'macros/links.html' as links %}
{% block entry_header_child %}
{% from '_types/root/_n/macros.html' import header with context %}
{% call header() %}
{% from '_types/entry/admin/header/_header.html' import header_row with context %}
{{ header_row() }}
<div id="entry-admin-header-child">
{% block entry_admin_header_child %}
{% endblock %}
</div>
{% endcall %}
{% endblock %}
{% block _main_mobile_menu %}
{% include '_types/entry/admin/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/entry/admin/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,20 @@
{% extends '_types/day/index.html' %}
{% block day_header_child %}
{% from '_types/root/_n/macros.html' import index_row with context %}
{% call index_row('entry-header-child', '_types/entry/header/_header.html') %}
{% block entry_header_child %}
{% endblock %}
{% endcall %}
{% endblock %}
{% block _main_mobile_menu %}
{% include '_types/entry/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/entry/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,50 @@
<div id="associated-entries-list" class="border rounded-lg p-4 bg-white">
<h3 class="text-lg font-semibold mb-4">Associated Entries</h3>
{% if associated_entry_ids %}
<div class="space-y-1">
{% for calendar in all_calendars %}
{% for entry in calendar.entries %}
{% if entry.id in associated_entry_ids and entry.deleted_at is none %}
<button
type="button"
class="w-full text-left p-3 rounded border bg-green-50 border-green-300 transition hover:bg-green-100"
data-confirm
data-confirm-title="Remove entry?"
data-confirm-text="This will remove {{ entry.name }} from this post"
data-confirm-icon="warning"
data-confirm-confirm-text="Yes, remove it"
data-confirm-cancel-text="Cancel"
data-confirm-event="confirmed"
hx-post="{{ url_for('blog.post.admin.toggle_entry', slug=post.slug, entry_id=entry.id) }}"
hx-trigger="confirmed"
hx-target="#associated-entries-list"
hx-swap="outerHTML"
hx-headers='{"X-CSRFToken": "{{ csrf_token() }}"}'
_="on htmx:afterRequest trigger entryToggled on body"
>
<div class="flex items-center justify-between gap-3">
{% if calendar.post.feature_image %}
<img src="{{ calendar.post.feature_image }}"
alt="{{ calendar.post.title }}"
class="w-8 h-8 rounded-full object-cover flex-shrink-0" />
{% else %}
<div class="w-8 h-8 rounded-full bg-stone-200 flex-shrink-0"></div>
{% endif %}
<div class="flex-1">
<div class="font-medium text-sm">{{ entry.name }}</div>
<div class="text-xs text-stone-600 mt-1">
{{ calendar.name }} • {{ entry.start_at.strftime('%A, %B %d, %Y at %H:%M') }}
{% if entry.end_at %} {{ entry.end_at.strftime('%H:%M') }}{% endif %}
</div>
</div>
<i class="fa fa-times-circle text-green-600 text-lg flex-shrink-0"></i>
</div>
</button>
{% endif %}
{% endfor %}
{% endfor %}
</div>
{% else %}
<div class="text-sm text-stone-400">No entries associated yet. Browse calendars below to add entries.</div>
{% endif %}
</div>

View File

@@ -0,0 +1,28 @@
{% import 'macros/links.html' as links %}
{% macro header_row(oob=False) %}
{% call links.menu_row(id='post-row', oob=oob) %}
{% call links.link(url_for('blog.post.post_detail', slug=post.slug), hx_select_search ) %}
{% if post.feature_image %}
<img
src="{{ post.feature_image }}"
class="h-8 w-8 rounded-full object-cover border border-stone-300 flex-shrink-0"
>
{% endif %}
<span>
{{ post.title | truncate(160, True, '…') }}
</span>
{% endcall %}
{% call links.desktop_nav() %}
{% if page_cart_count is defined and page_cart_count > 0 %}
<a
href="{{ cart_url('/' + post.slug + '/') }}"
class="relative inline-flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-full border border-emerald-300 bg-emerald-50 text-emerald-800 hover:bg-emerald-100 transition"
>
<i class="fa fa-shopping-cart" aria-hidden="true"></i>
<span>{{ page_cart_count }}</span>
</a>
{% endif %}
{% include '_types/post/_nav.html' %}
{% endcall %}
{% endcall %}
{% endmacro %}

View File

@@ -0,0 +1,2 @@
{% from 'macros/admin_nav.html' import placeholder_nav %}
{{ placeholder_nav() }}

View File

@@ -0,0 +1,13 @@
{% macro description(slot, oob=False) %}
<div
id="slot-description-title"
{% if oob %}
hx-swap-oob="outerHTML"
{% endif %}
class="text-base font-normal break-words whitespace-normal min-w-0 break-all w-full text-center block"
>
{{ slot.description or ''}}
</div>
{% endmacro %}

View File

@@ -0,0 +1,5 @@
<p class="text-stone-500 whitespace-pre-line break-all w-full">
{% if slot.description %}
{{ slot.description }}
{% endif %}
</p>

View File

@@ -0,0 +1,15 @@
{% extends "oob_elements.html" %}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('slots-header-child', 'slot-header-child', '_types/slot/header/_header.html')}}
{% from '_types/slots/header/_header.html' import header_row with context %}
{{ header_row(oob=True) }}
{% endblock %}
{% block content %}
{% include '_types/slot/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,20 @@
{% extends '_types/slots/index.html' %}
{% import 'macros/layout.html' as layout %}
{% block slots_header_child %}
{% from '_types/root/_n/macros.html' import index_row with context %}
{% call index_row('slot-header-child', '_types/slot/header/_header.html') %}
{% block slot_header_child %}
{% endblock %}
{% endcall %}
{% endblock %}
{% block _main_mobile_menu %}
{#% include '_types/slot/_nav.html' %#}
{% endblock %}
{% block content %}
{% include '_types/slot/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,26 @@
<section id="slots-table" class="{{styles.list_container}}">
<table class="w-full text-sm border table-fixed">
<thead class="bg-stone-100">
<tr>
<th class="p-2 text-left w-1/6">Name</th>
<th class="p-2 text-left w-1/6">Flexible</th>
<th class="text-left p-2 w-1/6">Days</th>
<th class="text-left p-1/6">Time</th>
<th class="text-left p-2 w-1/6">Cost</th>
<th class="text-left p-2 w-1/6">Actions</th>
</tr>
</thead>
<tbody>
{% for s in slots %}
{% include '_types/slots/_row.html' %}
{% else %}
<tr><td colspan="5" class="p-3 text-stone-500">No slots yet.</td></tr>
{% endfor %}
</tbody>
</table>
<!-- This is what HTMX will swap between button and form -->
<div id="slot-add-container" class="mt-4">
{% include '_types/slots/_add_button.html' %}
</div>
</section>

View File

@@ -0,0 +1,15 @@
{% extends "oob_elements.html" %}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('calendar-header-child', 'slots-header-child', '_types/slots/header/_header.html')}}
{% from '_types/calendar/header/_header.html' import header_row with context %}
{{ header_row(oob=True) }}
{% endblock %}
{% block content %}
{% include '_types/slots/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,19 @@
{% extends '_types/calendar/index.html' %}
{% block calendar_header_child %}
{% from '_types/root/_n/macros.html' import index_row with context %}
{% call index_row('slots-header-child', '_types/slots/header/_header.html') %}
{% block slots_header_child %}
{% endblock %}
{% endcall %}
{% endblock %}
{% block _main_mobile_menu %}
{#% include '_types/calendar/_nav.html' %#}
{% endblock %}
{% block content %}
{% include '_types/slots/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,2 @@
{% from 'macros/admin_nav.html' import placeholder_nav %}
{{ placeholder_nav() }}

View File

@@ -0,0 +1,18 @@
{% extends "oob_elements.html" %}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('ticket_types-header-child', 'ticket_type-header-child', '_types/ticket_type/header/_header.html')}}
{% from '_types/ticket_types/header/_header.html' import header_row with context %}
{{ header_row(oob=True) }}
{% endblock %}
{% block mobile_menu %}
{% include '_types/ticket_type/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/ticket_type/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,19 @@
{% extends '_types/ticket_types/index.html' %}
{% import 'macros/layout.html' as layout %}
{% block ticket_types_header_child %}
{% from '_types/root/_n/macros.html' import index_row with context %}
{% call index_row('ticket_types-header-child', '_types/ticket_type/header/_header.html') %}
{% block ticket_type_header_child %}
{% endblock %}
{% endcall %}
{% endblock %}
{% block _main_mobile_menu %}
{#% include '_types/ticket_type/_nav.html' %#}
{% endblock %}
{% block content %}
{% include '_types/ticket_type/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,24 @@
<section id="tickets-table" class="{{styles.list_container}}">
<table class="w-full text-sm border table-fixed">
<thead class="bg-stone-100">
<tr>
<th class="p-2 text-left w-1/3">Name</th>
<th class="text-left p-2 w-1/4">Cost</th>
<th class="text-left p-2 w-1/4">Count</th>
<th class="text-left p-2 w-1/6">Actions</th>
</tr>
</thead>
<tbody>
{% for tt in ticket_types %}
{% include '_types/ticket_types/_row.html' %}
{% else %}
<tr><td colspan="4" class="p-3 text-stone-500">No ticket types yet.</td></tr>
{% endfor %}
</tbody>
</table>
<!-- This is what HTMX will swap between button and form -->
<div id="ticket-add-container" class="mt-4">
{% include '_types/ticket_types/_add_button.html' %}
</div>
</section>

View File

@@ -0,0 +1,2 @@
{% from 'macros/admin_nav.html' import placeholder_nav %}
{{ placeholder_nav() }}

View File

@@ -0,0 +1,18 @@
{% extends "oob_elements.html" %}
{% block oobs %}
{% from '_types/root/_n/macros.html' import oob_header with context %}
{{oob_header('entry-admin-header-child', 'ticket_types-header-child', '_types/ticket_types/header/_header.html')}}
{% from '_types/entry/admin/header/_header.html' import header_row with context %}
{{ header_row(oob=True) }}
{% endblock %}
{% block mobile_menu %}
{% include '_types/ticket_types/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/ticket_types/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,20 @@
{% extends '_types/entry/admin/index.html' %}
{% block entry_admin_header_child %}
{% from '_types/root/_n/macros.html' import index_row with context %}
{% call index_row('ticket_type-header-child', '_types/ticket_types/header/_header.html') %}
{% block ticket_types_header_child %}
{% endblock %}
{% endcall %}
{% endblock %}
{% block _main_mobile_menu %}
{% include '_types/ticket_types/_nav.html' %}
{% endblock %}
{% block content %}
{% include '_types/ticket_types/_main_panel.html' %}
{% endblock %}

View File

@@ -0,0 +1,7 @@
{% macro dt(d) -%}
{{ d.astimezone().strftime('%-d %b %Y, %H:%M') if d.tzinfo else d.strftime('%-d %b %Y, %H:%M') }}
{%- endmacro %}
{% macro t(d) -%}
{{ d.astimezone().strftime('%H:%M') if d.tzinfo else d.strftime('%H:%M') }}
{%- endmacro %}