(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)))