diff --git a/common/src/app/common/pages/changes_builder.cljc b/common/src/app/common/pages/changes_builder.cljc index 8a0e5430b9..1d6d06506d 100644 --- a/common/src/app/common/pages/changes_builder.cljc +++ b/common/src/app/common/pages/changes_builder.cljc @@ -31,6 +31,57 @@ (defn with-objects [changes objects] (vary-meta changes assoc ::objects objects)) +;; Page changes + +(defn add-empty-page + [chdata id name] + (-> chdata + (update :redo-changes conj {:type :add-page :id id :name name}) + (update :undo-changes conj {:type :del-page :id id}))) + +(defn add-page + [chdata id page] + (-> chdata + (update :redo-changes conj {:type :add-page :id id :page page}) + (update :undo-changes conj {:type :del-page :id id}))) + +(defn mod-page + [chdata page new-name] + (-> chdata + (update :redo-changes conj {:type :mod-page :id (:id page) :name new-name}) + (update :undo-changes conj {:type :mod-page :id (:id page) :name (:name page)}))) + +(defn del-page + [chdata page] + (-> chdata + (update :redo-changes conj {:type :del-page :id (:id page)}) + (update :undo-changes conj {:type :add-page :id (:id page) :page page}))) + +(defn move-page + [chdata index prev-index] + (let [page-id (::page-id (meta chdata))] + (-> chdata + (update :redo-changes conj {:type :mov-page :id page-id :index index}) + (update :undo-changes conj {:type :mov-page :id page-id :index prev-index})))) + +(defn set-page-option + [chdata option-key option-val] + (let [page-id (::page-id (meta chdata)) + page (::page (meta chdata)) + old-val (get-in page [:options option-key])] + + (-> chdata + (update :redo-changes conj {:type :set-option + :page-id page-id + :option option-key + :value option-val}) + (update :undo-changes conj {:type :set-option + :page-id page-id + :option option-key + :value old-val})))) + +;; Shape changes + (defn add-obj ([changes obj] (add-obj changes obj nil)) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 7ef8e680e3..6d207ba5dc 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -320,14 +320,10 @@ unames (dwc/retrieve-used-names pages) name (dwc/generate-unique-name unames "Page-1") - rchange {:type :add-page - :id id - :name name} - uchange {:type :del-page - :id id}] - (rx/of (dch/commit-changes {:redo-changes [rchange] - :undo-changes [uchange] - :origin it}))))))) + changes (-> (pcb/empty-changes it) + (pcb/add-empty-page id name))] + + (rx/of (dch/commit-changes changes))))))) (defn duplicate-page [page-id] @@ -342,13 +338,10 @@ page (-> page (assoc :name name :id id)) - rchange {:type :add-page - :page page} - uchange {:type :del-page - :id id}] - (rx/of (dch/commit-changes {:redo-changes [rchange] - :undo-changes [uchange] - :origin it})))))) + changes (-> (pcb/empty-changes it) + (pcb/add-page id page))] + + (rx/of (dch/commit-changes changes)))))) (s/def ::rename-page (s/keys :req-un [::id ::name])) @@ -360,33 +353,26 @@ (ptk/reify ::rename-page ptk/WatchEvent (watch [it state _] - (let [page (get-in state [:workspace-data :pages-index id]) - rchg {:type :mod-page - :id id - :name name} - uchg {:type :mod-page - :id id - :name (:name page)}] - (rx/of (dch/commit-changes {:redo-changes [rchg] - :undo-changes [uchg] - :origin it})))))) + (let [page (get-in state [:workspace-data :pages-index id]) + changes (-> (pcb/empty-changes it) + (pcb/mod-page page name))] + + (rx/of (dch/commit-changes changes)))))) (declare purge-page) (declare go-to-file) -;; TODO: for some reason, the page-id here in some circumstances is `nil` (defn delete-page [id] (ptk/reify ::delete-page ptk/WatchEvent (watch [it state _] (let [page (get-in state [:workspace-data :pages-index id]) - rchg {:type :del-page :id id} - uchg {:type :add-page :page page}] - (rx/of (dch/commit-changes {:redo-changes [rchg] - :undo-changes [uchg] - :origin it}) + changes (-> (pcb/empty-changes it) + (pcb/del-page page))] + + (rx/of (dch/commit-changes changes) (when (= id (:current-page-id state)) go-to-file)))))) @@ -1962,19 +1948,12 @@ (ptk/reify ::change-canvas-color ptk/WatchEvent (watch [it state _] - (let [page-id (get state :current-page-id) - options (wsh/lookup-page-options state page-id) - previous-color (:background options)] - (rx/of (dch/commit-changes - {:redo-changes [{:type :set-option - :page-id page-id - :option :background - :value (:color color)}] - :undo-changes [{:type :set-option - :page-id page-id - :option :background - :value previous-color}] - :origin it})))))) + (let [page (wsh/lookup-page state) + changes (-> (pcb/empty-changes it) + (pcb/with-page page) + (pcb/set-page-option :background (:color color)))] + + (rx/of (dch/commit-changes changes)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Artboard