a bunch of cleanup to remove stuff

This commit is contained in:
2023-10-14 23:37:04 -07:00
parent f997c41abd
commit 3d9d02f76a
15 changed files with 33 additions and 801 deletions

View File

@@ -24,13 +24,10 @@
[auto-ap.views.pages.admin :refer [admin-page]]
[auto-ap.views.pages.home :refer [home-page]]
[auto-ap.views.pages.admin.clients :refer [admin-clients-page]]
[auto-ap.views.pages.admin.accounts :refer [admin-accounts-page]]
[auto-ap.views.pages.admin.rules :refer [admin-rules-page]]
[auto-ap.views.pages.admin.vendors :refer [admin-vendors-page]]
[auto-ap.views.pages.admin.excel-import :refer [admin-excel-import-page]]
[auto-ap.views.pages.admin.users :refer [admin-users-page]]
[auto-ap.views.pages.admin.import-batches :refer [import-batches-page]]
[auto-ap.views.pages.company.yodlee2 :as yodlee2]
[auto-ap.views.pages.company.other :as company-other]))
(defmulti page (fn [active-page] active-page))
@@ -109,9 +106,6 @@
(defmethod page :admin-rules [_]
(admin-rules-page))
(defmethod page :admin-users [_]
(admin-users-page))
(defmethod page :admin-vendors [_]
(admin-vendors-page))
@@ -121,15 +115,10 @@
(defmethod page :admin-jobs [_]
[jobs-page])
(defmethod page :yodlee2 [_]
(yodlee2/admin-yodlee-provider-accounts-page))
(defmethod page :company-other [_]
(company-other/company-other-page))
(defmethod page :admin-accounts [_]
(admin-accounts-page))
(defmethod page :index [_]
(home-page)
)

View File

