Separate recipe list, recipe item
This commit is contained in:
parent
b7dd1ba94d
commit
9f01bd3be9
3 changed files with 102 additions and 92 deletions
|
@ -4,7 +4,7 @@
|
||||||
[cljs.core.async :as a :refer [<! put! chan]]
|
[cljs.core.async :as a :refer [<! put! chan]]
|
||||||
[grub.view.dom :as dom]
|
[grub.view.dom :as dom]
|
||||||
[grub.view.grub-list :as grub-list]
|
[grub.view.grub-list :as grub-list]
|
||||||
[grub.view.recipe :as recipe])
|
[grub.view.recipe-list :as recipe-list])
|
||||||
(:require-macros [grub.macros :refer [log logs]]
|
(:require-macros [grub.macros :refer [log logs]]
|
||||||
[cljs.core.async.macros :refer [go go-loop]]))
|
[cljs.core.async.macros :refer [go go-loop]]))
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
[:div.col-sm-6.leftmost-column
|
[:div.col-sm-6.leftmost-column
|
||||||
(om/build grub-list/view (:grubs props))]
|
(om/build grub-list/view (:grubs props))]
|
||||||
[:div.col-sm-6
|
[:div.col-sm-6
|
||||||
(om/build recipe/view (:recipes props))]]]))
|
(om/build recipe-list/view (:recipes props))]]]))
|
||||||
om/IWillMount
|
om/IWillMount
|
||||||
(will-mount [_]
|
(will-mount [_]
|
||||||
(let [>events (om/get-shared owner :>events)]
|
(let [>events (om/get-shared owner :>events)]
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
(om/set-state! owner :editing false)
|
(om/set-state! owner :editing false)
|
||||||
(put! ch (update-event id name grubs))))
|
(put! ch (update-event id name grubs))))
|
||||||
|
|
||||||
(defn recipe-view [{:keys [id] :as props} owner]
|
(defn view [{:keys [id] :as props} owner]
|
||||||
(reify
|
(reify
|
||||||
om/IInitState
|
om/IInitState
|
||||||
(init-state [_]
|
(init-state [_]
|
||||||
|
@ -103,92 +103,3 @@
|
||||||
(a/close! subscriber))
|
(a/close! subscriber))
|
||||||
(om/set-state! owner :editing false)
|
(om/set-state! owner :editing false)
|
||||||
(recur))))))
|
(recur))))))
|
||||||
|
|
||||||
(defn add-recipe [ch name grubs owner]
|
|
||||||
(when (and (not (empty? name))
|
|
||||||
(not (empty? grubs)))
|
|
||||||
(om/set-state! owner :new-recipe-name "")
|
|
||||||
(om/set-state! owner :new-recipe-grubs "")
|
|
||||||
(om/set-state! owner :editing false)
|
|
||||||
(put! ch (add-event name grubs))))
|
|
||||||
|
|
||||||
(defn new-recipe-view [_ owner]
|
|
||||||
(reify
|
|
||||||
om/IInitState
|
|
||||||
(init-state [_]
|
|
||||||
(let [publisher (chan)]
|
|
||||||
{:editing false
|
|
||||||
:>local-events publisher
|
|
||||||
:<local-events (a/pub publisher identity)
|
|
||||||
:new-recipe-name ""
|
|
||||||
:new-recipe-grubs ""}))
|
|
||||||
|
|
||||||
om/IRenderState
|
|
||||||
(render-state [this {:keys [editing >local-events new-recipe-name new-recipe-grubs]}]
|
|
||||||
(let [add (om/get-shared owner :recipe-add)]
|
|
||||||
(html
|
|
||||||
[:div.panel.panel-default.recipe-panel
|
|
||||||
{:on-click #(put! >local-events :click)}
|
|
||||||
[:div.panel-heading.recipe-header
|
|
||||||
[:input.form-control.recipe-header-input
|
|
||||||
{:id "new-recipe-name"
|
|
||||||
:type "text"
|
|
||||||
:placeholder "New recipe"
|
|
||||||
:value new-recipe-name
|
|
||||||
:on-change #(om/set-state! owner :new-recipe-name (dom/event-val %))}]]
|
|
||||||
[:div.panel-body.recipe-grubs
|
|
||||||
{:class (when (not editing) "hidden")}
|
|
||||||
[:textarea.form-control.recipe-grubs-input
|
|
||||||
{:id "new-recipe-grubs"
|
|
||||||
:rows 3
|
|
||||||
:placeholder "Recipe ingredients"
|
|
||||||
:value new-recipe-grubs
|
|
||||||
:on-change #(om/set-state! owner :new-recipe-grubs (dom/event-val %))}]
|
|
||||||
[:button.btn.btn-primary.pull-right.recipe-btn.recipe-done-btn
|
|
||||||
{:type "button"
|
|
||||||
:on-click #(put! >local-events :done)}
|
|
||||||
"Done"]]])))
|
|
||||||
|
|
||||||
om/IWillMount
|
|
||||||
(will-mount [_]
|
|
||||||
(let [<local-events (om/get-state owner :<local-events)
|
|
||||||
<events (om/get-shared owner :<events)
|
|
||||||
add (om/get-shared owner :recipe-add)
|
|
||||||
]
|
|
||||||
(go-loop []
|
|
||||||
(let [subscriber (chan)]
|
|
||||||
(a/sub <local-events :click subscriber)
|
|
||||||
(<! subscriber)
|
|
||||||
(a/unsub <local-events :click subscriber)
|
|
||||||
(a/close! subscriber))
|
|
||||||
(om/set-state! owner :editing true)
|
|
||||||
(let [subscriber (chan)]
|
|
||||||
(a/sub <events :body-mousedown subscriber)
|
|
||||||
(a/sub <local-events :done subscriber)
|
|
||||||
(loop []
|
|
||||||
(let [event (<! subscriber)]
|
|
||||||
(if-not (and (= (:type event) :body-mousedown)
|
|
||||||
(dom/click-on-self? (:event event) (om/get-node owner)))
|
|
||||||
(when (= event :done)
|
|
||||||
(add-recipe add
|
|
||||||
(om/get-state owner :new-recipe-name)
|
|
||||||
(om/get-state owner :new-recipe-grubs)
|
|
||||||
owner))
|
|
||||||
(recur))))
|
|
||||||
(a/unsub <events :body-mousedown subscriber)
|
|
||||||
(a/unsub <local-events :done subscriber)
|
|
||||||
(a/close! subscriber))
|
|
||||||
(om/set-state! owner :editing false)
|
|
||||||
(recur))))))
|
|
||||||
|
|
||||||
(defn view [recipes owner]
|
|
||||||
(reify
|
|
||||||
om/IRender
|
|
||||||
(render [this]
|
|
||||||
(html
|
|
||||||
[:div
|
|
||||||
[:h3.recipes-title "Recipes"]
|
|
||||||
(om/build new-recipe-view recipes)
|
|
||||||
[:ul#recipe-list.list-group.recipe-list
|
|
||||||
(for [recipe (vals recipes)]
|
|
||||||
(om/build recipe-view recipe {:key :id}))]]))))
|
|
||||||
|
|
99
src/cljs/grub/view/recipe_list.cljs
Normal file
99
src/cljs/grub/view/recipe_list.cljs
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
(ns grub.view.recipe-list
|
||||||
|
(:require [om.core :as om :include-macros true]
|
||||||
|
[sablono.core :as html :refer-macros [html]]
|
||||||
|
[cljs.core.async :as a :refer [<! put! chan]]
|
||||||
|
[cljs-uuid.core :as uuid]
|
||||||
|
[grub.view.dom :as dom]
|
||||||
|
[grub.view.grub :as grub-view]
|
||||||
|
[grub.view.recipe :as recipe])
|
||||||
|
(:require-macros [grub.macros :refer [log logs]]
|
||||||
|
[cljs.core.async.macros :refer [go go-loop]]))
|
||||||
|
|
||||||
|
(defn add-recipe [ch name grubs owner]
|
||||||
|
(when (and (not (empty? name))
|
||||||
|
(not (empty? grubs)))
|
||||||
|
(om/set-state! owner :new-recipe-name "")
|
||||||
|
(om/set-state! owner :new-recipe-grubs "")
|
||||||
|
(om/set-state! owner :editing false)
|
||||||
|
(put! ch (recipe/add-event name grubs))))
|
||||||
|
|
||||||
|
(defn new-recipe-view [_ owner]
|
||||||
|
(reify
|
||||||
|
om/IInitState
|
||||||
|
(init-state [_]
|
||||||
|
(let [publisher (chan)]
|
||||||
|
{:editing false
|
||||||
|
:>local-events publisher
|
||||||
|
:<local-events (a/pub publisher identity)
|
||||||
|
:new-recipe-name ""
|
||||||
|
:new-recipe-grubs ""}))
|
||||||
|
|
||||||
|
om/IRenderState
|
||||||
|
(render-state [this {:keys [editing >local-events new-recipe-name new-recipe-grubs]}]
|
||||||
|
(let [add (om/get-shared owner :recipe-add)]
|
||||||
|
(html
|
||||||
|
[:div.panel.panel-default.recipe-panel
|
||||||
|
{:on-click #(put! >local-events :click)}
|
||||||
|
[:div.panel-heading.recipe-header
|
||||||
|
[:input.form-control.recipe-header-input
|
||||||
|
{:id "new-recipe-name"
|
||||||
|
:type "text"
|
||||||
|
:placeholder "New recipe"
|
||||||
|
:value new-recipe-name
|
||||||
|
:on-change #(om/set-state! owner :new-recipe-name (dom/event-val %))}]]
|
||||||
|
[:div.panel-body.recipe-grubs
|
||||||
|
{:class (when (not editing) "hidden")}
|
||||||
|
[:textarea.form-control.recipe-grubs-input
|
||||||
|
{:id "new-recipe-grubs"
|
||||||
|
:rows 3
|
||||||
|
:placeholder "Recipe ingredients"
|
||||||
|
:value new-recipe-grubs
|
||||||
|
:on-change #(om/set-state! owner :new-recipe-grubs (dom/event-val %))}]
|
||||||
|
[:button.btn.btn-primary.pull-right.recipe-btn.recipe-done-btn
|
||||||
|
{:type "button"
|
||||||
|
:on-click #(put! >local-events :done)}
|
||||||
|
"Done"]]])))
|
||||||
|
|
||||||
|
om/IWillMount
|
||||||
|
(will-mount [_]
|
||||||
|
(let [<local-events (om/get-state owner :<local-events)
|
||||||
|
<events (om/get-shared owner :<events)
|
||||||
|
add (om/get-shared owner :recipe-add)
|
||||||
|
]
|
||||||
|
(go-loop []
|
||||||
|
(let [subscriber (chan)]
|
||||||
|
(a/sub <local-events :click subscriber)
|
||||||
|
(<! subscriber)
|
||||||
|
(a/unsub <local-events :click subscriber)
|
||||||
|
(a/close! subscriber))
|
||||||
|
(om/set-state! owner :editing true)
|
||||||
|
(let [subscriber (chan)]
|
||||||
|
(a/sub <events :body-mousedown subscriber)
|
||||||
|
(a/sub <local-events :done subscriber)
|
||||||
|
(loop []
|
||||||
|
(let [event (<! subscriber)]
|
||||||
|
(if-not (and (= (:type event) :body-mousedown)
|
||||||
|
(dom/click-on-self? (:event event) (om/get-node owner)))
|
||||||
|
(when (= event :done)
|
||||||
|
(add-recipe add
|
||||||
|
(om/get-state owner :new-recipe-name)
|
||||||
|
(om/get-state owner :new-recipe-grubs)
|
||||||
|
owner))
|
||||||
|
(recur))))
|
||||||
|
(a/unsub <events :body-mousedown subscriber)
|
||||||
|
(a/unsub <local-events :done subscriber)
|
||||||
|
(a/close! subscriber))
|
||||||
|
(om/set-state! owner :editing false)
|
||||||
|
(recur))))))
|
||||||
|
|
||||||
|
(defn view [recipes owner]
|
||||||
|
(reify
|
||||||
|
om/IRender
|
||||||
|
(render [this]
|
||||||
|
(html
|
||||||
|
[:div
|
||||||
|
[:h3.recipes-title "Recipes"]
|
||||||
|
(om/build new-recipe-view recipes)
|
||||||
|
[:ul#recipe-list.list-group.recipe-list
|
||||||
|
(for [recipe (vals recipes)]
|
||||||
|
(om/build recipe/view recipe {:key :id}))]]))))
|
Loading…
Add table
Reference in a new issue