fix(ssr): operation handlers read live step-params, not the stale snapshot (rewrite stage 1)
apply-new-account / apply-remove-account / apply-toggle-amount-mode rebuilt the account rows from the decoded :snapshot, dropping any value the user typed but that had not yet round-tripped into the snapshot (type 50%, click "New account" -> first row reverts, giving a 66.67/33.33 split instead of 50/50). Read the live :step-params rows instead (already schema-decoded by mm/wrap-wizard, so typed), falling back to snapshot only when absent. First stage of removing the snapshot round-trip; fixes a real user-facing bug (typed amounts lost on add/remove/$%-toggle). Restore the percentage-split e2e to the realistic type-then-add ordering as a regression guard. Modal stays green: swap 6/6, transaction-edit 8/8.
This commit is contained in:
@@ -537,10 +537,15 @@
|
||||
"edit-form-changed op: convert account amounts between $ and % and record the new mode."
|
||||
[request]
|
||||
(let [snapshot (-> request :multi-form-state :snapshot)
|
||||
step-params (-> request :multi-form-state :step-params)
|
||||
old-mode (or (:amount-mode snapshot) "$")
|
||||
new-mode (or (get-in request [:multi-form-state :step-params :amount-mode]) "$")
|
||||
new-mode (or (:amount-mode step-params) "$")
|
||||
total (Math/abs (or (:transaction/amount snapshot) 0.0))
|
||||
accounts (convert-accounts-mode (:transaction/accounts snapshot) old-mode new-mode total)]
|
||||
;; Convert the LIVE rows (step-params), not the stale snapshot, so amounts the
|
||||
;; user typed before toggling survive. step-params is already schema-decoded.
|
||||
accounts (convert-accounts-mode (or (seq (:transaction/accounts step-params))
|
||||
(:transaction/accounts snapshot))
|
||||
old-mode new-mode total)]
|
||||
(-> request
|
||||
(assoc-in [:multi-form-state :snapshot :transaction/accounts] accounts)
|
||||
(assoc-in [:multi-form-state :snapshot :amount-mode] new-mode))))
|
||||
@@ -1456,13 +1461,17 @@
|
||||
"edit-form-changed op: append a fresh account row."
|
||||
[request]
|
||||
(let [snapshot (-> request :multi-form-state :snapshot)
|
||||
amount-mode (or (:amount-mode snapshot) "$")
|
||||
step-params (-> request :multi-form-state :step-params)
|
||||
amount-mode (or (:amount-mode step-params) (:amount-mode snapshot) "$")
|
||||
total (Math/abs (or (:transaction/amount snapshot) 0.0))
|
||||
new-account {:db/id (str (java.util.UUID/randomUUID))
|
||||
:new? true
|
||||
:transaction-account/location "Shared"
|
||||
:transaction-account/amount (if (= amount-mode "%") 100.0 total)}
|
||||
accounts (vec (or (:transaction/accounts snapshot) []))
|
||||
;; Append to the LIVE rows (step-params) so values typed before clicking
|
||||
;; "New account" are not reverted to the stale snapshot.
|
||||
accounts (vec (or (seq (:transaction/accounts step-params))
|
||||
(:transaction/accounts snapshot) []))
|
||||
updated-accounts (conj accounts new-account)
|
||||
updated-request (-> request
|
||||
(assoc-in [:multi-form-state :snapshot :transaction/accounts] updated-accounts)
|
||||
@@ -1474,7 +1483,11 @@
|
||||
[request]
|
||||
(let [row-index (some-> request :form-params (get "row-index") Integer/parseInt)
|
||||
snapshot (-> request :multi-form-state :snapshot)
|
||||
accounts (vec (or (:transaction/accounts snapshot) []))
|
||||
step-params (-> request :multi-form-state :step-params)
|
||||
;; Remove from the LIVE rows (step-params) so the surviving rows keep the values
|
||||
;; the user typed, rather than reverting to the stale snapshot.
|
||||
accounts (vec (or (seq (:transaction/accounts step-params))
|
||||
(:transaction/accounts snapshot) []))
|
||||
updated-accounts (if (and row-index (< row-index (count accounts)))
|
||||
(vec (concat (subvec accounts 0 row-index)
|
||||
(subvec accounts (inc row-index))))
|
||||
|
||||
Reference in New Issue
Block a user