mirror of
https://github.com/mruwnik/chicken-master.git
synced 2025-06-08 21:34:43 +02:00
dynamic data
This commit is contained in:
parent
d637579eff
commit
4d566514a9
@ -1,64 +1,43 @@
|
|||||||
(ns chicken-master.calendar
|
(ns chicken-master.calendar
|
||||||
(:require
|
(:require
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
|
[chicken-master.config :refer [settings]]
|
||||||
[chicken-master.subs :as subs]
|
[chicken-master.subs :as subs]
|
||||||
[chicken-master.time :as time]
|
[chicken-master.html :as html]
|
||||||
))
|
[chicken-master.products :as prod]
|
||||||
|
[chicken-master.events :as event]
|
||||||
|
[chicken-master.time :as time]))
|
||||||
|
|
||||||
(defn get-day [date]
|
|
||||||
{:date date
|
|
||||||
:customers [{:who "mr.blobby (649 234 234)" :when date :products {:eggs 2 :milk 3}}
|
|
||||||
{:who "da police (0118 999 881 999 119 725 123123 12 3123 123 )" :when date :products {:eggs 12}}
|
|
||||||
{:who "johnny" :when date :products {:eggs 5}}]})
|
|
||||||
|
|
||||||
|
|
||||||
(defn modal [content on-submit]
|
|
||||||
[:div {:class :popup}
|
|
||||||
[:form {:action "#"}
|
|
||||||
content
|
|
||||||
[:div {:class :form-buttons}
|
|
||||||
[:input {:type :submit :value "add"}]
|
|
||||||
[:button {:type :button} "cancel"]]]])
|
|
||||||
|
|
||||||
(defn add-product [date order-id]
|
|
||||||
(modal
|
|
||||||
[:div
|
|
||||||
[:div {:class :input-item}
|
|
||||||
[:label {:for :product} "co"]
|
|
||||||
[:input {:type :text :name :product :id :product}]]
|
|
||||||
[:div {:class :input-item}
|
|
||||||
[:label {:for :amount} "ile"]
|
|
||||||
[:input {:type :number :name :amount :id :amount}]]]
|
|
||||||
js/console.log))
|
|
||||||
|
|
||||||
(defn add-order [date]
|
(defn add-order [date]
|
||||||
(modal
|
(html/modal
|
||||||
[:div
|
[:div
|
||||||
[:div {:class :input-item}
|
(html/input :who "kto"
|
||||||
[:label {:for :who} "kto"]
|
{:required true
|
||||||
[:input {:type :text :name :who :id :who :required true :step "60"}]]
|
:default @(re-frame/subscribe [::subs/order-edit-who])})
|
||||||
[:div {:class :input-item}
|
(html/input :when "kiedy"
|
||||||
[:label {:for :when} "kiedy"]
|
{:type :time :step 60
|
||||||
[:input {:type :time :name :when :id :when}]]
|
:default @(re-frame/subscribe [::subs/order-edit-when])})
|
||||||
|
(let [available-prods @(re-frame/subscribe [::subs/available-products])
|
||||||
|
selected-prods @(re-frame/subscribe [::subs/order-edit-products])]
|
||||||
[:div {}
|
[:div {}
|
||||||
[:label "co"]
|
[:label "co"]
|
||||||
]]
|
(for [{product :prod amount :amount} selected-prods]
|
||||||
|
(prod/product-item product amount available-prods))])
|
||||||
|
[:button {:type :button :on-click #(re-frame/dispatch [::event/add-product])} "+"]]
|
||||||
js/console.log))
|
js/console.log))
|
||||||
|
|
||||||
(defn format-product [[product amount]]
|
(defn format-order [{:keys [id who when products]}]
|
||||||
[:li {:class :product}
|
[:li {:class :order :key (gensym)}
|
||||||
[:input {:class :product-amount :type :number :min 0 :defaultValue amount}]
|
|
||||||
[:span {:class :product-name} product]])
|
|
||||||
|
|
||||||
(defn format-order [{:keys [who when products]}]
|
|
||||||
[:li {:class :order}
|
|
||||||
[:div {:class :actions}
|
[:div {:class :actions}
|
||||||
[:button "+"] [:button "O"] [:button "-"]]
|
[:button "O"]
|
||||||
|
[:button {:on-click #(re-frame/dispatch [::event/edit-order when id])} "E"]
|
||||||
|
[:button "-"]]
|
||||||
[:div {:class :who} who]
|
[:div {:class :who} who]
|
||||||
(if (subs/settings :show-order-time)
|
(if (settings :show-order-time)
|
||||||
[:div {:class :when} (str (.getHours when) ":" (.getMinutes when))])
|
[:div {:class :when} (str (.getHours when) ":" (.getMinutes when))])
|
||||||
(->> products
|
(->> products
|
||||||
(map format-product)
|
(map prod/format-product)
|
||||||
(into [:ul {:class :products}]))])
|
(into [:ul {:class :products}]))])
|
||||||
|
|
||||||
(defn day [{:keys [date customers]}]
|
(defn day [{:keys [date customers]}]
|
||||||
@ -67,15 +46,16 @@
|
|||||||
[:div
|
[:div
|
||||||
[:ul {:class :orders}
|
[:ul {:class :orders}
|
||||||
(map format-order customers)
|
(map format-order customers)
|
||||||
[:button {:type :button} "+"]]]])
|
[:button {:type :button
|
||||||
|
:on-click #(re-frame/dispatch [::event/edit-order date])} "+"]]]])
|
||||||
|
|
||||||
(defn calendar-header []
|
(defn calendar-header []
|
||||||
(->> (subs/settings :day-names)
|
(->> (settings :day-names)
|
||||||
(map (fn [day] [:div {:class :day-header} day]))
|
(map (fn [day] [:div {:class :day-header} day]))
|
||||||
(into [])))
|
(into [])))
|
||||||
|
|
||||||
(defn calendar [days]
|
(defn calendar [days]
|
||||||
(->> days
|
(->> days
|
||||||
(map (comp day get-day))
|
(map day)
|
||||||
(concat (when-not (subs/settings :always-day-names) (calendar-header)))
|
(concat (when-not (settings :always-day-names) (calendar-header)))
|
||||||
(into [:div {:class [:calendar :full-height]}])))
|
(into [:div {:class [:calendar :full-height]}])))
|
||||||
|
@ -2,3 +2,8 @@
|
|||||||
|
|
||||||
(def debug?
|
(def debug?
|
||||||
^boolean goog.DEBUG)
|
^boolean goog.DEBUG)
|
||||||
|
|
||||||
|
(def settings {:first-day-offset 1
|
||||||
|
:day-names ["Niedz" "Pon" "Wt" "Śr" "Czw" "Pt" "Sob"]
|
||||||
|
:always-day-names true
|
||||||
|
:show-order-time false})
|
||||||
|
@ -20,5 +20,6 @@
|
|||||||
|
|
||||||
(defn init []
|
(defn init []
|
||||||
(re-frame/dispatch-sync [::events/initialize-db])
|
(re-frame/dispatch-sync [::events/initialize-db])
|
||||||
|
(re-frame/dispatch-sync [::events/show-from-date (new js/Date "2020-09-05")])
|
||||||
(dev-setup)
|
(dev-setup)
|
||||||
(mount-root))
|
(mount-root))
|
||||||
|
@ -1,4 +1,31 @@
|
|||||||
(ns chicken-master.db)
|
(ns chicken-master.db)
|
||||||
|
|
||||||
(def default-db
|
(def default-db
|
||||||
{:name "re-frame"})
|
{:name "re-frame"
|
||||||
|
:order-edit {:show nil
|
||||||
|
:who "mr. blobby"
|
||||||
|
:when "12:32"
|
||||||
|
:products [{:prod :eggs :amount 2}
|
||||||
|
{:prod :milk :amount 5}
|
||||||
|
{}]}
|
||||||
|
:customers {1 {:who "mr.blobby (649 234 234)" :day "2020-10-10" :hour "02:12" :products {:eggs 2 :milk 3}}
|
||||||
|
2 {:who "da police (0118 999 881 999 119 725 123123 12 3123 123 )" :day "2020-10-10" :hour "02:12" :products {:eggs 12}}
|
||||||
|
3 {:who "johnny" :day "2020-10-10" :hour "02:12" :products {:eggs 5}}}
|
||||||
|
:days {"2020-09-05" [1 2 3]
|
||||||
|
"2020-09-06" [1 2 3]
|
||||||
|
"2020-09-07" [1 2 3]
|
||||||
|
"2020-09-08" [1 2 3]
|
||||||
|
"2020-09-09" [1 2 3]
|
||||||
|
"2020-09-10" [1 2 3]
|
||||||
|
"2020-09-11" [1 2 3]
|
||||||
|
"2020-09-12" [1 2 3]
|
||||||
|
"2020-09-13" [1 2 3]
|
||||||
|
"2020-09-14" [1 2 3]
|
||||||
|
"2020-09-15" [1 2 3]
|
||||||
|
"2020-09-16" [1 2 3]
|
||||||
|
"2020-09-17" [1 2 3]
|
||||||
|
"2020-09-18" [1 2 3]}
|
||||||
|
:products {:eggs {}
|
||||||
|
:milk {}
|
||||||
|
:cabbage {}
|
||||||
|
:carrots {}}})
|
||||||
|
@ -2,9 +2,32 @@
|
|||||||
(:require
|
(:require
|
||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[chicken-master.db :as db]
|
[chicken-master.db :as db]
|
||||||
))
|
[chicken-master.time :as time]))
|
||||||
|
|
||||||
|
(re-frame/reg-event-db ::initialize-db (fn [_ _] db/default-db))
|
||||||
|
|
||||||
|
(re-frame/reg-event-db ::hide-modal (fn [db _] (assoc db :order-edit {})))
|
||||||
|
(re-frame/reg-event-db
|
||||||
|
::edit-order
|
||||||
|
(fn [{customers :customers :as db} [_ date id]]
|
||||||
|
(assoc db :order-edit (merge (get customers id)
|
||||||
|
{:show true :day date}))))
|
||||||
|
|
||||||
|
(re-frame/reg-event-db ::add-product (fn [db _] (update-in db [:order-edit :products] conj {})))
|
||||||
|
|
||||||
|
|
||||||
|
(defn get-day [{:keys [days customers]} date]
|
||||||
|
{:date date
|
||||||
|
:customers (->> (.toIsoString ^js/goog.date.Date date true)
|
||||||
|
(get days)
|
||||||
|
(map customers))})
|
||||||
|
|
||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-db
|
||||||
::initialize-db
|
::show-from-date
|
||||||
(fn [_ _]
|
(fn [db [_ date]]
|
||||||
db/default-db))
|
(->> date
|
||||||
|
time/start-of-week
|
||||||
|
(time/days-range 14)
|
||||||
|
(map (partial get-day db))
|
||||||
|
(assoc db :current-days))))
|
||||||
|
23
src/cljs/chicken_master/html.cljs
Normal file
23
src/cljs/chicken_master/html.cljs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
(ns chicken-master.html
|
||||||
|
(:require [re-frame.core :as re-frame]
|
||||||
|
[chicken-master.events :as event]))
|
||||||
|
|
||||||
|
|
||||||
|
(defn input
|
||||||
|
([id label] (input id label {}))
|
||||||
|
([id label options]
|
||||||
|
[:div {:class :input-item}
|
||||||
|
[:label {:for id} label]
|
||||||
|
[:input (-> options
|
||||||
|
(assoc :defaultValue (:default options))
|
||||||
|
(dissoc :default)
|
||||||
|
(merge {:name id :id id}))]]))
|
||||||
|
|
||||||
|
|
||||||
|
(defn modal [content on-submit]
|
||||||
|
[:div {:class :popup}
|
||||||
|
[:form {:action "#" :on-submit on-submit}
|
||||||
|
content
|
||||||
|
[:div {:class :form-buttons}
|
||||||
|
[:button "add"]
|
||||||
|
[:button {:type :button :on-click #(re-frame/dispatch [::event/hide-modal])} "cancel"]]]])
|
20
src/cljs/chicken_master/products.cljs
Normal file
20
src/cljs/chicken_master/products.cljs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
(ns chicken-master.products
|
||||||
|
(:require
|
||||||
|
[re-frame.core :as re-frame]
|
||||||
|
[chicken-master.html :as html]
|
||||||
|
[chicken-master.events :as event]))
|
||||||
|
|
||||||
|
(defn product-item [what amount available]
|
||||||
|
[:div {:key (gensym)}
|
||||||
|
[:div {:class :input-item}
|
||||||
|
[:label {:for :product} "co"]
|
||||||
|
[:select {:name :product :id :product :defaultValue what}
|
||||||
|
[:option {:value nil} "-"]
|
||||||
|
(for [product available]
|
||||||
|
[:option {:key (gensym) :value product} (name product)])]]
|
||||||
|
(html/input :amount "ile" {:type :number :default amount :min 0})])
|
||||||
|
|
||||||
|
(defn format-product [[product amount]]
|
||||||
|
[:li {:key (gensym) :class :product}
|
||||||
|
[:input {:class :product-amount :type :number :min 0 :defaultValue amount}]
|
||||||
|
[:span {:class :product-name} product]])
|
@ -1,13 +1,15 @@
|
|||||||
(ns chicken-master.subs
|
(ns chicken-master.subs
|
||||||
(:require
|
(:require
|
||||||
[re-frame.core :as re-frame]))
|
[re-frame.core :as re-frame]
|
||||||
|
[chicken-master.time :as time]))
|
||||||
|
|
||||||
(re-frame/reg-sub
|
(re-frame/reg-sub ::name (fn [db] (:name db)))
|
||||||
::name
|
(re-frame/reg-sub ::available-products (fn [db] (-> db :products keys)))
|
||||||
(fn [db]
|
|
||||||
(:name db)))
|
|
||||||
|
|
||||||
(def settings {:first-day-offset 1
|
(re-frame/reg-sub ::show-edit-modal (fn [db] (-> db :order-edit :show)))
|
||||||
:day-names ["Niedz" "Pon" "Wt" "Śr" "Czw" "Pt" "Sob"]
|
(re-frame/reg-sub ::order-edit-who (fn [db] (-> db :order-edit :who)))
|
||||||
:always-day-names true
|
(re-frame/reg-sub ::order-edit-when (fn [db] (-> db :order-edit :hour)))
|
||||||
:show-order-time false})
|
(re-frame/reg-sub ::order-edit-products (fn [db] (-> db :order-edit :products)))
|
||||||
|
|
||||||
|
|
||||||
|
(re-frame/reg-sub ::current-days (fn [db] (:current-days db)))
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
(ns chicken-master.time
|
(ns chicken-master.time
|
||||||
(:require
|
(:require [chicken-master.config :refer [settings]])
|
||||||
[chicken-master.subs :as subs])
|
|
||||||
(:import [goog.date DateTime Date Interval]))
|
(:import [goog.date DateTime Date Interval]))
|
||||||
|
|
||||||
(defn date-offset
|
(defn date-offset
|
||||||
"Return the `date` offset by the given number of `days`"
|
"Return the `date` offset by the given number of `days`"
|
||||||
[date days]
|
[date days]
|
||||||
(let [new-day (new DateTime date)]
|
(let [new-day (new Date date)]
|
||||||
(.add new-day (new Interval Interval/DAYS days))
|
(.add new-day (new Interval Interval/DAYS days))
|
||||||
new-day))
|
new-day))
|
||||||
|
|
||||||
@ -14,13 +13,13 @@
|
|||||||
"Get the start of the week for the given `date"
|
"Get the start of the week for the given `date"
|
||||||
[date]
|
[date]
|
||||||
(->> (.getDay date)
|
(->> (.getDay date)
|
||||||
(- (subs/settings :first-day-offset))
|
(- (settings :first-day-offset))
|
||||||
(date-offset date)))
|
(date-offset date)))
|
||||||
|
|
||||||
(defn days-range
|
(defn days-range
|
||||||
"Return dates starting from `date`"
|
"Return dates starting from `date`"
|
||||||
([date] (map (partial date-offset date) (range)))
|
([date] (map (partial date-offset date) (range)))
|
||||||
([date n] (take n (days-range date))))
|
([n date] (take n (days-range date))))
|
||||||
|
|
||||||
(defn same-day?
|
(defn same-day?
|
||||||
"Returns true when both dates are from the same day" [d1 d2]
|
"Returns true when both dates are from the same day" [d1 d2]
|
||||||
@ -31,5 +30,5 @@
|
|||||||
|
|
||||||
(defn format-date [date]
|
(defn format-date [date]
|
||||||
(str
|
(str
|
||||||
(->> date .getDay (nth (subs/settings :day-names)))
|
(->> date .getDay (nth (settings :day-names)))
|
||||||
" " (.getMonth date) "/" (.getDate date)))
|
" " (.getMonth date) "/" (.getDate date)))
|
||||||
|
@ -3,15 +3,13 @@
|
|||||||
[re-frame.core :as re-frame]
|
[re-frame.core :as re-frame]
|
||||||
[chicken-master.subs :as subs]
|
[chicken-master.subs :as subs]
|
||||||
[chicken-master.calendar :as cal]
|
[chicken-master.calendar :as cal]
|
||||||
[chicken-master.time :as time]
|
[chicken-master.time :as time]))
|
||||||
))
|
|
||||||
|
|
||||||
(defn main-panel []
|
(defn main-panel []
|
||||||
(let [name (re-frame/subscribe [::subs/name])]
|
(let [name (re-frame/subscribe [::subs/name])]
|
||||||
[:div {:class :full-height}
|
[:div {:class :full-height}
|
||||||
(cal/add-order (new js/Date))
|
(when @(re-frame/subscribe [::subs/show-edit-modal])
|
||||||
(-> (new js/Date)
|
(cal/add-order (new js/Date)))
|
||||||
time/start-of-week
|
(cal/calendar @(re-frame/subscribe [::subs/current-days]))
|
||||||
(time/days-range 14)
|
|
||||||
cal/calendar)
|
|
||||||
]))
|
]))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user