Own events domain templates (Phase 6)
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 2m6s
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:
2
shared
2
shared
Submodule shared updated: 65c4989d08...322ae481ee
12
templates/_types/calendar/_description.html
Normal file
12
templates/_types/calendar/_description.html
Normal 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 %}
|
||||
22
templates/_types/calendar/_oob_elements.html
Normal file
22
templates/_types/calendar/_oob_elements.html
Normal 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 %}
|
||||
2
templates/_types/calendar/admin/_nav.html
Normal file
2
templates/_types/calendar/admin/_nav.html
Normal file
@@ -0,0 +1,2 @@
|
||||
{% from 'macros/admin_nav.html' import placeholder_nav %}
|
||||
{{ placeholder_nav() }}
|
||||
25
templates/_types/calendar/admin/_oob_elements.html
Normal file
25
templates/_types/calendar/admin/_oob_elements.html
Normal 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 %}
|
||||
24
templates/_types/calendar/admin/index.html
Normal file
24
templates/_types/calendar/admin/index.html
Normal 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 %}
|
||||
2
templates/_types/calendars/_nav.html
Normal file
2
templates/_types/calendars/_nav.html
Normal file
@@ -0,0 +1,2 @@
|
||||
{% from 'macros/admin_nav.html' import placeholder_nav %}
|
||||
{{ placeholder_nav() }}
|
||||
28
templates/_types/calendars/_oob_elements.html
Normal file
28
templates/_types/calendars/_oob_elements.html
Normal 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 %}
|
||||
|
||||
|
||||
45
templates/_types/cart/_mini.html
Normal file
45
templates/_types/cart/_mini.html
Normal 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 %}
|
||||
28
templates/_types/day/_main_panel.html
Normal file
28
templates/_types/day/_main_panel.html
Normal 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>
|
||||
18
templates/_types/day/_oob_elements.html
Normal file
18
templates/_types/day/_oob_elements.html
Normal 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 %}
|
||||
2
templates/_types/day/admin/_main_panel.html
Normal file
2
templates/_types/day/admin/_main_panel.html
Normal file
@@ -0,0 +1,2 @@
|
||||
{% from 'macros/admin_nav.html' import placeholder_nav %}
|
||||
{{ placeholder_nav() }}
|
||||
2
templates/_types/day/admin/_nav.html
Normal file
2
templates/_types/day/admin/_nav.html
Normal file
@@ -0,0 +1,2 @@
|
||||
{% from 'macros/admin_nav.html' import placeholder_nav %}
|
||||
{{ placeholder_nav() }}
|
||||
25
templates/_types/day/admin/_oob_elements.html
Normal file
25
templates/_types/day/admin/_oob_elements.html
Normal 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 %}
|
||||
24
templates/_types/day/admin/index.html
Normal file
24
templates/_types/day/admin/index.html
Normal 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 %}
|
||||
18
templates/_types/day/index.html
Normal file
18
templates/_types/day/index.html
Normal 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 %}
|
||||
18
templates/_types/entry/_oob_elements.html
Normal file
18
templates/_types/entry/_oob_elements.html
Normal 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 %}
|
||||
9
templates/_types/entry/_optioned.html
Normal file
9
templates/_types/entry/_optioned.html
Normal 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>
|
||||
15
templates/_types/entry/_state.html
Normal file
15
templates/_types/entry/_state.html
Normal 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 %}
|
||||
5
templates/_types/entry/_times.html
Normal file
5
templates/_types/entry/_times.html
Normal 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>
|
||||
3
templates/_types/entry/_title.html
Normal file
3
templates/_types/entry/_title.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<i class="fa fa-clock"></i>
|
||||
{{ entry.name }}
|
||||
{% include '_types/entry/_state.html' %}
|
||||
2
templates/_types/entry/admin/_main_panel.html
Normal file
2
templates/_types/entry/admin/_main_panel.html
Normal file
@@ -0,0 +1,2 @@
|
||||
{% from 'macros/admin_nav.html' import placeholder_nav %}
|
||||
{{ placeholder_nav() }}
|
||||
31
templates/_types/entry/admin/_nav_posts_oob.html
Normal file
31
templates/_types/entry/admin/_nav_posts_oob.html
Normal 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 %}
|
||||
25
templates/_types/entry/admin/_oob_elements.html
Normal file
25
templates/_types/entry/admin/_oob_elements.html
Normal 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 %}
|
||||
24
templates/_types/entry/admin/index.html
Normal file
24
templates/_types/entry/admin/index.html
Normal 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 %}
|
||||
20
templates/_types/entry/index.html
Normal file
20
templates/_types/entry/index.html
Normal 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 %}
|
||||
50
templates/_types/post/admin/_associated_entries.html
Normal file
50
templates/_types/post/admin/_associated_entries.html
Normal 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>
|
||||
28
templates/_types/post/header/_header.html
Normal file
28
templates/_types/post/header/_header.html
Normal 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 %}
|
||||
2
templates/_types/post_entries/_nav.html
Normal file
2
templates/_types/post_entries/_nav.html
Normal file
@@ -0,0 +1,2 @@
|
||||
{% from 'macros/admin_nav.html' import placeholder_nav %}
|
||||
{{ placeholder_nav() }}
|
||||
13
templates/_types/slot/__description.html
Normal file
13
templates/_types/slot/__description.html
Normal 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 %}
|
||||
5
templates/_types/slot/_description.html
Normal file
5
templates/_types/slot/_description.html
Normal file
@@ -0,0 +1,5 @@
|
||||
<p class="text-stone-500 whitespace-pre-line break-all w-full">
|
||||
{% if slot.description %}
|
||||
{{ slot.description }}
|
||||
{% endif %}
|
||||
</p>
|
||||
15
templates/_types/slot/_oob_elements.html
Normal file
15
templates/_types/slot/_oob_elements.html
Normal 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 %}
|
||||
20
templates/_types/slot/index.html
Normal file
20
templates/_types/slot/index.html
Normal 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 %}
|
||||
26
templates/_types/slots/_main_panel.html
Normal file
26
templates/_types/slots/_main_panel.html
Normal 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>
|
||||
15
templates/_types/slots/_oob_elements.html
Normal file
15
templates/_types/slots/_oob_elements.html
Normal 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 %}
|
||||
19
templates/_types/slots/index.html
Normal file
19
templates/_types/slots/index.html
Normal 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 %}
|
||||
2
templates/_types/ticket_type/_nav.html
Normal file
2
templates/_types/ticket_type/_nav.html
Normal file
@@ -0,0 +1,2 @@
|
||||
{% from 'macros/admin_nav.html' import placeholder_nav %}
|
||||
{{ placeholder_nav() }}
|
||||
18
templates/_types/ticket_type/_oob_elements.html
Normal file
18
templates/_types/ticket_type/_oob_elements.html
Normal 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 %}
|
||||
19
templates/_types/ticket_type/index.html
Normal file
19
templates/_types/ticket_type/index.html
Normal 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 %}
|
||||
24
templates/_types/ticket_types/_main_panel.html
Normal file
24
templates/_types/ticket_types/_main_panel.html
Normal 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>
|
||||
2
templates/_types/ticket_types/_nav.html
Normal file
2
templates/_types/ticket_types/_nav.html
Normal file
@@ -0,0 +1,2 @@
|
||||
{% from 'macros/admin_nav.html' import placeholder_nav %}
|
||||
{{ placeholder_nav() }}
|
||||
18
templates/_types/ticket_types/_oob_elements.html
Normal file
18
templates/_types/ticket_types/_oob_elements.html
Normal 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 %}
|
||||
20
templates/_types/ticket_types/index.html
Normal file
20
templates/_types/ticket_types/index.html
Normal 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 %}
|
||||
7
templates/macros/date.html
Normal file
7
templates/macros/date.html
Normal 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 %}
|
||||
Reference in New Issue
Block a user