@@ -1,85 +0,0 @@
(ns auto-ap.views.pages.admin.accounts
(:require
[auto-ap.effects.forward :as forward]
[auto-ap.forms :as forms]
[auto-ap.shared-views.admin.side-bar :refer [admin-side-bar]]
[auto-ap.views.components.buttons :as buttons]
[auto-ap.views.components.layouts
:refer [appearing-side-bar side-bar-layout]]
[auto-ap.views.pages.admin.accounts.form :as account-form]
[auto-ap.views.pages.admin.accounts.side-bar :as side-bar]
[auto-ap.views.pages.admin.accounts.table :as table]
[auto-ap.views.pages.data-page :as data-page]
[auto-ap.views.utils :refer [with-user]]
[clojure.set :as set]
[re-frame.core :as re-frame]
[reagent.core :as reagent]
[vimsical.re-frame.fx.track :as track]))
(def default-read [:numeric-code :name :location :type :account_set :applicability :invoice-allowance :vendor-allowance :id [:client-overrides [:id :name [:client [:name :id]]]]])
(re-frame/reg-event-fx
::params-change
[with-user]
(fn [{:keys [user]} [_ params]]
{:set-uri-params params
:graphql {:token user
:owns-state {:single [::data-page/page ::page]}
:query-obj {:venia/queries [{:query/data [:account_page
{:sort (:sort params)
:start (:start params 0)
:per-page (:per-page params)
:name-like (:name-like params)
:numeric-code (some-> params :numeric-code not-empty js/parseInt (#(if (js/Number.isNaN %) nil %)))}
[[:accounts default-read]
:total
:start
:end]]
:query/alias :result}]}
:on-success (fn [result]
[::data-page/received ::page
(set/rename-keys (:result result)
{:accounts :data})])}}))
(re-frame/reg-event-fx
::unmounted
(fn [_ _]
{::track/dispose {:id ::params}
::forward/dispose [{:id ::updated}]}))
(re-frame/reg-event-fx
::mounted
(fn [_ _]
{::track/register {:id ::params
:subscription [::data-page/params ::page]
:event-fn (fn [params] [::params-change params])}
::forward/register [{:id ::updated
:events #{::account-form/edited}
:event-fn (fn [[_ edited-account]]
[::data-page/updated-entity ::page (:upsert-account edited-account)])}]}))
(defn admin-accounts-content []
[:div
[:h1.title "Accounts"]
[:div.is-pulled-right
[buttons/new-button {:name "Account"
:class "is-primary"
:event [::account-form/editing
{:account-set "default"}]}]]
[table/accounts-table {:data-page ::page}]])
(defn admin-accounts-page []
(reagent/create-class
{:display-name "accounts-page"
:component-will-unmount #(re-frame/dispatch [::unmounted])
:component-did-mount #(re-frame/dispatch [::mounted])
:reagent-render
(fn []
(let [{:keys [active?]} @(re-frame/subscribe [::forms/form ::account-form/form])]
[side-bar-layout {:side-bar [admin-side-bar {}
[side-bar/accounts-side-bar {:data-page ::page}]]
:main [admin-accounts-content]
:right-side-bar [appearing-side-bar {:visible? active?} [account-form/form ]]}]))}))

View File

@@ -1,168 +0,0 @@
(ns auto-ap.views.pages.admin.accounts.form
(:require
[auto-ap.forms :as forms]
[auto-ap.forms.builder :as form-builder]
[auto-ap.schema :as schema]
[auto-ap.subs :as subs]
[auto-ap.views.components :as com]
[auto-ap.views.components.layouts :refer [side-bar]]
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
[auto-ap.views.utils :refer [dispatch-event with-user]]
[clojure.string :as str]
[malli.core :as m]
[re-frame.core :as re-frame]
[vimsical.re-frame.cofx.inject :as inject]))
(def types [:dividend :expense :asset :liability :equity :revenue])
(def applicabilities [:global :optional :customized])
(def allowances [:allowed :denied :warn :admin-only])
(re-frame/reg-sub
::request
:<- [::forms/form ::form]
(fn [{{:keys [id location type client-overrides applicability invoice-allowance vendor-allowance numeric-code name account-set]} :data}]
{:id id
:type (keyword type)
:applicability (keyword applicability)
:invoice-allowance (keyword invoice-allowance)
:vendor-allowance (keyword vendor-allowance)
:location (if (clojure.string/blank? location)
nil
location)
:numeric-code (js/parseInt numeric-code)
:name name
:account-set account-set
:client-overrides (map (fn [client-override]
{:id (:id client-override)
:client-id (:id (:client client-override))
:name (if (str/blank? (:name client-override))
nil
(:name client-override))})
client-overrides)}))
(re-frame/reg-event-db
::editing
(fn [db [_ which complete-listener]]
(-> db
(forms/start-form ::form which complete-listener))))
(re-frame/reg-event-fx
::edited
[(forms/triggers-saved ::form :upsert-account)]
(fn [_ [_ _]]))
(re-frame/reg-event-fx
::saving
[with-user (re-frame/inject-cofx ::inject/sub [::request]) ]
(fn [{:keys [user] ::keys [request]} _]
(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 :invoice-allowance :vendor-allowance [: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]]
[:invoice-allowance [:enum :allowed :denied :warn :admin-only]]
[:vendor-allowance [:enum :allowed :denied :warn :admin-only]]
[: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 {:change-event [::forms/change ::form]
:submit-event [::saving]
:id ::form
:schema account-schema}
[form-builder/section {:title (if (:id account)
"Edit account"
"Add account")}
[form-builder/field-v2 {:field :numeric-code}
"Code"
[com/number-input
{:disabled (boolean (:id account))
:auto-focus (not (boolean (:id account)))
:style {:width "9em"}}]]
[form-builder/field-v2 {:field :name}
"Name"
[:input.input {:type "text"
:auto-focus (boolean (:id account))}]]
[form-builder/field-v2 {:field :type}
"Account Type"
[com/select-field {:options (map (fn [l]
[l (str/capitalize (name l))])
types)
:allow-nil? true
:keywordize? true}]]
[form-builder/field-v2 {:field :location}
"Location"
[:input.input.known-field.location {:type "text"}]]
[form-builder/field-v2 {:field :invoice-allowance}
"Invoice Allowance"
[com/select-field {:options (map (fn [l]
[l
(str/capitalize (name l))])
allowances)
:allow-nil? true
:keywordize? true}]]
[form-builder/field-v2 {:field :vendor-allowance}
"Vendor Allowance"
[com/select-field {:options (map (fn [l]
[l
(str/capitalize (name l))])
allowances)
:allow-nil? true
:keywordize? true}]]
[form-builder/section {:title "Client"}
[:h2.subtitle "Client"]
[form-builder/field-v2 {:field :applicability}
"Applicability"
[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"
[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

@@ -1,23 +0,0 @@
(ns auto-ap.views.pages.admin.accounts.side-bar
(:require
[auto-ap.views.pages.data-page :as data-page]
[auto-ap.views.utils :refer [dispatch-value-change]]
[re-frame.core :as re-frame]))
(defn accounts-side-bar [{:keys [data-page]}]
[:div
[:p.menu-label "Name"]
[:div.field
[:div.control [:input.input {:placeholder "Food Cost"
:value @(re-frame/subscribe [::data-page/filter data-page :name-like])
:on-change (dispatch-value-change [::data-page/filter-changed data-page :name-like])} ]]]
[:p.menu-label "Code"]
[:div.field
[:div.control [:input.input {:placeholder "11000"
:value @(re-frame/subscribe [::data-page/filter data-page :numeric-code])
:on-change (dispatch-value-change [::data-page/filter-changed data-page :numeric-code])}]]]])

View File

@@ -1,36 +0,0 @@
(ns auto-ap.views.pages.admin.accounts.table
(:require
[auto-ap.views.components.buttons :as buttons]
[auto-ap.views.components.grid :as grid]
[auto-ap.views.pages.admin.accounts.form :as account-form]
[auto-ap.views.pages.data-page :as data-page]
[auto-ap.views.utils :refer [action-cell-width]]
[re-frame.core :as re-frame]))
(defn accounts-table [{:keys [data-page]}]
(let [{:keys [data]} @(re-frame/subscribe [::data-page/page data-page])]
[:div
[grid/grid {:data-page data-page
:column-count 5}
[grid/controls data]
[grid/table {:fullwidth true}
[grid/header
[grid/row {}
[grid/header-cell {} "Code"]
[grid/header-cell {} "Name"]
[grid/header-cell {} "Type"]
[grid/header-cell {} "Location"]
[grid/header-cell {:style {:width (action-cell-width 1)}}]]]
[grid/body
(for [{:keys [id numeric-code name type location] :as account} (:data data)]
^{:key id}
[grid/row {:class (:class account) :id id}
[grid/cell {} numeric-code]
[grid/cell {} name]
[grid/cell {} type]
[grid/cell {} location]
[grid/cell {}
[buttons/fa-icon {:event [::account-form/editing account [::edit-completed]]
:icon "fa-pencil"}]]])]]
[grid/bottom-paginator data]]]))

View File

@@ -1,91 +0,0 @@
(ns auto-ap.views.pages.admin.users
(:require
[auto-ap.effects.forward :as forward]
[auto-ap.status :as status]
[auto-ap.utils :refer [replace-by]]
[auto-ap.shared-views.admin.side-bar :refer [admin-side-bar]]
[auto-ap.views.components.grid :as grid]
[auto-ap.views.components.layouts :refer [side-bar-layout]]
[auto-ap.views.pages.admin.users.form :as form]
[auto-ap.views.pages.admin.users.table :as table]
[re-frame.core :as re-frame]
[reagent.core :as reagent]))
(re-frame/reg-sub
::params
:<- [::table/params]
(fn [table-params]
table-params))
(re-frame/reg-sub
::users
(fn [db]
(::users db)))
(re-frame/reg-sub
::page
:<- [::params]
:<- [::users]
(fn [[params all-users]]
(assoc (grid/virtual-paginate-controls (:start params ) (:per-page params) all-users )
:data (grid/virtual-paginate (:start params) (:per-page params) all-users))))
(re-frame/reg-event-fx
::mounted
(fn [{:keys [db]} _]
{:graphql {:token (:user db)
:owns-state {:single ::page}
:query-obj {:venia/queries [[:user
[:name
:profile_image_url
:email
:impersonate_jwt
:id
:role
[:clients [:id :name]]]]]}
:on-success [::received]}
::forward/register {:id ::edited-user
:events #{::form/saved}
:event-fn (fn [[_ query-result]]
[::saved query-result])}}))
(re-frame/reg-event-fx
::unmounted
(fn [_ _]
{::forward/dispose {:id ::edited-user}}))
(re-frame/reg-event-db
::saved
(fn [db [_ query-result]]
(-> db
(update ::users
replace-by
:id
(assoc (:edit-user query-result) :class "live-added")))))
(re-frame/reg-event-db
::received
(fn [db [_ d]]
(assoc-in db [::users] (:user d))))
(defn users-table []
[table/table {:page @(re-frame/subscribe [::page])
:status @(re-frame/subscribe [::status/single ::page])}])
(defn admin-users-content []
[:div
[:h1.title "Users"]
[users-table]])
(defn admin-users-page []
(reagent/create-class
{:component-will-unmount #(re-frame/dispatch [::unmounted])
:component-did-mount #(re-frame/dispatch [::mounted])
:reagent-render (fn []
[side-bar-layout {:side-bar [admin-side-bar {}]
:main [admin-users-content]}])}))

View File

@@ -1,105 +0,0 @@
(ns auto-ap.views.pages.admin.users.form
(:require
[auto-ap.forms :as forms]
[auto-ap.forms.builder :as form-builder]
[auto-ap.schema :as schema]
[auto-ap.status :as status]
[auto-ap.subs :as subs]
[auto-ap.views.components :as com]
[auto-ap.views.components.modal :as modal]
[auto-ap.views.utils :refer [dispatch-event with-user]]
[malli.core :as m]
[re-frame.core :as re-frame]))
(def client-schema
(m/schema [:map [:client schema/reference]]))
(def user-schema
(m/schema
[:map
[:name schema/not-empty-string]
[:role [:enum :none :user :manager :power_user :admin]]
[:clients {:optional true}
[:maybe
[:sequential client-schema]]]]))
(re-frame/reg-event-fx
::saving
[with-user (forms/in-form ::form)]
(fn [{:keys [db user]} [_]]
(if (m/validate user-schema (:data db))
{:graphql
{:token user
:owns-state {:single ::form}
:query-obj {:venia/operation {:operation/type :mutation
:operation/name "EditUser"}
:venia/queries [{:query/data [:edit-user
{:edit-user (-> (:data db)
(update :clients #(map (comp :id :client) %))
(select-keys #{:id :name :clients :role}))}
[:id :name :role [:clients [:id :name]]]]}]}
:on-success [::saved]}}
{:dispatch-n [[::forms/attempted-submit ::form]
[::status/error ::form [{:message "Please fix the errors and try again."}]]]})
))
(re-frame/reg-event-fx
::saved
(forms/triggers-stop ::form)
(fn [_ _]
{:dispatch [::modal/modal-closed]}))
(defn form []
(let [{:keys [data]} @(re-frame/subscribe [::forms/form ::form])
clients @(re-frame/subscribe [::subs/clients])]
[:<>
[form-builder/builder {:submit-event [::saving]
:id ::form
:schema user-schema}
[form-builder/field-v2 {:required? true
:field :name}
"Name"
[:input.input {:type "text"}]]
[form-builder/field-v2 {:required? true
:field :role}
"Role"
[com/select-field {:options [[:none "None"]
[:user "User"]
[:manager "Manager"]
[:power_user "Power User"]
[:admin "Admin"]]
:allow-nil? false
:keywordize? true}]]
[form-builder/field-v2 {:field :clients}
(if (= :admin (:role data))
"Client Assignments"
"Client")
[com/multi-field-v2 {:template [[form-builder/raw-field-v2 {:field :client}
[com/entity-typeahead
{:entities clients
:entity->text :name
:style {:width "13em"}}]]]
:key-fn :id
:schema [:sequential client-schema]
:new-text "Grant access to client"}]]
[form-builder/hidden-submit-button]]]))
(re-frame/reg-event-fx
::editing
(fn [{:keys [db]} [_ d]]
{:db (-> db
(forms/start-form ::form (update d :clients #(mapv (fn [x] {:client x :id (random-uuid)}) %))))
:dispatch [::modal/modal-requested {:title (str "Edit user " (:name d))
:body [form]
:cancel? false
:confirm {:value "Save"
:status-from [::status/single ::form]
:class "is-primary"
:on-click (dispatch-event [::saving])
:close-event [::status/completed ::form]}}]}))

View File

@@ -1,78 +0,0 @@
(ns auto-ap.views.pages.admin.users.table
(:require
[auto-ap.views.components.buttons :as buttons]
[auto-ap.views.components.grid :as grid]
[auto-ap.views.pages.admin.users.form :as form]
[auto-ap.views.utils
:refer [action-cell-width dispatch-event with-user]]
[clojure.string :as str]
[re-frame.core :as re-frame]))
(re-frame/reg-event-fx
::impersonated
(fn [_ [_ impersonate-jwt]]
(println "SUCCESED")
(.setItem js/localStorage "jwt" impersonate-jwt)
(.removeItem js/localStorage "last-client-id" nil)
(.removeItem js/localStorage "last-selected-clients" nil)
(.reload (.-location js/document ) true)
{}))
(re-frame/reg-event-fx
::impersonate
[with-user]
(fn [{:keys [db user]} [_ impersonate-jwt]]
{:http {:method "GET"
:uri (str "/impersonate?jwt=" impersonate-jwt)
:on-success [::impersonated impersonate-jwt]}}))
(re-frame/reg-event-fx
::params-changed
(fn [{:keys [db]} [_ p]]
{:db (assoc db ::params p)}))
(re-frame/reg-sub
::params
(fn [db]
(-> db ::params)))
(defn table [{:keys [status page]}]
(let [params @(re-frame/subscribe [::params])]
[grid/grid {:status status
:on-params-change (fn [p]
(re-frame/dispatch [::params-changed p]))
:params params
:column-count 4}
[grid/controls page]
[grid/table {:fullwidth true}
[grid/header
[grid/row {}
[grid/header-cell {} "User"]
[grid/header-cell {} "Email"]
[grid/header-cell {} "Role"]
[grid/header-cell {} "Clients"]
[grid/header-cell {:style {:width (action-cell-width 5)}}]]]
[grid/body
(for [{:keys [id name role clients] :as c} (:data page)]
^{:key (str name "-" id)}
[grid/row {:class (:class c) :id id}
[grid/cell {}
[:div.level
[:div.level-left
(when-let [url (:profile-image-url c)]
[:div.level-item
[:figure.image.is-24x24
[:img.is-rounded {:src url
:referrer-policy= "no-referrer"}]]])
[:div.level-item name]]]]
[grid/cell {} (:email c)]
[grid/cell {} role]
[grid/cell {} (str/join ", " (map :name clients))]
[grid/cell {}
[:a.button {:on-click (dispatch-event [::impersonate (:impersonate-jwt c)])}
"Impersonate"]
[buttons/fa-icon {:event [::form/editing c]
:icon "fa-pencil"}]]])]]
]))