diff --git a/src/cljs/chicken_master/calendar.cljs b/src/cljs/chicken_master/calendar.cljs index 63365bf..fef7f41 100644 --- a/src/cljs/chicken_master/calendar.cljs +++ b/src/cljs/chicken_master/calendar.cljs @@ -1,7 +1,6 @@ (ns chicken-master.calendar (:require [re-frame.core :as re-frame] - [chicken-master.config :refer [settings]] [chicken-master.subs :as subs] [chicken-master.html :as html] [chicken-master.products :as prod] @@ -27,7 +26,7 @@ ;; On success (fn [form] (re-frame/dispatch [::event/save-order (format-raw-order form)])))) -(defn format-order [{:keys [id who day hour notes products state]}] +(defn format-order [settings {:keys [id who day hour notes products state]}] [:div {:class [:order state] :key (gensym) :draggable true :on-drag-start #(-> % .-dataTransfer (.setData "text" id))} @@ -48,10 +47,10 @@ (if (and (settings :show-order-notes) notes) [:div {:class :notes} notes]) (->> products - (map prod/format-product) + (map (partial prod/format-product settings)) (into [:div {:class :products}]))]) -(defn day [[date orders]] +(defn day [settings [date orders]] [:div {:class [:day (when (-> date time/parse-date time/today?) :today)] :on-drag-over #(.preventDefault %) :on-drop #(let [id (-> % .-dataTransfer (.getData "text") prod/num-or-nil)] @@ -61,8 +60,8 @@ [:div [:div {:class :orders} (if (settings :hide-fulfilled-orders) - (->> orders (remove (comp #{:fulfilled} :state)) (map format-order)) - (map format-order orders)) + (->> orders (remove (comp #{:fulfilled} :state)) (map (partial format-order settings))) + (map (partial format-order settings) orders)) (when (settings :show-day-add-order) [:button {:type :button :on-click #(re-frame/dispatch [::event/edit-order date])} "+"]) @@ -74,18 +73,19 @@ (map :products) (apply merge-with +) (sort-by first) - (map prod/format-product) + (map (partial prod/format-product settings)) (into [:div {:class :products-sum}]))])]]]) -(defn calendar-header [] - (->> (:day-names settings) - cycle (drop (:first-day-offset settings)) +(defn calendar-header [settings] + (->> (settings :day-names) + cycle (drop (settings :first-day-offset)) (take 7) (map (fn [day] [:div {:class :day-header} day])) (into []))) -(defn calendar [days] +(defn calendar [days settings] + (html/modal :settings [:div "asd"]) (->> days - (map day) - (concat (when (settings :calendar-heading) (calendar-header))) + (map (partial day settings)) + (concat (when (settings :calendar-heading) (calendar-header settings))) (into [:div {:class [:calendar :full-height]}]))) diff --git a/src/cljs/chicken_master/config.cljs b/src/cljs/chicken_master/config.cljs index 6a9f6f0..20676e4 100644 --- a/src/cljs/chicken_master/config.cljs +++ b/src/cljs/chicken_master/config.cljs @@ -1,20 +1,78 @@ -(ns chicken-master.config) +(ns chicken-master.config + (:require [re-frame.core :as re-frame] + [chicken-master.time :as time] + [chicken-master.subs :as subs])) (def debug? ^boolean goog.DEBUG) -(def settings {:first-day-offset 1 ; which is the first day of the week (add the offset to `day-names`) - :day-names ["Niedz" "Pon" "Wt" "Śr" "Czw" "Pt" "Sob"] ; how day should be displayed in the calendar view - :calendar-heading false ; show a header with the names of days - :show-date true ; display the date for each day - :show-day-name-with-date true ; add the day name to each date - :show-day-add-order false ; Show an add order button in each day +(def default-settings {:first-day-offset 1 ; which is the first day of the week (add the offset to `day-names`) + :day-names ["Niedz" "Pon" "Wt" "Śr" "Czw" "Pt" "Sob"] ; how days should be displayed in the calendar view + :calendar-heading false ; show a header with the names of days + :show-date true ; display the date for each day + :show-day-name-with-date true ; add the day name to each date + :show-day-add-order false ; Show an add order button in each day - :show-order-time false ; display the time of each order - :show-order-notes true ; display notes - :editable-number-inputs false ; only allow number modifications in the edit modal - :hide-fulfilled-orders false + :show-order-time false ; display the time of each order + :show-order-notes true ; display notes + :editable-number-inputs false ; only allow number modifications in the edit modal + :hide-fulfilled-orders false - :http-dispatch :http;-xhrio - :backend-url "http://localhost:3000/" - }) + :http-dispatch :http;-xhrio + :backend-url "http://localhost:3000/" + }) + +(defn- settings [key] + (get @(re-frame/subscribe [::subs/settings]) key)) + + +(re-frame/reg-event-db + ::change-setting + (fn [{settings :settings :as db} [_ key val]] + (let [settings (assoc settings key val)] + (time/update-settings settings) + (assoc db :settings settings)))) + +(defn change-setting [key val] + (re-frame/dispatch [::change-setting key val])) + +(defn input [id label opts] + (let [parser (or (:parser opts) identity) + handlers (condp = (:type opts) + :checkbox {:defaultChecked (settings id) + :on-change #(change-setting id (-> % .-target .-checked parser))} + {:defaultValue (settings id) + :on-change #(change-setting id (-> % .-target .-value parser))})] + [:div {:class :input-item} + [:label {:for id} label] + [:input (merge {:name id :id id} handlers (dissoc opts :parser))]])) + +(defn settings-options [] + [:div + [:h3 "Ustawienia wyglądu kalendarza"] + (input :first-day-offset "o ile dni przesunąć niedziele w lewo" + {:type :number :max 7 :min 0 :parser #(js/parseInt %)}) + (input :day-names "skróty nazw dni tygodnia" + {:default (clojure.string/join ", " (settings :day-names)) + :parser #(clojure.string/split % #"\s*,\s*")}) + (input :calendar-heading "Pokaż nagłówek z dniami tygodnia" {:type :checkbox}) + + [:h3 "Ustawienia wyglądu poszczególnych dni"] + (input :show-date "Pokaż date" {:type :checkbox}) + (input :show-day-name-with-date "Pokaż nazwę dnia" {:type :checkbox}) + (input :show-day-add-order "Przycisk dodawania zamówienia" {:type :checkbox}) + + [:h3 "Ustawienia wyglądu zamówien"] + (input :show-order-time "pokaż czas zamówienia" {:type :checkbox}) + (input :show-order-notes "pokaż notki w zamówieniu" {:type :checkbox}) + (input :editable-number-inputs "możliwość bezposredniej edycji" {:type :checkbox}) + (input :hide-fulfilled-orders "ukryj wydane zamówienia" {:type :checkbox}) + + [:h3 "Ustawienia tyłu"] + [:label {:for :http-dispatch} "re-frame http dispatcher"] + [:select {:id :http-dispatch :name :http-dispatch + :on-change #(change-setting :http-dispatch (-> % .-target .-value keyword))} + [:option {:value :http} "client side mock"] + [:option {:value :http-xhrio} "re-frame-http-fx"]] + + (input :backend-url "backend URL" {})]) diff --git a/src/cljs/chicken_master/events.cljs b/src/cljs/chicken_master/events.cljs index c0f4178..8d7f5c9 100644 --- a/src/cljs/chicken_master/events.cljs +++ b/src/cljs/chicken_master/events.cljs @@ -3,7 +3,7 @@ [re-frame.core :as re-frame] [chicken-master.db :as db] [chicken-master.time :as time] - [chicken-master.config :refer [settings]] + [chicken-master.config :refer [settings default-settings]] [day8.re-frame.http-fx] [ajax.edn :as edn] @@ -33,7 +33,8 @@ (re-frame/reg-event-fx ::initialize-db (fn [_ _] - {:db db/default-db + (time/update-settings default-settings) + {:db (assoc db/default-db :settings default-settings) :fx [[:dispatch [::show-from-date (time/iso-date (time/today))]] [:dispatch [::fetch-stock]] [:dispatch [::fetch-orders]]]})) @@ -99,7 +100,7 @@ (re-frame/reg-event-fx ::scroll-weeks (fn [{db :db} [_ offset]] - {:fx [[:dispatch [::fetch-stock]] + {:fx [;[:dispatch [::fetch-stock]] [:dispatch [::show-from-date (-> db :start-date time/parse-date @@ -111,10 +112,10 @@ (fn [{:keys [start-date orders] :as db} [_ day]] (let [day (or day start-date) days (into #{} (time/get-weeks day 2)) - filtered-orders (->> orders vals (filter days))] + filtered-orders (->> orders vals (filter (comp days :day)) (group-by :day))] (assoc db :start-date day - :current-days (map #(vector % (get filtered-orders %)) days))))) + :current-days (map #(vector % (get filtered-orders %)) (sort days)))))) (re-frame/reg-event-fx ::fetch-orders @@ -152,7 +153,6 @@ (re-frame/reg-event-fx ::process-stock (fn [{db :db} [_ {:keys [products customers orders]}]] - (prn products customers orders) {:db (-> db (assoc-if :products products) (assoc-if :customers customers) @@ -182,6 +182,14 @@ {:dispatch [::hide-modal :stock] (settings :http-dispatch) (http-request :post "products" :body products :on-sucess ::process-stock)})) +;; Settings + +(re-frame/reg-event-fx + ::show-settings + (fn [{db :db} _] + {:db (assoc-in db [:settings :show] true)})) + + diff --git a/src/cljs/chicken_master/products.cljs b/src/cljs/chicken_master/products.cljs index 9325426..66cd46b 100644 --- a/src/cljs/chicken_master/products.cljs +++ b/src/cljs/chicken_master/products.cljs @@ -3,7 +3,6 @@ [clojure.string :as str] [re-frame.core :as re-frame] [reagent.core :as reagent] - [chicken-master.config :refer [settings]] [chicken-master.html :as html] [chicken-master.subs :as subs] [chicken-master.events :as event])) @@ -72,7 +71,7 @@ products ))))) -(defn format-product [[product amount]] +(defn format-product [settings [product amount]] [:div {:key (gensym) :class :product} [:span {:class :product-name} product] (if (settings :editable-number-inputs) diff --git a/src/cljs/chicken_master/subs.cljs b/src/cljs/chicken_master/subs.cljs index d239a83..0512951 100644 --- a/src/cljs/chicken_master/subs.cljs +++ b/src/cljs/chicken_master/subs.cljs @@ -2,6 +2,8 @@ (:require [re-frame.core :as re-frame])) (re-frame/reg-sub ::name (fn [db] (:name db))) +(re-frame/reg-sub ::settings (fn [db] (:settings db))) + (re-frame/reg-sub ::available-products (fn [db] (:products db))) (re-frame/reg-sub ::available-customers (fn [db] (:customers db))) (re-frame/reg-sub ::orders (fn [db] (:orders db))) @@ -9,6 +11,7 @@ (re-frame/reg-sub ::show-edit-modal (fn [db] (-> db :order-edit :show))) (re-frame/reg-sub ::show-stock-modal (fn [db] (-> db :stock :show))) (re-frame/reg-sub ::show-customers-modal (fn [db] (-> db :clients :show))) +(re-frame/reg-sub ::show-settings-modal (fn [db] (-> db :settings :show))) (re-frame/reg-sub ::order-edit-who (fn [db] (-> db :order-edit :who))) (re-frame/reg-sub ::order-edit-notes (fn [db] (-> db :order-edit :notes))) diff --git a/src/cljs/chicken_master/time.cljs b/src/cljs/chicken_master/time.cljs index 570c1be..1d8d15e 100644 --- a/src/cljs/chicken_master/time.cljs +++ b/src/cljs/chicken_master/time.cljs @@ -1,7 +1,9 @@ (ns chicken-master.time - (:require [chicken-master.config :refer [settings]]) (:import [goog.date DateTime Date Interval])) +(def settings (atom settings)) +(defn update-settings [new-settings] (reset! settings new-settings)) + (defn today [] (new Date)) (defn parse-date [date] (new Date (js/Date. date))) @@ -16,7 +18,7 @@ (defn start-of-week "Get the start of the week for the given `date" [date] - (let [offset (mod (+ 7 (.getDay date) (- (settings :first-day-offset))) 7)] + (let [offset (mod (+ 7 (.getDay date) (- (get @settings :first-day-offset 0))) 7)] (date-offset date (- offset)))) (defn days-range @@ -35,10 +37,10 @@ (defn today? "true when `d1` is today" [d1] (same-day? (js/Date.) d1)) (defn format-date [date] - (when (settings :show-date) - (if (settings :show-day-name-with-date) + (when (get @settings :show-date) + (if (get @settings :show-day-name-with-date) (str - (->> date .getDay (nth (settings :day-names))) + (->> date .getDay (nth (get @settings :day-names))) " " (inc (.getMonth date)) "/" (.getDate date)) (str (inc (.getMonth date)) "/" (.getDate date))))) diff --git a/src/cljs/chicken_master/views.cljs b/src/cljs/chicken_master/views.cljs index e5baa3c..d477f7d 100644 --- a/src/cljs/chicken_master/views.cljs +++ b/src/cljs/chicken_master/views.cljs @@ -5,18 +5,25 @@ [chicken-master.stock :as stock] [chicken-master.customers :as cust] [chicken-master.calendar :as cal] - [chicken-master.events :as event])) + [chicken-master.events :as event] + [chicken-master.html :as html] + [chicken-master.config :refer [settings-options]])) +(defn show-settings [] + (html/modal :settings (settings-options))) (defn main-panel [] [:div {:class :full-height} (cond @(re-frame/subscribe [::subs/show-stock-modal]) (stock/show-available) + @(re-frame/subscribe [::subs/show-settings-modal]) (show-settings) @(re-frame/subscribe [::subs/show-customers-modal]) (cust/show-customers) @(re-frame/subscribe [::subs/show-edit-modal]) (cal/edit-order)) [:button {:id :show-stock-button :class :menu-button :on-click #(re-frame/dispatch [::event/show-stock])} "Magazyn"] [:button {:id :show-clients-button :class :menu-button :on-click #(re-frame/dispatch [::event/show-customers])} "Klienci"] + [:button {:id :show-clients-button :class :menu-button :on-click #(re-frame/dispatch [::event/show-settings])} "Ustawienia"] + ;; (re-frame/dispatch [::event/show-settings]) [:button {:id :scroll-up-button :class [:menu-button :scroll-button] :on-click #(re-frame/dispatch [::event/scroll-weeks -2])} "^"] @@ -24,6 +31,6 @@ [:button {:id :scroll-up :on-click #(re-frame/dispatch [::event/scroll-weeks -2])} "^"] [:button {:id :scroll-down :on-click #(re-frame/dispatch [::event/scroll-weeks 2])} "v"]] - (cal/calendar @(re-frame/subscribe [::subs/current-days])) + (cal/calendar @(re-frame/subscribe [::subs/current-days]) @(re-frame/subscribe [::subs/settings])) [:button {:id :scroll-down-button :class [:menu-button :scroll-button] :on-click #(re-frame/dispatch [::event/scroll-weeks 2])} "v"] ])