♻️ Move generate-xx methods to logic module

This commit is contained in:
Andrés Moya 2024-05-06 16:45:43 +02:00
parent 7280dfd3f7
commit 0b4fbc184d
15 changed files with 769 additions and 756 deletions

View file

@ -12,7 +12,6 @@
[app.common.files.changes :as cp] [app.common.files.changes :as cp]
[app.common.files.changes-builder :as fcb] [app.common.files.changes-builder :as fcb]
[app.common.files.helpers :as cfh] [app.common.files.helpers :as cfh]
[app.common.files.libraries-helpers :as cflh]
[app.common.files.migrations :as fmg] [app.common.files.migrations :as fmg]
[app.common.files.shapes-helpers :as cfsh] [app.common.files.shapes-helpers :as cfsh]
[app.common.files.validate :as cfv] [app.common.files.validate :as cfv]
@ -23,6 +22,7 @@
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.common.geom.shapes.path :as gshp] [app.common.geom.shapes.path :as gshp]
[app.common.logging :as l] [app.common.logging :as l]
[app.common.logic.libraries :as cll]
[app.common.math :as mth] [app.common.math :as mth]
[app.common.schema :as sm] [app.common.schema :as sm]
[app.common.svg :as csvg] [app.common.svg :as csvg]
@ -1451,14 +1451,14 @@
(cons shape children)) (cons shape children))
[_ _ changes] [_ _ changes]
(cflh/generate-add-component changes (cll/generate-add-component changes
[shape] [shape]
(:objects page) (:objects page)
(:id page) (:id page)
file-id file-id
true true
nil nil
cfsh/prepare-create-artboard-from-selection)] cfsh/prepare-create-artboard-from-selection)]
(shape-cb shape) (shape-cb shape)
(:redo-changes changes))) (:redo-changes changes)))

View file

