Add grubs on enter or click

This commit is contained in:
Nicholas Kariniemi 2014-06-29 23:26:31 +03:00
parent b1d1f99231
commit fe6514a5f5
2 changed files with 63 additions and 34 deletions

View file

@ -11,7 +11,6 @@
:default :unknown-event) :default :unknown-event)
(defmethod handle-grub-event :unknown-event [event grubs] (defmethod handle-grub-event :unknown-event [event grubs]
(logs "Cannot handle unknown event:" event)
grubs) grubs)
(defn new-grub [id grub completed] (defn new-grub [id grub completed]
@ -49,7 +48,6 @@
:default :unknown-event) :default :unknown-event)
(defmethod handle-recipe-event :unknown-event [event recipes] (defmethod handle-recipe-event :unknown-event [event recipes]
(logs "Cannot handle unknown event:" event)
recipes) recipes)
(defn new-recipe [id name grubs] (defn new-recipe [id name grubs]
@ -69,18 +67,14 @@
(assoc-in [(:id event) :name] (:name event)) (assoc-in [(:id event) :name] (:name event))
(assoc-in [(:id event) :grubs] (:grubs event)))) (assoc-in [(:id event) :grubs] (:grubs event))))
(defn update-state-and-render [remote-chan] (defn update-state-and-render [remote]
(let [out (chan)] (go-loop [state default-app-state]
(go-loop [state default-app-state] (let [event (<! (a/merge [remote view/out]))
(let [event (<! remote-chan) new-grubs (handle-grub-event event (:grubs state))
new-grubs (handle-grub-event event (:grubs state)) new-recipes (handle-recipe-event event (:recipes state))
new-recipes (handle-recipe-event event (:recipes state)) new-state (assoc state
new-state (assoc state :grubs new-grubs
:grubs new-grubs :recipes new-recipes)]
:recipes new-recipes)] (view/render-app new-state)
(logs "event:" event) (recur new-state)))
(logs "new-state") view/out)
(logs new-state)
(view/render-app new-state)
(recur new-state)))
out))

View file

@ -1,14 +1,18 @@
(ns grub.view (ns grub.view
(:require [om.core :as om :include-macros true] (:require [om.core :as om :include-macros true]
[sablono.core :as html :refer-macros [html]]) [sablono.core :as html :refer-macros [html]]
(:require-macros [grub.macros :refer [log logs]])) [cljs.core.async :as a :refer [<! put! chan]])
(:require-macros [grub.macros :refer [log logs]]
[cljs.core.async.macros :refer [go go-loop]]))
(def add (chan))
(def out add)
(defn recipe-view [recipe owner] (defn recipe-view [recipe owner]
(reify (reify
om/IRender om/IRender
(render [this] (render [this]
(let [{:keys [id name grubs]} recipe] (let [{:keys [id name grubs]} recipe]
(log "render recipe view: " recipe)
(html (html
[:div.panel.panel-default.recipe-panel [:div.panel.panel-default.recipe-panel
{:id id} {:id id}
@ -79,23 +83,51 @@
(defn sort-grubs [grubs] (defn sort-grubs [grubs]
(sort-by (juxt :completed get-grub-ingredient) (vals grubs))) (sort-by (juxt :completed get-grub-ingredient) (vals grubs)))
(defn add-grub-event [grub]
{:event :add-grub
:id (str "grub-" (.now js/Date))
:grub grub
:completed false})
(defn add-grub [add owner]
(let [new-grub (.-value (om/get-node owner :new-grub))]
(when (not (empty? new-grub))
(put! add (add-grub-event new-grub)))))
(defn enter-pressed? [event]
(let [enter-keycode 13]
(= (.-which event) enter-keycode)))
(defn add-grub-on-enter [add owner event]
(when (enter-pressed? event)
(add-grub add owner)))
(defn grubs-view [grubs owner] (defn grubs-view [grubs owner]
(reify (reify
om/IRender om/IRender
(render [this] (render [this]
(html (let [add (:add (om/get-shared owner))]
[:div (html
[:h3 "Grub List"] [:div
[:div.input-group.add-grub-input-form [:h3 "Grub List"]
[:span.input-group-btn [:div.input-group.add-grub-input-form
[:input.form-control#add-grub-input {:type "text" :placeholder "2 grubs"}]] [:span.input-group-btn
[:button.btn.btn-primary {:id "add-grub-btn" :type "button"} "Add"]] [:input.form-control#add-grub-input
[:ul#grub-list.list-group {:ref :new-grub
(for [grub (sort-grubs grubs)] :type "text"
(om/build grub-view grub))] :placeholder "2 grubs"
[:button.btn.hidden.pull-right :on-key-up #(add-grub-on-enter add owner %)}]]
{:id "clear-all-btn" :type "button"} [:button.btn.btn-primary
"Clear all"]])))) {:id "add-grub-btn"
:type "button"
:on-click #(add-grub add owner)}
"Add"]]
[:ul#grub-list.list-group
(for [grub (sort-grubs grubs)]
(om/build grub-view grub))]
[:button.btn.hidden.pull-right
{:id "clear-all-btn" :type "button"}
"Clear all"]])))))
(defn app-view [state owner] (defn app-view [state owner]
(reify (reify
@ -110,4 +142,7 @@
(om/build recipes-view (:recipes state))]]])))) (om/build recipes-view (:recipes state))]]]))))
(defn render-app [state] (defn render-app [state]
(om/root app-view state {:target (.getElementById js/document "container")})) (om/root app-view
state
{:target (.getElementById js/document "container")
:shared {:add add}}))