0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-10 09:08:31 -05:00

Add the ability to edit page name from page element-options.

This commit is contained in:
Andrey Antukh 2017-01-06 16:25:21 +01:00
parent bfce5f8a00
commit d3e81dc810
No known key found for this signature in database
GPG key ID: 4DFEBCB8316A8B95
5 changed files with 115 additions and 52 deletions

View file

@ -12,6 +12,7 @@
[potok.core :as ptk] [potok.core :as ptk]
[uxbox.store :as st] [uxbox.store :as st]
[uxbox.main.repo :as rp] [uxbox.main.repo :as rp]
[uxbox.main.lenses :as ul]
[uxbox.util.rlocks :as rlocks] [uxbox.util.rlocks :as rlocks]
[uxbox.util.spec :as us] [uxbox.util.spec :as us]
[uxbox.util.router :as r] [uxbox.util.router :as r]
@ -22,9 +23,6 @@
;; --- Specs ;; --- Specs
(s/def ::id uuid?)
(s/def ::name string?)
(s/def ::project uuid?)
(s/def ::grid-x-axis number?) (s/def ::grid-x-axis number?)
(s/def ::grid-y-axis number?) (s/def ::grid-y-axis number?)
(s/def ::grid-color us/color?) (s/def ::grid-color us/color?)
@ -46,6 +44,26 @@
::background-opacity ::background-opacity
::layout])) ::layout]))
(s/def ::id uuid?)
(s/def ::name string?)
(s/def ::version integer?)
(s/def ::project uuid?)
(s/def ::user uuid?)
(s/def ::created-at dt/instant?)
(s/def ::modified-at dt/instant?)
(s/def ::shapes (s/coll-of uuid? :kind vector?))
(s/def ::page
(s/keys :req-un [::id
::name
::project
::version
::created-at
::modified-at
::user
::metadata
::shapes]))
;; --- Protocols ;; --- Protocols
(defprotocol IPageUpdate (defprotocol IPageUpdate
@ -264,7 +282,21 @@
[] []
(PersistPages.)) (PersistPages.))
;; --- Update Page Options ;; --- Update Page
(deftype UpdatePage [id data]
IPageUpdate
ptk/UpdateEvent
(update [_ state]
(update-in state [:pages id] merge (dissoc data :id :version))))
(defn update-page
[id data]
{:pre [(uuid? id)
(us/valid? ::page data)]}
(UpdatePage. id data))
;; --- Update Page Metadata
(deftype UpdateMetadata [id metadata] (deftype UpdateMetadata [id metadata]
IMetadataUpdate IMetadataUpdate
@ -277,6 +309,11 @@
{:pre [(uuid? id) (us/valid? ::metadata metadata)]} {:pre [(uuid? id) (us/valid? ::metadata metadata)]}
(UpdateMetadata. id metadata)) (UpdateMetadata. id metadata))
;; --- Update Order
;;
;; A specialized event for update order
;; attribute on the page metadata
(deftype UpdateOrder [id order] (deftype UpdateOrder [id order]
IMetadataUpdate IMetadataUpdate
ptk/UpdateEvent ptk/UpdateEvent
@ -285,48 +322,56 @@
(defn update-order (defn update-order
[id order] [id order]
{:pre [(uuid? id)]} {:pre [(uuid? id) (number? order)]}
(UpdateOrder. id order)) (UpdateOrder. id order))
;; --- Reorder Pages
;;
;; A post processing event that normalizes the
;; page order numbers after a user sorting
;; operation.
(deftype ReorderPages [] (deftype ReorderPages []
IMetadataUpdate IMetadataUpdate
ptk/UpdateEvent ptk/UpdateEvent
(update [this state] (update [this state]
(letfn [(resolve-pages [] (let [project (l/focus ul/selected-project state)
(let [project (get-in state [:workspace :project])] pages (->> (vals (:pages state))
(->> (vals (:pages state))
(filter #(= project (:project %))) (filter #(= project (:project %)))
(sort-by #(get-in % [:metadata :order]))))) (sort-by #(get-in % [:metadata :order]))
(ordered-pages [[state idx] page] (map :id)
[(assoc-in state [:pages (:id page) :metadata :order] (* 10 idx)) (inc idx)])] (map-indexed vector))]
(first (reduce ordered-pages [state, 1] (resolve-pages)))))) (reduce (fn [state [i page]]
(assoc-in state [:pages page :metadata :order] (* 10 i)))
state
pages))))
(defn reorder-pages (defn reorder-pages
[] []
(ReorderPages.)) (ReorderPages.))
;; --- Update Page ;; --- Persist Page Form
;;
(deftype UpdatePage [id name width height layout] ;; A specialized event for persist data
ptk/UpdateEvent ;; from the update page form.
(update [this state]
(-> state
(assoc-in [:pages id :name] name)
(assoc-in [:pages id :metadata :width] width)
(assoc-in [:pages id :metadata :height] height)
(assoc-in [:pages id :metadata :layout] layout)))
(deftype PersistPageUpdateForm [id name width height layout]
ptk/WatchEvent ptk/WatchEvent
(watch [_ state stream] (watch [_ state stream]
(rx/of (persist-metadata id)))) (let [page (-> (get-in state [:pages id])
(assoc-in [:name] name)
(assoc-in [:metadata :width] width)
(assoc-in [:metadata :height] height)
(assoc-in [:metadata :layout] layout))]
(rx/of (update-page id page)))))
(s/def ::update-page-event (s/def ::persist-page-update-form
(s/keys :req-un [::name ::width ::height ::layout])) (s/keys :req-un [::name ::width ::height ::layout]))
(defn update-page (defn persist-page-update-form
[id {:keys [name width height layout] :as data}] [id {:keys [name width height layout] :as data}]
{:pre [(uuid? id) (us/valid? ::update-page-event data)]} {:pre [(uuid? id) (us/valid? ::persist-page-update-form data)]}
(UpdatePage. id name width height layout)) (PersistPageUpdateForm. id name width height layout))
;; --- Delete Page (by id) ;; --- Delete Page (by id)

View file

@ -62,10 +62,12 @@
:name name) :name name)
state (if (nil? group) state (if (nil? group)
(-> state (-> state
(update-in [:pages page :shapes] #(into [] (cons id %))) (update-in [:pages page :shapes]
#(into [] (cons id %)))
(assoc-in [:shapes id] shape)) (assoc-in [:shapes id] shape))
(-> state (-> state
(update-in [:shapes group :items] #(into [] (cons id %))) (update-in [:shapes group :items]
#(into [] (cons id %)))
(assoc-in [:shapes id] shape)))] (assoc-in [:shapes id] shape)))]
(->> (map #(get-in state [:shapes %]) items) (->> (map #(get-in state [:shapes %]) items)
(reverse) (reverse)

View file

@ -9,6 +9,7 @@
"Page options menu entries." "Page options menu entries."
(:require [lentes.core :as l] (:require [lentes.core :as l]
[potok.core :as ptk] [potok.core :as ptk]
[cuerdas.core :as str]
[uxbox.store :as st] [uxbox.store :as st]
[uxbox.main.constants :as c] [uxbox.main.constants :as c]
[uxbox.main.data.pages :as udp] [uxbox.main.data.pages :as udp]
@ -27,20 +28,13 @@
[own menu] [own menu]
(let [{:keys [id metadata] :as page} (mx/react page-ref) (let [{:keys [id metadata] :as page} (mx/react page-ref)
metadata (merge c/page-metadata metadata)] metadata (merge c/page-metadata metadata)]
(letfn [(on-width-change [] (letfn [(on-size-change [attr]
(when-let [value (-> (mx/ref-node own "width") (when-let [value (-> (mx/ref-node own (name attr))
(dom/get-value) (dom/get-value)
(parse-int nil))] (parse-int nil))]
(->> (assoc metadata :width value) (st/emit! (->> (assoc metadata attr value)
(udp/update-metadata id) (udp/update-metadata id)))))
(st/emit!))))
(on-height-change []
(when-let [value (-> (mx/ref-node own "height")
(dom/get-value)
(parse-int nil))]
(->> (assoc metadata :height value)
(udp/update-metadata id)
(st/emit!))))
(on-color-change [] (on-color-change []
(when-let [value (-> (mx/ref-node own "color") (when-let [value (-> (mx/ref-node own "color")
(dom/get-value) (dom/get-value)
@ -48,31 +42,49 @@
(->> (assoc metadata :background value) (->> (assoc metadata :background value)
(udp/update-metadata id) (udp/update-metadata id)
(st/emit!)))) (st/emit!))))
(show-color-picker [event]
(let [x (.-clientX event) (on-name-change []
y (.-clientY event) (when-let [value (-> (mx/ref-node own "name")
opts {:x x :y y (dom/get-value)
:default "#ffffff" (str/trim))]
:transparent? true (st/emit! (->> (assoc page :name value)
:attr :background}] (udp/update-page id)))))
(udl/open! :workspace/page-colorpicker opts)))]
(show-color-picker [event]
(let [x (.-clientX event)
y (.-clientY event)
opts {:x x :y y
:default "#ffffff"
:transparent? true
:attr :background}]
(udl/open! :workspace/page-colorpicker opts)))]
[:div.element-set [:div.element-set
[:div.element-set-title (:name menu)] [:div.element-set-title (:name menu)]
[:div.element-set-content [:div.element-set-content
[:span "Name"]
[:div.row-flex
[:div.input-element
[:input.input-text
{:type "text"
:ref "name"
:on-change on-name-change
:value (:name page)
:placeholder "page name"}]]]
[:span "Size"] [:span "Size"]
[:div.row-flex [:div.row-flex
[:div.input-element.pixels [:div.input-element.pixels
[:input.input-text [:input.input-text
{:type "number" {:type "number"
:ref "width" :ref "width"
:on-change on-width-change :on-change #(on-size-change :width)
:value (:width metadata) :value (:width metadata)
:placeholder "width"}]] :placeholder "width"}]]
[:div.input-element.pixels [:div.input-element.pixels
[:input.input-text [:input.input-text
{:type "number" {:type "number"
:ref "height" :ref "height"
:on-change on-height-change :on-change #(on-size-change :height)
:value (:height metadata) :value (:height metadata)
:placeholder "height"}]]] :placeholder "height"}]]]
[:span "Background color"] [:span "Background color"]

View file

@ -82,7 +82,7 @@
(udl/close!) (udl/close!)
(if (nil? id) (if (nil? id)
(st/emit! (udp/create-page data)) (st/emit! (udp/create-page data))
(st/emit! (udp/update-page id data))))] (st/emit! (udp/persist-page-update-form id data))))]
[:form [:form
[:input#project-name.input-text [:input#project-name.input-text
{:placeholder "Page name" {:placeholder "Page name"

View file

@ -47,6 +47,10 @@
[v] [v]
(instance? DateTime v)) (instance? DateTime v))
(defn instant?
[v]
(instance? DateTime v))
(defn parse (defn parse
"Parse a string representation of datetime "Parse a string representation of datetime
with an optional `format` parameter." with an optional `format` parameter."