made it possible to change layouts.
This commit is contained in:
@@ -4,17 +4,11 @@
|
|||||||
[auto-ap.events :as events]
|
[auto-ap.events :as events]
|
||||||
[auto-ap.views :as views]
|
[auto-ap.views :as views]
|
||||||
[auto-ap.config :as config]
|
[auto-ap.config :as config]
|
||||||
[auto-ap.routes :as routes]
|
|
||||||
[auto-ap.effects :as effects]
|
[auto-ap.effects :as effects]
|
||||||
[pushy.core :as pushy]
|
[pushy.core :as pushy]
|
||||||
|
[auto-ap.pushy :as p]
|
||||||
[bidi.bidi :as bidi]))
|
[bidi.bidi :as bidi]))
|
||||||
|
|
||||||
(defn- parse-url [url]
|
|
||||||
(bidi/match-route routes/routes url))
|
|
||||||
|
|
||||||
(defn- dispatch-route [matched-route]
|
|
||||||
(re-frame/dispatch [::events/set-active-page (:handler matched-route)]))
|
|
||||||
|
|
||||||
(defn dev-setup []
|
(defn dev-setup []
|
||||||
(when true
|
(when true
|
||||||
(enable-console-print!)
|
(enable-console-print!)
|
||||||
@@ -22,16 +16,19 @@
|
|||||||
|
|
||||||
(defn mount-root []
|
(defn mount-root []
|
||||||
(re-frame/clear-subscription-cache!)
|
(re-frame/clear-subscription-cache!)
|
||||||
(reagent/render [views/main-panel]
|
(reagent/render [views/page]
|
||||||
(.getElementById js/document "app")))
|
(.getElementById js/document "app")))
|
||||||
|
|
||||||
(defn ^:export init []
|
(defn ^:export init []
|
||||||
(dev-setup)
|
(dev-setup)
|
||||||
(when-let [jwt (.get (js/URLSearchParams. (.-search (.-location js/window))) "jwt")]
|
(pushy/start! p/history)
|
||||||
(println "got jwt" jwt)
|
(if-let [jwt (.get (js/URLSearchParams. (.-search (.-location js/window))) "jwt")]
|
||||||
(.setItem js/localStorage "jwt" jwt))
|
(do
|
||||||
(pushy/start! (pushy/pushy dispatch-route parse-url))
|
(.setItem js/localStorage "jwt" jwt)
|
||||||
(re-frame/dispatch-sync [::events/initialize-db])
|
(re-frame/dispatch-sync [::events/initialize-db jwt]))
|
||||||
|
(do
|
||||||
|
(re-frame/dispatch-sync [::events/initialize-db nil])))
|
||||||
|
|
||||||
(mount-root))
|
(mount-root))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,23 @@
|
|||||||
(ns auto-ap.effects
|
(ns auto-ap.effects
|
||||||
(:require-macros [cljs.core.async.macros :refer [go]])
|
(:require-macros [cljs.core.async.macros :refer [go]])
|
||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
[reagent.core :as reagent]
|
|
||||||
[auto-ap.subs :as subs]
|
|
||||||
[auto-ap.events :as events]
|
|
||||||
[cljs.reader :as edn]
|
|
||||||
[cljsjs.dropzone :as dz]
|
|
||||||
[auto-ap.routes :as routes]
|
|
||||||
[bidi.bidi :as bidi]
|
|
||||||
[cljs-http.client :as http]
|
[cljs-http.client :as http]
|
||||||
[cljs.core.async :refer [<!]]))
|
[cljs.core.async :refer [<!]]
|
||||||
|
[auto-ap.pushy :as p]
|
||||||
|
[pushy.core :as pushy]))
|
||||||
|
|
||||||
|
(re-frame/reg-fx
|
||||||
|
:redirect
|
||||||
|
(fn [uri]
|
||||||
|
(println uri)
|
||||||
|
(pushy/set-token! p/history uri)))
|
||||||
|
|
||||||
|
(re-frame/reg-fx
|
||||||
|
:set-local-storage
|
||||||
|
(fn [[name value]]
|
||||||
|
(if value
|
||||||
|
(.setItem js/localStorage name value)
|
||||||
|
(.removeItem js/localStorage name ))))
|
||||||
|
|
||||||
(re-frame/reg-fx
|
(re-frame/reg-fx
|
||||||
:http
|
:http
|
||||||
|
|||||||
@@ -2,14 +2,21 @@
|
|||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
[auto-ap.db :as db]
|
[auto-ap.db :as db]
|
||||||
[auto-ap.routes :as routes]
|
[auto-ap.routes :as routes]
|
||||||
|
[auto-ap.effects :as effects]
|
||||||
[bidi.bidi :as bidi]))
|
[bidi.bidi :as bidi]))
|
||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-fx
|
||||||
::initialize-db
|
::initialize-db
|
||||||
(fn [_ _]
|
(fn [{:keys [db]} [_ token]]
|
||||||
(assoc db/default-db
|
(let [handler (:handler (bidi/match-route routes/routes (.. js/window -location -pathname)))]
|
||||||
:active-page (:handler (bidi/match-route routes/routes (.. js/window -location -pathname))))))
|
(if (and (not= :login handler) (not token))
|
||||||
|
{:redirect "/login"
|
||||||
|
:db (assoc db/default-db
|
||||||
|
:active-page :login
|
||||||
|
:user token)}
|
||||||
|
{:db (assoc db/default-db
|
||||||
|
:active-page handler
|
||||||
|
:user token)}))))
|
||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-db
|
||||||
::toggle-menu
|
::toggle-menu
|
||||||
@@ -26,10 +33,13 @@
|
|||||||
(fn [db [_ company]]
|
(fn [db [_ company]]
|
||||||
(assoc db :company company)))
|
(assoc db :company company)))
|
||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-fx
|
||||||
::set-active-page
|
::set-active-page
|
||||||
(fn [db [_ active-page]]
|
(fn [{:keys [db]} [_ handler]]
|
||||||
(assoc db :active-page active-page)))
|
(if (and (not= :login handler) (not (:user db)))
|
||||||
|
{:redirect "/login"
|
||||||
|
:db (assoc db :active-page :login)}
|
||||||
|
{:db (assoc db :active-page handler)})))
|
||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-db
|
||||||
::imported-invoices
|
::imported-invoices
|
||||||
@@ -84,11 +94,13 @@
|
|||||||
(fn [db [_ invoice]]
|
(fn [db [_ invoice]]
|
||||||
(assoc db :new-invoice {})))
|
(assoc db :new-invoice {})))
|
||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-fx
|
||||||
::logout
|
::logout
|
||||||
(fn [db [_]]
|
(fn [{:keys [db]} [_]]
|
||||||
(assoc db :user nil :menu {:company {:active? false}
|
{:db (assoc db :user nil :menu {:company {:active? false}
|
||||||
:account {:active? false}})))
|
:account {:active? false}})
|
||||||
|
:redirect (bidi/path-for routes/routes :login)
|
||||||
|
:set-local-storage ["jwt" nil]}))
|
||||||
|
|
||||||
(re-frame/reg-event-fx
|
(re-frame/reg-event-fx
|
||||||
::submit-new-invoice
|
::submit-new-invoice
|
||||||
|
|||||||
14
src/cljs/auto_ap/history.cljs
Normal file
14
src/cljs/auto_ap/history.cljs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
(ns auto-ap.pushy
|
||||||
|
(:require [bidi.bidi :as bidi]
|
||||||
|
[pushy.core :as pushy]
|
||||||
|
[auto-ap.routes :as routes]
|
||||||
|
[re-frame.core :as re-frame]))
|
||||||
|
|
||||||
|
(defn- parse-url [url]
|
||||||
|
(bidi/match-route routes/routes url))
|
||||||
|
|
||||||
|
(defn- dispatch-route [matched-route]
|
||||||
|
(re-frame/dispatch [:auto-ap.events/set-active-page (:handler matched-route)]))
|
||||||
|
|
||||||
|
|
||||||
|
(def history (pushy/pushy dispatch-route parse-url))
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
(:require [bidi.bidi :as bidi]))
|
(:require [bidi.bidi :as bidi]))
|
||||||
|
|
||||||
(def routes ["/" {"" :index
|
(def routes ["/" {"" :index
|
||||||
|
"login/" :login
|
||||||
"invoices/" {"" :invoices
|
"invoices/" {"" :invoices
|
||||||
"import" :import-invoices
|
"import" :import-invoices
|
||||||
"unpaid" :unpaid-invoices
|
"unpaid" :unpaid-invoices
|
||||||
|
|||||||
@@ -10,6 +10,10 @@
|
|||||||
[bidi.bidi :as bidi]
|
[bidi.bidi :as bidi]
|
||||||
[cljs-http.client :as http]
|
[cljs-http.client :as http]
|
||||||
[cljs.core.async :refer [<!]]))
|
[cljs.core.async :refer [<!]]))
|
||||||
|
(defn login-url []
|
||||||
|
(let [client-id "264081895820-0nndcfo3pbtqf30sro82vgq5r27h8736.apps.googleusercontent.com"
|
||||||
|
redirect-uri "http%3A%2F%2Flocalhost%3A3449%2Fapi%2Foauth"]
|
||||||
|
(str "https://accounts.google.com/o/oauth2/auth?access_type=online&client_id=" client-id "&redirect_uri=" redirect-uri "&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile")))
|
||||||
|
|
||||||
(defn active-when= [active-page candidate]
|
(defn active-when= [active-page candidate]
|
||||||
(when (= active-page candidate) " active"))
|
(when (= active-page candidate) " active"))
|
||||||
@@ -37,8 +41,18 @@
|
|||||||
:previewsContainer "#dz-hidden"
|
:previewsContainer "#dz-hidden"
|
||||||
:previewTemplate "<div class='dz-hidden-preview'></div>"})))})))
|
:previewTemplate "<div class='dz-hidden-preview'></div>"})))})))
|
||||||
|
|
||||||
|
|
||||||
(defmulti active-page identity)
|
(defmulti active-page identity)
|
||||||
|
|
||||||
|
(defmethod active-page :login []
|
||||||
|
[:div {:class "inbox-messages"}
|
||||||
|
[:div.hero
|
||||||
|
[:div.hero-body
|
||||||
|
[:div.container
|
||||||
|
[:h1.title "Login"]
|
||||||
|
[:h2.subtitle "To get started, "
|
||||||
|
[:a {:href (login-url)} "Login with Google"]]]]]])
|
||||||
|
|
||||||
(defmethod active-page :index []
|
(defmethod active-page :index []
|
||||||
[:div {:class "inbox-messages"}
|
[:div {:class "inbox-messages"}
|
||||||
[:div.hero
|
[:div.hero
|
||||||
@@ -217,28 +231,39 @@
|
|||||||
[:i.fa.fa-spin.fa-spinner])
|
[:i.fa.fa-spin.fa-spinner])
|
||||||
"Save"]]]]]))
|
"Save"]]]]]))
|
||||||
|
|
||||||
(defn login-url []
|
|
||||||
(let [client-id "264081895820-0nndcfo3pbtqf30sro82vgq5r27h8736.apps.googleusercontent.com"
|
|
||||||
redirect-uri "http%3A%2F%2Flocalhost%3A3449%2Fapi%2Foauth"]
|
|
||||||
(str "https://accounts.google.com/o/oauth2/auth?access_type=online&client_id=" client-id "&redirect_uri=" redirect-uri "&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile")))
|
|
||||||
|
|
||||||
(defn login []
|
(defn login []
|
||||||
(let [user (re-frame/subscribe [::subs/user])
|
(let [user (re-frame/subscribe [::subs/user])
|
||||||
menu (re-frame/subscribe [::subs/menu])]
|
menu (re-frame/subscribe [::subs/menu])]
|
||||||
[:div {:id "navMenu", :class "navbar-menu"}
|
[:div {:id "navMenu", :class "navbar-menu"}
|
||||||
[:div {:class "navbar-end"}
|
[:div {:class "navbar-end"}
|
||||||
[:div {:class (str "navbar-item has-dropdown " (when (get-in @menu [:account :active?]) "is-active"))}
|
(if @user
|
||||||
(if @user
|
[:div {:class (str "navbar-item has-dropdown " (when (get-in @menu [:account :active?]) "is-active"))}
|
||||||
[:a {:class "navbar-link login" :on-click (fn [e] (re-frame/dispatch [::events/toggle-menu :account]))} (:name @user)]
|
[:a {:class "navbar-link login" :on-click (fn [e] (re-frame/dispatch [::events/toggle-menu :account]))} (:name @user)]
|
||||||
[:a {:class "navbar-link login" :href (login-url)} "Login"])
|
[:div {:class "navbar-dropdown"}
|
||||||
[:div {:class "navbar-dropdown"}
|
[:a {:class "navbar-item"} "My profile"]
|
||||||
[:a {:class "navbar-item"} "My profile"]
|
[:hr {:class "navbar-divider"}]
|
||||||
[:hr {:class "navbar-divider"}]
|
[:a.navbar-item {:on-click (fn [e] (.preventDefault e) (re-frame/dispatch [::events/logout]))} "Logout"]]]
|
||||||
[:a.navbar-item {:on-click (fn [e] (.preventDefault e) (re-frame/dispatch [::events/logout]))} "Logout"]]]]]))
|
[:a.navbar-item {:href (login-url)} "Login"])]]))
|
||||||
|
|
||||||
(defn main-panel []
|
{"" :index
|
||||||
|
"login/" :login
|
||||||
|
"invoices/" {"" :invoices
|
||||||
|
"import" :import-invoices
|
||||||
|
"unpaid" :unpaid-invoices
|
||||||
|
"paid" :paid-invoices
|
||||||
|
"new" :new-invoice}}
|
||||||
|
(defmulti main-layout (fn [x] ({:login :blank
|
||||||
|
:index :left-panel
|
||||||
|
:invoices :left-panel
|
||||||
|
:import-invoices :left-panel
|
||||||
|
:unpaid-invoices :left-panel
|
||||||
|
:paid-invoices :left-panel
|
||||||
|
:new-invoice :blank} x)))
|
||||||
|
|
||||||
|
(defmethod main-layout :left-panel [ap]
|
||||||
(let [company (re-frame/subscribe [::subs/company])
|
(let [company (re-frame/subscribe [::subs/company])
|
||||||
ap (re-frame/subscribe [::subs/active-page])
|
|
||||||
companies (re-frame/subscribe [::subs/companies])
|
companies (re-frame/subscribe [::subs/companies])
|
||||||
menu (re-frame/subscribe [::subs/menu])]
|
menu (re-frame/subscribe [::subs/menu])]
|
||||||
[:div
|
[:div
|
||||||
@@ -273,27 +298,27 @@
|
|||||||
[:div.main
|
[:div.main
|
||||||
[:p.menu-label "General"]
|
[:p.menu-label "General"]
|
||||||
[:p.menu-item
|
[:p.menu-item
|
||||||
[:a {:href (bidi/path-for routes/routes :index) , :class (str "item" (active-when= @ap :index))}
|
[:a {:href (bidi/path-for routes/routes :index) , :class (str "item" (active-when= ap :index))}
|
||||||
[:span {:class "icon"}
|
[:span {:class "icon"}
|
||||||
[:i {:class "fa fa-tachometer"}]]
|
[:i {:class "fa fa-tachometer"}]]
|
||||||
[:span {:class "name"} "Dashboard"]]]
|
[:span {:class "name"} "Dashboard"]]]
|
||||||
|
|
||||||
[:p.menu-label "Accounts Payable"]
|
[:p.menu-label "Accounts Payable"]
|
||||||
[:ul.menu-list
|
[:ul.menu-list
|
||||||
[:li.menu-item
|
[:li.menu-item
|
||||||
[:a {:href (bidi/path-for routes/routes :import-invoices) , :class (str "item" (active-when= @ap :import-invoices))}
|
[:a {:href (bidi/path-for routes/routes :import-invoices) , :class (str "item" (active-when= ap :import-invoices))}
|
||||||
[:span {:class "icon"}
|
[:span {:class "icon"}
|
||||||
[:i {:class "fa fa-star-o"}]]
|
[:i {:class "fa fa-star-o"}]]
|
||||||
|
|
||||||
[:span {:class "name"} "Upload Invoices"]]]
|
[:span {:class "name"} "Upload Invoices"]]]
|
||||||
[:li.menu-item
|
[:li.menu-item
|
||||||
[:a {:href (bidi/path-for routes/routes :unpaid-invoices), :class (str "item" (active-when= @ap :unpaid-invoices))}
|
[:a {:href (bidi/path-for routes/routes :unpaid-invoices), :class (str "item" (active-when= ap :unpaid-invoices))}
|
||||||
[:span {:class "icon"}
|
[:span {:class "icon"}
|
||||||
[:i {:class "fa fa-envelope-o"}]]
|
[:i {:class "fa fa-envelope-o"}]]
|
||||||
[:span {:class "name"} "Unpaid Invoices"]]
|
[:span {:class "name"} "Unpaid Invoices"]]
|
||||||
]
|
]
|
||||||
[:li.menu-item
|
[:li.menu-item
|
||||||
[:a {:href (bidi/path-for routes/routes :paid-invoices), :class (str "item" (active-when= @ap :paid-invoices))}
|
[:a {:href (bidi/path-for routes/routes :paid-invoices), :class (str "item" (active-when= ap :paid-invoices))}
|
||||||
[:span {:class "icon"}
|
[:span {:class "icon"}
|
||||||
[:i {:class "fa fa-envelope-o"}]]
|
[:i {:class "fa fa-envelope-o"}]]
|
||||||
[:span {:class "name"} "Paid Invoices"]]
|
[:span {:class "name"} "Paid Invoices"]]
|
||||||
@@ -305,7 +330,7 @@
|
|||||||
[:a {:class "button is-danger is-block is-bold" :href (bidi/path-for routes/routes :new-invoice)}
|
[:a {:class "button is-danger is-block is-bold" :href (bidi/path-for routes/routes :new-invoice)}
|
||||||
[:span {:class "compose"} "New Invoice"]]]]]
|
[:span {:class "compose"} "New Invoice"]]]]]
|
||||||
[:div {:class "column messages hero is-fullheight", :id "message-feed"}
|
[:div {:class "column messages hero is-fullheight", :id "message-feed"}
|
||||||
^{:key (str "active-page-" (:name @company))} [active-page @ap]]]
|
^{:key (str "active-page-" (:name @company))} [active-page ap]]]
|
||||||
[:footer {:class "footer"}
|
[:footer {:class "footer"}
|
||||||
[:div {:class "container"}
|
[:div {:class "container"}
|
||||||
[:div {:class "content has-text-centered"}
|
[:div {:class "content has-text-centered"}
|
||||||
@@ -316,3 +341,13 @@
|
|||||||
[:a {:class "icon", :href "https://github.com/dansup/bulma-templates"}
|
[:a {:class "icon", :href "https://github.com/dansup/bulma-templates"}
|
||||||
[:i {:class "fa fa-github"}]]]]]]
|
[:i {:class "fa fa-github"}]]]]]]
|
||||||
[:div#dz-hidden]]))
|
[:div#dz-hidden]]))
|
||||||
|
|
||||||
|
(defmethod main-layout :blank [ap]
|
||||||
|
[:div
|
||||||
|
[active-page ap]])
|
||||||
|
|
||||||
|
(defn page []
|
||||||
|
(let [ap (re-frame/subscribe [::subs/active-page])]
|
||||||
|
[:div
|
||||||
|
[main-layout @ap]]))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user