@ -4,7 +4,7 @@
;; ;;
;; Copyright (c) KALEIDOS INC ;; Copyright (c) KALEIDOS INC
(ns app.common.files.libraries-helpers (ns app.common.logic.libraries
(:require (:require
[app.common.data :as d] [app.common.data :as d]
[app.common.data.macros :as dm] [app.common.data.macros :as dm]
@ -14,6 +14,7 @@
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.common.geom.shapes.grid-layout :as gslg] [app.common.geom.shapes.grid-layout :as gslg]
[app.common.logging :as log] [app.common.logging :as log]
[app.common.logic.shapes :as cls]
[app.common.spec :as us] [app.common.spec :as us]
[app.common.text :as txt] [app.common.text :as txt]
[app.common.types.color :as ctc] [app.common.types.color :as ctc]
@ -21,10 +22,8 @@
[app.common.types.components-list :as ctkl] [app.common.types.components-list :as ctkl]
[app.common.types.container :as ctn] [app.common.types.container :as ctn]
[app.common.types.file :as ctf] [app.common.types.file :as ctf]
[app.common.types.page :as ctp]
[app.common.types.pages-list :as ctpl] [app.common.types.pages-list :as ctpl]
[app.common.types.shape-tree :as ctst] [app.common.types.shape-tree :as ctst]
[app.common.types.shape.interactions :as ctsi]
[app.common.types.shape.layout :as ctl] [app.common.types.shape.layout :as ctl]
[app.common.types.typography :as cty] [app.common.types.typography :as cty]
[app.common.uuid :as uuid] [app.common.uuid :as uuid]
@ -34,23 +33,6 @@
;; Change this to :info :debug or :trace to debug this module, or :warn to reset to default ;; Change this to :info :debug or :trace to debug this module, or :warn to reset to default
(log/set-level! :warn) (log/set-level! :warn)
(defn generate-update-shapes
[changes ids update-fn objects {:keys [attrs ignore-tree ignore-touched with-objects?]}]
(let [changes (reduce
(fn [changes id]
(let [opts {:attrs attrs
:ignore-geometry? (get ignore-tree id)
:ignore-touched ignore-touched
:with-objects? with-objects?}]
(pcb/update-shapes changes [id] update-fn (d/without-nils opts))))
(-> changes
(pcb/with-objects objects))
ids)
grid-ids (->> ids (filter (partial ctl/grid-layout? objects)))
changes (pcb/update-shapes changes grid-ids ctl/assign-cell-positions {:with-objects? true})
changes (pcb/reorder-grid-children changes ids)]
changes))
(declare generate-sync-container) (declare generate-sync-container)
(declare generate-sync-shape) (declare generate-sync-shape)
(declare generate-sync-text-shape) (declare generate-sync-text-shape)
@ -58,7 +40,6 @@
(declare generate-sync-shape-direct) (declare generate-sync-shape-direct)
(declare generate-sync-shape-direct-recursive) (declare generate-sync-shape-direct-recursive)
(declare generate-sync-shape-inverse)
(declare generate-sync-shape-inverse-recursive) (declare generate-sync-shape-inverse-recursive)
(declare compare-children) (declare compare-children)
@ -864,7 +845,6 @@
reset? reset?
components-v2)))) components-v2))))
(defn generate-rename-component (defn generate-rename-component
"Generate the changes for rename the component with the given id, in the current file library." "Generate the changes for rename the component with the given id, in the current file library."
[changes id new-name library-data components-v2] [changes id new-name library-data components-v2]
@ -884,9 +864,6 @@
(pcb/with-library-data library-data) (pcb/with-library-data library-data)
(pcb/update-component id update-fn)))) (pcb/update-component id update-fn))))
(defn generate-sync-shape-inverse (defn generate-sync-shape-inverse
"Generate changes to update the component a shape is linked to, from "Generate changes to update the component a shape is linked to, from
the values in the shape and all its children." the values in the shape and all its children."
@ -1838,175 +1815,6 @@
(pcb/with-objects (:objects container)) (pcb/with-objects (:objects container))
(generate-detach-instance container libraries id)))) (generate-detach-instance container libraries id))))
(defn generate-update-shape-flags
[changes ids objects {:keys [blocked hidden] :as flags}]
(let [update-fn
(fn [obj]
(cond-> obj
(boolean? blocked) (assoc :blocked blocked)
(boolean? hidden) (assoc :hidden hidden)))
ids (if (boolean? blocked)
(into ids (->> ids (mapcat #(cfh/get-children-ids objects %))))
ids)]
(-> changes
(pcb/update-shapes ids update-fn {:attrs #{:blocked :hidden}}))))
(defn generate-delete-shapes
[changes file page objects ids {:keys [components-v2 ignore-touched component-swap]}]
(let [ids (cfh/clean-loops objects ids)
in-component-copy?
(fn [shape-id]
;; Look for shapes that are inside a component copy, but are
;; not the root. In this case, they must not be deleted,
;; but hidden (to be able to recover them more easily).
;; Unless we are doing a component swap, in which case we want
;; to delete the old shape
(let [shape (get objects shape-id)]
(and (ctn/has-any-copy-parent? objects shape)
(not component-swap))))
[ids-to-delete ids-to-hide]
(if components-v2
(loop [ids-seq (seq ids)
ids-to-delete []
ids-to-hide []]
(let [id (first ids-seq)]
(if (nil? id)
[ids-to-delete ids-to-hide]
(if (in-component-copy? id)
(recur (rest ids-seq)
ids-to-delete
(conj ids-to-hide id))
(recur (rest ids-seq)
(conj ids-to-delete id)
ids-to-hide)))))
[ids []])
changes (-> changes
(pcb/with-page page)
(pcb/with-objects objects)
(pcb/with-library-data file))
lookup (d/getf objects)
groups-to-unmask
(reduce (fn [group-ids id]
;; When the shape to delete is the mask of a masked group,
;; the mask condition must be removed, and it must be
;; converted to a normal group.
(let [obj (lookup id)
parent (lookup (:parent-id obj))]
(if (and (:masked-group parent)
(= id (first (:shapes parent))))
(conj group-ids (:id parent))
group-ids)))
#{}
ids-to-delete)
interacting-shapes
(filter (fn [shape]
;; If any of the deleted shapes is the destination of
;; some interaction, this must be deleted, too.
(let [interactions (:interactions shape)]
(some #(and (ctsi/has-destination %)
(contains? ids-to-delete (:destination %)))
interactions)))
(vals objects))
ids-set (set ids-to-delete)
guides-to-remove
(->> (dm/get-in page [:options :guides])
(vals)
(filter #(contains? ids-set (:frame-id %)))
(map :id))
guides
(->> guides-to-remove
(reduce dissoc (dm/get-in page [:options :guides])))
starting-flows
(filter (fn [flow]
;; If any of the deleted is a frame that starts a flow,
;; this must be deleted, too.
(contains? ids-to-delete (:starting-frame flow)))
(-> page :options :flows))
all-parents
(reduce (fn [res id]
;; All parents of any deleted shape must be resized.
(into res (cfh/get-parent-ids objects id)))
(d/ordered-set)
ids-to-delete)
all-children
(->> ids-to-delete ;; Children of deleted shapes must be also deleted.
(reduce (fn [res id]
(into res (cfh/get-children-ids objects id)))
[])
(reverse)
(into (d/ordered-set)))
find-all-empty-parents
(fn recursive-find-empty-parents [empty-parents]
(let [all-ids (into empty-parents ids-to-delete)
contains? (partial contains? all-ids)
xform (comp (map lookup)
(filter #(or (cfh/group-shape? %) (cfh/bool-shape? %)))
(remove #(->> (:shapes %) (remove contains?) seq))
(map :id))
parents (into #{} xform all-parents)]
(if (= empty-parents parents)
empty-parents
(recursive-find-empty-parents parents))))
empty-parents
;; Any parent whose children are all deleted, must be deleted too.
(into (d/ordered-set) (find-all-empty-parents #{}))
components-to-delete
(if components-v2
(reduce (fn [components id]
(let [shape (get objects id)]
(if (and (= (:component-file shape) (:id file)) ;; Main instances should exist only in local file
(:main-instance shape)) ;; but check anyway
(conj components (:component-id shape))
components)))
[]
(into ids-to-delete all-children))
[])
changes (-> changes
(pcb/set-page-option :guides guides))
changes (reduce (fn [changes component-id]
;; It's important to delete the component before the main instance, because we
;; need to store the instance position if we want to restore it later.
(pcb/delete-component changes component-id (:id page)))
changes
components-to-delete)
changes (-> changes
(generate-update-shape-flags ids-to-hide objects {:hidden true})
(pcb/remove-objects all-children {:ignore-touched true})
(pcb/remove-objects ids-to-delete {:ignore-touched ignore-touched})
(pcb/remove-objects empty-parents)
(pcb/resize-parents all-parents)
(pcb/update-shapes groups-to-unmask
(fn [shape]
(assoc shape :masked-group false)))
(pcb/update-shapes (map :id interacting-shapes)
(fn [shape]
(d/update-when shape :interactions
(fn [interactions]
(into []
(remove #(and (ctsi/has-destination %)
(contains? ids-to-delete (:destination %))))
interactions)))))
(cond-> (seq starting-flows)
(pcb/update-page-option :flows (fn [flows]
(->> (map :id starting-flows)
(reduce ctp/remove-flow flows))))))]
[all-parents changes]))
(defn generate-new-shape-for-swap (defn generate-new-shape-for-swap
[changes shape file page libraries id-new-component index target-cell keep-props-values] [changes shape file page libraries id-new-component index target-cell keep-props-values]
(let [objects (:objects page) (let [objects (:objects page)
@ -2057,8 +1865,8 @@
[changes objects shape file page libraries id-new-component index target-cell keep-props-values] [changes objects shape file page libraries id-new-component index target-cell keep-props-values]
(let [[all-parents changes] (let [[all-parents changes]
(-> changes (-> changes
(generate-delete-shapes file page objects (d/ordered-set (:id shape)) {:components-v2 true (cls/generate-delete-shapes file page objects (d/ordered-set (:id shape)) {:components-v2 true
:component-swap true})) :component-swap true}))
[new-shape changes] [new-shape changes]
(-> changes (-> changes
(generate-new-shape-for-swap shape file page libraries id-new-component index target-cell keep-props-values))] (generate-new-shape-for-swap shape file page libraries id-new-component index target-cell keep-props-values))]
@ -2115,317 +1923,3 @@
(cond-> changes (cond-> changes
(some? swap-slot) (some? swap-slot)
(generate-sync-head file-full libraries container id components-v2 true)))) (generate-sync-head file-full libraries container id components-v2 true))))
(defn generate-relocate-shapes [changes objects parents parent-id page-id to-index ids]
(let [groups-to-delete
(loop [current-id (first parents)
to-check (rest parents)
removed-id? (set ids)
result #{}]
(if-not current-id
;; Base case, no next element
result
(let [group (get objects current-id)]
(if (and (not= :frame (:type group))
(not= current-id parent-id)
(empty? (remove removed-id? (:shapes group))))
;; Adds group to the remove and check its parent
(let [to-check (concat to-check [(cfh/get-parent-id objects current-id)])]
(recur (first to-check)
(rest to-check)
(conj removed-id? current-id)
(conj result current-id)))
;; otherwise recur
(recur (first to-check)
(rest to-check)
removed-id?
result)))))
groups-to-unmask
(reduce (fn [group-ids id]
;; When a masked group loses its mask shape, because it's
;; moved outside the group, the mask condition must be
;; removed, and it must be converted to a normal group.
(let [obj (get objects id)
parent (get objects (:parent-id obj))]
(if (and (:masked-group parent)
(= id (first (:shapes parent)))
(not= (:id parent) parent-id))
(conj group-ids (:id parent))
group-ids)))
#{}
ids)
;; TODO: Probably implementing this using loop/recur will
;; be more efficient than using reduce and continuous data
;; desturcturing.
;; Sets the correct components metadata for the moved shapes
;; `shapes-to-detach` Detach from a component instance a shape that was inside a component and is moved outside
;; `shapes-to-deroot` Removes the root flag from a component instance moved inside another component
;; `shapes-to-reroot` Adds a root flag when a nested component instance is moved outside
[shapes-to-detach shapes-to-deroot shapes-to-reroot]
(reduce (fn [[shapes-to-detach shapes-to-deroot shapes-to-reroot] id]
(let [shape (get objects id)
parent (get objects parent-id)
component-shape (ctn/get-component-shape objects shape)
component-shape-parent (ctn/get-component-shape objects parent {:allow-main? true})
root-parent (ctn/get-instance-root objects parent)
detach? (and (ctk/in-component-copy-not-head? shape)
(not= (:id component-shape)
(:id component-shape-parent)))
deroot? (and (ctk/instance-root? shape)
root-parent)
reroot? (and (ctk/subinstance-head? shape)
(not component-shape-parent))
ids-to-detach (when detach?
(cons id (cfh/get-children-ids objects id)))]
[(cond-> shapes-to-detach detach? (into ids-to-detach))
(cond-> shapes-to-deroot deroot? (conj id))
(cond-> shapes-to-reroot reroot? (conj id))]))
[[] [] []]
(->> ids
(mapcat #(ctn/get-child-heads objects %))
(map :id)))
shapes-to-unconstraint ids
ordered-indexes (cfh/order-by-indexed-shapes objects ids)
shapes (map (d/getf objects) ordered-indexes)
parent (get objects parent-id)
component-main-parent (ctn/find-component-main objects parent false)
child-heads
(->> ordered-indexes
(mapcat #(ctn/get-child-heads objects %))
(map :id))]
(-> changes
(pcb/with-page-id page-id)
(pcb/with-objects objects)
;; Remove layout-item properties when moving a shape outside a layout
(cond-> (not (ctl/any-layout? parent))
(pcb/update-shapes ordered-indexes ctl/remove-layout-item-data))
;; Remove the hide in viewer flag
(cond-> (and (not= uuid/zero parent-id) (cfh/frame-shape? parent))
(pcb/update-shapes ordered-indexes #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true))))
;; Remove the swap slots if it is moving to a different component
(pcb/update-shapes child-heads
(fn [shape]
(cond-> shape
(not= component-main-parent (ctn/find-component-main objects shape false))
(ctk/remove-swap-slot))))
;; Add component-root property when moving a component outside a component
(cond-> (not (ctn/get-instance-root objects parent))
(pcb/update-shapes child-heads #(assoc % :component-root true)))
;; Move the shapes
(pcb/change-parent parent-id
shapes
to-index)
;; Remove empty groups
(pcb/remove-objects groups-to-delete)
;; Unmask groups whose mask have moved outside
(pcb/update-shapes groups-to-unmask
(fn [shape]
(assoc shape :masked-group false)))
;; Detach shapes moved out of their component
(pcb/update-shapes shapes-to-detach ctk/detach-shape)
;; Make non root a component moved inside another one
(pcb/update-shapes shapes-to-deroot
(fn [shape]
(assoc shape :component-root nil)))
;; Make root a subcomponent moved outside its parent component
(pcb/update-shapes shapes-to-reroot
(fn [shape]
(assoc shape :component-root true)))
;; Reset constraints depending on the new parent
(pcb/update-shapes shapes-to-unconstraint
(fn [shape]
(let [frame-id (if (= (:type parent) :frame)
(:id parent)
(:frame-id parent))
moved-shape (assoc shape
:parent-id parent-id
:frame-id frame-id)]
(assoc shape
:constraints-h (gsh/default-constraints-h moved-shape)
:constraints-v (gsh/default-constraints-v moved-shape))))
{:ignore-touched true})
;; Fix the sizing when moving a shape
(pcb/update-shapes parents
(fn [parent]
(if (ctl/flex-layout? parent)
(cond-> parent
(ctl/change-h-sizing? (:id parent) objects (:shapes parent))
(assoc :layout-item-h-sizing :fix)
(ctl/change-v-sizing? (:id parent) objects (:shapes parent))
(assoc :layout-item-v-sizing :fix))
parent)))
;; Update grid layout
(cond-> (ctl/grid-layout? objects parent-id)
(pcb/update-shapes [parent-id] #(ctl/add-children-to-index % ids objects to-index)))
(pcb/update-shapes parents
(fn [parent objects]
(cond-> parent
(ctl/grid-layout? parent)
(ctl/assign-cells objects)))
{:with-objects? true})
(pcb/reorder-grid-children parents)
;; If parent locked, lock the added shapes
(cond-> (:blocked parent)
(pcb/update-shapes ordered-indexes #(assoc % :blocked true)))
;; Resize parent containers that need to
(pcb/resize-parents parents))))
(defn generate-move-shapes-to-frame
[changes ids frame-id page-id objects drop-index [row column :as cell]]
(let [lookup (d/getf objects)
frame (get objects frame-id)
layout? (:layout frame)
component-main-frame (ctn/find-component-main objects frame false)
shapes (->> ids
(cfh/clean-loops objects)
(keep lookup)
;;remove shapes inside copies, because we can't change the structure of copies
(remove #(ctk/in-component-copy? (get objects (:parent-id %)))))
moving-shapes
(cond->> shapes
(not layout?)
(remove #(= (:frame-id %) frame-id))
layout?
(remove #(and (= (:frame-id %) frame-id)
(not= (:parent-id %) frame-id))))
ordered-indexes (cfh/order-by-indexed-shapes objects (map :id moving-shapes))
moving-shapes (map (d/getf objects) ordered-indexes)
all-parents
(reduce (fn [res id]
(into res (cfh/get-parent-ids objects id)))
(d/ordered-set)
ids)
find-all-empty-parents
(fn recursive-find-empty-parents [empty-parents]
(let [all-ids (into empty-parents ids)
contains? (partial contains? all-ids)
xform (comp (map lookup)
(filter cfh/group-shape?)
(remove #(->> (:shapes %) (remove contains?) seq))
(map :id))
parents (into #{} xform all-parents)]
(if (= empty-parents parents)
empty-parents
(recursive-find-empty-parents parents))))
empty-parents
;; Any empty parent whose children are moved to another frame should be deleted
(if (empty? moving-shapes)
#{}
(into (d/ordered-set) (find-all-empty-parents #{})))
;; Not move absolute shapes that won't change parent
moving-shapes
(->> moving-shapes
(remove (fn [shape]
(and (ctl/position-absolute? shape)
(= frame-id (:parent-id shape))))))
frame-component
(ctn/get-component-shape objects frame)
shape-ids-to-detach
(reduce (fn [result shape]
(if (and (some? shape) (ctk/in-component-copy-not-head? shape))
(let [shape-component (ctn/get-component-shape objects shape)]
(if (= (:id frame-component) (:id shape-component))
result
(into result (cfh/get-children-ids-with-self objects (:id shape)))))
result))
#{}
moving-shapes)
moving-shapes-ids
(map :id moving-shapes)
moving-shapes-children-ids
(->> moving-shapes-ids
(mapcat #(cfh/get-children-ids-with-self objects %)))
child-heads
(->> moving-shapes-ids
(mapcat #(ctn/get-child-heads objects %))
(map :id))]
(-> changes
(pcb/with-page-id page-id)
(pcb/with-objects objects)
;; Remove layout-item properties when moving a shape outside a layout
(cond-> (not (ctl/any-layout? objects frame-id))
(pcb/update-shapes moving-shapes-ids ctl/remove-layout-item-data))
;; Remove the swap slots if it is moving to a different component
(pcb/update-shapes
child-heads
(fn [shape]
(cond-> shape
(not= component-main-frame (ctn/find-component-main objects shape false))
(ctk/remove-swap-slot))))
;; Remove component-root property when moving a shape inside a component
(cond-> (ctn/get-instance-root objects frame)
(pcb/update-shapes moving-shapes-children-ids #(dissoc % :component-root)))
;; Add component-root property when moving a component outside a component
(cond-> (not (ctn/get-instance-root objects frame))
(pcb/update-shapes child-heads #(assoc % :component-root true)))
(pcb/update-shapes moving-shapes-ids #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true)))
(pcb/update-shapes shape-ids-to-detach ctk/detach-shape)
(pcb/change-parent frame-id moving-shapes drop-index)
;; Change the grid cell in a grid layout
(cond-> (ctl/grid-layout? objects frame-id)
(-> (pcb/update-shapes
[frame-id]
(fn [frame objects]
(-> frame
;; Assign the cell when pushing into a specific grid cell
(cond-> (some? cell)
(-> (ctl/free-cell-shapes moving-shapes-ids)
(ctl/push-into-cell moving-shapes-ids row column)
(ctl/assign-cells objects)))
(ctl/assign-cell-positions objects)))
{:with-objects? true})
(pcb/reorder-grid-children [frame-id])))
(pcb/remove-objects empty-parents))))

View file

@ -0,0 +1,519 @@
;; 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) KALEIDOS INC
(ns app.common.logic.shapes
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.files.changes-builder :as pcb]
[app.common.files.helpers :as cfh]
[app.common.geom.shapes :as gsh]
[app.common.types.component :as ctk]
[app.common.types.container :as ctn]
[app.common.types.page :as ctp]
[app.common.types.shape.interactions :as ctsi]
[app.common.types.shape.layout :as ctl]
[app.common.uuid :as uuid]))
(defn generate-update-shapes
[changes ids update-fn objects {:keys [attrs ignore-tree ignore-touched with-objects?]}]
(let [changes (reduce
(fn [changes id]
(let [opts {:attrs attrs
:ignore-geometry? (get ignore-tree id)
:ignore-touched ignore-touched
:with-objects? with-objects?}]
(pcb/update-shapes changes [id] update-fn (d/without-nils opts))))
(-> changes
(pcb/with-objects objects))
ids)
grid-ids (->> ids (filter (partial ctl/grid-layout? objects)))
changes (pcb/update-shapes changes grid-ids ctl/assign-cell-positions {:with-objects? true})
changes (pcb/reorder-grid-children changes ids)]
changes))
(defn- generate-update-shape-flags
[changes ids objects {:keys [blocked hidden] :as flags}]
(let [update-fn
(fn [obj]
(cond-> obj
(boolean? blocked) (assoc :blocked blocked)
(boolean? hidden) (assoc :hidden hidden)))
ids (if (boolean? blocked)
(into ids (->> ids (mapcat #(cfh/get-children-ids objects %))))
ids)]
(-> changes
(pcb/update-shapes ids update-fn {:attrs #{:blocked :hidden}}))))
(defn generate-delete-shapes
[changes file page objects ids {:keys [components-v2 ignore-touched component-swap]}]
(let [ids (cfh/clean-loops objects ids)
in-component-copy?
(fn [shape-id]
;; Look for shapes that are inside a component copy, but are
;; not the root. In this case, they must not be deleted,
;; but hidden (to be able to recover them more easily).
;; Unless we are doing a component swap, in which case we want
;; to delete the old shape
(let [shape (get objects shape-id)]
(and (ctn/has-any-copy-parent? objects shape)
(not component-swap))))
[ids-to-delete ids-to-hide]
(if components-v2
(loop [ids-seq (seq ids)
ids-to-delete []
ids-to-hide []]
(let [id (first ids-seq)]
(if (nil? id)
[ids-to-delete ids-to-hide]
(if (in-component-copy? id)
(recur (rest ids-seq)
ids-to-delete
(conj ids-to-hide id))
(recur (rest ids-seq)
(conj ids-to-delete id)
ids-to-hide)))))
[ids []])
changes (-> changes
(pcb/with-page page)
(pcb/with-objects objects)
(pcb/with-library-data file))
lookup (d/getf objects)
groups-to-unmask
(reduce (fn [group-ids id]
;; When the shape to delete is the mask of a masked group,
;; the mask condition must be removed, and it must be
;; converted to a normal group.
(let [obj (lookup id)
parent (lookup (:parent-id obj))]
(if (and (:masked-group parent)
(= id (first (:shapes parent))))
(conj group-ids (:id parent))
group-ids)))
#{}
ids-to-delete)
interacting-shapes
(filter (fn [shape]
;; If any of the deleted shapes is the destination of
;; some interaction, this must be deleted, too.
(let [interactions (:interactions shape)]
(some #(and (ctsi/has-destination %)
(contains? ids-to-delete (:destination %)))
interactions)))
(vals objects))
ids-set (set ids-to-delete)
guides-to-remove
(->> (dm/get-in page [:options :guides])
(vals)
(filter #(contains? ids-set (:frame-id %)))
(map :id))
guides
(->> guides-to-remove
(reduce dissoc (dm/get-in page [:options :guides])))
starting-flows
(filter (fn [flow]
;; If any of the deleted is a frame that starts a flow,
;; this must be deleted, too.
(contains? ids-to-delete (:starting-frame flow)))
(-> page :options :flows))
all-parents
(reduce (fn [res id]
;; All parents of any deleted shape must be resized.
(into res (cfh/get-parent-ids objects id)))
(d/ordered-set)
ids-to-delete)
all-children
(->> ids-to-delete ;; Children of deleted shapes must be also deleted.
(reduce (fn [res id]
(into res (cfh/get-children-ids objects id)))
[])
(reverse)
(into (d/ordered-set)))
find-all-empty-parents
(fn recursive-find-empty-parents [empty-parents]
(let [all-ids (into empty-parents ids-to-delete)
contains? (partial contains? all-ids)
xform (comp (map lookup)
(filter #(or (cfh/group-shape? %) (cfh/bool-shape? %)))
(remove #(->> (:shapes %) (remove contains?) seq))
(map :id))
parents (into #{} xform all-parents)]
(if (= empty-parents parents)
empty-parents
(recursive-find-empty-parents parents))))
empty-parents
;; Any parent whose children are all deleted, must be deleted too.
(into (d/ordered-set) (find-all-empty-parents #{}))
components-to-delete
(if components-v2
(reduce (fn [components id]
(let [shape (get objects id)]
(if (and (= (:component-file shape) (:id file)) ;; Main instances should exist only in local file
(:main-instance shape)) ;; but check anyway
(conj components (:component-id shape))
components)))
[]
(into ids-to-delete all-children))
[])
changes (-> changes
(pcb/set-page-option :guides guides))
changes (reduce (fn [changes component-id]
;; It's important to delete the component before the main instance, because we
;; need to store the instance position if we want to restore it later.
(pcb/delete-component changes component-id (:id page)))
changes
components-to-delete)
changes (-> changes
(generate-update-shape-flags ids-to-hide objects {:hidden true})
(pcb/remove-objects all-children {:ignore-touched true})
(pcb/remove-objects ids-to-delete {:ignore-touched ignore-touched})
(pcb/remove-objects empty-parents)
(pcb/resize-parents all-parents)
(pcb/update-shapes groups-to-unmask
(fn [shape]
(assoc shape :masked-group false)))
(pcb/update-shapes (map :id interacting-shapes)
(fn [shape]
(d/update-when shape :interactions
(fn [interactions]
(into []
(remove #(and (ctsi/has-destination %)
(contains? ids-to-delete (:destination %))))
interactions)))))
(cond-> (seq starting-flows)
(pcb/update-page-option :flows (fn [flows]
(->> (map :id starting-flows)
(reduce ctp/remove-flow flows))))))]
[all-parents changes]))
(defn generate-relocate-shapes [changes objects parents parent-id page-id to-index ids]
(let [groups-to-delete
(loop [current-id (first parents)
to-check (rest parents)
removed-id? (set ids)
result #{}]
(if-not current-id
;; Base case, no next element
result
(let [group (get objects current-id)]
(if (and (not= :frame (:type group))
(not= current-id parent-id)
(empty? (remove removed-id? (:shapes group))))
;; Adds group to the remove and check its parent
(let [to-check (concat to-check [(cfh/get-parent-id objects current-id)])]
(recur (first to-check)
(rest to-check)
(conj removed-id? current-id)
(conj result current-id)))
;; otherwise recur
(recur (first to-check)
(rest to-check)
removed-id?
result)))))
groups-to-unmask
(reduce (fn [group-ids id]
;; When a masked group loses its mask shape, because it's
;; moved outside the group, the mask condition must be
;; removed, and it must be converted to a normal group.
(let [obj (get objects id)
parent (get objects (:parent-id obj))]
(if (and (:masked-group parent)
(= id (first (:shapes parent)))
(not= (:id parent) parent-id))
(conj group-ids (:id parent))
group-ids)))
#{}
ids)
;; TODO: Probably implementing this using loop/recur will
;; be more efficient than using reduce and continuous data
;; desturcturing.
;; Sets the correct components metadata for the moved shapes
;; `shapes-to-detach` Detach from a component instance a shape that was inside a component and is moved outside
;; `shapes-to-deroot` Removes the root flag from a component instance moved inside another component
;; `shapes-to-reroot` Adds a root flag when a nested component instance is moved outside
[shapes-to-detach shapes-to-deroot shapes-to-reroot]
(reduce (fn [[shapes-to-detach shapes-to-deroot shapes-to-reroot] id]
(let [shape (get objects id)
parent (get objects parent-id)
component-shape (ctn/get-component-shape objects shape)
component-shape-parent (ctn/get-component-shape objects parent {:allow-main? true})
root-parent (ctn/get-instance-root objects parent)
detach? (and (ctk/in-component-copy-not-head? shape)
(not= (:id component-shape)
(:id component-shape-parent)))
deroot? (and (ctk/instance-root? shape)
root-parent)
reroot? (and (ctk/subinstance-head? shape)
(not component-shape-parent))
ids-to-detach (when detach?
(cons id (cfh/get-children-ids objects id)))]
[(cond-> shapes-to-detach detach? (into ids-to-detach))
(cond-> shapes-to-deroot deroot? (conj id))
(cond-> shapes-to-reroot reroot? (conj id))]))
[[] [] []]
(->> ids
(mapcat #(ctn/get-child-heads objects %))
(map :id)))
shapes-to-unconstraint ids
ordered-indexes (cfh/order-by-indexed-shapes objects ids)
shapes (map (d/getf objects) ordered-indexes)
parent (get objects parent-id)
component-main-parent (ctn/find-component-main objects parent false)
child-heads
(->> ordered-indexes
(mapcat #(ctn/get-child-heads objects %))
(map :id))]
(-> changes
(pcb/with-page-id page-id)
(pcb/with-objects objects)
;; Remove layout-item properties when moving a shape outside a layout
(cond-> (not (ctl/any-layout? parent))
(pcb/update-shapes ordered-indexes ctl/remove-layout-item-data))
;; Remove the hide in viewer flag
(cond-> (and (not= uuid/zero parent-id) (cfh/frame-shape? parent))
(pcb/update-shapes ordered-indexes #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true))))
;; Remove the swap slots if it is moving to a different component
(pcb/update-shapes child-heads
(fn [shape]
(cond-> shape
(not= component-main-parent (ctn/find-component-main objects shape false))
(ctk/remove-swap-slot))))
;; Add component-root property when moving a component outside a component
(cond-> (not (ctn/get-instance-root objects parent))
(pcb/update-shapes child-heads #(assoc % :component-root true)))
;; Move the shapes
(pcb/change-parent parent-id
shapes
to-index)
;; Remove empty groups
(pcb/remove-objects groups-to-delete)
;; Unmask groups whose mask have moved outside
(pcb/update-shapes groups-to-unmask
(fn [shape]
(assoc shape :masked-group false)))
;; Detach shapes moved out of their component
(pcb/update-shapes shapes-to-detach ctk/detach-shape)
;; Make non root a component moved inside another one
(pcb/update-shapes shapes-to-deroot
(fn [shape]
(assoc shape :component-root nil)))
;; Make root a subcomponent moved outside its parent component
(pcb/update-shapes shapes-to-reroot
(fn [shape]
(assoc shape :component-root true)))
;; Reset constraints depending on the new parent
(pcb/update-shapes shapes-to-unconstraint
(fn [shape]
(let [frame-id (if (= (:type parent) :frame)
(:id parent)
(:frame-id parent))
moved-shape (assoc shape
:parent-id parent-id
:frame-id frame-id)]
(assoc shape
:constraints-h (gsh/default-constraints-h moved-shape)
:constraints-v (gsh/default-constraints-v moved-shape))))
{:ignore-touched true})
;; Fix the sizing when moving a shape
(pcb/update-shapes parents
(fn [parent]
(if (ctl/flex-layout? parent)
(cond-> parent
(ctl/change-h-sizing? (:id parent) objects (:shapes parent))
(assoc :layout-item-h-sizing :fix)
(ctl/change-v-sizing? (:id parent) objects (:shapes parent))
(assoc :layout-item-v-sizing :fix))
parent)))
;; Update grid layout
(cond-> (ctl/grid-layout? objects parent-id)
(pcb/update-shapes [parent-id] #(ctl/add-children-to-index % ids objects to-index)))
(pcb/update-shapes parents
(fn [parent objects]
(cond-> parent
(ctl/grid-layout? parent)
(ctl/assign-cells objects)))
{:with-objects? true})
(pcb/reorder-grid-children parents)
;; If parent locked, lock the added shapes
(cond-> (:blocked parent)
(pcb/update-shapes ordered-indexes #(assoc % :blocked true)))
;; Resize parent containers that need to
(pcb/resize-parents parents))))
(defn generate-move-shapes-to-frame
[changes ids frame-id page-id objects drop-index [row column :as cell]]
(let [lookup (d/getf objects)
frame (get objects frame-id)
layout? (:layout frame)
component-main-frame (ctn/find-component-main objects frame false)
shapes (->> ids
(cfh/clean-loops objects)
(keep lookup)
;;remove shapes inside copies, because we can't change the structure of copies
(remove #(ctk/in-component-copy? (get objects (:parent-id %)))))
moving-shapes
(cond->> shapes
(not layout?)
(remove #(= (:frame-id %) frame-id))
layout?
(remove #(and (= (:frame-id %) frame-id)
(not= (:parent-id %) frame-id))))
ordered-indexes (cfh/order-by-indexed-shapes objects (map :id moving-shapes))
moving-shapes (map (d/getf objects) ordered-indexes)
all-parents
(reduce (fn [res id]
(into res (cfh/get-parent-ids objects id)))
(d/ordered-set)
ids)
find-all-empty-parents
(fn recursive-find-empty-parents [empty-parents]
(let [all-ids (into empty-parents ids)
contains? (partial contains? all-ids)
xform (comp (map lookup)
(filter cfh/group-shape?)
(remove #(->> (:shapes %) (remove contains?) seq))
(map :id))
parents (into #{} xform all-parents)]
(if (= empty-parents parents)
empty-parents
(recursive-find-empty-parents parents))))
empty-parents
;; Any empty parent whose children are moved to another frame should be deleted
(if (empty? moving-shapes)
#{}
(into (d/ordered-set) (find-all-empty-parents #{})))
;; Not move absolute shapes that won't change parent
moving-shapes
(->> moving-shapes
(remove (fn [shape]
(and (ctl/position-absolute? shape)
(= frame-id (:parent-id shape))))))
frame-component
(ctn/get-component-shape objects frame)
shape-ids-to-detach
(reduce (fn [result shape]
(if (and (some? shape) (ctk/in-component-copy-not-head? shape))
(let [shape-component (ctn/get-component-shape objects shape)]
(if (= (:id frame-component) (:id shape-component))
result
(into result (cfh/get-children-ids-with-self objects (:id shape)))))
result))
#{}
moving-shapes)
moving-shapes-ids
(map :id moving-shapes)
moving-shapes-children-ids
(->> moving-shapes-ids
(mapcat #(cfh/get-children-ids-with-self objects %)))
child-heads
(->> moving-shapes-ids
(mapcat #(ctn/get-child-heads objects %))
(map :id))]
(-> changes
(pcb/with-page-id page-id)
(pcb/with-objects objects)
;; Remove layout-item properties when moving a shape outside a layout
(cond-> (not (ctl/any-layout? objects frame-id))
(pcb/update-shapes moving-shapes-ids ctl/remove-layout-item-data))
;; Remove the swap slots if it is moving to a different component
(pcb/update-shapes
child-heads
(fn [shape]
(cond-> shape
(not= component-main-frame (ctn/find-component-main objects shape false))
(ctk/remove-swap-slot))))
;; Remove component-root property when moving a shape inside a component
(cond-> (ctn/get-instance-root objects frame)
(pcb/update-shapes moving-shapes-children-ids #(dissoc % :component-root)))
;; Add component-root property when moving a component outside a component
(cond-> (not (ctn/get-instance-root objects frame))
(pcb/update-shapes child-heads #(assoc % :component-root true)))
(pcb/update-shapes moving-shapes-ids #(cond-> % (cfh/frame-shape? %) (assoc :hide-in-viewer true)))
(pcb/update-shapes shape-ids-to-detach ctk/detach-shape)
(pcb/change-parent frame-id moving-shapes drop-index)
;; Change the grid cell in a grid layout
(cond-> (ctl/grid-layout? objects frame-id)
(-> (pcb/update-shapes
[frame-id]
(fn [frame objects]
(-> frame
;; Assign the cell when pushing into a specific grid cell
(cond-> (some? cell)
(-> (ctl/free-cell-shapes moving-shapes-ids)
(ctl/push-into-cell moving-shapes-ids row column)
(ctl/assign-cells objects)))
(ctl/assign-cell-positions objects)))
{:with-objects? true})
(pcb/reorder-grid-children [frame-id])))
(pcb/remove-objects empty-parents))))

View file

@ -12,9 +12,9 @@
[app.common.files.changes :as cfc] [app.common.files.changes :as cfc]
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.helpers :as cfh] [app.common.files.helpers :as cfh]
[app.common.files.libraries-helpers :as cflh]
[app.common.files.validate :as cfv] [app.common.files.validate :as cfv]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
[app.common.logic.libraries :as cll]
[app.common.pprint :refer [pprint]] [app.common.pprint :refer [pprint]]
[app.common.types.color :as ctc] [app.common.types.color :as ctc]
[app.common.types.colors-list :as ctcl] [app.common.types.colors-list :as ctcl]
@ -297,7 +297,7 @@
[new_shape _ changes] [new_shape _ changes]
(-> (pcb/empty-changes nil (:id page)) (-> (pcb/empty-changes nil (:id page))
(cflh/generate-component-swap objects shape (:data file) page libraries id-new-component 0 nil keep-props-values))] (cll/generate-component-swap objects shape (:data file) page libraries id-new-component 0 nil keep-props-values))]
(thi/set-id! new-shape-label (:id new_shape)) (thi/set-id! new-shape-label (:id new_shape))
(apply-changes file changes))) (apply-changes file changes)))

View file

@ -7,7 +7,7 @@
(ns common-tests.logic.comp-remove-swap-slots-test (ns common-tests.logic.comp-remove-swap-slots-test
(:require (:require
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.libraries-helpers :as cflh] [app.common.logic.shapes :as cls]
[app.common.types.component :as ctk] [app.common.types.component :as ctk]
[app.common.uuid :as uuid] [app.common.uuid :as uuid]
[clojure.test :as t] [clojure.test :as t]
@ -57,13 +57,13 @@
blue1 (thf/get-shape file :blue1) blue1 (thf/get-shape file :blue1)
;; ============================== Action ============================== ;; ============================== Action ==============================
changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) changes (cls/generate-relocate-shapes (pcb/empty-changes nil)
(:objects page) (:objects page)
#{(:parent-id blue1)} ;; parents #{(:parent-id blue1)} ;; parents
uuid/zero ;; parent-id uuid/zero ;; parent-id
(:id page) ;; page-id (:id page) ;; page-id
0 ;; to-index 0 ;; to-index
#{(:id blue1)}) ;; ids #{(:id blue1)}) ;; ids
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
;; ============================== Get ================================= ;; ============================== Get =================================
@ -84,13 +84,13 @@
blue1 (thf/get-shape file :blue1) blue1 (thf/get-shape file :blue1)
;; ============================== Action ============================== ;; ============================== Action ==============================
changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil)
#{(:id blue1)} ;; ids #{(:id blue1)} ;; ids
uuid/zero ;; frame-id uuid/zero ;; frame-id
(:id page) ;; page-id (:id page) ;; page-id
(:objects page) ;; objects (:objects page) ;; objects
0 ;; drop-index 0 ;; drop-index
nil) ;; cell nil) ;; cell
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
@ -115,13 +115,13 @@
;; ============================== Action ============================== ;; ============================== Action ==============================
changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) changes (cls/generate-relocate-shapes (pcb/empty-changes nil)
(:objects page) (:objects page)
#{(:parent-id blue1)} ;; parents #{(:parent-id blue1)} ;; parents
(:id b2) ;; parent-id (:id b2) ;; parent-id
(:id page) ;; page-id (:id page) ;; page-id
0 ;; to-index 0 ;; to-index
#{(:id blue1)}) ;; ids #{(:id blue1)}) ;; ids
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
;; ============================== Get ================================= ;; ============================== Get =================================
@ -144,13 +144,13 @@
;; ============================== Action ============================== ;; ============================== Action ==============================
changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil)
#{(:id blue1)} ;; ids #{(:id blue1)} ;; ids
(:id b2) ;; frame-id (:id b2) ;; frame-id
(:id page) ;; page-id (:id page) ;; page-id
(:objects page) ;; objects (:objects page) ;; objects
0 ;; drop-index 0 ;; drop-index
nil) ;; cell nil) ;; cell
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
@ -174,26 +174,26 @@
;; ============================== Action ============================== ;; ============================== Action ==============================
;; Move blue1 into yellow ;; Move blue1 into yellow
changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) changes (cls/generate-relocate-shapes (pcb/empty-changes nil)
(:objects page) (:objects page)
#{(:parent-id blue1)} ;; parents #{(:parent-id blue1)} ;; parents
(:id yellow) ;; parent-id (:id yellow) ;; parent-id
(:id page) ;; page-id (:id page) ;; page-id
0 ;; to-index 0 ;; to-index
#{(:id blue1)}) ;; ids #{(:id blue1)}) ;; ids
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
page' (thf/current-page file') page' (thf/current-page file')
yellow' (thf/get-shape file' :frame-yellow) yellow' (thf/get-shape file' :frame-yellow)
;; Move yellow into root ;; Move yellow into root
changes' (cflh/generate-relocate-shapes (pcb/empty-changes nil) changes' (cls/generate-relocate-shapes (pcb/empty-changes nil)
(:objects page') (:objects page')
#{(:parent-id yellow')} ;; parents #{(:parent-id yellow')} ;; parents
uuid/zero ;; parent-id uuid/zero ;; parent-id
(:id page') ;; page-id (:id page') ;; page-id
0 ;; to-index 0 ;; to-index
#{(:id yellow')}) ;; ids #{(:id yellow')}) ;; ids
file'' (thf/apply-changes file' changes') file'' (thf/apply-changes file' changes')
;; ============================== Get ================================= ;; ============================== Get =================================
@ -216,26 +216,26 @@
;; ============================== Action ============================== ;; ============================== Action ==============================
;; Move blue1 into yellow ;; Move blue1 into yellow
changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil)
#{(:id blue1)} ;; ids #{(:id blue1)} ;; ids
(:id yellow) ;; frame-id (:id yellow) ;; frame-id
(:id page) ;; page-id (:id page) ;; page-id
(:objects page) ;; objects (:objects page) ;; objects
0 ;; drop-index 0 ;; drop-index
nil) ;; cell nil) ;; cell
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
page' (thf/current-page file') page' (thf/current-page file')
yellow' (thf/get-shape file' :frame-yellow) yellow' (thf/get-shape file' :frame-yellow)
;; Move yellow into root ;; Move yellow into root
changes' (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) changes' (cls/generate-move-shapes-to-frame (pcb/empty-changes nil)
#{(:id yellow')} ;; ids #{(:id yellow')} ;; ids
uuid/zero ;; frame-id uuid/zero ;; frame-id
(:id page') ;; page-id (:id page') ;; page-id
(:objects page') ;; objects (:objects page') ;; objects
0 ;; drop-index 0 ;; drop-index
nil) ;; cell nil) ;; cell
file'' (thf/apply-changes file' changes') file'' (thf/apply-changes file' changes')
;; ============================== Get ================================= ;; ============================== Get =================================
@ -259,13 +259,13 @@
;; ============================== Action ============================== ;; ============================== Action ==============================
;; Move blue1 into yellow ;; Move blue1 into yellow
changes (cflh/generate-relocate-shapes (pcb/empty-changes nil) changes (cls/generate-relocate-shapes (pcb/empty-changes nil)
(:objects page) (:objects page)
#{(:parent-id blue1)} ;; parents #{(:parent-id blue1)} ;; parents
(:id yellow) ;; parent-id (:id yellow) ;; parent-id
(:id page) ;; page-id (:id page) ;; page-id
0 ;; to-index 0 ;; to-index
#{(:id blue1)}) ;; ids #{(:id blue1)}) ;; ids
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
page' (thf/current-page file') page' (thf/current-page file')
@ -273,13 +273,13 @@
b2' (thf/get-shape file' :frame-b2) b2' (thf/get-shape file' :frame-b2)
;; Move yellow into b2 ;; Move yellow into b2
changes' (cflh/generate-relocate-shapes (pcb/empty-changes nil) changes' (cls/generate-relocate-shapes (pcb/empty-changes nil)
(:objects page') (:objects page')
#{(:parent-id yellow')} ;; parents #{(:parent-id yellow')} ;; parents
(:id b2') ;; parent-id (:id b2') ;; parent-id
(:id page') ;; page-id (:id page') ;; page-id
0 ;; to-index 0 ;; to-index
#{(:id yellow')}) ;; ids #{(:id yellow')}) ;; ids
file'' (thf/apply-changes file' changes') file'' (thf/apply-changes file' changes')
;; ============================== Get ================================= ;; ============================== Get =================================
@ -302,13 +302,13 @@
;; ============================== Action ============================== ;; ============================== Action ==============================
;; Move blue1 into yellow ;; Move blue1 into yellow
changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) changes (cls/generate-move-shapes-to-frame (pcb/empty-changes nil)
#{(:id blue1)} ;; ids #{(:id blue1)} ;; ids
(:id yellow) ;; frame-id (:id yellow) ;; frame-id
(:id page) ;; page-id (:id page) ;; page-id
(:objects page) ;; objects (:objects page) ;; objects
0 ;; drop-index 0 ;; drop-index
nil) ;; cell nil) ;; cell
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
page' (thf/current-page file') page' (thf/current-page file')
@ -316,13 +316,13 @@
b2' (thf/get-shape file' :frame-b2) b2' (thf/get-shape file' :frame-b2)
;; Move yellow into b2 ;; Move yellow into b2
changes' (cflh/generate-move-shapes-to-frame (pcb/empty-changes nil) changes' (cls/generate-move-shapes-to-frame (pcb/empty-changes nil)
#{(:id yellow')} ;; ids #{(:id yellow')} ;; ids
(:id b2') ;; frame-id (:id b2') ;; frame-id
(:id page') ;; page-id (:id page') ;; page-id
(:objects page') ;; objects (:objects page') ;; objects
0 ;; drop-index 0 ;; drop-index
nil) ;; cell nil) ;; cell
file'' (thf/apply-changes file' changes') file'' (thf/apply-changes file' changes')

View file

@ -7,7 +7,7 @@
(ns common-tests.logic.component-creation-test (ns common-tests.logic.component-creation-test
(:require (:require
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.libraries-helpers :as cflh] [app.common.logic.libraries :as cll]
[clojure.test :as t] [clojure.test :as t]
[common-tests.helpers.files :as thf] [common-tests.helpers.files :as thf]
[common-tests.helpers.ids-map :as thi])) [common-tests.helpers.ids-map :as thi]))
@ -24,14 +24,14 @@
;; Action ;; Action
[_ component-id changes] [_ component-id changes]
(cflh/generate-add-component (pcb/empty-changes) (cll/generate-add-component (pcb/empty-changes)
[shape1] [shape1]
(:objects page) (:objects page)
(:id page) (:id page)
(:id file) (:id file)
true true
nil nil
nil) nil)
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)

View file

@ -7,7 +7,8 @@
(ns common-tests.logic.components-touched-test (ns common-tests.logic.components-touched-test
(:require (:require
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.libraries-helpers :as cflh] [app.common.logic.libraries :as cll]
[app.common.logic.shapes :as cls]
[clojure.test :as t] [clojure.test :as t]
[common-tests.helpers.compositions :as tho] [common-tests.helpers.compositions :as tho]
[common-tests.helpers.files :as thf] [common-tests.helpers.files :as thf]
@ -31,11 +32,11 @@
update-fn (fn [shape] update-fn (fn [shape]
(assoc shape :fills (thf/sample-fills-color :fill-color "#fabada"))) (assoc shape :fills (thf/sample-fills-color :fill-color "#fabada")))
changes (cflh/generate-update-shapes (pcb/empty-changes nil (:id page)) changes (cls/generate-update-shapes (pcb/empty-changes nil (:id page))
(:shapes copy-root) (:shapes copy-root)
update-fn update-fn
(:objects page) (:objects page)
{}) {})
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
@ -67,13 +68,13 @@
;; Action ;; Action
;; IMPORTANT: as modifying copies structure is now forbidden, this action ;; IMPORTANT: as modifying copies structure is now forbidden, this action
;; will not have any effect, and so the parent shape won't also be touched. ;; will not have any effect, and so the parent shape won't also be touched.
changes (cflh/generate-relocate-shapes (pcb/empty-changes) changes (cls/generate-relocate-shapes (pcb/empty-changes)
(:objects page) (:objects page)
#{(:parent-id copy-root)} ; parents #{(:parent-id copy-root)} ; parents
(thi/id :copy-root) ; parent-id (thi/id :copy-root) ; parent-id
(:id page) ; page-id (:id page) ; page-id
0 ; to-index 0 ; to-index
#{(thi/id :free-shape)}) ; ids #{(thi/id :free-shape)}) ; ids
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
@ -100,12 +101,12 @@
;; IMPORTANT: as modifying copies structure is now forbidden, this action will not ;; IMPORTANT: as modifying copies structure is now forbidden, this action will not
;; delete the child shape, but hide it (thus setting the visibility group). ;; delete the child shape, but hide it (thus setting the visibility group).
[_all-parents changes] [_all-parents changes]
(cflh/generate-delete-shapes (pcb/empty-changes) (cls/generate-delete-shapes (pcb/empty-changes)
file file
page page
(:objects page) (:objects page)
(set (:shapes copy-root)) (set (:shapes copy-root))
{:components-v2 true}) {:components-v2 true})
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
@ -133,13 +134,13 @@
;; Action ;; Action
;; IMPORTANT: as modifying copies structure is now forbidden, this action ;; IMPORTANT: as modifying copies structure is now forbidden, this action
;; will not have any effect, and so the parent shape won't also be touched. ;; will not have any effect, and so the parent shape won't also be touched.
changes (cflh/generate-relocate-shapes (pcb/empty-changes) changes (cls/generate-relocate-shapes (pcb/empty-changes)
(:objects page) (:objects page)
#{(:parent-id copy-child1)} ; parents #{(:parent-id copy-child1)} ; parents
(thi/id :copy-root) ; parent-id (thi/id :copy-root) ; parent-id
(:id page) ; page-id (:id page) ; page-id
2 ; to-index 2 ; to-index
#{(:id copy-child1)}) ; ids #{(:id copy-child1)}) ; ids
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)

View file

@ -7,11 +7,9 @@
(ns common-tests.logic.swap-and-reset-test (ns common-tests.logic.swap-and-reset-test
(:require (:require
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.libraries-helpers :as cflh] [app.common.logic.libraries :as cll]
[app.common.pprint :as pp]
[app.common.types.component :as ctk] [app.common.types.component :as ctk]
[app.common.types.file :as ctf] [app.common.types.file :as ctf]
[app.common.uuid :as uuid]
[clojure.test :as t] [clojure.test :as t]
[common-tests.helpers.compositions :as thc] [common-tests.helpers.compositions :as thc]
[common-tests.helpers.files :as thf] [common-tests.helpers.files :as thf]
@ -34,16 +32,16 @@
;; Action ;; Action
[new-shape all-parents changes] [new-shape all-parents changes]
(cflh/generate-component-swap (pcb/empty-changes) (cll/generate-component-swap (pcb/empty-changes)
(:objects page) (:objects page)
component-1-copy-root component-1-copy-root
(:data file) (:data file)
page page
{(:id file) file} {(:id file) file}
(:id component-2) (:id component-2)
0 0
nil nil
{}) {})
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
@ -82,16 +80,16 @@
;; Action ;; Action
[new-shape all-parents changes] [new-shape all-parents changes]
(cflh/generate-component-swap (pcb/empty-changes) (cll/generate-component-swap (pcb/empty-changes)
(:objects page) (:objects page)
copy copy
(:data file) (:data file)
page page
libraries libraries
(:id component-2) (:id component-2)
0 0
nil nil
{}) {})
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
libraries' {(:id file') file'} libraries' {(:id file') file'}
@ -137,27 +135,27 @@
;; Action ;; Action
[new-shape all-parents changes-swap] [new-shape all-parents changes-swap]
(cflh/generate-component-swap (pcb/empty-changes) (cll/generate-component-swap (pcb/empty-changes)
(:objects page) (:objects page)
copy copy
(:data file) (:data file)
page page
{(:id file) file} {(:id file) file}
(:id component-2) (:id component-2)
0 0
nil nil
{}) {})
file-swap (thf/apply-changes file changes-swap) file-swap (thf/apply-changes file changes-swap)
page-swap (thf/current-page file-swap) page-swap (thf/current-page file-swap)
changes changes
(cflh/generate-reset-component (pcb/empty-changes) (cll/generate-reset-component (pcb/empty-changes)
file-swap file-swap
{(:id file-swap) file-swap} {(:id file-swap) file-swap}
page-swap page-swap
(:id new-shape) (:id new-shape)
true) true)
file' (thf/apply-changes file changes) file' (thf/apply-changes file changes)
page' (thf/current-page file') page' (thf/current-page file')

View file

@ -13,13 +13,13 @@
[app.common.features :as cfeat] [app.common.features :as cfeat]
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.helpers :as cfh] [app.common.files.helpers :as cfh]
[app.common.files.libraries-helpers :as cflh]
[app.common.geom.align :as gal] [app.common.geom.align :as gal]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
[app.common.geom.proportions :as gpp] [app.common.geom.proportions :as gpp]
[app.common.geom.rect :as grc] [app.common.geom.rect :as grc]
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.common.geom.shapes.grid-layout :as gslg] [app.common.geom.shapes.grid-layout :as gslg]
[app.common.logic.shapes :as cls]
[app.common.schema :as sm] [app.common.schema :as sm]
[app.common.text :as txt] [app.common.text :as txt]
[app.common.transit :as t] [app.common.transit :as t]
@ -809,13 +809,13 @@
all-parents (into #{parent-id} (map #(cfh/get-parent-id objects %)) ids) all-parents (into #{parent-id} (map #(cfh/get-parent-id objects %)) ids)
parents (if ignore-parents? #{parent-id} all-parents) parents (if ignore-parents? #{parent-id} all-parents)
changes (cflh/generate-relocate-shapes (pcb/empty-changes it) changes (cls/generate-relocate-shapes (pcb/empty-changes it)
objects objects
parents parents
parent-id parent-id
page-id page-id
to-index to-index
ids) ids)
undo-id (js/Symbol)] undo-id (js/Symbol)]
(rx/of (dwu/start-undo-transaction undo-id) (rx/of (dwu/start-undo-transaction undo-id)

View file

@ -12,8 +12,8 @@
[app.common.files.changes :as cpc] [app.common.files.changes :as cpc]
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.helpers :as cph] [app.common.files.helpers :as cph]
[app.common.files.libraries-helpers :as cflh]
[app.common.logging :as log] [app.common.logging :as log]
[app.common.logic.shapes :as cls]
[app.common.schema :as sm] [app.common.schema :as sm]
[app.common.types.shape-tree :as ctst] [app.common.types.shape-tree :as ctst]
[app.common.uuid :as uuid] [app.common.uuid :as uuid]
@ -77,13 +77,13 @@
changes (-> (pcb/empty-changes it page-id) changes (-> (pcb/empty-changes it page-id)
(pcb/set-save-undo? save-undo?) (pcb/set-save-undo? save-undo?)
(pcb/set-stack-undo? stack-undo?) (pcb/set-stack-undo? stack-undo?)
(cflh/generate-update-shapes ids (cls/generate-update-shapes ids
update-fn update-fn
objects objects
{:attrs attrs {:attrs attrs
:ignore-tree ignore-tree :ignore-tree ignore-tree
:ignore-touched ignore-touched :ignore-touched ignore-touched
:with-objects? with-objects?}) :with-objects? with-objects?})
(cond-> undo-group (cond-> undo-group
(pcb/set-undo-group undo-group))) (pcb/set-undo-group undo-group)))

View file

@ -11,10 +11,11 @@
[app.common.files.changes :as ch] [app.common.files.changes :as ch]
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.helpers :as cfh] [app.common.files.helpers :as cfh]
[app.common.files.libraries-helpers :as cflh]
[app.common.files.shapes-helpers :as cfsh] [app.common.files.shapes-helpers :as cfsh]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
[app.common.logging :as log] [app.common.logging :as log]
[app.common.logic.libraries :as cll]
[app.common.logic.shapes :as cls]
[app.common.types.color :as ctc] [app.common.types.color :as ctc]
[app.common.types.component :as ctk] [app.common.types.component :as ctk]
[app.common.types.components-list :as ctkl] [app.common.types.components-list :as ctkl]
@ -351,9 +352,9 @@
parents (into #{} (map :parent-id) shapes)] parents (into #{} (map :parent-id) shapes)]
(when-not (empty? shapes) (when-not (empty? shapes)
(let [[root _ changes] (let [[root _ changes]
(cflh/generate-add-component (pcb/empty-changes it) shapes objects page-id file-id components-v2 (cll/generate-add-component (pcb/empty-changes it) shapes objects page-id file-id components-v2
dwg/prepare-create-group dwg/prepare-create-group
cfsh/prepare-create-artboard-from-selection)] cfsh/prepare-create-artboard-from-selection)]
(when-not (empty? (:redo-changes changes)) (when-not (empty? (:redo-changes changes))
(rx/of (dch/commit-changes changes) (rx/of (dch/commit-changes changes)
(dws/select-shapes (d/ordered-set (:id root))) (dws/select-shapes (d/ordered-set (:id root)))
@ -417,7 +418,7 @@
(let [library-data (get state :workspace-data) (let [library-data (get state :workspace-data)
components-v2 (features/active-feature? state "components/v2") components-v2 (features/active-feature? state "components/v2")
changes (-> (pcb/empty-changes it) changes (-> (pcb/empty-changes it)
(cflh/generate-rename-component id new-name library-data components-v2))] (cll/generate-rename-component id new-name library-data components-v2))]
(rx/of (dch/commit-changes changes)))))))) (rx/of (dch/commit-changes changes))))))))
@ -452,7 +453,7 @@
library (get libraries library-id) library (get libraries library-id)
components-v2 (features/active-feature? state "components/v2") components-v2 (features/active-feature? state "components/v2")
changes (-> (pcb/empty-changes it nil) changes (-> (pcb/empty-changes it nil)
(cflh/generate-duplicate-component library component-id components-v2))] (cll/generate-duplicate-component library component-id components-v2))]
(rx/of (dch/commit-changes changes)))))) (rx/of (dch/commit-changes changes))))))
@ -478,9 +479,9 @@
[all-parents changes] [all-parents changes]
(-> (pcb/empty-changes it page-id) (-> (pcb/empty-changes it page-id)
;; Deleting main root triggers component delete ;; Deleting main root triggers component delete
(cflh/generate-delete-shapes file page objects #{root-id} {:components-v2 components-v2 (cls/generate-delete-shapes file page objects #{root-id} {:components-v2 components-v2
:undo-group undo-group :undo-group undo-group
:undo-id undo-id}))] :undo-id undo-id}))]
(rx/of (rx/of
(dwu/start-undo-transaction undo-id) (dwu/start-undo-transaction undo-id)
(dwt/clear-thumbnail (:current-file-id state) page-id root-id "component") (dwt/clear-thumbnail (:current-file-id state) page-id root-id "component")
@ -508,7 +509,7 @@
library-data (wsh/get-file state library-id) library-data (wsh/get-file state library-id)
objects (wsh/lookup-page-objects state page-id) objects (wsh/lookup-page-objects state page-id)
changes (-> (pcb/empty-changes it) changes (-> (pcb/empty-changes it)
(cflh/generate-restore-component library-data component-id library-id current-page objects))] (cll/generate-restore-component library-data component-id library-id current-page objects))]
(rx/of (dch/commit-changes changes)))))) (rx/of (dch/commit-changes changes))))))
@ -545,13 +546,13 @@
(pcb/with-objects objects)) (pcb/with-objects objects))
[new-shape changes] [new-shape changes]
(cflh/generate-instantiate-component changes (cll/generate-instantiate-component changes
objects objects
file-id file-id
component-id component-id
position position
page page
libraries) libraries)
undo-id (js/Symbol)] undo-id (js/Symbol)]
(rx/of (dwu/start-undo-transaction undo-id) (rx/of (dwu/start-undo-transaction undo-id)
(dch/commit-changes changes) (dch/commit-changes changes)
@ -574,7 +575,7 @@
libraries (wsh/get-libraries state) libraries (wsh/get-libraries state)
changes (-> (pcb/empty-changes it) changes (-> (pcb/empty-changes it)
(cflh/generate-detach-component id file page-id libraries))] (cll/generate-detach-component id file page-id libraries))]
(rx/of (dch/commit-changes changes)))))) (rx/of (dch/commit-changes changes))))))
@ -610,7 +611,7 @@
changes (when can-detach? changes (when can-detach?
(reduce (reduce
(fn [changes id] (fn [changes id]
(cflh/generate-detach-instance changes container libraries id)) (cll/generate-detach-instance changes container libraries id))
(pcb/empty-changes it) (pcb/empty-changes it)
selected))] selected))]
@ -696,7 +697,7 @@
changes changes
(-> (pcb/empty-changes it) (-> (pcb/empty-changes it)
(cflh/generate-reset-component file-full libraries container id components-v2))] (cll/generate-reset-component file-full libraries container id components-v2))]
(log/debug :msg "RESET-COMPONENT finished" :js/rchanges (log-changes (log/debug :msg "RESET-COMPONENT finished" :js/rchanges (log-changes
(:redo-changes changes) (:redo-changes changes)
@ -751,7 +752,7 @@
(-> (pcb/empty-changes it) (-> (pcb/empty-changes it)
(pcb/set-undo-group undo-group) (pcb/set-undo-group undo-group)
(pcb/with-container container) (pcb/with-container container)
(cflh/generate-sync-shape-inverse full-file libraries container id components-v2)) (cll/generate-sync-shape-inverse full-file libraries container id components-v2))
file-id (:component-file shape) file-id (:component-file shape)
file (wsh/get-file state file-id) file (wsh/get-file state file-id)
@ -890,7 +891,7 @@
[new-shape all-parents changes] [new-shape all-parents changes]
(-> (pcb/empty-changes it (:id page)) (-> (pcb/empty-changes it (:id page))
(pcb/set-undo-group undo-group) (pcb/set-undo-group undo-group)
(cflh/generate-component-swap objects shape file page libraries id-new-component index target-cell keep-props-values))] (cll/generate-component-swap objects shape file page libraries id-new-component index target-cell keep-props-values))]
(rx/of (rx/of
(dwu/start-undo-transaction undo-id) (dwu/start-undo-transaction undo-id)
@ -976,7 +977,7 @@
libraries (wsh/get-libraries state) libraries (wsh/get-libraries state)
current-file-id (:current-file-id state) current-file-id (:current-file-id state)
changes (cflh/generate-sync-file-changes changes (cll/generate-sync-file-changes
(pcb/empty-changes it) (pcb/empty-changes it)
undo-group undo-group
asset-type asset-type

View file

@ -11,10 +11,10 @@
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.focus :as cpf] [app.common.files.focus :as cpf]
[app.common.files.helpers :as cfh] [app.common.files.helpers :as cfh]
[app.common.files.libraries-helpers :as cflh]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
[app.common.geom.rect :as grc] [app.common.geom.rect :as grc]
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.common.logic.libraries :as cll]
[app.common.record :as cr] [app.common.record :as cr]
[app.common.types.component :as ctk] [app.common.types.component :as ctk]
[app.common.types.container :as ctn] [app.common.types.container :as ctn]
@ -434,20 +434,20 @@
(gpt/subtract (-> origin-frame :selrect gpt/point))) (gpt/subtract (-> origin-frame :selrect gpt/point)))
instantiate-component instantiate-component
#(cflh/generate-instantiate-component changes #(cll/generate-instantiate-component changes
objects objects
file-id file-id
(:component-id component-root) (:component-id component-root)
pos pos
page page
libraries libraries
(:id component-root) (:id component-root)
parent-id parent-id
frame-id frame-id
{}) {})
restore-component restore-component
#(let [restore (cflh/prepare-restore-component changes library-data (:component-id component-root) page delta (:id component-root) parent-id frame-id)] #(let [restore (cll/prepare-restore-component changes library-data (:component-id component-root) page delta (:id component-root) parent-id frame-id)]
[(:shape restore) (:changes restore)]) [(:shape restore) (:changes restore)])
[_shape changes] [_shape changes]
@ -498,7 +498,7 @@
regenerate-component regenerate-component
(fn [changes shape] (fn [changes shape]
(let [components-v2 (dm/get-in library-data [:options :components-v2]) (let [components-v2 (dm/get-in library-data [:options :components-v2])
[_ changes] (cflh/generate-add-component-changes changes shape objects file-id (:id page) components-v2)] [_ changes] (cll/generate-add-component-changes changes shape objects file-id (:id page) components-v2)]
changes)) changes))
new-obj new-obj

View file

@ -10,8 +10,8 @@
[app.common.data.macros :as dm] [app.common.data.macros :as dm]
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.helpers :as cfh] [app.common.files.helpers :as cfh]
[app.common.files.libraries-helpers :as cflh]
[app.common.files.shapes-helpers :as cfsh] [app.common.files.shapes-helpers :as cfsh]
[app.common.logic.shapes :as cls]
[app.common.schema :as sm] [app.common.schema :as sm]
[app.common.types.container :as ctn] [app.common.types.container :as ctn]
[app.common.types.shape :as cts] [app.common.types.shape :as cts]
@ -105,10 +105,10 @@
components-v2 (features/active-feature? state "components/v2") components-v2 (features/active-feature? state "components/v2")
undo-id (or (:undo-id options) (js/Symbol)) undo-id (or (:undo-id options) (js/Symbol))
[all-parents changes] (-> (pcb/empty-changes it (:id page)) [all-parents changes] (-> (pcb/empty-changes it (:id page))
(cflh/generate-delete-shapes file page objects ids {:components-v2 components-v2 (cls/generate-delete-shapes file page objects ids {:components-v2 components-v2
:ignore-touched (:component-swap options) :ignore-touched (:component-swap options)
:undo-group (:undo-group options) :undo-group (:undo-group options)
:undo-id undo-id}))] :undo-id undo-id}))]
(rx/of (dwu/start-undo-transaction undo-id) (rx/of (dwu/start-undo-transaction undo-id)
(dc/detach-comment-thread ids) (dc/detach-comment-thread ids)

View file

@ -11,7 +11,6 @@
[app.common.data.macros :as dm] [app.common.data.macros :as dm]
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.helpers :as cfh] [app.common.files.helpers :as cfh]
[app.common.files.libraries-helpers :as cflh]
[app.common.geom.matrix :as gmt] [app.common.geom.matrix :as gmt]
[app.common.geom.modifiers :as gm] [app.common.geom.modifiers :as gm]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
@ -19,6 +18,7 @@
[app.common.geom.shapes :as gsh] [app.common.geom.shapes :as gsh]
[app.common.geom.shapes.flex-layout :as gslf] [app.common.geom.shapes.flex-layout :as gslf]
[app.common.geom.shapes.grid-layout :as gslg] [app.common.geom.shapes.grid-layout :as gslg]
[app.common.logic.shapes :as cls]
[app.common.math :as mth] [app.common.math :as mth]
[app.common.types.component :as ctk] [app.common.types.component :as ctk]
[app.common.types.container :as ctn] [app.common.types.container :as ctn]
@ -839,7 +839,7 @@
(watch [it state _] (watch [it state _]
(let [page-id (:current-page-id state) (let [page-id (:current-page-id state)
objects (wsh/lookup-page-objects state page-id) objects (wsh/lookup-page-objects state page-id)
changes (cflh/generate-move-shapes-to-frame (pcb/empty-changes it) ids frame-id page-id objects drop-index cell)] changes (cls/generate-move-shapes-to-frame (pcb/empty-changes it) ids frame-id page-id objects drop-index cell)]
(when (and (some? frame-id) (d/not-empty? changes)) (when (and (some? frame-id) (d/not-empty? changes))
(rx/of (dch/commit-changes changes) (rx/of (dch/commit-changes changes)

View file

@ -9,9 +9,9 @@
[app.common.files.changes :as cp] [app.common.files.changes :as cp]
[app.common.files.changes-builder :as pcb] [app.common.files.changes-builder :as pcb]
[app.common.files.helpers :as cfh] [app.common.files.helpers :as cfh]
[app.common.files.libraries-helpers :as cflh]
[app.common.files.shapes-helpers :as cfsh] [app.common.files.shapes-helpers :as cfsh]
[app.common.geom.point :as gpt] [app.common.geom.point :as gpt]
[app.common.logic.libraries :as cll]
[app.common.types.shape :as cts] [app.common.types.shape :as cts]
[app.common.uuid :as uuid] [app.common.uuid :as uuid]
[app.main.data.workspace.groups :as dwg] [app.main.data.workspace.groups :as dwg]
@ -132,14 +132,14 @@
shapes (dwg/shapes-for-grouping objects shape-ids) shapes (dwg/shapes-for-grouping objects shape-ids)
[group component-id changes] [group component-id changes]
(cflh/generate-add-component (pcb/empty-changes nil) (cll/generate-add-component (pcb/empty-changes nil)
shapes shapes
(:objects page) (:objects page)
(:id page) (:id page)
current-file-id current-file-id
true true
dwg/prepare-create-group dwg/prepare-create-group
cfsh/prepare-create-artboard-from-selection)] cfsh/prepare-create-artboard-from-selection)]
(swap! idmap assoc instance-label (:id group) (swap! idmap assoc instance-label (:id group)
component-label component-id) component-label component-id)
@ -158,13 +158,13 @@
(pcb/with-objects objects)) (pcb/with-objects objects))
[new-shape changes] [new-shape changes]
(cflh/generate-instantiate-component changes (cll/generate-instantiate-component changes
objects objects
file-id file-id
component-id component-id
(gpt/point 100 100) (gpt/point 100 100)
page page
libraries)] libraries)]
(swap! idmap assoc label (:id new-shape)) (swap! idmap assoc label (:id new-shape))
(update state :workspace-data (update state :workspace-data