addressed all compilation errors.
This commit is contained in:
2157
package-lock.json
generated
2157
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -7,6 +7,7 @@
|
|||||||
"test": "test"
|
"test": "test"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"downshift": "^6.1.3",
|
||||||
"dropzone": "^4.3.0",
|
"dropzone": "^4.3.0",
|
||||||
"prop-types": "^15.7.2",
|
"prop-types": "^15.7.2",
|
||||||
"react": "^17.0.1",
|
"react": "^17.0.1",
|
||||||
|
|||||||
@@ -86,7 +86,9 @@
|
|||||||
|
|
||||||
|
|
||||||
;; needed for java 11
|
;; needed for java 11
|
||||||
[javax.xml.bind/jaxb-api "2.4.0-b180830.0359"]]
|
[javax.xml.bind/jaxb-api "2.4.0-b180830.0359"]
|
||||||
|
|
||||||
|
[coderafting/memsearch "0.1.0"]]
|
||||||
:managed-dependencies [;; explicit dependencies to get to latest versions for above
|
:managed-dependencies [;; explicit dependencies to get to latest versions for above
|
||||||
[com.fasterxml.jackson.core/jackson-core "2.12.0"]
|
[com.fasterxml.jackson.core/jackson-core "2.12.0"]
|
||||||
[com.fasterxml.jackson.core/jackson-databind "2.12.0"]
|
[com.fasterxml.jackson.core/jackson-databind "2.12.0"]
|
||||||
@@ -103,7 +105,7 @@
|
|||||||
:resource-paths ["resources"]
|
:resource-paths ["resources"]
|
||||||
:aliases {"build" ["do" "clean" ["uberjar"]]
|
:aliases {"build" ["do" "clean" ["uberjar"]]
|
||||||
"fig:dev" ["run" "-m" "figwheel.main" "-b" "dev" "-r"]
|
"fig:dev" ["run" "-m" "figwheel.main" "-b" "dev" "-r"]
|
||||||
"fig:min" ["run" "-m" "figwheel.main" "-O" "advanced" "-bo" "min"]}
|
"fig:min" ["run" "-m" "figwheel.main" "-O" "whitespace" "-bo" "min"]}
|
||||||
|
|
||||||
|
|
||||||
:profiles {
|
:profiles {
|
||||||
|
|||||||
@@ -130,7 +130,6 @@
|
|||||||
(re-frame/enrich
|
(re-frame/enrich
|
||||||
(fn [db event]
|
(fn [db event]
|
||||||
(loading db form))))
|
(loading db form))))
|
||||||
|
|
||||||
(defn triggers-stop [form]
|
(defn triggers-stop [form]
|
||||||
(re-frame/enrich
|
(re-frame/enrich
|
||||||
(fn [db event]
|
(fn [db event]
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
(:require [bidi.bidi :as bidi]
|
(:require [bidi.bidi :as bidi]
|
||||||
[pushy.core :as pushy]
|
[pushy.core :as pushy]
|
||||||
[auto-ap.routes :as routes]
|
[auto-ap.routes :as routes]
|
||||||
|
[auto-ap.views.utils :as u]
|
||||||
[cemerick.url :refer [url]]
|
[cemerick.url :refer [url]]
|
||||||
[re-frame.core :as re-frame]))
|
[re-frame.core :as re-frame]))
|
||||||
|
|
||||||
@@ -11,7 +12,7 @@
|
|||||||
|
|
||||||
(defn- dispatch-route [matched-route]
|
(defn- dispatch-route [matched-route]
|
||||||
(println "Matched route" matched-route)
|
(println "Matched route" matched-route)
|
||||||
(re-frame/dispatch [:auto-ap.events/set-active-page (:handler matched-route) (auto-ap.views.utils/query-params)]))
|
(re-frame/dispatch [:auto-ap.events/set-active-page (:handler matched-route) (u/query-params)]))
|
||||||
|
|
||||||
|
|
||||||
(def history (pushy/pushy dispatch-route parse-url))
|
(def history (pushy/pushy dispatch-route parse-url))
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
[auto-ap.utils :refer [by]]
|
[auto-ap.utils :refer [by]]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
[goog.crypt.base64 :as base64]))
|
[goog.crypt.base64 :as base64]
|
||||||
|
[memsearch.core :as ms]))
|
||||||
|
|
||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
::client
|
::client
|
||||||
@@ -60,6 +61,17 @@
|
|||||||
[]
|
[]
|
||||||
accounts)))
|
accounts)))
|
||||||
|
|
||||||
|
(re-frame/reg-sub
|
||||||
|
::accounts-index
|
||||||
|
:<- [::accounts]
|
||||||
|
(fn [accounts]
|
||||||
|
(ms/text-index (map (fn [v] {:id (:id v)
|
||||||
|
:content (str (:numeric-code v) " " (:name v))})
|
||||||
|
accounts)
|
||||||
|
{:maintain-actual? true})))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
::account
|
::account
|
||||||
@@ -201,6 +213,15 @@
|
|||||||
|
|
||||||
(filter #(not (:hidden %)) all-vendors))))
|
(filter #(not (:hidden %)) all-vendors))))
|
||||||
|
|
||||||
|
(re-frame/reg-sub
|
||||||
|
::searchable-vendors-index
|
||||||
|
:<- [::searchable-vendors]
|
||||||
|
(fn [searchable-vendors]
|
||||||
|
(ms/text-index (map (fn [v] {:id (:id v)
|
||||||
|
:content (:name v)})
|
||||||
|
searchable-vendors)
|
||||||
|
{:maintain-actual? true})))
|
||||||
|
|
||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
::all-vendors
|
::all-vendors
|
||||||
(fn [db]
|
(fn [db]
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
(:require
|
(:require
|
||||||
[clojure.spec.alpha :as s]
|
[clojure.spec.alpha :as s]
|
||||||
[auto-ap.entities.invoice :as invoice]
|
[auto-ap.entities.invoice :as invoice]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead]]
|
|
||||||
[auto-ap.views.utils :refer [bind-field ->$]]
|
[auto-ap.views.utils :refer [bind-field ->$]]
|
||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[re-frame.core :as re-frame]))
|
[re-frame.core :as re-frame]))
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
(:require
|
(:require
|
||||||
[clojure.spec.alpha :as s]
|
[clojure.spec.alpha :as s]
|
||||||
[auto-ap.entities.invoice :as invoice]
|
[auto-ap.entities.invoice :as invoice]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead]]
|
|
||||||
[auto-ap.views.utils :refer [bind-field date-picker date->str local-now standard]]
|
[auto-ap.views.utils :refer [bind-field date-picker date->str local-now standard]]
|
||||||
[cljs-time.core :as t]
|
[cljs-time.core :as t]
|
||||||
[re-frame.core :as re-frame]))
|
[re-frame.core :as re-frame]))
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.utils :refer [by]]
|
[auto-ap.utils :refer [by]]
|
||||||
[auto-ap.views.components.modal :as modal]
|
[auto-ap.views.components.modal :as modal]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.pages.invoices.common :refer [invoice-read]]
|
[auto-ap.views.pages.invoices.common :refer [invoice-read]]
|
||||||
[auto-ap.views.utils :refer [dispatch-event with-user]]
|
[auto-ap.views.utils :refer [dispatch-event with-user]]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
@@ -124,10 +124,10 @@
|
|||||||
[:tr
|
[:tr
|
||||||
[:td.expandable [:div.control
|
[:td.expandable [:div.control
|
||||||
(raw-field
|
(raw-field
|
||||||
[typeahead-entity {:matches chooseable-expense-accounts
|
[typeahead-v3 {:entities chooseable-expense-accounts
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:match->text (fn [x] (str (:numeric-code x) " - " (:name x)))
|
:entity->text (fn [x] (str (:numeric-code x) " - " (:name x)))
|
||||||
:field [:expense-accounts id :account]}])]]
|
:field [:expense-accounts id :account]}])]]
|
||||||
|
|
||||||
(when multi-location?
|
(when multi-location?
|
||||||
[:td
|
[:td
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
(ns auto-ap.views.components.expense-accounts-field
|
(ns auto-ap.views.components.expense-accounts-field
|
||||||
(:require [auto-ap.forms :as forms]
|
(:require [auto-ap.forms :as forms]
|
||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.components.money-field :refer [money-field]]
|
[auto-ap.views.components.money-field :refer [money-field]]
|
||||||
[auto-ap.views.utils :refer [bind-field dispatch-event ->$]]
|
[auto-ap.views.utils :refer [bind-field dispatch-event ->$]]
|
||||||
[goog.string :as gstring]
|
[goog.string :as gstring]
|
||||||
@@ -162,14 +162,14 @@
|
|||||||
[:div.control.is-fullwidth
|
[:div.control.is-fullwidth
|
||||||
[bind-field
|
[bind-field
|
||||||
^{:key (:id client)}
|
^{:key (:id client)}
|
||||||
[typeahead-entity {:matches chooseable-expense-accounts
|
[typeahead-v3 {:entities chooseable-expense-accounts
|
||||||
:match->text (fn [x ]
|
:entity->text (fn [x ]
|
||||||
(str (:numeric-code x) " - " (:name x)))
|
(str (:numeric-code x) " - " (:name x)))
|
||||||
:disabled disabled
|
:disabled disabled
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:field [index :account]
|
:field [index :account]
|
||||||
:event [::expense-account-changed event expense-accounts max-value]
|
:event [::expense-account-changed event expense-accounts max-value]
|
||||||
:subscription expense-accounts}]]]]
|
:subscription expense-accounts}]]]]
|
||||||
[:div.column.is-narrow
|
[:div.column.is-narrow
|
||||||
[:p.help "Location"]
|
[:p.help "Location"]
|
||||||
[:div.control
|
[:div.control
|
||||||
|
|||||||
@@ -96,8 +96,8 @@
|
|||||||
extended-last-page-button
|
extended-last-page-button
|
||||||
[:span.mx-4 (Math/min (inc start) total) "-" end "/" total]
|
[:span.mx-4 (Math/min (inc start) total) "-" end "/" total]
|
||||||
[:div.select
|
[:div.select
|
||||||
[:select {:value per-page :on-change (fn [e] (on-change {:start 0
|
[:select {:value per-page :on-change (fn [^js/Event e] (on-change {:start 0
|
||||||
:per-page (js/parseInt (.. e -target -value ))}))}
|
:per-page (js/parseInt (.-value ^js/HTMLOptionElement (.-target e )))}))}
|
||||||
[:option {:value 20 } "20 per page" ]
|
[:option {:value 20 } "20 per page" ]
|
||||||
[:option {:value 50} "50 per page" ]
|
[:option {:value 50} "50 per page" ]
|
||||||
[:option {:value 100} "100 per page" ]
|
[:option {:value 100} "100 per page" ]
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
||||||
[auto-ap.views.components.number-filter :refer [number-filter]]
|
[auto-ap.views.components.number-filter :refer [number-filter]]
|
||||||
[auto-ap.views.components.switch-field :refer [switch-field]]
|
[auto-ap.views.components.switch-field :refer [switch-field]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.pages.data-page :as data-page]
|
[auto-ap.views.pages.data-page :as data-page]
|
||||||
[auto-ap.views.utils :refer [active-when dispatch-event dispatch-value-change]]
|
[auto-ap.views.utils :refer [active-when dispatch-event dispatch-value-change]]
|
||||||
[bidi.bidi :as bidi]
|
[bidi.bidi :as bidi]
|
||||||
@@ -59,12 +59,12 @@
|
|||||||
[:div
|
[:div
|
||||||
[:p.menu-label "Vendor"]
|
[:p.menu-label "Vendor"]
|
||||||
[:div
|
[:div
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/searchable-vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor %])
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:match->text :name
|
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor (some-> % (select-keys [:name :id]))])
|
||||||
:type "typeahead-entity"
|
:entity->text :name
|
||||||
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])
|
:type "typeahead-v3"
|
||||||
:include-keys [:name :id]}]]
|
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]]
|
||||||
[:p.menu-label "Date Range"]
|
[:p.menu-label "Date Range"]
|
||||||
[:div
|
[:div
|
||||||
[date-range-filter
|
[date-range-filter
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
(:require
|
(:require
|
||||||
[clojure.spec.alpha :as s]
|
[clojure.spec.alpha :as s]
|
||||||
[auto-ap.entities.invoice :as invoice]
|
[auto-ap.entities.invoice :as invoice]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead]]
|
|
||||||
[auto-ap.views.utils :refer [bind-field date-picker date->str local-now standard]]
|
[auto-ap.views.utils :refer [bind-field date-picker date->str local-now standard]]
|
||||||
[cljs-time.core :as t]
|
[cljs-time.core :as t]
|
||||||
[re-frame.core :as re-frame]))
|
[re-frame.core :as re-frame]))
|
||||||
|
|||||||
@@ -3,238 +3,93 @@
|
|||||||
[reagent.ratom :as ra]
|
[reagent.ratom :as ra]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
[clojure.set :as set]
|
[clojure.set :as set]
|
||||||
#_[memsearch.core :as ms]
|
[memsearch.core :as ms]
|
||||||
[downshift :as ds :refer [useCombobox]]
|
[downshift :as ds :refer [useCombobox]]
|
||||||
[react]))
|
[react]))
|
||||||
|
(set! *warn-on-infer* true)
|
||||||
|
|
||||||
|
;; TODO: This avoids the use of inferred externs by using aget. You could just use the ^js tag though
|
||||||
|
(defn state-reducer [state actions-and-changes]
|
||||||
|
(cond
|
||||||
|
(= (aget actions-and-changes "type") (aget (aget useCombobox "stateChangeTypes" ) "InputChange"))
|
||||||
|
(doto (aget actions-and-changes "changes") (aset "selectedItem" nil))
|
||||||
|
|
||||||
|
(and (= (aget actions-and-changes "type") (aget (aget useCombobox "stateChangeTypes") "InputBlur"))
|
||||||
|
(not (aget state "selectedItem")))
|
||||||
|
(doto (aget actions-and-changes "changes" ) (aset "inputValue" nil))
|
||||||
|
|
||||||
(defn get-valid-matches [matches not-found-description not-found-value text]
|
:else
|
||||||
(let [valid-matches (take 15 (for [[[id t :as match] i] (map vector matches (range))
|
(aget actions-and-changes "changes")))
|
||||||
:when (str/includes? (or (some-> t .toLowerCase) "") (or (some-> text .toLowerCase) ""))]
|
|
||||||
match))
|
|
||||||
valid-matches (if (and not-found-description text)
|
|
||||||
(concat valid-matches [[:not-found (not-found-description text) (not-found-value text)]])
|
|
||||||
valid-matches)]
|
|
||||||
valid-matches))
|
|
||||||
|
|
||||||
(defn typeahead [{:keys [matches on-change field text-field value class not-found-description
|
(defn typeahead-v3-internal [{:keys [class style disabled entities entity->text entities-by-id entity-index on-change disabled value name auto-focus] :or {disabled false} :as i}]
|
||||||
disabled not-found-value auto-focus]}]
|
(let [[items set-items] (react/useState (map clj->js entities))
|
||||||
(let [text (r/atom (or (second (first (filter #(= (first %) value) matches))) ""))
|
[getLabelProps getMenuProps getComboboxProps getToggleButtonProps getInputProps getItemProps isOpen highlightedIndex selectItem selectedItem setInputValue]
|
||||||
highlighted (r/atom nil)
|
(as-> (useCombobox (clj->js {:items items
|
||||||
selected (r/atom (first (first (filter #(= (first %) value) matches))))
|
:defaultHighlightedIndex 0
|
||||||
]
|
:defaultSelectedItem value
|
||||||
(r/create-class
|
:onInputValueChange (fn [input]
|
||||||
{:reagent-render (fn [{:keys [matches on-change disabled field text-field value class not-found-description]}]
|
(if entities-by-id
|
||||||
(let [ select (fn [[id text-description text-value]]
|
(->> (ms/text-search (aget input "inputValue") entity-index)
|
||||||
(reset! selected id)
|
(sort-by (fn [[k v]]
|
||||||
(reset! text text-description)
|
(- (:score v))))
|
||||||
(when on-change
|
(map (fn [[x]]
|
||||||
(if (= :not-found id)
|
(entities-by-id x)
|
||||||
(on-change nil text-description text-value)
|
))
|
||||||
(on-change id text-description (or text-value text-description)))))
|
(take 5)
|
||||||
text @text
|
clj->js
|
||||||
valid-matches (get-valid-matches matches not-found-description not-found-value text)]
|
set-items)
|
||||||
[:div.typeahead
|
|
||||||
(if disabled
|
|
||||||
|
|
||||||
^{:key (str "typeahead" text) } [:input.input {:disabled "disabled" :value text} ]
|
(set-items (map clj->js (take 5 (filter (fn [x] (str/includes? (or (some-> (entity->text x) str/lower-case) "")
|
||||||
|
(or (some-> (aget input "inputValue") str/lower-case) "")))
|
||||||
(if @selected
|
entities))))))
|
||||||
^{:key "typeahead"} [:div.input {:class class
|
:stateReducer state-reducer
|
||||||
:tab-index "0"
|
:onSelectedItemChange (fn [z]
|
||||||
:on-key-up (fn [e]
|
(when on-change
|
||||||
(if (= 8 (.-keyCode e))
|
(on-change (js->clj (aget z "selectedItem") :keywordize-keys true))))})) $
|
||||||
(do
|
(map #(aget $ %) ["getLabelProps" "getMenuProps" "getComboboxProps" "getToggleButtonProps" "getInputProps" "getItemProps" "isOpen" "highlightedIndex" "selectItem" "selectedItem" "setInputValue"]))]
|
||||||
(select [nil "" nil])
|
[:<>
|
||||||
true)
|
[:div.typeahead (assoc (js->clj (getComboboxProps))
|
||||||
false))}
|
:style style)
|
||||||
[:div.control
|
(if selectedItem
|
||||||
[:div.tags.has-addons
|
^{:key "typeahead"} [:div.input (assoc (js->clj (getInputProps #js {:disabled (if disabled
|
||||||
[:span.tag text]
|
"disabled"
|
||||||
[:a.tag.is-delete {:on-click (fn []
|
"")}))
|
||||||
(select [nil "" nil]))}]]]]
|
:on-key-up (fn [e]
|
||||||
^{:key "typeahead"}
|
(when (= 8 (aget e "keyCode" ))
|
||||||
[:input.input {:type "text"
|
(selectItem nil)
|
||||||
:class class
|
(setInputValue nil)
|
||||||
|
(when on-change
|
||||||
:value text
|
(on-change nil))))
|
||||||
:auto-focus auto-focus
|
:class class
|
||||||
:on-blur (fn [e]
|
:tab-index "0")
|
||||||
(cond @selected
|
[:div.control
|
||||||
nil
|
[:div.tags.has-addons
|
||||||
|
[:span.tag (entity->text (js->clj selectedItem :keywordize-keys true))]
|
||||||
(#{"" nil} text)
|
(when name
|
||||||
nil
|
[:input {:type "hidden" :name name :value (:id (js->clj selectedItem :keywordize-keys true))}])
|
||||||
|
(when-not disabled
|
||||||
@highlighted
|
[:a.tag.is-delete {:on-click (fn []
|
||||||
(do (select @highlighted)
|
(setInputValue nil)
|
||||||
true)
|
(selectItem nil)
|
||||||
|
(when on-change
|
||||||
:else
|
(on-change nil)))}])]]]
|
||||||
(do (select [nil ""])
|
^{:key "typeahead"} [:input.input (js->clj
|
||||||
true)))
|
(getInputProps #js {:disabled (if disabled
|
||||||
:on-key-down (fn [e]
|
"disabled"
|
||||||
(condp = (.-keyCode e)
|
"")
|
||||||
; up
|
:autoFocus (if auto-focus
|
||||||
38 (do
|
"autoFocus"
|
||||||
(when-let [new-match (->> valid-matches
|
"")}))])
|
||||||
(take-while #(not= % @highlighted))
|
[:div {:class (if (and isOpen (seq items)) "typeahead-menu")}
|
||||||
(last))]
|
[:ul (js->clj (getMenuProps))
|
||||||
(reset! highlighted new-match))
|
(if (and isOpen (seq items))
|
||||||
true)
|
(for [[index item] (map vector (range) (js->clj items :keywordize-keys true))]
|
||||||
;; dwon
|
^{:key item}
|
||||||
40 (do
|
[:li.typeahead-suggestion (assoc (js->clj (getItemProps #js {:item item :index index}))
|
||||||
(when-let [new-match (->> valid-matches
|
:class (if (= index highlightedIndex)
|
||||||
(drop-while #(not= % @highlighted))
|
"typeahead-highlighted"))
|
||||||
(drop 1)
|
(entity->text item)]))]]]]))
|
||||||
(first))]
|
|
||||||
(reset! highlighted new-match))
|
|
||||||
true)
|
|
||||||
13 (do (.preventDefault e)
|
|
||||||
(when @highlighted
|
|
||||||
|
|
||||||
(select @highlighted)
|
|
||||||
false))
|
|
||||||
true))
|
|
||||||
:on-change (fn [e]
|
|
||||||
(let [new-matches (get-valid-matches matches not-found-description not-found-value (.. e -target -value))]
|
|
||||||
(reset! highlighted (first new-matches)))
|
|
||||||
(select [nil (.. e -target -value)]))}]))
|
|
||||||
|
|
||||||
(cond
|
|
||||||
(and (seq text)
|
|
||||||
(not @selected)
|
|
||||||
(seq valid-matches))
|
|
||||||
(let [[h] @highlighted]
|
|
||||||
[:div.typeahead-menu
|
|
||||||
[:ul
|
|
||||||
(for [[id t :as match] valid-matches]
|
|
||||||
^{:key id} [:li.typeahead-suggestion {:class (if (= id h)
|
|
||||||
"typeahead-highlighted")
|
|
||||||
:on-mouse-down #(do (select match))} t])]])
|
|
||||||
|
|
||||||
:else
|
|
||||||
nil)]))})))
|
|
||||||
|
|
||||||
(defn get-valid-entity-matches [matches not-found-description not-found-value text match->text]
|
|
||||||
(let [valid-matches (->> (for [[match i] (map vector matches (range))
|
|
||||||
:let [t (match->text match)
|
|
||||||
match-index (str/index-of (or (some-> t .toLowerCase) "") (or (some-> text .toLowerCase) ""))]
|
|
||||||
:when match-index]
|
|
||||||
[match match-index ])
|
|
||||||
(sort-by second)
|
|
||||||
(map first)
|
|
||||||
(take 10))
|
|
||||||
valid-matches (if (and not-found-description text)
|
|
||||||
(concat valid-matches [[:not-found (not-found-description text) (not-found-value text)]])
|
|
||||||
valid-matches)]
|
|
||||||
valid-matches))
|
|
||||||
(defn typeahead-entity [{:keys [matches on-change field value class not-found-description
|
|
||||||
disabled not-found-value auto-focus name include-keys]}]
|
|
||||||
(let [text (r/atom (or (second (first (filter #(= (first %) value) matches))) ""))
|
|
||||||
highlighted (r/atom nil)
|
|
||||||
]
|
|
||||||
(r/create-class
|
|
||||||
{:reagent-render (fn [{:keys [matches on-change disabled match->text field value class not-found-description include-keys style]}]
|
|
||||||
(let [select (fn [entity]
|
|
||||||
(when on-change
|
|
||||||
(if (= :not-found entity)
|
|
||||||
(on-change nil)
|
|
||||||
(on-change (cond-> entity
|
|
||||||
(and include-keys entity) (select-keys include-keys))))))
|
|
||||||
text-atom text
|
|
||||||
text (or (when value (match->text value)) @text)
|
|
||||||
valid-matches (get-valid-entity-matches matches not-found-description not-found-value text match->text)]
|
|
||||||
|
|
||||||
[:div.typeahead {:style style}
|
|
||||||
(if disabled
|
|
||||||
|
|
||||||
^{:key (str "typeahead" text) } [:input.input {:disabled "disabled" :value text} ]
|
|
||||||
|
|
||||||
(if value
|
|
||||||
^{:key "typeahead"} [:div.input {:class class
|
|
||||||
:tab-index "0"
|
|
||||||
:on-key-up (fn [e]
|
|
||||||
(if (= 8 (.-keyCode e))
|
|
||||||
(do
|
|
||||||
(select nil)
|
|
||||||
(reset! text-atom nil)
|
|
||||||
true)
|
|
||||||
false))}
|
|
||||||
[:div.control
|
|
||||||
[:div.tags.has-addons
|
|
||||||
[:span.tag text]
|
|
||||||
(when name
|
|
||||||
[:input {:type "hidden" :name name :value (:id @highlighted)}])
|
|
||||||
[:a.tag.is-delete {:on-click (fn []
|
|
||||||
(select nil)
|
|
||||||
(reset! text-atom nil)
|
|
||||||
(reset! highlighted nil))}]]]]
|
|
||||||
^{:key "typeahead"} [:input.input {:type "text"
|
|
||||||
:class class
|
|
||||||
|
|
||||||
:value text
|
|
||||||
:auto-focus auto-focus
|
|
||||||
:on-blur (fn [e]
|
|
||||||
(cond value
|
|
||||||
nil
|
|
||||||
|
|
||||||
(#{"" nil} text)
|
|
||||||
nil
|
|
||||||
|
|
||||||
@highlighted
|
|
||||||
(do (select @highlighted)
|
|
||||||
|
|
||||||
true)
|
|
||||||
|
|
||||||
:else
|
|
||||||
(do (select nil)
|
|
||||||
(reset! highlighted nil)
|
|
||||||
(reset! text-atom nil)
|
|
||||||
true)))
|
|
||||||
:on-key-down (fn [e]
|
|
||||||
(condp = (.-keyCode e)
|
|
||||||
; up
|
|
||||||
38 (do
|
|
||||||
(when-let [new-match (->> valid-matches
|
|
||||||
(take-while #(not= % @highlighted))
|
|
||||||
(last))]
|
|
||||||
(reset! highlighted new-match))
|
|
||||||
true)
|
|
||||||
;; dwon
|
|
||||||
40 (do
|
|
||||||
(when-let [new-match (->> valid-matches
|
|
||||||
(drop-while #(not= % @highlighted))
|
|
||||||
(drop 1)
|
|
||||||
(first))]
|
|
||||||
(reset! highlighted new-match))
|
|
||||||
true)
|
|
||||||
13 (do (.preventDefault e)
|
|
||||||
(when @highlighted
|
|
||||||
|
|
||||||
(select @highlighted)
|
|
||||||
false))
|
|
||||||
true))
|
|
||||||
:on-change (fn [e]
|
|
||||||
(let [new-matches (get-valid-entity-matches matches not-found-description not-found-value (.. e -target -value) match->text)]
|
|
||||||
(reset! highlighted (first new-matches)))
|
|
||||||
(reset! text-atom (.. e -target -value)))}]))
|
|
||||||
|
|
||||||
(cond
|
|
||||||
(and (seq text)
|
|
||||||
(not value)
|
|
||||||
(seq valid-matches))
|
|
||||||
(let [h @highlighted]
|
|
||||||
[:div.typeahead-menu
|
|
||||||
[:ul
|
|
||||||
(for [entity valid-matches]
|
|
||||||
(let [t (match->text entity)]
|
|
||||||
^{:key entity} [:li.typeahead-suggestion {:class (if (= entity h)
|
|
||||||
"typeahead-highlighted")
|
|
||||||
:on-mouse-over (fn [] (reset! highlighted entity))
|
|
||||||
:on-mouse-down #(do (select entity))} t]))]])
|
|
||||||
|
|
||||||
:else
|
|
||||||
nil)]))})))
|
|
||||||
|
|
||||||
|
(defn typeahead-v3 [{:keys [class disabled entities entity->text entities-by-id entity-index on-change value ] :as props}]
|
||||||
|
[:div
|
||||||
|
[:f> typeahead-v3-internal props]])
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
[auto-ap.views.utils :refer [dispatch-event horizontal-field bind-field with-user with-is-admin? active-when account->match-text]]
|
[auto-ap.views.utils :refer [dispatch-event horizontal-field bind-field with-user with-is-admin? active-when account->match-text]]
|
||||||
[auto-ap.views.components.address :refer [address-field]]
|
[auto-ap.views.components.address :refer [address-field]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.components.dropdown :refer [drop-down drop-down-contents]]
|
[auto-ap.views.components.dropdown :refer [drop-down drop-down-contents]]
|
||||||
[auto-ap.events :as events]
|
[auto-ap.events :as events]
|
||||||
[clj-fuzzy.metrics :refer [jaccard jaro-winkler]]
|
[clj-fuzzy.metrics :refer [jaccard jaro-winkler]]
|
||||||
@@ -154,12 +154,12 @@
|
|||||||
[:div.columns
|
[:div.columns
|
||||||
[:div.column
|
[:div.column
|
||||||
[bind-field
|
[bind-field
|
||||||
[typeahead-entity {:matches clients
|
[typeahead-v3 {:entities clients
|
||||||
:match->text :name
|
:entity->text :name
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:field [override-key i]
|
:field [override-key i]
|
||||||
:event change-event
|
:event change-event
|
||||||
:subscription data}]]]
|
:subscription data}]]]
|
||||||
|
|
||||||
[:div.column.is-1
|
[:div.column.is-1
|
||||||
[:a.button {:on-click (dispatch-event [::removed-override override-key i])} [:span.icon [:span.icon-remove]]]]]))])))
|
[:a.button {:on-click (dispatch-event [::removed-override override-key i])} [:span.icon [:span.icon-remove]]]]]))])))
|
||||||
@@ -186,12 +186,12 @@
|
|||||||
[:div.columns
|
[:div.columns
|
||||||
[:div.column
|
[:div.column
|
||||||
[bind-field
|
[bind-field
|
||||||
[typeahead-entity {:matches clients
|
[typeahead-v3 {:entities clients
|
||||||
:match->text :name
|
:entity->text :name
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:field [override-key i :client]
|
:field [override-key i :client]
|
||||||
:event change-event
|
:event change-event
|
||||||
:subscription data}]]]
|
:subscription data}]]]
|
||||||
[:div.column
|
[:div.column
|
||||||
[bind-field
|
[bind-field
|
||||||
(template
|
(template
|
||||||
@@ -215,12 +215,12 @@
|
|||||||
[:div.columns
|
[:div.columns
|
||||||
[:div.column
|
[:div.column
|
||||||
[bind-field
|
[bind-field
|
||||||
[typeahead-entity {:matches clients
|
[typeahead-v3 {:entities clients
|
||||||
:match->text :name
|
:entity->text :name
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:field [override-key i :client]
|
:field [override-key i :client]
|
||||||
:event change-event
|
:event change-event
|
||||||
:subscription data}]]]
|
:subscription data}]]]
|
||||||
[:div.column
|
[:div.column
|
||||||
[bind-field
|
[bind-field
|
||||||
(template
|
(template
|
||||||
@@ -306,12 +306,12 @@
|
|||||||
:override-key :account-overrides}
|
:override-key :account-overrides}
|
||||||
(fn [field client]
|
(fn [field client]
|
||||||
|
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/accounts client])
|
[typeahead-v3 {:entities @(re-frame/subscribe [::subs/accounts client])
|
||||||
:match->text account->match-text
|
:entity->text account->match-text
|
||||||
:field field
|
:field field
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:event change-event
|
:event change-event
|
||||||
:subscription data}])]
|
:subscription data}])]
|
||||||
|
|
||||||
[:h2.subtitle "Address"]
|
[:h2.subtitle "Address"]
|
||||||
[address-field {:field [:address]
|
[address-field {:field [:address]
|
||||||
|
|||||||
@@ -2,18 +2,6 @@
|
|||||||
(:require
|
(:require
|
||||||
[clojure.spec.alpha :as s]
|
[clojure.spec.alpha :as s]
|
||||||
[auto-ap.entities.invoice :as invoice]
|
[auto-ap.entities.invoice :as invoice]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead]]
|
|
||||||
[auto-ap.views.utils :refer [bind-field]]))
|
[auto-ap.views.utils :refer [bind-field]]))
|
||||||
|
|
||||||
(defn vendor-filter [{:keys [value on-change-event vendors]}]
|
|
||||||
[:div.field
|
|
||||||
[:div.control
|
|
||||||
[bind-field
|
|
||||||
[typeahead {:matches (map (fn [x] [(:id x) (:name x)]) vendors)
|
|
||||||
:type "typeahead"
|
|
||||||
:auto-focus true
|
|
||||||
:field [:vendor-id]
|
|
||||||
:text-field [:vendor-name]
|
|
||||||
:event on-change-event
|
|
||||||
:spec (s/nilable ::invoice/vendor-id)
|
|
||||||
:subscription value}]]]])
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
[auto-ap.forms :as forms]
|
[auto-ap.forms :as forms]
|
||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.views.components.layouts :refer [side-bar]]
|
[auto-ap.views.components.layouts :refer [side-bar]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.utils :refer [dispatch-event multi-field]]
|
[auto-ap.views.utils :refer [dispatch-event multi-field]]
|
||||||
[clojure.spec.alpha :as s]
|
[clojure.spec.alpha :as s]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
@@ -138,11 +138,11 @@
|
|||||||
(field "Customizations"
|
(field "Customizations"
|
||||||
[multi-field {:type "multi-field"
|
[multi-field {:type "multi-field"
|
||||||
:field [:client-overrides]
|
:field [:client-overrides]
|
||||||
:template [[typeahead-entity {:matches @(re-frame/subscribe [::subs/clients])
|
:template [[typeahead-v3 {:entities @(re-frame/subscribe [::subs/clients])
|
||||||
:style {:width "20em"}
|
:style {:width "20em"}
|
||||||
:match->text :name
|
:entity->text :name
|
||||||
:type "typeahead"
|
:type "typeahead-v3"
|
||||||
:field [:client]}]
|
:field [:client]}]
|
||||||
[:input.input {:type "text"
|
[:input.input {:type "text"
|
||||||
:style {:width "20em"}
|
:style {:width "20em"}
|
||||||
:placeholder "Bubblegum"
|
:placeholder "Bubblegum"
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
(:require
|
(:require
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.views.utils :refer [active-when dispatch-value-change]]
|
[auto-ap.views.utils :refer [active-when dispatch-value-change]]))
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]))
|
|
||||||
|
|
||||||
|
|
||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.events :as events]
|
[auto-ap.events :as events]
|
||||||
[auto-ap.views.components.address :refer [address-field]]
|
[auto-ap.views.components.address :refer [address-field]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.components.layouts :refer [side-bar]]
|
[auto-ap.views.components.layouts :refer [side-bar]]
|
||||||
[auto-ap.views.utils
|
[auto-ap.views.utils
|
||||||
:refer
|
:refer
|
||||||
@@ -377,10 +377,10 @@
|
|||||||
:type "text"
|
:type "text"
|
||||||
:field [:bank-accounts sort-order :yodlee-account-id]}]]
|
:field [:bank-accounts sort-order :yodlee-account-id]}]]
|
||||||
[field "Yodlee Account (new)"
|
[field "Yodlee Account (new)"
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::yodlee-accounts (:id new-client)])
|
[typeahead-v3 {:entities @(re-frame/subscribe [::yodlee-accounts (:id new-client)])
|
||||||
:match->text (fn [m] (str (:name m) " - " (:number m)))
|
:entity->text (fn [m] (str (:name m) " - " (:number m)))
|
||||||
:type "typeahead"
|
:type "typeahead-v3"
|
||||||
:field [:bank-accounts sort-order :yodlee-account]}]]])
|
:field [:bank-accounts sort-order :yodlee-account]}]]])
|
||||||
(when (#{:credit ":credit"} type )
|
(when (#{:credit ":credit"} type )
|
||||||
[:div
|
[:div
|
||||||
|
|
||||||
@@ -405,10 +405,10 @@
|
|||||||
:type "text"
|
:type "text"
|
||||||
:field [:bank-accounts sort-order :yodlee-account-id]}]]
|
:field [:bank-accounts sort-order :yodlee-account-id]}]]
|
||||||
[field "Yodlee Account (new)"
|
[field "Yodlee Account (new)"
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::yodlee-accounts (:id new-client)])
|
[typeahead-v3 {:entities @(re-frame/subscribe [::yodlee-accounts (:id new-client)])
|
||||||
:match->text (fn [m] (str (:name m) " - " (:number m)))
|
:entity->text (fn [m] (str (:name m) " - " (:number m)))
|
||||||
:type "typeahead"
|
:type "typeahead-v3"
|
||||||
:field [:bank-accounts sort-order :yodlee-account]}]]])
|
:field [:bank-accounts sort-order :yodlee-account]}]]])
|
||||||
[:div.field
|
[:div.field
|
||||||
[:label.label "Locations"]
|
[:label.label "Locations"]
|
||||||
[:div.control
|
[:div.control
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.views.components.admin.side-bar :refer [admin-side-bar]]
|
[auto-ap.views.components.admin.side-bar :refer [admin-side-bar]]
|
||||||
[auto-ap.views.components.layouts :refer [side-bar-layout]]
|
[auto-ap.views.components.layouts :refer [side-bar-layout]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.utils :refer [bind-field dispatch-event]]
|
[auto-ap.views.utils :refer [bind-field dispatch-event]]
|
||||||
[re-frame.core :as re-frame]))
|
[re-frame.core :as re-frame]))
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
|
|
||||||
:venia/queries (map (fn [v ]
|
:venia/queries (map (fn [v ]
|
||||||
{:query/data [:upsert-vendor
|
{:query/data [:upsert-vendor
|
||||||
{:vendor {:name v :default-account-id (-> db ::expense-accounts (get v) :default-account-id)}}
|
{:vendor {:name v :default-account-id (-> db ::expense-accounts (get v) :default-account-id :id)}}
|
||||||
[:id :name]]})
|
[:id :name]]})
|
||||||
|
|
||||||
(get-in db [::excel-import :create-vendors]))}
|
(get-in db [::excel-import :create-vendors]))}
|
||||||
@@ -138,11 +138,12 @@
|
|||||||
|
|
||||||
[:p.control
|
[:p.control
|
||||||
[bind-field
|
[bind-field
|
||||||
[typeahead {:matches (map (fn [x] [(:id x) (:name x)]) chooseable-expense-accounts)
|
[typeahead-v3 {:entities chooseable-expense-accounts
|
||||||
:type "typeahead"
|
:entity->text (fn [x ] (str (:numeric-code x) " - " (:name x)))
|
||||||
:field [v :default-account-id]
|
:type "typeahead-v3"
|
||||||
:event change-event
|
:field [v :default-account-id]
|
||||||
:subscription data}]]]])])]
|
:event change-event
|
||||||
|
:subscription data}]]]])])]
|
||||||
[:div
|
[:div
|
||||||
[:button.button.is-pulled-right
|
[:button.button.is-pulled-right
|
||||||
{:on-click (dispatch-event [::create-vendors])
|
{:on-click (dispatch-event [::create-vendors])
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
[auto-ap.views.components.dropdown :refer [drop-down]]
|
[auto-ap.views.components.dropdown :refer [drop-down]]
|
||||||
[auto-ap.views.components.expense-accounts-field :as expense-accounts-field :refer [expense-accounts-field recalculate-amounts]]
|
[auto-ap.views.components.expense-accounts-field :as expense-accounts-field :refer [expense-accounts-field recalculate-amounts]]
|
||||||
[auto-ap.views.components.layouts :as layouts]
|
[auto-ap.views.components.layouts :as layouts]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.pages.admin.rules.common :refer [default-read]]
|
[auto-ap.views.pages.admin.rules.common :refer [default-read]]
|
||||||
[auto-ap.views.pages.admin.rules.results-modal :as results-modal]
|
[auto-ap.views.pages.admin.rules.results-modal :as results-modal]
|
||||||
[auto-ap.views.utils :refer [date->str date-picker dispatch-event standard with-user]]
|
[auto-ap.views.utils :refer [date->str date-picker dispatch-event standard with-user]]
|
||||||
@@ -180,7 +180,8 @@
|
|||||||
[[:accounts] (expense-accounts-field/default-account (:accounts data)
|
[[:accounts] (expense-accounts-field/default-account (:accounts data)
|
||||||
@(re-frame/subscribe [::subs/vendor-default-account (:vendor data) value])
|
@(re-frame/subscribe [::subs/vendor-default-account (:vendor data) value])
|
||||||
(:total data)
|
(:total data)
|
||||||
[])]
|
[])
|
||||||
|
[:bank-account] nil]
|
||||||
|
|
||||||
:else
|
:else
|
||||||
[]))))
|
[]))))
|
||||||
@@ -245,25 +246,29 @@
|
|||||||
|
|
||||||
|
|
||||||
(field "Client"
|
(field "Client"
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/clients])
|
[typeahead-v3 {:entities @(re-frame/subscribe [::subs/clients])
|
||||||
:auto-focus true
|
:auto-focus true
|
||||||
:match->text :name
|
:entity->text :name
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:field [:client]
|
:field [:client]
|
||||||
:spec ::entity/client}])
|
:spec ::entity/client}])
|
||||||
|
|
||||||
(field "Bank account"
|
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/real-bank-accounts-for-client (:client data)])
|
(with-meta
|
||||||
:match->text :name
|
(field "Bank account"
|
||||||
:type "typeahead-entity"
|
[typeahead-v3 {:entities @(re-frame/subscribe [::subs/real-bank-accounts-for-client (:client data)])
|
||||||
:field [:bank-account]
|
:entity->text :name
|
||||||
:spec ::entity/bank-account}])
|
:type "typeahead-v3"
|
||||||
|
:field [:bank-account]
|
||||||
|
:spec ::entity/bank-account}])
|
||||||
|
;; TODO this forces unmounting when client changes, since it is an "uncontorlled" input
|
||||||
|
{:key (str "client-" (:id (:client data)))})
|
||||||
|
|
||||||
(field "Yodlee Merchant"
|
(field "Yodlee Merchant"
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/yodlee-merchants])
|
[typeahead-v3 {:entities @(re-frame/subscribe [::subs/yodlee-merchants])
|
||||||
:match->text #(str (:name %) " - " (:yodlee-id %))
|
:entity->text #(str (:name %) " - " (:yodlee-id %))
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:field [:yodlee-merchant]}])
|
:field [:yodlee-merchant]}])
|
||||||
|
|
||||||
(field [:span "Description (" [:a {:href "https://regex101.com" :target "_new"} "regex tester"] ")" ]
|
(field [:span "Description (" [:a {:href "https://regex101.com" :target "_new"} "regex tester"] ")" ]
|
||||||
[:input.input {:type "text"
|
[:input.input {:type "text"
|
||||||
@@ -315,11 +320,12 @@
|
|||||||
[:h2.title.is-4 "Outcomes"]
|
[:h2.title.is-4 "Outcomes"]
|
||||||
|
|
||||||
(field "Assign Vendor"
|
(field "Assign Vendor"
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/all-vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:match->text :name
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:type "typeahead-entity"
|
:entity->text :name
|
||||||
:field [:vendor]
|
:type "typeahead-v3"
|
||||||
:spec ::entity/vendor}])
|
:field [:vendor]
|
||||||
|
:spec ::entity/vendor}])
|
||||||
|
|
||||||
(field nil
|
(field nil
|
||||||
[expense-accounts-field {:type "expense-accounts"
|
[expense-accounts-field {:type "expense-accounts"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
(:require
|
(:require
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.pages.data-page :as data-page]))
|
[auto-ap.views.pages.data-page :as data-page]))
|
||||||
|
|
||||||
|
|
||||||
@@ -10,10 +10,10 @@
|
|||||||
[:div
|
[:div
|
||||||
[:p.menu-label "Vendor"]
|
[:p.menu-label "Vendor"]
|
||||||
[:div
|
[:div
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor %])
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:match->text :name
|
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor (some-> % (select-keys [:name :id]))])
|
||||||
:include-keys [:name :id]
|
:entity->text :name
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]]])
|
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]]])
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,6 @@
|
|||||||
[auto-ap.views.utils :refer [login-url dispatch-value-change dispatch-event bind-field horizontal-field action-cell-width]]
|
[auto-ap.views.utils :refer [login-url dispatch-value-change dispatch-event bind-field horizontal-field action-cell-width]]
|
||||||
[auto-ap.views.pages.admin.vendors.table :as table]
|
[auto-ap.views.pages.admin.vendors.table :as table]
|
||||||
[auto-ap.views.pages.admin.vendors.merge-dialog :as merge-dialog]
|
[auto-ap.views.pages.admin.vendors.merge-dialog :as merge-dialog]
|
||||||
|
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead]]
|
|
||||||
[cljs.reader :as edn]
|
[cljs.reader :as edn]
|
||||||
[auto-ap.routes :as routes]
|
[auto-ap.routes :as routes]
|
||||||
[bidi.bidi :as bidi]
|
[bidi.bidi :as bidi]
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
[auto-ap.status :as status]
|
[auto-ap.status :as status]
|
||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.views.components.modal :as modal]
|
[auto-ap.views.components.modal :as modal]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.utils :refer [dispatch-event]]
|
[auto-ap.views.utils :refer [dispatch-event]]
|
||||||
[re-frame.core :as re-frame]))
|
[re-frame.core :as re-frame]))
|
||||||
|
|
||||||
@@ -28,20 +28,22 @@
|
|||||||
(form-inline {}
|
(form-inline {}
|
||||||
[:<>
|
[:<>
|
||||||
(field "Form Vendor (will be deleted)"
|
(field "Form Vendor (will be deleted)"
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:type "typeahead-entity"
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:auto-focus true
|
:type "typeahead-v3"
|
||||||
:match->text (fn [x]
|
:auto-focus true
|
||||||
(str (:name x) " (" (reduce + 0 (map :count (:usage x))) " usages)") )
|
:entity->text (fn [x]
|
||||||
:field [:from]}])
|
(str (:name x) " (" (reduce + 0 (map :count (:usage x))) " usages)") )
|
||||||
|
:field [:from]}])
|
||||||
|
|
||||||
|
|
||||||
(field "To Vendor"
|
(field "To Vendor"
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:type "typeahead-entity"
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:match->text (fn [x]
|
:type "typeahead-v3"
|
||||||
(str (:name x) " (" (reduce + 0 (map :count (:usage x))) " usages)") )
|
:entity->text (fn [x]
|
||||||
:field [:to]}])])))
|
(str (:name x) " (" (reduce + 0 (map :count (:usage x))) " usages)") )
|
||||||
|
:field [:to]}])])))
|
||||||
|
|
||||||
(re-frame/reg-event-fx
|
(re-frame/reg-event-fx
|
||||||
::show
|
::show
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
(:require
|
(:require
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.views.utils :refer [active-when dispatch-value-change]]
|
[auto-ap.views.utils :refer [active-when dispatch-value-change]]))
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]))
|
|
||||||
|
|
||||||
(re-frame/reg-sub
|
(re-frame/reg-sub
|
||||||
::specific-filters
|
::specific-filters
|
||||||
|
|||||||
@@ -3,16 +3,20 @@
|
|||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.views.components.grid :as grid]
|
[auto-ap.views.components.grid :as grid]
|
||||||
[auto-ap.views.components.layouts :refer [side-bar-layout]]
|
[auto-ap.views.components.layouts :refer [side-bar-layout]]
|
||||||
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.utils
|
[auto-ap.views.utils
|
||||||
:refer
|
:refer
|
||||||
[->$ date->str days-until dispatch-event local-now standard]]
|
[->$ date->str days-until dispatch-event local-now standard]]
|
||||||
[bidi.bidi :as bidi]
|
[bidi.bidi :as bidi]
|
||||||
[cljs-time.coerce :as coerce]
|
[cljs-time.coerce :as coerce]
|
||||||
[cljs-time.core :as t]
|
[cljs-time.core :as t]
|
||||||
|
[clojure.string :as str]
|
||||||
[pushy.core :as pushy]
|
[pushy.core :as pushy]
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[recharts]
|
[recharts]
|
||||||
[reagent.core :as r]))
|
[downshift :as ds :refer [useCombobox]]
|
||||||
|
[reagent.core :as r]
|
||||||
|
[react]))
|
||||||
|
|
||||||
(def pie-chart (r/adapt-react-class recharts/PieChart))
|
(def pie-chart (r/adapt-react-class recharts/PieChart))
|
||||||
(def pie (r/adapt-react-class recharts/Pie))
|
(def pie (r/adapt-react-class recharts/Pie))
|
||||||
@@ -296,9 +300,16 @@
|
|||||||
|
|
||||||
(defn home-content []
|
(defn home-content []
|
||||||
(let [client-id (-> @(re-frame/subscribe [::subs/client]) :id)
|
(let [client-id (-> @(re-frame/subscribe [::subs/client]) :id)
|
||||||
|
vendors-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
|
vendors-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
|
|
||||||
|
accounts-by-id @(re-frame/subscribe [::subs/accounts-by-id])
|
||||||
|
accounts-index @(re-frame/subscribe [::subs/accounts-index])
|
||||||
chart-options @(re-frame/subscribe [::chart-options])]
|
chart-options @(re-frame/subscribe [::chart-options])]
|
||||||
^{:key client-id}
|
^{:key client-id}
|
||||||
[side-bar-layout {:side-bar [:div]
|
[side-bar-layout {:side-bar [:div
|
||||||
|
|
||||||
|
]
|
||||||
:main [:div [:h1.title "Home"]
|
:main [:div [:h1.title "Home"]
|
||||||
[:h1.title.is-4 "Top expense categories"]
|
[:h1.title.is-4 "Top expense categories"]
|
||||||
(let [expense-categories @(re-frame/subscribe [::top-expense-categories])]
|
(let [expense-categories @(re-frame/subscribe [::top-expense-categories])]
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
[auto-ap.views.utils :refer [dispatch-event bind-field with-user]]
|
[auto-ap.views.utils :refer [dispatch-event bind-field with-user]]
|
||||||
[auto-ap.utils :refer [by]]
|
[auto-ap.utils :refer [by]]
|
||||||
[auto-ap.entities.vendors :as vendor]
|
[auto-ap.entities.vendors :as vendor]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.components.invoice-table :refer [invoice-table] :as invoice-table]
|
[auto-ap.views.components.invoice-table :refer [invoice-table] :as invoice-table]
|
||||||
[cljs.reader :as edn]
|
[cljs.reader :as edn]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
@@ -60,13 +60,14 @@
|
|||||||
[:p.control
|
[:p.control
|
||||||
[:a.button.is-static "Force vendor"]]
|
[:a.button.is-static "Force vendor"]]
|
||||||
[:div.control {:style {:width "400px"}}
|
[:div.control {:style {:width "400px"}}
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:match->text :name
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:name "vendor"
|
:entity->text :name
|
||||||
:type "typeahead"
|
:name "vendor"
|
||||||
:on-change (fn [v]
|
:type "typeahead-v3"
|
||||||
(reset! vendor v))
|
:on-change (fn [v]
|
||||||
:value @vendor}]]
|
(reset! vendor v))
|
||||||
|
:value @vendor}]]
|
||||||
]
|
]
|
||||||
[:div.tile.notification
|
[:div.tile.notification
|
||||||
[:div.has-text-centered {:style {:padding "80px 0px" :width "100%"}}
|
[:div.has-text-centered {:style {:padding "80px 0px" :width "100%"}}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
[auto-ap.views.components.modal :as modal]
|
[auto-ap.views.components.modal :as modal]
|
||||||
[auto-ap.views.components.money-field :refer [money-field]]
|
[auto-ap.views.components.money-field :refer [money-field]]
|
||||||
[auto-ap.views.components.switch-field :refer [switch-field]]
|
[auto-ap.views.components.switch-field :refer [switch-field]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.pages.invoices.common :refer [invoice-read]]
|
[auto-ap.views.pages.invoices.common :refer [invoice-read]]
|
||||||
[auto-ap.views.utils
|
[auto-ap.views.utils
|
||||||
:refer
|
:refer
|
||||||
@@ -348,22 +348,22 @@
|
|||||||
(when-not @(re-frame/subscribe [::subs/client])
|
(when-not @(re-frame/subscribe [::subs/client])
|
||||||
(field [:span "Client"
|
(field [:span "Client"
|
||||||
[:span.has-text-danger " *"]]
|
[:span.has-text-danger " *"]]
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/clients])
|
[typeahead-v3 {:entities @(re-frame/subscribe [::subs/clients])
|
||||||
:match->text :name
|
:entity->text :name
|
||||||
:type "typeahead"
|
:type "typeahead-v3"
|
||||||
:auto-focus (if @(re-frame/subscribe [::subs/client]) false true)
|
:auto-focus (if @(re-frame/subscribe [::subs/client]) false true)
|
||||||
:field [:client]
|
:field [:client]
|
||||||
:disabled exists?
|
:disabled exists?
|
||||||
:spec ::invoice/client}]))
|
:spec ::invoice/client}]))
|
||||||
|
|
||||||
(field [:span "Vendor"
|
(field [:span "Vendor"
|
||||||
[:span.has-text-danger " *"]]
|
[:span.has-text-danger " *"]]
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:match->text :name
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:type "typeahead"
|
:entity->text :name
|
||||||
:disabled exists?
|
:type "typeahead-v3"
|
||||||
:auto-focus (if @(re-frame/subscribe [::subs/client]) true false)
|
:disabled exists?
|
||||||
:field [:vendor]}])
|
:auto-focus (if @(re-frame/subscribe [::subs/client]) true false)
|
||||||
|
:field [:vendor]}])
|
||||||
|
|
||||||
(field [:span "Date"
|
(field [:span "Date"
|
||||||
[:span.has-text-danger " *"]]
|
[:span.has-text-danger " *"]]
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
||||||
[auto-ap.views.components.number-filter :refer [number-filter]]
|
[auto-ap.views.components.number-filter :refer [number-filter]]
|
||||||
[auto-ap.views.components.bank-account-filter :refer [bank-account-filter]]
|
[auto-ap.views.components.bank-account-filter :refer [bank-account-filter]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.pages.data-page :as data-page]
|
[auto-ap.views.pages.data-page :as data-page]
|
||||||
[auto-ap.views.utils :refer [active-when dispatch-value-change]]
|
[auto-ap.views.utils :refer [active-when dispatch-value-change]]
|
||||||
[bidi.bidi :as bidi]
|
[bidi.bidi :as bidi]
|
||||||
@@ -13,7 +13,8 @@
|
|||||||
(defn ledger-side-bar [{:keys [data-page]}]
|
(defn ledger-side-bar [{:keys [data-page]}]
|
||||||
(let [ap @(re-frame/subscribe [::subs/active-page])
|
(let [ap @(re-frame/subscribe [::subs/active-page])
|
||||||
user @(re-frame/subscribe [::subs/user])
|
user @(re-frame/subscribe [::subs/user])
|
||||||
accounts @(re-frame/subscribe [::subs/accounts])]
|
accounts-by-id @(re-frame/subscribe [::subs/accounts-by-id])
|
||||||
|
accounts-index @(re-frame/subscribe [::subs/accounts-index])]
|
||||||
[:div
|
[:div
|
||||||
[:ul.menu-list
|
[:ul.menu-list
|
||||||
[:li.menu-item
|
[:li.menu-item
|
||||||
@@ -56,21 +57,21 @@
|
|||||||
|
|
||||||
[:p.menu-label "Financial Account"]
|
[:p.menu-label "Financial Account"]
|
||||||
[:div
|
[:div
|
||||||
[typeahead-entity {:matches accounts
|
[typeahead-v3 {:entities-by-id accounts-by-id
|
||||||
:match->text (fn [x ] (str (:numeric-code x) " - " (:name x)))
|
:entity-index accounts-index
|
||||||
:include-keys [:name :id :numeric-code]
|
:entity->text (fn [x ] (str (:numeric-code x) " - " (:name x)))
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :account %])
|
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :account (some-> % (select-keys [:name :id :numeric-code]))])
|
||||||
:value @(re-frame/subscribe [::data-page/filter data-page :account])}]]
|
:value @(re-frame/subscribe [::data-page/filter data-page :account])}]]
|
||||||
|
|
||||||
[:p.menu-label "Vendor"]
|
[:p.menu-label "Vendor"]
|
||||||
[:div
|
[:div
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/searchable-vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor %])
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:include-keys [:name :id]
|
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor (some-> % (select-keys [:name :id]))])
|
||||||
:match->text :name
|
:entity->text :name
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]]
|
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
[auto-ap.views.components.sorter :refer [sorted-column]]
|
[auto-ap.views.components.sorter :refer [sorted-column]]
|
||||||
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
||||||
[auto-ap.views.components.layouts :refer [side-bar-layout]]
|
[auto-ap.views.components.layouts :refer [side-bar-layout]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead]]
|
|
||||||
[auto-ap.views.components.paginator :refer [paginator]]
|
[auto-ap.views.components.paginator :refer [paginator]]
|
||||||
[auto-ap.views.components.sort-by-list :refer [sort-by-list]]
|
[auto-ap.views.components.sort-by-list :refer [sort-by-list]]
|
||||||
[auto-ap.events :as events]
|
[auto-ap.events :as events]
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
(:require [auto-ap.subs :as subs]
|
(:require [auto-ap.subs :as subs]
|
||||||
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
||||||
[auto-ap.views.components.number-filter :refer [number-filter]]
|
[auto-ap.views.components.number-filter :refer [number-filter]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.pages.data-page :as data-page]
|
[auto-ap.views.pages.data-page :as data-page]
|
||||||
[auto-ap.views.utils :refer [dispatch-event dispatch-value-change]]
|
[auto-ap.views.utils :refer [dispatch-event dispatch-value-change]]
|
||||||
[re-frame.core :as re-frame]))
|
[re-frame.core :as re-frame]))
|
||||||
@@ -14,12 +14,13 @@
|
|||||||
[:div
|
[:div
|
||||||
[:p.menu-label "Vendor"]
|
[:p.menu-label "Vendor"]
|
||||||
[:div
|
[:div
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/searchable-vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor %])
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:include-keys [:name :id]
|
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor (some-> % (select-keys [:name :id]))])
|
||||||
:match->text :name
|
:include-keys [:name :id]
|
||||||
:type "typeahead-entity"
|
:entity->text :name
|
||||||
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]]
|
:type "typeahead-v3"
|
||||||
|
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]]
|
||||||
|
|
||||||
[:p.menu-label "Date Range"]
|
[:p.menu-label "Date Range"]
|
||||||
[:div
|
[:div
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
[auto-ap.views.components.expense-accounts-field :as expense-accounts-field :refer [expense-accounts-field recalculate-amounts]]
|
[auto-ap.views.components.expense-accounts-field :as expense-accounts-field :refer [expense-accounts-field recalculate-amounts]]
|
||||||
[auto-ap.views.components.layouts :as layouts]
|
[auto-ap.views.components.layouts :as layouts]
|
||||||
[auto-ap.views.components.money-field :refer [money-field]]
|
[auto-ap.views.components.money-field :refer [money-field]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.status :as status]
|
[auto-ap.status :as status]
|
||||||
[auto-ap.views.utils :refer [date->str date-picker dispatch-event standard with-user]]
|
[auto-ap.views.utils :refer [date->str date-picker dispatch-event standard with-user]]
|
||||||
[cljs-time.core :as c]
|
[cljs-time.core :as c]
|
||||||
@@ -42,11 +42,11 @@
|
|||||||
(when-not @(re-frame/subscribe [::subs/client])
|
(when-not @(re-frame/subscribe [::subs/client])
|
||||||
(field [:span "Client"
|
(field [:span "Client"
|
||||||
[:span.has-text-danger " *"]]
|
[:span.has-text-danger " *"]]
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/clients])
|
[typeahead-v3 {:entities @(re-frame/subscribe [::subs/clients])
|
||||||
:match->text :name
|
:entity->text :name
|
||||||
:type "typeahead"
|
:type "typeahead-v3"
|
||||||
:field [:client]
|
:field [:client]
|
||||||
:disabled true}]))
|
:disabled true}]))
|
||||||
|
|
||||||
|
|
||||||
(field "Date"
|
(field "Date"
|
||||||
|
|||||||
@@ -2,11 +2,9 @@
|
|||||||
(:require [auto-ap.routes :as routes]
|
(:require [auto-ap.routes :as routes]
|
||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.views.utils :refer [active-when dispatch-value-change]]
|
[auto-ap.views.utils :refer [active-when dispatch-value-change]]
|
||||||
[auto-ap.views.components.vendor-filter :refer [vendor-filter]]
|
|
||||||
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
||||||
[auto-ap.views.components.number-filter :refer [number-filter]]
|
[auto-ap.views.components.number-filter :refer [number-filter]]
|
||||||
[auto-ap.views.components.bank-account-filter :refer [bank-account-filter]]
|
[auto-ap.views.components.bank-account-filter :refer [bank-account-filter]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
|
||||||
[bidi.bidi :as bidi]
|
[bidi.bidi :as bidi]
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[auto-ap.views.pages.data-page :as data-page]))
|
[auto-ap.views.pages.data-page :as data-page]))
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
:refer
|
:refer
|
||||||
[expense-accounts-field]]
|
[expense-accounts-field]]
|
||||||
[auto-ap.views.components.layouts :as layouts]
|
[auto-ap.views.components.layouts :as layouts]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.pages.transactions.common :refer [transaction-read]]
|
[auto-ap.views.pages.transactions.common :refer [transaction-read]]
|
||||||
[auto-ap.views.utils
|
[auto-ap.views.utils
|
||||||
:refer
|
:refer
|
||||||
@@ -406,13 +406,14 @@
|
|||||||
[tab {:title "Details" :key :details}
|
[tab {:title "Details" :key :details}
|
||||||
[:div
|
[:div
|
||||||
(field "Vendor"
|
(field "Vendor"
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:match->text :name
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:type "typeahead-entity"
|
:entity->text :name
|
||||||
:auto-focus true
|
:type "typeahead-v3"
|
||||||
:field [:vendor]
|
:auto-focus true
|
||||||
:disabled (or (boolean (:payment data))
|
:field [:vendor]
|
||||||
should-disable-for-client?)}])
|
:disabled (or (boolean (:payment data))
|
||||||
|
should-disable-for-client?)}])
|
||||||
(field nil
|
(field nil
|
||||||
[expense-accounts-field
|
[expense-accounts-field
|
||||||
{:type "expense-accounts"
|
{:type "expense-accounts"
|
||||||
@@ -437,10 +438,10 @@
|
|||||||
:disabled should-disable-for-client?}])
|
:disabled should-disable-for-client?}])
|
||||||
|
|
||||||
(field "Forecasted-transaction"
|
(field "Forecasted-transaction"
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/forecasted-transactions-for-client (:id (:client data))])
|
[typeahead-v3 {:entities @(re-frame/subscribe [::subs/forecasted-transactions-for-client (:id (:client data))])
|
||||||
:match->text :identifier
|
:entity->text :identifier
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:field [:forecast-match]}])
|
:field [:forecast-match]}])
|
||||||
(error-notification)
|
(error-notification)
|
||||||
(when-not should-disable-for-client?
|
(when-not should-disable-for-client?
|
||||||
(submit-button "Save"))]]]]))])
|
(submit-button "Save"))]]]]))])
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
[auto-ap.views.components.date-range-filter :refer [date-range-filter]]
|
||||||
[auto-ap.views.components.number-filter :refer [number-filter]]
|
[auto-ap.views.components.number-filter :refer [number-filter]]
|
||||||
[auto-ap.views.components.switch-field :refer [switch-field]]
|
[auto-ap.views.components.switch-field :refer [switch-field]]
|
||||||
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
|
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
|
||||||
[auto-ap.views.pages.data-page :as data-page]
|
[auto-ap.views.pages.data-page :as data-page]
|
||||||
[auto-ap.views.utils :refer [active-when dispatch-event dispatch-value-change ->$ account->match-text]]
|
[auto-ap.views.utils :refer [active-when dispatch-event dispatch-value-change ->$ account->match-text]]
|
||||||
[bidi.bidi :as bidi]
|
[bidi.bidi :as bidi]
|
||||||
@@ -17,7 +17,8 @@
|
|||||||
(let [ap @(re-frame/subscribe [::subs/active-page])
|
(let [ap @(re-frame/subscribe [::subs/active-page])
|
||||||
user @(re-frame/subscribe [::subs/user])
|
user @(re-frame/subscribe [::subs/user])
|
||||||
|
|
||||||
accounts @(re-frame/subscribe [::subs/accounts])
|
accounts @(re-frame/subscribe [::subs/accounts-by-id])
|
||||||
|
account-index @(re-frame/subscribe [::subs/accounts-index])
|
||||||
]
|
]
|
||||||
[:div
|
[:div
|
||||||
[:div [:p.menu-label "Type"]
|
[:div [:p.menu-label "Type"]
|
||||||
@@ -64,20 +65,20 @@
|
|||||||
|
|
||||||
[:p.menu-label "Financial Account"]
|
[:p.menu-label "Financial Account"]
|
||||||
[:div
|
[:div
|
||||||
[typeahead-entity {:matches accounts
|
[typeahead-v3 {:entities-by-id accounts
|
||||||
:match->text account->match-text
|
:entity-index account-index
|
||||||
:include-keys [:name :id :numeric-code]
|
:entity->text account->match-text
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :account %])
|
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :account (some-> % (select-keys [:name :id :numeric-code]))])
|
||||||
:value @(re-frame/subscribe [::data-page/filter data-page :account])}]]
|
:value @(re-frame/subscribe [::data-page/filter data-page :account])}]]
|
||||||
|
|
||||||
[:p.menu-label "Vendor"]
|
[:p.menu-label "Vendor"]
|
||||||
[:div
|
[:div
|
||||||
[typeahead-entity {:matches @(re-frame/subscribe [::subs/searchable-vendors])
|
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
|
||||||
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor %])
|
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
|
||||||
:include-keys [:name :id]
|
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor (some-> % (select-keys [:name :id]))])
|
||||||
:match->text :name
|
:entity->text :name
|
||||||
:type "typeahead-entity"
|
:type "typeahead-v3"
|
||||||
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]]
|
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,13 +6,13 @@
|
|||||||
[clojure.spec.alpha :as s]
|
[clojure.spec.alpha :as s]
|
||||||
[cljs-time.coerce :as c]
|
[cljs-time.coerce :as c]
|
||||||
[cljs-time.core :as time]
|
[cljs-time.core :as time]
|
||||||
[auto-ap.events :as events]
|
|
||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[cljs-time.format :as format]
|
[cljs-time.format :as format]
|
||||||
[goog.i18n.NumberFormat.Format]
|
[goog.i18n.NumberFormat.Format]
|
||||||
[cljs-time.core :as t]
|
[cljs-time.core :as t]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
[goog.crypt.base64 :as base64]
|
[goog.crypt.base64 :as base64]
|
||||||
|
[cljs.tools.reader.edn :as edn]
|
||||||
[reagent.core :as r])
|
[reagent.core :as r])
|
||||||
(:import
|
(:import
|
||||||
(goog.i18n NumberFormat)
|
(goog.i18n NumberFormat)
|
||||||
@@ -100,6 +100,9 @@
|
|||||||
e
|
e
|
||||||
(date->str (time/from-default-time-zone (c/from-date e)) standard))))))
|
(date->str (time/from-default-time-zone (c/from-date e)) standard))))))
|
||||||
|
|
||||||
|
;; TODO inline on-changes causes each field to be rerendered each time. When we fix this
|
||||||
|
;; let's make sure that we find away not to trigger a re-render for every component any time any form field
|
||||||
|
;; changes
|
||||||
(defmulti do-bind (fn [a {:keys [type] :as x}]
|
(defmulti do-bind (fn [a {:keys [type] :as x}]
|
||||||
type))
|
type))
|
||||||
|
|
||||||
@@ -277,6 +280,21 @@
|
|||||||
keys (dissoc keys :field :subscription :event :spec)]
|
keys (dissoc keys :field :subscription :event :spec)]
|
||||||
(into [dom keys] (with-keys rest))))
|
(into [dom keys] (with-keys rest))))
|
||||||
|
|
||||||
|
(defmethod do-bind "typeahead-v3" [dom {:keys [field event text-event subscription class spec match->text] :as keys} & rest]
|
||||||
|
(let [field (if (keyword? field) [field] field)
|
||||||
|
event (if (keyword? event) [event] event)
|
||||||
|
keys (assoc keys
|
||||||
|
:on-change (fn [selected]
|
||||||
|
(re-frame/dispatch (conj (conj event field) selected))
|
||||||
|
#_(when text-field
|
||||||
|
(re-frame/dispatch (conj (conj (or text-event event) text-field) text-value))))
|
||||||
|
:value (get-in subscription field)
|
||||||
|
:class (str class
|
||||||
|
(when (and spec (not (s/valid? spec (get-in subscription field))))
|
||||||
|
" is-danger")))
|
||||||
|
keys (dissoc keys :field :subscription :event :spec)]
|
||||||
|
(into [dom keys] (with-keys rest))))
|
||||||
|
|
||||||
(defmethod do-bind "date" [dom {:keys [field event subscription class spec] :as keys} & rest]
|
(defmethod do-bind "date" [dom {:keys [field event subscription class spec] :as keys} & rest]
|
||||||
(let [field (if (keyword? field) [field] field)
|
(let [field (if (keyword? field) [field] field)
|
||||||
event (if (keyword? event) [event] event)
|
event (if (keyword? event) [event] event)
|
||||||
@@ -448,7 +466,7 @@
|
|||||||
(defn query-params []
|
(defn query-params []
|
||||||
(reduce-kv
|
(reduce-kv
|
||||||
(fn [result k v]
|
(fn [result k v]
|
||||||
(assoc result (keyword k) (cljs.tools.reader.edn/read-string v)))
|
(assoc result (keyword k) (edn/read-string v)))
|
||||||
{}
|
{}
|
||||||
(:query (cemerick.url/url (.-location js/window)))))
|
(:query (cemerick.url/url (.-location js/window)))))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user