Files
integreat/src/cljs/auto_ap/views/pages/data_page.cljs

190 lines
5.0 KiB
Clojure

(ns auto-ap.views.pages.data-page
(:require [auto-ap.status :as status]
[auto-ap.subs :as subs]
[auto-ap.utils :refer [deep-merge replace-by]]
[re-frame.core :as re-frame]))
(re-frame/reg-sub
::checked
(fn [db [_ id]]
(get-in db [::checked id] {})))
(re-frame/reg-event-db
::toggle-check
(fn [db [_ id new]]
(assoc-in db [::checked id] new)))
(re-frame/reg-event-db
::remove-check
(fn [db [_ id to-remove]]
(update-in db
[::checked id]
(fn [checked]
(let [checked (or checked {})]
(dissoc checked to-remove))))))
(re-frame/reg-sub
::checked-set
(fn [db [_ id]]
(keys (get-in db [::checked id] {}))))
(re-frame/reg-event-db
::reset-checked
(fn [db [_ id]]
(update db ::checked dissoc id)))
(re-frame/reg-event-db
::updated-entity
(fn [db [_ id entity]]
(update-in db
[::data id :data]
replace-by :id (update entity :class #(or % "live-added")))))
(re-frame/reg-event-db
::deleted-entity
(fn [db [_ id entity]]
(update-in db
[::data id :data]
replace-by :id (update entity :class #(or % "live-removed")))))
(re-frame/reg-sub
::table-params
(fn [db [_ which]]
(get-in db [::table-params which])))
(re-frame/reg-sub
::additional-params
(fn [db [_ which]]
(get-in db [::additional-params which])))
(re-frame/reg-sub
::params
(fn [[_ id]]
[ #_(re-frame/subscribe [::subs/active-page])
(re-frame/subscribe [::subs/client])
(re-frame/subscribe [::settled-filters id])
(re-frame/subscribe [::table-params id])
(re-frame/subscribe [::additional-params id])])
(fn [[client filters table-params additional-params]]
(let [query-params (auto-ap.views.utils/query-params)]
(cond-> {}
client (assoc :client-id (:id client))
(seq query-params) (merge query-params)
(seq filters) (merge filters)
(seq table-params) (merge table-params)
(seq additional-params) (merge additional-params)))))
(re-frame/reg-event-fx
::received
(fn [{:keys [db]} [_ id data]]
(let [uri-params (dissoc @(re-frame/subscribe [::params id]) :client-id)
current-uri-params (auto-ap.views.utils/query-params)]
(cond-> {:db (-> db (assoc-in [::data id] data)
(assoc :query-params uri-params))}
(not= uri-params current-uri-params) (assoc :set-uri-params uri-params)))))
(re-frame/reg-event-db
::dispose
(fn [db [_ id]]
(-> db
(update ::data dissoc id)
(update ::checked dissoc id)
(update ::table-params dissoc id)
(update ::filters dissoc id)
(update ::settled-filters dissoc id))))
(defn dispose-all [db]
(-> db
(dissoc ::data ::checked ::table-params ::filters ::settled-filters)))
(re-frame/reg-sub
::data
(fn [db [_ id]]
(get-in db [::data id])))
(re-frame/reg-sub
::page
(fn [[_ id]]
[(re-frame/subscribe [::data id])
(re-frame/subscribe [::status/single [::page id]])
(re-frame/subscribe [::checked id])
(re-frame/subscribe [::checked-set id])
(re-frame/subscribe [::params id])
(re-frame/subscribe [::table-params id])
(re-frame/subscribe [::filters id])])
(fn [[data status checked checked-set params table-params filters] [_ id]]
{:id id
:data data
:status status
:checked checked
:checked-set checked-set
:params params
:filters filters
:table-params table-params}))
(defn in-page-entities [which]
(re-frame/path [::data which :data ] ))
(re-frame/reg-event-fx
::table-params-changed
(fn [{:keys [db]} [_ which params :as z]]
{:db (update-in db [::table-params which] merge params)}))
(re-frame/reg-event-fx
::additional-params-changed
(fn [{:keys [db]} [_ which params :as z]]
{:db (-> db
(update-in [::additional-params which] merge params)
(assoc-in [::table-params which :start] 0))}))
(re-frame/reg-sub
::specific-filters
(fn [db [_ id]]
(get-in db [::filters id])))
(re-frame/reg-sub
::filters
(fn [[_ id]]
[(re-frame/subscribe [::specific-filters id])
(re-frame/subscribe [::subs/query-params])])
(fn [[specific-filters query-params] ]
(deep-merge query-params (or specific-filters {}) )))
(re-frame/reg-sub
::filter
(fn [[_ id]]
[(re-frame/subscribe [::filters id])])
(fn [[filters] [_ id which]]
(get filters which)))
(re-frame/reg-event-fx
::filters-settled
(fn [{:keys [db]} [_ id]]
{:db (-> db
(assoc-in [::settled-filters id] @(re-frame/subscribe [::filters id]))
(assoc-in [::table-params id :start] 0))}))
(re-frame/reg-sub
::settled-filters
(fn [db [_ id]]
(get-in db [::settled-filters id])))
(re-frame/reg-event-fx
::filter-changed
(fn [{:keys [db]} [_ id & params]]
(let [[a b c] params
[which val] (if (= 3 (count params))
[(into [a] b) c]
[[a] b])]
{:db (-> db
(assoc-in (into [::filters id] which) val))
:dispatch-debounce
{:event [::filters-settled id]
:time 800
:key [::filters id]}})))