From ffab08035641027baa9ddf78b22f2fe1aafd93ae Mon Sep 17 00:00:00 2001 From: Moritz Ulrich Date: Thu, 5 Mar 2015 13:21:05 +0100 Subject: [PATCH] Sidebar: use nom.ui/defcomponentmethod. --- .dir-locals.el | 5 +- src-cljs/pepa/components/sidebar.cljs | 79 ++++++++++++--------------- 2 files changed, 38 insertions(+), 46 deletions(-) diff --git a/.dir-locals.el b/.dir-locals.el index cbeb3cd..5562078 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -7,5 +7,8 @@ (eval put-clojure-indent 'let->> 1) (eval put 'defcomponent 'clojure-backtracking-indent '(4 (2))) - (eval put 'ui/defcomponent 'clojure-backtracking-indent '(4 (2))))) + (eval put 'ui/defcomponent 'clojure-backtracking-indent '(4 (2))) + + (eval put 'defcomponentmethod 'clojure-backtracking-indent '(4 (2))) + (eval put 'ui/defcomponentmethod 'clojure-backtracking-indent '(4 (2))))) diff --git a/src-cljs/pepa/components/sidebar.cljs b/src-cljs/pepa/components/sidebar.cljs index f2c5f6b..c1af97b 100644 --- a/src-cljs/pepa/components/sidebar.cljs +++ b/src-cljs/pepa/components/sidebar.cljs @@ -39,14 +39,10 @@ (defmulti ^:private navigation-element (fn [_ _ [name id _ route]] id)) -(defmethod navigation-element :default [state _ [title id _ href]] - (reify - om/IDisplayName (display-name [_] "DefaultNavigation") - om/IRender - (render [_] - (html - [:a.menu-link {:href href} - [:div title]])))) +(ui/defcomponentmethod navigation-element :default [state _ [title id _ href]] + (render [_] + [:a.menu-link {:href href} + [:div title]])) (defn ^:private inbox-drop! [state owner e] ;; NOTE: We need to handle all event-object interop BEFORE entering @@ -67,40 +63,31 @@ (om/set-state! :drop? false)))))) (.preventDefault e)) -(defmethod navigation-element :inbox [state owner [title id _ href]] - (reify - om/IDisplayName (display-name [_] "InboxNavigation") - om/IRenderState - (render-state [_ {:keys [drop? working?]}] - (html - [:a.menu-link {:href href} - [:div {:class [(when working? "working") - (when drop? "drop-target")] - :on-drag-over upload/accept-file-drag - :on-drag-enter #(om/set-state! owner :drop? true) - :on-drag-leave #(om/set-state! owner :drop? false) - :on-drop (partial inbox-drop! state owner)} - title - (when-let [pages (-> state :workflows :inbox :documents :inbox :pages seq)] - [:span.count (count pages)])]])))) +(ui/defcomponentmethod navigation-element :inbox [state owner [title id _ href]] + (render-state [_ {:keys [drop? working?]}] + [:a.menu-link {:href href} + [:div {:class [(when working? "working") + (when drop? "drop-target")] + :on-drag-over upload/accept-file-drag + :on-drag-enter #(om/set-state! owner :drop? true) + :on-drag-leave #(om/set-state! owner :drop? false) + :on-drop (partial inbox-drop! state owner)} + title + (when-let [pages (-> state :workflows :inbox :documents :inbox :pages seq)] + [:span.count (count pages)])]])) -(defmethod navigation-element :tags [state owner [title id _ href]] - (reify - om/IDisplayName (display-name [_] "TagsNavigation") - om/IInitState - (init-state [_] - {:open? true}) - om/IRenderState - (render-state [_ {:keys [open?]}] - (html - [:div.menu-link - [:div {:on-click (fn [e] - (om/update-state! owner :open? not) - (.preventDefault e)) - :class [(when open? "open")]} - title] - (when open? - (om/build tags/tags-list (data/sorted-tags state)))])))) +(ui/defcomponentmethod navigation-element :tags [state owner [title id _ href]] + (init-state [_] + {:open? true}) + (render-state [_ {:keys [open?]}] + [:div.menu-link + [:div {:on-click (fn [e] + (om/update-state! owner :open? not) + (.preventDefault e)) + :class [(when open? "open")]} + title] + (when open? + (om/build tags/tags-list (data/sorted-tags state)))])) (defn ^:private route-matches? [route workflows] (let [route (if (seqable? route) @@ -127,8 +114,10 @@ [:ul ;; TODO: Use build-all (for [element nav/navigation-elements] - (let [[title ident routes href] element] - [:li {:class [(name ident) + (let [[title ident routes href] element + ident (name ident)] + [:li {:class [ident (when (route-matches? route routes) "active")] - :key (name ident)} - (om/build navigation-element state {:opts element})]))]]]))) + :key ident} + (om/build navigation-element state {:opts element + :react-key ident})]))]]])))