ソースを参照

added Login and Customize Menu item functionality

Harlan Iverson 5 年 前
コミット
cb04172250
3 ファイル変更82 行追加3 行削除
  1. 2 0
      deps.edn
  2. 20 1
      src/pos_demo/core.clj
  3. 60 2
      src/pos_demo/core.cljs

+ 2 - 0
deps.edn

@@ -11,6 +11,8 @@
                  log4j {:mvn/version "1.2.17"}
                  
                  funcool/decimal {:mvn/version "1.0.2"}
+                 
+                 org.clojure/data.json {:mvn/version "0.2.6"}
                  }        
         
  :paths ["src" "resources"]

+ 20 - 1
src/pos_demo/core.clj

@@ -1,7 +1,8 @@
 (ns pos-demo.core
   (:require [ring.middleware.resource :refer [wrap-resource]]
             [ring.middleware.keyword-params :refer [wrap-keyword-params]]
-            [pos-demo.authorize :as authorize]))  
+            [pos-demo.authorize :as authorize]
+            [clojure.data.json :as json]))  
   
 (defn current-date
   []
@@ -13,6 +14,14 @@
     (let [result (authorize/send-payment-request payment-request)]
       (println "Success! Result: " result))))
 
+(def credentials #{{:username "hi" :password "mypass"}
+                   {:username "mgr" :password "mgrpass"}})
+                   
+(def roles {"hi" #{"cashier"}
+            "mgr" #{"manager" "cashier"}})
+
+
+
 (defn api-handler
   [request]
   (println "request query-params keys=" (keys (:query-params request))) 
@@ -21,6 +30,16 @@
          :content-type "application/json"
          :body (str "{\"msg\": \"Works. " (current-date) "\"}")}
          
+        (= "/auth" (:uri request))
+        (let [credential (select-keys (:params request) [:username :password])]
+          (if (contains? credentials credential)
+            {:status 200
+             :content-type "application/json"
+             :body (json/write-str {:roles (get roles (:username credential))})}
+            {:status 401
+             :content-type "text/plain"
+             :body "unauthorized."}))
+         
         (= "/pay" (:uri request))
         (let [{:keys [amount card-number card-exp]} (:params  request)]
           (println "Authorizing payment for amount=" amount "on card=" card-number "; expires=" card-exp)

+ 60 - 2
src/pos_demo/core.cljs

@@ -38,7 +38,7 @@
 
 (defn order-total [order]
   (let [item-prices (map :price (:items order))
-        total-price (reduce (fn [total item-price] (decimal/+ total item-price))
+        total-price (reduce decimal/+
                             "0.00"
                             item-prices)]
     total-price))
@@ -98,6 +98,23 @@
         (js/alert (str "Message: " (:body api-response)))
         (js/alert (str "No good :( " (:status api-response)))))))
 
+
+(defn auth-api
+  [username password]
+  (go
+    (let [params {:username username
+                  :password password}
+          api-response (async/<! (http/get "/auth" {:query-params params}))]
+      (cond 
+        (= (:status api-response) 200)
+        (js/alert (str "Message: " (:body api-response)))
+        
+        (= (:status api-response) 401)
+        (js/alert (str "Invalid login: " (:body api-response)))
+        
+        :else
+        (js/alert (str "No good :( " (:status api-response)))))))
+
 ; UI handlers
 
 (defn new-order-clicked
@@ -228,6 +245,26 @@
   (swap! app-state assoc :payment-amount (str (order-total (:active-order @app-state))))
   )
 
+(defn menu-item-clicked
+  [menu item]
+
+  ; show modal to customize based on ingredients.  
+  (swap! app-state assoc :customize-menu-item item)
+  )
+
+(defn add-item-clicked
+  [menu item]
+  (swap! app-state dissoc :customize-menu-item)
+  (add-menu-item-to-order item)
+  )
+
+
+(defn login-clicked
+  []
+  ; open a modal to ask for credentials.
+  (auth-api "mgr" "mgrpass")  )
+
+
 (defn menu-ui
   [menu]
   ; tabs with section titles
@@ -237,7 +274,7 @@
   (for [section (:sections menu)]
     [:div (:title section)
       (for [item (:items section)]  
-        [button (:title item) #(add-menu-item-to-order item)]
+        [button (:title item) #(menu-item-clicked menu item)]
           )]))
 
 
@@ -256,6 +293,19 @@
       [:span (str (order-total order))]]])
 
 
+(defn customize-menu-item [menu-item]
+  [:div#product-customization-dialog
+    [:h4 (:title menu-item)]
+    
+    [:p "Ingredients"]
+    [:ul
+      (for [k (:ingredients menu-item)]
+        [:li (:ingredient k) " -- " (:description k)])]
+    
+    [:div.custom-price [:strong "Price:"] (:price menu-item)]    
+    (button "Add to order." #(add-item-clicked nil menu-item))
+    (button "Cancel." #(swap! app-state dissoc :customize-menu-item))])
+
 (defn main-screen []
   [:div
    [:h1 (:shop-name @app-state)]
@@ -267,6 +317,10 @@
    (when-not (nil? (:active-order @app-state))
      [:div
        (menu-ui @menu)
+       (when-let [menu-item (:customize-menu-item @app-state)]
+         [:div
+           [:hr]
+           (customize-menu-item menu-item)])
        [:hr]
        (order-ui (:active-order @app-state))
        [:hr]
@@ -284,6 +338,10 @@
                               
       (button "Pay" #(pay-clicked (:payment-amount @app-state)))
       ]
+      
+     (button "Login." login-clicked)
+     
+     
    ])