Split projects and pages events in different namespaces.

This commit is contained in:
Andrey Antukh 2016-03-19 13:49:47 +02:00
parent 71d8c5a12b
commit 91a06f4d7e
4 changed files with 177 additions and 143 deletions

139
src/uxbox/data/pages.cljs Normal file
View file

@ -0,0 +1,139 @@
;; 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.data.pages
(:require [cuerdas.core :as str]
[promesa.core :as p]
[beicon.core :as rx]
[uxbox.rstore :as rs]
[uxbox.router :as r]
[uxbox.repo :as rp]
[uxbox.locales :refer (tr)]
[uxbox.schema :as sc]
[uxbox.state :as st]
[uxbox.state.project :as stpr]
[uxbox.ui.messages :as uum]
[uxbox.util.datetime :as dt]
[uxbox.util.data :refer (without-keys)]))
;; (def ^:static +update-page-metadata-schema+
;; {:name [sc/required sc/string]
;; :width [sc/required sc/integer]
;; :height [sc/required sc/integer]
;; :layout [sc/required sc/string]})
;; --- Pages Fetched
(defrecord PagesFetched [pages]
rs/UpdateEvent
(-apply-update [_ state]
(reduce stpr/assoc-page state pages)))
(defn pages-fetched?
[v]
(instance? PagesFetched v))
;; --- Fetch Pages (by project id)
(defrecord FetchPages [projectid]
rs/WatchEvent
(-apply-watch [_ state s]
(letfn [(on-loaded [{pages :payload}]
(->PagesFetched pages))
(on-error [err]
(js/console.error err)
(rx/empty))]
(->> (rp/do :fetch/pages-by-project {:project projectid})
(rx/map on-loaded)
(rx/catch on-error)))))
(defn fetch-pages
[projectid]
(FetchPages. projectid))
;; --- Create Page
(defrecord CreatePage [name width height project layout]
rs/WatchEvent
(-apply-watch [this state s]
(letfn [(on-created [{page :payload}]
#(stpr/assoc-page % page))
(on-failed [page]
(uum/error (tr "errors.auth"))
(rx/empty))]
(let [params (-> (into {} this)
(assoc :data {}))]
(->> (rp/do :create/page params)
(rx/map on-created)
(rx/catch on-failed))))))
(def ^:static +create-page-schema+
{:name [sc/required sc/string]
:layout [sc/required sc/string]
:width [sc/required sc/integer]
:height [sc/required sc/integer]
:data [sc/required]
:project [sc/required sc/uuid]})
(defn create-page
[data]
(sc/validate! +create-page-schema+ data)
(map->CreatePage data))
;; --- Update Page
(defrecord UpdatePage [id name width height layout]
rs/UpdateEvent
(-apply-update [_ state]
(letfn [(updater [page]
(merge page
(when width {:width width})
(when height {:height height})
(when name {:name name})))]
(update-in state [:pages-by-id id] updater)))
rs/WatchEvent
(-apply-watch [this state s]
(letfn [(on-success [{page :payload}]
#(assoc-in % [:pages-by-id id :version] (:version page)))
(on-failure [e]
(uum/error (tr "errors.page-update"))
(rx/empty))]
(->> (rp/do :update/page (into {} this))
(rx/map on-success)
(rx/catch on-failure)))))
(def ^:static +update-page-schema+
{:name [sc/required sc/string]
:width [sc/required sc/integer]
:height [sc/required sc/integer]
:data [sc/required]
:layout [sc/required sc/string]})
(defn update-page
[data]
(sc/validate! +update-page-schema+ data)
(map->UpdatePage data))
;; --- Delete Page (by id)
(defrecord DeletePage [id]
rs/WatchEvent
(-apply-watch [_ state s]
(letfn [(on-success [_]
(rs/swap #(stpr/dissoc-page % id)))
(on-failure [e]
(println "ERROR" e)
(uum/error (tr "errors.delete-page"))
(rx/empty))]
(->> (rp/do :delete/page id)
(rx/map on-success)
(rx/catch on-failure)))))
(defn delete-page
[id]
(DeletePage. id))

View file

@ -7,61 +7,25 @@
(ns uxbox.data.projects (ns uxbox.data.projects
(:require [cuerdas.core :as str] (:require [cuerdas.core :as str]
[promesa.core :as p]
[beicon.core :as rx] [beicon.core :as rx]
[uxbox.rstore :as rs] [uxbox.rstore :as rs]
[uxbox.router :as r] [uxbox.router :as r]
[uxbox.repo :as rp] [uxbox.repo :as rp]
[uxbox.locales :refer (tr)] [uxbox.locales :refer (tr)]
[uxbox.schema :as sc] [uxbox.schema :as sc]
[uxbox.state :as st]
[uxbox.state.project :as stpr] [uxbox.state.project :as stpr]
[uxbox.ui.messages :as uum] [uxbox.data.pages :as udp]
[uxbox.util.datetime :as dt] [uxbox.ui.messages :as uum]))
[uxbox.util.data :refer (without-keys)]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Schemas
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; FIXME use only one ns for validators
(def ^:static +project-schema+
{:name [sc/required sc/string]
:width [sc/required sc/integer]
:height [sc/required sc/integer]
:layout [sc/required sc/string]})
(def ^:static +create-page-schema+
{:name [sc/required sc/string]
:layout [sc/required sc/string]
:width [sc/required sc/integer]
:height [sc/required sc/integer]
:data [sc/required]
:project [sc/required sc/uuid]})
(def ^:static +update-page-schema+
{:name [sc/required sc/string]
:width [sc/required sc/integer]
:height [sc/required sc/integer]
:data [sc/required]
:layout [sc/required sc/string]})
(def ^:static +update-page-metadata-schema+
{:name [sc/required sc/string]
:width [sc/required sc/integer]
:height [sc/required sc/integer]
:layout [sc/required sc/string]})
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Helpers ;; Helpers
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn sort-projects-by (defn sort-projects-by
[ordering projs] [ordering projs]
(case ordering (case ordering
:name (sort-by :name projs) :name (sort-by :name projs)
:created (reverse (sort-by :created projs)) :created (reverse (sort-by :created-at projs))
projs)) projs))
(defn contains-term? (defn contains-term?
@ -74,18 +38,22 @@
projs projs
(filter #(contains-term? (:name %) term) projs))) (filter #(contains-term? (:name %) term) projs)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Events ;; Events
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defrecord LoadProjects [projects] ;; --- Projects Fetched
(defrecord ProjectsFetched [projects]
rs/UpdateEvent rs/UpdateEvent
(-apply-update [_ state] (-apply-update [_ state]
(reduce stpr/assoc-project state projects))) (reduce stpr/assoc-project state projects)))
(defn load-projects (defn projects-fetched
[projects] [projects]
(LoadProjects. projects)) (ProjectsFetched. projects))
;; --- Fetch Projects
(defrecord FetchProjects [] (defrecord FetchProjects []
rs/WatchEvent rs/WatchEvent
@ -103,113 +71,36 @@
[] []
(FetchProjects.)) (FetchProjects.))
(defrecord LoadPages [pages] ;; --- Create Project
rs/UpdateEvent
(-apply-update [_ state]
(reduce stpr/assoc-page state pages)))
(defn load-pages
[pages]
(LoadPages. pages))
(defrecord FetchPages [projectid]
rs/WatchEvent
(-apply-watch [_ state s]
(letfn [(on-loaded [{pages :payload}]
(load-pages pages))
(on-error [err]
(js/console.error err)
(rx/empty))]
(->> (rp/do :fetch/pages-by-project {:project projectid})
(rx/map on-loaded)
(rx/catch on-error)))))
(defn fetch-pages
[projectid]
(FetchPages. projectid))
(defrecord CreatePage [name width height project layout]
rs/WatchEvent
(-apply-watch [this state s]
(letfn [(on-created [{page :payload}]
#(stpr/assoc-page % page))
(on-failed [page]
(uum/error (tr "errors.auth"))
(rx/empty))]
(let [params (-> (into {} this)
(assoc :data {}))]
(->> (rp/do :create/page params)
(rx/map on-created)
(rx/catch on-failed))))))
(defn create-page
[data]
(sc/validate! +create-page-schema+ data)
(map->CreatePage data))
(defrecord UpdatePage [id name width height layout]
rs/UpdateEvent
(-apply-update [_ state]
(letfn [(updater [page]
(merge page
(when width {:width width})
(when height {:height height})
(when name {:name name})))]
(update-in state [:pages-by-id id] updater)))
rs/WatchEvent
(-apply-watch [this state s]
(letfn [(on-success [{page :payload}]
#(assoc-in % [:pages-by-id id :version] (:version page)))
(on-failure [e]
(uum/error (tr "errors.page-update"))
(rx/empty))]
(->> (rp/do :update/page (into {} this))
(rx/map on-success)
(rx/catch on-failure)))))
(defn update-page
[data]
(sc/validate! +update-page-schema+ data)
(map->UpdatePage data))
(defrecord DeletePage [id]
rs/WatchEvent
(-apply-watch [_ state s]
(letfn [(on-success [_]
(rs/swap #(stpr/dissoc-page % id)))
(on-failure [e]
(println "ERROR" e)
(uum/error (tr "errors.delete-page"))
(rx/empty))]
(->> (rp/do :delete/page id)
(rx/map on-success)
(rx/catch on-failure)))))
(defn delete-page
[id]
(DeletePage. id))
(defrecord CreateProject [name width height layout] (defrecord CreateProject [name width height layout]
rs/WatchEvent rs/WatchEvent
(-apply-watch [this state s] (-apply-watch [this state s]
(letfn [(on-success [project] (letfn [(on-success [project]
(rx/of (rs/swap #(stpr/assoc-project % project)) (rx/of (rs/swap #(stpr/assoc-project % project))
(create-page (assoc (into {} this) (udp/create-page (assoc (into {} this)
:project (:id project) :project (:id project)
:name "Page 1" :name "Page 1"
:data [])))) :data nil))))
(on-failure [err] (on-failure [err]
(uum/error (tr "errors.create-project")))] (uum/error (tr "errors.create-project")))]
(->> (rp/do :create/project {:name name}) (->> (rp/do :create/project {:name name})
(rx/mapcat on-success) (rx/mapcat on-success)
(rx/catch on-failure))))) (rx/catch on-failure)))))
(def ^:static +project-schema+
{:name [sc/required sc/string]
:width [sc/required sc/integer]
:height [sc/required sc/integer]
:layout [sc/required sc/string]})
(defn create-project (defn create-project
[{:keys [name width height layout] :as data}] [{:keys [name width height layout] :as data}]
(sc/validate! +project-schema+ data) (sc/validate! +project-schema+ data)
(map->CreateProject data)) (map->CreateProject data))
;; --- Delete Project (by id)
(defrecord DeleteProject [id] (defrecord DeleteProject [id]
rs/WatchEvent rs/WatchEvent
(-apply-watch [_ state s] (-apply-watch [_ state s]
@ -227,6 +118,8 @@
(DeleteProject. (:id id)) (DeleteProject. (:id id))
(DeleteProject. id))) (DeleteProject. id)))
;; --- Go To & Go To Page
(defrecord GoTo [projectid] (defrecord GoTo [projectid]
rs/WatchEvent rs/WatchEvent
(-apply-watch [_ state s] (-apply-watch [_ state s]
@ -236,8 +129,8 @@
:page-uuid pageid}] :page-uuid pageid}]
(r/navigate :workspace/page params)))] (r/navigate :workspace/page params)))]
(rx/merge (rx/merge
(rx/of (fetch-pages projectid)) (rx/of (udp/fetch-pages projectid))
(->> (rx/filter #(instance? LoadPages %) s) (->> (rx/filter udp/pages-fetched? s)
(rx/take 1) (rx/take 1)
(rx/map :pages) (rx/map :pages)
(rx/map navigate)))))) (rx/map navigate))))))

