From 3759258ebe73a1c47a211f87796d0ae7206bcf09 Mon Sep 17 00:00:00 2001 From: Bryce Date: Tue, 2 Jun 2026 22:39:19 -0700 Subject: [PATCH] fix(ssr): require Apply for all date-range filters Most grid pages auto-submitted their date-range filter on every change event, which fired mid-typing and re-rendered the date inputs, breaking manual date entry. Invoices and ledgers already gated date submission behind an explicit Apply button; this brings the other ten pages in line. - date-range component: stop `change` from the date inputs bubbling to the form (@change.stop) and always render the Apply button, so typed or picked dates submit only via the Apply button's `datesApplied` event. The All/Week/Month/Year presets and all other filters are unaffected. - payments, invoice import, transactions, import batches, sales summaries, expected deposits, cash drawer shifts, refunds, tenders, sales orders: add `datesApplied` to the form hx-trigger. Co-Authored-By: Claude Opus 4.8 --- src/clj/auto_ap/ssr/admin/import_batch.clj | 2 +- src/clj/auto_ap/ssr/components/date_range.clj | 15 +++++++-------- src/clj/auto_ap/ssr/invoice/import.clj | 2 +- src/clj/auto_ap/ssr/payments.clj | 2 +- src/clj/auto_ap/ssr/pos/cash_drawer_shifts.clj | 2 +- src/clj/auto_ap/ssr/pos/expected_deposits.clj | 2 +- src/clj/auto_ap/ssr/pos/refunds.clj | 2 +- src/clj/auto_ap/ssr/pos/sales_orders.clj | 2 +- src/clj/auto_ap/ssr/pos/sales_summaries.clj | 2 +- src/clj/auto_ap/ssr/pos/tenders.clj | 2 +- src/clj/auto_ap/ssr/transaction/common.clj | 2 +- 11 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/clj/auto_ap/ssr/admin/import_batch.clj b/src/clj/auto_ap/ssr/admin/import_batch.clj index 46ab6f51..6a03fb34 100644 --- a/src/clj/auto_ap/ssr/admin/import_batch.clj +++ b/src/clj/auto_ap/ssr/admin/import_batch.clj @@ -35,7 +35,7 @@ default-grid-fields-schema)])) (defn filters [request] - [:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" + [:form {"hx-trigger" "datesApplied, change delay:500ms, keyup changed from:.hot-filter delay:1000ms" "hx-get" (bidi/path-for ssr-routes/only-routes ::route/table) "hx-target" "#entity-table" diff --git a/src/clj/auto_ap/ssr/components/date_range.clj b/src/clj/auto_ap/ssr/components/date_range.clj index fe694c35..8c752faf 100644 --- a/src/clj/auto_ap/ssr/components/date_range.clj +++ b/src/clj/auto_ap/ssr/components/date_range.clj @@ -7,7 +7,7 @@ [clj-time.core :as t] [clj-time.periodic :as per])) -(defn date-range-field [{:keys [value id apply-button?]}] +(defn date-range-field [{:keys [value id]}] [:div {:id id} (com/field {:label "Date Range"} [:div.space-y-4 @@ -17,7 +17,7 @@ (com/button-group-button {:size :small :value "week" :hx-trigger "click"} "Week") (com/button-group-button {:size :small :value "month" :hx-trigger "click"} "Month") (com/button-group-button {:size :small :value "year" :hx-trigger "click"} "Year"))] - [:div.flex.space-x-1.items-baseline.w-full.justify-start + [:div.flex.space-x-1.items-baseline.w-full.justify-start {"@change.stop" ""} (com/date-input {:name "start-date" :value (some-> (:start value) (atime/unparse-local atime/normal-date)) @@ -31,9 +31,8 @@ :placeholder "Date" :size :small :class "shrink date-filter-input"}) - (when apply-button? - (but/button- {:color :secondary - :size :small - :type "button" - "x-on:click" "$dispatch('datesApplied')"} - "Apply"))]])]) + (but/button- {:color :secondary + :size :small + :type "button" + "x-on:click" "$dispatch('datesApplied')"} + "Apply")]])]) diff --git a/src/clj/auto_ap/ssr/invoice/import.clj b/src/clj/auto_ap/ssr/invoice/import.clj index 098a0250..1c8ed73f 100644 --- a/src/clj/auto_ap/ssr/invoice/import.clj +++ b/src/clj/auto_ap/ssr/invoice/import.clj @@ -56,7 +56,7 @@ [:div {:id "exact-match-id-tag"}])) (defn filters [request] - [:form#invoice-filters {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" + [:form#invoice-filters {"hx-trigger" "datesApplied, change delay:500ms, keyup changed from:.hot-filter delay:1000ms" "hx-get" (bidi/path-for ssr-routes/only-routes ::route/import-table) "hx-target" "#entity-table" diff --git a/src/clj/auto_ap/ssr/payments.clj b/src/clj/auto_ap/ssr/payments.clj index 52415270..3e4a86c8 100644 --- a/src/clj/auto_ap/ssr/payments.clj +++ b/src/clj/auto_ap/ssr/payments.clj @@ -53,7 +53,7 @@ [:div {:id "exact-match-id-tag"}])) (defn filters [request] - [:form#payment-filters {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" + [:form#payment-filters {"hx-trigger" "datesApplied, change delay:500ms, keyup changed from:.hot-filter delay:1000ms" "hx-get" (bidi/path-for ssr-routes/only-routes ::route/table) "hx-target" "#entity-table" diff --git a/src/clj/auto_ap/ssr/pos/cash_drawer_shifts.clj b/src/clj/auto_ap/ssr/pos/cash_drawer_shifts.clj index e880a135..699eea77 100644 --- a/src/clj/auto_ap/ssr/pos/cash_drawer_shifts.clj +++ b/src/clj/auto_ap/ssr/pos/cash_drawer_shifts.clj @@ -29,7 +29,7 @@ default-grid-fields-schema)])) (defn filters [params] - [:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" + [:form {"hx-trigger" "datesApplied, change delay:500ms, keyup changed from:.hot-filter delay:1000ms" "hx-get" (bidi/path-for ssr-routes/only-routes :pos-cash-drawer-shift-table) "hx-target" "#cash-drawer-shift-table" diff --git a/src/clj/auto_ap/ssr/pos/expected_deposits.clj b/src/clj/auto_ap/ssr/pos/expected_deposits.clj index c664a90d..33eef5b7 100644 --- a/src/clj/auto_ap/ssr/pos/expected_deposits.clj +++ b/src/clj/auto_ap/ssr/pos/expected_deposits.clj @@ -34,7 +34,7 @@ default-grid-fields-schema)])) (defn filters [request] - [:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" + [:form {"hx-trigger" "datesApplied, change delay:500ms, keyup changed from:.hot-filter delay:1000ms" "hx-get" (bidi/path-for ssr-routes/only-routes :pos-expected-deposit-table) "hx-target" "#expected-deposit-table" diff --git a/src/clj/auto_ap/ssr/pos/refunds.clj b/src/clj/auto_ap/ssr/pos/refunds.clj index 617d46f7..f0b86fa8 100644 --- a/src/clj/auto_ap/ssr/pos/refunds.clj +++ b/src/clj/auto_ap/ssr/pos/refunds.clj @@ -29,7 +29,7 @@ [:client {:optional true :default nil} [:maybe [:entity-map {:pull [:db/id :client/name]}]]]] default-grid-fields-schema)])) (defn filters [request] - [:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" + [:form {"hx-trigger" "datesApplied, change delay:500ms, keyup changed from:.hot-filter delay:1000ms" "hx-get" (bidi/path-for ssr-routes/only-routes :pos-refund-table) "hx-target" "#refund-table" diff --git a/src/clj/auto_ap/ssr/pos/sales_orders.clj b/src/clj/auto_ap/ssr/pos/sales_orders.clj index 6e5b4be2..de19b8d6 100644 --- a/src/clj/auto_ap/ssr/pos/sales_orders.clj +++ b/src/clj/auto_ap/ssr/pos/sales_orders.clj @@ -34,7 +34,7 @@ default-grid-fields-schema)])) (defn filters [request] - [:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" + [:form {"hx-trigger" "datesApplied, change delay:500ms, keyup changed from:.hot-filter delay:1000ms" "hx-get" (bidi/path-for ssr-routes/only-routes :pos-sales-table) "hx-target" "#sales-table" diff --git a/src/clj/auto_ap/ssr/pos/sales_summaries.clj b/src/clj/auto_ap/ssr/pos/sales_summaries.clj index 315e6beb..575dda3f 100644 --- a/src/clj/auto_ap/ssr/pos/sales_summaries.clj +++ b/src/clj/auto_ap/ssr/pos/sales_summaries.clj @@ -44,7 +44,7 @@ default-grid-fields-schema)])) (defn filters [request] - [:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" + [:form {"hx-trigger" "datesApplied, change delay:500ms, keyup changed from:.hot-filter delay:1000ms" "hx-get" (bidi/path-for ssr-routes/only-routes ::route/table) "hx-target" "#entity-table" diff --git a/src/clj/auto_ap/ssr/pos/tenders.clj b/src/clj/auto_ap/ssr/pos/tenders.clj index 664cbf57..26c817e2 100644 --- a/src/clj/auto_ap/ssr/pos/tenders.clj +++ b/src/clj/auto_ap/ssr/pos/tenders.clj @@ -22,7 +22,7 @@ ;; always should be fast (defn filters [request] - [:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" + [:form {"hx-trigger" "datesApplied, change delay:500ms, keyup changed from:.hot-filter delay:1000ms" "hx-get" (bidi/path-for ssr-routes/only-routes :pos-tender-table) "hx-target" "#tender-table" diff --git a/src/clj/auto_ap/ssr/transaction/common.clj b/src/clj/auto_ap/ssr/transaction/common.clj index b2a37c75..16279cbd 100644 --- a/src/clj/auto_ap/ssr/transaction/common.clj +++ b/src/clj/auto_ap/ssr/transaction/common.clj @@ -316,7 +316,7 @@ :content (:bank-account/name ba)}))}))))]) (defn filters [request] - [:form#transaction-filters {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms" + [:form#transaction-filters {"hx-trigger" "datesApplied, change delay:500ms, keyup changed from:.hot-filter delay:1000ms" "hx-get" (bidi/path-for ssr-routes/only-routes ::route/table) "hx-target" "#entity-table"