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

🐛 Add script for fix files with bad shape-ref

This commit is contained in:
Pablo Alba 2023-07-31 16:04:21 +02:00 committed by Andrés Moya
parent 228b09c340
commit 1bb3a3a084
5 changed files with 90 additions and 20 deletions

View file

@ -7,8 +7,14 @@
(ns app.srepl.fixes
"A collection of adhoc fixes scripts."
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.pages.helpers :as cph]
[app.common.types.component :as ctk]
[app.common.types.file :as ctf]
[app.common.uuid :as uuid]
[app.rpc.commands.files :as files]
[app.srepl.helpers :as h]))
(defn repair-orphaned-shapes
@ -72,4 +78,65 @@
([file state]
(rename-layout-attrs file)
(update state :total (fnil inc 0))))
(update state :total (fnil inc 0))))
(defn fix-components-shaperefs
[file]
(if-not (contains? (:features file) "components/v2")
(ex/raise :type :invalid-file
:code :invalid-file
:hint "this file is not v2")
(let [libs (->> (files/get-file-libraries app.srepl.helpers/*conn* (:id file))
(cons file)
(map #(files/get-file app.srepl.helpers/*conn* (:id %) (:features file)))
(d/index-by :id))
fix-copy-item
(fn fix-copy-item [allow-head shapes-copy shapes-base copy-id base-id]
(let [copy (first (filter #(= (:id %) copy-id) shapes-copy))
;; do nothing if it is a copy inside of a copy. It will be treated later
stop? (and (not allow-head) (ctk/instance-head? copy))
base (first (filter #(= (:id %) base-id) shapes-base))
fci (partial fix-copy-item false shapes-copy shapes-base)
updates (if (and
(not stop?)
(not= (:shape-ref copy) base-id))
[[(:id copy) base-id]]
[])
child-updates (if (and
(not stop?)
;; If the base has the same number of childrens than the copy, we asume
;; that the shaperefs can be fixed ad pointed in the same order
(= (count (:shapes copy)) (count (:shapes base))))
(apply concat (mapv fci (:shapes copy) (:shapes base)))
[])]
(concat updates child-updates)))
fix-copy
(fn [objects updates copy]
(let [component (ctf/find-component libs (:component-id copy) {:included-delete? true})
component-file (get libs (:component-file copy))
component-shapes (ctf/get-component-shapes (:data component-file) component)
copy-shapes (cph/get-children-with-self objects (:id copy))
copy-updates (fix-copy-item true copy-shapes component-shapes (:id copy) (:main-instance-id component))]
(concat updates copy-updates)))
update-page (fn [page]
(let [objects (:objects page)
fc (partial fix-copy objects)
copies (->> objects
vals
(filter #(and (ctk/instance-head? %) (not (ctk/main-instance? %)))))
updates (reduce fc [] copies)
updated-page (reduce (fn [p [id shape-ref]]
(assoc-in p [:objects id :shape-ref] shape-ref))
page
updates)]
(prn (str "Page " (:name page) " - Fixing " (count updates)))
updated-page))]
(prn (str "Updating " (:name file) " " (:id file)))
(update file :data h/update-pages update-page))))

View file

@ -112,13 +112,15 @@
;; Asset helpers
(defn find-component
"Retrieve a component from libraries, iterating over all of them."
[libraries component-id & {:keys [included-delete?] :or {included-delete? false}}]
(some #(ctkl/get-component (:data %) component-id included-delete?) (vals libraries)))
(defn get-component
"Retrieve a component from libraries, if no library-id is provided, we
iterate over all libraries and find the component on it."
([libraries component-id]
(some #(ctkl/get-component (:data %) component-id) (vals libraries)))
([libraries library-id component-id]
(ctkl/get-component (dm/get-in libraries [library-id :data]) component-id)))
"Retrieve a component from a library."
[libraries library-id component-id & {:keys [included-delete?] :or {included-delete? false}}]
(ctkl/get-component (dm/get-in libraries [library-id :data]) component-id included-delete?))
(defn get-component-library
"Retrieve the library the component belongs to."
@ -170,7 +172,8 @@
"Retrieve all shapes of the component"
[file-data component]
(let [components-v2 (dm/get-in file-data [:options :components-v2])]
(if components-v2
(if (and components-v2
(not (:deleted component))) ;; the deleted components have its children in the :objects property
(let [instance-page (get-component-page file-data component)]
(cph/get-children-with-self (:objects instance-page) (:main-instance-id component)))
(vals (:objects component)))))

View file

@ -82,7 +82,7 @@
[page root-inst-id libraries]
(let [root-inst (ctn/get-shape page root-inst-id)
component (ctf/get-component libraries (:component-id root-inst))
component (ctf/find-component libraries (:component-id root-inst))
shapes-inst (cph/get-children-with-self (:objects page) root-inst-id)
shapes-main (cph/get-children-with-self (:objects component) (:shape-ref root-inst))
@ -94,7 +94,7 @@
(ctn/get-component-shape (:objects page) shape)
component
(ctf/get-component libraries (:component-id component-shape))
(ctf/find-component libraries (:component-id component-shape))
main-shape
(ctn/get-shape component (:shape-ref shape))]
@ -118,7 +118,7 @@
[page root-inst-id libraries]
(let [root-inst (ctn/get-shape page root-inst-id)
component (ctf/get-component libraries (:component-id root-inst))
component (ctf/find-component libraries (:component-id root-inst))
shapes-inst (cph/get-children-with-self (:objects page) root-inst-id)
shapes-main (cph/get-children-with-self (:objects component) (:shape-ref root-inst))
@ -130,7 +130,7 @@
(ctn/get-component-shape (:objects page) shape)
component
(ctf/get-component libraries (:component-id component-shape))
(ctf/find-component libraries (:component-id component-shape))
main-shape
(ctn/get-shape component (:shape-ref shape))]
@ -145,7 +145,7 @@
(defn resolve-component
"Get the component with the given id and all its shapes."
[page component-id libraries]
(let [component (ctf/get-component libraries component-id)
(let [component (ctf/find-component libraries component-id)
root-main (ctk/get-component-root component)
shapes-main (cph/get-children-with-self (:objects component) (:id root-main))]

View file

@ -2291,7 +2291,6 @@
;; Components
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn find-components-norefs
[]
(ptk/reify ::find-components-norefs
@ -2300,7 +2299,8 @@
(let [objects (wsh/lookup-page-objects state)
copies (->> objects
vals
(filter #(and (:component-root %) (not (:main-instance %)))))
(filter #(and (ctk/instance-head? %) (not (ctk/main-instance? %)))))
copies-no-ref (filter #(not (:shape-ref %)) copies)
find-childs-no-ref (fn [acc-map item]
(let [id (:id item)
@ -2313,8 +2313,8 @@
find-childs-no-ref
{}
copies)]
(js/console.log "Copies no ref" (clj->js copies-no-ref))
(js/console.log "Childs no ref" (clj->js childs-no-ref))))))
(js/console.log "Copies no ref" (count copies-no-ref) (clj->js copies-no-ref))
(js/console.log "Childs no ref" (count childs-no-ref) (clj->js childs-no-ref))))))
(defn set-shape-ref
[id shape-ref]

View file

@ -112,7 +112,7 @@
main-instance? (:main-instance root-inst)
libs (wsh/get-libraries state)
component (ctf/get-component libs (:component-id root-inst))
component (ctf/find-component libs (:component-id root-inst))
library (ctf/get-component-library libs root-inst)
shapes-inst (cph/get-children-with-self (:objects page) root-inst-id)
@ -152,7 +152,7 @@
root-inst (ctn/get-shape page root-inst-id)
libs (wsh/get-libraries state)
component (ctf/get-component libs (:component-id root-inst))
component (ctf/find-component libs (:component-id root-inst))
library (ctf/get-component-library libs root-inst)
shapes-inst (cph/get-children-with-self (:objects page) root-inst-id)
@ -167,7 +167,7 @@
"Get the component with the given id and all its shapes."
[state component-id]
(let [libs (wsh/get-libraries state)
component (ctf/get-component libs component-id)
component (ctf/find-component libs component-id)
library (ctf/get-component-library libs component)
shapes-main (ctf/get-component-shapes (:data library) component)]