cash flows
This commit is contained in:
@@ -89,7 +89,7 @@
|
||||
(let [selected (cond
|
||||
(#{::invoice-route/all-page ::invoice-route/unpaid-page ::invoice-route/voided-page ::invoice-route/paid-page ::oi-routes/new ::invoice-route/import-page :invoice-glimpse :invoice-glimpse-textract-invoice} (:matched-route request))
|
||||
"invoices"
|
||||
|
||||
|
||||
(#{:pos-sales :pos-expected-deposits :pos-tenders :pos-refunds :pos-cash-drawer-shifts} (:matched-route request))
|
||||
"sales"
|
||||
(#{::payment-routes/all-page ::payment-routes/pending-page ::payment-routes/cleared-page ::payment-routes/voided-page} (:matched-route request))
|
||||
@@ -152,15 +152,15 @@
|
||||
|
||||
|
||||
#_(when (can? (:identity request)
|
||||
{:subject :invoice
|
||||
:activity :import})
|
||||
(menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes
|
||||
:invoice-glimpse))
|
||||
:active? (= :invoice-glimpse (:matched-route request))
|
||||
:hx-boost "true"}
|
||||
[:div.flex.gap-2
|
||||
"Glimpse"
|
||||
(tags/pill- {:color :secondary} "Beta")]))
|
||||
{:subject :invoice
|
||||
:activity :import})
|
||||
(menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes
|
||||
:invoice-glimpse))
|
||||
:active? (= :invoice-glimpse (:matched-route request))
|
||||
:hx-boost "true"}
|
||||
[:div.flex.gap-2
|
||||
"Glimpse"
|
||||
(tags/pill- {:color :secondary} "Beta")]))
|
||||
|
||||
|
||||
(when (can? (:identity request)
|
||||
@@ -303,8 +303,20 @@
|
||||
:profit-and-loss-detail)} "Profit & Loss Detail")
|
||||
(menu-button- {:href (bidi/path-for client-routes/routes
|
||||
:cash-flows)} "Cash Flows")
|
||||
|
||||
(if (is-admin? (:identity request))
|
||||
(if (is-admin? (:identity request))
|
||||
(menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes
|
||||
::ledger-routes/cash-flows))
|
||||
:active? (= ::ledger-routes/balance-sheet (:matched-route request))
|
||||
:hx-boost "true"}
|
||||
[:div.flex.gap-2
|
||||
"Cash flows"
|
||||
(tags/pill- {:color :secondary} "WIP")])
|
||||
(menu-button- {:href (bidi/path-for client-routes/routes
|
||||
:cash-flows)} "Cash flows"))
|
||||
(when (is-admin? (:identity request))
|
||||
(menu-button- {:href (bidi/path-for client-routes/routes
|
||||
:cash-flows)} "Old Cash flows"))
|
||||
(if (is-admin? (:identity request))
|
||||
(menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes
|
||||
::ledger-routes/balance-sheet))
|
||||
:active? (= ::ledger-routes/balance-sheet (:matched-route request))
|
||||
@@ -313,16 +325,15 @@
|
||||
"Balance Sheet"
|
||||
(tags/pill- {:color :secondary} "WIP")])
|
||||
(menu-button- {:href (bidi/path-for client-routes/routes
|
||||
:balance-sheet)} "Balance Sheet"))
|
||||
(when (is-admin? (:identity request))
|
||||
:balance-sheet)} "Balance Sheet"))
|
||||
(when (is-admin? (:identity request))
|
||||
(menu-button- {:href (bidi/path-for client-routes/routes
|
||||
:balance-sheet)} "Old Balance Sheet"))
|
||||
:balance-sheet)} "Old Balance Sheet"))
|
||||
(when (can? (:identity request)
|
||||
{:subject :ledger
|
||||
:activity :import})
|
||||
(menu-button- {:href (bidi/path-for client-routes/routes
|
||||
:external-import-ledger)} "External Ledger Import"))
|
||||
|
||||
(when (is-admin? (:identity request))
|
||||
(menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes
|
||||
::ledger-routes/external-import-page)
|
||||
|
||||
@@ -189,14 +189,14 @@
|
||||
|
||||
|
||||
(defn multi-typeahead- [params]
|
||||
[:div.relative {:x-data (doto (hx/json {:baseUrl (if (str/includes? (:url params) "?")
|
||||
(str (:url params) "&q=")
|
||||
(str (:url params) "?q="))
|
||||
:reset_elements (js-fn "function(e) {
|
||||
[:div.relative {:x-data (hx/json {:baseUrl (if (str/includes? (:url params) "?")
|
||||
(str (:url params) "&q=")
|
||||
(str (:url params) "?q="))
|
||||
:reset_elements (js-fn "function(e) {
|
||||
this.elements = [{value: 'all', label:'All'}].concat(e);
|
||||
this.active = -1
|
||||
}")
|
||||
:toggle (js-fn "function(e) {
|
||||
:toggle (js-fn "function(e) {
|
||||
if (e.value == 'all') {
|
||||
if (this.value.size > 0) {
|
||||
this.value = new Set([]);
|
||||
@@ -219,34 +219,33 @@
|
||||
}
|
||||
}
|
||||
}")
|
||||
:all_selected (boolean (= (:value params) :all)),
|
||||
:value (cond
|
||||
(= :all (:value params))
|
||||
["all"]
|
||||
:all_selected (boolean (= (:value params) :all)),
|
||||
:value (cond
|
||||
(= :all (:value params))
|
||||
["all"]
|
||||
|
||||
(sequential? (:value params))
|
||||
(map (fn [v] ((:value-fn params identity) v))
|
||||
(:value params))
|
||||
|
||||
:else
|
||||
[])
|
||||
:tippy nil
|
||||
:lookup (into {}
|
||||
(when (sequential? (:value params))
|
||||
(map (fn [v] [((:value-fn params identity) v)
|
||||
((:content-fn params identity) v)])
|
||||
(:value params))))
|
||||
:x-init (str "$watch('value', v => $dispatch('change')); ")
|
||||
:search ""
|
||||
:active -1
|
||||
:elements (cond-> [{:value "all" :label "All"}]
|
||||
(sequential? (:value params))
|
||||
(into (map (fn [v]
|
||||
{:value ((:value-fn params identity) v)
|
||||
:label ((:content-fn params identity) v)})
|
||||
(:value params))))
|
||||
:x-ref "r"})
|
||||
println)
|
||||
(sequential? (:value params))
|
||||
(map (fn [v] ((:value-fn params identity) v))
|
||||
(:value params))
|
||||
|
||||
:else
|
||||
[])
|
||||
:tippy nil
|
||||
:lookup (into {}
|
||||
(when (sequential? (:value params))
|
||||
(map (fn [v] [((:value-fn params identity) v)
|
||||
((:content-fn params identity) v)])
|
||||
(:value params))))
|
||||
:x-init (str "$watch('value', v => $dispatch('change')); ")
|
||||
:search ""
|
||||
:active -1
|
||||
:elements (cond-> [{:value "all" :label "All"}]
|
||||
(sequential? (:value params))
|
||||
(into (map (fn [v]
|
||||
{:value ((:value-fn params identity) v)
|
||||
:label ((:content-fn params identity) v)})
|
||||
(:value params))))
|
||||
:x-ref "r"})
|
||||
;; :x-modelable "value.value" TODO
|
||||
;; :x-model (:x-model params) TODO
|
||||
:x-init "value=new Set(value || []); "}
|
||||
@@ -351,7 +350,7 @@
|
||||
(update :class #(str % (use-size size) " w-full"))
|
||||
(dissoc :size))]])
|
||||
|
||||
(defn multi-date-input- [{:keys [size] :as params}]
|
||||
(defn multi-calendar-input- [{:keys [size] :as params}]
|
||||
(let [value (str/join ", "
|
||||
(for [v (:value params)
|
||||
:when v]
|
||||
@@ -379,6 +378,30 @@
|
||||
(update :class #(str % (use-size size) " w-full"))
|
||||
(dissoc :size :name :x-model :x-modelable))]]))
|
||||
|
||||
(defn calendar-input- [{:keys [size] :as params}]
|
||||
(let [value (:value params)]
|
||||
[:div.shrink {:x-data (hx/json {:value value
|
||||
:dp nil })
|
||||
:x-modelable "value"
|
||||
:x-model (:x-model params) }
|
||||
[:input {:type "hidden" :name (:name params) :x-model "value"}]
|
||||
[:div
|
||||
(-> params
|
||||
(update :class (fnil hh/add-class "") default-input-classes)
|
||||
(assoc :type "text")
|
||||
(assoc :value value)
|
||||
;; the data-date field has to be bound before the datepicker can be initialized
|
||||
(assoc :x-init "$nextTick(() => { dp = initCalendar($el); ;}); ")
|
||||
(assoc "x-effect" "if(dp) { dp.setDate(value); } ")
|
||||
(assoc ":data-date" "value")
|
||||
(assoc "@htmx:before-history-save" "destroyDatepicker(dp)" )
|
||||
(assoc "@htmx:before-cleanup-element" "destroyDatepicker(dp)" )
|
||||
(assoc "x-destroy" "destroyDatepicker(dp)")
|
||||
(assoc "@change-date.camel" "value = dp.getDate(\"mm/dd/yyyy\");")
|
||||
|
||||
(update :class #(str % (use-size size) " w-full"))
|
||||
(dissoc :size :name :x-model :x-modelable))]]))
|
||||
|
||||
|
||||
|
||||
(defn field-errors- [{:keys [source key]} & rest]
|
||||
|
||||
Reference in New Issue
Block a user