Component names now reflect filesystem location using / as path separator and : as namespace separator for shared components: ~sx-header → ~layouts/header ~layout-app-body → ~shared:layout/app-body ~blog-admin-dashboard → ~admin/dashboard 209 files, 4,941 replacements across all services. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
236 lines
8.9 KiB
Plaintext
236 lines
8.9 KiB
Plaintext
;; Events pages — auto-mounted with absolute paths
|
|
;; All helpers return data dicts — markup composition in SX.
|
|
|
|
;; Calendar admin
|
|
(defpage calendar-admin
|
|
:path "/<slug>/<calendar_slug>/admin/"
|
|
:auth :admin
|
|
:layout :events-calendar-admin
|
|
:data (calendar-admin-data calendar-slug)
|
|
:content (~admin/calendar-admin-panel
|
|
:description-content (~calendar/description-display
|
|
:description cal-description :edit-url desc-edit-url)
|
|
:csrf csrf :description cal-description))
|
|
|
|
;; Day admin
|
|
(defpage day-admin
|
|
:path "/<slug>/<calendar_slug>/day/<int:year>/<int:month>/<int:day>/admin/"
|
|
:auth :admin
|
|
:layout :events-day-admin
|
|
:data (day-admin-data calendar-slug year month day)
|
|
:content (~day/admin-panel))
|
|
|
|
;; Slots listing
|
|
(defpage slots-listing
|
|
:path "/<slug>/<calendar_slug>/slots/"
|
|
:auth :public
|
|
:layout :events-slots
|
|
:data (slots-data calendar-slug)
|
|
:content (~page/slots-table
|
|
:list-container list-container
|
|
:rows (if has-slots
|
|
(<> (map (fn (s)
|
|
(~page/slots-row
|
|
:tr-cls tr-cls :slot-href (get s "slot-href")
|
|
:pill-cls pill-cls :hx-select hx-select
|
|
:slot-name (get s "name") :description (get s "description")
|
|
:flexible (get s "flexible")
|
|
:days (if (get s "has-days")
|
|
(~page/slot-days-pills :days-inner
|
|
(<> (map (fn (d) (~page/slot-day-pill :day d)) (get s "day-list"))))
|
|
(~page/slot-no-days))
|
|
:time-str (get s "time-str")
|
|
:cost-str (get s "cost-str") :action-btn action-btn
|
|
:del-url (get s "del-url")
|
|
:csrf-hdr csrf-hdr))
|
|
slots-list))
|
|
(~page/slots-empty-row))
|
|
:pre-action pre-action :add-url add-url))
|
|
|
|
;; Slot detail
|
|
(defpage slot-detail
|
|
:path "/<slug>/<calendar_slug>/slots/<int:slot_id>/"
|
|
:auth :admin
|
|
:layout :events-slot
|
|
:data (slot-data calendar-slug slot-id)
|
|
:content (~page/slot-panel
|
|
:slot-id slot-id-str
|
|
:list-container list-container
|
|
:days (if has-days
|
|
(~page/slot-days-pills :days-inner
|
|
(<> (map (fn (d) (~page/slot-day-pill :day d)) day-list)))
|
|
(~page/slot-no-days))
|
|
:flexible flexible
|
|
:time-str time-str :cost-str cost-str
|
|
:pre-action pre-action :edit-url edit-url))
|
|
|
|
;; Entry detail
|
|
(defpage entry-detail
|
|
:path "/<slug>/<calendar_slug>/day/<int:year>/<int:month>/<int:day>/entries/<int:entry_id>/"
|
|
:auth :admin
|
|
:layout :events-entry
|
|
:data (entry-data calendar-slug entry-id)
|
|
:content (~admin/entry-panel
|
|
:entry-id entry-id-str :list-container list-container
|
|
:name (~admin/entry-field :label "Name"
|
|
:content (~admin/entry-name-field :name entry-name))
|
|
:slot (~admin/entry-field :label "Slot"
|
|
:content (if has-slot
|
|
(~admin/entry-slot-assigned :slot-name slot-name :flex-label flex-label)
|
|
(~admin/entry-slot-none)))
|
|
:time (~admin/entry-field :label "Time Period"
|
|
:content (~admin/entry-time-field :time-str time-str))
|
|
:state (~admin/entry-field :label "State"
|
|
:content (~admin/entry-state-field :entry-id entry-id-str
|
|
:badge (~shared:misc/badge :cls state-badge-cls :label state-badge-label)))
|
|
:cost (~admin/entry-field :label "Cost"
|
|
:content (~admin/entry-cost-field :cost cost-str))
|
|
:tickets (~admin/entry-field :label "Tickets"
|
|
:content (~admin/entry-tickets-field :entry-id entry-id-str
|
|
:tickets-config tickets-config))
|
|
:buy buy-form
|
|
:date (~admin/entry-field :label "Date"
|
|
:content (~admin/entry-date-field :date-str date-str))
|
|
:posts (~admin/entry-field :label "Associated Posts"
|
|
:content (~admin/entry-posts-field :entry-id entry-id-str
|
|
:posts-panel posts-panel))
|
|
:options options-html
|
|
:pre-action pre-action :edit-url edit-url)
|
|
:menu entry-menu)
|
|
|
|
;; Entry admin
|
|
(defpage entry-admin
|
|
:path "/<slug>/<calendar_slug>/day/<int:year>/<int:month>/<int:day>/entries/<int:entry_id>/admin/"
|
|
:auth :admin
|
|
:layout :events-entry-admin
|
|
:data (entry-admin-data calendar-slug entry-id year month day)
|
|
:content (~shared:layout/nav-link :href ticket-types-href :label "ticket_types"
|
|
:select-colours select-colours :aclass nav-btn :is-selected false)
|
|
:menu (~forms/admin-placeholder-nav))
|
|
|
|
;; Ticket types listing
|
|
(defpage ticket-types-listing
|
|
:path "/<slug>/<calendar_slug>/day/<int:year>/<int:month>/<int:day>/entries/<int:entry_id>/ticket-types/"
|
|
:auth :public
|
|
:layout :events-ticket-types
|
|
:data (ticket-types-data calendar-slug entry-id year month day)
|
|
:content (~page/ticket-types-table
|
|
:list-container list-container
|
|
:rows (if has-types
|
|
(<> (map (fn (tt)
|
|
(~page/ticket-types-row
|
|
:tr-cls tr-cls :tt-href (get tt "tt-href")
|
|
:pill-cls pill-cls :hx-select hx-select
|
|
:tt-name (get tt "tt-name") :cost-str (get tt "cost-str")
|
|
:count (get tt "count") :action-btn action-btn
|
|
:del-url (get tt "del-url")
|
|
:csrf-hdr csrf-hdr))
|
|
types-list))
|
|
(~page/ticket-types-empty-row))
|
|
:action-btn action-btn :add-url add-url)
|
|
:menu (~forms/admin-placeholder-nav))
|
|
|
|
;; Ticket type detail
|
|
(defpage ticket-type-detail
|
|
:path "/<slug>/<calendar_slug>/day/<int:year>/<int:month>/<int:day>/entries/<int:entry_id>/ticket-types/<int:ticket_type_id>/"
|
|
:auth :admin
|
|
:layout :events-ticket-type
|
|
:data (ticket-type-data calendar-slug entry-id ticket-type-id year month day)
|
|
:content (~page/ticket-type-panel
|
|
:ticket-id ticket-id :list-container list-container
|
|
:c1 (~page/ticket-type-col :label "Name" :value tt-name)
|
|
:c2 (~page/ticket-type-col :label "Cost" :value cost-str)
|
|
:c3 (~page/ticket-type-col :label "Count" :value count-str)
|
|
:pre-action pre-action :edit-url edit-url)
|
|
:menu (~forms/admin-placeholder-nav))
|
|
|
|
;; My tickets
|
|
(defpage my-tickets
|
|
:path "/tickets/"
|
|
:auth :public
|
|
:layout :root
|
|
:data (tickets-data)
|
|
:content (~tickets/panel
|
|
:list-container list-container
|
|
:has-tickets has-tickets
|
|
:cards (when has-tickets
|
|
(<> (map (fn (t)
|
|
(~tickets/card
|
|
:href (get t "href") :entry-name (get t "entry-name")
|
|
:type-name (get t "type-name") :time-str (get t "time-str")
|
|
:cal-name (get t "cal-name")
|
|
:badge (~shared:misc/badge :cls (get t "badge-cls") :label (get t "badge-label"))
|
|
:code-prefix (get t "code-prefix")))
|
|
tickets-list)))))
|
|
|
|
;; Ticket detail
|
|
(defpage ticket-detail
|
|
:path "/tickets/<code>/"
|
|
:auth :public
|
|
:layout :root
|
|
:data (ticket-detail-data code)
|
|
:content (~tickets/detail
|
|
:list-container list-container :back-href back-href
|
|
:header-bg header-bg :entry-name entry-name
|
|
:badge (span :class (str "inline-flex items-center rounded-full px-3 py-1 text-sm font-medium " badge-cls)
|
|
badge-label)
|
|
:type-name type-name :code ticket-code
|
|
:time-date time-date :time-range time-range
|
|
:cal-name cal-name :type-desc type-desc :checkin-str checkin-str
|
|
:qr-script qr-script))
|
|
|
|
;; Ticket admin dashboard
|
|
(defpage ticket-admin
|
|
:path "/admin/tickets/"
|
|
:auth :admin
|
|
:layout :root
|
|
:data (ticket-admin-data)
|
|
:content (~tickets/admin-panel
|
|
:list-container list-container
|
|
:stats (<> (map (fn (s)
|
|
(~tickets/admin-stat
|
|
:border (get s "border") :bg (get s "bg")
|
|
:text-cls (get s "text-cls") :label-cls (get s "label-cls")
|
|
:value (get s "value") :label (get s "label")))
|
|
admin-stats))
|
|
:lookup-url lookup-url :has-tickets has-tickets
|
|
:rows (when has-tickets
|
|
(<> (map (fn (t)
|
|
(~tickets/admin-row
|
|
:code (get t "code") :code-short (get t "code-short")
|
|
:entry-name (get t "entry-name")
|
|
:date (when (get t "date-str")
|
|
(~tickets/admin-date :date-str (get t "date-str")))
|
|
:type-name (get t "type-name")
|
|
:badge (~shared:misc/badge :cls (get t "badge-cls") :label (get t "badge-label"))
|
|
:action (if (get t "can-checkin")
|
|
(~tickets/admin-checkin-form
|
|
:checkin-url (get t "checkin-url") :code (get t "code") :csrf csrf)
|
|
(when (get t "is-checked-in")
|
|
(~tickets/admin-checked-in :time-str (get t "checkin-time"))))))
|
|
admin-tickets)))))
|
|
|
|
;; Markets
|
|
(defpage events-markets
|
|
:path "/<slug>/markets/"
|
|
:auth :public
|
|
:layout :events-markets
|
|
:data (markets-data)
|
|
:content (~shared:misc/crud-panel
|
|
:list-id "markets-list"
|
|
:form (when can-create
|
|
(~shared:misc/crud-create-form :create-url create-url :csrf csrf
|
|
:errors-id "market-create-errors" :list-id "markets-list"
|
|
:placeholder "e.g. Farm Shop, Bakery" :btn-label "Add market"))
|
|
:list (if markets-list
|
|
(<> (map (fn (m)
|
|
(~shared:misc/crud-item :href (get m "href") :name (get m "name")
|
|
:slug (get m "slug") :del-url (get m "del-url")
|
|
:csrf-hdr (get m "csrf-hdr")
|
|
:list-id "markets-list"
|
|
:confirm-title "Delete market?"
|
|
:confirm-text "Products will be hidden (soft delete)"))
|
|
markets-list))
|
|
(~shared:misc/empty-state :message "No markets yet. Create one above."
|
|
:cls "text-gray-500 mt-4"))))
|