From fc07ca3a30a4ca37897666ea7ec69d6a4de1fd96 Mon Sep 17 00:00:00 2001 From: Abe Hanoka Date: Sun, 5 Jan 2025 18:05:26 -0500 Subject: [PATCH 1/2] use htmx modal to update calendar --- config/settings/base.py | 2 + config/urls.py | 40 +- my_hebrew_dates/hebcal/forms.py | 1 + my_hebrew_dates/hebcal/urls.py | 27 +- my_hebrew_dates/hebcal/views.py | 17 +- my_hebrew_dates/static/js/htmx.min.js | 3306 +---------------- my_hebrew_dates/templates/base.html | 40 +- .../templates/hebcal/_calendar_name.html | 17 + .../templates/hebcal/calendar_edit.html | 2 +- requirements/base.txt | 5 +- 10 files changed, 106 insertions(+), 3351 deletions(-) create mode 100644 my_hebrew_dates/templates/hebcal/_calendar_name.html diff --git a/config/settings/base.py b/config/settings/base.py index 8d8e8b1..3957498 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -92,6 +92,7 @@ "rest_framework.authtoken", "corsheaders", "drf_spectacular", + "django_htmx_modal_forms", "django_htmx_messages", ] @@ -164,6 +165,7 @@ "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.auth.middleware.LoginRequiredMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", "allauth.account.middleware.AccountMiddleware", diff --git a/config/urls.py b/config/urls.py index f0c7406..b95abba 100644 --- a/config/urls.py +++ b/config/urls.py @@ -1,6 +1,7 @@ # ruff: noqa from django.conf import settings from django.conf.urls.static import static +from django.contrib.auth.decorators import login_not_required from django.contrib import admin from django.urls import include, path from django.views import defaults as default_views @@ -18,38 +19,47 @@ urlpatterns = [ - path("", TemplateView.as_view(template_name="pages/home.html"), name="home"), + path( + "", + login_not_required(TemplateView.as_view(template_name="pages/home.html")), + name="home", + ), path( "about/", - TemplateView.as_view(template_name="pages/about.html"), + login_not_required(TemplateView.as_view(template_name="pages/about.html")), name="about", ), - # Django Admin, use {% url 'admin:index' %} - path(settings.ADMIN_URL, admin.site.urls), - # User management - path("users/", include("my_hebrew_dates.users.urls", namespace="users")), - path("accounts/", include("allauth.urls")), - # Your stuff: custom urls includes go here - path("calendars/", include("my_hebrew_dates.hebcal.urls", namespace="hebcal")), - path("automation/", webhook_interest, name="webhook_interest"), path( "robots.txt", - TemplateView.as_view(template_name="robots.txt", content_type="text/plain"), - ), # add the robots.txt file + login_not_required( + TemplateView.as_view(template_name="robots.txt", content_type="text/plain") + ), + ), path( "favicon.png", - RedirectView.as_view(url="/static/images/favicon.png", permanent=True), + login_not_required( + RedirectView.as_view(url="/static/images/favicon.png", permanent=True) + ), ), path( "favicon.ico", - RedirectView.as_view(url="static/images/favicons/favicon.ico", permanent=True), + login_not_required( + RedirectView.as_view( + url="static/images/favicons/favicon.ico", permanent=True + ) + ), ), path( "sitemap.xml", - sitemap, + login_not_required(sitemap), {"sitemaps": sitemaps}, name="django.contrib.sitemaps.views.sitemap", ), + path("automation/", login_not_required(webhook_interest), name="webhook_interest"), + path(settings.ADMIN_URL, admin.site.urls), + path("users/", include("my_hebrew_dates.users.urls", namespace="users")), + path("accounts/", include("allauth.urls")), + path("calendars/", include("my_hebrew_dates.hebcal.urls", namespace="hebcal")), # Media files *static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT), ] diff --git a/my_hebrew_dates/hebcal/forms.py b/my_hebrew_dates/hebcal/forms.py index 12611ca..435f845 100644 --- a/my_hebrew_dates/hebcal/forms.py +++ b/my_hebrew_dates/hebcal/forms.py @@ -21,6 +21,7 @@ class Meta: def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.helper = FormHelper() + self.helper.form_tag = False class HebrewDateForm(forms.ModelForm): diff --git a/my_hebrew_dates/hebcal/urls.py b/my_hebrew_dates/hebcal/urls.py index 8be83cc..5fd7cc7 100644 --- a/my_hebrew_dates/hebcal/urls.py +++ b/my_hebrew_dates/hebcal/urls.py @@ -1,6 +1,8 @@ +from django.contrib.auth.decorators import login_not_required from django.urls import path from my_hebrew_dates.hebcal.views import CalendarDeleteView +from my_hebrew_dates.hebcal.views import CalendarUpdateModalView from my_hebrew_dates.hebcal.views import calendar_detail_view from my_hebrew_dates.hebcal.views import calendar_edit_view from my_hebrew_dates.hebcal.views import calendar_file @@ -21,6 +23,11 @@ edit_hebrew_date_htmx, name="edit_hebrew_date_htmx", ), + path( + "/update-calendar-modal/", + view=CalendarUpdateModalView.as_view(), + name="update_calendar", + ), path( "/delete-hebrew-date-htmx//", delete_hebrew_date_htmx, @@ -34,10 +41,22 @@ path("/delete/", CalendarDeleteView.as_view(), name="calendar_delete"), path("new/", create_calendar_view, name="calendar_new"), path("", calendar_list_view, name="calendar_list"), - path("/", calendar_detail_view, name="calendar_detail"), - path(".ical", calendar_file, name="legacy_calendar_file"), - path(".ics", calendar_file, name="calendar_file"), - path("serve-image//", serve_pixel, name="serve_pixel"), + path( + "/", + login_not_required(calendar_detail_view), + name="calendar_detail", + ), + path( + ".ical", + login_not_required(calendar_file), + name="legacy_calendar_file", + ), + path(".ics", login_not_required(calendar_file), name="calendar_file"), + path( + "serve-image//", + login_not_required(serve_pixel), + name="serve_pixel", + ), path( "update-calendar-links-htmx//", update_calendar_links_htmx, diff --git a/my_hebrew_dates/hebcal/views.py b/my_hebrew_dates/hebcal/views.py index 0de3835..2ac2ebb 100644 --- a/my_hebrew_dates/hebcal/views.py +++ b/my_hebrew_dates/hebcal/views.py @@ -7,8 +7,8 @@ from discord import SyncWebhook from django.conf import settings from django.contrib import messages -from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.messages.views import SuccessMessageMixin from django.contrib.sites.models import Site from django.core.mail import send_mail from django.http import HttpRequest @@ -20,6 +20,7 @@ from django.views.decorators.cache import cache_page from django.views.decorators.http import require_POST from django.views.generic.edit import DeleteView +from django_htmx_modal_forms import HtmxModalUpdateView from my_hebrew_dates.hebcal.decorators import requires_htmx from my_hebrew_dates.hebcal.forms import CalendarForm @@ -36,7 +37,6 @@ logger = logging.getLogger(__name__) -@login_required def calendar_list_view(request): user_owned_calendars = Calendar.objects.filter(owner=request.user) @@ -76,7 +76,6 @@ def calendar_detail_view(request: HttpRequest, uuid: UUID): return render(request, "hebcal/calendar_detail.html", context) -@login_required def create_calendar_view(request: HttpRequest): if request.method == "POST": form = CalendarForm(request.POST) @@ -116,7 +115,14 @@ def create_calendar_view(request: HttpRequest): return render(request, "hebcal/calendar_new.html", context) -@login_required +class CalendarUpdateModalView(SuccessMessageMixin, HtmxModalUpdateView): + model = Calendar + modal_size = "md" + form_class = CalendarForm + detail_template_name = "hebcal/_calendar_name.html" + success_message = "Calendar updated successfully" + + def calendar_edit_view(request: HttpRequest, uuid: UUID): calendar = get_object_or_404(Calendar, owner=request.user, uuid=uuid) month_values = request.GET.getlist("month") @@ -187,7 +193,6 @@ def calendar_edit_view(request: HttpRequest, uuid: UUID): return render(request, "hebcal/calendar_edit.html", context) -@login_required @requires_htmx def edit_hebrew_date_htmx(request: HttpRequest, uuid: UUID, pk: int): calendar = get_object_or_404(Calendar, owner=request.user, uuid=uuid) @@ -255,7 +260,6 @@ def edit_hebrew_date_htmx(request: HttpRequest, uuid: UUID, pk: int): return render(request, "hebcal/_hebrew_date_form.html", context) -@login_required @requires_htmx def create_hebrew_date_htmx(request: HttpRequest, uuid: UUID): calendar = get_object_or_404(Calendar, owner=request.user, uuid=uuid) @@ -297,7 +301,6 @@ def create_hebrew_date_htmx(request: HttpRequest, uuid: UUID): return render(request, "hebcal/_hebrew_date_form.html", context) -@login_required @require_POST @requires_htmx def delete_hebrew_date_htmx(request: HttpRequest, uuid: UUID, pk: int): diff --git a/my_hebrew_dates/static/js/htmx.min.js b/my_hebrew_dates/static/js/htmx.min.js index d22aad2..7dbeaeb 100644 --- a/my_hebrew_dates/static/js/htmx.min.js +++ b/my_hebrew_dates/static/js/htmx.min.js @@ -1,3305 +1 @@ -(function (e, t) { - if (typeof define === 'function' && define.amd) { - define([], t); - } else if (typeof module === 'object' && module.exports) { - module.exports = t(); - } else { - e.htmx = e.htmx || t(); - } -})(typeof self !== 'undefined' ? self : this, function () { - return (function () { - 'use strict'; - var Y = { - onLoad: t, - process: Dt, - on: Z, - off: K, - trigger: fe, - ajax: Cr, - find: E, - findAll: f, - closest: d, - values: function (e, t) { - var r = or(e, t || 'post'); - return r.values; - }, - remove: B, - addClass: F, - removeClass: n, - toggleClass: V, - takeClass: j, - defineExtension: Ar, - removeExtension: Nr, - logAll: X, - logNone: U, - logger: null, - config: { - historyEnabled: true, - historyCacheSize: 10, - refreshOnHistoryMiss: false, - defaultSwapStyle: 'innerHTML', - defaultSwapDelay: 0, - defaultSettleDelay: 20, - includeIndicatorStyles: true, - indicatorClass: 'htmx-indicator', - requestClass: 'htmx-request', - addedClass: 'htmx-added', - settlingClass: 'htmx-settling', - swappingClass: 'htmx-swapping', - allowEval: true, - allowScriptTags: true, - inlineScriptNonce: '', - attributesToSettle: ['class', 'style', 'width', 'height'], - withCredentials: false, - timeout: 0, - wsReconnectDelay: 'full-jitter', - wsBinaryType: 'blob', - disableSelector: '[hx-disable], [data-hx-disable]', - useTemplateFragments: false, - scrollBehavior: 'smooth', - defaultFocusScroll: false, - getCacheBusterParam: false, - globalViewTransitions: false, - methodsThatUseUrlParams: ['get'], - selfRequestsOnly: false, - scrollIntoViewOnBoost: true, - }, - parseInterval: v, - _: e, - createEventSource: function (e) { - return new EventSource(e, { withCredentials: true }); - }, - createWebSocket: function (e) { - var t = new WebSocket(e, []); - t.binaryType = Y.config.wsBinaryType; - return t; - }, - version: '1.9.8', - }; - var r = { - addTriggerHandler: St, - bodyContains: oe, - canAccessLocalStorage: M, - findThisElement: ve, - filterValues: cr, - hasAttribute: o, - getAttributeValue: ee, - getClosestAttributeValue: re, - getClosestMatch: c, - getExpressionVars: wr, - getHeaders: fr, - getInputValues: or, - getInternalData: ie, - getSwapSpecification: dr, - getTriggerSpecs: Ze, - getTarget: ge, - makeFragment: l, - mergeObjects: se, - makeSettleInfo: T, - oobSwap: ye, - querySelectorExt: le, - selectAndSwap: Ue, - settleImmediately: Jt, - shouldCancel: tt, - triggerEvent: fe, - triggerErrorEvent: ue, - withExtensions: C, - }; - var b = ['get', 'post', 'put', 'delete', 'patch']; - var w = b - .map(function (e) { - return '[hx-' + e + '], [data-hx-' + e + ']'; - }) - .join(', '); - function v(e) { - if (e == undefined) { - return undefined; - } - if (e.slice(-2) == 'ms') { - return parseFloat(e.slice(0, -2)) || undefined; - } - if (e.slice(-1) == 's') { - return parseFloat(e.slice(0, -1)) * 1e3 || undefined; - } - if (e.slice(-1) == 'm') { - return parseFloat(e.slice(0, -1)) * 1e3 * 60 || undefined; - } - return parseFloat(e) || undefined; - } - function Q(e, t) { - return e.getAttribute && e.getAttribute(t); - } - function o(e, t) { - return ( - e.hasAttribute && (e.hasAttribute(t) || e.hasAttribute('data-' + t)) - ); - } - function ee(e, t) { - return Q(e, t) || Q(e, 'data-' + t); - } - function u(e) { - return e.parentElement; - } - function te() { - return document; - } - function c(e, t) { - while (e && !t(e)) { - e = u(e); - } - return e ? e : null; - } - function R(e, t, r) { - var n = ee(t, r); - var i = ee(t, 'hx-disinherit'); - if (e !== t && i && (i === '*' || i.split(' ').indexOf(r) >= 0)) { - return 'unset'; - } else { - return n; - } - } - function re(t, r) { - var n = null; - c(t, function (e) { - return (n = R(t, e, r)); - }); - if (n !== 'unset') { - return n; - } - } - function h(e, t) { - var r = - e.matches || - e.matchesSelector || - e.msMatchesSelector || - e.mozMatchesSelector || - e.webkitMatchesSelector || - e.oMatchesSelector; - return r && r.call(e, t); - } - function q(e) { - var t = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; - var r = t.exec(e); - if (r) { - return r[1].toLowerCase(); - } else { - return ''; - } - } - function i(e, t) { - var r = new DOMParser(); - var n = r.parseFromString(e, 'text/html'); - var i = n.body; - while (t > 0) { - t--; - i = i.firstChild; - } - if (i == null) { - i = te().createDocumentFragment(); - } - return i; - } - function H(e) { - return e.match(/', 0); - return r.querySelector('template').content; - } else { - var n = q(e); - switch (n) { - case 'thead': - case 'tbody': - case 'tfoot': - case 'colgroup': - case 'caption': - return i('' + e + '
', 1); - case 'col': - return i('' + e + '
', 2); - case 'tr': - return i('' + e + '
', 2); - case 'td': - case 'th': - return i('' + e + '
', 3); - case 'script': - case 'style': - return i('
' + e + '
', 1); - default: - return i(e, 0); - } - } - } - function ne(e) { - if (e) { - e(); - } - } - function L(e, t) { - return Object.prototype.toString.call(e) === '[object ' + t + ']'; - } - function A(e) { - return L(e, 'Function'); - } - function N(e) { - return L(e, 'Object'); - } - function ie(e) { - var t = 'htmx-internal-data'; - var r = e[t]; - if (!r) { - r = e[t] = {}; - } - return r; - } - function I(e) { - var t = []; - if (e) { - for (var r = 0; r < e.length; r++) { - t.push(e[r]); - } - } - return t; - } - function ae(e, t) { - if (e) { - for (var r = 0; r < e.length; r++) { - t(e[r]); - } - } - } - function k(e) { - var t = e.getBoundingClientRect(); - var r = t.top; - var n = t.bottom; - return r < window.innerHeight && n >= 0; - } - function oe(e) { - if (e.getRootNode && e.getRootNode() instanceof window.ShadowRoot) { - return te().body.contains(e.getRootNode().host); - } else { - return te().body.contains(e); - } - } - function P(e) { - return e.trim().split(/\s+/); - } - function se(e, t) { - for (var r in t) { - if (t.hasOwnProperty(r)) { - e[r] = t[r]; - } - } - return e; - } - function S(e) { - try { - return JSON.parse(e); - } catch (e) { - y(e); - return null; - } - } - function M() { - var e = 'htmx:localStorageTest'; - try { - localStorage.setItem(e, e); - localStorage.removeItem(e); - return true; - } catch (e) { - return false; - } - } - function D(t) { - try { - var e = new URL(t); - if (e) { - t = e.pathname + e.search; - } - if (!t.match('^/$')) { - t = t.replace(/\/+$/, ''); - } - return t; - } catch (e) { - return t; - } - } - function e(e) { - return xr(te().body, function () { - return eval(e); - }); - } - function t(t) { - var e = Y.on('htmx:load', function (e) { - t(e.detail.elt); - }); - return e; - } - function X() { - Y.logger = function (e, t, r) { - if (console) { - console.log(t, e, r); - } - }; - } - function U() { - Y.logger = null; - } - function E(e, t) { - if (t) { - return e.querySelector(t); - } else { - return E(te(), e); - } - } - function f(e, t) { - if (t) { - return e.querySelectorAll(t); - } else { - return f(te(), e); - } - } - function B(e, t) { - e = s(e); - if (t) { - setTimeout(function () { - B(e); - e = null; - }, t); - } else { - e.parentElement.removeChild(e); - } - } - function F(e, t, r) { - e = s(e); - if (r) { - setTimeout(function () { - F(e, t); - e = null; - }, r); - } else { - e.classList && e.classList.add(t); - } - } - function n(e, t, r) { - e = s(e); - if (r) { - setTimeout(function () { - n(e, t); - e = null; - }, r); - } else { - if (e.classList) { - e.classList.remove(t); - if (e.classList.length === 0) { - e.removeAttribute('class'); - } - } - } - } - function V(e, t) { - e = s(e); - e.classList.toggle(t); - } - function j(e, t) { - e = s(e); - ae(e.parentElement.children, function (e) { - n(e, t); - }); - F(e, t); - } - function d(e, t) { - e = s(e); - if (e.closest) { - return e.closest(t); - } else { - do { - if (e == null || h(e, t)) { - return e; - } - } while ((e = e && u(e))); - return null; - } - } - function g(e, t) { - return e.substring(0, t.length) === t; - } - function _(e, t) { - return e.substring(e.length - t.length) === t; - } - function z(e) { - var t = e.trim(); - if (g(t, '<') && _(t, '/>')) { - return t.substring(1, t.length - 2); - } else { - return t; - } - } - function W(e, t) { - if (t.indexOf('closest ') === 0) { - return [d(e, z(t.substr(8)))]; - } else if (t.indexOf('find ') === 0) { - return [E(e, z(t.substr(5)))]; - } else if (t === 'next') { - return [e.nextElementSibling]; - } else if (t.indexOf('next ') === 0) { - return [$(e, z(t.substr(5)))]; - } else if (t === 'previous') { - return [e.previousElementSibling]; - } else if (t.indexOf('previous ') === 0) { - return [G(e, z(t.substr(9)))]; - } else if (t === 'document') { - return [document]; - } else if (t === 'window') { - return [window]; - } else if (t === 'body') { - return [document.body]; - } else { - return te().querySelectorAll(z(t)); - } - } - var $ = function (e, t) { - var r = te().querySelectorAll(t); - for (var n = 0; n < r.length; n++) { - var i = r[n]; - if (i.compareDocumentPosition(e) === Node.DOCUMENT_POSITION_PRECEDING) { - return i; - } - } - }; - var G = function (e, t) { - var r = te().querySelectorAll(t); - for (var n = r.length - 1; n >= 0; n--) { - var i = r[n]; - if (i.compareDocumentPosition(e) === Node.DOCUMENT_POSITION_FOLLOWING) { - return i; - } - } - }; - function le(e, t) { - if (t) { - return W(e, t)[0]; - } else { - return W(te().body, e)[0]; - } - } - function s(e) { - if (L(e, 'String')) { - return E(e); - } else { - return e; - } - } - function J(e, t, r) { - if (A(t)) { - return { target: te().body, event: e, listener: t }; - } else { - return { target: s(e), event: t, listener: r }; - } - } - function Z(t, r, n) { - Pr(function () { - var e = J(t, r, n); - e.target.addEventListener(e.event, e.listener); - }); - var e = A(r); - return e ? r : n; - } - function K(t, r, n) { - Pr(function () { - var e = J(t, r, n); - e.target.removeEventListener(e.event, e.listener); - }); - return A(r) ? r : n; - } - var he = te().createElement('output'); - function de(e, t) { - var r = re(e, t); - if (r) { - if (r === 'this') { - return [ve(e, t)]; - } else { - var n = W(e, r); - if (n.length === 0) { - y('The selector "' + r + '" on ' + t + ' returned no matches!'); - return [he]; - } else { - return n; - } - } - } - } - function ve(e, t) { - return c(e, function (e) { - return ee(e, t) != null; - }); - } - function ge(e) { - var t = re(e, 'hx-target'); - if (t) { - if (t === 'this') { - return ve(e, 'hx-target'); - } else { - return le(e, t); - } - } else { - var r = ie(e); - if (r.boosted) { - return te().body; - } else { - return e; - } - } - } - function me(e) { - var t = Y.config.attributesToSettle; - for (var r = 0; r < t.length; r++) { - if (e === t[r]) { - return true; - } - } - return false; - } - function pe(t, r) { - ae(t.attributes, function (e) { - if (!r.hasAttribute(e.name) && me(e.name)) { - t.removeAttribute(e.name); - } - }); - ae(r.attributes, function (e) { - if (me(e.name)) { - t.setAttribute(e.name, e.value); - } - }); - } - function xe(e, t) { - var r = Ir(t); - for (var n = 0; n < r.length; n++) { - var i = r[n]; - try { - if (i.isInlineSwap(e)) { - return true; - } - } catch (e) { - y(e); - } - } - return e === 'outerHTML'; - } - function ye(e, i, a) { - var t = '#' + Q(i, 'id'); - var o = 'outerHTML'; - if (e === 'true') { - } else if (e.indexOf(':') > 0) { - o = e.substr(0, e.indexOf(':')); - t = e.substr(e.indexOf(':') + 1, e.length); - } else { - o = e; - } - var r = te().querySelectorAll(t); - if (r) { - ae(r, function (e) { - var t; - var r = i.cloneNode(true); - t = te().createDocumentFragment(); - t.appendChild(r); - if (!xe(o, e)) { - t = r; - } - var n = { shouldSwap: true, target: e, fragment: t }; - if (!fe(e, 'htmx:oobBeforeSwap', n)) return; - e = n.target; - if (n['shouldSwap']) { - De(o, e, e, t, a); - } - ae(a.elts, function (e) { - fe(e, 'htmx:oobAfterSwap', n); - }); - }); - i.parentNode.removeChild(i); - } else { - i.parentNode.removeChild(i); - ue(te().body, 'htmx:oobErrorNoTarget', { content: i }); - } - return e; - } - function be(e, t, r) { - var n = re(e, 'hx-select-oob'); - if (n) { - var i = n.split(','); - for (let e = 0; e < i.length; e++) { - var a = i[e].split(':', 2); - var o = a[0].trim(); - if (o.indexOf('#') === 0) { - o = o.substring(1); - } - var s = a[1] || 'true'; - var l = t.querySelector('#' + o); - if (l) { - ye(s, l, r); - } - } - } - ae(f(t, '[hx-swap-oob], [data-hx-swap-oob]'), function (e) { - var t = ee(e, 'hx-swap-oob'); - if (t != null) { - ye(t, e, r); - } - }); - } - function we(e) { - ae(f(e, '[hx-preserve], [data-hx-preserve]'), function (e) { - var t = ee(e, 'id'); - var r = te().getElementById(t); - if (r != null) { - e.parentNode.replaceChild(r, e); - } - }); - } - function Se(o, e, s) { - ae(e.querySelectorAll('[id]'), function (e) { - var t = Q(e, 'id'); - if (t && t.length > 0) { - var r = t.replace("'", "\\'"); - var n = e.tagName.replace(':', '\\:'); - var i = o.querySelector(n + "[id='" + r + "']"); - if (i && i !== o) { - var a = e.cloneNode(); - pe(e, i); - s.tasks.push(function () { - pe(e, a); - }); - } - } - }); - } - function Ee(e) { - return function () { - n(e, Y.config.addedClass); - Dt(e); - Ct(e); - Ce(e); - fe(e, 'htmx:load'); - }; - } - function Ce(e) { - var t = '[autofocus]'; - var r = h(e, t) ? e : e.querySelector(t); - if (r != null) { - r.focus(); - } - } - function a(e, t, r, n) { - Se(e, r, n); - while (r.childNodes.length > 0) { - var i = r.firstChild; - F(i, Y.config.addedClass); - e.insertBefore(i, t); - if (i.nodeType !== Node.TEXT_NODE && i.nodeType !== Node.COMMENT_NODE) { - n.tasks.push(Ee(i)); - } - } - } - function Te(e, t) { - var r = 0; - while (r < e.length) { - t = ((t << 5) - t + e.charCodeAt(r++)) | 0; - } - return t; - } - function Oe(e) { - var t = 0; - if (e.attributes) { - for (var r = 0; r < e.attributes.length; r++) { - var n = e.attributes[r]; - if (n.value) { - t = Te(n.name, t); - t = Te(n.value, t); - } - } - } - return t; - } - function Re(t) { - var r = ie(t); - if (r.onHandlers) { - for (let e = 0; e < r.onHandlers.length; e++) { - const n = r.onHandlers[e]; - t.removeEventListener(n.event, n.listener); - } - delete r.onHandlers; - } - } - function qe(e) { - var t = ie(e); - if (t.timeout) { - clearTimeout(t.timeout); - } - if (t.webSocket) { - t.webSocket.close(); - } - if (t.sseEventSource) { - t.sseEventSource.close(); - } - if (t.listenerInfos) { - ae(t.listenerInfos, function (e) { - if (e.on) { - e.on.removeEventListener(e.trigger, e.listener); - } - }); - } - if (t.initHash) { - t.initHash = null; - } - Re(e); - } - function m(e) { - fe(e, 'htmx:beforeCleanupElement'); - qe(e); - if (e.children) { - ae(e.children, function (e) { - m(e); - }); - } - } - function He(t, e, r) { - if (t.tagName === 'BODY') { - return Pe(t, e, r); - } else { - var n; - var i = t.previousSibling; - a(u(t), t, e, r); - if (i == null) { - n = u(t).firstChild; - } else { - n = i.nextSibling; - } - ie(t).replacedWith = n; - r.elts = r.elts.filter(function (e) { - return e != t; - }); - while (n && n !== t) { - if (n.nodeType === Node.ELEMENT_NODE) { - r.elts.push(n); - } - n = n.nextElementSibling; - } - m(t); - u(t).removeChild(t); - } - } - function Le(e, t, r) { - return a(e, e.firstChild, t, r); - } - function Ae(e, t, r) { - return a(u(e), e, t, r); - } - function Ne(e, t, r) { - return a(e, null, t, r); - } - function Ie(e, t, r) { - return a(u(e), e.nextSibling, t, r); - } - function ke(e, t, r) { - m(e); - return u(e).removeChild(e); - } - function Pe(e, t, r) { - var n = e.firstChild; - a(e, n, t, r); - if (n) { - while (n.nextSibling) { - m(n.nextSibling); - e.removeChild(n.nextSibling); - } - m(n); - e.removeChild(n); - } - } - function Me(e, t, r) { - var n = r || re(e, 'hx-select'); - if (n) { - var i = te().createDocumentFragment(); - ae(t.querySelectorAll(n), function (e) { - i.appendChild(e); - }); - t = i; - } - return t; - } - function De(e, t, r, n, i) { - switch (e) { - case 'none': - return; - case 'outerHTML': - He(r, n, i); - return; - case 'afterbegin': - Le(r, n, i); - return; - case 'beforebegin': - Ae(r, n, i); - return; - case 'beforeend': - Ne(r, n, i); - return; - case 'afterend': - Ie(r, n, i); - return; - case 'delete': - ke(r, n, i); - return; - default: - var a = Ir(t); - for (var o = 0; o < a.length; o++) { - var s = a[o]; - try { - var l = s.handleSwap(e, r, n, i); - if (l) { - if (typeof l.length !== 'undefined') { - for (var u = 0; u < l.length; u++) { - var f = l[u]; - if ( - f.nodeType !== Node.TEXT_NODE && - f.nodeType !== Node.COMMENT_NODE - ) { - i.tasks.push(Ee(f)); - } - } - } - return; - } - } catch (e) { - y(e); - } - } - if (e === 'innerHTML') { - Pe(r, n, i); - } else { - De(Y.config.defaultSwapStyle, t, r, n, i); - } - } - } - function Xe(e) { - if (e.indexOf(' -1) { - var t = e.replace(/]*>|>)([\s\S]*?)<\/svg>/gim, ''); - var r = t.match(/]*>|>)([\s\S]*?)<\/title>/im); - if (r) { - return r[2]; - } - } - } - function Ue(e, t, r, n, i, a) { - i.title = Xe(n); - var o = l(n); - if (o) { - be(r, o, i); - o = Me(r, o, a); - we(o); - return De(e, r, t, o, i); - } - } - function Be(e, t, r) { - var n = e.getResponseHeader(t); - if (n.indexOf('{') === 0) { - var i = S(n); - for (var a in i) { - if (i.hasOwnProperty(a)) { - var o = i[a]; - if (!N(o)) { - o = { value: o }; - } - fe(r, a, o); - } - } - } else { - var s = n.split(','); - for (var l = 0; l < s.length; l++) { - fe(r, s[l].trim(), []); - } - } - } - var Fe = /\s/; - var p = /[\s,]/; - var Ve = /[_$a-zA-Z]/; - var je = /[_$a-zA-Z0-9]/; - var _e = ['"', "'", '/']; - var ze = /[^\s]/; - function We(e) { - var t = []; - var r = 0; - while (r < e.length) { - if (Ve.exec(e.charAt(r))) { - var n = r; - while (je.exec(e.charAt(r + 1))) { - r++; - } - t.push(e.substr(n, r - n + 1)); - } else if (_e.indexOf(e.charAt(r)) !== -1) { - var i = e.charAt(r); - var n = r; - r++; - while (r < e.length && e.charAt(r) !== i) { - if (e.charAt(r) === '\\') { - r++; - } - r++; - } - t.push(e.substr(n, r - n + 1)); - } else { - var a = e.charAt(r); - t.push(a); - } - r++; - } - return t; - } - function $e(e, t, r) { - return ( - Ve.exec(e.charAt(0)) && - e !== 'true' && - e !== 'false' && - e !== 'this' && - e !== r && - t !== '.' - ); - } - function Ge(e, t, r) { - if (t[0] === '[') { - t.shift(); - var n = 1; - var i = ' return (function(' + r + '){ return ('; - var a = null; - while (t.length > 0) { - var o = t[0]; - if (o === ']') { - n--; - if (n === 0) { - if (a === null) { - i = i + 'true'; - } - t.shift(); - i += ')})'; - try { - var s = xr( - e, - function () { - return Function(i)(); - }, - function () { - return true; - }, - ); - s.source = i; - return s; - } catch (e) { - ue(te().body, 'htmx:syntax:error', { error: e, source: i }); - return null; - } - } - } else if (o === '[') { - n++; - } - if ($e(o, a, r)) { - i += - '((' + - r + - '.' + - o + - ') ? (' + - r + - '.' + - o + - ') : (window.' + - o + - '))'; - } else { - i = i + o; - } - a = t.shift(); - } - } - } - function x(e, t) { - var r = ''; - while (e.length > 0 && !e[0].match(t)) { - r += e.shift(); - } - return r; - } - var Je = 'input, textarea, select'; - function Ze(e) { - var t = ee(e, 'hx-trigger'); - var r = []; - if (t) { - var n = We(t); - do { - x(n, ze); - var i = n.length; - var a = x(n, /[,\[\s]/); - if (a !== '') { - if (a === 'every') { - var o = { trigger: 'every' }; - x(n, ze); - o.pollInterval = v(x(n, /[,\[\s]/)); - x(n, ze); - var s = Ge(e, n, 'event'); - if (s) { - o.eventFilter = s; - } - r.push(o); - } else if (a.indexOf('sse:') === 0) { - r.push({ trigger: 'sse', sseEvent: a.substr(4) }); - } else { - var l = { trigger: a }; - var s = Ge(e, n, 'event'); - if (s) { - l.eventFilter = s; - } - while (n.length > 0 && n[0] !== ',') { - x(n, ze); - var u = n.shift(); - if (u === 'changed') { - l.changed = true; - } else if (u === 'once') { - l.once = true; - } else if (u === 'consume') { - l.consume = true; - } else if (u === 'delay' && n[0] === ':') { - n.shift(); - l.delay = v(x(n, p)); - } else if (u === 'from' && n[0] === ':') { - n.shift(); - var f = x(n, p); - if ( - f === 'closest' || - f === 'find' || - f === 'next' || - f === 'previous' - ) { - n.shift(); - var c = x(n, p); - if (c.length > 0) { - f += ' ' + c; - } - } - l.from = f; - } else if (u === 'target' && n[0] === ':') { - n.shift(); - l.target = x(n, p); - } else if (u === 'throttle' && n[0] === ':') { - n.shift(); - l.throttle = v(x(n, p)); - } else if (u === 'queue' && n[0] === ':') { - n.shift(); - l.queue = x(n, p); - } else if ( - (u === 'root' || u === 'threshold') && - n[0] === ':' - ) { - n.shift(); - l[u] = x(n, p); - } else { - ue(e, 'htmx:syntax:error', { token: n.shift() }); - } - } - r.push(l); - } - } - if (n.length === i) { - ue(e, 'htmx:syntax:error', { token: n.shift() }); - } - x(n, ze); - } while (n[0] === ',' && n.shift()); - } - if (r.length > 0) { - return r; - } else if (h(e, 'form')) { - return [{ trigger: 'submit' }]; - } else if (h(e, 'input[type="button"], input[type="submit"]')) { - return [{ trigger: 'click' }]; - } else if (h(e, Je)) { - return [{ trigger: 'change' }]; - } else { - return [{ trigger: 'click' }]; - } - } - function Ke(e) { - ie(e).cancelled = true; - } - function Ye(e, t, r) { - var n = ie(e); - n.timeout = setTimeout(function () { - if (oe(e) && n.cancelled !== true) { - if (!nt(r, e, Ut('hx:poll:trigger', { triggerSpec: r, target: e }))) { - t(e); - } - Ye(e, t, r); - } - }, r.pollInterval); - } - function Qe(e) { - return ( - location.hostname === e.hostname && - Q(e, 'href') && - Q(e, 'href').indexOf('#') !== 0 - ); - } - function et(t, r, e) { - if ( - (t.tagName === 'A' && - Qe(t) && - (t.target === '' || t.target === '_self')) || - t.tagName === 'FORM' - ) { - r.boosted = true; - var n, i; - if (t.tagName === 'A') { - n = 'get'; - i = Q(t, 'href'); - } else { - var a = Q(t, 'method'); - n = a ? a.toLowerCase() : 'get'; - if (n === 'get') { - } - i = Q(t, 'action'); - } - e.forEach(function (e) { - it( - t, - function (e, t) { - if (d(e, Y.config.disableSelector)) { - m(e); - return; - } - ce(n, i, e, t); - }, - r, - e, - true, - ); - }); - } - } - function tt(e, t) { - if (e.type === 'submit' || e.type === 'click') { - if (t.tagName === 'FORM') { - return true; - } - if (h(t, 'input[type="submit"], button') && d(t, 'form') !== null) { - return true; - } - if ( - t.tagName === 'A' && - t.href && - (t.getAttribute('href') === '#' || - t.getAttribute('href').indexOf('#') !== 0) - ) { - return true; - } - } - return false; - } - function rt(e, t) { - return ( - ie(e).boosted && - e.tagName === 'A' && - t.type === 'click' && - (t.ctrlKey || t.metaKey) - ); - } - function nt(e, t, r) { - var n = e.eventFilter; - if (n) { - try { - return n.call(t, r) !== true; - } catch (e) { - ue(te().body, 'htmx:eventFilter:error', { - error: e, - source: n.source, - }); - return true; - } - } - return false; - } - function it(a, o, e, s, l) { - var u = ie(a); - var t; - if (s.from) { - t = W(a, s.from); - } else { - t = [a]; - } - if (s.changed) { - t.forEach(function (e) { - var t = ie(e); - t.lastValue = e.value; - }); - } - ae(t, function (n) { - var i = function (e) { - if (!oe(a)) { - n.removeEventListener(s.trigger, i); - return; - } - if (rt(a, e)) { - return; - } - if (l || tt(e, a)) { - e.preventDefault(); - } - if (nt(s, a, e)) { - return; - } - var t = ie(e); - t.triggerSpec = s; - if (t.handledFor == null) { - t.handledFor = []; - } - if (t.handledFor.indexOf(a) < 0) { - t.handledFor.push(a); - if (s.consume) { - e.stopPropagation(); - } - if (s.target && e.target) { - if (!h(e.target, s.target)) { - return; - } - } - if (s.once) { - if (u.triggeredOnce) { - return; - } else { - u.triggeredOnce = true; - } - } - if (s.changed) { - var r = ie(n); - if (r.lastValue === n.value) { - return; - } - r.lastValue = n.value; - } - if (u.delayed) { - clearTimeout(u.delayed); - } - if (u.throttle) { - return; - } - if (s.throttle) { - if (!u.throttle) { - o(a, e); - u.throttle = setTimeout(function () { - u.throttle = null; - }, s.throttle); - } - } else if (s.delay) { - u.delayed = setTimeout(function () { - o(a, e); - }, s.delay); - } else { - fe(a, 'htmx:trigger'); - o(a, e); - } - } - }; - if (e.listenerInfos == null) { - e.listenerInfos = []; - } - e.listenerInfos.push({ trigger: s.trigger, listener: i, on: n }); - n.addEventListener(s.trigger, i); - }); - } - var at = false; - var ot = null; - function st() { - if (!ot) { - ot = function () { - at = true; - }; - window.addEventListener('scroll', ot); - setInterval(function () { - if (at) { - at = false; - ae( - te().querySelectorAll( - "[hx-trigger='revealed'],[data-hx-trigger='revealed']", - ), - function (e) { - lt(e); - }, - ); - } - }, 200); - } - } - function lt(t) { - if (!o(t, 'data-hx-revealed') && k(t)) { - t.setAttribute('data-hx-revealed', 'true'); - var e = ie(t); - if (e.initHash) { - fe(t, 'revealed'); - } else { - t.addEventListener( - 'htmx:afterProcessNode', - function (e) { - fe(t, 'revealed'); - }, - { once: true }, - ); - } - } - } - function ut(e, t, r) { - var n = P(r); - for (var i = 0; i < n.length; i++) { - var a = n[i].split(/:(.+)/); - if (a[0] === 'connect') { - ft(e, a[1], 0); - } - if (a[0] === 'send') { - ht(e); - } - } - } - function ft(s, r, n) { - if (!oe(s)) { - return; - } - if (r.indexOf('/') == 0) { - var e = location.hostname + (location.port ? ':' + location.port : ''); - if (location.protocol == 'https:') { - r = 'wss://' + e + r; - } else if (location.protocol == 'http:') { - r = 'ws://' + e + r; - } - } - var t = Y.createWebSocket(r); - t.onerror = function (e) { - ue(s, 'htmx:wsError', { error: e, socket: t }); - ct(s); - }; - t.onclose = function (e) { - if ([1006, 1012, 1013].indexOf(e.code) >= 0) { - var t = dt(n); - setTimeout(function () { - ft(s, r, n + 1); - }, t); - } - }; - t.onopen = function (e) { - n = 0; - }; - ie(s).webSocket = t; - t.addEventListener('message', function (e) { - if (ct(s)) { - return; - } - var t = e.data; - C(s, function (e) { - t = e.transformResponse(t, null, s); - }); - var r = T(s); - var n = l(t); - var i = I(n.children); - for (var a = 0; a < i.length; a++) { - var o = i[a]; - ye(ee(o, 'hx-swap-oob') || 'true', o, r); - } - Jt(r.tasks); - }); - } - function ct(e) { - if (!oe(e)) { - ie(e).webSocket.close(); - return true; - } - } - function ht(u) { - var f = c(u, function (e) { - return ie(e).webSocket != null; - }); - if (f) { - u.addEventListener(Ze(u)[0].trigger, function (e) { - var t = ie(f).webSocket; - var r = fr(u, f); - var n = or(u, 'post'); - var i = n.errors; - var a = n.values; - var o = wr(u); - var s = se(a, o); - var l = cr(s, u); - l['HEADERS'] = r; - if (i && i.length > 0) { - fe(u, 'htmx:validation:halted', i); - return; - } - t.send(JSON.stringify(l)); - if (tt(e, u)) { - e.preventDefault(); - } - }); - } else { - ue(u, 'htmx:noWebSocketSourceError'); - } - } - function dt(e) { - var t = Y.config.wsReconnectDelay; - if (typeof t === 'function') { - return t(e); - } - if (t === 'full-jitter') { - var r = Math.min(e, 6); - var n = 1e3 * Math.pow(2, r); - return n * Math.random(); - } - y( - 'htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"', - ); - } - function vt(e, t, r) { - var n = P(r); - for (var i = 0; i < n.length; i++) { - var a = n[i].split(/:(.+)/); - if (a[0] === 'connect') { - gt(e, a[1]); - } - if (a[0] === 'swap') { - mt(e, a[1]); - } - } - } - function gt(t, e) { - var r = Y.createEventSource(e); - r.onerror = function (e) { - ue(t, 'htmx:sseError', { error: e, source: r }); - xt(t); - }; - ie(t).sseEventSource = r; - } - function mt(a, o) { - var s = c(a, yt); - if (s) { - var l = ie(s).sseEventSource; - var u = function (e) { - if (xt(s)) { - return; - } - if (!oe(a)) { - l.removeEventListener(o, u); - return; - } - var t = e.data; - C(a, function (e) { - t = e.transformResponse(t, null, a); - }); - var r = dr(a); - var n = ge(a); - var i = T(a); - Ue(r.swapStyle, n, a, t, i); - Jt(i.tasks); - fe(a, 'htmx:sseMessage', e); - }; - ie(a).sseListener = u; - l.addEventListener(o, u); - } else { - ue(a, 'htmx:noSSESourceError'); - } - } - function pt(e, t, r) { - var n = c(e, yt); - if (n) { - var i = ie(n).sseEventSource; - var a = function () { - if (!xt(n)) { - if (oe(e)) { - t(e); - } else { - i.removeEventListener(r, a); - } - } - }; - ie(e).sseListener = a; - i.addEventListener(r, a); - } else { - ue(e, 'htmx:noSSESourceError'); - } - } - function xt(e) { - if (!oe(e)) { - ie(e).sseEventSource.close(); - return true; - } - } - function yt(e) { - return ie(e).sseEventSource != null; - } - function bt(e, t, r, n) { - var i = function () { - if (!r.loaded) { - r.loaded = true; - t(e); - } - }; - if (n) { - setTimeout(i, n); - } else { - i(); - } - } - function wt(t, i, e) { - var a = false; - ae(b, function (r) { - if (o(t, 'hx-' + r)) { - var n = ee(t, 'hx-' + r); - a = true; - i.path = n; - i.verb = r; - e.forEach(function (e) { - St(t, e, i, function (e, t) { - if (d(e, Y.config.disableSelector)) { - m(e); - return; - } - ce(r, n, e, t); - }); - }); - } - }); - return a; - } - function St(n, e, t, r) { - if (e.sseEvent) { - pt(n, r, e.sseEvent); - } else if (e.trigger === 'revealed') { - st(); - it(n, r, t, e); - lt(n); - } else if (e.trigger === 'intersect') { - var i = {}; - if (e.root) { - i.root = le(n, e.root); - } - if (e.threshold) { - i.threshold = parseFloat(e.threshold); - } - var a = new IntersectionObserver(function (e) { - for (var t = 0; t < e.length; t++) { - var r = e[t]; - if (r.isIntersecting) { - fe(n, 'intersect'); - break; - } - } - }, i); - a.observe(n); - it(n, r, t, e); - } else if (e.trigger === 'load') { - if (!nt(e, n, Ut('load', { elt: n }))) { - bt(n, r, t, e.delay); - } - } else if (e.pollInterval) { - t.polling = true; - Ye(n, r, e); - } else { - it(n, r, t, e); - } - } - function Et(e) { - if ( - Y.config.allowScriptTags && - (e.type === 'text/javascript' || e.type === 'module' || e.type === '') - ) { - var t = te().createElement('script'); - ae(e.attributes, function (e) { - t.setAttribute(e.name, e.value); - }); - t.textContent = e.textContent; - t.async = false; - if (Y.config.inlineScriptNonce) { - t.nonce = Y.config.inlineScriptNonce; - } - var r = e.parentElement; - try { - r.insertBefore(t, e); - } catch (e) { - y(e); - } finally { - if (e.parentElement) { - e.parentElement.removeChild(e); - } - } - } - } - function Ct(e) { - if (h(e, 'script')) { - Et(e); - } - ae(f(e, 'script'), function (e) { - Et(e); - }); - } - function Tt() { - return document.querySelector('[hx-boost], [data-hx-boost]'); - } - function Ot(e) { - var t = null; - var r = []; - if (document.evaluate) { - var n = document.evaluate( - '//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") ]]', - e, - ); - while ((t = n.iterateNext())) r.push(t); - } else { - var i = document.getElementsByTagName('*'); - for (var a = 0; a < i.length; a++) { - var o = i[a].attributes; - for (var s = 0; s < o.length; s++) { - var l = o[s].name; - if (g(l, 'hx-on:') || g(l, 'data-hx-on:')) { - r.push(i[a]); - } - } - } - } - return r; - } - function Rt(e) { - if (e.querySelectorAll) { - var t = Tt() ? ', a' : ''; - var r = e.querySelectorAll( - w + - t + - ", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws]," + - ' [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]', - ); - return r; - } else { - return []; - } - } - function qt(e) { - var t = d(e.target, "button, input[type='submit']"); - var r = Lt(e); - if (r) { - r.lastButtonClicked = t; - } - } - function Ht(e) { - var t = Lt(e); - if (t) { - t.lastButtonClicked = null; - } - } - function Lt(e) { - var t = d(e.target, "button, input[type='submit']"); - if (!t) { - return; - } - var r = s('#' + Q(t, 'form')) || d(t, 'form'); - if (!r) { - return; - } - return ie(r); - } - function At(e) { - e.addEventListener('click', qt); - e.addEventListener('focusin', qt); - e.addEventListener('focusout', Ht); - } - function Nt(e) { - var t = We(e); - var r = 0; - for (let e = 0; e < t.length; e++) { - const n = t[e]; - if (n === '{') { - r++; - } else if (n === '}') { - r--; - } - } - return r; - } - function It(t, e, r) { - var n = ie(t); - if (!Array.isArray(n.onHandlers)) { - n.onHandlers = []; - } - var i; - var a = function (e) { - return xr(t, function () { - if (!i) { - i = new Function('event', r); - } - i.call(t, e); - }); - }; - t.addEventListener(e, a); - n.onHandlers.push({ event: e, listener: a }); - } - function kt(e) { - var t = ee(e, 'hx-on'); - if (t) { - var r = {}; - var n = t.split('\n'); - var i = null; - var a = 0; - while (n.length > 0) { - var o = n.shift(); - var s = o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/); - if (a === 0 && s) { - o.split(':'); - i = s[1].slice(0, -1); - r[i] = s[2]; - } else { - r[i] += o; - } - a += Nt(o); - } - for (var l in r) { - It(e, l, r[l]); - } - } - } - function Pt(t) { - Re(t); - for (var e = 0; e < t.attributes.length; e++) { - var r = t.attributes[e].name; - var n = t.attributes[e].value; - if (g(r, 'hx-on:') || g(r, 'data-hx-on:')) { - let e = r.slice(r.indexOf(':') + 1); - if (g(e, ':')) e = 'htmx' + e; - It(t, e, n); - } - } - } - function Mt(t) { - if (d(t, Y.config.disableSelector)) { - m(t); - return; - } - var r = ie(t); - if (r.initHash !== Oe(t)) { - qe(t); - r.initHash = Oe(t); - kt(t); - fe(t, 'htmx:beforeProcessNode'); - if (t.value) { - r.lastValue = t.value; - } - var e = Ze(t); - var n = wt(t, r, e); - if (!n) { - if (re(t, 'hx-boost') === 'true') { - et(t, r, e); - } else if (o(t, 'hx-trigger')) { - e.forEach(function (e) { - St(t, e, r, function () {}); - }); - } - } - if ( - t.tagName === 'FORM' || - (Q(t, 'type') === 'submit' && o(t, 'form')) - ) { - At(t); - } - var i = ee(t, 'hx-sse'); - if (i) { - vt(t, r, i); - } - var a = ee(t, 'hx-ws'); - if (a) { - ut(t, r, a); - } - fe(t, 'htmx:afterProcessNode'); - } - } - function Dt(e) { - e = s(e); - if (d(e, Y.config.disableSelector)) { - m(e); - return; - } - Mt(e); - ae(Rt(e), function (e) { - Mt(e); - }); - ae(Ot(e), Pt); - } - function Xt(e) { - return e.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(); - } - function Ut(e, t) { - var r; - if (window.CustomEvent && typeof window.CustomEvent === 'function') { - r = new CustomEvent(e, { bubbles: true, cancelable: true, detail: t }); - } else { - r = te().createEvent('CustomEvent'); - r.initCustomEvent(e, true, true, t); - } - return r; - } - function ue(e, t, r) { - fe(e, t, se({ error: t }, r)); - } - function Bt(e) { - return e === 'htmx:afterProcessNode'; - } - function C(e, t) { - ae(Ir(e), function (e) { - try { - t(e); - } catch (e) { - y(e); - } - }); - } - function y(e) { - if (console.error) { - console.error(e); - } else if (console.log) { - console.log('ERROR: ', e); - } - } - function fe(e, t, r) { - e = s(e); - if (r == null) { - r = {}; - } - r['elt'] = e; - var n = Ut(t, r); - if (Y.logger && !Bt(t)) { - Y.logger(e, t, r); - } - if (r.error) { - y(r.error); - fe(e, 'htmx:error', { errorInfo: r }); - } - var i = e.dispatchEvent(n); - var a = Xt(t); - if (i && a !== t) { - var o = Ut(a, n.detail); - i = i && e.dispatchEvent(o); - } - C(e, function (e) { - i = i && e.onEvent(t, n) !== false && !n.defaultPrevented; - }); - return i; - } - var Ft = location.pathname + location.search; - function Vt() { - var e = te().querySelector('[hx-history-elt],[data-hx-history-elt]'); - return e || te().body; - } - function jt(e, t, r, n) { - if (!M()) { - return; - } - if (Y.config.historyCacheSize <= 0) { - localStorage.removeItem('htmx-history-cache'); - return; - } - e = D(e); - var i = S(localStorage.getItem('htmx-history-cache')) || []; - for (var a = 0; a < i.length; a++) { - if (i[a].url === e) { - i.splice(a, 1); - break; - } - } - var o = { url: e, content: t, title: r, scroll: n }; - fe(te().body, 'htmx:historyItemCreated', { item: o, cache: i }); - i.push(o); - while (i.length > Y.config.historyCacheSize) { - i.shift(); - } - while (i.length > 0) { - try { - localStorage.setItem('htmx-history-cache', JSON.stringify(i)); - break; - } catch (e) { - ue(te().body, 'htmx:historyCacheError', { cause: e, cache: i }); - i.shift(); - } - } - } - function _t(e) { - if (!M()) { - return null; - } - e = D(e); - var t = S(localStorage.getItem('htmx-history-cache')) || []; - for (var r = 0; r < t.length; r++) { - if (t[r].url === e) { - return t[r]; - } - } - return null; - } - function zt(e) { - var t = Y.config.requestClass; - var r = e.cloneNode(true); - ae(f(r, '.' + t), function (e) { - n(e, t); - }); - return r.innerHTML; - } - function Wt() { - var e = Vt(); - var t = Ft || location.pathname + location.search; - var r; - try { - r = te().querySelector( - '[hx-history="false" i],[data-hx-history="false" i]', - ); - } catch (e) { - r = te().querySelector( - '[hx-history="false"],[data-hx-history="false"]', - ); - } - if (!r) { - fe(te().body, 'htmx:beforeHistorySave', { path: t, historyElt: e }); - jt(t, zt(e), te().title, window.scrollY); - } - if (Y.config.historyEnabled) - history.replaceState({ htmx: true }, te().title, window.location.href); - } - function $t(e) { - if (Y.config.getCacheBusterParam) { - e = e.replace(/org\.htmx\.cache-buster=[^&]*&?/, ''); - if (_(e, '&') || _(e, '?')) { - e = e.slice(0, -1); - } - } - if (Y.config.historyEnabled) { - history.pushState({ htmx: true }, '', e); - } - Ft = e; - } - function Gt(e) { - if (Y.config.historyEnabled) history.replaceState({ htmx: true }, '', e); - Ft = e; - } - function Jt(e) { - ae(e, function (e) { - e.call(); - }); - } - function Zt(a) { - var e = new XMLHttpRequest(); - var o = { path: a, xhr: e }; - fe(te().body, 'htmx:historyCacheMiss', o); - e.open('GET', a, true); - e.setRequestHeader('HX-History-Restore-Request', 'true'); - e.onload = function () { - if (this.status >= 200 && this.status < 400) { - fe(te().body, 'htmx:historyCacheMissLoad', o); - var e = l(this.response); - e = e.querySelector('[hx-history-elt],[data-hx-history-elt]') || e; - var t = Vt(); - var r = T(t); - var n = Xe(this.response); - if (n) { - var i = E('title'); - if (i) { - i.innerHTML = n; - } else { - window.document.title = n; - } - } - Pe(t, e, r); - Jt(r.tasks); - Ft = a; - fe(te().body, 'htmx:historyRestore', { - path: a, - cacheMiss: true, - serverResponse: this.response, - }); - } else { - ue(te().body, 'htmx:historyCacheMissLoadError', o); - } - }; - e.send(); - } - function Kt(e) { - Wt(); - e = e || location.pathname + location.search; - var t = _t(e); - if (t) { - var r = l(t.content); - var n = Vt(); - var i = T(n); - Pe(n, r, i); - Jt(i.tasks); - document.title = t.title; - setTimeout(function () { - window.scrollTo(0, t.scroll); - }, 0); - Ft = e; - fe(te().body, 'htmx:historyRestore', { path: e, item: t }); - } else { - if (Y.config.refreshOnHistoryMiss) { - window.location.reload(true); - } else { - Zt(e); - } - } - } - function Yt(e) { - var t = de(e, 'hx-indicator'); - if (t == null) { - t = [e]; - } - ae(t, function (e) { - var t = ie(e); - t.requestCount = (t.requestCount || 0) + 1; - e.classList['add'].call(e.classList, Y.config.requestClass); - }); - return t; - } - function Qt(e) { - var t = de(e, 'hx-disabled-elt'); - if (t == null) { - t = []; - } - ae(t, function (e) { - var t = ie(e); - t.requestCount = (t.requestCount || 0) + 1; - e.setAttribute('disabled', ''); - }); - return t; - } - function er(e, t) { - ae(e, function (e) { - var t = ie(e); - t.requestCount = (t.requestCount || 0) - 1; - if (t.requestCount === 0) { - e.classList['remove'].call(e.classList, Y.config.requestClass); - } - }); - ae(t, function (e) { - var t = ie(e); - t.requestCount = (t.requestCount || 0) - 1; - if (t.requestCount === 0) { - e.removeAttribute('disabled'); - } - }); - } - function tr(e, t) { - for (var r = 0; r < e.length; r++) { - var n = e[r]; - if (n.isSameNode(t)) { - return true; - } - } - return false; - } - function rr(e) { - if (e.name === '' || e.name == null || e.disabled) { - return false; - } - if ( - e.type === 'button' || - e.type === 'submit' || - e.tagName === 'image' || - e.tagName === 'reset' || - e.tagName === 'file' - ) { - return false; - } - if (e.type === 'checkbox' || e.type === 'radio') { - return e.checked; - } - return true; - } - function nr(e, t, r) { - if (e != null && t != null) { - var n = r[e]; - if (n === undefined) { - r[e] = t; - } else if (Array.isArray(n)) { - if (Array.isArray(t)) { - r[e] = n.concat(t); - } else { - n.push(t); - } - } else { - if (Array.isArray(t)) { - r[e] = [n].concat(t); - } else { - r[e] = [n, t]; - } - } - } - } - function ir(t, r, n, e, i) { - if (e == null || tr(t, e)) { - return; - } else { - t.push(e); - } - if (rr(e)) { - var a = Q(e, 'name'); - var o = e.value; - if (e.multiple && e.tagName === 'SELECT') { - o = I(e.querySelectorAll('option:checked')).map(function (e) { - return e.value; - }); - } - if (e.files) { - o = I(e.files); - } - nr(a, o, r); - if (i) { - ar(e, n); - } - } - if (h(e, 'form')) { - var s = e.elements; - ae(s, function (e) { - ir(t, r, n, e, i); - }); - } - } - function ar(e, t) { - if (e.willValidate) { - fe(e, 'htmx:validation:validate'); - if (!e.checkValidity()) { - t.push({ - elt: e, - message: e.validationMessage, - validity: e.validity, - }); - fe(e, 'htmx:validation:failed', { - message: e.validationMessage, - validity: e.validity, - }); - } - } - } - function or(e, t) { - var r = []; - var n = {}; - var i = {}; - var a = []; - var o = ie(e); - if (o.lastButtonClicked && !oe(o.lastButtonClicked)) { - o.lastButtonClicked = null; - } - var s = - (h(e, 'form') && e.noValidate !== true) || - ee(e, 'hx-validate') === 'true'; - if (o.lastButtonClicked) { - s = s && o.lastButtonClicked.formNoValidate !== true; - } - if (t !== 'get') { - ir(r, i, a, d(e, 'form'), s); - } - ir(r, n, a, e, s); - if ( - o.lastButtonClicked || - e.tagName === 'BUTTON' || - (e.tagName === 'INPUT' && Q(e, 'type') === 'submit') - ) { - var l = o.lastButtonClicked || e; - var u = Q(l, 'name'); - nr(u, l.value, i); - } - var f = de(e, 'hx-include'); - ae(f, function (e) { - ir(r, n, a, e, s); - if (!h(e, 'form')) { - ae(e.querySelectorAll(Je), function (e) { - ir(r, n, a, e, s); - }); - } - }); - n = se(n, i); - return { errors: a, values: n }; - } - function sr(e, t, r) { - if (e !== '') { - e += '&'; - } - if (String(r) === '[object Object]') { - r = JSON.stringify(r); - } - var n = encodeURIComponent(r); - e += encodeURIComponent(t) + '=' + n; - return e; - } - function lr(e) { - var t = ''; - for (var r in e) { - if (e.hasOwnProperty(r)) { - var n = e[r]; - if (Array.isArray(n)) { - ae(n, function (e) { - t = sr(t, r, e); - }); - } else { - t = sr(t, r, n); - } - } - } - return t; - } - function ur(e) { - var t = new FormData(); - for (var r in e) { - if (e.hasOwnProperty(r)) { - var n = e[r]; - if (Array.isArray(n)) { - ae(n, function (e) { - t.append(r, e); - }); - } else { - t.append(r, n); - } - } - } - return t; - } - function fr(e, t, r) { - var n = { - 'HX-Request': 'true', - 'HX-Trigger': Q(e, 'id'), - 'HX-Trigger-Name': Q(e, 'name'), - 'HX-Target': ee(t, 'id'), - 'HX-Current-URL': te().location.href, - }; - pr(e, 'hx-headers', false, n); - if (r !== undefined) { - n['HX-Prompt'] = r; - } - if (ie(e).boosted) { - n['HX-Boosted'] = 'true'; - } - return n; - } - function cr(t, e) { - var r = re(e, 'hx-params'); - if (r) { - if (r === 'none') { - return {}; - } else if (r === '*') { - return t; - } else if (r.indexOf('not ') === 0) { - ae(r.substr(4).split(','), function (e) { - e = e.trim(); - delete t[e]; - }); - return t; - } else { - var n = {}; - ae(r.split(','), function (e) { - e = e.trim(); - n[e] = t[e]; - }); - return n; - } - } else { - return t; - } - } - function hr(e) { - return Q(e, 'href') && Q(e, 'href').indexOf('#') >= 0; - } - function dr(e, t) { - var r = t ? t : re(e, 'hx-swap'); - var n = { - swapStyle: ie(e).boosted ? 'innerHTML' : Y.config.defaultSwapStyle, - swapDelay: Y.config.defaultSwapDelay, - settleDelay: Y.config.defaultSettleDelay, - }; - if (Y.config.scrollIntoViewOnBoost && ie(e).boosted && !hr(e)) { - n['show'] = 'top'; - } - if (r) { - var i = P(r); - if (i.length > 0) { - for (var a = 0; a < i.length; a++) { - var o = i[a]; - if (o.indexOf('swap:') === 0) { - n['swapDelay'] = v(o.substr(5)); - } else if (o.indexOf('settle:') === 0) { - n['settleDelay'] = v(o.substr(7)); - } else if (o.indexOf('transition:') === 0) { - n['transition'] = o.substr(11) === 'true'; - } else if (o.indexOf('ignoreTitle:') === 0) { - n['ignoreTitle'] = o.substr(12) === 'true'; - } else if (o.indexOf('scroll:') === 0) { - var s = o.substr(7); - var l = s.split(':'); - var u = l.pop(); - var f = l.length > 0 ? l.join(':') : null; - n['scroll'] = u; - n['scrollTarget'] = f; - } else if (o.indexOf('show:') === 0) { - var c = o.substr(5); - var l = c.split(':'); - var h = l.pop(); - var f = l.length > 0 ? l.join(':') : null; - n['show'] = h; - n['showTarget'] = f; - } else if (o.indexOf('focus-scroll:') === 0) { - var d = o.substr('focus-scroll:'.length); - n['focusScroll'] = d == 'true'; - } else if (a == 0) { - n['swapStyle'] = o; - } else { - y('Unknown modifier in hx-swap: ' + o); - } - } - } - } - return n; - } - function vr(e) { - return ( - re(e, 'hx-encoding') === 'multipart/form-data' || - (h(e, 'form') && Q(e, 'enctype') === 'multipart/form-data') - ); - } - function gr(t, r, n) { - var i = null; - C(r, function (e) { - if (i == null) { - i = e.encodeParameters(t, n, r); - } - }); - if (i != null) { - return i; - } else { - if (vr(r)) { - return ur(n); - } else { - return lr(n); - } - } - } - function T(e) { - return { tasks: [], elts: [e] }; - } - function mr(e, t) { - var r = e[0]; - var n = e[e.length - 1]; - if (t.scroll) { - var i = null; - if (t.scrollTarget) { - i = le(r, t.scrollTarget); - } - if (t.scroll === 'top' && (r || i)) { - i = i || r; - i.scrollTop = 0; - } - if (t.scroll === 'bottom' && (n || i)) { - i = i || n; - i.scrollTop = i.scrollHeight; - } - } - if (t.show) { - var i = null; - if (t.showTarget) { - var a = t.showTarget; - if (t.showTarget === 'window') { - a = 'body'; - } - i = le(r, a); - } - if (t.show === 'top' && (r || i)) { - i = i || r; - i.scrollIntoView({ - block: 'start', - behavior: Y.config.scrollBehavior, - }); - } - if (t.show === 'bottom' && (n || i)) { - i = i || n; - i.scrollIntoView({ block: 'end', behavior: Y.config.scrollBehavior }); - } - } - } - function pr(e, t, r, n) { - if (n == null) { - n = {}; - } - if (e == null) { - return n; - } - var i = ee(e, t); - if (i) { - var a = i.trim(); - var o = r; - if (a === 'unset') { - return null; - } - if (a.indexOf('javascript:') === 0) { - a = a.substr(11); - o = true; - } else if (a.indexOf('js:') === 0) { - a = a.substr(3); - o = true; - } - if (a.indexOf('{') !== 0) { - a = '{' + a + '}'; - } - var s; - if (o) { - s = xr( - e, - function () { - return Function('return (' + a + ')')(); - }, - {}, - ); - } else { - s = S(a); - } - for (var l in s) { - if (s.hasOwnProperty(l)) { - if (n[l] == null) { - n[l] = s[l]; - } - } - } - } - return pr(u(e), t, r, n); - } - function xr(e, t, r) { - if (Y.config.allowEval) { - return t(); - } else { - ue(e, 'htmx:evalDisallowedError'); - return r; - } - } - function yr(e, t) { - return pr(e, 'hx-vars', true, t); - } - function br(e, t) { - return pr(e, 'hx-vals', false, t); - } - function wr(e) { - return se(yr(e), br(e)); - } - function Sr(t, r, n) { - if (n !== null) { - try { - t.setRequestHeader(r, n); - } catch (e) { - t.setRequestHeader(r, encodeURIComponent(n)); - t.setRequestHeader(r + '-URI-AutoEncoded', 'true'); - } - } - } - function Er(t) { - if (t.responseURL && typeof URL !== 'undefined') { - try { - var e = new URL(t.responseURL); - return e.pathname + e.search; - } catch (e) { - ue(te().body, 'htmx:badResponseUrl', { url: t.responseURL }); - } - } - } - function O(e, t) { - return e.getAllResponseHeaders().match(t); - } - function Cr(e, t, r) { - e = e.toLowerCase(); - if (r) { - if (r instanceof Element || L(r, 'String')) { - return ce(e, t, null, null, { - targetOverride: s(r), - returnPromise: true, - }); - } else { - return ce(e, t, s(r.source), r.event, { - handler: r.handler, - headers: r.headers, - values: r.values, - targetOverride: s(r.target), - swapOverride: r.swap, - returnPromise: true, - }); - } - } else { - return ce(e, t, null, null, { returnPromise: true }); - } - } - function Tr(e) { - var t = []; - while (e) { - t.push(e); - e = e.parentElement; - } - return t; - } - function Or(e, t, r) { - var n; - var i; - if (typeof URL === 'function') { - i = new URL(t, document.location.href); - var a = document.location.origin; - n = a === i.origin; - } else { - i = t; - n = g(t, document.location.origin); - } - if (Y.config.selfRequestsOnly) { - if (!n) { - return false; - } - } - return fe(e, 'htmx:validateUrl', se({ url: i, sameHost: n }, r)); - } - function ce(t, r, n, i, a, e) { - var o = null; - var s = null; - a = a != null ? a : {}; - if (a.returnPromise && typeof Promise !== 'undefined') { - var l = new Promise(function (e, t) { - o = e; - s = t; - }); - } - if (n == null) { - n = te().body; - } - var M = a.handler || qr; - if (!oe(n)) { - ne(o); - return l; - } - var u = a.targetOverride || ge(n); - if (u == null || u == he) { - ue(n, 'htmx:targetError', { target: ee(n, 'hx-target') }); - ne(s); - return l; - } - var f = ie(n); - var c = f.lastButtonClicked; - if (c) { - var h = Q(c, 'formaction'); - if (h != null) { - r = h; - } - var d = Q(c, 'formmethod'); - if (d != null) { - if (d.toLowerCase() !== 'dialog') { - t = d; - } - } - } - var v = re(n, 'hx-confirm'); - if (e === undefined) { - var D = function (e) { - return ce(t, r, n, i, a, !!e); - }; - var X = { - target: u, - elt: n, - path: r, - verb: t, - triggeringEvent: i, - etc: a, - issueRequest: D, - question: v, - }; - if (fe(n, 'htmx:confirm', X) === false) { - ne(o); - return l; - } - } - var g = n; - var m = re(n, 'hx-sync'); - var p = null; - var x = false; - if (m) { - var U = m.split(':'); - var B = U[0].trim(); - if (B === 'this') { - g = ve(n, 'hx-sync'); - } else { - g = le(n, B); - } - m = (U[1] || 'drop').trim(); - f = ie(g); - if (m === 'drop' && f.xhr && f.abortable !== true) { - ne(o); - return l; - } else if (m === 'abort') { - if (f.xhr) { - ne(o); - return l; - } else { - x = true; - } - } else if (m === 'replace') { - fe(g, 'htmx:abort'); - } else if (m.indexOf('queue') === 0) { - var F = m.split(' '); - p = (F[1] || 'last').trim(); - } - } - if (f.xhr) { - if (f.abortable) { - fe(g, 'htmx:abort'); - } else { - if (p == null) { - if (i) { - var y = ie(i); - if (y && y.triggerSpec && y.triggerSpec.queue) { - p = y.triggerSpec.queue; - } - } - if (p == null) { - p = 'last'; - } - } - if (f.queuedRequests == null) { - f.queuedRequests = []; - } - if (p === 'first' && f.queuedRequests.length === 0) { - f.queuedRequests.push(function () { - ce(t, r, n, i, a); - }); - } else if (p === 'all') { - f.queuedRequests.push(function () { - ce(t, r, n, i, a); - }); - } else if (p === 'last') { - f.queuedRequests = []; - f.queuedRequests.push(function () { - ce(t, r, n, i, a); - }); - } - ne(o); - return l; - } - } - var b = new XMLHttpRequest(); - f.xhr = b; - f.abortable = x; - var w = function () { - f.xhr = null; - f.abortable = false; - if (f.queuedRequests != null && f.queuedRequests.length > 0) { - var e = f.queuedRequests.shift(); - e(); - } - }; - var V = re(n, 'hx-prompt'); - if (V) { - var S = prompt(V); - if (S === null || !fe(n, 'htmx:prompt', { prompt: S, target: u })) { - ne(o); - w(); - return l; - } - } - if (v && !e) { - if (!confirm(v)) { - ne(o); - w(); - return l; - } - } - var E = fr(n, u, S); - if (a.headers) { - E = se(E, a.headers); - } - var j = or(n, t); - var C = j.errors; - var T = j.values; - if (a.values) { - T = se(T, a.values); - } - var _ = wr(n); - var z = se(T, _); - var O = cr(z, n); - if (t !== 'get' && !vr(n)) { - E['Content-Type'] = 'application/x-www-form-urlencoded'; - } - if (Y.config.getCacheBusterParam && t === 'get') { - O['org.htmx.cache-buster'] = Q(u, 'id') || 'true'; - } - if (r == null || r === '') { - r = te().location.href; - } - var R = pr(n, 'hx-request'); - var W = ie(n).boosted; - var q = Y.config.methodsThatUseUrlParams.indexOf(t) >= 0; - var H = { - boosted: W, - useUrlParams: q, - parameters: O, - unfilteredParameters: z, - headers: E, - target: u, - verb: t, - errors: C, - withCredentials: - a.credentials || R.credentials || Y.config.withCredentials, - timeout: a.timeout || R.timeout || Y.config.timeout, - path: r, - triggeringEvent: i, - }; - if (!fe(n, 'htmx:configRequest', H)) { - ne(o); - w(); - return l; - } - r = H.path; - t = H.verb; - E = H.headers; - O = H.parameters; - C = H.errors; - q = H.useUrlParams; - if (C && C.length > 0) { - fe(n, 'htmx:validation:halted', H); - ne(o); - w(); - return l; - } - var $ = r.split('#'); - var G = $[0]; - var L = $[1]; - var A = r; - if (q) { - A = G; - var J = Object.keys(O).length !== 0; - if (J) { - if (A.indexOf('?') < 0) { - A += '?'; - } else { - A += '&'; - } - A += lr(O); - if (L) { - A += '#' + L; - } - } - } - if (!Or(n, A, H)) { - ue(n, 'htmx:invalidPath', H); - ne(s); - return l; - } - b.open(t.toUpperCase(), A, true); - b.overrideMimeType('text/html'); - b.withCredentials = H.withCredentials; - b.timeout = H.timeout; - if (R.noHeaders) { - } else { - for (var N in E) { - if (E.hasOwnProperty(N)) { - var Z = E[N]; - Sr(b, N, Z); - } - } - } - var I = { - xhr: b, - target: u, - requestConfig: H, - etc: a, - boosted: W, - pathInfo: { requestPath: r, finalRequestPath: A, anchor: L }, - }; - b.onload = function () { - try { - var e = Tr(n); - I.pathInfo.responsePath = Er(b); - M(n, I); - er(k, P); - fe(n, 'htmx:afterRequest', I); - fe(n, 'htmx:afterOnLoad', I); - if (!oe(n)) { - var t = null; - while (e.length > 0 && t == null) { - var r = e.shift(); - if (oe(r)) { - t = r; - } - } - if (t) { - fe(t, 'htmx:afterRequest', I); - fe(t, 'htmx:afterOnLoad', I); - } - } - ne(o); - w(); - } catch (e) { - ue(n, 'htmx:onLoadError', se({ error: e }, I)); - throw e; - } - }; - b.onerror = function () { - er(k, P); - ue(n, 'htmx:afterRequest', I); - ue(n, 'htmx:sendError', I); - ne(s); - w(); - }; - b.onabort = function () { - er(k, P); - ue(n, 'htmx:afterRequest', I); - ue(n, 'htmx:sendAbort', I); - ne(s); - w(); - }; - b.ontimeout = function () { - er(k, P); - ue(n, 'htmx:afterRequest', I); - ue(n, 'htmx:timeout', I); - ne(s); - w(); - }; - if (!fe(n, 'htmx:beforeRequest', I)) { - ne(o); - w(); - return l; - } - var k = Yt(n); - var P = Qt(n); - ae(['loadstart', 'loadend', 'progress', 'abort'], function (t) { - ae([b, b.upload], function (e) { - e.addEventListener(t, function (e) { - fe(n, 'htmx:xhr:' + t, { - lengthComputable: e.lengthComputable, - loaded: e.loaded, - total: e.total, - }); - }); - }); - }); - fe(n, 'htmx:beforeSend', I); - var K = q ? null : gr(b, n, O); - b.send(K); - return l; - } - function Rr(e, t) { - var r = t.xhr; - var n = null; - var i = null; - if (O(r, /HX-Push:/i)) { - n = r.getResponseHeader('HX-Push'); - i = 'push'; - } else if (O(r, /HX-Push-Url:/i)) { - n = r.getResponseHeader('HX-Push-Url'); - i = 'push'; - } else if (O(r, /HX-Replace-Url:/i)) { - n = r.getResponseHeader('HX-Replace-Url'); - i = 'replace'; - } - if (n) { - if (n === 'false') { - return {}; - } else { - return { type: i, path: n }; - } - } - var a = t.pathInfo.finalRequestPath; - var o = t.pathInfo.responsePath; - var s = re(e, 'hx-push-url'); - var l = re(e, 'hx-replace-url'); - var u = ie(e).boosted; - var f = null; - var c = null; - if (s) { - f = 'push'; - c = s; - } else if (l) { - f = 'replace'; - c = l; - } else if (u) { - f = 'push'; - c = o || a; - } - if (c) { - if (c === 'false') { - return {}; - } - if (c === 'true') { - c = o || a; - } - if (t.pathInfo.anchor && c.indexOf('#') === -1) { - c = c + '#' + t.pathInfo.anchor; - } - return { type: f, path: c }; - } else { - return {}; - } - } - function qr(l, u) { - var f = u.xhr; - var c = u.target; - var e = u.etc; - var t = u.requestConfig; - if (!fe(l, 'htmx:beforeOnLoad', u)) return; - if (O(f, /HX-Trigger:/i)) { - Be(f, 'HX-Trigger', l); - } - if (O(f, /HX-Location:/i)) { - Wt(); - var r = f.getResponseHeader('HX-Location'); - var h; - if (r.indexOf('{') === 0) { - h = S(r); - r = h['path']; - delete h['path']; - } - Cr('GET', r, h).then(function () { - $t(r); - }); - return; - } - var n = - O(f, /HX-Refresh:/i) && 'true' === f.getResponseHeader('HX-Refresh'); - if (O(f, /HX-Redirect:/i)) { - location.href = f.getResponseHeader('HX-Redirect'); - n && location.reload(); - return; - } - if (n) { - location.reload(); - return; - } - if (O(f, /HX-Retarget:/i)) { - u.target = te().querySelector(f.getResponseHeader('HX-Retarget')); - } - var d = Rr(l, u); - var i = f.status >= 200 && f.status < 400 && f.status !== 204; - var v = f.response; - var a = f.status >= 400; - var g = Y.config.ignoreTitle; - var o = se( - { shouldSwap: i, serverResponse: v, isError: a, ignoreTitle: g }, - u, - ); - if (!fe(c, 'htmx:beforeSwap', o)) return; - c = o.target; - v = o.serverResponse; - a = o.isError; - g = o.ignoreTitle; - u.target = c; - u.failed = a; - u.successful = !a; - if (o.shouldSwap) { - if (f.status === 286) { - Ke(l); - } - C(l, function (e) { - v = e.transformResponse(v, f, l); - }); - if (d.type) { - Wt(); - } - var s = e.swapOverride; - if (O(f, /HX-Reswap:/i)) { - s = f.getResponseHeader('HX-Reswap'); - } - var h = dr(l, s); - if (h.hasOwnProperty('ignoreTitle')) { - g = h.ignoreTitle; - } - c.classList.add(Y.config.swappingClass); - var m = null; - var p = null; - var x = function () { - try { - var e = document.activeElement; - var t = {}; - try { - t = { - elt: e, - start: e ? e.selectionStart : null, - end: e ? e.selectionEnd : null, - }; - } catch (e) {} - var r; - if (O(f, /HX-Reselect:/i)) { - r = f.getResponseHeader('HX-Reselect'); - } - var n = T(c); - Ue(h.swapStyle, c, l, v, n, r); - if (t.elt && !oe(t.elt) && Q(t.elt, 'id')) { - var i = document.getElementById(Q(t.elt, 'id')); - var a = { - preventScroll: - h.focusScroll !== undefined - ? !h.focusScroll - : !Y.config.defaultFocusScroll, - }; - if (i) { - if (t.start && i.setSelectionRange) { - try { - i.setSelectionRange(t.start, t.end); - } catch (e) {} - } - i.focus(a); - } - } - c.classList.remove(Y.config.swappingClass); - ae(n.elts, function (e) { - if (e.classList) { - e.classList.add(Y.config.settlingClass); - } - fe(e, 'htmx:afterSwap', u); - }); - if (O(f, /HX-Trigger-After-Swap:/i)) { - var o = l; - if (!oe(l)) { - o = te().body; - } - Be(f, 'HX-Trigger-After-Swap', o); - } - var s = function () { - ae(n.tasks, function (e) { - e.call(); - }); - ae(n.elts, function (e) { - if (e.classList) { - e.classList.remove(Y.config.settlingClass); - } - fe(e, 'htmx:afterSettle', u); - }); - if (d.type) { - fe( - te().body, - 'htmx:beforeHistoryUpdate', - se({ history: d }, u), - ); - if (d.type === 'push') { - $t(d.path); - fe(te().body, 'htmx:pushedIntoHistory', { path: d.path }); - } else { - Gt(d.path); - fe(te().body, 'htmx:replacedInHistory', { path: d.path }); - } - } - if (u.pathInfo.anchor) { - var e = te().getElementById(u.pathInfo.anchor); - if (e) { - e.scrollIntoView({ block: 'start', behavior: 'auto' }); - } - } - if (n.title && !g) { - var t = E('title'); - if (t) { - t.innerHTML = n.title; - } else { - window.document.title = n.title; - } - } - mr(n.elts, h); - if (O(f, /HX-Trigger-After-Settle:/i)) { - var r = l; - if (!oe(l)) { - r = te().body; - } - Be(f, 'HX-Trigger-After-Settle', r); - } - ne(m); - }; - if (h.settleDelay > 0) { - setTimeout(s, h.settleDelay); - } else { - s(); - } - } catch (e) { - ue(l, 'htmx:swapError', u); - ne(p); - throw e; - } - }; - var y = Y.config.globalViewTransitions; - if (h.hasOwnProperty('transition')) { - y = h.transition; - } - if ( - y && - fe(l, 'htmx:beforeTransition', u) && - typeof Promise !== 'undefined' && - document.startViewTransition - ) { - var b = new Promise(function (e, t) { - m = e; - p = t; - }); - var w = x; - x = function () { - document.startViewTransition(function () { - w(); - return b; - }); - }; - } - if (h.swapDelay > 0) { - setTimeout(x, h.swapDelay); - } else { - x(); - } - } - if (a) { - ue( - l, - 'htmx:responseError', - se( - { - error: - 'Response Status Error Code ' + - f.status + - ' from ' + - u.pathInfo.requestPath, - }, - u, - ), - ); - } - } - var Hr = {}; - function Lr() { - return { - init: function (e) { - return null; - }, - onEvent: function (e, t) { - return true; - }, - transformResponse: function (e, t, r) { - return e; - }, - isInlineSwap: function (e) { - return false; - }, - handleSwap: function (e, t, r, n) { - return false; - }, - encodeParameters: function (e, t, r) { - return null; - }, - }; - } - function Ar(e, t) { - if (t.init) { - t.init(r); - } - Hr[e] = se(Lr(), t); - } - function Nr(e) { - delete Hr[e]; - } - function Ir(e, r, n) { - if (e == undefined) { - return r; - } - if (r == undefined) { - r = []; - } - if (n == undefined) { - n = []; - } - var t = ee(e, 'hx-ext'); - if (t) { - ae(t.split(','), function (e) { - e = e.replace(/ /g, ''); - if (e.slice(0, 7) == 'ignore:') { - n.push(e.slice(7)); - return; - } - if (n.indexOf(e) < 0) { - var t = Hr[e]; - if (t && r.indexOf(t) < 0) { - r.push(t); - } - } - }); - } - return Ir(u(e), r, n); - } - var kr = false; - te().addEventListener('DOMContentLoaded', function () { - kr = true; - }); - function Pr(e) { - if (kr || te().readyState === 'complete') { - e(); - } else { - te().addEventListener('DOMContentLoaded', e); - } - } - function Mr() { - if (Y.config.includeIndicatorStyles !== false) { - te().head.insertAdjacentHTML( - 'beforeend', - '', - ); - } - } - function Dr() { - var e = te().querySelector('meta[name="htmx-config"]'); - if (e) { - return S(e.content); - } else { - return null; - } - } - function Xr() { - var e = Dr(); - if (e) { - Y.config = se(Y.config, e); - } - } - Pr(function () { - Xr(); - Mr(); - var e = te().body; - Dt(e); - var t = te().querySelectorAll( - "[hx-trigger='restored'],[data-hx-trigger='restored']", - ); - e.addEventListener('htmx:abort', function (e) { - var t = e.target; - var r = ie(t); - if (r && r.xhr) { - r.xhr.abort(); - } - }); - var r = window.onpopstate; - window.onpopstate = function (e) { - if (e.state && e.state.htmx) { - Kt(); - ae(t, function (e) { - fe(e, 'htmx:restored', { document: te(), triggerEvent: fe }); - }); - } else { - if (r) { - r(e); - } - } - }; - setTimeout(function () { - fe(e, 'htmx:load', {}); - e = null; - }, 0); - }); - return Y; - })(); -}); +var htmx = function () { "use strict"; const Q = { onLoad: null, process: null, on: null, off: null, trigger: null, ajax: null, find: null, findAll: null, closest: null, values: function (e, t) { const n = cn(e, t || "post"); return n.values }, remove: null, addClass: null, removeClass: null, toggleClass: null, takeClass: null, swap: null, defineExtension: null, removeExtension: null, logAll: null, logNone: null, logger: null, config: { historyEnabled: true, historyCacheSize: 10, refreshOnHistoryMiss: false, defaultSwapStyle: "innerHTML", defaultSwapDelay: 0, defaultSettleDelay: 20, includeIndicatorStyles: true, indicatorClass: "htmx-indicator", requestClass: "htmx-request", addedClass: "htmx-added", settlingClass: "htmx-settling", swappingClass: "htmx-swapping", allowEval: true, allowScriptTags: true, inlineScriptNonce: "", inlineStyleNonce: "", attributesToSettle: ["class", "style", "width", "height"], withCredentials: false, timeout: 0, wsReconnectDelay: "full-jitter", wsBinaryType: "blob", disableSelector: "[hx-disable], [data-hx-disable]", scrollBehavior: "instant", defaultFocusScroll: false, getCacheBusterParam: false, globalViewTransitions: false, methodsThatUseUrlParams: ["get", "delete"], selfRequestsOnly: true, ignoreTitle: false, scrollIntoViewOnBoost: true, triggerSpecsCache: null, disableInheritance: false, responseHandling: [{ code: "204", swap: false }, { code: "[23]..", swap: true }, { code: "[45]..", swap: false, error: true }], allowNestedOobSwaps: true }, parseInterval: null, _: null, version: "2.0.4" }; Q.onLoad = j; Q.process = kt; Q.on = ye; Q.off = be; Q.trigger = he; Q.ajax = Rn; Q.find = u; Q.findAll = x; Q.closest = g; Q.remove = z; Q.addClass = K; Q.removeClass = G; Q.toggleClass = W; Q.takeClass = Z; Q.swap = $e; Q.defineExtension = Fn; Q.removeExtension = Bn; Q.logAll = V; Q.logNone = _; Q.parseInterval = d; Q._ = e; const n = { addTriggerHandler: St, bodyContains: le, canAccessLocalStorage: B, findThisElement: Se, filterValues: hn, swap: $e, hasAttribute: s, getAttributeValue: te, getClosestAttributeValue: re, getClosestMatch: o, getExpressionVars: En, getHeaders: fn, getInputValues: cn, getInternalData: ie, getSwapSpecification: gn, getTriggerSpecs: st, getTarget: Ee, makeFragment: P, mergeObjects: ce, makeSettleInfo: xn, oobSwap: He, querySelectorExt: ae, settleImmediately: Kt, shouldCancel: ht, triggerEvent: he, triggerErrorEvent: fe, withExtensions: Ft }; const r = ["get", "post", "put", "delete", "patch"]; const H = r.map(function (e) { return "[hx-" + e + "], [data-hx-" + e + "]" }).join(", "); function d(e) { if (e == undefined) { return undefined } let t = NaN; if (e.slice(-2) == "ms") { t = parseFloat(e.slice(0, -2)) } else if (e.slice(-1) == "s") { t = parseFloat(e.slice(0, -1)) * 1e3 } else if (e.slice(-1) == "m") { t = parseFloat(e.slice(0, -1)) * 1e3 * 60 } else { t = parseFloat(e) } return isNaN(t) ? undefined : t } function ee(e, t) { return e instanceof Element && e.getAttribute(t) } function s(e, t) { return !!e.hasAttribute && (e.hasAttribute(t) || e.hasAttribute("data-" + t)) } function te(e, t) { return ee(e, t) || ee(e, "data-" + t) } function c(e) { const t = e.parentElement; if (!t && e.parentNode instanceof ShadowRoot) return e.parentNode; return t } function ne() { return document } function m(e, t) { return e.getRootNode ? e.getRootNode({ composed: t }) : ne() } function o(e, t) { while (e && !t(e)) { e = c(e) } return e || null } function i(e, t, n) { const r = te(t, n); const o = te(t, "hx-disinherit"); var i = te(t, "hx-inherit"); if (e !== t) { if (Q.config.disableInheritance) { if (i && (i === "*" || i.split(" ").indexOf(n) >= 0)) { return r } else { return null } } if (o && (o === "*" || o.split(" ").indexOf(n) >= 0)) { return "unset" } } return r } function re(t, n) { let r = null; o(t, function (e) { return !!(r = i(t, ue(e), n)) }); if (r !== "unset") { return r } } function h(e, t) { const n = e instanceof Element && (e.matches || e.matchesSelector || e.msMatchesSelector || e.mozMatchesSelector || e.webkitMatchesSelector || e.oMatchesSelector); return !!n && n.call(e, t) } function T(e) { const t = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; const n = t.exec(e); if (n) { return n[1].toLowerCase() } else { return "" } } function q(e) { const t = new DOMParser; return t.parseFromString(e, "text/html") } function L(e, t) { while (t.childNodes.length > 0) { e.append(t.childNodes[0]) } } function A(e) { const t = ne().createElement("script"); se(e.attributes, function (e) { t.setAttribute(e.name, e.value) }); t.textContent = e.textContent; t.async = false; if (Q.config.inlineScriptNonce) { t.nonce = Q.config.inlineScriptNonce } return t } function N(e) { return e.matches("script") && (e.type === "text/javascript" || e.type === "module" || e.type === "") } function I(e) { Array.from(e.querySelectorAll("script")).forEach(e => { if (N(e)) { const t = A(e); const n = e.parentNode; try { n.insertBefore(t, e) } catch (e) { O(e) } finally { e.remove() } } }) } function P(e) { const t = e.replace(/]*)?>[\s\S]*?<\/head>/i, ""); const n = T(t); let r; if (n === "html") { r = new DocumentFragment; const i = q(e); L(r, i.body); r.title = i.title } else if (n === "body") { r = new DocumentFragment; const i = q(t); L(r, i.body); r.title = i.title } else { const i = q('"); r = i.querySelector("template").content; r.title = i.title; var o = r.querySelector("title"); if (o && o.parentNode === r) { o.remove(); r.title = o.innerText } } if (r) { if (Q.config.allowScriptTags) { I(r) } else { r.querySelectorAll("script").forEach(e => e.remove()) } } return r } function oe(e) { if (e) { e() } } function t(e, t) { return Object.prototype.toString.call(e) === "[object " + t + "]" } function k(e) { return typeof e === "function" } function D(e) { return t(e, "Object") } function ie(e) { const t = "htmx-internal-data"; let n = e[t]; if (!n) { n = e[t] = {} } return n } function M(t) { const n = []; if (t) { for (let e = 0; e < t.length; e++) { n.push(t[e]) } } return n } function se(t, n) { if (t) { for (let e = 0; e < t.length; e++) { n(t[e]) } } } function X(e) { const t = e.getBoundingClientRect(); const n = t.top; const r = t.bottom; return n < window.innerHeight && r >= 0 } function le(e) { return e.getRootNode({ composed: true }) === document } function F(e) { return e.trim().split(/\s+/) } function ce(e, t) { for (const n in t) { if (t.hasOwnProperty(n)) { e[n] = t[n] } } return e } function S(e) { try { return JSON.parse(e) } catch (e) { O(e); return null } } function B() { const e = "htmx:localStorageTest"; try { localStorage.setItem(e, e); localStorage.removeItem(e); return true } catch (e) { return false } } function U(t) { try { const e = new URL(t); if (e) { t = e.pathname + e.search } if (!/^\/$/.test(t)) { t = t.replace(/\/+$/, "") } return t } catch (e) { return t } } function e(e) { return vn(ne().body, function () { return eval(e) }) } function j(t) { const e = Q.on("htmx:load", function (e) { t(e.detail.elt) }); return e } function V() { Q.logger = function (e, t, n) { if (console) { console.log(t, e, n) } } } function _() { Q.logger = null } function u(e, t) { if (typeof e !== "string") { return e.querySelector(t) } else { return u(ne(), e) } } function x(e, t) { if (typeof e !== "string") { return e.querySelectorAll(t) } else { return x(ne(), e) } } function E() { return window } function z(e, t) { e = y(e); if (t) { E().setTimeout(function () { z(e); e = null }, t) } else { c(e).removeChild(e) } } function ue(e) { return e instanceof Element ? e : null } function $(e) { return e instanceof HTMLElement ? e : null } function J(e) { return typeof e === "string" ? e : null } function f(e) { return e instanceof Element || e instanceof Document || e instanceof DocumentFragment ? e : null } function K(e, t, n) { e = ue(y(e)); if (!e) { return } if (n) { E().setTimeout(function () { K(e, t); e = null }, n) } else { e.classList && e.classList.add(t) } } function G(e, t, n) { let r = ue(y(e)); if (!r) { return } if (n) { E().setTimeout(function () { G(r, t); r = null }, n) } else { if (r.classList) { r.classList.remove(t); if (r.classList.length === 0) { r.removeAttribute("class") } } } } function W(e, t) { e = y(e); e.classList.toggle(t) } function Z(e, t) { e = y(e); se(e.parentElement.children, function (e) { G(e, t) }); K(ue(e), t) } function g(e, t) { e = ue(y(e)); if (e && e.closest) { return e.closest(t) } else { do { if (e == null || h(e, t)) { return e } } while (e = e && ue(c(e))); return null } } function l(e, t) { return e.substring(0, t.length) === t } function Y(e, t) { return e.substring(e.length - t.length) === t } function ge(e) { const t = e.trim(); if (l(t, "<") && Y(t, "/>")) { return t.substring(1, t.length - 2) } else { return t } } function p(t, r, n) { if (r.indexOf("global ") === 0) { return p(t, r.slice(7), true) } t = y(t); const o = []; { let t = 0; let n = 0; for (let e = 0; e < r.length; e++) { const l = r[e]; if (l === "," && t === 0) { o.push(r.substring(n, e)); n = e + 1; continue } if (l === "<") { t++ } else if (l === "/" && e < r.length - 1 && r[e + 1] === ">") { t-- } } if (n < r.length) { o.push(r.substring(n)) } } const i = []; const s = []; while (o.length > 0) { const r = ge(o.shift()); let e; if (r.indexOf("closest ") === 0) { e = g(ue(t), ge(r.substr(8))) } else if (r.indexOf("find ") === 0) { e = u(f(t), ge(r.substr(5))) } else if (r === "next" || r === "nextElementSibling") { e = ue(t).nextElementSibling } else if (r.indexOf("next ") === 0) { e = pe(t, ge(r.substr(5)), !!n) } else if (r === "previous" || r === "previousElementSibling") { e = ue(t).previousElementSibling } else if (r.indexOf("previous ") === 0) { e = me(t, ge(r.substr(9)), !!n) } else if (r === "document") { e = document } else if (r === "window") { e = window } else if (r === "body") { e = document.body } else if (r === "root") { e = m(t, !!n) } else if (r === "host") { e = t.getRootNode().host } else { s.push(r) } if (e) { i.push(e) } } if (s.length > 0) { const e = s.join(","); const c = f(m(t, !!n)); i.push(...M(c.querySelectorAll(e))) } return i } var pe = function (t, e, n) { const r = f(m(t, n)).querySelectorAll(e); for (let e = 0; e < r.length; e++) { const o = r[e]; if (o.compareDocumentPosition(t) === Node.DOCUMENT_POSITION_PRECEDING) { return o } } }; var me = function (t, e, n) { const r = f(m(t, n)).querySelectorAll(e); for (let e = r.length - 1; e >= 0; e--) { const o = r[e]; if (o.compareDocumentPosition(t) === Node.DOCUMENT_POSITION_FOLLOWING) { return o } } }; function ae(e, t) { if (typeof e !== "string") { return p(e, t)[0] } else { return p(ne().body, e)[0] } } function y(e, t) { if (typeof e === "string") { return u(f(t) || document, e) } else { return e } } function xe(e, t, n, r) { if (k(t)) { return { target: ne().body, event: J(e), listener: t, options: n } } else { return { target: y(e), event: J(t), listener: n, options: r } } } function ye(t, n, r, o) { Vn(function () { const e = xe(t, n, r, o); e.target.addEventListener(e.event, e.listener, e.options) }); const e = k(n); return e ? n : r } function be(t, n, r) { Vn(function () { const e = xe(t, n, r); e.target.removeEventListener(e.event, e.listener) }); return k(n) ? n : r } const ve = ne().createElement("output"); function we(e, t) { const n = re(e, t); if (n) { if (n === "this") { return [Se(e, t)] } else { const r = p(e, n); if (r.length === 0) { O('The selector "' + n + '" on ' + t + " returned no matches!"); return [ve] } else { return r } } } } function Se(e, t) { return ue(o(e, function (e) { return te(ue(e), t) != null })) } function Ee(e) { const t = re(e, "hx-target"); if (t) { if (t === "this") { return Se(e, "hx-target") } else { return ae(e, t) } } else { const n = ie(e); if (n.boosted) { return ne().body } else { return e } } } function Ce(t) { const n = Q.config.attributesToSettle; for (let e = 0; e < n.length; e++) { if (t === n[e]) { return true } } return false } function Oe(t, n) { se(t.attributes, function (e) { if (!n.hasAttribute(e.name) && Ce(e.name)) { t.removeAttribute(e.name) } }); se(n.attributes, function (e) { if (Ce(e.name)) { t.setAttribute(e.name, e.value) } }) } function Re(t, e) { const n = Un(e); for (let e = 0; e < n.length; e++) { const r = n[e]; try { if (r.isInlineSwap(t)) { return true } } catch (e) { O(e) } } return t === "outerHTML" } function He(e, o, i, t) { t = t || ne(); let n = "#" + ee(o, "id"); let s = "outerHTML"; if (e === "true") { } else if (e.indexOf(":") > 0) { s = e.substring(0, e.indexOf(":")); n = e.substring(e.indexOf(":") + 1) } else { s = e } o.removeAttribute("hx-swap-oob"); o.removeAttribute("data-hx-swap-oob"); const r = p(t, n, false); if (r) { se(r, function (e) { let t; const n = o.cloneNode(true); t = ne().createDocumentFragment(); t.appendChild(n); if (!Re(s, e)) { t = f(n) } const r = { shouldSwap: true, target: e, fragment: t }; if (!he(e, "htmx:oobBeforeSwap", r)) return; e = r.target; if (r.shouldSwap) { qe(t); _e(s, e, e, t, i); Te() } se(i.elts, function (e) { he(e, "htmx:oobAfterSwap", r) }) }); o.parentNode.removeChild(o) } else { o.parentNode.removeChild(o); fe(ne().body, "htmx:oobErrorNoTarget", { content: o }) } return e } function Te() { const e = u("#--htmx-preserve-pantry--"); if (e) { for (const t of [...e.children]) { const n = u("#" + t.id); n.parentNode.moveBefore(t, n); n.remove() } e.remove() } } function qe(e) { se(x(e, "[hx-preserve], [data-hx-preserve]"), function (e) { const t = te(e, "id"); const n = ne().getElementById(t); if (n != null) { if (e.moveBefore) { let e = u("#--htmx-preserve-pantry--"); if (e == null) { ne().body.insertAdjacentHTML("afterend", "
"); e = u("#--htmx-preserve-pantry--") } e.moveBefore(n, null) } else { e.parentNode.replaceChild(n, e) } } }) } function Le(l, e, c) { se(e.querySelectorAll("[id]"), function (t) { const n = ee(t, "id"); if (n && n.length > 0) { const r = n.replace("'", "\\'"); const o = t.tagName.replace(":", "\\:"); const e = f(l); const i = e && e.querySelector(o + "[id='" + r + "']"); if (i && i !== e) { const s = t.cloneNode(); Oe(t, i); c.tasks.push(function () { Oe(t, s) }) } } }) } function Ae(e) { return function () { G(e, Q.config.addedClass); kt(ue(e)); Ne(f(e)); he(e, "htmx:load") } } function Ne(e) { const t = "[autofocus]"; const n = $(h(e, t) ? e : e.querySelector(t)); if (n != null) { n.focus() } } function a(e, t, n, r) { Le(e, n, r); while (n.childNodes.length > 0) { const o = n.firstChild; K(ue(o), Q.config.addedClass); e.insertBefore(o, t); if (o.nodeType !== Node.TEXT_NODE && o.nodeType !== Node.COMMENT_NODE) { r.tasks.push(Ae(o)) } } } function Ie(e, t) { let n = 0; while (n < e.length) { t = (t << 5) - t + e.charCodeAt(n++) | 0 } return t } function Pe(t) { let n = 0; if (t.attributes) { for (let e = 0; e < t.attributes.length; e++) { const r = t.attributes[e]; if (r.value) { n = Ie(r.name, n); n = Ie(r.value, n) } } } return n } function ke(t) { const n = ie(t); if (n.onHandlers) { for (let e = 0; e < n.onHandlers.length; e++) { const r = n.onHandlers[e]; be(t, r.event, r.listener) } delete n.onHandlers } } function De(e) { const t = ie(e); if (t.timeout) { clearTimeout(t.timeout) } if (t.listenerInfos) { se(t.listenerInfos, function (e) { if (e.on) { be(e.on, e.trigger, e.listener) } }) } ke(e); se(Object.keys(t), function (e) { if (e !== "firstInitCompleted") delete t[e] }) } function b(e) { he(e, "htmx:beforeCleanupElement"); De(e); if (e.children) { se(e.children, function (e) { b(e) }) } } function Me(t, e, n) { if (t instanceof Element && t.tagName === "BODY") { return Ve(t, e, n) } let r; const o = t.previousSibling; const i = c(t); if (!i) { return } a(i, t, e, n); if (o == null) { r = i.firstChild } else { r = o.nextSibling } n.elts = n.elts.filter(function (e) { return e !== t }); while (r && r !== t) { if (r instanceof Element) { n.elts.push(r) } r = r.nextSibling } b(t); if (t instanceof Element) { t.remove() } else { t.parentNode.removeChild(t) } } function Xe(e, t, n) { return a(e, e.firstChild, t, n) } function Fe(e, t, n) { return a(c(e), e, t, n) } function Be(e, t, n) { return a(e, null, t, n) } function Ue(e, t, n) { return a(c(e), e.nextSibling, t, n) } function je(e) { b(e); const t = c(e); if (t) { return t.removeChild(e) } } function Ve(e, t, n) { const r = e.firstChild; a(e, r, t, n); if (r) { while (r.nextSibling) { b(r.nextSibling); e.removeChild(r.nextSibling) } b(r); e.removeChild(r) } } function _e(t, e, n, r, o) { switch (t) { case "none": return; case "outerHTML": Me(n, r, o); return; case "afterbegin": Xe(n, r, o); return; case "beforebegin": Fe(n, r, o); return; case "beforeend": Be(n, r, o); return; case "afterend": Ue(n, r, o); return; case "delete": je(n); return; default: var i = Un(e); for (let e = 0; e < i.length; e++) { const s = i[e]; try { const l = s.handleSwap(t, n, r, o); if (l) { if (Array.isArray(l)) { for (let e = 0; e < l.length; e++) { const c = l[e]; if (c.nodeType !== Node.TEXT_NODE && c.nodeType !== Node.COMMENT_NODE) { o.tasks.push(Ae(c)) } } } return } } catch (e) { O(e) } } if (t === "innerHTML") { Ve(n, r, o) } else { _e(Q.config.defaultSwapStyle, e, n, r, o) } } } function ze(e, n, r) { var t = x(e, "[hx-swap-oob], [data-hx-swap-oob]"); se(t, function (e) { if (Q.config.allowNestedOobSwaps || e.parentElement === null) { const t = te(e, "hx-swap-oob"); if (t != null) { He(t, e, n, r) } } else { e.removeAttribute("hx-swap-oob"); e.removeAttribute("data-hx-swap-oob") } }); return t.length > 0 } function $e(e, t, r, o) { if (!o) { o = {} } e = y(e); const i = o.contextElement ? m(o.contextElement, false) : ne(); const n = document.activeElement; let s = {}; try { s = { elt: n, start: n ? n.selectionStart : null, end: n ? n.selectionEnd : null } } catch (e) { } const l = xn(e); if (r.swapStyle === "textContent") { e.textContent = t } else { let n = P(t); l.title = n.title; if (o.selectOOB) { const u = o.selectOOB.split(","); for (let t = 0; t < u.length; t++) { const a = u[t].split(":", 2); let e = a[0].trim(); if (e.indexOf("#") === 0) { e = e.substring(1) } const f = a[1] || "true"; const h = n.querySelector("#" + e); if (h) { He(f, h, l, i) } } } ze(n, l, i); se(x(n, "template"), function (e) { if (e.content && ze(e.content, l, i)) { e.remove() } }); if (o.select) { const d = ne().createDocumentFragment(); se(n.querySelectorAll(o.select), function (e) { d.appendChild(e) }); n = d } qe(n); _e(r.swapStyle, o.contextElement, e, n, l); Te() } if (s.elt && !le(s.elt) && ee(s.elt, "id")) { const g = document.getElementById(ee(s.elt, "id")); const p = { preventScroll: r.focusScroll !== undefined ? !r.focusScroll : !Q.config.defaultFocusScroll }; if (g) { if (s.start && g.setSelectionRange) { try { g.setSelectionRange(s.start, s.end) } catch (e) { } } g.focus(p) } } e.classList.remove(Q.config.swappingClass); se(l.elts, function (e) { if (e.classList) { e.classList.add(Q.config.settlingClass) } he(e, "htmx:afterSwap", o.eventInfo) }); if (o.afterSwapCallback) { o.afterSwapCallback() } if (!r.ignoreTitle) { kn(l.title) } const c = function () { se(l.tasks, function (e) { e.call() }); se(l.elts, function (e) { if (e.classList) { e.classList.remove(Q.config.settlingClass) } he(e, "htmx:afterSettle", o.eventInfo) }); if (o.anchor) { const e = ue(y("#" + o.anchor)); if (e) { e.scrollIntoView({ block: "start", behavior: "auto" }) } } yn(l.elts, r); if (o.afterSettleCallback) { o.afterSettleCallback() } }; if (r.settleDelay > 0) { E().setTimeout(c, r.settleDelay) } else { c() } } function Je(e, t, n) { const r = e.getResponseHeader(t); if (r.indexOf("{") === 0) { const o = S(r); for (const i in o) { if (o.hasOwnProperty(i)) { let e = o[i]; if (D(e)) { n = e.target !== undefined ? e.target : n } else { e = { value: e } } he(n, i, e) } } } else { const s = r.split(","); for (let e = 0; e < s.length; e++) { he(n, s[e].trim(), []) } } } const Ke = /\s/; const v = /[\s,]/; const Ge = /[_$a-zA-Z]/; const We = /[_$a-zA-Z0-9]/; const Ze = ['"', "'", "/"]; const w = /[^\s]/; const Ye = /[{(]/; const Qe = /[})]/; function et(e) { const t = []; let n = 0; while (n < e.length) { if (Ge.exec(e.charAt(n))) { var r = n; while (We.exec(e.charAt(n + 1))) { n++ } t.push(e.substring(r, n + 1)) } else if (Ze.indexOf(e.charAt(n)) !== -1) { const o = e.charAt(n); var r = n; n++; while (n < e.length && e.charAt(n) !== o) { if (e.charAt(n) === "\\") { n++ } n++ } t.push(e.substring(r, n + 1)) } else { const i = e.charAt(n); t.push(i) } n++ } return t } function tt(e, t, n) { return Ge.exec(e.charAt(0)) && e !== "true" && e !== "false" && e !== "this" && e !== n && t !== "." } function nt(r, o, i) { if (o[0] === "[") { o.shift(); let e = 1; let t = " return (function(" + i + "){ return ("; let n = null; while (o.length > 0) { const s = o[0]; if (s === "]") { e--; if (e === 0) { if (n === null) { t = t + "true" } o.shift(); t += ")})"; try { const l = vn(r, function () { return Function(t)() }, function () { return true }); l.source = t; return l } catch (e) { fe(ne().body, "htmx:syntax:error", { error: e, source: t }); return null } } } else if (s === "[") { e++ } if (tt(s, n, i)) { t += "((" + i + "." + s + ") ? (" + i + "." + s + ") : (window." + s + "))" } else { t = t + s } n = o.shift() } } } function C(e, t) { let n = ""; while (e.length > 0 && !t.test(e[0])) { n += e.shift() } return n } function rt(e) { let t; if (e.length > 0 && Ye.test(e[0])) { e.shift(); t = C(e, Qe).trim(); e.shift() } else { t = C(e, v) } return t } const ot = "input, textarea, select"; function it(e, t, n) { const r = []; const o = et(t); do { C(o, w); const l = o.length; const c = C(o, /[,\[\s]/); if (c !== "") { if (c === "every") { const u = { trigger: "every" }; C(o, w); u.pollInterval = d(C(o, /[,\[\s]/)); C(o, w); var i = nt(e, o, "event"); if (i) { u.eventFilter = i } r.push(u) } else { const a = { trigger: c }; var i = nt(e, o, "event"); if (i) { a.eventFilter = i } C(o, w); while (o.length > 0 && o[0] !== ",") { const f = o.shift(); if (f === "changed") { a.changed = true } else if (f === "once") { a.once = true } else if (f === "consume") { a.consume = true } else if (f === "delay" && o[0] === ":") { o.shift(); a.delay = d(C(o, v)) } else if (f === "from" && o[0] === ":") { o.shift(); if (Ye.test(o[0])) { var s = rt(o) } else { var s = C(o, v); if (s === "closest" || s === "find" || s === "next" || s === "previous") { o.shift(); const h = rt(o); if (h.length > 0) { s += " " + h } } } a.from = s } else if (f === "target" && o[0] === ":") { o.shift(); a.target = rt(o) } else if (f === "throttle" && o[0] === ":") { o.shift(); a.throttle = d(C(o, v)) } else if (f === "queue" && o[0] === ":") { o.shift(); a.queue = C(o, v) } else if (f === "root" && o[0] === ":") { o.shift(); a[f] = rt(o) } else if (f === "threshold" && o[0] === ":") { o.shift(); a[f] = C(o, v) } else { fe(e, "htmx:syntax:error", { token: o.shift() }) } C(o, w) } r.push(a) } } if (o.length === l) { fe(e, "htmx:syntax:error", { token: o.shift() }) } C(o, w) } while (o[0] === "," && o.shift()); if (n) { n[t] = r } return r } function st(e) { const t = te(e, "hx-trigger"); let n = []; if (t) { const r = Q.config.triggerSpecsCache; n = r && r[t] || it(e, t, r) } if (n.length > 0) { return n } else if (h(e, "form")) { return [{ trigger: "submit" }] } else if (h(e, 'input[type="button"], input[type="submit"]')) { return [{ trigger: "click" }] } else if (h(e, ot)) { return [{ trigger: "change" }] } else { return [{ trigger: "click" }] } } function lt(e) { ie(e).cancelled = true } function ct(e, t, n) { const r = ie(e); r.timeout = E().setTimeout(function () { if (le(e) && r.cancelled !== true) { if (!gt(n, e, Mt("hx:poll:trigger", { triggerSpec: n, target: e }))) { t(e) } ct(e, t, n) } }, n.pollInterval) } function ut(e) { return location.hostname === e.hostname && ee(e, "href") && ee(e, "href").indexOf("#") !== 0 } function at(e) { return g(e, Q.config.disableSelector) } function ft(t, n, e) { if (t instanceof HTMLAnchorElement && ut(t) && (t.target === "" || t.target === "_self") || t.tagName === "FORM" && String(ee(t, "method")).toLowerCase() !== "dialog") { n.boosted = true; let r, o; if (t.tagName === "A") { r = "get"; o = ee(t, "href") } else { const i = ee(t, "method"); r = i ? i.toLowerCase() : "get"; o = ee(t, "action"); if (o == null || o === "") { o = ne().location.href } if (r === "get" && o.includes("?")) { o = o.replace(/\?[^#]+/, "") } } e.forEach(function (e) { pt(t, function (e, t) { const n = ue(e); if (at(n)) { b(n); return } de(r, o, n, t) }, n, e, true) }) } } function ht(e, t) { const n = ue(t); if (!n) { return false } if (e.type === "submit" || e.type === "click") { if (n.tagName === "FORM") { return true } if (h(n, 'input[type="submit"], button') && (h(n, "[form]") || g(n, "form") !== null)) { return true } if (n instanceof HTMLAnchorElement && n.href && (n.getAttribute("href") === "#" || n.getAttribute("href").indexOf("#") !== 0)) { return true } } return false } function dt(e, t) { return ie(e).boosted && e instanceof HTMLAnchorElement && t.type === "click" && (t.ctrlKey || t.metaKey) } function gt(e, t, n) { const r = e.eventFilter; if (r) { try { return r.call(t, n) !== true } catch (e) { const o = r.source; fe(ne().body, "htmx:eventFilter:error", { error: e, source: o }); return true } } return false } function pt(l, c, e, u, a) { const f = ie(l); let t; if (u.from) { t = p(l, u.from) } else { t = [l] } if (u.changed) { if (!("lastValue" in f)) { f.lastValue = new WeakMap } t.forEach(function (e) { if (!f.lastValue.has(u)) { f.lastValue.set(u, new WeakMap) } f.lastValue.get(u).set(e, e.value) }) } se(t, function (i) { const s = function (e) { if (!le(l)) { i.removeEventListener(u.trigger, s); return } if (dt(l, e)) { return } if (a || ht(e, l)) { e.preventDefault() } if (gt(u, l, e)) { return } const t = ie(e); t.triggerSpec = u; if (t.handledFor == null) { t.handledFor = [] } if (t.handledFor.indexOf(l) < 0) { t.handledFor.push(l); if (u.consume) { e.stopPropagation() } if (u.target && e.target) { if (!h(ue(e.target), u.target)) { return } } if (u.once) { if (f.triggeredOnce) { return } else { f.triggeredOnce = true } } if (u.changed) { const n = event.target; const r = n.value; const o = f.lastValue.get(u); if (o.has(n) && o.get(n) === r) { return } o.set(n, r) } if (f.delayed) { clearTimeout(f.delayed) } if (f.throttle) { return } if (u.throttle > 0) { if (!f.throttle) { he(l, "htmx:trigger"); c(l, e); f.throttle = E().setTimeout(function () { f.throttle = null }, u.throttle) } } else if (u.delay > 0) { f.delayed = E().setTimeout(function () { he(l, "htmx:trigger"); c(l, e) }, u.delay) } else { he(l, "htmx:trigger"); c(l, e) } } }; if (e.listenerInfos == null) { e.listenerInfos = [] } e.listenerInfos.push({ trigger: u.trigger, listener: s, on: i }); i.addEventListener(u.trigger, s) }) } let mt = false; let xt = null; function yt() { if (!xt) { xt = function () { mt = true }; window.addEventListener("scroll", xt); window.addEventListener("resize", xt); setInterval(function () { if (mt) { mt = false; se(ne().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"), function (e) { bt(e) }) } }, 200) } } function bt(e) { if (!s(e, "data-hx-revealed") && X(e)) { e.setAttribute("data-hx-revealed", "true"); const t = ie(e); if (t.initHash) { he(e, "revealed") } else { e.addEventListener("htmx:afterProcessNode", function () { he(e, "revealed") }, { once: true }) } } } function vt(e, t, n, r) { const o = function () { if (!n.loaded) { n.loaded = true; he(e, "htmx:trigger"); t(e) } }; if (r > 0) { E().setTimeout(o, r) } else { o() } } function wt(t, n, e) { let i = false; se(r, function (r) { if (s(t, "hx-" + r)) { const o = te(t, "hx-" + r); i = true; n.path = o; n.verb = r; e.forEach(function (e) { St(t, e, n, function (e, t) { const n = ue(e); if (g(n, Q.config.disableSelector)) { b(n); return } de(r, o, n, t) }) }) } }); return i } function St(r, e, t, n) { if (e.trigger === "revealed") { yt(); pt(r, n, t, e); bt(ue(r)) } else if (e.trigger === "intersect") { const o = {}; if (e.root) { o.root = ae(r, e.root) } if (e.threshold) { o.threshold = parseFloat(e.threshold) } const i = new IntersectionObserver(function (t) { for (let e = 0; e < t.length; e++) { const n = t[e]; if (n.isIntersecting) { he(r, "intersect"); break } } }, o); i.observe(ue(r)); pt(ue(r), n, t, e) } else if (!t.firstInitCompleted && e.trigger === "load") { if (!gt(e, r, Mt("load", { elt: r }))) { vt(ue(r), n, t, e.delay) } } else if (e.pollInterval > 0) { t.polling = true; ct(ue(r), n, e) } else { pt(r, n, t, e) } } function Et(e) { const t = ue(e); if (!t) { return false } const n = t.attributes; for (let e = 0; e < n.length; e++) { const r = n[e].name; if (l(r, "hx-on:") || l(r, "data-hx-on:") || l(r, "hx-on-") || l(r, "data-hx-on-")) { return true } } return false } const Ct = (new XPathEvaluator).createExpression('.//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") or' + ' starts-with(name(), "hx-on-") or starts-with(name(), "data-hx-on-") ]]'); function Ot(e, t) { if (Et(e)) { t.push(ue(e)) } const n = Ct.evaluate(e); let r = null; while (r = n.iterateNext()) t.push(ue(r)) } function Rt(e) { const t = []; if (e instanceof DocumentFragment) { for (const n of e.childNodes) { Ot(n, t) } } else { Ot(e, t) } return t } function Ht(e) { if (e.querySelectorAll) { const n = ", [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]"; const r = []; for (const i in Mn) { const s = Mn[i]; if (s.getSelectors) { var t = s.getSelectors(); if (t) { r.push(t) } } } const o = e.querySelectorAll(H + n + ", form, [type='submit']," + " [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger]" + r.flat().map(e => ", " + e).join("")); return o } else { return [] } } function Tt(e) { const t = g(ue(e.target), "button, input[type='submit']"); const n = Lt(e); if (n) { n.lastButtonClicked = t } } function qt(e) { const t = Lt(e); if (t) { t.lastButtonClicked = null } } function Lt(e) { const t = g(ue(e.target), "button, input[type='submit']"); if (!t) { return } const n = y("#" + ee(t, "form"), t.getRootNode()) || g(t, "form"); if (!n) { return } return ie(n) } function At(e) { e.addEventListener("click", Tt); e.addEventListener("focusin", Tt); e.addEventListener("focusout", qt) } function Nt(t, e, n) { const r = ie(t); if (!Array.isArray(r.onHandlers)) { r.onHandlers = [] } let o; const i = function (e) { vn(t, function () { if (at(t)) { return } if (!o) { o = new Function("event", n) } o.call(t, e) }) }; t.addEventListener(e, i); r.onHandlers.push({ event: e, listener: i }) } function It(t) { ke(t); for (let e = 0; e < t.attributes.length; e++) { const n = t.attributes[e].name; const r = t.attributes[e].value; if (l(n, "hx-on") || l(n, "data-hx-on")) { const o = n.indexOf("-on") + 3; const i = n.slice(o, o + 1); if (i === "-" || i === ":") { let e = n.slice(o + 1); if (l(e, ":")) { e = "htmx" + e } else if (l(e, "-")) { e = "htmx:" + e.slice(1) } else if (l(e, "htmx-")) { e = "htmx:" + e.slice(5) } Nt(t, e, r) } } } } function Pt(t) { if (g(t, Q.config.disableSelector)) { b(t); return } const n = ie(t); const e = Pe(t); if (n.initHash !== e) { De(t); n.initHash = e; he(t, "htmx:beforeProcessNode"); const r = st(t); const o = wt(t, n, r); if (!o) { if (re(t, "hx-boost") === "true") { ft(t, n, r) } else if (s(t, "hx-trigger")) { r.forEach(function (e) { St(t, e, n, function () { }) }) } } if (t.tagName === "FORM" || ee(t, "type") === "submit" && s(t, "form")) { At(t) } n.firstInitCompleted = true; he(t, "htmx:afterProcessNode") } } function kt(e) { e = y(e); if (g(e, Q.config.disableSelector)) { b(e); return } Pt(e); se(Ht(e), function (e) { Pt(e) }); se(Rt(e), It) } function Dt(e) { return e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase() } function Mt(e, t) { let n; if (window.CustomEvent && typeof window.CustomEvent === "function") { n = new CustomEvent(e, { bubbles: true, cancelable: true, composed: true, detail: t }) } else { n = ne().createEvent("CustomEvent"); n.initCustomEvent(e, true, true, t) } return n } function fe(e, t, n) { he(e, t, ce({ error: t }, n)) } function Xt(e) { return e === "htmx:afterProcessNode" } function Ft(e, t) { se(Un(e), function (e) { try { t(e) } catch (e) { O(e) } }) } function O(e) { if (console.error) { console.error(e) } else if (console.log) { console.log("ERROR: ", e) } } function he(e, t, n) { e = y(e); if (n == null) { n = {} } n.elt = e; const r = Mt(t, n); if (Q.logger && !Xt(t)) { Q.logger(e, t, n) } if (n.error) { O(n.error); he(e, "htmx:error", { errorInfo: n }) } let o = e.dispatchEvent(r); const i = Dt(t); if (o && i !== t) { const s = Mt(i, r.detail); o = o && e.dispatchEvent(s) } Ft(ue(e), function (e) { o = o && (e.onEvent(t, r) !== false && !r.defaultPrevented) }); return o } let Bt = location.pathname + location.search; function Ut() { const e = ne().querySelector("[hx-history-elt],[data-hx-history-elt]"); return e || ne().body } function jt(t, e) { if (!B()) { return } const n = _t(e); const r = ne().title; const o = window.scrollY; if (Q.config.historyCacheSize <= 0) { localStorage.removeItem("htmx-history-cache"); return } t = U(t); const i = S(localStorage.getItem("htmx-history-cache")) || []; for (let e = 0; e < i.length; e++) { if (i[e].url === t) { i.splice(e, 1); break } } const s = { url: t, content: n, title: r, scroll: o }; he(ne().body, "htmx:historyItemCreated", { item: s, cache: i }); i.push(s); while (i.length > Q.config.historyCacheSize) { i.shift() } while (i.length > 0) { try { localStorage.setItem("htmx-history-cache", JSON.stringify(i)); break } catch (e) { fe(ne().body, "htmx:historyCacheError", { cause: e, cache: i }); i.shift() } } } function Vt(t) { if (!B()) { return null } t = U(t); const n = S(localStorage.getItem("htmx-history-cache")) || []; for (let e = 0; e < n.length; e++) { if (n[e].url === t) { return n[e] } } return null } function _t(e) { const t = Q.config.requestClass; const n = e.cloneNode(true); se(x(n, "." + t), function (e) { G(e, t) }); se(x(n, "[data-disabled-by-htmx]"), function (e) { e.removeAttribute("disabled") }); return n.innerHTML } function zt() { const e = Ut(); const t = Bt || location.pathname + location.search; let n; try { n = ne().querySelector('[hx-history="false" i],[data-hx-history="false" i]') } catch (e) { n = ne().querySelector('[hx-history="false"],[data-hx-history="false"]') } if (!n) { he(ne().body, "htmx:beforeHistorySave", { path: t, historyElt: e }); jt(t, e) } if (Q.config.historyEnabled) history.replaceState({ htmx: true }, ne().title, window.location.href) } function $t(e) { if (Q.config.getCacheBusterParam) { e = e.replace(/org\.htmx\.cache-buster=[^&]*&?/, ""); if (Y(e, "&") || Y(e, "?")) { e = e.slice(0, -1) } } if (Q.config.historyEnabled) { history.pushState({ htmx: true }, "", e) } Bt = e } function Jt(e) { if (Q.config.historyEnabled) history.replaceState({ htmx: true }, "", e); Bt = e } function Kt(e) { se(e, function (e) { e.call(undefined) }) } function Gt(o) { const e = new XMLHttpRequest; const i = { path: o, xhr: e }; he(ne().body, "htmx:historyCacheMiss", i); e.open("GET", o, true); e.setRequestHeader("HX-Request", "true"); e.setRequestHeader("HX-History-Restore-Request", "true"); e.setRequestHeader("HX-Current-URL", ne().location.href); e.onload = function () { if (this.status >= 200 && this.status < 400) { he(ne().body, "htmx:historyCacheMissLoad", i); const e = P(this.response); const t = e.querySelector("[hx-history-elt],[data-hx-history-elt]") || e; const n = Ut(); const r = xn(n); kn(e.title); qe(e); Ve(n, t, r); Te(); Kt(r.tasks); Bt = o; he(ne().body, "htmx:historyRestore", { path: o, cacheMiss: true, serverResponse: this.response }) } else { fe(ne().body, "htmx:historyCacheMissLoadError", i) } }; e.send() } function Wt(e) { zt(); e = e || location.pathname + location.search; const t = Vt(e); if (t) { const n = P(t.content); const r = Ut(); const o = xn(r); kn(t.title); qe(n); Ve(r, n, o); Te(); Kt(o.tasks); E().setTimeout(function () { window.scrollTo(0, t.scroll) }, 0); Bt = e; he(ne().body, "htmx:historyRestore", { path: e, item: t }) } else { if (Q.config.refreshOnHistoryMiss) { window.location.reload(true) } else { Gt(e) } } } function Zt(e) { let t = we(e, "hx-indicator"); if (t == null) { t = [e] } se(t, function (e) { const t = ie(e); t.requestCount = (t.requestCount || 0) + 1; e.classList.add.call(e.classList, Q.config.requestClass) }); return t } function Yt(e) { let t = we(e, "hx-disabled-elt"); if (t == null) { t = [] } se(t, function (e) { const t = ie(e); t.requestCount = (t.requestCount || 0) + 1; e.setAttribute("disabled", ""); e.setAttribute("data-disabled-by-htmx", "") }); return t } function Qt(e, t) { se(e.concat(t), function (e) { const t = ie(e); t.requestCount = (t.requestCount || 1) - 1 }); se(e, function (e) { const t = ie(e); if (t.requestCount === 0) { e.classList.remove.call(e.classList, Q.config.requestClass) } }); se(t, function (e) { const t = ie(e); if (t.requestCount === 0) { e.removeAttribute("disabled"); e.removeAttribute("data-disabled-by-htmx") } }) } function en(t, n) { for (let e = 0; e < t.length; e++) { const r = t[e]; if (r.isSameNode(n)) { return true } } return false } function tn(e) { const t = e; if (t.name === "" || t.name == null || t.disabled || g(t, "fieldset[disabled]")) { return false } if (t.type === "button" || t.type === "submit" || t.tagName === "image" || t.tagName === "reset" || t.tagName === "file") { return false } if (t.type === "checkbox" || t.type === "radio") { return t.checked } return true } function nn(t, e, n) { if (t != null && e != null) { if (Array.isArray(e)) { e.forEach(function (e) { n.append(t, e) }) } else { n.append(t, e) } } } function rn(t, n, r) { if (t != null && n != null) { let e = r.getAll(t); if (Array.isArray(n)) { e = e.filter(e => n.indexOf(e) < 0) } else { e = e.filter(e => e !== n) } r.delete(t); se(e, e => r.append(t, e)) } } function on(t, n, r, o, i) { if (o == null || en(t, o)) { return } else { t.push(o) } if (tn(o)) { const s = ee(o, "name"); let e = o.value; if (o instanceof HTMLSelectElement && o.multiple) { e = M(o.querySelectorAll("option:checked")).map(function (e) { return e.value }) } if (o instanceof HTMLInputElement && o.files) { e = M(o.files) } nn(s, e, n); if (i) { sn(o, r) } } if (o instanceof HTMLFormElement) { se(o.elements, function (e) { if (t.indexOf(e) >= 0) { rn(e.name, e.value, n) } else { t.push(e) } if (i) { sn(e, r) } }); new FormData(o).forEach(function (e, t) { if (e instanceof File && e.name === "") { return } nn(t, e, n) }) } } function sn(e, t) { const n = e; if (n.willValidate) { he(n, "htmx:validation:validate"); if (!n.checkValidity()) { t.push({ elt: n, message: n.validationMessage, validity: n.validity }); he(n, "htmx:validation:failed", { message: n.validationMessage, validity: n.validity }) } } } function ln(n, e) { for (const t of e.keys()) { n.delete(t) } e.forEach(function (e, t) { n.append(t, e) }); return n } function cn(e, t) { const n = []; const r = new FormData; const o = new FormData; const i = []; const s = ie(e); if (s.lastButtonClicked && !le(s.lastButtonClicked)) { s.lastButtonClicked = null } let l = e instanceof HTMLFormElement && e.noValidate !== true || te(e, "hx-validate") === "true"; if (s.lastButtonClicked) { l = l && s.lastButtonClicked.formNoValidate !== true } if (t !== "get") { on(n, o, i, g(e, "form"), l) } on(n, r, i, e, l); if (s.lastButtonClicked || e.tagName === "BUTTON" || e.tagName === "INPUT" && ee(e, "type") === "submit") { const u = s.lastButtonClicked || e; const a = ee(u, "name"); nn(a, u.value, o) } const c = we(e, "hx-include"); se(c, function (e) { on(n, r, i, ue(e), l); if (!h(e, "form")) { se(f(e).querySelectorAll(ot), function (e) { on(n, r, i, e, l) }) } }); ln(r, o); return { errors: i, formData: r, values: An(r) } } function un(e, t, n) { if (e !== "") { e += "&" } if (String(n) === "[object Object]") { n = JSON.stringify(n) } const r = encodeURIComponent(n); e += encodeURIComponent(t) + "=" + r; return e } function an(e) { e = qn(e); let n = ""; e.forEach(function (e, t) { n = un(n, t, e) }); return n } function fn(e, t, n) { const r = { "HX-Request": "true", "HX-Trigger": ee(e, "id"), "HX-Trigger-Name": ee(e, "name"), "HX-Target": te(t, "id"), "HX-Current-URL": ne().location.href }; bn(e, "hx-headers", false, r); if (n !== undefined) { r["HX-Prompt"] = n } if (ie(e).boosted) { r["HX-Boosted"] = "true" } return r } function hn(n, e) { const t = re(e, "hx-params"); if (t) { if (t === "none") { return new FormData } else if (t === "*") { return n } else if (t.indexOf("not ") === 0) { se(t.slice(4).split(","), function (e) { e = e.trim(); n.delete(e) }); return n } else { const r = new FormData; se(t.split(","), function (t) { t = t.trim(); if (n.has(t)) { n.getAll(t).forEach(function (e) { r.append(t, e) }) } }); return r } } else { return n } } function dn(e) { return !!ee(e, "href") && ee(e, "href").indexOf("#") >= 0 } function gn(e, t) { const n = t || re(e, "hx-swap"); const r = { swapStyle: ie(e).boosted ? "innerHTML" : Q.config.defaultSwapStyle, swapDelay: Q.config.defaultSwapDelay, settleDelay: Q.config.defaultSettleDelay }; if (Q.config.scrollIntoViewOnBoost && ie(e).boosted && !dn(e)) { r.show = "top" } if (n) { const s = F(n); if (s.length > 0) { for (let e = 0; e < s.length; e++) { const l = s[e]; if (l.indexOf("swap:") === 0) { r.swapDelay = d(l.slice(5)) } else if (l.indexOf("settle:") === 0) { r.settleDelay = d(l.slice(7)) } else if (l.indexOf("transition:") === 0) { r.transition = l.slice(11) === "true" } else if (l.indexOf("ignoreTitle:") === 0) { r.ignoreTitle = l.slice(12) === "true" } else if (l.indexOf("scroll:") === 0) { const c = l.slice(7); var o = c.split(":"); const u = o.pop(); var i = o.length > 0 ? o.join(":") : null; r.scroll = u; r.scrollTarget = i } else if (l.indexOf("show:") === 0) { const a = l.slice(5); var o = a.split(":"); const f = o.pop(); var i = o.length > 0 ? o.join(":") : null; r.show = f; r.showTarget = i } else if (l.indexOf("focus-scroll:") === 0) { const h = l.slice("focus-scroll:".length); r.focusScroll = h == "true" } else if (e == 0) { r.swapStyle = l } else { O("Unknown modifier in hx-swap: " + l) } } } } return r } function pn(e) { return re(e, "hx-encoding") === "multipart/form-data" || h(e, "form") && ee(e, "enctype") === "multipart/form-data" } function mn(t, n, r) { let o = null; Ft(n, function (e) { if (o == null) { o = e.encodeParameters(t, r, n) } }); if (o != null) { return o } else { if (pn(n)) { return ln(new FormData, qn(r)) } else { return an(r) } } } function xn(e) { return { tasks: [], elts: [e] } } function yn(e, t) { const n = e[0]; const r = e[e.length - 1]; if (t.scroll) { var o = null; if (t.scrollTarget) { o = ue(ae(n, t.scrollTarget)) } if (t.scroll === "top" && (n || o)) { o = o || n; o.scrollTop = 0 } if (t.scroll === "bottom" && (r || o)) { o = o || r; o.scrollTop = o.scrollHeight } } if (t.show) { var o = null; if (t.showTarget) { let e = t.showTarget; if (t.showTarget === "window") { e = "body" } o = ue(ae(n, e)) } if (t.show === "top" && (n || o)) { o = o || n; o.scrollIntoView({ block: "start", behavior: Q.config.scrollBehavior }) } if (t.show === "bottom" && (r || o)) { o = o || r; o.scrollIntoView({ block: "end", behavior: Q.config.scrollBehavior }) } } } function bn(r, e, o, i) { if (i == null) { i = {} } if (r == null) { return i } const s = te(r, e); if (s) { let e = s.trim(); let t = o; if (e === "unset") { return null } if (e.indexOf("javascript:") === 0) { e = e.slice(11); t = true } else if (e.indexOf("js:") === 0) { e = e.slice(3); t = true } if (e.indexOf("{") !== 0) { e = "{" + e + "}" } let n; if (t) { n = vn(r, function () { return Function("return (" + e + ")")() }, {}) } else { n = S(e) } for (const l in n) { if (n.hasOwnProperty(l)) { if (i[l] == null) { i[l] = n[l] } } } } return bn(ue(c(r)), e, o, i) } function vn(e, t, n) { if (Q.config.allowEval) { return t() } else { fe(e, "htmx:evalDisallowedError"); return n } } function wn(e, t) { return bn(e, "hx-vars", true, t) } function Sn(e, t) { return bn(e, "hx-vals", false, t) } function En(e) { return ce(wn(e), Sn(e)) } function Cn(t, n, r) { if (r !== null) { try { t.setRequestHeader(n, r) } catch (e) { t.setRequestHeader(n, encodeURIComponent(r)); t.setRequestHeader(n + "-URI-AutoEncoded", "true") } } } function On(t) { if (t.responseURL && typeof URL !== "undefined") { try { const e = new URL(t.responseURL); return e.pathname + e.search } catch (e) { fe(ne().body, "htmx:badResponseUrl", { url: t.responseURL }) } } } function R(e, t) { return t.test(e.getAllResponseHeaders()) } function Rn(t, n, r) { t = t.toLowerCase(); if (r) { if (r instanceof Element || typeof r === "string") { return de(t, n, null, null, { targetOverride: y(r) || ve, returnPromise: true }) } else { let e = y(r.target); if (r.target && !e || r.source && !e && !y(r.source)) { e = ve } return de(t, n, y(r.source), r.event, { handler: r.handler, headers: r.headers, values: r.values, targetOverride: e, swapOverride: r.swap, select: r.select, returnPromise: true }) } } else { return de(t, n, null, null, { returnPromise: true }) } } function Hn(e) { const t = []; while (e) { t.push(e); e = e.parentElement } return t } function Tn(e, t, n) { let r; let o; if (typeof URL === "function") { o = new URL(t, document.location.href); const i = document.location.origin; r = i === o.origin } else { o = t; r = l(t, document.location.origin) } if (Q.config.selfRequestsOnly) { if (!r) { return false } } return he(e, "htmx:validateUrl", ce({ url: o, sameHost: r }, n)) } function qn(e) { if (e instanceof FormData) return e; const t = new FormData; for (const n in e) { if (e.hasOwnProperty(n)) { if (e[n] && typeof e[n].forEach === "function") { e[n].forEach(function (e) { t.append(n, e) }) } else if (typeof e[n] === "object" && !(e[n] instanceof Blob)) { t.append(n, JSON.stringify(e[n])) } else { t.append(n, e[n]) } } } return t } function Ln(r, o, e) { return new Proxy(e, { get: function (t, e) { if (typeof e === "number") return t[e]; if (e === "length") return t.length; if (e === "push") { return function (e) { t.push(e); r.append(o, e) } } if (typeof t[e] === "function") { return function () { t[e].apply(t, arguments); r.delete(o); t.forEach(function (e) { r.append(o, e) }) } } if (t[e] && t[e].length === 1) { return t[e][0] } else { return t[e] } }, set: function (e, t, n) { e[t] = n; r.delete(o); e.forEach(function (e) { r.append(o, e) }); return true } }) } function An(o) { return new Proxy(o, { get: function (e, t) { if (typeof t === "symbol") { const r = Reflect.get(e, t); if (typeof r === "function") { return function () { return r.apply(o, arguments) } } else { return r } } if (t === "toJSON") { return () => Object.fromEntries(o) } if (t in e) { if (typeof e[t] === "function") { return function () { return o[t].apply(o, arguments) } } else { return e[t] } } const n = o.getAll(t); if (n.length === 0) { return undefined } else if (n.length === 1) { return n[0] } else { return Ln(e, t, n) } }, set: function (t, n, e) { if (typeof n !== "string") { return false } t.delete(n); if (e && typeof e.forEach === "function") { e.forEach(function (e) { t.append(n, e) }) } else if (typeof e === "object" && !(e instanceof Blob)) { t.append(n, JSON.stringify(e)) } else { t.append(n, e) } return true }, deleteProperty: function (e, t) { if (typeof t === "string") { e.delete(t) } return true }, ownKeys: function (e) { return Reflect.ownKeys(Object.fromEntries(e)) }, getOwnPropertyDescriptor: function (e, t) { return Reflect.getOwnPropertyDescriptor(Object.fromEntries(e), t) } }) } function de(t, n, r, o, i, D) { let s = null; let l = null; i = i != null ? i : {}; if (i.returnPromise && typeof Promise !== "undefined") { var e = new Promise(function (e, t) { s = e; l = t }) } if (r == null) { r = ne().body } const M = i.handler || Dn; const X = i.select || null; if (!le(r)) { oe(s); return e } const c = i.targetOverride || ue(Ee(r)); if (c == null || c == ve) { fe(r, "htmx:targetError", { target: te(r, "hx-target") }); oe(l); return e } let u = ie(r); const a = u.lastButtonClicked; if (a) { const L = ee(a, "formaction"); if (L != null) { n = L } const A = ee(a, "formmethod"); if (A != null) { if (A.toLowerCase() !== "dialog") { t = A } } } const f = re(r, "hx-confirm"); if (D === undefined) { const K = function (e) { return de(t, n, r, o, i, !!e) }; const G = { target: c, elt: r, path: n, verb: t, triggeringEvent: o, etc: i, issueRequest: K, question: f }; if (he(r, "htmx:confirm", G) === false) { oe(s); return e } } let h = r; let d = re(r, "hx-sync"); let g = null; let F = false; if (d) { const N = d.split(":"); const I = N[0].trim(); if (I === "this") { h = Se(r, "hx-sync") } else { h = ue(ae(r, I)) } d = (N[1] || "drop").trim(); u = ie(h); if (d === "drop" && u.xhr && u.abortable !== true) { oe(s); return e } else if (d === "abort") { if (u.xhr) { oe(s); return e } else { F = true } } else if (d === "replace") { he(h, "htmx:abort") } else if (d.indexOf("queue") === 0) { const W = d.split(" "); g = (W[1] || "last").trim() } } if (u.xhr) { if (u.abortable) { he(h, "htmx:abort") } else { if (g == null) { if (o) { const P = ie(o); if (P && P.triggerSpec && P.triggerSpec.queue) { g = P.triggerSpec.queue } } if (g == null) { g = "last" } } if (u.queuedRequests == null) { u.queuedRequests = [] } if (g === "first" && u.queuedRequests.length === 0) { u.queuedRequests.push(function () { de(t, n, r, o, i) }) } else if (g === "all") { u.queuedRequests.push(function () { de(t, n, r, o, i) }) } else if (g === "last") { u.queuedRequests = []; u.queuedRequests.push(function () { de(t, n, r, o, i) }) } oe(s); return e } } const p = new XMLHttpRequest; u.xhr = p; u.abortable = F; const m = function () { u.xhr = null; u.abortable = false; if (u.queuedRequests != null && u.queuedRequests.length > 0) { const e = u.queuedRequests.shift(); e() } }; const B = re(r, "hx-prompt"); if (B) { var x = prompt(B); if (x === null || !he(r, "htmx:prompt", { prompt: x, target: c })) { oe(s); m(); return e } } if (f && !D) { if (!confirm(f)) { oe(s); m(); return e } } let y = fn(r, c, x); if (t !== "get" && !pn(r)) { y["Content-Type"] = "application/x-www-form-urlencoded" } if (i.headers) { y = ce(y, i.headers) } const U = cn(r, t); let b = U.errors; const j = U.formData; if (i.values) { ln(j, qn(i.values)) } const V = qn(En(r)); const v = ln(j, V); let w = hn(v, r); if (Q.config.getCacheBusterParam && t === "get") { w.set("org.htmx.cache-buster", ee(c, "id") || "true") } if (n == null || n === "") { n = ne().location.href } const S = bn(r, "hx-request"); const _ = ie(r).boosted; let E = Q.config.methodsThatUseUrlParams.indexOf(t) >= 0; const C = { boosted: _, useUrlParams: E, formData: w, parameters: An(w), unfilteredFormData: v, unfilteredParameters: An(v), headers: y, target: c, verb: t, errors: b, withCredentials: i.credentials || S.credentials || Q.config.withCredentials, timeout: i.timeout || S.timeout || Q.config.timeout, path: n, triggeringEvent: o }; if (!he(r, "htmx:configRequest", C)) { oe(s); m(); return e } n = C.path; t = C.verb; y = C.headers; w = qn(C.parameters); b = C.errors; E = C.useUrlParams; if (b && b.length > 0) { he(r, "htmx:validation:halted", C); oe(s); m(); return e } const z = n.split("#"); const $ = z[0]; const O = z[1]; let R = n; if (E) { R = $; const Z = !w.keys().next().done; if (Z) { if (R.indexOf("?") < 0) { R += "?" } else { R += "&" } R += an(w); if (O) { R += "#" + O } } } if (!Tn(r, R, C)) { fe(r, "htmx:invalidPath", C); oe(l); return e } p.open(t.toUpperCase(), R, true); p.overrideMimeType("text/html"); p.withCredentials = C.withCredentials; p.timeout = C.timeout; if (S.noHeaders) { } else { for (const k in y) { if (y.hasOwnProperty(k)) { const Y = y[k]; Cn(p, k, Y) } } } const H = { xhr: p, target: c, requestConfig: C, etc: i, boosted: _, select: X, pathInfo: { requestPath: n, finalRequestPath: R, responsePath: null, anchor: O } }; p.onload = function () { try { const t = Hn(r); H.pathInfo.responsePath = On(p); M(r, H); if (H.keepIndicators !== true) { Qt(T, q) } he(r, "htmx:afterRequest", H); he(r, "htmx:afterOnLoad", H); if (!le(r)) { let e = null; while (t.length > 0 && e == null) { const n = t.shift(); if (le(n)) { e = n } } if (e) { he(e, "htmx:afterRequest", H); he(e, "htmx:afterOnLoad", H) } } oe(s); m() } catch (e) { fe(r, "htmx:onLoadError", ce({ error: e }, H)); throw e } }; p.onerror = function () { Qt(T, q); fe(r, "htmx:afterRequest", H); fe(r, "htmx:sendError", H); oe(l); m() }; p.onabort = function () { Qt(T, q); fe(r, "htmx:afterRequest", H); fe(r, "htmx:sendAbort", H); oe(l); m() }; p.ontimeout = function () { Qt(T, q); fe(r, "htmx:afterRequest", H); fe(r, "htmx:timeout", H); oe(l); m() }; if (!he(r, "htmx:beforeRequest", H)) { oe(s); m(); return e } var T = Zt(r); var q = Yt(r); se(["loadstart", "loadend", "progress", "abort"], function (t) { se([p, p.upload], function (e) { e.addEventListener(t, function (e) { he(r, "htmx:xhr:" + t, { lengthComputable: e.lengthComputable, loaded: e.loaded, total: e.total }) }) }) }); he(r, "htmx:beforeSend", H); const J = E ? null : mn(p, r, w); p.send(J); return e } function Nn(e, t) { const n = t.xhr; let r = null; let o = null; if (R(n, /HX-Push:/i)) { r = n.getResponseHeader("HX-Push"); o = "push" } else if (R(n, /HX-Push-Url:/i)) { r = n.getResponseHeader("HX-Push-Url"); o = "push" } else if (R(n, /HX-Replace-Url:/i)) { r = n.getResponseHeader("HX-Replace-Url"); o = "replace" } if (r) { if (r === "false") { return {} } else { return { type: o, path: r } } } const i = t.pathInfo.finalRequestPath; const s = t.pathInfo.responsePath; const l = re(e, "hx-push-url"); const c = re(e, "hx-replace-url"); const u = ie(e).boosted; let a = null; let f = null; if (l) { a = "push"; f = l } else if (c) { a = "replace"; f = c } else if (u) { a = "push"; f = s || i } if (f) { if (f === "false") { return {} } if (f === "true") { f = s || i } if (t.pathInfo.anchor && f.indexOf("#") === -1) { f = f + "#" + t.pathInfo.anchor } return { type: a, path: f } } else { return {} } } function In(e, t) { var n = new RegExp(e.code); return n.test(t.toString(10)) } function Pn(e) { for (var t = 0; t < Q.config.responseHandling.length; t++) { var n = Q.config.responseHandling[t]; if (In(n, e.status)) { return n } } return { swap: false } } function kn(e) { if (e) { const t = u("title"); if (t) { t.innerHTML = e } else { window.document.title = e } } } function Dn(o, i) { const s = i.xhr; let l = i.target; const e = i.etc; const c = i.select; if (!he(o, "htmx:beforeOnLoad", i)) return; if (R(s, /HX-Trigger:/i)) { Je(s, "HX-Trigger", o) } if (R(s, /HX-Location:/i)) { zt(); let e = s.getResponseHeader("HX-Location"); var t; if (e.indexOf("{") === 0) { t = S(e); e = t.path; delete t.path } Rn("get", e, t).then(function () { $t(e) }); return } const n = R(s, /HX-Refresh:/i) && s.getResponseHeader("HX-Refresh") === "true"; if (R(s, /HX-Redirect:/i)) { i.keepIndicators = true; location.href = s.getResponseHeader("HX-Redirect"); n && location.reload(); return } if (n) { i.keepIndicators = true; location.reload(); return } if (R(s, /HX-Retarget:/i)) { if (s.getResponseHeader("HX-Retarget") === "this") { i.target = o } else { i.target = ue(ae(o, s.getResponseHeader("HX-Retarget"))) } } const u = Nn(o, i); const r = Pn(s); const a = r.swap; let f = !!r.error; let h = Q.config.ignoreTitle || r.ignoreTitle; let d = r.select; if (r.target) { i.target = ue(ae(o, r.target)) } var g = e.swapOverride; if (g == null && r.swapOverride) { g = r.swapOverride } if (R(s, /HX-Retarget:/i)) { if (s.getResponseHeader("HX-Retarget") === "this") { i.target = o } else { i.target = ue(ae(o, s.getResponseHeader("HX-Retarget"))) } } if (R(s, /HX-Reswap:/i)) { g = s.getResponseHeader("HX-Reswap") } var p = s.response; var m = ce({ shouldSwap: a, serverResponse: p, isError: f, ignoreTitle: h, selectOverride: d, swapOverride: g }, i); if (r.event && !he(l, r.event, m)) return; if (!he(l, "htmx:beforeSwap", m)) return; l = m.target; p = m.serverResponse; f = m.isError; h = m.ignoreTitle; d = m.selectOverride; g = m.swapOverride; i.target = l; i.failed = f; i.successful = !f; if (m.shouldSwap) { if (s.status === 286) { lt(o) } Ft(o, function (e) { p = e.transformResponse(p, s, o) }); if (u.type) { zt() } var x = gn(o, g); if (!x.hasOwnProperty("ignoreTitle")) { x.ignoreTitle = h } l.classList.add(Q.config.swappingClass); let n = null; let r = null; if (c) { d = c } if (R(s, /HX-Reselect:/i)) { d = s.getResponseHeader("HX-Reselect") } const y = re(o, "hx-select-oob"); const b = re(o, "hx-select"); let e = function () { try { if (u.type) { he(ne().body, "htmx:beforeHistoryUpdate", ce({ history: u }, i)); if (u.type === "push") { $t(u.path); he(ne().body, "htmx:pushedIntoHistory", { path: u.path }) } else { Jt(u.path); he(ne().body, "htmx:replacedInHistory", { path: u.path }) } } $e(l, p, x, { select: d || b, selectOOB: y, eventInfo: i, anchor: i.pathInfo.anchor, contextElement: o, afterSwapCallback: function () { if (R(s, /HX-Trigger-After-Swap:/i)) { let e = o; if (!le(o)) { e = ne().body } Je(s, "HX-Trigger-After-Swap", e) } }, afterSettleCallback: function () { if (R(s, /HX-Trigger-After-Settle:/i)) { let e = o; if (!le(o)) { e = ne().body } Je(s, "HX-Trigger-After-Settle", e) } oe(n) } }) } catch (e) { fe(o, "htmx:swapError", i); oe(r); throw e } }; let t = Q.config.globalViewTransitions; if (x.hasOwnProperty("transition")) { t = x.transition } if (t && he(o, "htmx:beforeTransition", i) && typeof Promise !== "undefined" && document.startViewTransition) { const v = new Promise(function (e, t) { n = e; r = t }); const w = e; e = function () { document.startViewTransition(function () { w(); return v }) } } if (x.swapDelay > 0) { E().setTimeout(e, x.swapDelay) } else { e() } } if (f) { fe(o, "htmx:responseError", ce({ error: "Response Status Error Code " + s.status + " from " + i.pathInfo.requestPath }, i)) } } const Mn = {}; function Xn() { return { init: function (e) { return null }, getSelectors: function () { return null }, onEvent: function (e, t) { return true }, transformResponse: function (e, t, n) { return e }, isInlineSwap: function (e) { return false }, handleSwap: function (e, t, n, r) { return false }, encodeParameters: function (e, t, n) { return null } } } function Fn(e, t) { if (t.init) { t.init(n) } Mn[e] = ce(Xn(), t) } function Bn(e) { delete Mn[e] } function Un(e, n, r) { if (n == undefined) { n = [] } if (e == undefined) { return n } if (r == undefined) { r = [] } const t = te(e, "hx-ext"); if (t) { se(t.split(","), function (e) { e = e.replace(/ /g, ""); if (e.slice(0, 7) == "ignore:") { r.push(e.slice(7)); return } if (r.indexOf(e) < 0) { const t = Mn[e]; if (t && n.indexOf(t) < 0) { n.push(t) } } }) } return Un(ue(c(e)), n, r) } var jn = false; ne().addEventListener("DOMContentLoaded", function () { jn = true }); function Vn(e) { if (jn || ne().readyState === "complete") { e() } else { ne().addEventListener("DOMContentLoaded", e) } } function _n() { if (Q.config.includeIndicatorStyles !== false) { const e = Q.config.inlineStyleNonce ? ` nonce="${Q.config.inlineStyleNonce}"` : ""; ne().head.insertAdjacentHTML("beforeend", " ." + Q.config.indicatorClass + "{opacity:0} ." + Q.config.requestClass + " ." + Q.config.indicatorClass + "{opacity:1; transition: opacity 200ms ease-in;} ." + Q.config.requestClass + "." + Q.config.indicatorClass + "{opacity:1; transition: opacity 200ms ease-in;} ") } } function zn() { const e = ne().querySelector('meta[name="htmx-config"]'); if (e) { return S(e.content) } else { return null } } function $n() { const e = zn(); if (e) { Q.config = ce(Q.config, e) } } Vn(function () { $n(); _n(); let e = ne().body; kt(e); const t = ne().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']"); e.addEventListener("htmx:abort", function (e) { const t = e.target; const n = ie(t); if (n && n.xhr) { n.xhr.abort() } }); const n = window.onpopstate ? window.onpopstate.bind(window) : null; window.onpopstate = function (e) { if (e.state && e.state.htmx) { Wt(); se(t, function (e) { he(e, "htmx:restored", { document: ne(), triggerEvent: he }) }) } else { if (n) { n(e) } } }; E().setTimeout(function () { he(e, "htmx:load", {}); e = null }, 0) }); return Q }(); diff --git a/my_hebrew_dates/templates/base.html b/my_hebrew_dates/templates/base.html index 7fe78d9..a764796 100644 --- a/my_hebrew_dates/templates/base.html +++ b/my_hebrew_dates/templates/base.html @@ -1,4 +1,4 @@ -{% load static i18n compress %} +{% load static i18n compress django_htmx htmx_modal_forms %} {% get_current_language as LANGUAGE_CODE %} @@ -42,12 +42,15 @@ {% block css %} - + href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.2/css/bootstrap.min.css" + integrity="sha512-b2QcS5SsA8tZodcDtGRELiGv5SaKSk1vDHDaQRda0htPYWZ6046lr3kJ5bAAQdpV2mmA/4v0wQF9MyU6/pDIAg==" + crossorigin="anonymous" + referrerpolicy="no-referrer" /> + href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.11.3/font/bootstrap-icons.min.css" + integrity="sha512-dPXYcDub/aeb08c63jRq/k6GaKccl256JQy/AnOq7CAnEZ9FzSL9wSbcZkMp4R26vBsMLFYH4kQ67/bbV8XaCQ==" + crossorigin="anonymous" + referrerpolicy="no-referrer" /> {% compress css %} @@ -61,10 +64,14 @@ ================================================== --> {# Placed at the top of the document so pages load faster with defer #} {% block javascript %} - - + @@ -89,30 +96,29 @@ integrity="sha256-io4G+JpruJtt8SoSUOgLQrhBj/YtQXFgIvkGzBxQAUQ=" crossorigin="anonymous"> - {% compress js %} + {% endcompress %} + {% django_htmx_script %} + {% htmx_modal_script %} {% endblock javascript %} - +
-
- {% include '_navbar.html' %} -
-
+
{% include '_navbar.html' %}
- {% include 'toasts.html' %} {% block body %} {% block main %} {% block content %}

