Makes multiple client selection somewhat possible via graphql.

This commit is contained in:
2023-08-31 13:05:06 -07:00
parent 9c472dfc8e
commit 1d82ec29e0
29 changed files with 274 additions and 139 deletions

View File

@@ -85,6 +85,7 @@
(let [headers (if token
(assoc headers "Authorization" (str "Token " token))
headers)
headers (assoc headers "x-clients" (pr-str (:selected-clients @re-frame.db/app-db)))
response (<! (http/request {:method method
:body body
:headers headers
@@ -155,7 +156,7 @@
(re-frame/reg-fx
:graphql
(fn [{:keys [query on-success on-error token variables query-obj owns-state]}]
(fn [{:keys [query on-success on-error token variables query-obj owns-state db]}]
(go
(when (:multi owns-state)
(re-frame/dispatch-sync [::status/loading-multi (:multi owns-state) (:which owns-state)]))
@@ -165,6 +166,7 @@
(let [headers (if token
{"Authorization" (str "Token " token)}
{})
headers (assoc headers "x-clients" (pr-str (:selected-clients @re-frame.db/app-db)))
on-success (if (fn? on-success)
on-success
(fn [result]

View File

@@ -10,7 +10,8 @@
[goog.crypt.base64 :as b64]
[re-frame.core :as re-frame]
[auto-ap.ssr-routes :as ssr-routes]
[cemerick.url :as url]))
[cemerick.url :as url]
[auto-ap.subs :as subs]))
(defn jwt->data [token]
(js->clj (.parse js/JSON (b64/decodeString (second (str/split token #"\." ))))))
@@ -127,15 +128,36 @@
::swap-client
[with-user]
(fn [{:keys [db user]} [_ client]]
(.setItem js/localStorage "last-client-id" (:id client))
{:db (assoc db :client (:id client))
:http {:token user
:method :put
:uri (str (bidi/path-for ssr-routes/only-routes
:active-client
:request-method :put)
"?"
(url/map->query {:search-client (:id client)}))}}))
(let [client-identifier (or (:id client) client)]
(when (:id client)
(.setItem js/localStorage "last-client-id" (:id client)))
(.setItem js/localStorage "last-selected-clients"
(condp = client-identifier
:all
:all
:mine
:mine
(pr-str [(js/parseInt (:id client))])))
{:db (assoc db :client (:id client)
:selected-clients
(condp = client-identifier
:all
:all
:mine
:mine
[(js/parseInt (:id client))]))
:http {:token user
:method :put
:uri (str (bidi/path-for ssr-routes/only-routes
:active-client
:request-method :put)
"?"
(url/map->query {:search-client client-identifier}))}})))
(re-frame/reg-event-fx
::set-active-route

View File

@@ -23,6 +23,28 @@
(when (:user db)
(sort-by :name (vals (:clients db))))))
(re-frame/reg-sub
::selected-clients
(fn [db]
(let [selected-clients (:selected-clients db)]
(cond (= :mine selected-clients)
(sort-by :name
(:user/clients (parse-jwt (:user db))))
(or (and (sequential? selected-clients)
(empty? selected-clients))
(= :all selected-clients)
(nil? selected-clients))
(sort-by :name
(vals
(:clients db)))
(sequential? selected-clients)
selected-clients
:else
nil))))
(re-frame/reg-sub
::client-refs
:<- [::clients]

View File

@@ -93,17 +93,29 @@
(defn client-dropdown []
(let [client (re-frame/subscribe [::subs/client])
matching-clients @(re-frame/subscribe [::matching-clients])]
clients @(re-frame/subscribe [::subs/selected-clients])
matching-clients @(re-frame/subscribe [::matching-clients])
user (re-frame/subscribe [::subs/user])]
[navbar-drop-down {:header (str "Company: " (if @client (:name @client)
"All"))
:id ::select-client}
[navbar-drop-down {:header (str "Company: " (cond @client
(:name @client)
:else
(str (count (or clients [])) " Clients")))
:id ::select-client}
[:div
[:a {:class "navbar-item"
:on-click (fn []
(re-frame/dispatch [::events/toggle-menu ::select-client])
(re-frame/dispatch [::forms/form-closing ::client-search])
(re-frame/dispatch [::events/swap-client nil]))} "All" ]
(re-frame/dispatch [::events/swap-client :all]))} "All" ]
(when (= "admin" (:user/role @user))
[:a {:class "navbar-item"
:on-click (fn []
(re-frame/dispatch [::events/toggle-menu ::select-client])
(re-frame/dispatch [::forms/form-closing ::client-search])
(re-frame/dispatch [::events/swap-client :mine]))} "Mine" ])
[:hr {:class "navbar-divider"}]
[form-builder/builder {:id ::client-search
:submit-event [::client-searched]}

View File

@@ -75,17 +75,18 @@
[:admin "Admin"]]
:allow-nil? false
:keywordize? true}]]
(when (#{:user :manager :power_user} (:role data))
[form-builder/field-v2 {:field :clients}
"Client"
[com/multi-field-v2 {:template [[form-builder/raw-field-v2 {:field :client}
[com/entity-typeahead
{:entities clients
:entity->text :name
:style {:width "13em"}}]]]
:key-fn :id
:schema [:sequential client-schema]
:new-text "Grant access to client"}]])
[form-builder/field-v2 {:field :clients}
(if (= :admin (:role data))
"Client Assignments"
"Client")
[com/multi-field-v2 {:template [[form-builder/raw-field-v2 {:field :client}
[com/entity-typeahead
{:entities clients
:entity->text :name
:style {:width "13em"}}]]]
:key-fn :id
:schema [:sequential client-schema]
:new-text "Grant access to client"}]]
[form-builder/hidden-submit-button]]]))