Applying feedback

This commit is contained in:
Bryce
2024-03-26 23:55:47 -07:00
parent 5b1f824ded
commit d193691963
2 changed files with 110 additions and 46 deletions

View File

@@ -73,6 +73,9 @@
(def new-form-schema (def new-form-schema
[:map [:map
[:customize-due-and-scheduled? {:optional true :default false :decode/arbitrary (fn [x] (if (= "" x)
false
x))} [:maybe :boolean]]
[:invoice/client entity-id] [:invoice/client entity-id]
[:invoice/date clj-date-schema] [:invoice/date clj-date-schema]
[:invoice/due {:optional true} [:maybe clj-date-schema]] [:invoice/due {:optional true} [:maybe clj-date-schema]]
@@ -138,7 +141,7 @@
[]) [])
(step-schema [_] (step-schema [_]
(mut/select-keys (mm/form-schema linear-wizard) #{:invoice/client :invoice/vendor :invoice/date :invoice/due :invoice/scheduled-payment :invoice/total :invoice/invoice-number})) (mut/select-keys (mm/form-schema linear-wizard) #{:invoice/client :invoice/vendor :invoice/date :invoice/due :invoice/scheduled-payment :invoice/total :invoice/invoice-number :customize-due-and-scheduled?}))
(render-step [this request] (render-step [this request]
(alog/peek ::check (:multi-form-state request)) (alog/peek ::check (:multi-form-state request))
@@ -153,7 +156,14 @@
:date (-> (fc/field-value (:invoice/date fc/*current*)) :date (-> (fc/field-value (:invoice/date fc/*current*))
(atime/unparse-local atime/normal-date)) (atime/unparse-local atime/normal-date))
:due (some-> (fc/field-value (:invoice/due fc/*current*)) :due (some-> (fc/field-value (:invoice/due fc/*current*))
(atime/unparse-local atime/normal-date))})} (atime/unparse-local atime/normal-date))
:scheduledPayment (some-> (fc/field-value (:invoice/scheduled-payment fc/*current*))
(atime/unparse-local atime/normal-date))
:customizeDueAndScheduled (fc/field-value (:customize-due-and-scheduled? fc/*current*))})}
(fc/with-field :customize-due-and-scheduled?
(com/hidden {:name (fc/field-name)
:value (fc/field-value)
:x-model "customizeDueAndScheduled"}))
(fc/with-field :invoice/client (fc/with-field :invoice/client
(if (:client request) (if (:client request)
(com/hidden {:name (fc/field-name) (com/hidden {:name (fc/field-name)
@@ -184,55 +194,65 @@
:content-fn (fn [c] (pull-attr (dc/db conn) :vendor/name c)) :content-fn (fn [c] (pull-attr (dc/db conn) :vendor/name c))
:x-model "vendorId"})])) :x-model "vendorId"})]))
[:div.flex.gap-x-8.md:flex-row.flex-col
(fc/with-field :invoice/date (fc/with-field :invoice/date
(com/validated-field (com/validated-field
{:label "Date" {:label "Date"
:errors (fc/field-errors)} :errors (fc/field-errors)}
[:div {:class "w-24"} [:div {:class "w-24"}
(com/date-input {:value (some-> (fc/field-value) (com/date-input {:value (some-> (fc/field-value)
(atime/unparse-local atime/normal-date)) (atime/unparse-local atime/normal-date))
:name (fc/field-name) :name (fc/field-name)
:error? (fc/field-errors) :error? (fc/field-errors)
:x-model "date" :x-model "date"
:placeholder "1/1/2024"})])) :placeholder "1/1/2024"})]))
(fc/with-field :invoice/due (com/validated-field {}
(com/validated-field [:div {:x-show "!customizeDueAndScheduled"}
{:label "Due (optional)" (com/link {"@click" "customizeDueAndScheduled=true"
:errors (fc/field-errors)} :x-show "!due && !scheduledPayment"}
"Add due / scheduled payment date")
(com/link {"@click" "customizeDueAndScheduled=true"
:x-show "due || scheduledPayment"}
"Change due / scheduled payment date")])
(fc/with-field :invoice/due
(com/validated-field
(hx/alpine-appear {:label "Due (optional)"
:errors (fc/field-errors)
:x-show "customizeDueAndScheduled"})
[:div {:class "w-24"
:hx-put (bidi.bidi/path-for ssr-routes/only-routes ::route/due-date)
:x-hx-val:client-id "clientId" ;; TODO maybe just use the whole form
:x-hx-val:vendor-id "vendorId"
:x-hx-val:date "date"
:x-dispatch:changed "[clientId, vendorId, date]"
:hx-trigger "changed"
:hx-target "this"
:hx-swap "innerHTML"}
(com/date-input {:value (some-> (fc/field-value)
(atime/unparse-local atime/normal-date))
:name (fc/field-name)
:x-model "due"
:error? (fc/field-errors)
:placeholder "1/1/2024"})]))
(fc/with-field :invoice/scheduled-payment
(com/validated-field
(hx/alpine-appear {:label "Scheduled payment (optional)"
:errors (fc/field-errors)
:x-show "customizeDueAndScheduled"})
[:div {:class "w-24"}
[:div {:class "w-24" [:div {:class "w-24"
:hx-put (bidi.bidi/path-for ssr-routes/only-routes ::route/due-date)
:x-hx-val:client-id "clientId" ;; TODO maybe just use the whole form :hx-put (bidi.bidi/path-for ssr-routes/only-routes ::route/scheduled-payment-date)
:x-hx-val:vendor-id "vendorId" :x-dispatch:changed "[clientId, vendorId, due]"
:x-hx-val:date "date"
:x-dispatch:changed "[clientId, vendorId, date]"
:hx-trigger "changed" :hx-trigger "changed"
:hx-target "this" :hx-target "this"
:hx-swap "innerHTML"} :hx-swap "innerHTML"}
(com/date-input {:value (some-> (fc/field-value) (com/date-input {:value (some-> (fc/field-value)
(atime/unparse-local atime/normal-date)) (atime/unparse-local atime/normal-date))
:name (fc/field-name) :name (fc/field-name)
:x-model "due"
:error? (fc/field-errors) :error? (fc/field-errors)
:placeholder "1/1/2024"})])) :placeholder "1/1/2024"})]]))
(fc/with-field :invoice/scheduled-payment
(com/validated-field
{:label "Scheduled payment (optional)"
:errors (fc/field-errors)}
[:div {:class "w-24"}
[:div {:class "w-24"
:hx-put (bidi.bidi/path-for ssr-routes/only-routes ::route/scheduled-payment-date)
:x-dispatch:changed "[clientId, vendorId, due]"
:hx-trigger "changed"
:hx-target "this"
:hx-swap "innerHTML"}
(com/date-input {:value (some-> (fc/field-value)
(atime/unparse-local atime/normal-date))
:name (fc/field-name)
:error? (fc/field-errors)
:placeholder "1/1/2024"})]]))]
(fc/with-field :invoice/invoice-number (fc/with-field :invoice/invoice-number
(com/validated-field (com/validated-field
@@ -252,10 +272,19 @@
:name (fc/field-name) :name (fc/field-name)
:class "w-24" :class "w-24"
:error? (fc/field-errors) :error? (fc/field-errors)
:placeholder "212.44"})]))]) :placeholder "212.44"})]))
[:div#expense-account-prediction
(hx/alpine-appear
{:x-dispatch:bryce "[vendorId]"
:hx-trigger "load, bryce"
:hx-put (bidi.bidi/path-for ssr-routes/only-routes ::route/account-prediction)
:hx-target "this"
:hx-swap "innerHTML"})]])
:footer :footer
(mm/default-step-footer linear-wizard this :validation-route ::route/new-wizard-navigate) (mm/default-step-footer linear-wizard this :validation-route ::route/new-wizard-navigate
:next-button (com/button {:color :primary :x-ref "next" :class "w-32"} "Save"))
:validation-route ::route/new-wizard-navigate))) :validation-route ::route/new-wizard-navigate)))
(defn- location-select* (defn- location-select*
@@ -544,6 +573,14 @@
transaction [:upsert-invoice (-> multi-form-state transaction [:upsert-invoice (-> multi-form-state
:snapshot :snapshot
(assoc :db/id "invoice") (assoc :db/id "invoice")
(dissoc :customize-due-and-scheduled?)
(assoc :invoice/expense-accounts (if-let [ieas (seq (-> multi-form-state :snapshot :invoice/expense-accounts))]
ieas
[{:db/id "123"
:invoice-expense-account/location "Shared"
:invoice-expense-account/account (:db/id (:vendor/default-account (clientize-vendor (get-vendor vendor-id)
client-id)))
:invoice-expense-account/amount (:invoice/total (:snapshot multi-form-state))}]))
(assoc (assoc
:invoice/outstanding-balance (:invoice/total (:snapshot multi-form-state)) :invoice/outstanding-balance (:invoice/total (:snapshot multi-form-state))
:invoice/import-status :import-status/imported :invoice/import-status :import-status/imported
@@ -551,8 +588,9 @@
(maybe-spread-locations) (maybe-spread-locations)
(update :invoice/date coerce/to-date) (update :invoice/date coerce/to-date)
(update :invoice/due coerce/to-date))]] (update :invoice/due coerce/to-date))]]
(alog/peek ::test transaction)
(assert-invoice-amounts-add-up invoice) (assert-invoice-amounts-add-up (second transaction))
(assert-no-conflicting invoice) (assert-no-conflicting invoice)
(exception->4xx #(assert-can-see-client (:identity request) client-id)) (exception->4xx #(assert-can-see-client (:identity request) client-id))
@@ -631,6 +669,27 @@
:error? false :error? false
:placeholder "1/1/2024"})))) :placeholder "1/1/2024"}))))
(defn account-prediction [{:keys [multi-form-state form-errors]}]
(let [vendor (clientize-vendor (get-vendor (:invoice/vendor (:step-params multi-form-state)))
(->db-id (:invoice/client (:step-params multi-form-state)))) ]
(html-response
(if-let [account-name (:account/name (:vendor/default-account vendor))]
[:div {:class "transition duration-300 ease-in-out htmx-added:opacity-0 opacity-100"}
[:label {:class "block mb-2 text-sm font-medium text-gray-900 dark:text-white"} "Default expense account"]
[:div.flex.gap-2.items-center (com/pill {:color :primary} account-name)
(com/validated-save-button (cond-> {:errors form-errors
;;:x-data (hx/json {})
:class "w-24"
:hx-put (hu/url (bidi/path-for ssr-routes/only-routes ::route/new-wizard-navigate)
{:from (mm/encode-step-key :basic-details)
:to (mm/encode-step-key :accounts)})
:hx-target "closest form"})
"Change"
[:div.w-5.h-5 svg/arrow-right])]]
[:div]))))
(def key->handler (def key->handler
(apply-middleware-to-all-handlers (apply-middleware-to-all-handlers
{::route/new-wizard (-> mm/open-wizard-handler {::route/new-wizard (-> mm/open-wizard-handler
@@ -640,6 +699,10 @@
(mm/wrap-wizard new-wizard) (mm/wrap-wizard new-wizard)
(mm/wrap-decode-multi-form-state) (mm/wrap-decode-multi-form-state)
(wrap-nested-form-params)) (wrap-nested-form-params))
::route/account-prediction (-> account-prediction
(mm/wrap-wizard new-wizard)
(mm/wrap-decode-multi-form-state)
(wrap-nested-form-params))
::route/scheduled-payment-date (-> scheduled-payment-date ::route/scheduled-payment-date (-> scheduled-payment-date
(mm/wrap-wizard new-wizard) (mm/wrap-wizard new-wizard)
(mm/wrap-decode-multi-form-state) (mm/wrap-decode-multi-form-state)

View File

@@ -10,6 +10,7 @@
"/navigate" ::new-wizard-navigate "/navigate" ::new-wizard-navigate
"/account/new" ::new-wizard-new-account "/account/new" ::new-wizard-new-account
"/account/location-select" ::location-select "/account/location-select" ::location-select
"/account/prediction" ::account-prediction
"/total" ::expense-account-total} "/total" ::expense-account-total}
"/pay-button" ::pay-button "/pay-button" ::pay-button
"/pay" {:get ::pay-wizard "/pay" {:get ::pay-wizard