mirror of
https://github.com/penpot/penpot.git
synced 2025-04-13 07:21:40 -05:00
Replace builtin rstore impl with potok.
This commit is contained in:
parent
6f8f115422
commit
40b48318ff
92 changed files with 965 additions and 1063 deletions
|
@ -4,7 +4,7 @@
|
|||
;;
|
||||
;; Copyright (c) 2015-2016 Andrey Antukh <niwi@niwi.nz>
|
||||
|
||||
(ns uxbox.main.state.colors
|
||||
(ns uxbox.builtins.colors
|
||||
(:require [uxbox.util.uuid :as uuid]
|
||||
[uxbox.util.data :refer (index-by)]))
|
||||
|
|
@ -3,17 +3,17 @@
|
|||
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
;;
|
||||
;; Copyright (c) 2015-2016 Andrey Antukh <niwi@niwi.nz>
|
||||
;; Copyright (c) 2015-2016 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
||||
|
||||
(ns uxbox.main
|
||||
(:require [uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
(:require [uxbox.store :as st]
|
||||
[uxbox.main.locales :as lc]
|
||||
[uxbox.main.ui :as ui]))
|
||||
[uxbox.main.ui :as ui]
|
||||
[uxbox.main.state :refer [initial-state]]
|
||||
[uxbox.util.storage :refer [storage]]))
|
||||
|
||||
(defn ^:export init
|
||||
[]
|
||||
(lc/init)
|
||||
(st/init)
|
||||
(st/init initial-state)
|
||||
(ui/init-routes)
|
||||
(ui/init))
|
||||
|
|
|
@ -3,21 +3,21 @@
|
|||
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
;;
|
||||
;; Copyright (c) 2015-2016 Andrey Antukh <niwi@niwi.nz>
|
||||
;; Copyright (c) 2015-2016 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
||||
|
||||
(ns uxbox.main.data.auth
|
||||
(:require [cljs.spec :as s]
|
||||
[beicon.core :as rx]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.repo :as rp]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.spec :as us]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.main.state :refer [initial-state]]
|
||||
[uxbox.main.data.projects :as udp]
|
||||
[uxbox.main.data.users :as udu]
|
||||
[uxbox.main.data.messages :as udm]
|
||||
[uxbox.util.storage :refer (storage)]))
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.spec :as us]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.storage :refer [storage]]))
|
||||
|
||||
(s/def ::username string?)
|
||||
(s/def ::password string?)
|
||||
|
@ -28,12 +28,12 @@
|
|||
;; --- Logged In
|
||||
|
||||
(defrecord LoggedIn [data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [this state]
|
||||
ptk/UpdateEvent
|
||||
(update [this state]
|
||||
(assoc state :auth data))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [this state s]
|
||||
ptk/WatchEvent
|
||||
(watch [this state s]
|
||||
(swap! storage assoc :auth data)
|
||||
(rx/of (udu/fetch-profile)
|
||||
(rt/navigate :dashboard/projects))))
|
||||
|
@ -49,12 +49,12 @@
|
|||
;; --- Login
|
||||
|
||||
(defrecord Login [username password]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
(merge state (dissoc (st/initial-state) :route)))
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(merge state (dissoc (initial-state) :route)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [this state s]
|
||||
ptk/WatchEvent
|
||||
(watch [this state s]
|
||||
(let [params {:username username
|
||||
:password password
|
||||
:scope "webapp"}
|
||||
|
@ -75,13 +75,13 @@
|
|||
;; --- Logout
|
||||
|
||||
(defrecord Logout []
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(swap! storage dissoc :auth)
|
||||
(merge state (dissoc (st/initial-state) :route)))
|
||||
(merge state (dissoc (initial-state) :route)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (rt/navigate :auth/login))))
|
||||
|
||||
(defn logout
|
||||
|
@ -93,8 +93,8 @@
|
|||
;; TODO: clean form on success
|
||||
|
||||
(defrecord Register [data on-error]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(letfn [(handle-error [{payload :payload}]
|
||||
(on-error payload)
|
||||
(rx/empty))]
|
||||
|
@ -121,8 +121,8 @@
|
|||
;; --- Recovery Request
|
||||
|
||||
(defrecord RecoveryRequest [data]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(letfn [(on-error [{payload :payload}]
|
||||
(println "on-error" payload)
|
||||
(rx/empty))]
|
||||
|
@ -146,8 +146,8 @@
|
|||
;; --- Check Recovery Token
|
||||
|
||||
(defrecord ValidateRecoveryToken [token]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(letfn [(on-error [{payload :payload}]
|
||||
(rx/of
|
||||
(rt/navigate :auth/login)
|
||||
|
@ -164,8 +164,8 @@
|
|||
;; --- Recovery (Password)
|
||||
|
||||
(defrecord Recovery [token password]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(letfn [(on-error [{payload :payload}]
|
||||
(udm/error (tr "errors.auth.invalid-recovery-token")))
|
||||
(on-success [{payload :payload}]
|
||||
|
|
|
@ -9,10 +9,10 @@
|
|||
[beicon.core :as rx]
|
||||
[uxbox.util.datetime :as dt]
|
||||
[uxbox.util.uuid :as uuid]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.color :as color]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.repo :as rp]))
|
||||
|
||||
;; --- Initialize
|
||||
|
@ -22,8 +22,8 @@
|
|||
(declare collections-fetched?)
|
||||
|
||||
(defrecord Initialize [type id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [type (or type :own)
|
||||
data {:type type
|
||||
:id id
|
||||
|
@ -32,8 +32,8 @@
|
|||
(assoc-in [:dashboard :colors] data)
|
||||
(assoc-in [:dashboard :section] :dashboard/colors))))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (fetch-collections))))
|
||||
|
||||
(defn initialize
|
||||
|
@ -43,8 +43,8 @@
|
|||
;; --- Select a Collection
|
||||
|
||||
(defrecord SelectCollection [type id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (r/navigate :dashboard/colors
|
||||
{:type type :id id}))))
|
||||
|
||||
|
@ -58,8 +58,8 @@
|
|||
;; --- Collections Fetched
|
||||
|
||||
(defrecord CollectionsFetched [data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [{:keys [version value]} data]
|
||||
(-> state
|
||||
(update :colors-collections merge value)
|
||||
|
@ -77,8 +77,8 @@
|
|||
;; --- Fetch Collections
|
||||
|
||||
(defrecord FetchCollections []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(->> (rp/req :fetch/kvstore "color-collections")
|
||||
(rx/map :payload)
|
||||
(rx/map collections-fetched))))
|
||||
|
@ -90,8 +90,8 @@
|
|||
;; --- Create Collection
|
||||
|
||||
(defrecord CreateCollection [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [item {:name "Unnamed collection"
|
||||
:id id
|
||||
:created-at (dt/now)
|
||||
|
@ -99,8 +99,8 @@
|
|||
:colors #{}}]
|
||||
(assoc-in state [:colors-collections id] item)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (persist-collections)
|
||||
(select-collection :own id))))
|
||||
|
||||
|
@ -112,8 +112,8 @@
|
|||
;; --- Persist Collections
|
||||
|
||||
(defrecord PersistCollections []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [builtin? #(= :builtin (:type %))
|
||||
xform (remove (comp builtin? second))
|
||||
version (or (get state ::version) -1)
|
||||
|
@ -133,12 +133,12 @@
|
|||
;; --- Rename Collection
|
||||
|
||||
(defrecord RenameCollection [id name]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:colors-collections id :name] name))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (persist-collections))))
|
||||
|
||||
(defn rename-collection
|
||||
|
@ -148,12 +148,12 @@
|
|||
;; --- Delete Collection
|
||||
|
||||
(defrecord DeleteCollection [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update state :colors-collections dissoc id))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [type (get-in state [:dashboard :colors :type])]
|
||||
(rx/of (persist-collections)
|
||||
(select-collection type)))))
|
||||
|
@ -165,13 +165,13 @@
|
|||
;; --- Replace Color
|
||||
|
||||
(defrecord ReplaceColor [id from to]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [replacer #(-> (disj % from) (conj to))]
|
||||
(update-in state [:colors-collections id :colors] (fnil replacer #{}))))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (persist-collections))))
|
||||
|
||||
(defn replace-color
|
||||
|
@ -182,13 +182,13 @@
|
|||
;; --- Remove Color
|
||||
|
||||
(defrecord RemoveColors [id colors]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:colors-collections id :colors]
|
||||
#(set/difference % colors)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (persist-collections))))
|
||||
|
||||
(defn remove-colors
|
||||
|
@ -199,18 +199,18 @@
|
|||
;; --- Select color
|
||||
|
||||
(defrecord SelectColor [color]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:dashboard :colors :selected] conj color)))
|
||||
|
||||
(defrecord DeselectColor [color]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:dashboard :colors :selected] disj color)))
|
||||
|
||||
(defrecord ToggleColorSelection [color]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [selected (get-in state [:dashboard :colors :selected])]
|
||||
(rx/of
|
||||
(if (selected color)
|
||||
|
@ -225,13 +225,13 @@
|
|||
;; --- Copy Selected Icon
|
||||
|
||||
(defrecord CopySelected [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [selected (get-in state [:dashboard :colors :selected])]
|
||||
(update-in state [:colors-collections id :colors] set/union selected)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (persist-collections))))
|
||||
|
||||
(defn copy-selected
|
||||
|
@ -242,15 +242,15 @@
|
|||
;; --- Move Selected Icon
|
||||
|
||||
(defrecord MoveSelected [from to]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [selected (get-in state [:dashboard :colors :selected])]
|
||||
(-> state
|
||||
(update-in [:colors-collections from :colors] set/difference selected)
|
||||
(update-in [:colors-collections to :colors] set/union selected))))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (persist-collections))))
|
||||
|
||||
(defn move-selected
|
||||
|
@ -262,8 +262,8 @@
|
|||
;; --- Delete Selected Colors
|
||||
|
||||
(defrecord DeleteSelectedColors []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [{:keys [id selected]} (get-in state [:dashboard :colors])]
|
||||
(rx/of (remove-colors id selected)
|
||||
#(assoc-in % [:dashboard :colors :selected] #{})))))
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
(ns uxbox.main.data.core
|
||||
"Worker related api and initialization events."
|
||||
(:require [beicon.core :as rx]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.workers :as uw]
|
||||
[uxbox.main.constants :as c]))
|
||||
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
(ns uxbox.main.data.dashboard
|
||||
(:require [beicon.core :as rx]
|
||||
[uxbox.util.uuid :as uuid]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.util.forms :as sc]
|
||||
[uxbox.main.repo :as rp]
|
||||
[uxbox.main.data.projects :as dp]
|
||||
|
@ -21,8 +21,8 @@
|
|||
;; --- Events
|
||||
|
||||
(defrecord InitializeDashboard [section]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update state :dashboard assoc
|
||||
:section section
|
||||
:collection-type :builtin
|
||||
|
@ -41,8 +41,8 @@
|
|||
(let [colls (sort-by :id (vals (:colors-by-id state)))]
|
||||
(assoc-in state [:dashboard :collection-id] (:id (first colls))))))]
|
||||
(reify
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(as-> state $
|
||||
(assoc-in $ [:dashboard :collection-type] type)
|
||||
(select-first $))))))
|
||||
|
@ -50,6 +50,6 @@
|
|||
(defn set-collection
|
||||
[id]
|
||||
(reify
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:dashboard :collection-id] id))))
|
||||
|
|
|
@ -8,13 +8,13 @@
|
|||
(:require [cuerdas.core :as str]
|
||||
[beicon.core :as rx]
|
||||
[lentes.core :as l]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.main.repo :as rp]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.forms :as sc]
|
||||
[uxbox.main.data.pages :as udp]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.util.datetime :as dt]
|
||||
[uxbox.util.data :refer (without-keys
|
||||
replace-by-id
|
||||
|
@ -32,9 +32,9 @@
|
|||
persists the state of the page in an undo stack."
|
||||
[]
|
||||
(letfn [(on-value [id]
|
||||
(rs/emit! (fetch-page-history id)
|
||||
(st/emit! (fetch-page-history id)
|
||||
(fetch-pinned-page-history id)))]
|
||||
(as-> rs/stream $
|
||||
(as-> st/store $
|
||||
(rx/filter udp/page-persisted? $)
|
||||
(rx/debounce 500 $)
|
||||
(rx/map (comp :id :data) $)
|
||||
|
@ -45,8 +45,8 @@
|
|||
(declare update-history-index)
|
||||
|
||||
(defrecord PinnedPageHistoryFetched [history]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(-> state
|
||||
(assoc-in [:workspace :history :pinned-items] (mapv :version history))
|
||||
(update-history-index history true))))
|
||||
|
@ -54,8 +54,8 @@
|
|||
;; --- Fetch Pinned Page History
|
||||
|
||||
(defrecord FetchPinnedPageHistory [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(letfn [(on-success [{history :payload}]
|
||||
(->PinnedPageHistoryFetched (into [] history)))]
|
||||
(let [params {:page id :pinned true}]
|
||||
|
@ -69,8 +69,8 @@
|
|||
;; --- Page History Fetched
|
||||
|
||||
(defrecord PageHistoryFetched [history append?]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(letfn [(update-counters [state items]
|
||||
(-> (assoc state :min-version (apply min items))
|
||||
(assoc :max-version (apply max items))))
|
||||
|
@ -91,8 +91,8 @@
|
|||
;; --- Fetch Page History
|
||||
|
||||
(defrecord FetchPageHistory [id since max]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(letfn [(on-success [{history :payload}]
|
||||
(let [history (into [] history)]
|
||||
(->PageHistoryFetched history (not (nil? since)))))]
|
||||
|
@ -111,8 +111,8 @@
|
|||
;; --- Select Page History
|
||||
|
||||
(defrecord SelectPageHistory [version]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [item (get-in state [:workspace :history :by-version version])
|
||||
page (get-in state [:pages (:page item)])
|
||||
page (assoc page
|
||||
|
@ -129,14 +129,14 @@
|
|||
;; --- Apply selected history
|
||||
|
||||
(defrecord ApplySelectedHistory [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(-> state
|
||||
(update-in [:pages id] dissoc :history)
|
||||
(assoc-in [:workspace :history :selected] nil)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (udp/persist-page id))))
|
||||
|
||||
(defn apply-selected-history
|
||||
|
@ -146,15 +146,15 @@
|
|||
;; --- Deselect Page History
|
||||
|
||||
(defrecord DeselectPageHistory [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [packed (get-in state [:packed-pages id])]
|
||||
(-> (udp/assoc-page state packed)
|
||||
(assoc-in [:workspace :history :deselecting] true)
|
||||
(assoc-in [:workspace :history :selected] nil))))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(->> (rx/of #(assoc-in % [:workspace :history :deselecting] false))
|
||||
(rx/delay 500))))
|
||||
|
||||
|
@ -165,8 +165,8 @@
|
|||
;; --- History Item Updated
|
||||
|
||||
(defrecord HistoryItemUpdated [item]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(-> state
|
||||
(update-in [:workspace :history :items] replace-by-id item)
|
||||
(update-in [:workspace :history :pinned-items] replace-by-id item))))
|
||||
|
@ -182,8 +182,8 @@
|
|||
;; --- Refresh Page History
|
||||
|
||||
(defrecord RefreshPageHistory [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [history (get-in state [:workspace :history])
|
||||
maxitems (count (:items history))]
|
||||
(rx/of (fetch-page-history id {:max maxitems})
|
||||
|
@ -196,8 +196,8 @@
|
|||
;; --- Update History Item
|
||||
|
||||
(defrecord UpdateHistoryItem [item]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(letfn [(on-success [{item :payload}]
|
||||
(->HistoryItemUpdated item))]
|
||||
(rx/merge
|
||||
|
@ -214,8 +214,8 @@
|
|||
;; --- Forward to Next Version
|
||||
|
||||
(defrecord ForwardToNextVersion []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [workspace (:workspace state)
|
||||
history (:history workspace)
|
||||
version (:selected history)]
|
||||
|
@ -239,8 +239,8 @@
|
|||
;; --- Backwards to Previous Version
|
||||
|
||||
(defrecord BackwardsToPreviousVersion []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [workspace (:workspace state)
|
||||
history (:history workspace)
|
||||
version (:selected history)]
|
||||
|
|
|
@ -9,11 +9,11 @@
|
|||
[beicon.core :as rx]
|
||||
[uxbox.util.data :refer (jscoll->vec)]
|
||||
[uxbox.util.uuid :as uuid]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.util.files :as files]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.repo :as rp]))
|
||||
|
||||
;; --- Initialize
|
||||
|
@ -23,16 +23,16 @@
|
|||
(declare collections-fetched?)
|
||||
|
||||
(defrecord Initialize [type id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [type (or type :own)
|
||||
data {:type type :id id :selected #{}}]
|
||||
(-> state
|
||||
(assoc-in [:dashboard :icons] data)
|
||||
(assoc-in [:dashboard :section] :dashboard/icons))))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/merge (rx/of (fetch-collections))
|
||||
(rx/of (fetch-icons id)))))
|
||||
|
||||
|
@ -43,8 +43,8 @@
|
|||
;; --- Select a Collection
|
||||
|
||||
(defrecord SelectCollection [type id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (r/navigate :dashboard/icons
|
||||
{:type type :id id}))))
|
||||
|
||||
|
@ -58,8 +58,8 @@
|
|||
;; --- Collections Fetched
|
||||
|
||||
(defrecord CollectionsFetched [items]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(reduce (fn [state {:keys [id user] :as item}]
|
||||
(let [type (if (uuid/zero? (:user item)) :builtin :own)
|
||||
item (assoc item :type type)]
|
||||
|
@ -74,8 +74,8 @@
|
|||
;; --- Fetch Collections
|
||||
|
||||
(defrecord FetchCollections []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(->> (rp/req :fetch/icon-collections)
|
||||
(rx/map :payload)
|
||||
(rx/map collections-fetched))))
|
||||
|
@ -87,13 +87,13 @@
|
|||
;; --- Collection Created
|
||||
|
||||
(defrecord CollectionCreated [item]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [{:keys [id] :as item} (assoc item :type :own)]
|
||||
(update state :icons-collections assoc id item)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (select-collection :own (:id item)))))
|
||||
|
||||
(defn collection-created
|
||||
|
@ -103,8 +103,8 @@
|
|||
;; --- Create Collection
|
||||
|
||||
(defrecord CreateCollection []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [name (str "Unnamed Collection (" (gensym "c") ")")
|
||||
coll {:name name}]
|
||||
(->> (rp/req :create/icon-collection coll)
|
||||
|
@ -122,8 +122,8 @@
|
|||
;; --- Collection Updated
|
||||
|
||||
(defrecord CollectionUpdated [item]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:icons-collections (:id item)] merge item)))
|
||||
|
||||
(defn collection-updated
|
||||
|
@ -133,8 +133,8 @@
|
|||
;; --- Update Collection
|
||||
|
||||
(defrecord UpdateCollection [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [item (get-in state [:icons-collections id])]
|
||||
(->> (rp/req :update/icon-collection item)
|
||||
(rx/map :payload)
|
||||
|
@ -147,12 +147,12 @@
|
|||
;; --- Rename Collection
|
||||
|
||||
(defrecord RenameCollection [id name]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:icons-collections id :name] name))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (update-collection id))))
|
||||
|
||||
(defn rename-collection
|
||||
|
@ -162,12 +162,12 @@
|
|||
;; --- Delete Collection
|
||||
|
||||
(defrecord DeleteCollection [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update state :icons-collections dissoc id))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [type (get-in state [:dashboard :icons :type])]
|
||||
(->> (rp/req :delete/icon-collection id)
|
||||
(rx/map #(select-collection type))))))
|
||||
|
@ -179,8 +179,8 @@
|
|||
;; --- Icon Created
|
||||
|
||||
(defrecord IconCreated [item]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [{:keys [id] :as item} (assoc item :type :icon)]
|
||||
(update state :icons assoc id item))))
|
||||
|
||||
|
@ -220,8 +220,8 @@
|
|||
[(dom/get-outer-html g) props])))))
|
||||
|
||||
(defrecord CreateIcons [id files]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(letfn [(parse [file]
|
||||
(->> (files/read-as-text file)
|
||||
(rx/map parse-svg)))
|
||||
|
@ -248,8 +248,8 @@
|
|||
;; --- Icon Persisted
|
||||
|
||||
(defrecord IconPersisted [id data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:icons id] data)))
|
||||
|
||||
(defn icon-persisted
|
||||
|
@ -260,8 +260,8 @@
|
|||
;; --- Persist Icon
|
||||
|
||||
(defrecord PersistIcon [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [icon (get-in state [:icons id])]
|
||||
(->> (rp/req :update/icon icon)
|
||||
(rx/map :payload)
|
||||
|
@ -275,8 +275,8 @@
|
|||
;; --- Icons Fetched
|
||||
|
||||
(defrecord IconsFetched [items]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(reduce (fn [state {:keys [id] :as icon}]
|
||||
(let [icon (assoc icon :type :icon)]
|
||||
(assoc-in state [:icons id] icon)))
|
||||
|
@ -290,8 +290,8 @@
|
|||
;; --- Load Icons
|
||||
|
||||
(defrecord FetchIcons [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [params {:coll id}]
|
||||
(->> (rp/req :fetch/icons params)
|
||||
(rx/map :payload)
|
||||
|
@ -305,14 +305,14 @@
|
|||
;; --- Delete Icons
|
||||
|
||||
(defrecord DeleteIcon [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(-> state
|
||||
(update :icons dissoc id)
|
||||
(update-in [:dashboard :icons :selected] disj id)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(->> (rp/req :delete/icon id)
|
||||
(rx/ignore))))
|
||||
|
||||
|
@ -324,12 +324,12 @@
|
|||
;; --- Rename Icon
|
||||
|
||||
(defrecord RenameIcon [id name]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:icons id :name] name))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (persist-icon id))))
|
||||
|
||||
(defn rename-icon
|
||||
|
@ -340,18 +340,18 @@
|
|||
;; --- Select icon
|
||||
|
||||
(defrecord SelectIcon [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:dashboard :icons :selected] conj id)))
|
||||
|
||||
(defrecord DeselectIcon [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:dashboard :icons :selected] disj id)))
|
||||
|
||||
(defrecord ToggleIconSelection [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [selected (get-in state [:dashboard :icons :selected])]
|
||||
(rx/of
|
||||
(if (selected id)
|
||||
|
@ -370,8 +370,8 @@
|
|||
;; --- Copy Selected Icon
|
||||
|
||||
(defrecord CopySelected [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [selected (get-in state [:dashboard :icons :selected])]
|
||||
(rx/merge
|
||||
(->> (rx/from-coll selected)
|
||||
|
@ -392,16 +392,16 @@
|
|||
;; --- Move Selected Icon
|
||||
|
||||
(defrecord MoveSelected [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [selected (get-in state [:dashboard :icons :selected])]
|
||||
(reduce (fn [state icon]
|
||||
(assoc-in state [:icons icon :collection] id))
|
||||
state
|
||||
selected)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [selected (get-in state [:dashboard :icons :selected])]
|
||||
(rx/merge
|
||||
(->> (rx/from-coll selected)
|
||||
|
@ -417,8 +417,8 @@
|
|||
;; --- Delete Selected
|
||||
|
||||
(defrecord DeleteSelected []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [selected (get-in state [:dashboard :icons :selected])]
|
||||
(->> (rx/from-coll selected)
|
||||
(rx/map delete-icon)))))
|
||||
|
@ -430,8 +430,8 @@
|
|||
;; --- Update Opts (Filtering & Ordering)
|
||||
|
||||
(defrecord UpdateOpts [order filter edition]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:dashboard :icons] merge
|
||||
{:edition edition}
|
||||
(when order {:order order})
|
||||
|
|
|
@ -9,10 +9,10 @@
|
|||
[beicon.core :as rx]
|
||||
[uxbox.util.data :refer (jscoll->vec)]
|
||||
[uxbox.util.uuid :as uuid]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.files :as files]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.repo :as rp]))
|
||||
|
||||
;; --- Initialize
|
||||
|
@ -22,16 +22,16 @@
|
|||
(declare collections-fetched?)
|
||||
|
||||
(defrecord Initialize [type id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [type (or type :own)
|
||||
data {:type type :id id :selected #{}}]
|
||||
(-> state
|
||||
(assoc-in [:dashboard :images] data)
|
||||
(assoc-in [:dashboard :section] :dashboard/images))))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/merge (rx/of (fetch-collections))
|
||||
(rx/of (fetch-images id)))))
|
||||
|
||||
|
@ -42,8 +42,8 @@
|
|||
;; --- Select a Collection
|
||||
|
||||
(defrecord SelectCollection [type id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (r/navigate :dashboard/images
|
||||
{:type type :id id}))))
|
||||
|
||||
|
@ -57,8 +57,8 @@
|
|||
;; --- Color Collections Fetched
|
||||
|
||||
(defrecord CollectionsFetched [items]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(reduce (fn [state {:keys [id user] :as item}]
|
||||
(let [type (if (uuid/zero? (:user item)) :builtin :own)
|
||||
item (assoc item :type type)]
|
||||
|
@ -73,8 +73,8 @@
|
|||
;; --- Fetch Color Collections
|
||||
|
||||
(defrecord FetchCollections []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(->> (rp/req :fetch/image-collections)
|
||||
(rx/map :payload)
|
||||
(rx/map collections-fetched))))
|
||||
|
@ -86,13 +86,13 @@
|
|||
;; --- Collection Created
|
||||
|
||||
(defrecord CollectionCreated [item]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [{:keys [id] :as item} (assoc item :type :own)]
|
||||
(update state :images-collections assoc id item)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (select-collection :own (:id item)))))
|
||||
|
||||
(defn collection-created
|
||||
|
@ -102,8 +102,8 @@
|
|||
;; --- Create Collection
|
||||
|
||||
(defrecord CreateCollection []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [coll {:name "Unnamed collection"
|
||||
:id (uuid/random)}]
|
||||
(->> (rp/req :create/image-collection coll)
|
||||
|
@ -121,8 +121,8 @@
|
|||
;; --- Collection Updated
|
||||
|
||||
(defrecord CollectionUpdated [item]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:images-collections (:id item)] merge item)))
|
||||
|
||||
(defn collection-updated
|
||||
|
@ -132,8 +132,8 @@
|
|||
;; --- Update Collection
|
||||
|
||||
(defrecord UpdateCollection [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [item (get-in state [:images-collections id])]
|
||||
(->> (rp/req :update/image-collection item)
|
||||
(rx/map :payload)
|
||||
|
@ -146,12 +146,12 @@
|
|||
;; --- Rename Collection
|
||||
|
||||
(defrecord RenameCollection [id name]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:images-collections id :name] name))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (update-collection id))))
|
||||
|
||||
(defn rename-collection
|
||||
|
@ -161,12 +161,12 @@
|
|||
;; --- Delete Collection
|
||||
|
||||
(defrecord DeleteCollection [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update state :images-collections dissoc id))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [type (get-in state [:dashboard :images :type])]
|
||||
(->> (rp/req :delete/image-collection id)
|
||||
(rx/map #(select-collection type))))))
|
||||
|
@ -178,8 +178,8 @@
|
|||
;; --- Image Created
|
||||
|
||||
(defrecord ImageCreated [item]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update state :images assoc (:id item) item)))
|
||||
|
||||
(defn image-created
|
||||
|
@ -191,12 +191,12 @@
|
|||
(def allowed-file-types #{"image/jpeg" "image/png"})
|
||||
|
||||
(defrecord CreateImages [id files on-uploaded]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:dashboard :images :uploading] true))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(letfn [(image-size [file]
|
||||
(->> (files/get-image-size file)
|
||||
(rx/map (partial vector file))))
|
||||
|
@ -218,7 +218,7 @@
|
|||
(rx/mapcat #(rp/req :create/image %))
|
||||
(rx/map :payload)
|
||||
(rx/reduce conj [])
|
||||
(rx/do #(rs/emit! finalize-upload))
|
||||
(rx/do #(st/emit! finalize-upload))
|
||||
(rx/do on-uploaded)
|
||||
(rx/mapcat identity)
|
||||
(rx/map image-created)))))
|
||||
|
@ -234,8 +234,8 @@
|
|||
;; --- Image Updated
|
||||
|
||||
(defrecord ImagePersisted [id data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:images id] data)))
|
||||
|
||||
(defn image-persisted
|
||||
|
@ -246,8 +246,8 @@
|
|||
;; --- Update Image
|
||||
|
||||
(defrecord PersistImage [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [image (get-in state [:images id])]
|
||||
(->> (rp/req :update/image image)
|
||||
(rx/map :payload)
|
||||
|
@ -261,8 +261,8 @@
|
|||
;; --- Images Fetched
|
||||
|
||||
(defrecord ImagesFetched [items]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(reduce (fn [state {:keys [id] :as image}]
|
||||
(assoc-in state [:images id] image))
|
||||
state
|
||||
|
@ -275,8 +275,8 @@
|
|||
;; --- Fetch Images
|
||||
|
||||
(defrecord FetchImages [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [params {:coll id}]
|
||||
(->> (rp/req :fetch/images params)
|
||||
(rx/map :payload)
|
||||
|
@ -293,8 +293,8 @@
|
|||
(declare image-fetched)
|
||||
|
||||
(defrecord FetchImage [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [existing (get-in state [:images id])]
|
||||
(if existing
|
||||
(rx/empty)
|
||||
|
@ -312,8 +312,8 @@
|
|||
;; --- Image Fetched
|
||||
|
||||
(defrecord ImageFetched [image]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [id (:id image)]
|
||||
(update state :images assoc id image))))
|
||||
|
||||
|
@ -325,14 +325,14 @@
|
|||
;; --- Delete Images
|
||||
|
||||
(defrecord DeleteImage [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(-> state
|
||||
(update :images dissoc id)
|
||||
(update-in [:dashboard :images :selected] disj id)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(->> (rp/req :delete/image id)
|
||||
(rx/ignore))))
|
||||
|
||||
|
@ -344,12 +344,12 @@
|
|||
;; --- Rename Image
|
||||
|
||||
(defrecord RenameImage [id name]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:images id :name] name))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (persist-image id))))
|
||||
|
||||
(defn rename-image
|
||||
|
@ -360,18 +360,18 @@
|
|||
;; --- Select image
|
||||
|
||||
(defrecord SelectImage [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:dashboard :images :selected] conj id)))
|
||||
|
||||
(defrecord DeselectImage [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:dashboard :images :selected] disj id)))
|
||||
|
||||
(defrecord ToggleImageSelection [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [selected (get-in state [:dashboard :images :selected])]
|
||||
(rx/of
|
||||
(if (selected id)
|
||||
|
@ -390,8 +390,8 @@
|
|||
;; --- Copy Selected Image
|
||||
|
||||
(defrecord CopySelected [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [selected (get-in state [:dashboard :images :selected])]
|
||||
(rx/merge
|
||||
(->> (rx/from-coll selected)
|
||||
|
@ -409,16 +409,16 @@
|
|||
;; --- Move Selected Image
|
||||
|
||||
(defrecord MoveSelected [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [selected (get-in state [:dashboard :images :selected])]
|
||||
(reduce (fn [state image]
|
||||
(assoc-in state [:images image :collection] id))
|
||||
state
|
||||
selected)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [selected (get-in state [:dashboard :images :selected])]
|
||||
(rx/merge
|
||||
(->> (rx/from-coll selected)
|
||||
|
@ -434,8 +434,8 @@
|
|||
;; --- Delete Selected
|
||||
|
||||
(defrecord DeleteSelected []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [selected (get-in state [:dashboard :images :selected])]
|
||||
(->> (rx/from-coll selected)
|
||||
(rx/map delete-image)))))
|
||||
|
@ -447,8 +447,8 @@
|
|||
;; --- Update Opts (Filtering & Ordering)
|
||||
|
||||
(defrecord UpdateOpts [order filter edition]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:dashboard :images] merge
|
||||
{:edition edition}
|
||||
(when order {:order order})
|
||||
|
|
|
@ -7,13 +7,14 @@
|
|||
(ns uxbox.main.data.lightbox
|
||||
(:require [beicon.core :as rx]
|
||||
[lentes.core :as l]
|
||||
[uxbox.util.rstore :as rs]))
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]))
|
||||
|
||||
;; --- Show Lightbox
|
||||
|
||||
(defrecord ShowLightbox [name params]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [data (merge {:name name} params)]
|
||||
(assoc state :lightbox data))))
|
||||
|
||||
|
@ -26,8 +27,8 @@
|
|||
;; --- Hide Lightbox
|
||||
|
||||
(defrecord HideLightbox []
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(dissoc state :lightbox)))
|
||||
|
||||
(defn hide-lightbox
|
||||
|
@ -38,8 +39,8 @@
|
|||
|
||||
(defn open!
|
||||
[& args]
|
||||
(rs/emit! (apply show-lightbox args)))
|
||||
(st/emit! (apply show-lightbox args)))
|
||||
|
||||
(defn close!
|
||||
[& args]
|
||||
(rs/emit! (apply hide-lightbox args)))
|
||||
(st/emit! (apply hide-lightbox args)))
|
||||
|
|
|
@ -8,8 +8,9 @@
|
|||
(:require [cuerdas.core :as str]
|
||||
[beicon.core :as rx]
|
||||
[lentes.core :as l]
|
||||
[uxbox.util.timers :as ts]
|
||||
[uxbox.util.rstore :as rs]))
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.util.timers :as ts]))
|
||||
|
||||
;; --- Constants
|
||||
|
||||
|
@ -21,13 +22,13 @@
|
|||
(declare show-message?)
|
||||
|
||||
(defrecord ShowMessage [data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [message (assoc data :state :visible)]
|
||||
(assoc state :message message)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [stoper (->> (rx/filter show-message? s)
|
||||
(rx/take 1))]
|
||||
(->> (rx/of (hide-message))
|
||||
|
@ -65,16 +66,16 @@
|
|||
;; --- Hide Message
|
||||
|
||||
(defrecord HideMessage [^:mutable canceled?]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update state :message
|
||||
(fn [v]
|
||||
(if (nil? v)
|
||||
(do (set! canceled? true) nil)
|
||||
(assoc v :state :hide)))))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(if canceled?
|
||||
(rx/empty)
|
||||
(->> (rx/of #(dissoc state :message))
|
||||
|
@ -88,19 +89,19 @@
|
|||
|
||||
(defn error!
|
||||
[& args]
|
||||
(ts/schedule 0 #(rs/emit! (apply show-error args))))
|
||||
(ts/schedule 0 #(st/emit! (apply show-error args))))
|
||||
|
||||
(defn info!
|
||||
[& args]
|
||||
(ts/schedule 0 #(rs/emit! (apply show-info args))))
|
||||
(ts/schedule 0 #(st/emit! (apply show-info args))))
|
||||
|
||||
(defn dialog!
|
||||
[& args]
|
||||
(ts/schedule 0 #(rs/emit! (apply show-dialog args))))
|
||||
(ts/schedule 0 #(st/emit! (apply show-dialog args))))
|
||||
|
||||
(defn close!
|
||||
[]
|
||||
(rs/emit! (hide-message)))
|
||||
(st/emit! (hide-message)))
|
||||
|
||||
(defn error
|
||||
[& args]
|
||||
|
|
|
@ -10,9 +10,9 @@
|
|||
[beicon.core :as rx]
|
||||
[lentes.core :as l]
|
||||
[uxbox.main.repo :as rp]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.util.spec :as us]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.forms :as sc]
|
||||
|
@ -99,8 +99,8 @@
|
|||
;; --- Pages Fetched
|
||||
|
||||
(defrecord PagesFetched [pages]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(as-> state $
|
||||
(reduce assoc-page $ pages)
|
||||
(reduce assoc-packed-page $ pages))))
|
||||
|
@ -112,8 +112,8 @@
|
|||
;; --- Fetch Pages (by project id)
|
||||
|
||||
(defrecord FetchPages [projectid]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(->> (rp/req :fetch/pages-by-project {:project projectid})
|
||||
(rx/map (comp ->PagesFetched :payload)))))
|
||||
|
||||
|
@ -124,8 +124,8 @@
|
|||
;; --- Page Created
|
||||
|
||||
(defrecord PageCreated [data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(-> state
|
||||
(assoc-page data)
|
||||
(assoc-packed-page data))))
|
||||
|
@ -141,8 +141,8 @@
|
|||
;; --- Create Page
|
||||
|
||||
(defrecord CreatePage [name project width height layout]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [this state s]
|
||||
ptk/WatchEvent
|
||||
(watch [this state s]
|
||||
(let [params {:name name
|
||||
:project project
|
||||
:data {}
|
||||
|
@ -164,8 +164,8 @@
|
|||
;; --- Page Persisted
|
||||
|
||||
(defrecord PagePersisted [data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-page state data)))
|
||||
|
||||
(defn- page-persisted?
|
||||
|
@ -182,8 +182,8 @@
|
|||
;; --- Persist Page
|
||||
|
||||
(defrecord PersistPage [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [this state s]
|
||||
ptk/WatchEvent
|
||||
(watch [this state s]
|
||||
(let [page (get-in state [:pages id])]
|
||||
(if (:history page)
|
||||
(rx/empty)
|
||||
|
@ -210,16 +210,16 @@
|
|||
events with 1sec of delay allowing batch updates
|
||||
on fastly performed events."
|
||||
[id]
|
||||
(as-> rs/stream $
|
||||
(as-> st/store $
|
||||
(rx/filter #(satisfies? IPageUpdate %) $)
|
||||
(rx/debounce 1000 $)
|
||||
(rx/on-next $ #(rs/emit! (persist-page id)))))
|
||||
(rx/on-next $ #(st/emit! (persist-page id)))))
|
||||
|
||||
;; --- Page Metadata Persisted
|
||||
|
||||
(defrecord MetadataPersisted [id data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
;; TODO: page-data update
|
||||
(assoc-in state [:pages id :version] (:version data))))
|
||||
|
||||
|
@ -238,8 +238,8 @@
|
|||
;; and only serves for update other page data.
|
||||
|
||||
(defrecord PersistMetadata [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [page (get-in state [:pages id])]
|
||||
(->> (rp/req :update/page-metadata page)
|
||||
(rx/map :payload)
|
||||
|
@ -253,12 +253,12 @@
|
|||
;; --- Update Page Options
|
||||
|
||||
(defrecord UpdateMetadata [id metadata]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:pages id :metadata] metadata))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [this state s]
|
||||
ptk/WatchEvent
|
||||
(watch [this state s]
|
||||
(rx/of (persist-metadata id))))
|
||||
|
||||
(defn update-metadata
|
||||
|
@ -269,8 +269,8 @@
|
|||
;; --- Update Page
|
||||
|
||||
(defrecord UpdatePage [id name width height layout]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [this state]
|
||||
ptk/UpdateEvent
|
||||
(update [this state]
|
||||
(println "update-page" this)
|
||||
(-> state
|
||||
(assoc-in [:pages id :name] name)
|
||||
|
@ -278,8 +278,8 @@
|
|||
(assoc-in [:pages id :metadata :height] height)
|
||||
(assoc-in [:pages id :metadata :layout] layout)))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (persist-metadata id))))
|
||||
|
||||
(s/def ::update-page-event
|
||||
|
@ -293,8 +293,8 @@
|
|||
;; --- Delete Page (by id)
|
||||
|
||||
(defrecord DeletePage [id callback]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(letfn [(on-success [_]
|
||||
#(purge-page % id))]
|
||||
(->> (rp/req :delete/page id)
|
||||
|
|
|
@ -8,10 +8,10 @@
|
|||
(ns uxbox.main.data.projects
|
||||
(:require [cuerdas.core :as str]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.repo :as rp]
|
||||
[uxbox.main.data.pages :as udp]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.forms :as sc]
|
||||
|
@ -54,12 +54,12 @@
|
|||
(declare projects-fetched?)
|
||||
|
||||
(defrecord Initialize []
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:dashboard :section] :dashboard/projects))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (fetch-projects))))
|
||||
|
||||
(defn initialize
|
||||
|
@ -69,8 +69,8 @@
|
|||
;; --- Projects Fetched
|
||||
|
||||
(defrecord ProjectsFetched [projects]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(as-> state $
|
||||
(reduce assoc-project-page $ projects)
|
||||
(reduce assoc-project $ projects))))
|
||||
|
@ -86,8 +86,8 @@
|
|||
;; --- Fetch Projects
|
||||
|
||||
(defrecord FetchProjects []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(->> (rp/req :fetch/projects)
|
||||
(rx/map :payload)
|
||||
(rx/map projects-fetched))))
|
||||
|
@ -99,8 +99,8 @@
|
|||
;; --- Project Persisted
|
||||
|
||||
(defrecord ProjectPersisted [data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-project state data)))
|
||||
|
||||
(defn project-persisted
|
||||
|
@ -111,8 +111,8 @@
|
|||
;; --- Persist Project
|
||||
|
||||
(defrecord PersistProject [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [project (get-in state [:projects id])]
|
||||
(->> (rp/req :update/project project)
|
||||
(rx/map :payload)
|
||||
|
@ -126,12 +126,12 @@
|
|||
;; --- Rename Project
|
||||
|
||||
(defrecord RenameProject [id name]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:projects id :name] name))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(rx/of (persist-project id))))
|
||||
|
||||
(defn rename-project
|
||||
|
@ -142,8 +142,8 @@
|
|||
;; --- Delete Project (by id)
|
||||
|
||||
(defrecord DeleteProject [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(letfn [(on-success [_]
|
||||
#(dissoc-project % id))]
|
||||
(->> (rp/req :delete/project id)
|
||||
|
@ -158,8 +158,8 @@
|
|||
;; --- Create Project
|
||||
|
||||
(defrecord CreateProject [name width height layout]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [this state s]
|
||||
ptk/WatchEvent
|
||||
(watch [this state s]
|
||||
(letfn [(on-success [{project :payload}]
|
||||
(rx/of
|
||||
(project-persisted project)
|
||||
|
@ -185,8 +185,8 @@
|
|||
;; --- Go To & Go To Page
|
||||
|
||||
(defrecord GoTo [project-id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [page-id (get-in state [:projects project-id :page-id])
|
||||
params {:project project-id
|
||||
:page page-id}]
|
||||
|
@ -194,8 +194,8 @@
|
|||
(rt/navigate :workspace/page params)))))
|
||||
|
||||
(defrecord GoToPage [project-id page-id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [params {:project project-id
|
||||
:page page-id}]
|
||||
(rx/of (rt/navigate :workspace/page params)))))
|
||||
|
@ -214,8 +214,8 @@
|
|||
;; --- Update Opts (Filtering & Ordering)
|
||||
|
||||
(defrecord UpdateOpts [order filter]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:dashboard :projects] merge
|
||||
(when order {:order order})
|
||||
(when filter {:filter filter}))))
|
||||
|
|
|
@ -8,13 +8,13 @@
|
|||
(ns uxbox.main.data.shapes
|
||||
(:require [beicon.core :as rx]
|
||||
[uxbox.util.uuid :as uuid]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.forms :as sc]
|
||||
[uxbox.util.workers :as uw]
|
||||
[uxbox.main.constants :as c]
|
||||
[uxbox.main.geom :as geom]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.core :refer (worker)]
|
||||
[uxbox.main.data.shapes-impl :as impl]
|
||||
[uxbox.main.data.pages :as udp]
|
||||
|
@ -28,8 +28,8 @@
|
|||
[shape]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [page (get-in state [:workspace :page])
|
||||
shape (geom/setup-proportions shape)]
|
||||
(impl/assoc-shape-to-page state shape page)))))
|
||||
|
@ -39,8 +39,8 @@
|
|||
[id]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [shape (get-in state [:shapes id])]
|
||||
(impl/dissoc-shape state shape)))))
|
||||
|
||||
|
@ -49,8 +49,8 @@
|
|||
[{:keys [id] :as shape}]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes id] merge shape))))
|
||||
|
||||
;; --- Shape Transformations
|
||||
|
@ -60,8 +60,8 @@
|
|||
[sid delta]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [shape (get-in state [:shapes sid])]
|
||||
(update-in state [:shapes sid] geom/move delta)))))
|
||||
|
||||
|
@ -74,8 +74,8 @@
|
|||
(defn initial-align-shape
|
||||
[id]
|
||||
(reify
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [shape (get-in state [:shapes id])
|
||||
shape (geom/outer-rect state shape)
|
||||
point (gpt/point (:x shape) (:y shape))
|
||||
|
@ -88,8 +88,8 @@
|
|||
[sid {:keys [x1 y1 x2 y2] :as opts}]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [shape (get-in state [:shapes sid])
|
||||
props (select-keys opts [:x1 :y1 :x2 :y2])
|
||||
props' (select-keys shape [:x1 :y1 :x2 :y2])]
|
||||
|
@ -103,8 +103,8 @@
|
|||
(>= 360 rotation)]}
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes sid]
|
||||
geom/rotate rotation))))
|
||||
|
||||
|
@ -116,23 +116,23 @@
|
|||
{:pre [(uuid? sid)]}
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes sid] geom/resize-dim opts))))
|
||||
|
||||
(defn update-vertex-position
|
||||
[id {:keys [vid delta]}]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes id] geom/move-vertex vid delta))))
|
||||
|
||||
(defn initial-vertext-align
|
||||
[id vid]
|
||||
(reify
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [shape (get-in state [:shapes id])
|
||||
point (geom/get-vertex-point shape vid)
|
||||
point (gpt/add point canvas-coords)]
|
||||
|
@ -144,8 +144,8 @@
|
|||
"Update the start position coordenate of the shape."
|
||||
[sid {:keys [x y] :as opts}]
|
||||
(reify
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes sid] geom/absolute-move opts))))
|
||||
|
||||
(defn update-text
|
||||
|
@ -153,16 +153,16 @@
|
|||
{:pre [(string? content)]}
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:shapes sid :content] content))))
|
||||
|
||||
(defn update-fill-attrs
|
||||
[sid {:keys [color opacity] :as opts}]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes sid]
|
||||
merge
|
||||
(when color {:fill color})
|
||||
|
@ -173,8 +173,8 @@
|
|||
letter-spacing line-height] :as opts}]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes sid :font]
|
||||
merge
|
||||
(when line-height {:line-height line-height})
|
||||
|
@ -189,8 +189,8 @@
|
|||
[sid {:keys [color opacity type width] :as opts}]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes sid]
|
||||
merge
|
||||
(when type {:stroke-type type})
|
||||
|
@ -202,8 +202,8 @@
|
|||
[sid {:keys [rx ry] :as opts}]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes sid]
|
||||
merge
|
||||
(when rx {:rx rx})
|
||||
|
@ -219,8 +219,8 @@
|
|||
{:pre [(uuid? sid)]}
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [[width height] (-> (get-in state [:shapes sid])
|
||||
(geom/size)
|
||||
(keep [:width :height]))
|
||||
|
@ -234,8 +234,8 @@
|
|||
{:pre [(uuid? sid)]}
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes sid] assoc
|
||||
:proportion-lock false))))
|
||||
|
||||
|
@ -246,8 +246,8 @@
|
|||
{:pre [(uuid? id)]}
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes id] assoc :collapsed true))))
|
||||
|
||||
(defn uncollapse-shape
|
||||
|
@ -255,8 +255,8 @@
|
|||
{:pre [(uuid? id)]}
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes id] assoc :collapsed false))))
|
||||
|
||||
;; --- Shape Visibility
|
||||
|
@ -265,12 +265,12 @@
|
|||
[sid]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:shapes sid :hidden] true))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [shape (get-in state [:shapes sid])]
|
||||
(if-not (= (:type shape) :group)
|
||||
(rx/empty)
|
||||
|
@ -281,12 +281,12 @@
|
|||
[sid]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:shapes sid :hidden] false))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [shape (get-in state [:shapes sid])]
|
||||
(if-not (= (:type shape) :group)
|
||||
(rx/empty)
|
||||
|
@ -297,12 +297,12 @@
|
|||
[sid]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:shapes sid :blocked] true))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [shape (get-in state [:shapes sid])]
|
||||
(if-not (= (:type shape) :group)
|
||||
(rx/empty)
|
||||
|
@ -313,12 +313,12 @@
|
|||
[sid]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:shapes sid :blocked] false))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [shape (get-in state [:shapes sid])]
|
||||
(if-not (= (:type shape) :group)
|
||||
(rx/empty)
|
||||
|
@ -329,12 +329,12 @@
|
|||
[sid]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:shapes sid :locked] true))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [shape (get-in state [:shapes sid])]
|
||||
(if-not (= (:type shape) :group)
|
||||
(rx/empty)
|
||||
|
@ -345,12 +345,12 @@
|
|||
[sid]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:shapes sid :locked] false))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [shape (get-in state [:shapes sid])]
|
||||
(if-not (= (:type shape) :group)
|
||||
(rx/empty)
|
||||
|
@ -365,16 +365,16 @@
|
|||
(not (nil? sid))]}
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(impl/drop-shape state sid tid loc))))
|
||||
|
||||
(defn select-first-shape
|
||||
"Mark a shape selected for drawing in the canvas."
|
||||
[]
|
||||
(reify
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [page (get-in state [:workspace :page])
|
||||
id (first (get-in state [:pages page :shapes]))]
|
||||
(assoc-in state [:workspace :selected] #{id})))))
|
||||
|
@ -383,8 +383,8 @@
|
|||
"Mark a shape selected for drawing in the canvas."
|
||||
[id]
|
||||
(reify
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [selected (get-in state [:workspace :selected])
|
||||
state (if (contains? selected id)
|
||||
(update-in state [:workspace :selected] disj id)
|
||||
|
@ -394,8 +394,8 @@
|
|||
;; --- Select Shapes
|
||||
|
||||
(defrecord SelectShapes [selrect]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [page (get-in state [:workspace :page])
|
||||
shapes (impl/match-by-selrect state page selrect)]
|
||||
(assoc-in state [:workspace :selected] shapes))))
|
||||
|
@ -409,8 +409,8 @@
|
|||
|
||||
(defrecord UpdateInteraction [shape interaction]
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [id (or (:id interaction)
|
||||
(uuid/random))
|
||||
data (assoc interaction :id id)]
|
||||
|
@ -424,8 +424,8 @@
|
|||
|
||||
(defrecord DeleteInteracton [shape id]
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes shape :interactions] dissoc id)))
|
||||
|
||||
(defn delete-interaction
|
||||
|
@ -436,8 +436,8 @@
|
|||
;; --- Path Modifications
|
||||
|
||||
(defrecord UpdatePath [id index delta]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:shapes id :points index] gpt/add delta)))
|
||||
|
||||
(defn update-path
|
||||
|
@ -447,8 +447,8 @@
|
|||
(UpdatePath. id index delta))
|
||||
|
||||
(defrecord InitialPathPointAlign [id index]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [shape (get-in state [:shapes id])
|
||||
point (get-in shape [:points index])
|
||||
point (gpt/add point canvas-coords)]
|
||||
|
@ -468,12 +468,12 @@
|
|||
;; --- Start shape "edition mode"
|
||||
|
||||
(defrecord StartEditionMode [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:workspace :edition] id))
|
||||
|
||||
rs/EffectEvent
|
||||
(-apply-effect [_ state]
|
||||
ptk/EffectEvent
|
||||
(effect [_ state stream]
|
||||
(rlocks/acquire! :shape/edition)))
|
||||
|
||||
(defn start-edition-mode
|
||||
|
@ -484,15 +484,15 @@
|
|||
;; --- Events (implicit) (for selected)
|
||||
|
||||
(defrecord DeselectAll []
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(-> state
|
||||
(assoc-in [:workspace :selected] #{})
|
||||
(assoc-in [:workspace :edition] nil)
|
||||
(assoc-in [:workspace :drawing] nil)))
|
||||
|
||||
rs/EffectEvent
|
||||
(-apply-effect [_ state]
|
||||
ptk/EffectEvent
|
||||
(effect [_ state stream]
|
||||
(rlocks/release! :shape/edition)))
|
||||
|
||||
(defn deselect-all
|
||||
|
@ -505,8 +505,8 @@
|
|||
[]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [pid (get-in state [:workspace :page])
|
||||
selected (get-in state [:workspace :selected])]
|
||||
(impl/group-shapes state selected pid)))))
|
||||
|
@ -515,8 +515,8 @@
|
|||
[]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [pid (get-in state [:workspace :page])
|
||||
selected (get-in state [:workspace :selected])]
|
||||
(impl/degroup-shapes state selected pid)))))
|
||||
|
@ -526,8 +526,8 @@
|
|||
[]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [selected (get-in state [:workspace :selected])]
|
||||
(impl/duplicate-shapes state selected)))))
|
||||
|
||||
|
@ -535,8 +535,8 @@
|
|||
"Deselect all and remove all selected shapes."
|
||||
[]
|
||||
(reify
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [selected (get-in state [:workspace :selected])]
|
||||
(rx/from-coll
|
||||
(into [(deselect-all)] (map #(delete-shape %) selected)))))))
|
||||
|
@ -547,8 +547,8 @@
|
|||
([dir n]
|
||||
{:pre [(contains? #{:up :down :right :left} dir)]}
|
||||
(reify
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [selected (get-in state [:workspace :selected])
|
||||
delta (case dir
|
||||
:up (gpt/point 0 (- n))
|
||||
|
@ -563,8 +563,8 @@
|
|||
selected shapes."
|
||||
[opts]
|
||||
(reify
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/from-coll
|
||||
(->> (get-in state [:workspace :selected])
|
||||
(map #(update-fill-attrs % opts)))))))
|
||||
|
@ -575,8 +575,8 @@
|
|||
selected shapes."
|
||||
[opts]
|
||||
(reify
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/from-coll
|
||||
(->> (get-in state [:workspace :selected])
|
||||
(map #(update-stroke-attrs % opts)))))))
|
||||
|
@ -585,8 +585,8 @@
|
|||
[loc]
|
||||
(reify
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [selected (get-in state [:workspace :selected])]
|
||||
(impl/move-layer state selected loc)))))
|
||||
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
(ns uxbox.main.data.undo
|
||||
(:require #_[cljs.pprint :as pp]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.main.data.pages :as udp]
|
||||
[uxbox.main.state :as st]))
|
||||
[uxbox.store :as st]))
|
||||
|
||||
;; --- Watch Page Changes
|
||||
|
||||
|
@ -25,26 +25,26 @@
|
|||
reacts on them emiting an other event that just
|
||||
persists the state of the page in an undo stack."
|
||||
[id]
|
||||
(rs/emit! (initialize-undo-for-page id))
|
||||
(as-> rs/stream $
|
||||
(st/emit! (initialize-undo-for-page id))
|
||||
(as-> st/store $
|
||||
(rx/filter #(satisfies? udp/IPageUpdate %) $)
|
||||
(rx/filter #(not (undo? %)) $)
|
||||
(rx/filter #(not (redo? %)) $)
|
||||
(rx/debounce 500 $)
|
||||
(rx/on-next $ #(rs/emit! (save-undo-entry id)))))
|
||||
(rx/on-next $ #(st/emit! (save-undo-entry id)))))
|
||||
|
||||
;; -- Save Undo Entry
|
||||
|
||||
(defrecord SaveUndoEntry [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [page (udp/pack-page state id)]
|
||||
(-> state
|
||||
(update-in [:undo id :stack] #(cons (:data page) %))
|
||||
(assoc-in [:undo id :selected] 0)))))
|
||||
|
||||
;; rs/EffectEvent
|
||||
;; (-apply-effect [_ state]
|
||||
;; ptk/EffectEvent
|
||||
;; (effect [_ state]
|
||||
;; (let [undo (get-in state [:undo id])]
|
||||
;; (println (pr-str undo)))))
|
||||
|
||||
|
@ -59,8 +59,8 @@
|
|||
;; --- Initialize Undo (For page)
|
||||
|
||||
(defrecord InitializeUndoForPage [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [initialized? (get-in state [:undo id])
|
||||
page-loaded? (get-in state [:pages id])]
|
||||
(cond
|
||||
|
@ -84,8 +84,8 @@
|
|||
|
||||
(defrecord Undo []
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [page-id (get-in state [:workspace :page])
|
||||
undo (get-in state [:undo page-id])
|
||||
stack (:stack undo)
|
||||
|
@ -117,8 +117,8 @@
|
|||
|
||||
(defrecord Redo []
|
||||
udp/IPageUpdate
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [page-id (get-in state [:workspace :page])
|
||||
undo (get-in state [:undo page-id])
|
||||
stack (:stack undo)
|
||||
|
|
|
@ -7,10 +7,9 @@
|
|||
(ns uxbox.main.data.users
|
||||
(:require [cljs.spec :as s]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.spec :as us]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.main.repo :as rp]
|
||||
[uxbox.main.data.messages :as udm]))
|
||||
|
||||
|
@ -22,8 +21,8 @@
|
|||
;; --- Profile Fetched
|
||||
|
||||
(defrecord ProfileFetched [data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [this state]
|
||||
ptk/UpdateEvent
|
||||
(update [this state]
|
||||
(assoc state :profile data)))
|
||||
|
||||
(defn profile-fetched
|
||||
|
@ -33,8 +32,8 @@
|
|||
;; --- Fetch Profile
|
||||
|
||||
(defrecord FetchProfile []
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(->> (rp/req :fetch/profile)
|
||||
(rx/map :payload)
|
||||
(rx/map profile-fetched))))
|
||||
|
@ -46,12 +45,12 @@
|
|||
;; --- Profile Updated
|
||||
|
||||
(defrecord ProfileUpdated [data]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (profile-fetched data)))
|
||||
|
||||
rs/EffectEvent
|
||||
(-apply-effect [_ state]
|
||||
ptk/EffectEvent
|
||||
(effect [_ state stream]
|
||||
(udm/info! (tr "settings.profile-saved"))))
|
||||
|
||||
(defn profile-updated
|
||||
|
@ -61,8 +60,8 @@
|
|||
;; --- Update Profile
|
||||
|
||||
(defrecord UpdateProfile [data on-success on-error]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(letfn [(handle-error [{payload :payload}]
|
||||
(on-error payload)
|
||||
(rx/empty))]
|
||||
|
@ -85,8 +84,8 @@
|
|||
;; --- Password Updated
|
||||
|
||||
(defrecord PasswordUpdated []
|
||||
rs/EffectEvent
|
||||
(-apply-effect [_ state]
|
||||
ptk/EffectEvent
|
||||
(effect [_ state stream]
|
||||
(udm/info! (tr "settings.password-saved"))))
|
||||
|
||||
(defn password-updated
|
||||
|
@ -96,8 +95,8 @@
|
|||
;; --- Update Password (Form)
|
||||
|
||||
(defrecord UpdatePassword [data]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [params {:old-password (:old-password data)
|
||||
:password (:password-1 data)}]
|
||||
(->> (rp/req :update/profile-password params)
|
||||
|
@ -118,8 +117,8 @@
|
|||
;; --- Update Photo
|
||||
|
||||
(defrecord UpdatePhoto [file done]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(->> (rp/req :update/profile-photo {:file file})
|
||||
(rx/do done)
|
||||
(rx/map fetch-profile))))
|
||||
|
|
|
@ -9,12 +9,12 @@
|
|||
[beicon.core :as rx]
|
||||
[uxbox.util.uuid :as uuid]
|
||||
[uxbox.main.constants :as c]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.spec :as us]
|
||||
[uxbox.util.forms :as sc]
|
||||
[uxbox.util.geom.point :as gpt]
|
||||
[uxbox.util.workers :as uw]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.core :refer (worker)]
|
||||
[uxbox.main.data.projects :as dp]
|
||||
[uxbox.main.data.pages :as udp]
|
||||
|
@ -40,8 +40,8 @@
|
|||
(declare initialize-alignment-index)
|
||||
|
||||
(defrecord InitializeWorkspace [project page]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(if (:workspace state)
|
||||
(update state :workspace merge
|
||||
{:project project
|
||||
|
@ -56,8 +56,8 @@
|
|||
:selected #{}
|
||||
:drawing nil})))
|
||||
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [page-id page
|
||||
page (get-in state [:pages page-id])]
|
||||
|
||||
|
@ -79,11 +79,11 @@
|
|||
(udh/fetch-page-history page-id)
|
||||
(udh/fetch-pinned-page-history page-id)))))
|
||||
|
||||
rs/EffectEvent
|
||||
(-apply-effect [_ state]
|
||||
ptk/EffectEvent
|
||||
(effect [_ state stream]
|
||||
;; Optimistic prefetch of projects if them are not already fetched
|
||||
(when-not (seq (:projects state))
|
||||
(rs/emit! (dp/fetch-projects)))))
|
||||
(st/emit! (dp/fetch-projects)))))
|
||||
|
||||
(defn initialize
|
||||
"Initialize the workspace state."
|
||||
|
@ -96,8 +96,8 @@
|
|||
"Toggle the enabled flag of the specified tool."
|
||||
[key]
|
||||
(reify
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [flags (get-in state [:workspace :flags])]
|
||||
(if (contains? flags key)
|
||||
(assoc-in state [:workspace :flags] (disj flags key))
|
||||
|
@ -107,8 +107,8 @@
|
|||
"Mark a shape selected for drawing in the canvas."
|
||||
[shape]
|
||||
(reify
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [current (get-in state [:workspace :drawing])]
|
||||
(if (or (nil? shape)
|
||||
(= shape current))
|
||||
|
@ -118,8 +118,8 @@
|
|||
;; --- Activate Workspace Flag
|
||||
|
||||
(defrecord ActivateFlag [flag]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(update-in state [:workspace :flags] conj flag)))
|
||||
|
||||
(defn activate-flag
|
||||
|
@ -129,8 +129,8 @@
|
|||
;; --- Copy to Clipboard
|
||||
|
||||
(defrecord CopyToClipboard []
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [selected (get-in state [:workspace :selected])
|
||||
item {:id (uuid/random)
|
||||
:created-at (dt/now)
|
||||
|
@ -150,8 +150,8 @@
|
|||
;; --- Paste from Clipboard
|
||||
|
||||
(defrecord PasteFromClipboard [id]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [page (get-in state [:workspace :page])
|
||||
selected (if (nil? id)
|
||||
(first (:clipboard state))
|
||||
|
@ -168,8 +168,8 @@
|
|||
;; --- Increase Zoom
|
||||
|
||||
(defrecord IncreaseZoom []
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [increase #(nth zoom-levels
|
||||
(+ (index-of zoom-levels %) 1)
|
||||
(last zoom-levels))]
|
||||
|
@ -182,8 +182,8 @@
|
|||
;; --- Decrease Zoom
|
||||
|
||||
(defrecord DecreaseZoom []
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [decrease #(nth zoom-levels
|
||||
(- (index-of zoom-levels %) 1)
|
||||
(first zoom-levels))]
|
||||
|
@ -196,8 +196,8 @@
|
|||
;; --- Reset Zoom
|
||||
|
||||
(defrecord ResetZoom []
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:workspace :zoom] 1)))
|
||||
|
||||
(defn reset-zoom
|
||||
|
@ -207,8 +207,8 @@
|
|||
;; --- Initialize Alignment Index
|
||||
|
||||
(defrecord InitializeAlignmentIndex [id]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(let [page (get-in state [:pages id])
|
||||
opts (:options page)
|
||||
message {:cmd :grid-init
|
||||
|
@ -231,8 +231,8 @@
|
|||
;; Is a workspace aware wrapper over uxbox.data.pages/UpdateMetadata event.
|
||||
|
||||
(defrecord UpdateMetadata [id metadata]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (udp/update-metadata id metadata)
|
||||
(initialize-alignment-index id))))
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
(ns uxbox.main.exports
|
||||
"The main logic for SVG export functionality."
|
||||
(:require [uxbox.main.state :as st]
|
||||
(:require [uxbox.store :as st]
|
||||
[uxbox.main.ui.shapes.rect :refer (rect-shape)]
|
||||
[uxbox.main.ui.shapes.icon :refer (icon-shape)]
|
||||
[uxbox.main.ui.shapes.text :refer (text-shape)]
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
(:require [uxbox.util.geom.matrix :as gmt]
|
||||
[uxbox.util.geom.point :as gpt]
|
||||
[uxbox.util.math :as mth]
|
||||
[uxbox.main.state :as st]))
|
||||
[uxbox.store :as st]))
|
||||
|
||||
;; --- Relative Movement
|
||||
|
||||
|
|
|
@ -5,21 +5,8 @@
|
|||
;; Copyright (c) 2015-2016 Andrey Antukh <niwi@niwi.nz>
|
||||
|
||||
(ns uxbox.main.state
|
||||
(:require [beicon.core :as rx]
|
||||
[lentes.core :as l]
|
||||
[uxbox.main.state.colors :as colors]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.storage :refer (storage)]))
|
||||
|
||||
(enable-console-print!)
|
||||
|
||||
(defonce state (atom {}))
|
||||
(defonce loader (atom false))
|
||||
|
||||
(def auth-ref
|
||||
(-> (l/key :auth)
|
||||
(l/derive state)))
|
||||
(:require [uxbox.builtins.colors :as colors]
|
||||
[uxbox.util.storage :refer [storage]]))
|
||||
|
||||
(defn initial-state
|
||||
[]
|
||||
|
@ -41,11 +28,3 @@
|
|||
:shapes nil
|
||||
:projects nil
|
||||
:pages nil})
|
||||
|
||||
(defn init
|
||||
"Initialize the state materialization."
|
||||
([] (init initial-state))
|
||||
([& callbacks]
|
||||
(-> (reduce #(merge %1 (%2)) nil callbacks)
|
||||
(rs/init)
|
||||
(rx/to-atom state))))
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
[lentes.core :as l]
|
||||
[cuerdas.core :as str]
|
||||
[bide.core :as bc]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.projects :as dp]
|
||||
[uxbox.main.data.users :as udu]
|
||||
[uxbox.main.data.auth :refer [logout]]
|
||||
|
@ -24,7 +24,7 @@
|
|||
[uxbox.main.ui.workspace :refer (workspace)]
|
||||
[uxbox.util.timers :as ts]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.data :refer (parse-int uuid-str?)]
|
||||
[uxbox.util.dom :as dom]
|
||||
|
@ -52,12 +52,13 @@
|
|||
"A default error handler."
|
||||
[{:keys [status] :as error}]
|
||||
(js/console.log "on-error:" (pr-str error))
|
||||
(reset! st/loader false)
|
||||
(cond
|
||||
;; Unauthorized or Auth timeout
|
||||
(and (:status error)
|
||||
(or (= (:status error) 403)
|
||||
(= (:status error) 419)))
|
||||
(rs/emit! (logout))
|
||||
(st/emit! (logout))
|
||||
|
||||
;; Conflict
|
||||
(= status 412)
|
||||
|
@ -75,14 +76,14 @@
|
|||
(dmsg/error! (tr "errors.generic"))
|
||||
(js/console.error "Stack:" (.-stack error)))))
|
||||
|
||||
(rs/add-error-watcher :ui on-error)
|
||||
(set! st/*on-error* on-error)
|
||||
|
||||
;; --- Main App (Component)
|
||||
|
||||
(defn app-will-mount
|
||||
[own]
|
||||
(when @st/auth-ref
|
||||
(rs/emit! (udu/fetch-profile)))
|
||||
(st/emit! (udu/fetch-profile)))
|
||||
own)
|
||||
|
||||
(mx/defc app
|
||||
|
|
|
@ -9,10 +9,10 @@
|
|||
[cuerdas.core :as str]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.forms :as forms]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.auth :as da]
|
||||
[uxbox.main.data.messages :as udm]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -42,7 +42,7 @@
|
|||
(set-value! field value)))
|
||||
(on-submit [event]
|
||||
(dom/prevent-default event)
|
||||
(rs/emit! (da/login {:username (:email data)
|
||||
(st/emit! (da/login {:username (:email data)
|
||||
:password (:password data)})))]
|
||||
[:form {:on-submit on-submit}
|
||||
[:div.login-content
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
(:require [lentes.core :as l]
|
||||
[cuerdas.core :as str]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.store :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.forms :as forms]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.dom :as dom]
|
||||
|
@ -38,7 +38,7 @@
|
|||
(set-value! field value)))
|
||||
(on-submit [event]
|
||||
(dom/prevent-default event)
|
||||
(rs/emit! (uda/recovery data)
|
||||
(st/emit! (uda/recovery data)
|
||||
(forms/clear :recovery)))]
|
||||
[:form {:on-submit on-submit}
|
||||
[:div.login-content
|
||||
|
@ -62,7 +62,7 @@
|
|||
(defn- recovery-page-will-mount
|
||||
[own]
|
||||
(let [[token] (:rum/args own)]
|
||||
(rs/emit! (uda/validate-recovery-token token))
|
||||
(st/emit! (uda/validate-recovery-token token))
|
||||
own))
|
||||
|
||||
(mx/defc recovery-page
|
||||
|
|
|
@ -8,11 +8,11 @@
|
|||
(:require [lentes.core :as l]
|
||||
[cuerdas.core :as str]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.forms :as forms]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.auth :as uda]
|
||||
[uxbox.main.data.messages :as udm]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -35,7 +35,7 @@
|
|||
(set-value! field value)))
|
||||
(on-submit [event]
|
||||
(dom/prevent-default event)
|
||||
(rs/emit! (uda/recovery-request data)
|
||||
(st/emit! (uda/recovery-request data)
|
||||
(forms/clear :recovery-request)))]
|
||||
[:form {:on-submit on-submit}
|
||||
[:div.login-content
|
||||
|
|
|
@ -8,11 +8,11 @@
|
|||
(:require [lentes.core :as l]
|
||||
[cuerdas.core :as str]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.forms :as forms]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.auth :as uda]
|
||||
[uxbox.main.data.messages :as udm]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -49,7 +49,7 @@
|
|||
(set-error! :username "Username already exists")))
|
||||
(on-submit [event]
|
||||
(dom/prevent-default event)
|
||||
(rs/emit! (uda/register data on-error)))]
|
||||
(st/emit! (uda/register data on-error)))]
|
||||
[:form {:on-submit on-submit}
|
||||
[:div.login-content
|
||||
[:input.input-text
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
[uxbox.main.data.colors :as dc]
|
||||
[uxbox.main.data.dashboard :as dd]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.ui.messages :as uum]
|
||||
[uxbox.main.ui.colorpicker :refer (colorpicker)]
|
||||
[uxbox.main.ui.dashboard.header :refer (header)]
|
||||
|
@ -23,7 +23,7 @@
|
|||
[uxbox.util.i18n :as t :refer (tr)]
|
||||
[uxbox.util.lens :as ul]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.rstore :as rs]))
|
||||
[potok.core :as ptk]))
|
||||
|
||||
;; --- Refs
|
||||
|
||||
|
@ -47,7 +47,7 @@
|
|||
(letfn [(save []
|
||||
(let [dom (mx/ref-node own "input")
|
||||
name (dom/get-inner-text dom)]
|
||||
(rs/emit! (dc/rename-collection id (str/trim name)))
|
||||
(st/emit! (dc/rename-collection id (str/trim name)))
|
||||
(swap! local assoc :edit false)))
|
||||
(cancel []
|
||||
(swap! local assoc :edit false))
|
||||
|
@ -62,7 +62,7 @@
|
|||
(dom/stop-propagation e)
|
||||
(save))))
|
||||
(delete []
|
||||
(rs/emit! (dc/delete-collection id)))
|
||||
(st/emit! (dc/delete-collection id)))
|
||||
(on-delete []
|
||||
(udl/open! :confirm {:on-accept delete}))]
|
||||
[:div.dashboard-title
|
||||
|
@ -95,7 +95,7 @@
|
|||
[{:keys [id type name] :as coll} selected?]
|
||||
(letfn [(on-click [event]
|
||||
(let [type (or type :own)]
|
||||
(rs/emit! (dc/select-collection type id))))]
|
||||
(st/emit! (dc/select-collection type id))))]
|
||||
(let [colors (count (:colors coll))]
|
||||
[:li {:on-click on-click
|
||||
:class-name (when selected? "current")}
|
||||
|
@ -113,7 +113,7 @@
|
|||
{:mixins [mx/static mx/reactive]}
|
||||
[selected?]
|
||||
(let [num-colors (mx/react storage-num-colors-ref)
|
||||
on-click #(rs/emit! (dc/select-collection :own nil))]
|
||||
on-click #(st/emit! (dc/select-collection :own nil))]
|
||||
[:li {:on-click on-click :class (when selected? "current")}
|
||||
[:span.element-title "Storage"]
|
||||
[:span.element-subtitle
|
||||
|
@ -133,7 +133,7 @@
|
|||
(when own?
|
||||
[:li
|
||||
[:a.btn-primary
|
||||
{:on-click #(rs/emit! (dc/create-collection))}
|
||||
{:on-click #(st/emit! (dc/create-collection))}
|
||||
"+ New library"]])
|
||||
(when own?
|
||||
(nav-item-storage (nil? selected)))
|
||||
|
@ -150,14 +150,14 @@
|
|||
builtin? (= type :builtin)]
|
||||
(letfn [(select-tab [type]
|
||||
(if (= type :own)
|
||||
(rs/emit! (dc/select-collection type))
|
||||
(st/emit! (dc/select-collection type))
|
||||
(let [coll (->> (map second colls)
|
||||
(filter #(= type (:type %)))
|
||||
(sort-by :created-at)
|
||||
(first))]
|
||||
(if coll
|
||||
(rs/emit! (dc/select-collection type (:id coll)))
|
||||
(rs/emit! (dc/select-collection type))))))]
|
||||
(st/emit! (dc/select-collection type (:id coll)))
|
||||
(st/emit! (dc/select-collection type))))))]
|
||||
[:div.library-bar
|
||||
[:div.library-bar-inside
|
||||
[:ul.library-tabs
|
||||
|
@ -207,7 +207,7 @@
|
|||
(let [editable? (or (= type :own) (nil? id))
|
||||
local (:rum/local own)]
|
||||
(letfn [(delete [event]
|
||||
(rs/emit! (dc/delete-selected-colors)))
|
||||
(st/emit! (dc/delete-selected-colors)))
|
||||
(on-delete [event]
|
||||
(udl/open! :confirm {:on-accept delete}))
|
||||
(on-toggle-copy [event]
|
||||
|
@ -220,12 +220,12 @@
|
|||
(swap! local assoc
|
||||
:show-move-tooltip false
|
||||
:show-copy-tooltip false)
|
||||
(rs/emit! (dc/copy-selected selected)))
|
||||
(st/emit! (dc/copy-selected selected)))
|
||||
(on-move [selected]
|
||||
(swap! local assoc
|
||||
:show-move-tooltip false
|
||||
:show-copy-tooltip false)
|
||||
(rs/emit! (dc/move-selected id selected)))]
|
||||
(st/emit! (dc/move-selected id selected)))]
|
||||
|
||||
;; MULTISELECT OPTIONS BAR
|
||||
[:div.multiselect-bar
|
||||
|
@ -263,7 +263,7 @@
|
|||
[color selected?]
|
||||
(let [color-rgb (hex->rgb color)]
|
||||
(letfn [(toggle-selection [event]
|
||||
(rs/emit! (dc/toggle-color-selection color)))
|
||||
(st/emit! (dc/toggle-color-selection color)))
|
||||
(toggle-selection-shifted [event]
|
||||
(when (k/shift? event)
|
||||
(toggle-selection event)))]
|
||||
|
@ -307,7 +307,7 @@
|
|||
(defn- colors-page-will-mount
|
||||
[own]
|
||||
(let [[type id] (:rum/args own)]
|
||||
(rs/emit! (dc/initialize type id))
|
||||
(st/emit! (dc/initialize type id))
|
||||
own))
|
||||
|
||||
(defn- colors-page-did-remount
|
||||
|
@ -316,7 +316,7 @@
|
|||
[new-type new-id] (:rum/args own)]
|
||||
(when (or (not= old-type new-type)
|
||||
(not= old-id new-id))
|
||||
(rs/emit! (dc/initialize new-type new-id)))
|
||||
(st/emit! (dc/initialize new-type new-id)))
|
||||
own))
|
||||
|
||||
(mx/defc colors-page
|
||||
|
@ -344,7 +344,7 @@
|
|||
(let [params {:id coll
|
||||
:from color
|
||||
:to (:hex @local)}]
|
||||
(rs/emit! (dc/replace-color params))
|
||||
(st/emit! (dc/replace-color params))
|
||||
(udl/close!)))
|
||||
(on-change [event]
|
||||
(let [value (str/trim (dom/event->value event))]
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
(ns uxbox.main.ui.dashboard.elements
|
||||
(:require [sablono.core :as html :refer-macros [html]]
|
||||
[rum.core :as rum]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.main.data.dashboard :as dd]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -144,12 +144,12 @@
|
|||
|
||||
;; (defn elements-page-will-mount
|
||||
;; [own]
|
||||
;; (rs/emit! (dd/initialize :dashboard/elements))
|
||||
;; (st/emit! (dd/initialize :dashboard/elements))
|
||||
;; own)
|
||||
|
||||
;; (defn elements-page-did-remount
|
||||
;; [old-state state]
|
||||
;; (rs/emit! (dd/initialize :dashboard/elements))
|
||||
;; (st/emit! (dd/initialize :dashboard/elements))
|
||||
;; state)
|
||||
|
||||
;; (def elements-page
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
(ns uxbox.main.ui.dashboard.header
|
||||
(:require [lentes.core :as l]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.projects :as dp]
|
||||
[uxbox.main.ui.navigation :as nav]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -15,7 +15,7 @@
|
|||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.rstore :as rs]))
|
||||
[potok.core :as ptk]))
|
||||
|
||||
(def header-ref
|
||||
(-> (l/key :dashboard)
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
(ns uxbox.main.ui.dashboard.icons
|
||||
(:require [lentes.core :as l]
|
||||
[cuerdas.core :as str]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.data.icons :as di]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -20,7 +20,7 @@
|
|||
[uxbox.util.data :refer (read-string)]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.datetime :as dt]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.forms :as sc]
|
||||
[uxbox.util.lens :as ul]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
|
@ -78,7 +78,7 @@
|
|||
(letfn [(on-save [e]
|
||||
(let [dom (mx/ref-node own "input")
|
||||
name (.-innerText dom)]
|
||||
(rs/emit! (di/rename-collection id (str/trim name)))
|
||||
(st/emit! (di/rename-collection id (str/trim name)))
|
||||
(swap! local assoc :edit false)))
|
||||
(on-cancel [e]
|
||||
(swap! local assoc :edit false))
|
||||
|
@ -93,7 +93,7 @@
|
|||
(dom/stop-propagation e)
|
||||
(on-save e))))
|
||||
(delete []
|
||||
(rs/emit! (di/delete-collection id)))
|
||||
(st/emit! (di/delete-collection id)))
|
||||
(on-delete []
|
||||
(udl/open! :confirm {:on-accept delete}))]
|
||||
[:div.dashboard-title
|
||||
|
@ -133,7 +133,7 @@
|
|||
[{:keys [id type name num-icons] :as coll} selected?]
|
||||
(letfn [(on-click [event]
|
||||
(let [type (or type :own)]
|
||||
(rs/emit! (di/select-collection type id))))]
|
||||
(st/emit! (di/select-collection type id))))]
|
||||
(let [num-icons (or num-icons (react-count-icons id))]
|
||||
[:li {:on-click on-click
|
||||
:class-name (when selected? "current")}
|
||||
|
@ -155,7 +155,7 @@
|
|||
(when own?
|
||||
[:li
|
||||
[:a.btn-primary
|
||||
{:on-click #(rs/emit! (di/create-collection))}
|
||||
{:on-click #(st/emit! (di/create-collection))}
|
||||
"+ New collection"]])
|
||||
(when own?
|
||||
(nav-item nil (nil? selected)))
|
||||
|
@ -175,8 +175,8 @@
|
|||
(let [colls (->> (map second colls)
|
||||
(filter #(= :builtin (:type %)))
|
||||
(sort-by :name))]
|
||||
(rs/emit! (di/select-collection type (:id (first colls)))))
|
||||
(rs/emit! (di/select-collection type))))]
|
||||
(st/emit! (di/select-collection type (:id (first colls)))))
|
||||
(st/emit! (di/select-collection type))))]
|
||||
[:div.library-bar
|
||||
[:div.library-bar-inside
|
||||
[:ul.library-tabs
|
||||
|
@ -198,7 +198,7 @@
|
|||
(dom/click (mx/ref-node own "file-input")))
|
||||
(on-file-selected [event]
|
||||
(let [files (dom/get-event-files event)]
|
||||
(rs/emit! (di/create-icons coll-id files))))]
|
||||
(st/emit! (di/create-icons coll-id files))))]
|
||||
[:div.grid-item.small-item.add-project {:on-click forward-click}
|
||||
[:span "+ New icon"]
|
||||
[:input.upload-image-input
|
||||
|
@ -240,7 +240,7 @@
|
|||
(let [editable? (or (= type :own) (nil? coll))
|
||||
local (:rum/local own)]
|
||||
(letfn [(delete []
|
||||
(rs/emit! (di/delete-selected)))
|
||||
(st/emit! (di/delete-selected)))
|
||||
(on-delete [event]
|
||||
(udl/open! :confirm {:on-accept delete}))
|
||||
(on-toggle-copy [event]
|
||||
|
@ -252,15 +252,15 @@
|
|||
(swap! local assoc
|
||||
:show-move-tooltip false
|
||||
:show-copy-tooltip false)
|
||||
(rs/emit! (di/copy-selected selected)))
|
||||
(st/emit! (di/copy-selected selected)))
|
||||
(on-move [selected]
|
||||
(swap! local assoc
|
||||
:show-move-tooltip false
|
||||
:show-copy-tooltip false)
|
||||
(rs/emit! (di/move-selected selected)))
|
||||
(st/emit! (di/move-selected selected)))
|
||||
(on-rename [event]
|
||||
(let [selected (first selected)]
|
||||
(rs/emit! (di/update-opts :edition selected))))]
|
||||
(st/emit! (di/update-opts :edition selected))))]
|
||||
;; MULTISELECT OPTIONS BAR
|
||||
[:div.multiselect-bar
|
||||
(if editable?
|
||||
|
@ -301,7 +301,7 @@
|
|||
{:mixins [mx/static]}
|
||||
[{:keys [id created-at] :as icon} selected? edition?]
|
||||
(letfn [(toggle-selection [event]
|
||||
(rs/emit! (di/toggle-icon-selection id)))
|
||||
(st/emit! (di/toggle-icon-selection id)))
|
||||
(toggle-selection-shifted [event]
|
||||
(when (kbd/shift? event)
|
||||
(toggle-selection event)))
|
||||
|
@ -311,12 +311,12 @@
|
|||
(on-blur [event]
|
||||
(let [target (dom/event->target event)
|
||||
name (dom/get-value target)]
|
||||
(rs/emit! (di/update-opts :edition false)
|
||||
(st/emit! (di/update-opts :edition false)
|
||||
(di/rename-icon id name))))
|
||||
(on-edit [event]
|
||||
(dom/stop-propagation event)
|
||||
(dom/prevent-default event)
|
||||
(rs/emit! (di/update-opts :edition id)))]
|
||||
(st/emit! (di/update-opts :edition id)))]
|
||||
[:div.grid-item.small-item.project-th
|
||||
{:on-click toggle-selection-shifted
|
||||
:id (str "grid-item-" id)}
|
||||
|
@ -381,13 +381,13 @@
|
|||
(letfn [(on-term-change [event]
|
||||
(let [term (-> (dom/get-target event)
|
||||
(dom/get-value))]
|
||||
(rs/emit! (di/update-opts :filter term))))
|
||||
(st/emit! (di/update-opts :filter term))))
|
||||
(on-ordering-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
value (read-string value)]
|
||||
(rs/emit! (di/update-opts :order value))))
|
||||
(st/emit! (di/update-opts :order value))))
|
||||
(on-clear [event]
|
||||
(rs/emit! (di/update-opts :filter "")))]
|
||||
(st/emit! (di/update-opts :filter "")))]
|
||||
[:section.dashboard-bar.library-gap
|
||||
[:div.dashboard-info
|
||||
|
||||
|
@ -420,7 +420,7 @@
|
|||
(defn- icons-page-will-mount
|
||||
[own]
|
||||
(let [[type id] (:rum/args own)]
|
||||
(rs/emit! (di/initialize type id))
|
||||
(st/emit! (di/initialize type id))
|
||||
own))
|
||||
|
||||
(defn- icons-page-did-remount
|
||||
|
@ -429,7 +429,7 @@
|
|||
[new-type new-id] (:rum/args own)]
|
||||
(when (or (not= old-type new-type)
|
||||
(not= old-id new-id))
|
||||
(rs/emit! (di/initialize new-type new-id)))
|
||||
(st/emit! (di/initialize new-type new-id)))
|
||||
own))
|
||||
|
||||
(mx/defc icons-page
|
||||
|
|
|
@ -9,8 +9,8 @@
|
|||
(:require [cuerdas.core :as str]
|
||||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :as t :refer (tr)]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.store :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.data.images :as di]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -76,7 +76,7 @@
|
|||
(letfn [(on-save [e]
|
||||
(let [dom (mx/ref-node own "input")
|
||||
name (dom/get-inner-text dom)]
|
||||
(rs/emit! (di/rename-collection id (str/trim name)))
|
||||
(st/emit! (di/rename-collection id (str/trim name)))
|
||||
(swap! local assoc :edit false)))
|
||||
(on-cancel [e]
|
||||
(swap! local assoc :edit false))
|
||||
|
@ -91,7 +91,7 @@
|
|||
(dom/stop-propagation e)
|
||||
(on-save e))))
|
||||
(delete []
|
||||
(rs/emit! (di/delete-collection id)))
|
||||
(st/emit! (di/delete-collection id)))
|
||||
(on-delete []
|
||||
(udl/open! :confirm {:on-accept delete}))]
|
||||
[:div.dashboard-title
|
||||
|
@ -131,7 +131,7 @@
|
|||
[{:keys [id type name] :as coll} selected?]
|
||||
(letfn [(on-click [event]
|
||||
(let [type (or type :own)]
|
||||
(rs/emit! (di/select-collection type id))))]
|
||||
(st/emit! (di/select-collection type id))))]
|
||||
(let [num-images (react-count-images id)]
|
||||
[:li {:on-click on-click
|
||||
:class-name (when selected? "current")}
|
||||
|
@ -153,7 +153,7 @@
|
|||
(when own?
|
||||
[:li
|
||||
[:a.btn-primary
|
||||
{:on-click #(rs/emit! (di/create-collection))}
|
||||
{:on-click #(st/emit! (di/create-collection))}
|
||||
"+ New library"]])
|
||||
(when own?
|
||||
(nav-item nil (nil? selected)))
|
||||
|
@ -170,14 +170,14 @@
|
|||
builtin? (= type :builtin)]
|
||||
(letfn [(select-tab [type]
|
||||
(if own?
|
||||
(rs/emit! (di/select-collection type))
|
||||
(st/emit! (di/select-collection type))
|
||||
(let [coll (->> (map second colls)
|
||||
(filter #(= type (:type %)))
|
||||
(sort-by :name)
|
||||
(first))]
|
||||
(if coll
|
||||
(rs/emit! (di/select-collection type (:id coll)))
|
||||
(rs/emit! (di/select-collection type))))))]
|
||||
(st/emit! (di/select-collection type (:id coll)))
|
||||
(st/emit! (di/select-collection type))))))]
|
||||
[:div.library-bar
|
||||
[:div.library-bar-inside
|
||||
[:ul.library-tabs
|
||||
|
@ -199,7 +199,7 @@
|
|||
(dom/click (mx/ref-node own "file-input")))
|
||||
(on-file-selected [event]
|
||||
(let [files (dom/get-event-files event)]
|
||||
(rs/emit! (di/create-images coll-id files))))]
|
||||
(st/emit! (di/create-images coll-id files))))]
|
||||
(let [uploading? (mx/react uploading?-ref)]
|
||||
[:div.grid-item.add-project {:on-click forward-click}
|
||||
(if uploading?
|
||||
|
@ -244,7 +244,7 @@
|
|||
(let [editable? (or (= type :own) (nil? coll))
|
||||
local (:rum/local own)]
|
||||
(letfn [(delete []
|
||||
(rs/emit! (di/delete-selected)))
|
||||
(st/emit! (di/delete-selected)))
|
||||
(on-delete [event]
|
||||
(udl/open! :confirm {:on-accept delete}))
|
||||
(on-toggle-copy [event]
|
||||
|
@ -255,15 +255,15 @@
|
|||
(swap! local assoc
|
||||
:show-move-tooltip false
|
||||
:show-copy-tooltip false)
|
||||
(rs/emit! (di/copy-selected selected)))
|
||||
(st/emit! (di/copy-selected selected)))
|
||||
(on-move [selected]
|
||||
(swap! local assoc
|
||||
:show-move-tooltip false
|
||||
:show-copy-tooltip false)
|
||||
(rs/emit! (di/move-selected selected)))
|
||||
(st/emit! (di/move-selected selected)))
|
||||
(on-rename [event]
|
||||
(let [selected (first selected)]
|
||||
(rs/emit! (di/update-opts :edition selected))))]
|
||||
(st/emit! (di/update-opts :edition selected))))]
|
||||
;; MULTISELECT OPTIONS BAR
|
||||
[:div.multiselect-bar
|
||||
(if editable?
|
||||
|
@ -304,7 +304,7 @@
|
|||
{:mixins [mx/static]}
|
||||
[{:keys [id created-at] :as image} selected? edition?]
|
||||
(letfn [(toggle-selection [event]
|
||||
(rs/emit! (di/toggle-image-selection id)))
|
||||
(st/emit! (di/toggle-image-selection id)))
|
||||
(toggle-selection-shifted [event]
|
||||
(when (kbd/shift? event)
|
||||
(toggle-selection event)))
|
||||
|
@ -314,12 +314,12 @@
|
|||
(on-blur [event]
|
||||
(let [target (dom/event->target event)
|
||||
name (dom/get-value target)]
|
||||
(rs/emit! (di/update-opts :edition false)
|
||||
(st/emit! (di/update-opts :edition false)
|
||||
(di/rename-image id name))))
|
||||
(on-edit [event]
|
||||
(dom/stop-propagation event)
|
||||
(dom/prevent-default event)
|
||||
(rs/emit! (di/update-opts :edition id)))]
|
||||
(st/emit! (di/update-opts :edition id)))]
|
||||
[:div.grid-item.images-th
|
||||
{:on-click toggle-selection-shifted}
|
||||
[:div.grid-item-th
|
||||
|
@ -385,13 +385,13 @@
|
|||
(letfn [(on-term-change [event]
|
||||
(let [term (-> (dom/get-target event)
|
||||
(dom/get-value))]
|
||||
(rs/emit! (di/update-opts :filter term))))
|
||||
(st/emit! (di/update-opts :filter term))))
|
||||
(on-ordering-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
value (read-string value)]
|
||||
(rs/emit! (di/update-opts :order value))))
|
||||
(st/emit! (di/update-opts :order value))))
|
||||
(on-clear [event]
|
||||
(rs/emit! (di/update-opts :filter "")))]
|
||||
(st/emit! (di/update-opts :filter "")))]
|
||||
[:section.dashboard-bar.library-gap
|
||||
[:div.dashboard-info
|
||||
|
||||
|
@ -424,7 +424,7 @@
|
|||
(defn- images-page-will-mount
|
||||
[own]
|
||||
(let [[type id] (:rum/args own)]
|
||||
(rs/emit! (di/initialize type id))
|
||||
(st/emit! (di/initialize type id))
|
||||
own))
|
||||
|
||||
(defn- images-page-did-remount
|
||||
|
@ -433,7 +433,7 @@
|
|||
[new-type new-id] (:rum/args own)]
|
||||
(when (or (not= old-type new-type)
|
||||
(not= old-id new-id))
|
||||
(rs/emit! (di/initialize new-type new-id)))
|
||||
(st/emit! (di/initialize new-type new-id)))
|
||||
own))
|
||||
|
||||
(mx/defc images-page
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
(ns uxbox.main.ui.dashboard.projects
|
||||
(:require [lentes.core :as l]
|
||||
[cuerdas.core :as str]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.projects :as udp]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -19,7 +19,7 @@
|
|||
[uxbox.main.exports :as exports]
|
||||
[uxbox.util.i18n :as t :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.data :refer (read-string)]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.util.blob :as blob]
|
||||
|
@ -109,13 +109,13 @@
|
|||
(letfn [(on-term-change [event]
|
||||
(let [term (-> (dom/get-target event)
|
||||
(dom/get-value))]
|
||||
(rs/emit! (udp/update-opts :filter term))))
|
||||
(st/emit! (udp/update-opts :filter term))))
|
||||
(on-ordering-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
value (read-string value)]
|
||||
(rs/emit! (udp/update-opts :order value))))
|
||||
(st/emit! (udp/update-opts :order value))))
|
||||
(on-clear [event]
|
||||
(rs/emit! (udp/update-opts :filter "")))]
|
||||
(st/emit! (udp/update-opts :filter "")))]
|
||||
[:section.dashboard-bar
|
||||
[:div.dashboard-info
|
||||
|
||||
|
@ -177,9 +177,9 @@
|
|||
{:mixins [mx/static (mx/local)]}
|
||||
[{:keys [rum/local] :as own} project]
|
||||
(letfn [(on-navigate [event]
|
||||
(rs/emit! (udp/go-to (:id project))))
|
||||
(st/emit! (udp/go-to (:id project))))
|
||||
(delete []
|
||||
(rs/emit! (udp/delete-project project)))
|
||||
(st/emit! (udp/delete-project project)))
|
||||
(on-delete [event]
|
||||
(dom/stop-propagation event)
|
||||
(udl/open! :confirm {:on-accept delete}))
|
||||
|
@ -191,7 +191,7 @@
|
|||
name (dom/get-value target)
|
||||
id (:id project)]
|
||||
(swap! local assoc :edition false)
|
||||
(rs/emit! (udp/rename-project id name))))
|
||||
(st/emit! (udp/rename-project id name))))
|
||||
(on-edit [event]
|
||||
(dom/stop-propagation event)
|
||||
(dom/prevent-default event)
|
||||
|
@ -251,12 +251,12 @@
|
|||
|
||||
(defn projects-page-will-mount
|
||||
[own]
|
||||
(rs/emit! (udp/initialize))
|
||||
(st/emit! (udp/initialize))
|
||||
own)
|
||||
|
||||
(defn projects-page-did-remount
|
||||
[old-own own]
|
||||
(rs/emit! (udp/initialize))
|
||||
(st/emit! (udp/initialize))
|
||||
own)
|
||||
|
||||
(mx/defc projects-page
|
||||
|
@ -350,7 +350,7 @@
|
|||
{:value "Go go go!"
|
||||
:on-click #(do
|
||||
(dom/prevent-default %)
|
||||
(rs/emit! (udp/create-project @local))
|
||||
(st/emit! (udp/create-project @local))
|
||||
(udl/close!))
|
||||
|
||||
:type "submit"}])]
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
(:require [sablono.core :as html :refer-macros [html]]
|
||||
[rum.core :as rum]
|
||||
[lentes.core :as l]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.main.ui.keyboard :as k]
|
||||
|
|
|
@ -7,21 +7,11 @@
|
|||
(ns uxbox.main.ui.loader
|
||||
(:require [sablono.core :refer-macros [html]]
|
||||
[rum.core :as rum]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.main.ui.shapes]))
|
||||
|
||||
;; --- Error Handling
|
||||
|
||||
(defn- on-error
|
||||
[error]
|
||||
;; Disable loader in case of error.
|
||||
(reset! st/loader false))
|
||||
|
||||
(rs/add-error-watcher :loader on-error)
|
||||
|
||||
;; --- Component
|
||||
|
||||
(defn loader-render
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
(:require [sablono.core :as html :refer-macros [html]]
|
||||
[rum.core :as rum]
|
||||
[lentes.core :as l]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.messages :as udm]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.util.timers :as ts]
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
[rum.core :as rum]
|
||||
[cuerdas.core :as str]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.dom :as dom]
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.projects :as dp]
|
||||
[uxbox.main.ui.navigation :as nav]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
[rum.core :as rum]
|
||||
[cuerdas.core :as str]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.dom :as dom]
|
||||
|
|
|
@ -9,11 +9,11 @@
|
|||
(:require [lentes.core :as l]
|
||||
[cuerdas.core :as str]
|
||||
[uxbox.util.i18n :as t :refer (tr)]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.forms :as forms]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.users :as udu]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.main.ui.messages :as uum]
|
||||
|
@ -41,7 +41,7 @@
|
|||
(set-value! field value)))
|
||||
(on-submit [event]
|
||||
(println "on-submit" data)
|
||||
#_(rs/emit! (udu/update-password form)))]
|
||||
#_(st/emit! (udu/update-password form)))]
|
||||
(println "password-form" data)
|
||||
[:form.password-form
|
||||
[:span.user-settings-label "Change password"]
|
||||
|
|
|
@ -10,11 +10,11 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.forms :as forms]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.interop :refer (iterable->seq)]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.main.ui.settings.header :refer (header)]
|
||||
[uxbox.main.ui.messages :as uum]
|
||||
|
@ -59,7 +59,7 @@
|
|||
(on-success []
|
||||
(forms/clear! :profile))
|
||||
(on-submit [event]
|
||||
(rs/emit! (udu/update-profile data on-success on-error)))]
|
||||
(st/emit! (udu/update-profile data on-success on-error)))]
|
||||
[:form.profile-form
|
||||
[:span.user-settings-label "Name, username and email"]
|
||||
[:input.input-text
|
||||
|
@ -124,7 +124,7 @@
|
|||
file (-> (dom/get-files target)
|
||||
(iterable->seq)
|
||||
(first))]
|
||||
(rs/emit! (udu/update-photo file))
|
||||
(st/emit! (udu/update-photo file))
|
||||
(dom/clean-value! target)))]
|
||||
(let [{:keys [photo]} (mx/react profile-ref)
|
||||
photo (if (or (str/empty? photo) (nil? photo))
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
(:require [sablono.core :refer-macros [html]]
|
||||
[lentes.core :as l]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.keyboard :as kbd]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
|
@ -41,10 +41,10 @@
|
|||
(rx/filter #(= % :mouse/up))
|
||||
(rx/take 1))
|
||||
stream (rx/take-until stoper wb/mouse-delta-s)
|
||||
on-move #(rs/emit! (uds/move-shape shape %))
|
||||
on-move #(st/emit! (uds/move-shape shape %))
|
||||
on-stop #(rlocks/release! :shape/move)]
|
||||
(when @wb/alignment-ref
|
||||
(rs/emit! (uds/initial-align-shape shape)))
|
||||
(st/emit! (uds/initial-align-shape shape)))
|
||||
(rx/subscribe stream on-move nil on-stop)))]
|
||||
|
||||
(rlocks/acquire! :shape/move)
|
||||
|
@ -65,16 +65,16 @@
|
|||
(and (not selected?) (empty? selected))
|
||||
(do
|
||||
(dom/stop-propagation event)
|
||||
(rs/emit! (uds/select-shape id))
|
||||
(st/emit! (uds/select-shape id))
|
||||
(start-move))
|
||||
|
||||
(and (not selected?) (not (empty? selected)))
|
||||
(do
|
||||
(dom/stop-propagation event)
|
||||
(if (kbd/shift? event)
|
||||
(rs/emit! (uds/select-shape id))
|
||||
(st/emit! (uds/select-shape id))
|
||||
(do
|
||||
(rs/emit! (uds/deselect-all)
|
||||
(st/emit! (uds/deselect-all)
|
||||
(uds/select-shape id))
|
||||
(start-move))))
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
(ns uxbox.main.ui.shapes.group
|
||||
(:require [lentes.core :as l]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.main.ui.shapes.common :as common]
|
||||
[uxbox.main.ui.shapes.attrs :as attrs]
|
||||
|
|
|
@ -9,8 +9,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.http :as http]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.ui.shapes.common :as common]
|
||||
[uxbox.main.ui.shapes.attrs :as attrs]
|
||||
[uxbox.main.data.images :as udi]
|
||||
|
@ -31,7 +31,7 @@
|
|||
[own]
|
||||
(let [{:keys [image]} (first (:rum/args own))]
|
||||
(println (:rum/args own))
|
||||
(rs/emit! (udi/fetch-image image))
|
||||
(st/emit! (udi/fetch-image image))
|
||||
own))
|
||||
|
||||
(mx/defcs image-component
|
||||
|
|
|
@ -6,7 +6,8 @@
|
|||
|
||||
(ns uxbox.main.ui.shapes.path
|
||||
(:require [uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.ui.shapes.common :as common]
|
||||
[uxbox.main.ui.shapes.attrs :as attrs]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
|
@ -25,7 +26,7 @@
|
|||
(common/on-mouse-down event shape selected))
|
||||
(on-double-click [event]
|
||||
(when selected?
|
||||
(rs/emit! (uds/start-edition-mode id))))]
|
||||
(st/emit! (uds/start-edition-mode id))))]
|
||||
[:g.shape {:class (when selected? "selected")
|
||||
:on-double-click on-double-click
|
||||
:on-mouse-down on-mouse-down}
|
||||
|
|
|
@ -9,9 +9,9 @@
|
|||
"Multiple selection handlers component."
|
||||
(:require [lentes.core :as l]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
[uxbox.util.rlocks :as rlocks]
|
||||
|
@ -47,7 +47,7 @@
|
|||
[vid sid]
|
||||
(letfn [(on-resize [[delta ctrl?]]
|
||||
(let [params {:vid vid :delta (assoc delta :lock ctrl?)}]
|
||||
(rs/emit! (uds/update-vertex-position sid params))))
|
||||
(st/emit! (uds/update-vertex-position sid params))))
|
||||
(on-end []
|
||||
(rlocks/release! :shape/resize))]
|
||||
(let [stoper (->> wb/events-s
|
||||
|
@ -59,7 +59,7 @@
|
|||
(rx/with-latest-from vector wb/mouse-ctrl-s))]
|
||||
(rlocks/acquire! :shape/resize)
|
||||
(when @wb/alignment-ref
|
||||
(rs/emit! (uds/initial-vertext-align sid vid)))
|
||||
(st/emit! (uds/initial-vertext-align sid vid)))
|
||||
(rx/subscribe stream on-resize nil on-end))))
|
||||
|
||||
;; --- Selection Handlers (Component)
|
||||
|
@ -145,7 +145,7 @@
|
|||
(defn start-path-edition
|
||||
[shape-id index]
|
||||
(letfn [(on-move [delta]
|
||||
(rs/emit! (uds/update-path shape-id index delta)))
|
||||
(st/emit! (uds/update-path shape-id index delta)))
|
||||
(on-end []
|
||||
(rlocks/release! :shape/resize))]
|
||||
(let [stoper (->> wb/events-s
|
||||
|
@ -155,7 +155,7 @@
|
|||
stream (rx/take-until stoper wb/mouse-delta-s)]
|
||||
(rlocks/acquire! :shape/resize)
|
||||
(when @wb/alignment-ref
|
||||
(rs/emit! (uds/initial-path-point-align shape-id index)))
|
||||
(st/emit! (uds/initial-path-point-align shape-id index)))
|
||||
(rx/subscribe stream on-move nil on-end))))
|
||||
|
||||
(mx/defc path-edition-selection-handlers
|
||||
|
|
|
@ -8,10 +8,11 @@
|
|||
(:require [cuerdas.core :as str]
|
||||
[lentes.core :as l]
|
||||
[goog.events :as events]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.color :as color]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.shapes.common :as common]
|
||||
[uxbox.main.ui.shapes.attrs :as attrs]
|
||||
|
@ -46,7 +47,7 @@
|
|||
(handle-mouse-down event shape selected))
|
||||
(on-double-click [event]
|
||||
(dom/stop-propagation event)
|
||||
(rs/emit! (uds/start-edition-mode id)))]
|
||||
(st/emit! (uds/start-edition-mode id)))]
|
||||
[:g.shape {:class (when selected? "selected")
|
||||
:ref "main"
|
||||
:on-double-click on-double-click
|
||||
|
@ -113,7 +114,7 @@
|
|||
(on-done))
|
||||
(on-input [ev]
|
||||
(let [content (dom/event->inner-text ev)]
|
||||
(rs/emit! (uds/update-text id {:content content}))))]
|
||||
(st/emit! (uds/update-text id {:content content}))))]
|
||||
[:g
|
||||
[:rect (merge props +select-rect-attrs+)]
|
||||
[:foreignObject props
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
[lentes.core :as l]
|
||||
[rum.core :as rum]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as s]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.auth :as da]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -38,7 +38,7 @@
|
|||
[:li {:on-click #(r/go :settings/profile)}
|
||||
i/user
|
||||
[:span "Your account"]]
|
||||
[:li {:on-click #(rs/emit! (da/logout))}
|
||||
[:li {:on-click #(st/emit! (da/logout))}
|
||||
i/exit
|
||||
[:span "Exit"]]])))
|
||||
|
||||
|
@ -52,7 +52,7 @@
|
|||
|
||||
(def profile-ref
|
||||
(as-> (l/key :profile) $
|
||||
(l/derive $ s/state)))
|
||||
(l/derive $ st/state)))
|
||||
|
||||
(defn user-render
|
||||
[own]
|
||||
|
|
|
@ -10,7 +10,8 @@
|
|||
[rum.core :as rum]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.main.constants :as c]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.data.pages :as udp]
|
||||
[uxbox.main.data.history :as udh]
|
||||
|
@ -39,7 +40,7 @@
|
|||
(defn- workspace-will-mount
|
||||
[own]
|
||||
(let [[projectid pageid] (:rum/args own)]
|
||||
(rs/emit! (dw/initialize projectid pageid))
|
||||
(st/emit! (dw/initialize projectid pageid))
|
||||
own))
|
||||
|
||||
(defn- workspace-did-mount
|
||||
|
@ -76,7 +77,7 @@
|
|||
[oldprojectid oldpageid] (:rum/args old-state)]
|
||||
(if (not= pageid oldpageid)
|
||||
(do
|
||||
(rs/emit! (dw/initialize projectid pageid))
|
||||
(st/emit! (dw/initialize projectid pageid))
|
||||
(.close (::sub2 old-state))
|
||||
(.close (::sub3 old-state))
|
||||
(assoc state
|
||||
|
@ -103,8 +104,8 @@
|
|||
(dom/prevent-default event)
|
||||
(dom/stop-propagation event)
|
||||
(if (pos? (.-deltaY event))
|
||||
(rs/emit! (dw/increase-zoom))
|
||||
(rs/emit! (dw/decrease-zoom)))
|
||||
(st/emit! (dw/increase-zoom))
|
||||
(st/emit! (dw/decrease-zoom)))
|
||||
|
||||
(let [dom (mx/ref-node own "workspace-canvas")]
|
||||
(set! (.-scrollLeft dom) (* c/canvas-start-scroll-x @wb/zoom-ref))
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
(ns uxbox.main.ui.workspace.base
|
||||
(:require [beicon.core :as rx]
|
||||
[lentes.core :as l]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.util.geom.point :as gpt]
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
(:require [beicon.core :as rx]
|
||||
[lentes.core :as l]
|
||||
[goog.events :as events]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.geom.point :as gpt]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.util.data :refer (parse-int)]
|
||||
|
|
|
@ -7,12 +7,12 @@
|
|||
|
||||
(ns uxbox.main.ui.workspace.clipboard
|
||||
(:require [lentes.core :as l]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.main.ui.lightbox :as lbx]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.util.datetime :as dt]))
|
||||
|
@ -25,7 +25,7 @@
|
|||
{:mixins [mx/static mx/reactive]}
|
||||
[]
|
||||
(letfn [(on-paste [item]
|
||||
(rs/emit! (udw/paste-from-clipboard (:id item)))
|
||||
(st/emit! (udw/paste-from-clipboard (:id item)))
|
||||
(udl/close!))
|
||||
(on-close [event]
|
||||
(dom/prevent-default event)
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
(ns uxbox.main.ui.workspace.colorpalette
|
||||
(:require [beicon.core :as rx]
|
||||
[lentes.core :as l]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.data.colors :as dc]
|
||||
|
@ -16,7 +16,7 @@
|
|||
[uxbox.main.ui.workspace.base :as wb]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.main.ui.keyboard :as kbd]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.lens :as ul]
|
||||
[uxbox.util.data :refer (read-string)]
|
||||
[uxbox.util.color :refer (hex->rgb)]
|
||||
|
@ -35,8 +35,8 @@
|
|||
(letfn [(select-color [event color]
|
||||
(dom/prevent-default event)
|
||||
(if (kbd/shift? event)
|
||||
(rs/emit! (uds/update-selected-shapes-stroke {:color color}))
|
||||
(rs/emit! (uds/update-selected-shapes-fill {:color color}))))]
|
||||
(st/emit! (uds/update-selected-shapes-stroke {:color color}))
|
||||
(st/emit! (uds/update-selected-shapes-fill {:color color}))))]
|
||||
[:div.color-palette-content
|
||||
(for [hex-color colors
|
||||
:let [rgb-vec (hex->rgb hex-color)
|
||||
|
@ -59,7 +59,7 @@
|
|||
(let [value (read-string (dom/event->value event))]
|
||||
(swap! local assoc :selected value)))
|
||||
(close [event]
|
||||
(rs/emit! (dw/toggle-flag :colorpalette)))]
|
||||
(st/emit! (dw/toggle-flag :colorpalette)))]
|
||||
[:div.color-palette
|
||||
[:div.color-palette-actions
|
||||
[:select.input-select {:on-change select-collection}
|
||||
|
@ -78,7 +78,7 @@
|
|||
|
||||
(defn- colorpalette-will-mount
|
||||
[own]
|
||||
(rs/emit! (dc/fetch-collections))
|
||||
(st/emit! (dc/fetch-collections))
|
||||
own)
|
||||
|
||||
(mx/defc colorpalette
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
|
@ -38,7 +38,7 @@
|
|||
top (- y 50)]
|
||||
(letfn [(change-color [color]
|
||||
(let [attrs {:color color}]
|
||||
(rs/emit!
|
||||
(st/emit!
|
||||
(case attr
|
||||
:stroke (uds/update-stroke-attrs (:id shape) attrs)
|
||||
:fill (uds/update-fill-attrs (:id shape) attrs)))))
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
[beicon.core :as rx]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.exports :as exports]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.main.ui.lightbox :as lbx]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
|
@ -19,7 +19,7 @@
|
|||
[uxbox.util.datetime :as dt]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.zip :as zip]
|
||||
[lentes.core :as l]))
|
||||
|
||||
|
|
|
@ -8,14 +8,15 @@
|
|||
(ns uxbox.main.ui.workspace.drawarea
|
||||
"Draw interaction and component."
|
||||
(:require [beicon.core :as rx]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.rlocks :as rlocks]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.constants :as c]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.shapes :as shapes]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
[uxbox.util.rlocks :as rlocks]
|
||||
[uxbox.main.geom :as geom]
|
||||
[uxbox.util.geom.point :as gpt]
|
||||
[uxbox.util.geom.path :as path]
|
||||
|
@ -128,7 +129,7 @@
|
|||
:x2 (+ x 200)
|
||||
:y2 (+ y (/ 200 proportion))}
|
||||
shape (geom/setup shape props)]
|
||||
(rs/emit! (uds/add-shape shape)
|
||||
(st/emit! (uds/add-shape shape)
|
||||
(udw/select-for-drawing nil)
|
||||
(uds/select-first-shape))
|
||||
(rlocks/release! :ui/draw)))
|
||||
|
@ -232,7 +233,7 @@
|
|||
|
||||
(on-end []
|
||||
(let [shape @drawing-shape]
|
||||
(rs/emit! (uds/add-shape shape)
|
||||
(st/emit! (uds/add-shape shape)
|
||||
(udw/select-for-drawing nil)
|
||||
(uds/select-first-shape))
|
||||
(reset! drawing-shape nil)
|
||||
|
@ -268,7 +269,7 @@
|
|||
|
||||
(on-end []
|
||||
(let [shape (simplify-shape @drawing-shape)]
|
||||
(rs/emit! (uds/add-shape shape)
|
||||
(st/emit! (uds/add-shape shape)
|
||||
(udw/select-for-drawing nil)
|
||||
(uds/select-first-shape))
|
||||
(reset! drawing-shape nil)
|
||||
|
@ -301,7 +302,7 @@
|
|||
(let [shape @drawing-shape
|
||||
shpos @drawing-position
|
||||
shape (geom/resize shape shpos)]
|
||||
(rs/emit! (uds/add-shape shape)
|
||||
(st/emit! (uds/add-shape shape)
|
||||
(udw/select-for-drawing nil)
|
||||
(uds/select-first-shape))
|
||||
(reset! drawing-position nil)
|
||||
|
|
|
@ -11,7 +11,8 @@
|
|||
[beicon.core :as rx]
|
||||
[uxbox.config :as cfg]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.data.history :as udh]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
|
@ -33,8 +34,8 @@
|
|||
coords (some-> (mx/react wb/mouse-canvas-a)
|
||||
(gpt/divide zoom)
|
||||
(gpt/round 1))
|
||||
increase #(rs/emit! (dw/increase-zoom))
|
||||
decrease #(rs/emit! (dw/decrease-zoom))]
|
||||
increase #(st/emit! (dw/increase-zoom))
|
||||
decrease #(st/emit! (dw/decrease-zoom))]
|
||||
(html
|
||||
[:ul.options-view
|
||||
[:li.coordinates {:alt "x"}
|
||||
|
@ -66,9 +67,9 @@
|
|||
(let [project (mx/react wb/project-ref)
|
||||
page (mx/react wb/page-ref)
|
||||
flags (mx/react wb/flags-ref)
|
||||
toggle #(rs/emit! (dw/toggle-flag %))
|
||||
on-undo #(rs/emit! (udh/backwards-to-previous-version))
|
||||
on-redo #(rs/emit! (udh/forward-to-next-version))
|
||||
toggle #(st/emit! (dw/toggle-flag %))
|
||||
on-undo #(st/emit! (udh/backwards-to-previous-version))
|
||||
on-redo #(st/emit! (udh/forward-to-next-version))
|
||||
on-image #(udl/open! :import-image)
|
||||
on-download #(udl/open! :download)]
|
||||
(html
|
||||
|
|
|
@ -8,11 +8,11 @@
|
|||
(ns uxbox.main.ui.workspace.images
|
||||
(:require [lentes.core :as l]
|
||||
[uxbox.util.i18n :as t :refer (tr)]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.data :as data :refer (read-string)]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.data.images :as udi]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
|
@ -54,11 +54,11 @@
|
|||
:metadata {:width width
|
||||
:height height}
|
||||
:image id}]
|
||||
(rs/emit! (udw/select-for-drawing shape))
|
||||
(st/emit! (udw/select-for-drawing shape))
|
||||
(udl/close!)))
|
||||
(on-files-selected [event]
|
||||
(let [files (dom/get-event-files event)]
|
||||
(rs/emit! (udi/create-images nil files on-uploaded))))
|
||||
(st/emit! (udi/create-images nil files on-uploaded))))
|
||||
(on-select-from-library [event]
|
||||
(dom/prevent-default event)
|
||||
(udl/open! :import-image-from-collections))
|
||||
|
@ -96,7 +96,7 @@
|
|||
:metadata {:width width
|
||||
:height height}
|
||||
:image id}]
|
||||
(rs/emit! (udw/select-for-drawing shape))
|
||||
(st/emit! (udw/select-for-drawing shape))
|
||||
(udl/close!)))]
|
||||
[:div.library-item {:key (str id)
|
||||
:on-double-click on-double-click}
|
||||
|
@ -115,10 +115,10 @@
|
|||
(defn will-mount
|
||||
[own]
|
||||
(let [local (:rum/local own)]
|
||||
(rs/emit! (udi/fetch-collections))
|
||||
(rs/emit! (udi/fetch-images nil))
|
||||
(st/emit! (udi/fetch-collections))
|
||||
(st/emit! (udi/fetch-images nil))
|
||||
(add-watch local ::key (fn [_ _ _ v]
|
||||
(rs/emit! (udi/fetch-images (:id v)))))
|
||||
(st/emit! (udi/fetch-images (:id v)))))
|
||||
own))
|
||||
|
||||
(defn will-unmount
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
[rum.core :as rum]
|
||||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
[rum.core :as rum]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.main.constants :as c]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.math :as mth]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
[cuerdas.core :as str]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.main.constants :as c]
|
||||
[uxbox.main.state :as s]
|
||||
[uxbox.store :as s]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
[uxbox.util.mixins :as mx :include-macros true]))
|
||||
|
|
|
@ -8,8 +8,9 @@
|
|||
(ns uxbox.main.ui.workspace.selrect
|
||||
"Mouse selection interaction and component."
|
||||
(:require [beicon.core :as rx]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.constants :as c]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
|
@ -94,7 +95,7 @@
|
|||
[]
|
||||
(let [rect (-> (selrect->rect @position)
|
||||
(translate-to-canvas))]
|
||||
(rs/emit! (uds/deselect-all)
|
||||
(st/emit! (uds/deselect-all)
|
||||
(uds/select-shapes rect))
|
||||
(rlocks/release! :ui/selrect)
|
||||
(reset! position nil)))
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
(ns uxbox.main.ui.workspace.settings
|
||||
(:require [lentes.core :as l]
|
||||
[uxbox.main.constants :as c]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.store :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.main.data.pages :as udp]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
|
@ -65,7 +65,7 @@
|
|||
(let [[errors data] (forms/validate data +settings-form+)]
|
||||
(if errors
|
||||
(set-errors! errors)
|
||||
(rs/emit! (udw/update-metadata id data)
|
||||
(st/emit! (udw/update-metadata id data)
|
||||
(forms/clear :workspace-settings)
|
||||
(udl/hide-lightbox)))))]
|
||||
[:form {:on-submit on-submit}
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
(ns uxbox.main.ui.workspace.shortcuts
|
||||
(:require [goog.events :as events]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
|
@ -25,30 +26,30 @@
|
|||
;; --- Shortcuts
|
||||
|
||||
(defonce +shortcuts+
|
||||
{:shift+g #(rs/emit! (dw/toggle-flag :grid))
|
||||
:ctrl+g #(rs/emit! (uds/group-selected))
|
||||
:ctrl+shift+g #(rs/emit! (uds/degroup-selected))
|
||||
:ctrl+shift+m #(rs/emit! (dw/toggle-flag :sitemap))
|
||||
:ctrl+shift+f #(rs/emit! (dw/toggle-flag :drawtools))
|
||||
:ctrl+shift+i #(rs/emit! (dw/toggle-flag :icons))
|
||||
:ctrl+shift+l #(rs/emit! (dw/toggle-flag :layers))
|
||||
:ctrl+0 #(rs/emit! (dw/reset-zoom))
|
||||
:ctrl+r #(rs/emit! (dw/toggle-flag :ruler))
|
||||
:ctrl+d #(rs/emit! (uds/duplicate-selected))
|
||||
:ctrl+c #(rs/emit! (dw/copy-to-clipboard))
|
||||
:ctrl+v #(rs/emit! (dw/paste-from-clipboard))
|
||||
{:shift+g #(st/emit! (dw/toggle-flag :grid))
|
||||
:ctrl+g #(st/emit! (uds/group-selected))
|
||||
:ctrl+shift+g #(st/emit! (uds/degroup-selected))
|
||||
:ctrl+shift+m #(st/emit! (dw/toggle-flag :sitemap))
|
||||
:ctrl+shift+f #(st/emit! (dw/toggle-flag :drawtools))
|
||||
:ctrl+shift+i #(st/emit! (dw/toggle-flag :icons))
|
||||
:ctrl+shift+l #(st/emit! (dw/toggle-flag :layers))
|
||||
:ctrl+0 #(st/emit! (dw/reset-zoom))
|
||||
:ctrl+r #(st/emit! (dw/toggle-flag :ruler))
|
||||
:ctrl+d #(st/emit! (uds/duplicate-selected))
|
||||
:ctrl+c #(st/emit! (dw/copy-to-clipboard))
|
||||
:ctrl+v #(st/emit! (dw/paste-from-clipboard))
|
||||
:ctrl+shift+v #(udl/open! :clipboard)
|
||||
:ctrl+z #(rs/emit! (udu/undo))
|
||||
:ctrl+shift+z #(rs/emit! (udu/redo))
|
||||
:ctrl+b #(rs/emit! (dw/select-for-drawing wsd/+draw-tool-rect+))
|
||||
:ctrl+e #(rs/emit! (dw/select-for-drawing wsd/+draw-tool-circle+))
|
||||
:ctrl+t #(rs/emit! (dw/select-for-drawing wsd/+draw-tool-text+))
|
||||
:esc #(rs/emit! (uds/deselect-all))
|
||||
:delete #(rs/emit! (uds/delete-selected))
|
||||
:ctrl+up #(rs/emit! (uds/move-selected-layer :up))
|
||||
:ctrl+down #(rs/emit! (uds/move-selected-layer :down))
|
||||
:ctrl+shift+up #(rs/emit! (uds/move-selected-layer :top))
|
||||
:ctrl+shift+down #(rs/emit! (uds/move-selected-layer :bottom))
|
||||
:ctrl+z #(st/emit! (udu/undo))
|
||||
:ctrl+shift+z #(st/emit! (udu/redo))
|
||||
:ctrl+b #(st/emit! (dw/select-for-drawing wsd/+draw-tool-rect+))
|
||||
:ctrl+e #(st/emit! (dw/select-for-drawing wsd/+draw-tool-circle+))
|
||||
:ctrl+t #(st/emit! (dw/select-for-drawing wsd/+draw-tool-text+))
|
||||
:esc #(st/emit! (uds/deselect-all))
|
||||
:delete #(st/emit! (uds/delete-selected))
|
||||
:ctrl+up #(st/emit! (uds/move-selected-layer :up))
|
||||
:ctrl+down #(st/emit! (uds/move-selected-layer :down))
|
||||
:ctrl+shift+up #(st/emit! (uds/move-selected-layer :top))
|
||||
:ctrl+shift+down #(st/emit! (uds/move-selected-layer :bottom))
|
||||
:shift+up #(move-selected :up :fast)
|
||||
:shift+down #(move-selected :down :fast)
|
||||
:shift+right #(move-selected :right :fast)
|
||||
|
@ -90,8 +91,8 @@
|
|||
(defn- move-selected
|
||||
[dir speed]
|
||||
(case speed
|
||||
:std (rs/emit! (uds/move-selected dir 1))
|
||||
:fast (rs/emit! (uds/move-selected dir 20))))
|
||||
:std (st/emit! (uds/move-selected dir 1))
|
||||
:fast (st/emit! (uds/move-selected dir 20))))
|
||||
|
||||
;; --- Mixin
|
||||
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
|
||||
(ns uxbox.main.ui.workspace.sidebar
|
||||
(:require [lentes.core :as l]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
[uxbox.main.ui.workspace.sidebar.options :refer (options-toolbox)]
|
||||
|
|
|
@ -10,11 +10,11 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.data :refer (read-string)]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.dom :as dom]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
[uxbox.main.ui.icons :as i]))
|
||||
|
@ -82,14 +82,14 @@
|
|||
|
||||
(defn- select-for-draw
|
||||
[shape]
|
||||
(rs/emit! (dw/select-for-drawing shape)))
|
||||
(st/emit! (dw/select-for-drawing shape)))
|
||||
|
||||
(mx/defc draw-toolbox
|
||||
{:mixins [mx/static mx/reactive]}
|
||||
[own]
|
||||
(let [workspace (mx/react wb/workspace-ref)
|
||||
drawing (mx/react drawing-shape)
|
||||
close #(rs/emit! (dw/toggle-flag :drawtools))
|
||||
close #(st/emit! (dw/toggle-flag :drawtools))
|
||||
tools (->> (into [] +draw-tools+)
|
||||
(sort-by (comp :priority second)))]
|
||||
[:div#form-tools.tool-window.drawing-tools
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.data.pages :as udp]
|
||||
[uxbox.main.data.history :as udh]
|
||||
|
@ -36,14 +36,14 @@
|
|||
[own item selected]
|
||||
(letfn [(on-select [event]
|
||||
(dom/prevent-default event)
|
||||
(rs/emit! (udh/select-page-history (:version item))))
|
||||
(st/emit! (udh/select-page-history (:version item))))
|
||||
(on-pinned [event]
|
||||
(dom/prevent-default event)
|
||||
(dom/stop-propagation event)
|
||||
(let [item (assoc item
|
||||
:label "no label"
|
||||
:pinned (not (:pinned item)))]
|
||||
(rs/emit! (udh/update-history-item item))))]
|
||||
(st/emit! (udh/update-history-item item))))]
|
||||
(let [selected? (= (:version item) selected)]
|
||||
(html
|
||||
[:li {:class (when selected? "current") :on-click on-select}
|
||||
|
@ -65,13 +65,13 @@
|
|||
[own page history]
|
||||
(letfn [(on-select [event]
|
||||
(dom/prevent-default event)
|
||||
(rs/emit! (udh/deselect-page-history (:id page))))
|
||||
(st/emit! (udh/deselect-page-history (:id page))))
|
||||
|
||||
(on-load-more [event]
|
||||
(dom/prevent-default event)
|
||||
(let [since (:min-version history)
|
||||
params {:since since}]
|
||||
(rs/emit! (udh/fetch-page-history (:id page) params))))]
|
||||
(st/emit! (udh/fetch-page-history (:id page) params))))]
|
||||
|
||||
(let [selected (:selected history)
|
||||
show-more? (pos? (:min-version history))]
|
||||
|
@ -121,7 +121,7 @@
|
|||
page (mx/react wb/page-ref)
|
||||
history (mx/react history-ref)
|
||||
section (:section @local :main)
|
||||
close #(rs/emit! (dw/toggle-flag :document-history))
|
||||
close #(st/emit! (dw/toggle-flag :document-history))
|
||||
main? (= section :main)
|
||||
pinned? (= section :pinned)
|
||||
show-main #(swap! local assoc :section :main)
|
||||
|
@ -156,8 +156,8 @@
|
|||
[own page]
|
||||
(let [history (mx/react history-ref)
|
||||
version (:selected history)
|
||||
on-accept #(rs/emit! (udh/apply-selected-history page))
|
||||
on-cancel #(rs/emit! (udh/deselect-page-history page))]
|
||||
on-accept #(st/emit! (udh/apply-selected-history page))
|
||||
on-cancel #(st/emit! (udh/deselect-page-history page))]
|
||||
(when (or version (:deselecting history))
|
||||
(html
|
||||
[:div.message-version
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
(ns uxbox.main.ui.workspace.sidebar.icons
|
||||
(:require [lentes.core :as l]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.data.icons :as udi]
|
||||
[uxbox.main.ui.shapes.icon :as icon]
|
||||
|
@ -40,10 +40,10 @@
|
|||
(defn- icons-toolbox-will-mount
|
||||
[own]
|
||||
(let [local (:rum/local own)]
|
||||
(rs/emit! (udi/fetch-collections))
|
||||
(rs/emit! (udi/fetch-icons nil))
|
||||
(st/emit! (udi/fetch-collections))
|
||||
(st/emit! (udi/fetch-icons nil))
|
||||
(add-watch local ::key (fn [_ _ _ {:keys [id]}]
|
||||
(rs/emit! (udi/fetch-icons id))))
|
||||
(st/emit! (udi/fetch-icons id))))
|
||||
own))
|
||||
|
||||
(defn- icons-toolbox-will-unmount
|
||||
|
@ -69,14 +69,14 @@
|
|||
(filter #(= (:id coll) (:collection %))))]
|
||||
|
||||
(letfn [(on-close [event]
|
||||
(rs/emit! (dw/toggle-flag :icons)))
|
||||
(st/emit! (dw/toggle-flag :icons)))
|
||||
(on-select [icon event]
|
||||
(rs/emit! (dw/select-for-drawing icon)))
|
||||
(st/emit! (dw/select-for-drawing icon)))
|
||||
(on-change [event]
|
||||
(let [value (-> (dom/event->value event)
|
||||
(read-string))]
|
||||
(swap! local assoc :id value)
|
||||
(rs/emit! (dw/select-for-drawing nil))))]
|
||||
(st/emit! (dw/select-for-drawing nil))))]
|
||||
[:div#form-figures.tool-window
|
||||
[:div.tool-window-bar
|
||||
[:div.tool-window-icon i/icon-set]
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
[cuerdas.core :as str]
|
||||
[goog.events :as events]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.util.data :refer (read-string classnames)]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
|
@ -41,17 +41,17 @@
|
|||
nil
|
||||
|
||||
(.-ctrlKey event)
|
||||
(rs/emit! (uds/select-shape id))
|
||||
(st/emit! (uds/select-shape id))
|
||||
|
||||
(> (count selected) 1)
|
||||
(rs/emit! (uds/deselect-all)
|
||||
(st/emit! (uds/deselect-all)
|
||||
(uds/select-shape id))
|
||||
|
||||
(contains? selected id)
|
||||
(rs/emit! (uds/select-shape id))
|
||||
(st/emit! (uds/select-shape id))
|
||||
|
||||
:else
|
||||
(rs/emit! (uds/deselect-all)
|
||||
(st/emit! (uds/deselect-all)
|
||||
(uds/select-shape id)))))
|
||||
|
||||
(defn- toggle-visibility
|
||||
|
@ -60,10 +60,10 @@
|
|||
(let [id (:id item)
|
||||
hidden? (:hidden item)]
|
||||
(if hidden?
|
||||
(rs/emit! (uds/show-shape id))
|
||||
(rs/emit! (uds/hide-shape id)))
|
||||
(st/emit! (uds/show-shape id))
|
||||
(st/emit! (uds/hide-shape id)))
|
||||
(when (contains? selected id)
|
||||
(rs/emit! (uds/select-shape id)))))
|
||||
(st/emit! (uds/select-shape id)))))
|
||||
|
||||
(defn- toggle-blocking
|
||||
[item event]
|
||||
|
@ -71,8 +71,8 @@
|
|||
(let [id (:id item)
|
||||
blocked? (:blocked item)]
|
||||
(if blocked?
|
||||
(rs/emit! (uds/unblock-shape id))
|
||||
(rs/emit! (uds/block-shape id)))))
|
||||
(st/emit! (uds/unblock-shape id))
|
||||
(st/emit! (uds/block-shape id)))))
|
||||
|
||||
(defn- element-icon
|
||||
[item]
|
||||
|
@ -116,7 +116,7 @@
|
|||
data {:id (:id shape)
|
||||
:name (dom/get-value target)}]
|
||||
(set! (.-draggable parent) true)
|
||||
(rs/emit! (uds/update-shape data))
|
||||
(st/emit! (uds/update-shape data))
|
||||
(swap! local assoc :edition false)))
|
||||
(on-key-down [event]
|
||||
(js/console.log event)
|
||||
|
@ -168,8 +168,8 @@
|
|||
(let [id (dnd/get-data event)
|
||||
over (:over @local)]
|
||||
(case (:over @local)
|
||||
:top (rs/emit! (uds/drop-shape id (:id item) :before))
|
||||
:bottom (rs/emit! (uds/drop-shape id (:id item) :after)))
|
||||
:top (st/emit! (uds/drop-shape id (:id item) :before))
|
||||
:bottom (st/emit! (uds/drop-shape id (:id item) :after)))
|
||||
(swap! local assoc :dragging false :over nil)))
|
||||
(on-drag-over [event]
|
||||
(dom/prevent-default event)
|
||||
|
@ -228,13 +228,13 @@
|
|||
(letfn [(toggle-collapse [event]
|
||||
(dom/stop-propagation event)
|
||||
(if (:collapsed item)
|
||||
(rs/emit! (uds/uncollapse-shape id))
|
||||
(rs/emit! (uds/collapse-shape id))))
|
||||
(st/emit! (uds/uncollapse-shape id))
|
||||
(st/emit! (uds/collapse-shape id))))
|
||||
(toggle-locking [event]
|
||||
(dom/stop-propagation event)
|
||||
(if (:locked item)
|
||||
(rs/emit! (uds/unlock-shape id))
|
||||
(rs/emit! (uds/lock-shape id))))
|
||||
(st/emit! (uds/unlock-shape id))
|
||||
(st/emit! (uds/lock-shape id))))
|
||||
(on-drag-start [event]
|
||||
(let [target (dom/event->target event)]
|
||||
(dnd/set-allowed-effect! event "move")
|
||||
|
@ -247,9 +247,9 @@
|
|||
(let [coming-id (dnd/get-data event)
|
||||
over (:over @local)]
|
||||
(case (:over @local)
|
||||
:top (rs/emit! (uds/drop-shape coming-id id :before))
|
||||
:bottom (rs/emit! (uds/drop-shape coming-id id :after))
|
||||
:middle (rs/emit! (uds/drop-shape coming-id id :inside)))
|
||||
:top (st/emit! (uds/drop-shape coming-id id :before))
|
||||
:bottom (st/emit! (uds/drop-shape coming-id id :after))
|
||||
:middle (st/emit! (uds/drop-shape coming-id id :inside)))
|
||||
(swap! local assoc :dragging false :over nil)))
|
||||
(on-drag-over [event]
|
||||
(dom/prevent-default event)
|
||||
|
@ -309,11 +309,11 @@
|
|||
selected (:selected workspace)
|
||||
shapes-map (mx/react wb/shapes-by-id-ref)
|
||||
page (mx/react (focus-page (:page workspace)))
|
||||
close #(rs/emit! (udw/toggle-flag :layers))
|
||||
duplicate #(rs/emit! (uds/duplicate-selected))
|
||||
group #(rs/emit! (uds/group-selected))
|
||||
degroup #(rs/emit! (uds/degroup-selected))
|
||||
delete #(rs/emit! (uds/delete-selected))
|
||||
close #(st/emit! (udw/toggle-flag :layers))
|
||||
duplicate #(st/emit! (uds/duplicate-selected))
|
||||
group #(st/emit! (uds/group-selected))
|
||||
degroup #(st/emit! (uds/degroup-selected))
|
||||
delete #(st/emit! (uds/delete-selected))
|
||||
dragel (volatile! nil)]
|
||||
[:div#layers.tool-window
|
||||
[:div.tool-window-bar
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
|
@ -132,7 +132,7 @@
|
|||
{:mixins [mx/static mx/reactive]}
|
||||
[]
|
||||
(let [shape (mx/react selected-shape-ref)
|
||||
close #(rs/emit! (udw/toggle-flag :element-options))]
|
||||
close #(st/emit! (udw/toggle-flag :element-options))]
|
||||
[:div.elementa-options.tool-window
|
||||
[:div.tool-window-bar
|
||||
[:div.tool-window-icon i/options]
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -31,22 +31,22 @@
|
|||
value (parse-int value 0)
|
||||
sid (:id shape)
|
||||
props {attr value}]
|
||||
(rs/emit! (uds/update-size sid props))))
|
||||
(st/emit! (uds/update-size sid props))))
|
||||
(on-rotation-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
value (parse-int value 0)
|
||||
sid (:id shape)]
|
||||
(rs/emit! (uds/update-rotation sid value))))
|
||||
(st/emit! (uds/update-rotation sid value))))
|
||||
(on-pos-change [attr event]
|
||||
(let [value (dom/event->value event)
|
||||
value (parse-int value nil)
|
||||
sid (:id shape)
|
||||
props {attr value}]
|
||||
(rs/emit! (uds/update-position sid props))))
|
||||
(st/emit! (uds/update-position sid props))))
|
||||
(on-proportion-lock-change [event]
|
||||
(if (:proportion-lock shape)
|
||||
(rs/emit! (uds/unlock-proportions id))
|
||||
(rs/emit! (uds/lock-proportions id))))]
|
||||
(st/emit! (uds/unlock-proportions id))
|
||||
(st/emit! (uds/lock-proportions id))))]
|
||||
[:div.element-set {:key (str (:id menu))}
|
||||
[:div.element-set-title (:name menu)]
|
||||
[:div.element-set-content
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -24,7 +24,7 @@
|
|||
[own menu shape]
|
||||
(letfn [(change-fill [value]
|
||||
(let [sid (:id shape)]
|
||||
(rs/emit! (uds/update-fill-attrs sid value))))
|
||||
(st/emit! (uds/update-fill-attrs sid value))))
|
||||
(on-color-change [event]
|
||||
(let [value (dom/event->value event)]
|
||||
(change-fill {:color value})))
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -30,18 +30,18 @@
|
|||
value (parse-int value 0)
|
||||
sid (:id shape)
|
||||
props {attr value}]
|
||||
(rs/emit! (uds/update-size sid props))))
|
||||
(st/emit! (uds/update-size sid props))))
|
||||
(on-rotation-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
value (parse-int value 0)
|
||||
sid (:id shape)]
|
||||
(rs/emit! (uds/update-rotation sid value))))
|
||||
(st/emit! (uds/update-rotation sid value))))
|
||||
(on-pos-change [attr event]
|
||||
(let [value (dom/event->value event)
|
||||
value (parse-int value nil)
|
||||
sid (:id shape)
|
||||
props {attr value}]
|
||||
(rs/emit! (uds/update-position sid props))))]
|
||||
(st/emit! (uds/update-position sid props))))]
|
||||
(let [size (geom/size shape)]
|
||||
(html
|
||||
[:div.element-set {:key (str (:id menu))}
|
||||
|
|
|
@ -11,9 +11,9 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.ui.workspace.sidebar.sitemap :refer (pages-ref)]
|
||||
|
@ -62,7 +62,7 @@
|
|||
(delete [item]
|
||||
(let [sid (:id shape)
|
||||
id (:id item)]
|
||||
(rs/emit! (uds/delete-interaction sid id))))
|
||||
(st/emit! (uds/delete-interaction sid id))))
|
||||
(on-delete [item event]
|
||||
(dom/prevent-default event)
|
||||
(let [delete (partial delete item)]
|
||||
|
@ -543,7 +543,7 @@
|
|||
(dom/prevent-default event)
|
||||
(let [shape-id (:id shape)
|
||||
data (deref form-ref)]
|
||||
(rs/emit! (uds/update-interaction shape-id data))
|
||||
(st/emit! (uds/update-interaction shape-id data))
|
||||
(reset! form-ref nil)))
|
||||
(on-cancel [event]
|
||||
(dom/prevent-default event)
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -29,13 +29,13 @@
|
|||
(let [value (dom/event->value event)
|
||||
value (parse-int value 0)
|
||||
sid (:id shape)]
|
||||
(rs/emit! (uds/update-rotation sid value))))
|
||||
(st/emit! (uds/update-rotation sid value))))
|
||||
(on-pos-change [attr event]
|
||||
(let [value (dom/event->value event)
|
||||
value (parse-int value nil)
|
||||
sid (:id shape)
|
||||
props {attr value}]
|
||||
(rs/emit! (uds/update-line-attrs sid props))))]
|
||||
(st/emit! (uds/update-line-attrs sid props))))]
|
||||
(html
|
||||
[:div.element-set {:key (str (:id menu))}
|
||||
[:div.element-set-title (:name menu)]
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
(:require [lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
|
|
@ -9,8 +9,8 @@
|
|||
(:require [lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -28,28 +28,28 @@
|
|||
(let [value (-> (dom/event->value event) (parse-int 0))
|
||||
sid (:id shape)
|
||||
props {attr value}]
|
||||
(rs/emit! (uds/update-size sid props))))
|
||||
(st/emit! (uds/update-size sid props))))
|
||||
(on-rotation-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
value (parse-int value 0)
|
||||
sid (:id shape)]
|
||||
(rs/emit! (uds/update-rotation sid value))))
|
||||
(st/emit! (uds/update-rotation sid value))))
|
||||
(on-pos-change [attr event]
|
||||
(let [value (dom/event->value event)
|
||||
value (parse-int value nil)
|
||||
sid (:id shape)
|
||||
props {attr value}]
|
||||
(rs/emit! (uds/update-position sid props))))
|
||||
(st/emit! (uds/update-position sid props))))
|
||||
(on-border-change [attr event]
|
||||
(let [value (dom/event->value event)
|
||||
value (parse-int value nil)
|
||||
sid (:id shape)
|
||||
props {attr value}]
|
||||
(rs/emit! (uds/update-radius-attrs sid props))))
|
||||
(st/emit! (uds/update-radius-attrs sid props))))
|
||||
(on-proportion-lock-change [event]
|
||||
(if (:proportion-lock shape)
|
||||
(rs/emit! (uds/unlock-proportions id))
|
||||
(rs/emit! (uds/lock-proportions id))))]
|
||||
(st/emit! (uds/unlock-proportions id))
|
||||
(st/emit! (uds/lock-proportions id))))]
|
||||
(let [size (geom/size shape)]
|
||||
[:div.element-set
|
||||
[:div.element-set-title (:name menu)]
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
|
@ -24,7 +24,7 @@
|
|||
[own menu shape]
|
||||
(letfn [(change-stroke [value]
|
||||
(let [sid (:id shape)]
|
||||
(rs/emit! (uds/update-stroke-attrs sid value))))
|
||||
(st/emit! (uds/update-stroke-attrs sid value))))
|
||||
(on-width-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
value (parse-float value 1)]
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
[lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.workspace :as udw]
|
||||
[uxbox.main.data.shapes :as uds]
|
||||
[uxbox.main.ui.workspace.base :as wb]
|
||||
|
@ -39,26 +39,26 @@
|
|||
params {:family (read-string value)
|
||||
:weight "normal"
|
||||
:style "normal"}]
|
||||
(rs/emit! (uds/update-font-attrs sid params))))
|
||||
(st/emit! (uds/update-font-attrs sid params))))
|
||||
(on-font-size-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
params {:size (parse-int value)}
|
||||
sid (:id shape)]
|
||||
(rs/emit! (uds/update-font-attrs sid params))))
|
||||
(st/emit! (uds/update-font-attrs sid params))))
|
||||
(on-font-letter-spacing-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
params {:letter-spacing (parse-float value)}
|
||||
sid (:id shape)]
|
||||
(rs/emit! (uds/update-font-attrs sid params))))
|
||||
(st/emit! (uds/update-font-attrs sid params))))
|
||||
(on-font-line-height-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
params {:line-height (parse-float value)}
|
||||
sid (:id shape)]
|
||||
(rs/emit! (uds/update-font-attrs sid params))))
|
||||
(st/emit! (uds/update-font-attrs sid params))))
|
||||
(on-font-align-change [event value]
|
||||
(let [params {:align value}
|
||||
sid (:id shape)]
|
||||
(rs/emit! (uds/update-font-attrs sid params))))
|
||||
(st/emit! (uds/update-font-attrs sid params))))
|
||||
|
||||
(on-font-style-change [event]
|
||||
(let [value (dom/event->value event)
|
||||
|
@ -66,7 +66,7 @@
|
|||
sid (:id shape)
|
||||
params {:style style
|
||||
:weight weight}]
|
||||
(rs/emit! (uds/update-font-attrs sid params))))]
|
||||
(st/emit! (uds/update-font-attrs sid params))))]
|
||||
(let [{:keys [family style weight size align line-height letter-spacing]
|
||||
:or {family "sourcesanspro"
|
||||
align "left"
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
[cuerdas.core :as str]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.projects :as dp]
|
||||
[uxbox.main.data.pages :as udp]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
|
@ -45,11 +45,11 @@
|
|||
(udl/open! :page-form {:page page}))
|
||||
|
||||
(on-navigate [event]
|
||||
(rs/emit! (dp/go-to (:project page) (:id page))))
|
||||
(st/emit! (dp/go-to (:project page) (:id page))))
|
||||
|
||||
(delete []
|
||||
(let [next #(rs/emit! (dp/go-to (:project page)))]
|
||||
(rs/emit! (udp/delete-page (:id page) next))))
|
||||
(let [next #(st/emit! (dp/go-to (:project page)))]
|
||||
(st/emit! (udp/delete-page (:id page) next))))
|
||||
|
||||
(on-delete [event]
|
||||
(dom/prevent-default event)
|
||||
|
@ -71,7 +71,7 @@
|
|||
pages (mx/react pages-ref)
|
||||
current (mx/react wb/page-ref)
|
||||
create #(udl/open! :page-form {:page {:project (:id project)}})
|
||||
close #(rs/emit! (dw/toggle-flag :sitemap))]
|
||||
close #(st/emit! (dw/toggle-flag :sitemap))]
|
||||
[:div.sitemap.tool-window
|
||||
[:div.tool-window-bar
|
||||
[:div.tool-window-icon i/project-tree]
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
(ns uxbox.main.ui.workspace.sidebar.sitemap-pageform
|
||||
(:require [lentes.core :as l]
|
||||
[cuerdas.core :as str]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.pages :as udp]
|
||||
[uxbox.main.data.workspace :as dw]
|
||||
[uxbox.main.data.lightbox :as udl]
|
||||
|
@ -17,7 +17,7 @@
|
|||
[uxbox.main.ui.lightbox :as lbx]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.router :as r]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.forms :as forms]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.data :refer (deep-merge parse-int)]
|
||||
|
@ -81,8 +81,8 @@
|
|||
(dom/prevent-default e)
|
||||
(udl/close!)
|
||||
(if (nil? id)
|
||||
(rs/emit! (udp/create-page data))
|
||||
(rs/emit! (udp/update-page id data))))]
|
||||
(st/emit! (udp/create-page data))
|
||||
(st/emit! (udp/update-page id data))))]
|
||||
[:form
|
||||
[:input#project-name.input-text
|
||||
{:placeholder "Page name"
|
||||
|
|
35
frontend/src/uxbox/store.cljs
Normal file
35
frontend/src/uxbox/store.cljs
Normal file
|
@ -0,0 +1,35 @@
|
|||
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
;;
|
||||
;; Copyright (c) 2015-2016 Andrey Antukh <niwi@niwi.nz>
|
||||
|
||||
(ns uxbox.store
|
||||
(:require [beicon.core :as rx]
|
||||
[lentes.core :as l]
|
||||
[potok.core :as ptk]))
|
||||
|
||||
(enable-console-print!)
|
||||
|
||||
(def ^:dynamic *on-error* identity)
|
||||
|
||||
(defonce state (atom {}))
|
||||
(defonce loader (atom false))
|
||||
(defonce store (ptk/store {:on-error #(*on-error* %)}))
|
||||
|
||||
(def auth-ref
|
||||
(-> (l/key :auth)
|
||||
(l/derive state)))
|
||||
|
||||
(defn emit!
|
||||
([event]
|
||||
(ptk/emit! store event))
|
||||
([event & events]
|
||||
(apply ptk/emit! store (cons event events))))
|
||||
|
||||
(defn init
|
||||
"Initialize the state materialization."
|
||||
[initial-state]
|
||||
(let [istate (if (fn? initial-state) (initial-state) initial-state)]
|
||||
(emit! (constantly istate))
|
||||
(rx/to-atom store state)))
|
|
@ -7,10 +7,11 @@
|
|||
|
||||
(ns uxbox.util.forms
|
||||
(:refer-clojure :exclude [keyword uuid vector boolean map set])
|
||||
(:require [struct.core :as st]
|
||||
(:require [struct.core :as f]
|
||||
[lentes.core :as l]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.i18n :refer (tr)]))
|
||||
|
||||
|
@ -21,35 +22,35 @@
|
|||
;; --- Form Validators
|
||||
|
||||
(def required
|
||||
(assoc st/required :message "errors.form.required"))
|
||||
(assoc f/required :message "errors.form.required"))
|
||||
|
||||
(def string
|
||||
(assoc st/string :message "errors.form.string"))
|
||||
(assoc f/string :message "errors.form.string"))
|
||||
|
||||
(def number
|
||||
(assoc st/number :message "errors.form.number"))
|
||||
(assoc f/number :message "errors.form.number"))
|
||||
|
||||
(def integer
|
||||
(assoc st/integer :message "errors.form.integer"))
|
||||
(assoc f/integer :message "errors.form.integer"))
|
||||
|
||||
(def boolean
|
||||
(assoc st/boolean :message "errors.form.bool"))
|
||||
(assoc f/boolean :message "errors.form.bool"))
|
||||
|
||||
(def identical-to
|
||||
(assoc st/identical-to :message "errors.form.identical-to"))
|
||||
(assoc f/identical-to :message "errors.form.identical-to"))
|
||||
|
||||
(def in-range st/in-range)
|
||||
;; (def uuid-like st/uuid-like)
|
||||
(def uuid st/uuid)
|
||||
(def keyword st/keyword)
|
||||
(def integer-str st/integer-str)
|
||||
(def number-str st/number-str)
|
||||
;; (def boolean-like st/boolean-like)
|
||||
(def email st/email)
|
||||
;; (def function st/function)
|
||||
(def positive st/positive)
|
||||
;; (def validate st/validate)
|
||||
;; (def validate! st/validate!)
|
||||
(def in-range f/in-range)
|
||||
;; (def uuid-like f/uuid-like)
|
||||
(def uuid f/uuid)
|
||||
(def keyword f/keyword)
|
||||
(def integer-str f/integer-str)
|
||||
(def number-str f/number-str)
|
||||
;; (def boolean-like f/boolean-like)
|
||||
(def email f/email)
|
||||
;; (def function f/function)
|
||||
(def positive f/positive)
|
||||
;; (def validate f/validate)
|
||||
;; (def validate! f/validate!)
|
||||
|
||||
(def max-len
|
||||
{:message "errors.form.max-len"
|
||||
|
@ -75,7 +76,7 @@
|
|||
([data schema]
|
||||
(validate data schema nil))
|
||||
([data schema opts]
|
||||
(st/validate data schema opts)))
|
||||
(f/validate data schema opts)))
|
||||
|
||||
(defn validate!
|
||||
([data schema]
|
||||
|
@ -98,8 +99,8 @@
|
|||
;; --- Set Error
|
||||
|
||||
(defrecord SetError [type field error]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:errors type field] error)))
|
||||
|
||||
(defn set-error
|
||||
|
@ -113,13 +114,13 @@
|
|||
|
||||
(defn set-error!
|
||||
[& args]
|
||||
(rs/emit! (apply set-error args)))
|
||||
(st/emit! (apply set-error args)))
|
||||
|
||||
;; --- Set Errors
|
||||
|
||||
(defrecord SetErrors [type errors]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:errors type] errors)))
|
||||
|
||||
(defn set-errors
|
||||
|
@ -133,13 +134,13 @@
|
|||
|
||||
(defn set-errors!
|
||||
[& args]
|
||||
(rs/emit! (apply set-errors args)))
|
||||
(st/emit! (apply set-errors args)))
|
||||
|
||||
;; --- Set Value
|
||||
|
||||
(defrecord SetValue [type field value]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [form-path (into [:forms type] (if (coll? field) field [field]))
|
||||
errors-path (into [:errors type] (if (coll? field) field [field]))]
|
||||
(-> state
|
||||
|
@ -155,13 +156,13 @@
|
|||
|
||||
(defn set-value!
|
||||
[type field value]
|
||||
(rs/emit! (set-value type field value)))
|
||||
(st/emit! (set-value type field value)))
|
||||
|
||||
;; --- Validate Form
|
||||
|
||||
;; (defrecord ValidateForm [type form data on-success]
|
||||
;; rs/WatchEvent
|
||||
;; (-apply-watch [_ state stream]
|
||||
;; ptk/WatchEvent
|
||||
;; (watch [_ state stream]
|
||||
;; (let [[errors data] (validate data form)]
|
||||
;; (if errors
|
||||
;; (rx/of (set-errors type errors))
|
||||
|
@ -179,13 +180,13 @@
|
|||
|
||||
;; (defn validate-form!
|
||||
;; [& args]
|
||||
;; (rs/emit! (apply validate-form args)))
|
||||
;; (f/emit! (apply validate-form args)))
|
||||
|
||||
;; --- Clear Form
|
||||
|
||||
(defrecord ClearForm [type]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:forms type] nil)))
|
||||
|
||||
(defn clear-form
|
||||
|
@ -195,13 +196,13 @@
|
|||
|
||||
(defn clear-form!
|
||||
[type]
|
||||
(rs/emit! (clear-form type)))
|
||||
(st/emit! (clear-form type)))
|
||||
|
||||
;; --- Clear Form
|
||||
|
||||
(defrecord ClearErrors [type]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(assoc-in state [:errors type] nil)))
|
||||
|
||||
(defn clear-errors
|
||||
|
@ -211,13 +212,13 @@
|
|||
|
||||
(defn clear-errors!
|
||||
[type]
|
||||
(rs/emit! (clear-errors type)))
|
||||
(st/emit! (clear-errors type)))
|
||||
|
||||
;; --- Clear
|
||||
|
||||
(defrecord Clear [type]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (clear-form type)
|
||||
(clear-errors type))))
|
||||
|
||||
|
@ -227,7 +228,7 @@
|
|||
|
||||
(defn clear!
|
||||
[type]
|
||||
(rs/emit! (clear type)))
|
||||
(st/emit! (clear type)))
|
||||
|
||||
;; --- Helpers
|
||||
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
(ns uxbox.util.router
|
||||
(:require [bide.core :as r]
|
||||
[beicon.core :as rx]
|
||||
[uxbox.util.rstore :as rs]))
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]))
|
||||
|
||||
(enable-console-print!)
|
||||
|
||||
|
@ -17,8 +18,8 @@
|
|||
;; --- Update Location (Event)
|
||||
|
||||
(defrecord UpdateLocation [id params]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [route (merge {:id id}
|
||||
(when params
|
||||
{:params params}))]
|
||||
|
@ -35,8 +36,8 @@
|
|||
;; --- Navigate (Event)
|
||||
|
||||
(defrecord Navigate [id params]
|
||||
rs/EffectEvent
|
||||
(-apply-effect [_ state]
|
||||
ptk/EffectEvent
|
||||
(effect [_ state stream]
|
||||
(r/navigate! +router+ id params)))
|
||||
|
||||
(defn navigate
|
||||
|
@ -51,7 +52,7 @@
|
|||
([routes]
|
||||
(init routes nil))
|
||||
([routes {:keys [default] :or {default :auth/login}}]
|
||||
(let [opts {:on-navigate #(rs/emit! (update-location %1 %2))
|
||||
(let [opts {:on-navigate #(st/emit! (update-location %1 %2))
|
||||
:default default}
|
||||
router (-> (r/router routes)
|
||||
(r/start! opts))]
|
||||
|
@ -62,7 +63,7 @@
|
|||
"Redirect the user to other url."
|
||||
([id] (go id nil))
|
||||
([id params]
|
||||
(rs/emit! (navigate id params))))
|
||||
(st/emit! (navigate id params))))
|
||||
|
||||
(defn route-for
|
||||
"Given a location handler and optional parameter map, return the URI
|
||||
|
|
|
@ -1,115 +0,0 @@
|
|||
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
;;
|
||||
;; Copyright (c) 2015-2016 Andrey Antukh <niwi@niwi.nz>
|
||||
;; Copyright (c) 2015-2016 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
||||
|
||||
(ns uxbox.util.rstore
|
||||
"Reactive storage management architecture helpers."
|
||||
(:require [beicon.core :as rx]))
|
||||
|
||||
;; An abstraction for implement a simple state
|
||||
;; transition. The `-apply-update` function receives
|
||||
;; the state and shoudl return the transformed state.
|
||||
|
||||
(defprotocol UpdateEvent
|
||||
(-apply-update [event state]))
|
||||
|
||||
;; An abstraction for perform some async stuff such
|
||||
;; as communicate with api rest or other resources
|
||||
;; that implies asynchronous access.
|
||||
;; The `-apply-watch` receives the state and should
|
||||
;; return a reactive stream of events (that can be
|
||||
;; of `UpdateEvent`, `WatchEvent` or `EffectEvent`.
|
||||
|
||||
(defprotocol WatchEvent
|
||||
(-apply-watch [event state s]))
|
||||
|
||||
;; An abstraction for perform just side effects. It
|
||||
;; receives state and its return value is completly
|
||||
;; ignored.
|
||||
|
||||
(defprotocol EffectEvent
|
||||
(-apply-effect [event state]))
|
||||
|
||||
(defn update?
|
||||
"Return `true` when `e` satisfies
|
||||
the UpdateEvent protocol."
|
||||
[e]
|
||||
(satisfies? UpdateEvent e))
|
||||
|
||||
(defn watch?
|
||||
"Return `true` when `e` satisfies
|
||||
the WatchEvent protocol."
|
||||
[e]
|
||||
(satisfies? WatchEvent e))
|
||||
|
||||
(defn effect?
|
||||
"Return `true` when `e` satisfies
|
||||
the EffectEvent protocol."
|
||||
[e]
|
||||
(satisfies? EffectEvent e))
|
||||
|
||||
(extend-protocol UpdateEvent
|
||||
function
|
||||
(-apply-update [func state]
|
||||
(func state)))
|
||||
|
||||
(defonce ^:private bus (rx/bus))
|
||||
(defonce stream (rx/map identity bus))
|
||||
|
||||
(defn emit!
|
||||
"Emits an event or a collection of them."
|
||||
([event]
|
||||
(rx/push! bus event))
|
||||
([event & events]
|
||||
(run! emit! (cons event events))))
|
||||
|
||||
(defonce ^:private error-handlers
|
||||
(atom {}))
|
||||
|
||||
(defn add-error-watcher
|
||||
[key callable]
|
||||
(swap! error-handlers assoc key callable))
|
||||
|
||||
(defn remove-error-watcher
|
||||
[key]
|
||||
(swap! error-handlers dissoc key))
|
||||
|
||||
(defn- on-error
|
||||
[error]
|
||||
(doseq [[key value] @error-handlers]
|
||||
(value error))
|
||||
(throw error))
|
||||
|
||||
(defn init
|
||||
"Initializes the stream event loop and
|
||||
return a stream with model changes."
|
||||
[state]
|
||||
(let [watch-s (rx/filter watch? stream)
|
||||
effect-s (rx/filter effect? stream)
|
||||
update-s (rx/filter update? stream)
|
||||
state-s (->> update-s
|
||||
(rx/scan #(-apply-update %2 %1) state)
|
||||
(rx/catch on-error)
|
||||
(rx/retry 1024)
|
||||
(rx/share))]
|
||||
|
||||
;; Process event sources: combine with the latest model and the result will be
|
||||
;; pushed to the event-stream bus
|
||||
(as-> watch-s $
|
||||
(rx/with-latest-from vector state-s $)
|
||||
(rx/flat-map (fn [[event model]] (-apply-watch event model stream)) $)
|
||||
(rx/catch on-error $)
|
||||
(rx/retry 1024 $)
|
||||
(rx/on-value $ emit!))
|
||||
|
||||
;; Process effects: combine with the latest model to process the new effect
|
||||
(as-> effect-s $
|
||||
(rx/with-latest-from vector state-s $)
|
||||
(rx/subscribe $ (fn [[event model]] (-apply-effect event model))))
|
||||
|
||||
;; Initialize the stream machinary with initial state.
|
||||
(emit! #(merge % state))
|
||||
state-s))
|
|
@ -6,10 +6,10 @@
|
|||
|
||||
(ns uxbox.view
|
||||
(:require [uxbox.config]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.view.ui :as ui]))
|
||||
|
||||
(defn initial-state
|
||||
(defn- initial-state
|
||||
[]
|
||||
{:route nil
|
||||
:project nil
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
(ns uxbox.view.data.viewer
|
||||
(:require [beicon.core :as rx]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.forms :as sc]
|
||||
[uxbox.util.data :refer (parse-int)]
|
||||
|
@ -19,8 +19,8 @@
|
|||
(declare load-data)
|
||||
|
||||
(defrecord Initialize [token]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state s]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state s]
|
||||
(rx/of (load-data token))))
|
||||
|
||||
(defn initialize
|
||||
|
@ -44,8 +44,8 @@
|
|||
(update :pages conj page))))
|
||||
|
||||
(defrecord DataLoaded [data]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [project (dissoc data :pages)
|
||||
pages (sort-by :created-at (:pages data))]
|
||||
(as-> state $
|
||||
|
@ -60,8 +60,8 @@
|
|||
;; --- Load Data
|
||||
|
||||
(defrecord LoadData [token]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(->> (rp/req :fetch/project-by-token token)
|
||||
(rx/map :payload)
|
||||
(rx/map data-loaded))))
|
||||
|
@ -73,8 +73,8 @@
|
|||
;; --- Select Page
|
||||
|
||||
(defrecord SelectPage [index]
|
||||
rs/WatchEvent
|
||||
(-apply-watch [_ state stream]
|
||||
ptk/WatchEvent
|
||||
(watch [_ state stream]
|
||||
(let [token (get-in state [:route :params :token])]
|
||||
(rx/of (rt/navigate :view/viewer {:token token :id index})))))
|
||||
|
||||
|
@ -85,8 +85,8 @@
|
|||
;; --- Toggle Flag
|
||||
|
||||
(defrecord ToggleFlag [key]
|
||||
rs/UpdateEvent
|
||||
(-apply-update [_ state]
|
||||
ptk/UpdateEvent
|
||||
(update [_ state]
|
||||
(let [flags (:flags state #{})]
|
||||
(if (contains? flags key)
|
||||
(assoc state :flags (disj flags key))
|
||||
|
|
|
@ -7,17 +7,18 @@
|
|||
(ns uxbox.view.ui
|
||||
(:require [lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.dom :as dom]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.data.messages :as dmsg]
|
||||
[uxbox.main.ui.loader :refer (loader)]
|
||||
[uxbox.main.ui.lightbox :refer (lightbox)]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.main.data.messages :as dmsg]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.view.ui.notfound :refer (notfound-page)]
|
||||
[uxbox.view.ui.viewer :refer (viewer-page)]))
|
||||
[uxbox.view.ui.viewer :refer (viewer-page)]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.dom :as dom]))
|
||||
|
||||
|
||||
(def route-id-ref
|
||||
(-> (l/in [:route :id])
|
||||
|
@ -39,7 +40,7 @@
|
|||
(dmsg/error! (tr "errors.generic"))
|
||||
(js/console.error "Stack:" (.-stack error)))))
|
||||
|
||||
(rs/add-error-watcher :ui on-error)
|
||||
(set! st/*on-error* on-error)
|
||||
|
||||
;; --- Main App (Component)
|
||||
|
||||
|
|
|
@ -8,11 +8,11 @@
|
|||
(ns uxbox.view.ui.viewer
|
||||
(:require [lentes.core :as l]
|
||||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.router :as rt]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.view.data.viewer :as dv]
|
||||
[uxbox.view.ui.viewer.nav :refer (nav)]
|
||||
[uxbox.view.ui.viewer.canvas :refer (canvas)]
|
||||
|
@ -33,7 +33,7 @@
|
|||
(defn- viewer-page-will-mount
|
||||
[own]
|
||||
(letfn [(on-change [token]
|
||||
(rs/emit! (dv/initialize token)))]
|
||||
(st/emit! (dv/initialize token)))]
|
||||
(add-watch token-ref ::wkey #(on-change %4))
|
||||
(on-change @token-ref)
|
||||
own))
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
[rum.core :as rum]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.data :refer (parse-int)]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.ui.shapes :as uus]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.view.ui.viewer.shapes :as shapes]))
|
||||
|
|
|
@ -6,12 +6,12 @@
|
|||
|
||||
(ns uxbox.view.ui.viewer.interactions
|
||||
(:require [uxbox.util.dom :as dom]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.util.geom.matrix :as gmt]
|
||||
[uxbox.util.geom.point :as gpt]
|
||||
[uxbox.util.timers :as ts]
|
||||
[uxbox.main.geom :as geom]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.view.data.viewer :as dv]
|
||||
[vendor.snapsvg])
|
||||
;; Documentation about available events:
|
||||
|
@ -145,7 +145,7 @@
|
|||
|
||||
(defn- run-gotopage-interaction
|
||||
[{:keys [page]}]
|
||||
(rs/emit! (dv/select-page page)))
|
||||
(st/emit! (dv/select-page page)))
|
||||
|
||||
(defn- run-color-interaction
|
||||
[{:keys [element fill-color stroke-color direction easing delay duration]}]
|
||||
|
|
|
@ -7,14 +7,15 @@
|
|||
|
||||
(ns uxbox.view.ui.viewer.nav
|
||||
(:require [uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.view.data.viewer :as dv]))
|
||||
|
||||
(mx/defc nav
|
||||
[flags]
|
||||
(let [toggle-sitemap #(rs/emit! (dv/toggle-flag :sitemap))
|
||||
toggle-interactions #(rs/emit! (dv/toggle-flag :interactions))
|
||||
(let [toggle-sitemap #(st/emit! (dv/toggle-flag :sitemap))
|
||||
toggle-interactions #(st/emit! (dv/toggle-flag :interactions))
|
||||
sitemap? (contains? flags :sitemap)
|
||||
interactions? (contains? flags :interactions)]
|
||||
[:div.view-nav
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
(:require [goog.events :as events]
|
||||
[lentes.core :as l]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.main.state :as st]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.geom :as geom]
|
||||
[uxbox.main.ui.shapes.rect :refer (rect-shape)]
|
||||
[uxbox.main.ui.shapes.icon :refer (icon-shape)]
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
[uxbox.util.i18n :refer (tr)]
|
||||
[uxbox.util.mixins :as mx :include-macros true]
|
||||
[uxbox.util.data :refer (parse-int)]
|
||||
[uxbox.util.rstore :as rs]
|
||||
[uxbox.main.state :as st]
|
||||
[potok.core :as ptk]
|
||||
[uxbox.store :as st]
|
||||
[uxbox.main.ui.icons :as i]
|
||||
[uxbox.view.data.viewer :as dv]))
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
|||
(let [project-name (mx/react project-name-ref)
|
||||
pages (mx/react pages-ref)
|
||||
selected (mx/react selected-ref)
|
||||
on-click #(rs/emit! (dv/select-page %))]
|
||||
on-click #(st/emit! (dv/select-page %))]
|
||||
[:div.view-sitemap
|
||||
[:span.sitemap-title project-name]
|
||||
[:ul.sitemap-list
|
||||
|
|
Loading…
Add table
Reference in a new issue