Another improvement

This commit is contained in:
2022-07-22 06:59:37 -07:00
parent ccbe63456a
commit 3c11891c45
5 changed files with 87 additions and 77 deletions

View File

@@ -12,8 +12,9 @@
(def money (m/schema [float? {:error/message "Invalid money"}]))
(def not-empty-string (m/schema [:re {:error/message "Required"} #"\S+"]))
(def code-string (m/schema [:re #"[A-Z0-9\-]+"]))
(def keyword (m/schema [:fn (fn [d]
(keyword? d))]))
(def positive-integer (m/schema [:int {:min 1}]))
(def integer-code (m/schema [:int {:min 10000 :max 99999}]))
(def expense-account (m/schema [:map
[:id :string]

View File

@@ -22,14 +22,26 @@
]
(r/children (r/current-component))))
(defn select-field [{:keys [options allow-nil? class] :as props}]
(defn select-field [{:keys [options allow-nil? class on-change keywordize?] :as props}]
[:div.select {:class class}
[:select (-> props
(dissoc :allow-nil? :class :options)
(update :value (fn [v]
(if (str/blank? v)
(cond (str/blank? v)
""
v))))
keywordize?
(name v)
:else
v)))
(assoc :on-change
(fn [e]
(println "VALUE IS" (keyword (.. e -target -value)))
(if keywordize?
(on-change (keyword (.. e -target -value)))
(on-change e))))
(dissoc :keywordize?))
[:<>
(when allow-nil?
[:option {:value nil}])

View File

@@ -73,8 +73,7 @@
[buttons/new-button {:name "Account"
:class "is-primary"
:event [::account-form/editing
{:type :asset
:account-set "default"}]}]]
{:account-set "default"}]}]]
[table/accounts-table {:data-page ::page}]])
(defn admin-accounts-page []

View File

@@ -9,7 +9,10 @@
[clojure.string :as str]
[re-frame.core :as re-frame]
[auto-ap.forms.builder :as form-builder]
[vimsical.re-frame.cofx.inject :as inject]))
[vimsical.re-frame.cofx.inject :as inject]
[auto-ap.views.components :as com]
[malli.core :as m]
[auto-ap.schema :as schema]))
(def types [:dividend :expense :asset :liability :equity :revenue])
(def applicabilities [:global :optional :customized])
@@ -35,11 +38,7 @@
(:name client-override))})
client-overrides)}))
(re-frame/reg-sub
::can-submit
:<- [::request]
(fn [request]
(s/valid? ::entity/account request)))
(re-frame/reg-event-db
::editing
@@ -58,92 +57,91 @@
::saving
[with-user (re-frame/inject-cofx ::inject/sub [::request]) ]
(fn [{:keys [user] ::keys [request]} _]
(when @(re-frame/subscribe [::can-submit])
(let [_ @(re-frame/subscribe [::forms/form ::form])]
{:graphql
{:owns-state {:single ::form}
:token user
:query-obj {:venia/operation {:operation/type :mutation
:operation/name "UpsertAccount"}
:venia/queries [{:query/data [:upsert-account
{:account request}
[:id :type :name :account-set :numeric-code :location :applicability [:client-overrides [:name :id [:client [:id :name]]]]]]}]}
:on-success [::edited]
:on-error [::forms/save-error ::form]}}))))
(let [_ @(re-frame/subscribe [::forms/form ::form])]
{:graphql
{:owns-state {:single ::form}
:token user
:query-obj {:venia/operation {:operation/type :mutation
:operation/name "UpsertAccount"}
:venia/queries [{:query/data [:upsert-account
{:account request}
[:id :type :name :account-set :numeric-code :location :applicability [:client-overrides [:name :id [:client [:id :name]]]]]]}]}
:on-success [::edited]
:on-error [::forms/save-error ::form]}})))
(def account-customization-schema
(m/schema
[:map [:client schema/reference]
[:name schema/not-empty-string]]))
(def account-schema
(m/schema
[:map
[:numeric-code schema/integer-code]
[:name schema/not-empty-string]
[:type [:enum :dividend :expense :asset :liability :equity :revenue]]
[:location {:optional true} [:maybe :string]]
[:applicability [:enum :global :optional :customized]]
[:client-overrides {:optional true}
[:maybe [:sequential account-customization-schema]]]]))
(defn form [_]
(let [{account :data } @(re-frame/subscribe [::forms/form ::form])]
[side-bar {:on-close (dispatch-event [::forms/form-closing ::form])}
[form-builder/builder {:can-submit [::can-submit]
:change-event [::forms/change ::form]
[form-builder/builder {:change-event [::forms/change ::form]
:submit-event [::saving]
:id ::form}
:id ::form
:schema account-schema}
[form-builder/section {:title (if (:id account)
"Edit account"
"Add account")}
[form-builder/field
"Account Set"
[:input.input {:type "text"
:field :account-set
:disabled (boolean (:id account))
:spec ::entity/account-set}]]
[form-builder/field
[form-builder/field-v2 {:field :numeric-code}
"Code"
[:input.input {:type "text"
:field :numeric-code
:disabled (boolean (:id account))
:spec ::entity/numeric-code}]]
[com/number-input
{:disabled (boolean (:id account))
:auto-focus (not (boolean (:id account)))
:style {:width "9em"}}]]
[form-builder/field
[form-builder/field-v2 {:field :name}
"Name"
[:input.input {:type "text"
:field :name
:spec ::entity/name}]]
:auto-focus (boolean (:id account))}]]
[form-builder/vertical-control
[form-builder/field-v2 {:field :type}
"Account Type"
[:div.select
[form-builder/raw-field
[:select {:type "select"
:field :type
:spec (set types)}
(map (fn [l]
[:option {:value (name l)} (str/capitalize (name l))]) types)]]]]
[com/select-field {:options (map (fn [l]
[l (str/capitalize (name l))])
types)
:allow-nil? true
:keywordize? true}]]
[form-builder/field
[form-builder/field-v2 {:field :location}
"Location"
[:input.input.known-field.location {:type "text"
:field :location
:spec ::entity/location}]]
[:input.input.known-field.location {:type "text"}]]
[form-builder/section {:title "Client"}
[:h2.subtitle "Client"]
[form-builder/vertical-control
[form-builder/field-v2 {:field :applicability}
"Applicability"
[:div.select
[form-builder/raw-field
[:select {:type "select"
:field :applicability
:spec (set applicabilities)}
(map (fn [l]
[:option {:value (name l)} (str/capitalize (name l))]) applicabilities)]]]]
[form-builder/field
[com/select-field {:options (map (fn [l]
[l
(str/capitalize (name l))])
applicabilities)
:allow-nil? true
:keywordize? true}]]
[form-builder/field-v2 {:field :client-overrides}
"Customizations"
[multi-field {:type "multi-field"
:field [:client-overrides]
:template [[typeahead-v3 {:entities @(re-frame/subscribe [::subs/clients])
:style {:width "13em"}
:entity->text :name
:type "typeahead-v3"
:field [:client]}]
[:input.input {:type "text"
:style {:width "15em"}
:placeholder "Bubblegum"
:field [:name]}]
]}]]]
[com/multi-field-v2 {:template [[form-builder/raw-field-v2 {:field :client}
[typeahead-v3 {:entities @(re-frame/subscribe [::subs/clients])
:style {:width "13em"}
:entity->text :name}]]
[form-builder/raw-field-v2 {:field :name}
[:input.input {:type "text"
:style {:width "15em"}
:placeholder "Bubblegum"}]]]
:key-fn :id
:schema [:sequential account-customization-schema]}]]]
[form-builder/error-notification]
[form-builder/submit-button "Save"]]]]))

View File

@@ -63,7 +63,7 @@
(def login-url
(let [client-id "264081895820-0nndcfo3pbtqf30sro82vgq5r27h8736.apps.googleusercontent.com"
redirect-uri (js/encodeURI (str (.-origin (.-location js/window)) "/api/oauth"))]
(str "https://accounts.google.com/o/oauth2/auth?access_type=online&client_id=" client-id "&redirect_uri=" redirect-uri "&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile")))
(str "https://accounts.google.com/o/oauth2/auth?access_type=online&client_id=" client-id "&redirect_uri=" redirect-uri "&response_type=code&max_auth_age=0&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile")))
(defn dispatch-value-change [event]
(fn [e]