View file

@ -7,6 +7,7 @@
[uxbox.state :as st] [uxbox.state :as st]
[uxbox.data.workspace :as dw] [uxbox.data.workspace :as dw]
[uxbox.data.projects :as dp] [uxbox.data.projects :as dp]
[uxbox.data.pages :as udp]
[uxbox.util.geom.point :as gpt] [uxbox.util.geom.point :as gpt]
[uxbox.util.data :refer (classnames)] [uxbox.util.data :refer (classnames)]
[uxbox.ui.core :as uuc] [uxbox.ui.core :as uuc]
@ -70,7 +71,7 @@
(let [[projectid pageid] (:rum/props own)] (let [[projectid pageid] (:rum/props own)]
(rs/emit! (dw/initialize projectid pageid) (rs/emit! (dw/initialize projectid pageid)
(dp/fetch-projects) (dp/fetch-projects)
(dp/fetch-pages projectid)) (udp/fetch-pages projectid))
own)) own))
(defn- workspace-did-mount (defn- workspace-did-mount

View file

@ -17,6 +17,7 @@
[uxbox.shapes :as shapes] [uxbox.shapes :as shapes]
[uxbox.library :as library] [uxbox.library :as library]
[uxbox.data.projects :as dp] [uxbox.data.projects :as dp]
[uxbox.data.pages :as udp]
[uxbox.data.workspace :as dw] [uxbox.data.workspace :as dw]
[uxbox.ui.dashboard.projects :refer (+layouts+)] [uxbox.ui.dashboard.projects :refer (+layouts+)]
[uxbox.ui.workspace.base :as wb] [uxbox.ui.workspace.base :as wb]
@ -38,7 +39,7 @@
delete (fn [e] delete (fn [e]
(dom/prevent-default e) (dom/prevent-default e)
(dom/stop-propagation e) (dom/stop-propagation e)
(rs/emit! (dp/delete-page (:id page)) (rs/emit! (udp/delete-page (:id page))
(dp/go-to (:project page))))] (dp/go-to (:project page))))]
(html (html
[:li {:class (when active? "selected") [:li {:class (when active? "selected")
@ -112,7 +113,7 @@
(defn- page-form-lightbox-render (defn- page-form-lightbox-render
[own local page] [own local page]
(let [edition? (:id page) (let [edition? (:id page)
page (merge page @local {:data []}) page (merge page @local {:data nil})
valid? (and (not (str/empty? (str/trim (:name page "")))) valid? (and (not (str/empty? (str/trim (:name page ""))))
(pos? (:width page)) (pos? (:width page))
(pos? (:height page)))] (pos? (:height page)))]
@ -134,8 +135,8 @@
(dom/prevent-default e) (dom/prevent-default e)
(lightbox/close!) (lightbox/close!)
(if edition? (if edition?
(rs/emit! (dp/update-page page)) (rs/emit! (udp/update-page page))
(rs/emit! (dp/create-page page))))] (rs/emit! (udp/create-page page))))]
(html (html
[:div.lightbox-body [:div.lightbox-body
(if edition? (if edition?