80 lines
1.9 KiB
Clojure
80 lines
1.9 KiB
Clojure
(ns auto-ap.forms
|
|
(:require [re-frame.core :as re-frame]
|
|
[auto-ap.views.utils :refer [dispatch-event]]))
|
|
|
|
|
|
(re-frame/reg-sub
|
|
::form
|
|
(fn [db [_ x]]
|
|
(-> db ::forms x)))
|
|
|
|
|
|
(re-frame/reg-sub
|
|
::is-loading?
|
|
(fn [db [_ x]]
|
|
(if (#{"loading" :loading} (get-in db [::forms x :status]) )
|
|
true
|
|
false)))
|
|
|
|
(re-frame/reg-sub
|
|
::loading-class
|
|
(fn [db [_ x]]
|
|
(if (#{"loading" :loading} (get-in db [::forms x :status]) )
|
|
"is-loading"
|
|
"")))
|
|
|
|
(defn start-form [db form data]
|
|
(assoc-in db [::forms form] {:error nil
|
|
:active? true
|
|
:id (random-uuid)
|
|
:status nil
|
|
:data data}))
|
|
|
|
(defn saved-form [db form data]
|
|
(update-in db [::forms form]
|
|
assoc :error nil :status nil :data data))
|
|
|
|
(defn stop-form [db form]
|
|
(update db ::forms dissoc form))
|
|
|
|
(re-frame/reg-event-db
|
|
::form-closing
|
|
(fn [db [_ f]]
|
|
(-> db
|
|
(stop-form f))))
|
|
|
|
(defn in-form
|
|
[form-name]
|
|
(re-frame/path [::forms form-name]))
|
|
|
|
(re-frame/reg-event-db
|
|
::change
|
|
(fn [db [_ form & path-pairs]]
|
|
(println path-pairs)
|
|
(reduce
|
|
(fn [db [path value]]
|
|
(assoc-in db (into [::forms form :data] path) value))
|
|
db
|
|
(partition 2 path-pairs))))
|
|
|
|
(re-frame/reg-event-db
|
|
::save-error
|
|
(fn [db [_ form result]]
|
|
(-> db
|
|
(assoc-in [::forms form :status] :error)
|
|
(assoc-in [::forms form :error] (or (:message (first result))
|
|
result)))))
|
|
|
|
(defn side-bar-form [{:keys [form]} children]
|
|
[:div [:a.delete.is-pulled-right {:on-click (dispatch-event [::form-closing form])}] [:div children]])
|
|
|
|
(defn loading [db id]
|
|
(-> db
|
|
(assoc-in [::forms id :status] :loading)
|
|
(assoc-in [::forms id :error] nil)))
|
|
|
|
(defn save-succeeded [db id]
|
|
(-> db
|
|
(assoc-in [::forms id :status] nil)
|
|
(assoc-in [::forms id :error] nil)))
|