Use this document as a way to quick start any new project.

{% endblock content %} {% endblock main %} + {% include 'toasts.html' %} {% endblock body %}
diff --git a/my_hebrew_dates/templates/hebcal/_calendar_name.html b/my_hebrew_dates/templates/hebcal/_calendar_name.html new file mode 100644 index 0000000..8ab0f02 --- /dev/null +++ b/my_hebrew_dates/templates/hebcal/_calendar_name.html @@ -0,0 +1,17 @@ +
+
+
+

{{ calendar.name }}

+ Timezone: {{ calendar.timezone }} +
+ +
+
diff --git a/my_hebrew_dates/templates/hebcal/calendar_edit.html b/my_hebrew_dates/templates/hebcal/calendar_edit.html index 49b4b6d..3414033 100644 --- a/my_hebrew_dates/templates/hebcal/calendar_edit.html +++ b/my_hebrew_dates/templates/hebcal/calendar_edit.html @@ -7,7 +7,7 @@ {% endblock title %} {% block content %}
-

Manage Your Calendar: {{ calendar.name }}

+ {% include "hebcal/_calendar_name.html" %}
Date: Sun, 5 Jan 2025 18:25:58 -0500 Subject: [PATCH 2/2] fix tests --- config/settings/base.py | 8 +++++++- my_hebrew_dates/core/middleware.py | 21 +++++++++++++++++++++ my_hebrew_dates/hebcal/tests/test_views.py | 4 ---- my_hebrew_dates/users/admin.py | 10 ++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 my_hebrew_dates/core/middleware.py diff --git a/config/settings/base.py b/config/settings/base.py index 3957498..ab418a1 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -165,7 +165,7 @@ "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", - "django.contrib.auth.middleware.LoginRequiredMiddleware", + "my_hebrew_dates.core.middleware.CustomLoginRequiredMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", "allauth.account.middleware.AccountMiddleware", @@ -368,6 +368,12 @@ # django-cors-headers - https://github.com/adamchainz/django-cors-headers#setup CORS_URLS_REGEX = r"^/api/.*$" +# Regex patterns for paths that bypass LoginRequiredMiddleware +OPEN_URLS = [ + r"^/api/.*", + # ... +] + # By Default swagger ui is available only to admin user(s). You can change permission classes to change that # See more configuration options at https://drf-spectacular.readthedocs.io/en/latest/settings.html#settings SPECTACULAR_SETTINGS = { diff --git a/my_hebrew_dates/core/middleware.py b/my_hebrew_dates/core/middleware.py new file mode 100644 index 0000000..604fe2f --- /dev/null +++ b/my_hebrew_dates/core/middleware.py @@ -0,0 +1,21 @@ +""" +https://github.com/encode/django-rest-framework/discussions/9503#discussioncomment-10487612 +""" + +import re + +from django.conf import settings +from django.contrib.auth.middleware import LoginRequiredMiddleware + + +class CustomLoginRequiredMiddleware(LoginRequiredMiddleware): + def __init__(self, get_response=None): + self.get_response = get_response + self.open_urls = [re.compile(url) for url in settings.OPEN_URLS] + super().__init__(get_response) + + def process_view(self, request, view_func, view_args, view_kwargs): + for url in self.open_urls: + if url.match(request.path): + return None # Pass through, no login required + return super().process_view(request, view_func, view_args, view_kwargs) diff --git a/my_hebrew_dates/hebcal/tests/test_views.py b/my_hebrew_dates/hebcal/tests/test_views.py index 57d8bbd..377ff1b 100644 --- a/my_hebrew_dates/hebcal/tests/test_views.py +++ b/my_hebrew_dates/hebcal/tests/test_views.py @@ -153,10 +153,6 @@ def test_unauthorized_access(self): f"/accounts/login/?next=/calendars/{self.calendar.uuid}/edit/", ) - def test_view_renders_correctly(self): - response = self.client.get(self.url) - self.assertContains(response, "Manage Your Calendar") - def test_filter_by_month(self): response = self.client.get(self.url, {"month": "1"}) self.assertContains( diff --git a/my_hebrew_dates/users/admin.py b/my_hebrew_dates/users/admin.py index b5de7b4..587af5a 100644 --- a/my_hebrew_dates/users/admin.py +++ b/my_hebrew_dates/users/admin.py @@ -39,6 +39,16 @@ class UserAdmin(auth_admin.UserAdmin): ), (_("Important dates"), {"fields": ("last_login", "date_joined")}), ) + add_fieldsets = ( # Add this section + ( + None, + { + "classes": ("wide",), + "fields": ("username", "email", "password1", "password2"), + }, + ), + ) + list_display = [ "username", "name",