All of my company works spame way
This commit is contained in:
@@ -623,9 +623,13 @@
|
|||||||
(range length)))]
|
(range length)))]
|
||||||
(sort comparator results )))
|
(sort comparator results )))
|
||||||
|
|
||||||
(defn apply-pagination [args results]
|
(defn apply-pagination-raw [args results]
|
||||||
(log/info (take 4 results))
|
{:entries (->> results
|
||||||
|
(drop (:start args 0))
|
||||||
|
(take (:count args (or (:per-page args) default-pagination-size))))
|
||||||
|
:count (count results)})
|
||||||
|
|
||||||
|
(defn apply-pagination [args results]
|
||||||
{:ids (->> results
|
{:ids (->> results
|
||||||
(drop (:start args 0))
|
(drop (:start args 0))
|
||||||
(take (:count args (or (:per-page args) default-pagination-size)))
|
(take (:count args (or (:per-page args) default-pagination-size)))
|
||||||
|
|||||||
@@ -59,7 +59,6 @@
|
|||||||
(map :db/id (:report/client r))))))))
|
(map :db/id (:report/client r))))))))
|
||||||
|
|
||||||
(defn get-graphql [args]
|
(defn get-graphql [args]
|
||||||
(clojure.pprint/pprint args)
|
|
||||||
(let [db (dc/db conn)
|
(let [db (dc/db conn)
|
||||||
{ids-to-retrieve :ids matching-count :count} (raw-graphql-ids db args)]
|
{ids-to-retrieve :ids matching-count :count} (raw-graphql-ids db args)]
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
:user/name (:name profile)})
|
:user/name (:name profile)})
|
||||||
auth {:user (:name profile)
|
auth {:user (:name profile)
|
||||||
:exp (time/plus (time/now) (time/days 30))
|
:exp (time/plus (time/now) (time/days 30))
|
||||||
|
:db/id (:db/id user)
|
||||||
:user/clients (map (fn [c]
|
:user/clients (map (fn [c]
|
||||||
(select-keys c [:client/code :db/id :client/locations]))
|
(select-keys c [:client/code :db/id :client/locations]))
|
||||||
(:user/clients user))
|
(:user/clients user))
|
||||||
|
|||||||
@@ -1,224 +1,229 @@
|
|||||||
(ns auto-ap.ssr.company.company-1099
|
(ns auto-ap.ssr.company.company-1099
|
||||||
(:require
|
(:require
|
||||||
[auto-ap.datomic :refer [conn remove-nils]]
|
[auto-ap.datomic :refer [apply-pagination-raw conn remove-nils]]
|
||||||
[auto-ap.graphql.utils :refer [is-admin?]]
|
[auto-ap.graphql.utils :refer [assert-can-see-client is-admin?]]
|
||||||
[auto-ap.ssr-routes :as ssr-routes]
|
[auto-ap.ssr-routes :as ssr-routes]
|
||||||
[auto-ap.ssr.components :as com]
|
[auto-ap.ssr.components :as com]
|
||||||
|
[auto-ap.ssr.grid-page-helper :as helper]
|
||||||
[auto-ap.ssr.svg :as svg]
|
[auto-ap.ssr.svg :as svg]
|
||||||
[auto-ap.ssr.ui :refer [base-page]]
|
[auto-ap.ssr.utils :refer [form-data->map html-response path->name]]
|
||||||
[auto-ap.ssr.utils :refer [html-response form-data->map path->name]]
|
|
||||||
[bidi.bidi :as bidi]
|
[bidi.bidi :as bidi]
|
||||||
|
[cemerick.url :as url]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
[datomic.api :as dc]
|
[datomic.api :as dc]
|
||||||
[iol-ion.query :refer [can-see-client?]]))
|
[iol-ion.query :refer [can-see-client?]]))
|
||||||
|
|
||||||
|
(def vendor-read '[:db/id
|
||||||
|
:vendor/name
|
||||||
|
{:vendor/legal-entity-1099-type [:db/ident]}
|
||||||
|
{:vendor/legal-entity-tin-type [:db/ident]}
|
||||||
|
{:vendor/address [:address/street1
|
||||||
|
:address/city
|
||||||
|
:address/state
|
||||||
|
:address/zip]}
|
||||||
|
:vendor/legal-entity-tin
|
||||||
|
:vendor/legal-entity-name
|
||||||
|
:vendor/legal-entity-first-name
|
||||||
|
:vendor/legal-entity-middle-name
|
||||||
|
:vendor/legal-entity-last-name])
|
||||||
|
|
||||||
|
(defn sum-for-client-vendor [client-id vendor-id]
|
||||||
|
(ffirst (dc/q '[:find
|
||||||
|
(sum ?a)
|
||||||
|
:with ?d
|
||||||
|
:in $ ?c ?v
|
||||||
|
:where
|
||||||
|
[?p :payment/client ?c]
|
||||||
|
[?p :payment/date ?d ]
|
||||||
|
[(>= ?d #inst "2022-01-01T08:00")]
|
||||||
|
[(< ?d #inst "2023-01-01T08:00")]
|
||||||
|
[?p :payment/type :payment-type/check]
|
||||||
|
[?p :payment/amount ?a]
|
||||||
|
[?p :payment/vendor ?v]]
|
||||||
|
(dc/db conn)
|
||||||
|
client-id
|
||||||
|
vendor-id)))
|
||||||
|
|
||||||
(defn get-1099-companies [user session]
|
(defn get-1099-companies [user {:keys [client-id] :as args}]
|
||||||
(let [clients (->> (dc/q '[:find ?c
|
(let [clients (->> (dc/q '[:find ?c
|
||||||
:in $ ?user
|
:in $ ?user
|
||||||
:where [?c :client/code]
|
:where [?c :client/code]
|
||||||
[(iol-ion.query/can-see-client? ?user ?c)]]
|
[(iol-ion.query/can-see-client? ?user ?c)]]
|
||||||
(dc/db conn) user)
|
(dc/db conn) user)
|
||||||
(map first)
|
(map first)
|
||||||
set)
|
set)
|
||||||
results (cond
|
results (cond
|
||||||
(and (some-> session :client :db/id)
|
(and client-id
|
||||||
(can-see-client? user
|
(can-see-client? user client-id))
|
||||||
(some-> session :client :db/id)))
|
|
||||||
(dc/q '[:find
|
(dc/q '[:find
|
||||||
(pull ?c [:client/code :db/id])
|
(pull ?c [:client/code :db/id])
|
||||||
(pull ?v [:db/id
|
(pull ?v vendor-read)
|
||||||
:vendor/name
|
(sum ?a)
|
||||||
{:vendor/legal-entity-1099-type [:db/ident]}
|
:with ?d
|
||||||
{:vendor/legal-entity-tin-type [:db/ident]}
|
:in $ ?c vendor-read
|
||||||
{:vendor/address [:address/street1
|
:where
|
||||||
:address/city
|
[?p :payment/client ?c]
|
||||||
:address/state
|
[?p :payment/date ?d ]
|
||||||
:address/zip]}
|
[(>= ?d #inst "2022-01-01T08:00")]
|
||||||
:vendor/legal-entity-tin
|
[(< ?d #inst "2023-01-01T08:00")]
|
||||||
:vendor/legal-entity-name
|
[?p :payment/type :payment-type/check]
|
||||||
:vendor/legal-entity-first-name
|
[?p :payment/amount ?a]
|
||||||
:vendor/legal-entity-middle-name
|
[?p :payment/vendor ?v]]
|
||||||
:vendor/legal-entity-last-name])
|
(dc/db conn)
|
||||||
(sum ?a)
|
client-id
|
||||||
:with ?d
|
vendor-read)
|
||||||
:in $ ?c
|
|
||||||
:where
|
|
||||||
[?p :payment/client ?c]
|
|
||||||
[?p :payment/date ?d ]
|
|
||||||
[(>= ?d #inst "2022-01-01T08:00")]
|
|
||||||
[(< ?d #inst "2023-01-01T08:00")]
|
|
||||||
[?p :payment/type :payment-type/check]
|
|
||||||
[?p :payment/amount ?a]
|
|
||||||
[?p :payment/vendor ?v]]
|
|
||||||
(dc/db conn)
|
|
||||||
(some-> session :client :db/id))
|
|
||||||
|
|
||||||
(is-admin? user)
|
(is-admin? user)
|
||||||
(dc/q '[:find
|
(dc/q '[:find
|
||||||
(pull ?c [:client/code :db/id])
|
(pull ?c [:client/code :db/id])
|
||||||
(pull ?v [:db/id
|
(pull ?v vendor-read)
|
||||||
:vendor/name
|
(sum ?a)
|
||||||
{:vendor/legal-entity-1099-type [:db/ident]}
|
:with ?d
|
||||||
{:vendor/legal-entity-tin-type [:db/ident]}
|
:in $ vendor-read
|
||||||
{:vendor/address [:address/street1
|
:where
|
||||||
:address/city
|
[?p :payment/date ?d ]
|
||||||
:address/state
|
[(>= ?d #inst "2022-01-01T08:00")]
|
||||||
:address/zip]}
|
[(< ?d #inst "2023-01-01T08:00")]
|
||||||
:vendor/legal-entity-tin
|
[?p :payment/type :payment-type/check]
|
||||||
:vendor/legal-entity-name
|
[?p :payment/client ?c]
|
||||||
:vendor/legal-entity-first-name
|
[?p :payment/amount ?a]
|
||||||
:vendor/legal-entity-middle-name
|
[?p :payment/vendor ?v]]
|
||||||
:vendor/legal-entity-last-name])
|
(dc/db conn)
|
||||||
(sum ?a)
|
vendor-read)
|
||||||
:with ?d
|
|
||||||
:in $
|
|
||||||
:where
|
|
||||||
[?p :payment/date ?d ]
|
|
||||||
[(>= ?d #inst "2022-01-01T08:00")]
|
|
||||||
[(< ?d #inst "2023-01-01T08:00")]
|
|
||||||
[?p :payment/type :payment-type/check]
|
|
||||||
[?p :payment/client ?c]
|
|
||||||
[?p :payment/amount ?a]
|
|
||||||
[?p :payment/vendor ?v]]
|
|
||||||
(dc/db conn))
|
|
||||||
|
|
||||||
:else
|
:else
|
||||||
(dc/q '[:find
|
(dc/q '[:find
|
||||||
(pull ?c [:client/code :db/id])
|
(pull ?c [:client/code :db/id])
|
||||||
(pull ?v [:db/id
|
(pull ?v vendor-read)
|
||||||
:vendor/name
|
(sum ?a)
|
||||||
{:vendor/legal-entity-1099-type [:db/ident]}
|
:with ?d
|
||||||
{:vendor/legal-entity-tin-type [:db/ident]}
|
:in $ [?c ...] vendor-read
|
||||||
{:vendor/address [:address/street1
|
:where
|
||||||
:address/city
|
[?p :payment/client ?c]
|
||||||
:address/state
|
[?p :payment/date ?d ]
|
||||||
:address/zip]}
|
[(>= ?d #inst "2022-01-01T08:00")]
|
||||||
:vendor/legal-entity-tin
|
[(< ?d #inst "2023-01-01T08:00")]
|
||||||
:vendor/legal-entity-name
|
[?p :payment/type :payment-type/check]
|
||||||
:vendor/legal-entity-first-name
|
[?p :payment/amount ?a]
|
||||||
:vendor/legal-entity-middle-name
|
[?p :payment/vendor ?v]]
|
||||||
:vendor/legal-entity-last-name])
|
(dc/db conn)
|
||||||
(sum ?a)
|
clients
|
||||||
:with ?d
|
vendor-read))
|
||||||
:in $ [?c ...]
|
all (->> results
|
||||||
:where
|
(filter (fn [[_ _ a]]
|
||||||
[?p :payment/client ?c]
|
(>= (or a 0.0) 600.0)))
|
||||||
[?p :payment/date ?d ]
|
(sort-by (fn [[client _ amount]]
|
||||||
[(>= ?d #inst "2022-01-01T08:00")]
|
[(:client/code client ) amount]))
|
||||||
[(< ?d #inst "2023-01-01T08:00")]
|
(into []))
|
||||||
[?p :payment/type :payment-type/check]
|
paginated (apply-pagination-raw args all)]
|
||||||
[?p :payment/amount ?a]
|
[(:entries paginated) (:count paginated)]))
|
||||||
[?p :payment/vendor ?v]]
|
|
||||||
(dc/db conn)
|
|
||||||
clients))]
|
|
||||||
(->> results
|
|
||||||
(filter (fn [[_ _ a]]
|
|
||||||
(>= (or a 0.0) 600.0)))
|
|
||||||
(sort-by (fn [[client _ amount]]
|
|
||||||
[(:client/code client ) amount]))
|
|
||||||
(into []))))
|
|
||||||
|
|
||||||
(defn row* [{:keys [client vendor amount flash?]}]
|
(def grid-page {:id "vendor-table"
|
||||||
(com/data-grid-row
|
:nav (com/company-aside-nav)
|
||||||
{:class (when flash?
|
:id-fn (comp :db/id second)
|
||||||
"live-added")}
|
:fetch-page (fn [user args]
|
||||||
(com/data-grid-cell {} (:client/code client))
|
(get-1099-companies user args)
|
||||||
(com/data-grid-cell
|
#_(r/get-graphql (into args {:id user})))
|
||||||
{}
|
:breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes
|
||||||
[:div.flex.whitespace-nowrap.items-center.gap-4
|
:company)}
|
||||||
[:div [:div (:vendor/name vendor)]
|
"My Company"]
|
||||||
[:div.text-sm.text-gray-400
|
|
||||||
(or (-> vendor :vendor/legal-entity-name not-empty)
|
|
||||||
(str (-> vendor :vendor/legal-entity-first-name) " "
|
|
||||||
(-> vendor :vendor/legal-entity-middle-name) " "
|
|
||||||
(-> vendor :vendor/legal-entity-last-name)))]]
|
|
||||||
(when-let [t99-type (some-> vendor :vendor/legal-entity-1099-type :db/ident name)]
|
|
||||||
(com/pill
|
|
||||||
{:class "text-xs font-medium"
|
|
||||||
:color :primary}
|
|
||||||
(str/capitalize t99-type))
|
|
||||||
)])
|
|
||||||
(com/data-grid-cell
|
|
||||||
{:class "hidden md:table-cell"}
|
|
||||||
[:div.flex.gap-4
|
|
||||||
(when-let [tin (-> vendor :vendor/legal-entity-tin)]
|
|
||||||
[:span {:class "text-xs font-medium py-0.5 "}
|
|
||||||
tin])
|
|
||||||
(when-let [tin-type (some-> vendor :vendor/legal-entity-tin-type :db/ident name)]
|
|
||||||
(com/pill {:class "text-xs font-medium"
|
|
||||||
:color :yellow}
|
|
||||||
(name tin-type)))])
|
|
||||||
(com/data-grid-cell
|
|
||||||
{:class "hidden lg:table-cell"}
|
|
||||||
(if (-> vendor :vendor/address :address/street1)
|
|
||||||
[:div
|
|
||||||
[:div (-> vendor :vendor/address :address/street1)] " "
|
|
||||||
[:div
|
|
||||||
(-> vendor :vendor/address :address/street2)] " "
|
|
||||||
[:div
|
|
||||||
(-> vendor :vendor/address :address/city) " "
|
|
||||||
(-> vendor :vendor/address :address/state) ","
|
|
||||||
(-> vendor :vendor/address :address/zip)]]
|
|
||||||
[:p.text-sm.italic.text-gray-400 "No address"]))
|
|
||||||
(com/data-grid-cell {}
|
|
||||||
(com/pill {:class "text-xs font-medium"
|
|
||||||
:color :primary}
|
|
||||||
"Paid $" (Math/round amount)))
|
|
||||||
(com/data-grid-right-stack-cell
|
|
||||||
{}
|
|
||||||
(com/icon-button {:hx-get (bidi/path-for ssr-routes/only-routes
|
|
||||||
:company-1099-vendor-dialog
|
|
||||||
:vendor-id (:db/id vendor))
|
|
||||||
:hx-target "#modal-holder"
|
|
||||||
:hx-swap "outerHTML"}
|
|
||||||
svg/pencil))))
|
|
||||||
(defn table* [{:keys [identity session query-params hx-query-params]} & {:keys [flash-id]}]
|
|
||||||
(let [start (or (some-> (or (get query-params "start") (get hx-query-params "start")) not-empty (Long/parseLong ))
|
|
||||||
0)
|
|
||||||
per-page (or (some-> (or (get query-params "per-page") (get hx-query-params "per-page")) not-empty (Long/parseLong ))
|
|
||||||
30)
|
|
||||||
companies (get-1099-companies identity session)
|
|
||||||
total (count companies)
|
|
||||||
companies (subvec companies (Math/min start total) (Math/min (+ start per-page) total))]
|
|
||||||
(com/data-grid-card {:id "vendor-table"
|
|
||||||
:title "1099 Vendor Info"
|
|
||||||
:entity-name "vendors"
|
|
||||||
:route :company-1099-vendor-table
|
|
||||||
:start start
|
|
||||||
:per-page per-page
|
|
||||||
:total total
|
|
||||||
:action-buttons [(com/button {:color :primary}
|
|
||||||
(com/button-icon {} svg/refresh)
|
|
||||||
"Add new product")
|
|
||||||
(com/button {:color :secondary}
|
|
||||||
(com/button-icon {} svg/refresh)
|
|
||||||
"Update stocks 1/250")
|
|
||||||
(com/icon-button {}
|
|
||||||
svg/upload)]
|
|
||||||
:rows (for [[client vendor amount] companies]
|
|
||||||
(row* {:client client
|
|
||||||
:vendor vendor
|
|
||||||
:amount amount
|
|
||||||
:flash? (= flash-id
|
|
||||||
(:db/id vendor))}))
|
|
||||||
:headers [(com/data-grid-header {} "Client")
|
|
||||||
(com/data-grid-header {} "Vendor Name")
|
|
||||||
(com/data-grid-header {:class "hidden md:table-cell"} "TIN")
|
|
||||||
(com/data-grid-header {:class "hidden lg:table-cell"} "Address")
|
|
||||||
(com/data-grid-header {})
|
|
||||||
(com/data-grid-header {})]})))
|
|
||||||
|
|
||||||
(defn vendor-save [{:keys [form-params identity route-params] :as request}]
|
[:a {:href (bidi/path-for ssr-routes/only-routes
|
||||||
@(dc/transact conn [(remove-nils
|
:company-1099)}
|
||||||
(-> (form-data->map form-params)
|
"1099 Vendor Info"]]
|
||||||
(assoc :db/id (Long/parseLong (:vendor-id route-params)))
|
:title "1099 Vendors"
|
||||||
(update :vendor/legal-entity-1099-type #(some->> % not-empty (keyword "legal-entity-1099-type")))
|
:entity-name "Vendors"
|
||||||
(update :vendor/legal-entity-tin-type #(some->> % not-empty (keyword "legal-entity-tin-type")))))])
|
:route :company-1099-vendor-table
|
||||||
(html-response
|
:action-buttons (fn [user]
|
||||||
(table* request :flash-id (Long/parseLong (:vendor-id route-params)))
|
nil)
|
||||||
:headers {"hx-trigger" "closeModal"}))
|
:row-buttons (fn [user e]
|
||||||
|
[(com/icon-button {:hx-get (str (bidi/path-for ssr-routes/only-routes
|
||||||
|
:company-1099-vendor-dialog
|
||||||
|
:vendor-id (:db/id (second e)))
|
||||||
|
"?"
|
||||||
|
(url/map->query {:client-id (:db/id (first e))}))
|
||||||
|
:hx-target "#modal-holder"
|
||||||
|
:hx-swap "outerHTML"}
|
||||||
|
svg/pencil)])
|
||||||
|
:headers [{:key "Client"
|
||||||
|
:name "Client"
|
||||||
|
:sort-key "client"
|
||||||
|
:render (comp :client/code first)}
|
||||||
|
{:key "vendor-name"
|
||||||
|
:name "Vendor Name"
|
||||||
|
:sort-key "vendor"
|
||||||
|
:render (fn [[_ vendor]]
|
||||||
|
[:div.flex.whitespace-nowrap.items-center.gap-4
|
||||||
|
[:div [:div (:vendor/name vendor)]
|
||||||
|
[:div.text-sm.text-gray-400
|
||||||
|
(or (-> vendor :vendor/legal-entity-name not-empty)
|
||||||
|
(str (-> vendor :vendor/legal-entity-first-name) " "
|
||||||
|
(-> vendor :vendor/legal-entity-middle-name) " "
|
||||||
|
(-> vendor :vendor/legal-entity-last-name)))]]
|
||||||
|
(when-let [t99-type (some-> vendor :vendor/legal-entity-1099-type :db/ident name)]
|
||||||
|
(com/pill
|
||||||
|
{:class "text-xs font-medium"
|
||||||
|
:color :primary}
|
||||||
|
(str/capitalize t99-type))
|
||||||
|
)])}
|
||||||
|
{:key "tin"
|
||||||
|
:name "TIN"
|
||||||
|
:sort-key "tin"
|
||||||
|
:show-starting "md"
|
||||||
|
:render (fn [[_ vendor]]
|
||||||
|
[:div.flex.gap-4
|
||||||
|
(when-let [tin (-> vendor :vendor/legal-entity-tin)]
|
||||||
|
[:span {:class "text-xs font-medium py-0.5 "}
|
||||||
|
tin])
|
||||||
|
(when-let [tin-type (some-> vendor :vendor/legal-entity-tin-type :db/ident name)]
|
||||||
|
(com/pill {:class "text-xs font-medium"
|
||||||
|
:color :yellow}
|
||||||
|
(name tin-type)))]
|
||||||
|
)}
|
||||||
|
{:key "address"
|
||||||
|
:name "Address"
|
||||||
|
:sort-key "address"
|
||||||
|
:show-starting "lg"
|
||||||
|
:render (fn [[_ vendor]]
|
||||||
|
(if (-> vendor :vendor/address :address/street1)
|
||||||
|
[:div
|
||||||
|
[:div (-> vendor :vendor/address :address/street1)] " "
|
||||||
|
[:div
|
||||||
|
(-> vendor :vendor/address :address/street2)] " "
|
||||||
|
[:div
|
||||||
|
(-> vendor :vendor/address :address/city) " "
|
||||||
|
(-> vendor :vendor/address :address/state) ","
|
||||||
|
(-> vendor :vendor/address :address/zip)]]
|
||||||
|
[:p.text-sm.italic.text-gray-400 "No address"]))}
|
||||||
|
{:key "paid"
|
||||||
|
:name "Paid"
|
||||||
|
:sort-key "paid"
|
||||||
|
:render (fn [[_ _ paid]]
|
||||||
|
(com/pill {:class "text-xs font-medium"
|
||||||
|
:color :primary}
|
||||||
|
"Paid $" (Math/round paid)))}]})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(def table* (partial helper/table* grid-page))
|
||||||
|
(def row* (partial helper/row* grid-page))
|
||||||
|
|
||||||
|
(defn vendor-save [{:keys [form-params identity route-params query-params] :as request}]
|
||||||
|
(let [client-id (Long/parseLong (get query-params "client-id"))
|
||||||
|
vendor-id (Long/parseLong (:vendor-id route-params))]
|
||||||
|
(assert-can-see-client identity client-id)
|
||||||
|
@(dc/transact conn [(remove-nils
|
||||||
|
(-> (form-data->map form-params)
|
||||||
|
(assoc :db/id (Long/parseLong (:vendor-id route-params)))
|
||||||
|
(update :vendor/legal-entity-1099-type #(some->> % not-empty (keyword "legal-entity-1099-type")))
|
||||||
|
(update :vendor/legal-entity-tin-type #(some->> % not-empty (keyword "legal-entity-tin-type")))))])
|
||||||
|
(html-response
|
||||||
|
|
||||||
|
(row* identity [(dc/pull (dc/db conn) [:db/id :client/code] client-id)
|
||||||
|
(dc/pull (dc/db conn) vendor-read vendor-id)
|
||||||
|
(sum-for-client-vendor client-id vendor-id)
|
||||||
|
] {:flash? true})
|
||||||
|
:headers {"hx-trigger" "closeModal"})))
|
||||||
|
|
||||||
(defn vendor-dialog [request]
|
(defn vendor-dialog [request]
|
||||||
(let [vendor (dc/pull (dc/db conn) '[* {:vendor/legal-entity-1099-type [:db/ident]
|
(let [vendor (dc/pull (dc/db conn) '[* {:vendor/legal-entity-1099-type [:db/ident]
|
||||||
@@ -229,8 +234,10 @@
|
|||||||
[:form {:hx-post (str (bidi/path-for ssr-routes/only-routes
|
[:form {:hx-post (str (bidi/path-for ssr-routes/only-routes
|
||||||
:company-1099-vendor-save
|
:company-1099-vendor-save
|
||||||
:request-method :post
|
:request-method :post
|
||||||
:vendor-id (Long/parseLong (:vendor-id (:params request)))))
|
:vendor-id (Long/parseLong (:vendor-id (:params request))))
|
||||||
:hx-target "#vendor-table"
|
"?"
|
||||||
|
(url/map->query {:client-id (:client-id (:params request))}))
|
||||||
|
:hx-target (format "#vendor-table tr[data-id=\"%d\"]" (:db/id vendor))
|
||||||
:hx-swap "outerHTML swap:300ms"}
|
:hx-swap "outerHTML swap:300ms"}
|
||||||
[:fieldset {:class "hx-disable"}
|
[:fieldset {:class "hx-disable"}
|
||||||
(com/modal-card
|
(com/modal-card
|
||||||
@@ -238,6 +245,7 @@
|
|||||||
[:div.flex [:div.p-2 "Vendor 1099 Info"] [:p.ml-2.rounded.bg-gray-200.p-2.dark:bg-gray-600 (:vendor/name vendor)]]
|
[:div.flex [:div.p-2 "Vendor 1099 Info"] [:p.ml-2.rounded.bg-gray-200.p-2.dark:bg-gray-600 (:vendor/name vendor)]]
|
||||||
[:div.space-y-6
|
[:div.space-y-6
|
||||||
[:div.grid.grid-cols-6.gap-4
|
[:div.grid.grid-cols-6.gap-4
|
||||||
|
|
||||||
[:h4.text-xl.border-b.col-span-6 "Address"]
|
[:h4.text-xl.border-b.col-span-6 "Address"]
|
||||||
[:div.col-span-6
|
[:div.col-span-6
|
||||||
(com/field {:label "Street 1"}
|
(com/field {:label "Street 1"}
|
||||||
@@ -312,20 +320,5 @@
|
|||||||
"Save")]]]
|
"Save")]]]
|
||||||
[:div])]]))))
|
[:div])]]))))
|
||||||
|
|
||||||
(defn vendor-table [request]
|
(def vendor-table (partial helper/table grid-page))
|
||||||
(html-response (table* request)
|
(def page (partial helper/page grid-page))
|
||||||
:headers {"hx-push-url" (str "?start=" (get (:query-params request) "start"))}))
|
|
||||||
|
|
||||||
(defn page [{:keys [identity matched-route] :as request}]
|
|
||||||
(base-page
|
|
||||||
request
|
|
||||||
(com/page {:nav (com/company-aside-nav)
|
|
||||||
:active-client (:client (:session request))
|
|
||||||
:identity (:identity request)}
|
|
||||||
(com/breadcrumbs {}
|
|
||||||
[:a {:href (bidi/path-for ssr-routes/only-routes
|
|
||||||
:company)} "My Company"]
|
|
||||||
[:a {:href (bidi/path-for ssr-routes/only-routes
|
|
||||||
:company-1099)} "1099 Vendor Info"])
|
|
||||||
(table* request))
|
|
||||||
nil))
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
(ns auto-ap.ssr.components.navbar
|
(ns auto-ap.ssr.components.navbar
|
||||||
(:require [auto-ap.ssr.components.buttons :refer [icon-button-]]
|
(:require [auto-ap.ssr.components.buttons :refer [icon-button-]]
|
||||||
|
[datomic.api :as dc]
|
||||||
|
[auto-ap.datomic :refer [conn pull-attr]]
|
||||||
[auto-ap.ssr.svg :as svg]
|
[auto-ap.ssr.svg :as svg]
|
||||||
[hiccup2.core :as hiccup]
|
[hiccup2.core :as hiccup]
|
||||||
[bidi.bidi :as bidi]
|
[bidi.bidi :as bidi]
|
||||||
@@ -92,17 +94,17 @@
|
|||||||
#_[:button {:id "theme-toggle", :data-tooltip-target "tooltip-toggle", :type "button", :class "text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5"
|
#_[:button {:id "theme-toggle", :data-tooltip-target "tooltip-toggle", :type "button", :class "text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 rounded-lg text-sm p-2.5"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
[:div {:id "tooltip-toggle", :role "tooltip", :class "absolute z-10 inline-block px-3 py-2 text-sm font-medium text-white transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm tooltip opacity-0 invisible", :style "position: absolute; inset: 0px auto auto 0px; margin: 0px; transform: translate(2326px, 63px);", :data-popper-placement "bottom"} [:img {:src "https://flowbite.com/docs/images/people/profile-picture-5.jpg"}]
|
[:div {:id "tooltip-toggle", :role "tooltip", :class "absolute z-10 inline-block px-3 py-2 text-sm font-medium text-white transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm tooltip opacity-0 invisible", :style "position: absolute; inset: 0px auto auto 0px; margin: 0px; transform: translate(2326px, 63px);", :data-popper-placement "bottom"} [:img {:src (pull-attr (dc/db conn) :user/profile-image-url (:db/id identity))}]
|
||||||
[:div {:class "tooltip-arrow", :data-popper-arrow "data-popper-arrow", :style "position: absolute; left: 0px; transform: translate(69px);"}]]
|
[:div {:class "tooltip-arrow", :data-popper-arrow "data-popper-arrow", :style "position: absolute; left: 0px; transform: translate(69px);"}]]
|
||||||
[:div {:class "flex items-center ml-3"}
|
[:div {:class "flex items-center ml-3"}
|
||||||
[:div
|
[:div
|
||||||
[:button {:type "button", :class "flex text-sm bg-gray-800 rounded-full focus:ring-4 focus:ring-gray-300 dark:focus:ring-gray-600", :id "user-menu-button-2", :aria-expanded "false", :data-dropdown-toggle "dropdown-2"}
|
[:button {:type "button", :class "flex text-sm bg-gray-800 rounded-full focus:ring-4 focus:ring-gray-300 dark:focus:ring-gray-600", :id "user-menu-button-2", :aria-expanded "false", :data-dropdown-toggle "dropdown-2"}
|
||||||
[:span {:class "sr-only"} "Open user menu"]
|
[:span {:class "sr-only"} "Open user menu"]
|
||||||
[:img {:class "w-8 h-8 rounded-full", :src "https://flowbite.com/docs/images/people/profile-picture-5.jpg", :alt "user photo"}]]]
|
[:img {:class "w-8 h-8 rounded-full", :src (pull-attr (dc/db conn) :user/profile-image-url (:db/id identity)) :alt "user photo"}]]]
|
||||||
[:div {:class "z-50 hidden my-4 text-base list-none bg-white divide-y divide-gray-100 rounded shadow dark:bg-gray-700 dark:divide-gray-600", :id "dropdown-2", :style "position: absolute; inset: 0px auto auto 0px; margin: 0px; transform: translate(2446px, 61px);", :data-popper-placement "bottom"}
|
[:div {:class "z-50 hidden my-4 text-base list-none bg-white divide-y divide-gray-100 rounded shadow dark:bg-gray-700 dark:divide-gray-600", :id "dropdown-2", :style "position: absolute; inset: 0px auto auto 0px; margin: 0px; transform: translate(2446px, 61px);", :data-popper-placement "bottom"}
|
||||||
[:div {:class "px-4 py-3", :role "none"}
|
[:div {:class "px-4 py-3", :role "none"}
|
||||||
[:p {:class "text-sm text-gray-900 dark:text-white", :role "none"} "Neil Sims"]
|
[:p {:class "text-sm text-gray-900 dark:text-white", :role "none"} (:user/name identity)]
|
||||||
[:p {:class "text-sm font-medium text-gray-900 truncate dark:text-gray-300", :role "none"} "neil.sims@flowbite.com"]]
|
[:p {:class "text-sm font-medium text-gray-900 truncate dark:text-gray-300", :role "none"} (pull-attr (dc/db conn) :user/email (:db/id identity))]]
|
||||||
[:ul {:class "py-1", :role "none"}
|
[:ul {:class "py-1", :role "none"}
|
||||||
[:li
|
[:li
|
||||||
[:a {:href "#", :class "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white", :role "menuitem"} "Dashboard"]]
|
[:a {:href "#", :class "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white", :role "menuitem"} "Dashboard"]]
|
||||||
|
|||||||
@@ -12,7 +12,9 @@
|
|||||||
|
|
||||||
(defn row* [gridspec user entity {:keys [flash? delete-after-settle?] :as options}]
|
(defn row* [gridspec user entity {:keys [flash? delete-after-settle?] :as options}]
|
||||||
(let [cells (mapv (fn [header]
|
(let [cells (mapv (fn [header]
|
||||||
(com/data-grid-cell {}
|
(com/data-grid-cell {:class (if-let [show-starting (:show-starting header)]
|
||||||
|
(format "hidden %s:table-cell" show-starting)
|
||||||
|
(:class header))}
|
||||||
((:render header) entity)))
|
((:render header) entity)))
|
||||||
(:headers gridspec))
|
(:headers gridspec))
|
||||||
cells (conj cells (com/data-grid-right-stack-cell {}
|
cells (conj cells (com/data-grid-right-stack-cell {}
|
||||||
@@ -24,7 +26,8 @@
|
|||||||
"live-added")
|
"live-added")
|
||||||
"_" (hiccup/raw (when delete-after-settle?
|
"_" (hiccup/raw (when delete-after-settle?
|
||||||
" on htmx:afterSettle wait 400ms then remove me"))
|
" on htmx:afterSettle wait 400ms then remove me"))
|
||||||
}
|
|
||||||
|
:data-id ((:id-fn gridspec) entity)}
|
||||||
cells)))
|
cells)))
|
||||||
|
|
||||||
(defn sort-icon [sort key]
|
(defn sort-icon [sort key]
|
||||||
@@ -48,7 +51,7 @@
|
|||||||
))
|
))
|
||||||
"default sort"))
|
"default sort"))
|
||||||
|
|
||||||
(defn table* [grid-spec user {:keys [start per-page client flash-id sort]}]
|
(defn table* [grid-spec user {:keys [start per-page client flash-id sort request]}]
|
||||||
(let [start (or start 0)
|
(let [start (or start 0)
|
||||||
per-page (or per-page 30)
|
per-page (or per-page 30)
|
||||||
[entities total] ((:fetch-page grid-spec)
|
[entities total] ((:fetch-page grid-spec)
|
||||||
@@ -56,7 +59,8 @@
|
|||||||
{:start start
|
{:start start
|
||||||
:per-page per-page
|
:per-page per-page
|
||||||
:client-id (:db/id client)
|
:client-id (:db/id client)
|
||||||
:sort sort})]
|
:sort sort
|
||||||
|
:request request})]
|
||||||
(com/data-grid-card {:id (:id grid-spec)
|
(com/data-grid-card {:id (:id grid-spec)
|
||||||
:title (:title grid-spec)
|
:title (:title grid-spec)
|
||||||
:route (:route grid-spec)
|
:route (:route grid-spec)
|
||||||
|
|||||||
Reference in New Issue
Block a user