diff --git a/figwheel-main.edn b/figwheel-main.edn index 41f90161..1936ae31 100644 --- a/figwheel-main.edn +++ b/figwheel-main.edn @@ -1,4 +1,4 @@ -{:watch-dirs ["src/cljs"] +{:watch-dirs ["src/cljs", "src/cljc"] :css-dirs ["resources/public/css"] :ring-server-options {:port 3449} :ring-handler auto-ap.handler/app diff --git a/src/cljc/auto_ap/entities/vendors.cljc b/src/cljc/auto_ap/entities/vendors.cljc index 6e7da957..a5f9e511 100644 --- a/src/cljc/auto_ap/entities/vendors.cljc +++ b/src/cljc/auto_ap/entities/vendors.cljc @@ -11,6 +11,7 @@ (s/def ::name ::required-identifier) (s/def ::hidden boolean?) (s/def ::print-as (s/nilable string?)) +(s/def ::terms (s/nilable int?)) (s/def ::invoice-reminder-schedule (s/nilable #{"Weekly" "Never" nil})) @@ -25,6 +26,7 @@ (s/keys :req-un [::name] :opt-un [::code ::default-account-id + ::terms ::hidden ::id ::print-as @@ -34,8 +36,7 @@ ::address]) (s/or :hidden #(= (:hidden %) true) - :has-expense-account (and (s/keys :req-un [::default-account-id]) - #(not (nil? (:default-account-id %))))))) + :has-expense-account #(not (nil? (:id (:default-account %))))))) (def vendor-spec (apply hash-map (drop 1 (s/form ::vendor)))) diff --git a/src/cljs/auto_ap/effects.cljs b/src/cljs/auto_ap/effects.cljs index 3601dbc8..0e0247cc 100644 --- a/src/cljs/auto_ap/effects.cljs +++ b/src/cljs/auto_ap/effects.cljs @@ -137,6 +137,7 @@ :graphql (fn [{:keys [query on-success on-error token variables query-obj]}] (go + (println on-error) (let [headers (if token {"Authorization" (str "Token " token)} {}) @@ -155,12 +156,12 @@ :body (when = (:post method) query) :url (str "/api/graphql?query=" (when (= :get method) (js/encodeURIComponent query)) "&variables=" (pr-str (or variables {})))}))] + (cond (= (:status response) 401) (re-frame/dispatch [:auto-ap.events/logout "Your session has expired. Please log in again."]) - (>= (:status response) 400) (when on-error (->> response diff --git a/src/cljs/auto_ap/events.cljs b/src/cljs/auto_ap/events.cljs index d9dbb23f..0c57cad0 100644 --- a/src/cljs/auto_ap/events.cljs +++ b/src/cljs/auto_ap/events.cljs @@ -213,35 +213,8 @@ (fn [x] (assoc-in x more value))))) -(re-frame/reg-event-fx - ::save-vendor - (fn [{:keys [db]} _] - (let [edited-vendor (get-in db [:user-editing-vendor])] - (assoc {} :graphql - {:token (-> db :user) - :query-obj {:venia/operation {:operation/type :mutation - :operation/name "UpsertVendor"} - - :venia/queries [{:query/data [:upsert-vendor - {:vendor (dissoc edited-vendor :default-account)} - vendor-query]}]} - :on-success [::save-complete] - :on-error [::save-error]})))) -(re-frame/reg-event-db - ::save-error - (fn [db [_ vendor]] - (-> db - (assoc-in [:modal-state :auto-ap.views.main/user-editing-vendor :error] true) - (assoc-in [:modal-state :auto-ap.views.main/user-editing-vendor :saving?] false)))) -(re-frame/reg-event-fx - ::save-complete - (fn [{:keys [db]} [_ vendor]] - {:dispatch [::modal-completed :auto-ap.views.main/user-editing-vendor ] - :db (-> db - (dissoc :user-editing-vendor) - (assoc-in [:vendors (:id (:upsert-vendor vendor))] (:upsert-vendor vendor)))})) (re-frame/reg-event-db ::page-failed (fn [db [_ result]] diff --git a/src/cljs/auto_ap/events/admin/vendors.cljs b/src/cljs/auto_ap/events/admin/vendors.cljs deleted file mode 100644 index 609e4915..00000000 --- a/src/cljs/auto_ap/events/admin/vendors.cljs +++ /dev/null @@ -1,146 +0,0 @@ -(ns auto-ap.events.admin.vendors - (:require [re-frame.core :as re-frame] - [clojure.spec.alpha :as s] - [auto-ap.db :as db] - [auto-ap.routes :as routes] - [auto-ap.effects :as effects] - [auto-ap.forms :as forms] - [auto-ap.subs :as subs] - [auto-ap.entities.vendors :as entity] - [auto-ap.events :as events] - [auto-ap.utils :refer [by]] - - [bidi.bidi :as bidi])) - - - -(re-frame/reg-event-fx - ::edit - (fn [{:keys [db]} [_ vendor-id]] - {:db (assoc-in db [:user-editing-vendor] - (-> (get (:vendors db) vendor-id) - (assoc :default-account-id (:id (:default-account (get (:vendors db) vendor-id)))))) - :dispatch [::events/modal-status :auto-ap.views.main/user-editing-vendor {:visible? true}]})) - -(re-frame/reg-event-fx - ::new - (fn [{:keys [db]} _] - {:db (assoc-in db [:admin :vendor] - {}) - :dispatch [::events/modal-status :auto-ap.views.pages.admin.vendors/admin-vendor {:visible? true}]})) - - - -#_(re-frame/reg-event-fx - ::merge-submit-clicked - [(forms/in-form :auto-ap.views.pages.admin.vendors/merge-vendors)] - (fn [{{{:keys [from-id to-id]} :data :as merge-vendors-form} :db :as g} _] - (println g) - (let [user @(re-frame/subscribe [::subs/token])] - (if (and from-id to-id) - {:db (-> merge-vendors-form - (assoc :status :loading) - (assoc :error nil)) - :graphql - {:token user - :query-obj {:venia/operation {:operation/type :mutation - :operation/name "MergeVendors"} - :venia/queries [{:query/data [:merge-vendors - {:from from-id :to to-id} - [:id]]}]} - :on-success [::merge-vendors-complete] - :on-error [::forms/save-error :auto-ap.views.pages.admin.vendors/merge-vendors]}} - {:db merge-vendors-form})))) - -(re-frame/reg-event-fx - ::save - (fn [{:keys [db]} _] - (let [edited-vendor (get-in db [:admin :vendor]) - fx {:db (assoc-in db [:admin :vendor :saving?] true)} - _ (println "EDITED" edited-vendor)] - (when (s/valid? ::entity/vendor edited-vendor) - (assoc fx :graphql - {:token (-> db :user) - :query-obj {:venia/operation {:operation/type :mutation - :operation/name "UpsertVendor"} - - :venia/queries [{:query/data [:upsert-vendor - {:vendor (-> edited-vendor - (dissoc :default-account))} - events/vendor-query]}]} - :on-success [::save-complete] - :on-error [::save-error]}))))) - -(re-frame/reg-event-fx - ::remind - (fn [{:keys [db] :as fx} [_ id]] - { :http {:method :post - :token (:user db) - :headers {"Content-Type" "application/edn"} - :uri (str "/api/vendors/" id "/remind") - :on-success [::reminder-sent] - :on-error [::failed "Failed to send reminder"]} - :db (assoc-in db [:admin :banner] nil)})) - -(re-frame/reg-event-db - ::reminder-sent - (fn [db [_ error]] - (-> db - (assoc-in [:admin :banner] "Reminder sent!")))) - -(re-frame/reg-event-db - ::failed - (fn [db [_ error]] - (-> db - (assoc-in [:admin :banner] error)))) - -(re-frame/reg-event-fx - ::save-complete - (fn [{:keys [db]} [_ {vendor :upsert-vendor} ]] - {:dispatch [::events/modal-completed :auto-ap.views.pages.admin.vendors/admin-vendor ] - :db (-> db - - (assoc-in [:admin :vendor] nil) - (assoc-in [:vendors (:id vendor)] vendor))})) - -(re-frame/reg-event-db - ::save-error - (fn [db [_ vendor]] - (println "ERROR?") - (-> db - (assoc-in [:admin :vendor :error] true) - (assoc-in [:admin :vendor :saving?] false)))) - -(re-frame/reg-event-db - ::change - (fn [db [_ path value]] - (println path value) - (assoc-in db (concat [:admin :vendor] path) - value))) - -(re-frame/reg-event-db - ::add-relationship - (fn [db [_ ]] - (-> db - (update-in [:admin :vendor :relationships] #(conj (or % []) - {:account-number (get-in db [:admin :vendor :new-relationship-account-number]) - :client-id (get-in db [:admin :vendor :new-relationship-client])})) - (update-in [:admin :vendor] dissoc :new-relationship-account-number :new-relationship-client)))) - -(re-frame/reg-event-db - ::remove-relationship - (fn [db [_ i]] - (-> db - (update-in [:admin :vendor :relationships] #(vec (concat (subvec % 0 i) (subvec % (min (count %) (inc i))))))))) - -(re-frame/reg-event-fx - ::mounted - (fn [{:keys [db]} _] - {:graphql {:token (:user db) - :query-obj {:venia/queries [[:vendor events/vendor-query]]} - :on-success [::received-vendors]}})) - -(re-frame/reg-event-db - ::received-vendors - (fn [db [_ vendors]] - (assoc db :vendors (by :id (:vendor vendors ))))) diff --git a/src/cljs/auto_ap/forms.cljs b/src/cljs/auto_ap/forms.cljs index 4bea7f86..08bc0c3d 100644 --- a/src/cljs/auto_ap/forms.cljs +++ b/src/cljs/auto_ap/forms.cljs @@ -74,6 +74,7 @@ (re-frame/reg-event-db ::save-error (fn [db [_ form result]] + (println form result) (-> db (assoc-in [::forms form :status] :error) (assoc-in [::forms form :error] (or (:message (first result)) diff --git a/src/cljs/auto_ap/subs.cljs b/src/cljs/auto_ap/subs.cljs index 8ea01c60..e8d776fc 100644 --- a/src/cljs/auto_ap/subs.cljs +++ b/src/cljs/auto_ap/subs.cljs @@ -156,15 +156,6 @@ (fn [db] (:admin db))) -(re-frame/reg-sub - ::user-editing-vendor - (fn [db] - (update (-> db :user-editing-vendor) - :hidden - #(if (nil? %) - false - %)))) - (re-frame/reg-sub ::is-admin? :<- [::user] diff --git a/src/cljs/auto_ap/views/components/layouts.cljs b/src/cljs/auto_ap/views/components/layouts.cljs index 0bd6a61d..49fa700f 100644 --- a/src/cljs/auto_ap/views/components/layouts.cljs +++ b/src/cljs/auto_ap/views/components/layouts.cljs @@ -10,7 +10,9 @@ [auto-ap.views.utils :refer [active-when active-when= login-url dispatch-event appearing css-transition-group]] [auto-ap.views.components.vendor-dialog :refer [vendor-dialog]] - [auto-ap.views.components.vendor-dialog :refer [vendor-dialog]])) + [auto-ap.views.components.vendor-dialog :refer [vendor-dialog]] + [auto-ap.entities.vendors :as vendor] + [auto-ap.views.components.vendor-dialog :as vendor-dialog])) (defn navbar-drop-down-contents [{:keys [id]} children ] @@ -85,7 +87,7 @@ [:div.navbar-end [:div.navbar-item [:a.button.is-primary.is-outlined - {:on-click (dispatch-event [::events/modal-status :auto-ap.views.main/user-editing-vendor {:visible? true}])} + {:on-click (dispatch-event [::vendor-dialog/started {}])} [:span.icon [:i.fa.fa-plus] ] [:span "Vendor"]]] @@ -140,9 +142,7 @@ ] #_[footer] [:div - [vendor-dialog {:vendor @(re-frame/subscribe [::subs/user-editing-vendor]) - :save-event [::events/save-vendor] - :change-event [::events/change-nested-form-state [:user-editing-vendor]] :id :auto-ap.views.main/user-editing-vendor}] + [vendor-dialog {}] bottom] [:div#dz-hidden]])) diff --git a/src/cljs/auto_ap/views/components/modal.cljs b/src/cljs/auto_ap/views/components/modal.cljs index e2000343..e43df77b 100644 --- a/src/cljs/auto_ap/views/components/modal.cljs +++ b/src/cljs/auto_ap/views/components/modal.cljs @@ -24,6 +24,7 @@ (defn action-modal [{:keys [title warning action-text id save-event can-submit? status-from] :or {can-submit? true}} & rest] (let [{:keys [visible? saving? error-message]} @(re-frame/subscribe [::subs/modal-state id status-from])] + (println id visible?) (when visible? [:form {:id id :on-submit (fn [e] diff --git a/src/cljs/auto_ap/views/components/vendor_dialog.cljs b/src/cljs/auto_ap/views/components/vendor_dialog.cljs index 9abd9b76..e265fb30 100644 --- a/src/cljs/auto_ap/views/components/vendor_dialog.cljs +++ b/src/cljs/auto_ap/views/components/vendor_dialog.cljs @@ -1,15 +1,17 @@ (ns auto-ap.views.components.vendor-dialog (:require [re-frame.core :as re-frame] - [auto-ap.views.utils :refer [dispatch-event horizontal-field bind-field]] - [auto-ap.views.components.modal :refer [action-modal]] - [auto-ap.views.components.address :refer [address-field]] - [auto-ap.views.components.typeahead :refer [typeahead]] - [clj-fuzzy.metrics :refer [jaccard jaro-winkler]] - [clojure.spec.alpha :as s] - [clojure.string :as str] - [auto-ap.entities.vendors :as entity] - [auto-ap.entities.contact :as contact] - [auto-ap.subs :as subs])) + [auto-ap.views.utils :refer [dispatch-event horizontal-field bind-field with-user]] + [auto-ap.views.components.modal :refer [action-modal]] + [auto-ap.views.components.address :refer [address-field]] + [auto-ap.views.components.typeahead :refer [typeahead-entity]] + [auto-ap.events :as events] + [clj-fuzzy.metrics :refer [jaccard jaro-winkler]] + [clojure.spec.alpha :as s] + [clojure.string :as str] + [auto-ap.entities.vendors :as entity] + [auto-ap.entities.contact :as contact] + [auto-ap.subs :as subs] + [auto-ap.forms :as forms])) (defn ngrams [text len] (mapv #(.toLowerCase (str/join "" %)) (partition len 1 text))) @@ -24,29 +26,70 @@ (fn [v] (mapv (fn [n] [v (jaro-winkler text n ) n text]) (ngrams v (count text))))) - #_(sort-by second) (filter #(> (second %) 0.9)) #_(map (fn [x] (doto x println))) (map first) first)))) -(defn vendor-dialog [{:keys [vendor save-event change-event id] {:keys [name]} :vendor}] +(re-frame/reg-event-fx + ::started + (fn [{:keys [db]} [_ vendor]] + {:db (-> db (forms/start-form ::vendor-form (-> vendor + (update :hidden #(if (nil? %) + false + %)) + (update :default-account + (fn [da] + @(re-frame/subscribe [::subs/account (:id da)])))))) + + :dispatch [::events/modal-status ::dialog {:visible? true}]})) + +(re-frame/reg-event-fx + ::save-complete + [(forms/triggers-stop ::vendor-form)] + (fn [{:keys [db]} [_ {vendor :upsert-vendor} ]] + {:dispatch [::events/modal-completed ::dialog ] + :db (-> db + (assoc-in [:vendors (:id vendor)] vendor))})) + +(re-frame/reg-event-fx + ::save + [with-user (forms/triggers-loading ::vendor-form) (forms/in-form ::vendor-form)] + (fn [{:keys [user] {:keys [data]} :db} _] + (when (s/valid? ::entity/vendor data) + { :graphql + {:token user + :query-obj {:venia/operation {:operation/type :mutation + :operation/name "UpsertVendor"} + :venia/queries [{:query/data [:upsert-vendor + {:vendor (-> data + (assoc :default-account-id (:id (:default-account data))) + (dissoc :default-account))} + events/vendor-query]}]} + :on-success [::save-complete] + :on-error [::forms/save-error ::vendor-form]}}))) + +(defn vendor-dialog [{:keys [save-event] {:keys [name]} :vendor}] (let [clients-by-id @(re-frame/subscribe [::subs/clients-by-id]) all-vendors @(re-frame/subscribe [::subs/vendors]) - chooseable-expense-accounts @(re-frame/subscribe [::subs/chooseable-expense-accounts])] - [action-modal {:id id - :title [:span (if (:id vendor) - (str "Edit " (or name "")) - (str "Add " (or name ""))) - (when (:error vendor) + chooseable-expense-accounts @(re-frame/subscribe [::subs/chooseable-expense-accounts]) + {:keys [data error ] :as f} @(re-frame/subscribe [::forms/form ::vendor-form]) + change-event [::forms/change ::vendor-form]] + [action-modal {:id ::dialog + :title [:span (if (:id data) + (str "Edit " (or (:name data) "")) + (str "Add " (or (:name data) ""))) + (when error [:span.icon.has-text-danger [:i.fa.fa-exclamation-triangle]])] - :warning (when-let [vendor (partial-matches-vendor? vendor all-vendors)] - (str "Are you sure you don't mean " vendor "?")) + :status-from ::vendor-form + :warning + (when-let [vendor (partial-matches-vendor? data all-vendors)] + (str "Are you sure you don't mean " vendor "?")) :action-text "Save" - :save-event save-event - :can-submit? (s/valid? ::entity/vendor vendor)} + :save-event [::save] + :can-submit? (s/valid? ::entity/vendor data)} [horizontal-field [:label.label "Name"] @@ -57,7 +100,7 @@ :field :name :spec ::entity/name :event change-event - :subscription vendor}]]]] + :subscription data}]]]] [horizontal-field [:label.label "Print Checks As"] @@ -67,7 +110,18 @@ :field :print-as :spec ::entity/print-as :event change-event - :subscription vendor}]]]] + :subscription data}]]]] + + [horizontal-field + [:label.label "Terms"] + [:div.control + [bind-field + [:input.input {:type "number" + :step "1" + :field :terms + :spec ::entity/terms + :event change-event + :subscription data}]]]] [horizontal-field [:label.label "Hidden"] @@ -77,26 +131,24 @@ :field :hidden :spec ::entity/hidden :event change-event - :subscription vendor}]]]] + :subscription data}]]]] [:h2.subtitle "Expense Accounts"] [horizontal-field [:label.label "Default"] + [bind-field - [typeahead {:matches (map (fn [x] [(:id x) (str (:numeric-code x) " - " (:name x))]) chooseable-expense-accounts) - :type "typeahead" - :field [:default-account-id] - :event change-event - :subscription vendor}]]] - + [typeahead-entity {:matches chooseable-expense-accounts + :match->text (fn [x ] (str (:numeric-code x) " - " (:name x))) + :type "typeahead-entity" + :field [:default-account] + :event change-event + :subscription data}]]] [:h2.subtitle "Address"] [address-field {:field [:address] :event change-event - :subscription vendor}] - - - + :subscription data}] [:h2.subtitle "Contact"] [horizontal-field [:label.label "Primary"] @@ -106,7 +158,7 @@ :field [:primary-contact :name] :spec ::contact/name :event change-event - :subscription vendor}]] + :subscription data}]] [:span.icon.is-small.is-left [:i.fa.fa-user]]] @@ -118,7 +170,7 @@ :field [:primary-contact :email] :spec ::contact/email :event change-event - :subscription vendor}]]] + :subscription data}]]] [:div.control.has-icons-left [bind-field @@ -126,7 +178,7 @@ :field [:primary-contact :phone] :spec ::contact/phone :event change-event - :subscription vendor}]] + :subscription data}]] [:span.icon.is-small.is-left [:i.fa.fa-phone]]]] [horizontal-field @@ -137,7 +189,7 @@ :field [:secondary-contact :name] :spec ::contact/name :event change-event - :subscription vendor}]] + :subscription data}]] [:span.icon.is-small.is-left [:i.fa.fa-user]]] [:div.control.has-icons-left @@ -148,14 +200,14 @@ :field [:secondary-contact :email] :spec ::contact/email :event change-event - :subscription vendor}]]] + :subscription data}]]] [:div.control.has-icons-left [bind-field [:input.input {:type "phone" :field [:secondary-contact :phone] :spec ::contact/phone :event change-event - :subscription vendor}]] + :subscription data}]] [:span.icon.is-small.is-left [:i.fa.fa-phone]]]] [horizontal-field @@ -169,7 +221,7 @@ :field :invoice-reminder-schedule :spec ::entity/invoice-reminder-schedule :event change-event - :subscription vendor}]] + :subscription data}]] " Send weekly"] [:label.radio @@ -180,6 +232,6 @@ :field :invoice-reminder-schedule :spec ::entity/invoice-reminder-schedule :event change-event - :subscription vendor}]] + :subscription data}]] " Never"]]] - (when (:saving? vendor) [:div.is-overlay {:style {"backgroundColor" "rgba(150,150,150, 0.5)"}}])])) + (when (:saving? data) [:div.is-overlay {:style {"backgroundColor" "rgba(150,150,150, 0.5)"}}])])) diff --git a/src/cljs/auto_ap/views/main.cljs b/src/cljs/auto_ap/views/main.cljs index ae9f352d..efa31eef 100644 --- a/src/cljs/auto_ap/views/main.cljs +++ b/src/cljs/auto_ap/views/main.cljs @@ -9,7 +9,6 @@ [auto-ap.views.components.layouts :refer [side-bar-layout]] [auto-ap.views.pages.unpaid-invoices :refer [unpaid-invoices-page]] [auto-ap.views.pages.import-invoices :refer [import-invoices-page]] - [auto-ap.views.pages.paid-invoices :refer [paid-invoices-page]] [auto-ap.views.pages.needs-activation :refer [needs-activation-page]] [auto-ap.views.pages.transactions :refer [transactions-page]] [auto-ap.views.pages.ledger :refer [ledger-page]] diff --git a/src/cljs/auto_ap/views/pages/admin/vendors.cljs b/src/cljs/auto_ap/views/pages/admin/vendors.cljs index 25c7cedd..1111dd59 100644 --- a/src/cljs/auto_ap/views/pages/admin/vendors.cljs +++ b/src/cljs/auto_ap/views/pages/admin/vendors.cljs @@ -1,15 +1,17 @@ (ns auto-ap.views.pages.admin.vendors - (:require-macros [cljs.core.async.macros :refer [go]]) + (:require-macros [cljs.core.async.macros :refer [go]] + [auto-ap.entities.vendors :as vendor]) (:require [re-frame.core :as re-frame] [reagent.core :as reagent] [clojure.string :as str] [auto-ap.subs :as subs] - [auto-ap.events :as main-events] + [auto-ap.events :as events] [auto-ap.forms :as forms] - [auto-ap.events.admin.vendors :as events] + [auto-ap.utils :refer [by]] [auto-ap.entities.vendors :as entity] [auto-ap.views.components.address :refer [address-field]] - [auto-ap.views.components.vendor-dialog :refer [vendor-dialog]] + [auto-ap.views.components.vendor-dialog :refer [vendor-dialog] :as vendor-dialog] + [auto-ap.views.components.modal :refer [modal action-modal]] [auto-ap.views.components.admin.side-bar :refer [admin-side-bar]] [auto-ap.views.components.layouts :refer [side-bar-layout]] @@ -21,13 +23,98 @@ [auto-ap.routes :as routes] [bidi.bidi :as bidi])) + +(re-frame/reg-event-fx + ::new + (fn [{:keys [db]} _] + {:db (assoc-in db [:admin :vendor] + {}) + :dispatch [::events/modal-status ::admin-vendor {:visible? true}]})) + + + + + +(re-frame/reg-event-fx + ::remind + (fn [{:keys [db] :as fx} [_ id]] + { :http {:method :post + :token (:user db) + :headers {"Content-Type" "application/edn"} + :uri (str "/api/vendors/" id "/remind") + :on-success [::reminder-sent] + :on-error [::failed "Failed to send reminder"]} + :db (assoc-in db [:admin :banner] nil)})) + +(re-frame/reg-event-db + ::reminder-sent + (fn [db [_ error]] + (-> db + (assoc-in [:admin :banner] "Reminder sent!")))) + +(re-frame/reg-event-db + ::failed + (fn [db [_ error]] + (-> db + (assoc-in [:admin :banner] error)))) + +(re-frame/reg-event-fx + ::save-complete + (fn [{:keys [db]} [_ {vendor :upsert-vendor} ]] + {:dispatch [::events/modal-completed ::admin-vendor ] + :db (-> db + + (assoc-in [:admin :vendor] nil) + (assoc-in [:vendors (:id vendor)] vendor))})) + +(re-frame/reg-event-db + ::save-error + (fn [db [_ vendor]] + (println "ERROR?") + (-> db + (assoc-in [:admin :vendor :error] true) + (assoc-in [:admin :vendor :saving?] false)))) + +(re-frame/reg-event-db + ::change + (fn [db [_ path value]] + (println path value) + (assoc-in db (concat [:admin :vendor] path) + value))) + +(re-frame/reg-event-db + ::add-relationship + (fn [db [_ ]] + (-> db + (update-in [:admin :vendor :relationships] #(conj (or % []) + {:account-number (get-in db [:admin :vendor :new-relationship-account-number]) + :client-id (get-in db [:admin :vendor :new-relationship-client])})) + (update-in [:admin :vendor] dissoc :new-relationship-account-number :new-relationship-client)))) + +(re-frame/reg-event-db + ::remove-relationship + (fn [db [_ i]] + (-> db + (update-in [:admin :vendor :relationships] #(vec (concat (subvec % 0 i) (subvec % (min (count %) (inc i))))))))) + +(re-frame/reg-event-fx + ::mounted + (fn [{:keys [db]} _] + {:graphql {:token (:user db) + :query-obj {:venia/queries [[:vendor events/vendor-query]]} + :on-success [::received-vendors]}})) + +(re-frame/reg-event-db + ::received-vendors + (fn [db [_ vendors]] + (assoc db :vendors (by :id (:vendor vendors ))))) + + (defn invalid-fields [spec v] (set (mapcat :in (::s/problems (s/explain-data spec v))))) (defn vendors-table [] - (let [vendors (re-frame/subscribe [::subs/sorted-all-vendors]) - editing-vendor (:editing @(re-frame/subscribe [::subs/admin]))] - + (let [vendors (re-frame/subscribe [::subs/sorted-all-vendors])] [:table {:class "table", :style {:width "100%"}} [:thead [:tr @@ -37,7 +124,7 @@ [:th]]] [:tbody (for [v @vendors] ^{:key (str (:id v))} - [:tr {:on-click (dispatch-event [::events/edit (:id v)]) + [:tr {:on-click (dispatch-event [::vendor-dialog/started v]) :style {"cursor" "pointer"}} [:td (:name v)] [:td (:primary-email v)] @@ -61,14 +148,14 @@ ::merge-clicked (fn [{:keys [db]} _] {:db (forms/start-form db ::merge-vendors {}) - :dispatch [::main-events/modal-status ::merge-vendors {:visible? true :saving? false}]})) + :dispatch [::events/modal-status ::merge-vendors {:visible? true :saving? false}]})) (re-frame/reg-event-fx ::merge-vendors-complete (fn [{:keys [db]} _] {:db (forms/stop-form db ::merge-vendors) - :dispatch-n (list [::main-events/modal-status ::merge-vendors {:visible? false}] - [::events/mounted])})) + :dispatch-n (list [::events/modal-status ::merge-vendors {:visible? false}] + [::mounted])})) (re-frame/reg-event-fx ::merge-submit-clicked @@ -138,14 +225,15 @@ [vendors-table] [:div.is-pulled-right - [:a.button.is-primary.is-large {:on-click (dispatch-event [::main-events/modal-status :auto-ap.views.main/user-editing-vendor {:visible? true}])} "New vendor"]] + [:a.button.is-primary.is-large {:on-click (dispatch-event [::vendor-dialog/started {}])} "New vendor"]] [merge-vendors-dialog] - [vendor-dialog {:vendor editing-vendor + #_[vendor-dialog {:vendor editing-vendor :save-event [::events/save] :change-event ::events/change + :form ::admin-vendor :id ::admin-vendor}]])]) {:component-did-mount (fn [] - (re-frame/dispatch [::events/mounted]))})]) + (re-frame/dispatch [::mounted]))})]) (defn admin-vendors-page [] [side-bar-layout {:side-bar [admin-side-bar {}] diff --git a/src/cljs/auto_ap/views/pages/paid_invoices.cljs b/src/cljs/auto_ap/views/pages/paid_invoices.cljs deleted file mode 100644 index 99171099..00000000 --- a/src/cljs/auto_ap/views/pages/paid_invoices.cljs +++ /dev/null @@ -1,85 +0,0 @@ -(ns auto-ap.views.pages.paid-invoices - (:require [re-frame.core :as re-frame] - [auto-ap.entities.clients :as client] - [auto-ap.entities.vendors :as vendor] - [auto-ap.events :as events] - [auto-ap.views.utils :refer [dispatch-event]] - [auto-ap.utils :refer [by replace-if]] - [auto-ap.views.components.layouts :refer [side-bar-layout]] - [auto-ap.views.components.invoices.side-bar :refer [invoices-side-bar]] - [auto-ap.views.pages.check :as check] - [auto-ap.views.components.invoice-table :refer [invoice-table] :as invoice-table] - [auto-ap.views.components.expense-accounts-dialog :as expense-accounts-dialog] - [auto-ap.views.components.vendor-dialog :refer [vendor-dialog]] - [auto-ap.subs :as subs])) - - -(re-frame/reg-sub - ::invoice-page - (fn [db] - (-> db ::invoice-page))) - -(re-frame/reg-sub - ::params - (fn [db] - (-> db (::params {})))) - -(re-frame/reg-event-fx - ::params-change - (fn [cofx [_ params]] - {:db (-> (:db cofx) - (assoc-in [:status :loading] true) - (assoc-in [::params] params)) - :graphql {:token (-> cofx :db :user) - :query-obj (invoice-table/query (assoc params :imported true :status "paid")) - :on-success [::received]}})) - -(re-frame/reg-event-db - ::received - (fn [db [_ data]] - (-> db - (assoc ::invoice-page (first (:invoice-page data))) - (assoc-in [:status :loading] false)))) - -(re-frame/reg-event-fx - ::invalidated - (fn [cofx [_ params]] - {:dispatch [::params-change @(re-frame/subscribe [::params])]})) - -(re-frame/reg-event-fx - ::expense-accounts-updated - (fn [{:keys [db]} [_ data]] - (let [updated (:edit-expense-accounts data)] - {:dispatch [::events/modal-completed ::expense-accounts-dialog/change-expense-accounts] - :db (-> db - (update-in [::invoice-page :invoices] - - (fn [is] - - (replace-if #(= (:id %1) (:id %2)) updated is))) - (dissoc ::change-expense-accounts))}))) - -(def paid-invoices-content - (with-meta - (fn [] - (let [current-client @(re-frame/subscribe [::subs/client])] - [:div - [:h1.title "Paid invoices"] - [invoice-table {:id :paid - :params (re-frame/subscribe [::params]) - :invoice-page (re-frame/subscribe [::invoice-page]) - :status (re-frame/subscribe [::subs/status]) - :expense-event [::expense-accounts-dialog/change-expense-accounts] - :on-params-change (fn [params] - (re-frame/dispatch [::params-change params])) - :check-boxes false}] - [expense-accounts-dialog/change-expense-accounts-modal - {:updated-event [::expense-accounts-updated]}]])) - {:component-will-mount #(do (println "HERE2") (re-frame/dispatch-sync [::params-change {}])) })) - -(defn paid-invoices-page [] - [side-bar-layout {:side-bar [invoices-side-bar] - :main [paid-invoices-content] - :bottom [vendor-dialog {:vendor @(re-frame/subscribe [::subs/user-editing-vendor]) - :save-event [::events/save-vendor] - :change-event [::events/change-nested-form-state [:user-editing-vendor]] :id :auto-ap.views.main/user-editing-vendor}]}])