mirror of
https://github.com/penpot/penpot.git
synced 2025-01-21 14:12:36 -05:00
WIP: add basic data persistence.
This commit is contained in:
parent
6b6aba7358
commit
ebec1eb268
9 changed files with 73 additions and 47 deletions
|
@ -1,29 +1,20 @@
|
||||||
(ns uxbox.core
|
(ns uxbox.core
|
||||||
(:require [uxbox.state]
|
(:require [uxbox.ui :as ui]
|
||||||
[uxbox.ui :as ui]
|
|
||||||
[uxbox.router]
|
[uxbox.router]
|
||||||
|
[uxbox.state :as s]
|
||||||
[uxbox.rstore :as rs]
|
[uxbox.rstore :as rs]
|
||||||
[uxbox.data.projects :as dp]
|
[uxbox.data.projects :as dp]
|
||||||
[goog.dom :as dom]))
|
[uxbox.data.load :as dl]
|
||||||
|
[goog.dom :as dom]
|
||||||
|
[beicon.core :as rx]))
|
||||||
|
|
||||||
|
|
||||||
(enable-console-print!)
|
(enable-console-print!)
|
||||||
|
|
||||||
(let [dom (dom/getElement "app")]
|
(let [dom (dom/getElement "app")]
|
||||||
(ui/mount! dom))
|
(ui/mount! dom))
|
||||||
|
|
||||||
(defonce +setup-stuff+
|
(defonce +setup+
|
||||||
(do
|
(do
|
||||||
(rs/emit! (dp/create-project {:name "foo"
|
(rs/emit! (dl/load-data))
|
||||||
:width 600
|
(rx/on-value s/stream #(dl/persist-state %))))
|
||||||
:height 600
|
|
||||||
:layout :mobile}))
|
|
||||||
(rs/emit! (dp/create-project {:name "bar"
|
|
||||||
:width 600
|
|
||||||
:height 600
|
|
||||||
:layout :mobile}))
|
|
||||||
(rs/emit! (dp/create-project {:name "baz"
|
|
||||||
:width 600
|
|
||||||
:height 600
|
|
||||||
:layout :mobile}))
|
|
||||||
nil))
|
|
||||||
|
|
||||||
|
|
27
frontend/uxbox/data/load.cljs
Normal file
27
frontend/uxbox/data/load.cljs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
(ns uxbox.data.load
|
||||||
|
(:require [hodgepodge.core :refer [local-storage]]
|
||||||
|
[uxbox.rstore :as rs]
|
||||||
|
[uxbox.router :as r]
|
||||||
|
[uxbox.state :as st]
|
||||||
|
[uxbox.schema :as sc]
|
||||||
|
[uxbox.data.projects :as dp]
|
||||||
|
[bouncer.validators :as v]))
|
||||||
|
|
||||||
|
(defn load-data
|
||||||
|
"Load data from local storage."
|
||||||
|
[]
|
||||||
|
(reify
|
||||||
|
rs/UpdateEvent
|
||||||
|
(-apply-update [_ state]
|
||||||
|
(if-let [data (get local-storage :data nil)]
|
||||||
|
(as-> state $
|
||||||
|
(reduce dp/assoc-project $ (:projects data))
|
||||||
|
(reduce dp/assoc-page $ (:pages data)))
|
||||||
|
state))))
|
||||||
|
|
||||||
|
(defn persist-state
|
||||||
|
[state]
|
||||||
|
(let [pages (into #{} (vals (:pages-by-id state)))
|
||||||
|
projects (into #{} (vals (:projects-by-id state)))]
|
||||||
|
(assoc! local-storage :data {:pages pages
|
||||||
|
:projects projects})))
|
|
@ -21,6 +21,33 @@
|
||||||
:height [v/required v/integer]
|
:height [v/required v/integer]
|
||||||
:project [v/required sc/uuid]})
|
:project [v/required sc/uuid]})
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; Helpers
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
(defn assoc-project
|
||||||
|
"A reduce function for assoc the project
|
||||||
|
to the state map."
|
||||||
|
[state proj]
|
||||||
|
(let [uuid (:id proj)]
|
||||||
|
(update-in state [:projects-by-id] assoc uuid proj)))
|
||||||
|
|
||||||
|
(defn assoc-page
|
||||||
|
"A reduce function for assoc the page
|
||||||
|
to the state map."
|
||||||
|
[state page]
|
||||||
|
(let [uuid (:id page)]
|
||||||
|
(update-in state [:pages-by-id] assoc uuid page)))
|
||||||
|
|
||||||
|
;; (defn project-pages
|
||||||
|
;; "Get a ordered list of pages that
|
||||||
|
;; belongs to a specified project."
|
||||||
|
;; [state projectid]
|
||||||
|
;; (let [xf (comp
|
||||||
|
;; (filter #(= projectid (:project %)))
|
||||||
|
;; (map #(get-in state [:pages-by-id %])))]
|
||||||
|
;; (into [] xf (:pages state))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Events
|
;; Events
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -31,16 +58,12 @@
|
||||||
(reify
|
(reify
|
||||||
rs/UpdateEvent
|
rs/UpdateEvent
|
||||||
(-apply-update [_ state]
|
(-apply-update [_ state]
|
||||||
(let [uuid (random-uuid)
|
(let [page {:id (random-uuid)
|
||||||
page {:id uuid
|
|
||||||
:project project
|
:project project
|
||||||
:name name
|
:name name
|
||||||
:width width
|
:width width
|
||||||
:height height}]
|
:height height}]
|
||||||
(-> state
|
(assoc-page state page)))
|
||||||
(update-in [:pages] conj uuid)
|
|
||||||
(update-in [:projects-by-id project :pages] conj uuid)
|
|
||||||
(update-in [:pages-by-id] assoc uuid page))))
|
|
||||||
|
|
||||||
IPrintWithWriter
|
IPrintWithWriter
|
||||||
(-pr-writer [mv writer _]
|
(-pr-writer [mv writer _]
|
||||||
|
@ -57,10 +80,8 @@
|
||||||
:name name
|
:name name
|
||||||
:width width
|
:width width
|
||||||
:height height
|
:height height
|
||||||
:pages []}]
|
:layout layout}]
|
||||||
(-> state
|
(assoc-project state proj)))
|
||||||
(update-in [:projects] conj uuid)
|
|
||||||
(update-in [:projects-by-id] assoc uuid proj))))
|
|
||||||
|
|
||||||
rs/EffectEvent
|
rs/EffectEvent
|
||||||
(-apply-effect [_ state]
|
(-apply-effect [_ state]
|
||||||
|
@ -82,7 +103,7 @@
|
||||||
|
|
||||||
IPrintWithWriter
|
IPrintWithWriter
|
||||||
(-pr-writer [mv writer _]
|
(-pr-writer [mv writer _]
|
||||||
(-write writer "#<event:u.s.p/go-to-project>"))))
|
(-write writer "#<event:u.s.p/initialize-workspace>"))))
|
||||||
|
|
||||||
(defn go-to-project
|
(defn go-to-project
|
||||||
"A shortcut event that redirects the user to the
|
"A shortcut event that redirects the user to the
|
||||||
|
|
|
@ -43,7 +43,6 @@
|
||||||
(let [loc (merge {:handler name}
|
(let [loc (merge {:handler name}
|
||||||
(when params
|
(when params
|
||||||
{:route-params params}))]
|
{:route-params params}))]
|
||||||
(println "navigate" loc)
|
|
||||||
(bidi.router/set-location! +router+ loc))))))
|
(bidi.router/set-location! +router+ loc))))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -70,7 +69,7 @@
|
||||||
|
|
||||||
(defonce +router+
|
(defonce +router+
|
||||||
(bidi.router/start-router! routes {:on-navigate on-navigate
|
(bidi.router/start-router! routes {:on-navigate on-navigate
|
||||||
:default-location {:handler :auth/login}}))
|
:default-location {:handler :main/dashboard}}))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; Public Api
|
;; Public Api
|
||||||
|
|
|
@ -10,13 +10,7 @@
|
||||||
(rs/init {:user {:fullname "Cirilla"
|
(rs/init {:user {:fullname "Cirilla"
|
||||||
:avatar "http://lorempixel.com/50/50/"}
|
:avatar "http://lorempixel.com/50/50/"}
|
||||||
:workspace nil
|
:workspace nil
|
||||||
:projects []
|
|
||||||
:pages []
|
|
||||||
:projects-by-id {}
|
:projects-by-id {}
|
||||||
:pages-by-id {}}))
|
:pages-by-id {}}))
|
||||||
|
|
||||||
(defonce +setup-stuff+
|
(rx/to-atom stream state)
|
||||||
(do
|
|
||||||
(rx/to-atom stream state)
|
|
||||||
(rx/on-value stream #(println "state:" %))))
|
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
(defn app-render
|
(defn app-render
|
||||||
[own]
|
[own]
|
||||||
(let [{:keys [location location-params] :as state} (rum/react state)]
|
(let [{:keys [location location-params] :as state} (rum/react state)]
|
||||||
(println 1111 location location-params)
|
|
||||||
(html
|
(html
|
||||||
[:section
|
[:section
|
||||||
(ui.lb/lightbox)
|
(ui.lb/lightbox)
|
||||||
|
|
|
@ -197,7 +197,6 @@
|
||||||
|
|
||||||
(defn project-render
|
(defn project-render
|
||||||
[own project]
|
[own project]
|
||||||
(println "project-render" project)
|
|
||||||
(let [on-click #(rs/emit! (dp/go-to-project (:id project)))]
|
(let [on-click #(rs/emit! (dp/go-to-project (:id project)))]
|
||||||
(html
|
(html
|
||||||
[:div.grid-item.project-th {:on-click on-click
|
[:div.grid-item.project-th {:on-click on-click
|
||||||
|
@ -237,7 +236,7 @@
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(def ^:static grid-state
|
(def ^:static grid-state
|
||||||
(as-> (l/select-keys [:projects :projects-by-id]) $
|
(as-> (l/select-keys [:projects-by-id]) $
|
||||||
(l/focus-atom $ s/state)))
|
(l/focus-atom $ s/state)))
|
||||||
|
|
||||||
(defn grid-render
|
(defn grid-render
|
||||||
|
@ -253,9 +252,8 @@
|
||||||
[:div.dashboard-grid-content
|
[:div.dashboard-grid-content
|
||||||
[:div.grid-item.add-project {:on-click on-click}
|
[:div.grid-item.add-project {:on-click on-click}
|
||||||
[:span "+ New project"]]
|
[:span "+ New project"]]
|
||||||
(for [pid (:projects state)]
|
(for [item (vals (:projects-by-id state))]
|
||||||
(let [item (get-in state [:projects-by-id pid])]
|
(rum/with-key (project-item item) (:id item)))]]]))))
|
||||||
(rum/with-key (project-item item) (str pid))))]]]))))
|
|
||||||
|
|
||||||
(def grid
|
(def grid
|
||||||
(util/component
|
(util/component
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
(defn set!
|
(defn set!
|
||||||
[kind]
|
[kind]
|
||||||
(println "lightbox$set!" kind)
|
|
||||||
(reset! +current+ kind))
|
(reset! +current+ kind))
|
||||||
|
|
||||||
(defn close!
|
(defn close!
|
||||||
|
|
|
@ -89,8 +89,6 @@
|
||||||
|
|
||||||
(defn workspace-render
|
(defn workspace-render
|
||||||
[own projectid]
|
[own projectid]
|
||||||
(println "workspace-render" @s/state)
|
|
||||||
(println 22222 @page-state)
|
|
||||||
(html
|
(html
|
||||||
[:div "hello world"
|
[:div "hello world"
|
||||||
;; (header conn page ws/grid? project-bar-visible?)
|
;; (header conn page ws/grid? project-bar-visible?)
|
||||||
|
|
Loading…
Add table
Reference in a new issue