Skip to content

Instantly share code, notes, and snippets.

@trikitrok
Created December 28, 2018 17:28
Show Gist options
  • Select an option

  • Save trikitrok/730c5aaade747504c08152c26c9f7836 to your computer and use it in GitHub Desktop.

Select an option

Save trikitrok/730c5aaade747504c08152c26c9f7836 to your computer and use it in GitHub Desktop.
(ns horizon.domain.reports.dialogs.edit
(:require
[com.rpl.specter :as specter]
[greenpowermonitor.re-om :as re-om]
[horizon.common.macros :refer [defstate]]
[horizon.common.state.lens :as l]
[horizon.common.utils.collections :as utils.collections]
[horizon.domain.reports.core :as domain.reports.core]
;; ...
[horizon.common.utils.time.core :as utils.time]))
(defstate reports-dialogs-edit
{:field-mappings {}
:options-mappings {}
:validators {}
:active-tab nil
:tabs []
:fields {}
:infractions {}
:configuration-fields {}
:original-fields {}
:loaded? false
:editing? false
:options {}})
;; ...
(def ^:private field-mappings-lens reports-dialogs-edit-field-mappings-lens)
(def ^:private options-lens reports-dialogs-edit-options-lens)
(def ^:private loaded?-lens reports-dialogs-edit-loaded?-lens)
(def ^:private fields-lens reports-dialogs-edit-fields-lens)
(def active-tab-lens reports-dialogs-edit-active-tab-lens)
(def ^:private tabs-lens reports-dialogs-edit-tabs-lens)
(def ^:private delay-generation-options-lens domain.reports.core/reports-options-date-selection-modes-data-lens)
;; ...
(defn- maybe-result [res]
(if (= res :form/empty)
nil
res))
(re-om/register-sub!
::field-mapping
(fn [db [args]]
(apply (l/pure-view db field-mappings-lens) args)))
;; ...
(re-om/register-sub!
::field
(fn [db args]
(let [res (if-let [path (re-om/get [::field-mapping args] db)]
(specter/select-one path (l/pure-view db fields-lens))
(get (l/pure-view db fields-lens) (first args) :form/empty))]
(maybe-result res))))
;; ...
(defn- delay->interval
[{:keys [number unit date-modes]}]
(let [{kw :Keyword} (utils.collections/find-by-kv-pair date-modes :Value unit)]
(get {"hour" {:hour (int number)}
"day" {:day (int number)}}
kw)))
(defn- get-next-generation [start-at delay-unit delay-number date-modes date-format]
(when (and start-at delay-number delay-unit)
(let [interval (delay->interval {:number delay-number
:unit delay-unit
:date-modes date-modes})
next-date (utils.time/offset start-at interval)]
(utils.time/strftime next-date date-format))))
(re-om/register-sub!
::next-generation-date
(fn [db [date-format {:keys [delay-generation-unit start-at delay-generation-number]}]]
(let [delay-unit (re-om/get [::field delay-generation-unit] db)
start-at (re-om/get [::field start-at] db)
delay-number (re-om/get [::field delay-generation-number] db)
date-modes (l/pure-view db delay-generation-options-lens)]
(get-next-generation start-at
delay-unit
delay-number
date-modes
date-format))))
;; ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment