🐛 Fix export from shared prototype

This commit is contained in:
Alejandro Alonso 2023-07-04 11:25:10 +02:00 committed by Alonso Torres
parent 0d87dc5680
commit 009236bbe3
15 changed files with 69 additions and 47 deletions

View file

@ -34,6 +34,9 @@
- Fix problem with selection shortcuts [Taiga #5492](https://tree.taiga.io/project/penpot/issue/5492) - Fix problem with selection shortcuts [Taiga #5492](https://tree.taiga.io/project/penpot/issue/5492)
- Fix issue with paths line to curve and concurrent editing [Taiga #5191](https://tree.taiga.io/project/penpot/issue/5191) - Fix issue with paths line to curve and concurrent editing [Taiga #5191](https://tree.taiga.io/project/penpot/issue/5191)
- Fix problems with locked layers [Taiga #5139](https://tree.taiga.io/project/penpot/issue/5139) - Fix problems with locked layers [Taiga #5139](https://tree.taiga.io/project/penpot/issue/5139)
- Fix export from shared prototype [Taiga #5565](https://tree.taiga.io/project/penpot/issue/5565)
### :arrow_up: Deps updates
### :heart: Community contributions by (Thank you!) ### :heart: Community contributions by (Thank you!)

View file

@ -512,6 +512,7 @@
[:map {:title "GetPage"} [:map {:title "GetPage"}
[:file-id ::sm/uuid] [:file-id ::sm/uuid]
[:page-id {:optional true} ::sm/uuid] [:page-id {:optional true} ::sm/uuid]
[:share-id {:optional true} ::sm/uuid]
[:object-id {:optional true} ::sm/uuid] [:object-id {:optional true} ::sm/uuid]
[:features {:optional true} ::features]]) [:features {:optional true} ::features]])
@ -527,14 +528,12 @@
Mainly used for rendering purposes." Mainly used for rendering purposes."
{::doc/added "1.17" {::doc/added "1.17"
::sm/params ::get-page} ::sm/params ::get-page}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}] [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id share-id] :as params}]
(dm/with-open [conn (db/open pool)] (dm/with-open [conn (db/open pool)]
(check-read-permissions! conn profile-id file-id) (let [perms (get-permissions conn profile-id file-id share-id)]
(check-read-permissions! perms)
(binding [pmap/*load-fn* (partial load-pointer conn file-id)] (binding [pmap/*load-fn* (partial load-pointer conn file-id)]
(get-page conn params)))) (get-page conn params)))))
;; --- COMMAND QUERY: get-team-shared-files ;; --- COMMAND QUERY: get-team-shared-files

View file

@ -36,6 +36,7 @@
(s/def ::id ::us/uuid) (s/def ::id ::us/uuid)
(s/def ::name ::us/not-empty-string) (s/def ::name ::us/not-empty-string)
(s/def ::project-id ::us/uuid) (s/def ::project-id ::us/uuid)
(s/def ::share-id ::us/uuid)
(s/def ::style valid-style) (s/def ::style valid-style)
(s/def ::team-id ::us/uuid) (s/def ::team-id ::us/uuid)
(s/def ::weight valid-weight) (s/def ::weight valid-weight)
@ -47,7 +48,8 @@
(s/keys :req [::rpc/profile-id] (s/keys :req [::rpc/profile-id]
:opt-un [::team-id :opt-un [::team-id
::file-id ::file-id
::project-id]) ::project-id
::share-id])
(fn [o] (fn [o]
(or (contains? o :team-id) (or (contains? o :team-id)
(contains? o :file-id) (contains? o :file-id)
@ -55,7 +57,7 @@
(sv/defmethod ::get-font-variants (sv/defmethod ::get-font-variants
{::doc/added "1.18"} {::doc/added "1.18"}
[{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id team-id file-id project-id] :as params}] [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id team-id file-id project-id share-id] :as params}]
(dm/with-open [conn (db/open pool)] (dm/with-open [conn (db/open pool)]
(cond (cond
(uuid? team-id) (uuid? team-id)
@ -74,8 +76,9 @@
(uuid? file-id) (uuid? file-id)
(let [file (db/get-by-id conn :file file-id {:columns [:id :project-id]}) (let [file (db/get-by-id conn :file file-id {:columns [:id :project-id]})
project (db/get-by-id conn :project (:project-id file) {:columns [:id :team-id]})] project (db/get-by-id conn :project (:project-id file) {:columns [:id :team-id]})
(files/check-read-permissions! conn profile-id file-id) perms (files/get-permissions conn profile-id file-id share-id)]
(files/check-read-permissions! perms)
(db/query conn :team-font-variant (db/query conn :team-font-variant
{:team-id (:team-id project) {:team-id (:team-id project)
:deleted-at nil}))))) :deleted-at nil})))))

View file

@ -28,6 +28,7 @@
(s/def ::name ::us/string) (s/def ::name ::us/string)
(s/def ::object-id ::us/uuid) (s/def ::object-id ::us/uuid)
(s/def ::page-id ::us/uuid) (s/def ::page-id ::us/uuid)
(s/def ::share-id ::us/uuid)
(s/def ::profile-id ::us/uuid) (s/def ::profile-id ::us/uuid)
(s/def ::scale ::us/number) (s/def ::scale ::us/number)
(s/def ::suffix ::us/string) (s/def ::suffix ::us/string)
@ -35,7 +36,8 @@
(s/def ::wait ::us/boolean) (s/def ::wait ::us/boolean)
(s/def ::export (s/def ::export
(s/keys :req-un [::page-id ::file-id ::object-id ::type ::suffix ::scale ::name])) (s/keys :req-un [::page-id ::file-id ::object-id ::type ::suffix ::scale ::name]
:opt-un [::share-id]))
(s/def ::exports (s/def ::exports
(s/coll-of ::export :kind vector? :min-count 1)) (s/coll-of ::export :kind vector? :min-count 1))
@ -89,7 +91,6 @@
proc (-> (rd/render export on-progress) proc (-> (rd/render export on-progress)
(p/then (constantly resource)) (p/then (constantly resource))
(p/catch on-error))] (p/catch on-error))]
(if wait (if wait
(p/then proc #(assoc exchange :response/body (dissoc % :path))) (p/then proc #(assoc exchange :response/body (dissoc % :path)))
(assoc exchange :response/body (dissoc resource :path))))) (assoc exchange :response/body (dissoc resource :path)))))
@ -188,6 +189,7 @@
(process-partition [[part1 :as part]] (process-partition [[part1 :as part]]
{:file-id (:file-id part1) {:file-id (:file-id part1)
:page-id (:page-id part1) :page-id (:page-id part1)
:share-id (:share-id part1)
:name (:name part1) :name (:name part1)
:token token :token token
:type (:type part1) :type (:type part1)

View file

@ -18,12 +18,14 @@
(s/def ::type #{:jpeg :png :pdf :svg}) (s/def ::type #{:jpeg :png :pdf :svg})
(s/def ::page-id ::us/uuid) (s/def ::page-id ::us/uuid)
(s/def ::file-id ::us/uuid) (s/def ::file-id ::us/uuid)
(s/def ::share-id ::us/uuid)
(s/def ::scale ::us/number) (s/def ::scale ::us/number)
(s/def ::token ::us/string) (s/def ::token ::us/string)
(s/def ::filename ::us/string) (s/def ::filename ::us/string)
(s/def ::object (s/def ::object
(s/keys :req-un [::id ::name ::suffix ::filename])) (s/keys :req-un [::id ::name ::suffix ::filename]
:opt-un [::share-id]))
(s/def ::objects (s/def ::objects
(s/coll-of ::object :min-count 1)) (s/coll-of ::object :min-count 1))

View file

@ -17,7 +17,7 @@
[promesa.core :as p])) [promesa.core :as p]))
(defn render (defn render
[{:keys [file-id page-id token scale type objects] :as params} on-object] [{:keys [file-id page-id share-id token scale type objects] :as params} on-object]
(letfn [(prepare-options [uri] (letfn [(prepare-options [uri]
#js {:screen #js {:width bw/default-viewport-width #js {:screen #js {:width bw/default-viewport-width
:height bw/default-viewport-height} :height bw/default-viewport-height}
@ -48,9 +48,9 @@
;; take the screnshot of requested objects, one by one ;; take the screnshot of requested objects, one by one
(p/run! (partial render-object page) objects) (p/run! (partial render-object page) objects)
nil))] nil))]
(p/let [params {:file-id file-id (p/let [params {:file-id file-id
:page-id page-id :page-id page-id
:share-id share-id
:object-id (mapv :id objects) :object-id (mapv :id objects)
:route "objects"} :route "objects"}
uri (-> (cf/get :public-uri) uri (-> (cf/get :public-uri)

View file

@ -17,7 +17,7 @@
[promesa.core :as p])) [promesa.core :as p]))
(defn render (defn render
[{:keys [file-id page-id token scale type objects] :as params} on-object] [{:keys [file-id page-id share-id token scale type objects] :as params} on-object]
(letfn [(prepare-options [uri] (letfn [(prepare-options [uri]
#js {:screen #js {:width bw/default-viewport-width #js {:screen #js {:width bw/default-viewport-width
:height bw/default-viewport-height} :height bw/default-viewport-height}
@ -31,6 +31,7 @@
(prepare-uri [base-uri object-id] (prepare-uri [base-uri object-id]
(let [params {:file-id file-id (let [params {:file-id file-id
:page-id page-id :page-id page-id
:share-id share-id
:object-id object-id :object-id object-id
:route "objects"}] :route "objects"}]
(-> base-uri (-> base-uri

View file

@ -108,7 +108,7 @@
:height height})) :height height}))
(defn render (defn render
[{:keys [page-id file-id objects token scale type]} on-object] [{:keys [page-id file-id share-id objects token scale type]} on-object]
(letfn [(convert-to-ppm [pngpath] (letfn [(convert-to-ppm [pngpath]
(let [ppmpath (str/concat pngpath "origin.ppm")] (let [ppmpath (str/concat pngpath "origin.ppm")]
(l/trace :fn :convert-to-ppm :path ppmpath) (l/trace :fn :convert-to-ppm :path ppmpath)
@ -338,9 +338,9 @@
;; take the screnshot of requested objects, one by one ;; take the screnshot of requested objects, one by one
(p/run! (partial render-object page) objects) (p/run! (partial render-object page) objects)
nil))] nil))]
(p/let [params {:file-id file-id (p/let [params {:file-id file-id
:page-id page-id :page-id page-id
:share-id share-id
:render-embed true :render-embed true
:object-id (mapv :id objects) :object-id (mapv :id objects)
:route "objects"} :route "objects"}

View file

@ -75,7 +75,7 @@
{:exports (vec exports)}))))))) {:exports (vec exports)})))))))
(defn show-viewer-export-dialog (defn show-viewer-export-dialog
[{:keys [shapes page-id file-id exports]}] [{:keys [shapes page-id file-id share-id exports]}]
(ptk/reify ::show-viewer-export-dialog (ptk/reify ::show-viewer-export-dialog
ptk/WatchEvent ptk/WatchEvent
(watch [_ _ _] (watch [_ _ _]
@ -87,8 +87,9 @@
(assoc :file-id file-id) (assoc :file-id file-id)
(assoc :object-id (:id shape)) (assoc :object-id (:id shape))
(assoc :shape (dissoc shape :exports)) (assoc :shape (dissoc shape :exports))
(assoc :name (:name shape))))] (assoc :name (:name shape))
(rx/of (modal/show :export-shapes {:exports (vec exports)})))))) (cond-> share-id (assoc :share-id share-id))))]
(rx/of (modal/show :export-shapes {:exports (vec exports)})))))) #_TODO
(defn show-workspace-export-frames-dialog (defn show-workspace-export-frames-dialog
[frames] [frames]

View file

@ -215,7 +215,7 @@
(mf/defc viewer (mf/defc viewer
[{:keys [params data]}] [{:keys [params data]}]
(let [{:keys [page-id section index interactions-mode]} params (let [{:keys [page-id share-id section index interactions-mode]} params
{:keys [file users project permissions]} data {:keys [file users project permissions]} data
allowed (or allowed (or
@ -519,7 +519,8 @@
:size size :size size
:index index :index index
:viewer-pagination viewer-pagination :viewer-pagination viewer-pagination
:interactions-mode interactions-mode}] :interactions-mode interactions-mode
:share-id share-id}]
[:& (mf/provider ctx/current-zoom) {:value zoom} [:& (mf/provider ctx/current-zoom) {:value zoom}

View file

@ -35,7 +35,7 @@
(dom/add-class! layout "force-visible")))))) (dom/add-class! layout "force-visible"))))))
(mf/defc viewport (mf/defc viewport
[{:keys [local file page frame index viewer-pagination size]}] [{:keys [local file page frame index viewer-pagination size share-id]}]
(let [inspect-svg-container-ref (mf/use-ref nil) (let [inspect-svg-container-ref (mf/use-ref nil)
on-mouse-wheel on-mouse-wheel
(fn [event] (fn [event]
@ -76,4 +76,5 @@
[:& right-sidebar {:frame frame [:& right-sidebar {:frame frame
:selected (:selected local) :selected (:selected local)
:page page :page page
:file file}]])) :file file
:share-id share-id}]]))

View file

@ -34,7 +34,7 @@
:text [:layout :text :shadow :blur :stroke :layout-flex-item]}) :text [:layout :text :shadow :blur :stroke :layout-flex-item]})
(mf/defc attributes (mf/defc attributes
[{:keys [page-id file-id shapes frame from libraries]}] [{:keys [page-id file-id shapes frame from libraries share-id]}]
(let [shapes (hooks/use-equal-memo shapes) (let [shapes (hooks/use-equal-memo shapes)
shapes (mf/with-memo [shapes] shapes (mf/with-memo [shapes]
(mapv #(gsh/translate-to-frame % frame) shapes)) (mapv #(gsh/translate-to-frame % frame) shapes))
@ -66,4 +66,5 @@
{:shapes shapes {:shapes shapes
:type type :type type
:page-id page-id :page-id page-id
:file-id file-id}]])) :file-id file-id
:share-id share-id}]]))

View file

@ -17,7 +17,7 @@
(mf/defc exports (mf/defc exports
{::mf/wrap [#(mf/memo % =)]} {::mf/wrap [#(mf/memo % =)]}
[{:keys [shapes page-id file-id type] :as props}] [{:keys [shapes page-id file-id share-id type] :as props}]
(let [exports (mf/use-state []) (let [exports (mf/use-state [])
xstate (mf/deref refs/export) xstate (mf/deref refs/export)
vstate (mf/deref refs/viewer-data) vstate (mf/deref refs/viewer-data)
@ -40,15 +40,17 @@
:exports @exports :exports @exports
:filename filename :filename filename
:page-id page-id :page-id page-id
:file-id file-id})) :file-id file-id
:share-id share-id}))
;; In other all cases we only allowed to have a single ;; In other all cases we only allowed to have a single
;; shape-id because multiple shape-ids are handled ;; shape-id because multiple shape-ids are handled
;; separately by the export-modal. ;; separately by the export-modal.
(let [defaults {:page-id page-id (let [defaults (-> {:page-id page-id
:file-id file-id :file-id file-id
:name filename :name filename
:object-id (-> shapes first :id)} :object-id (-> shapes first :id)}
(cond-> share-id (assoc :share-id share-id)))
exports (mapv #(merge % defaults) @exports)] exports (mapv #(merge % defaults) @exports)]
(if (= 1 (count exports)) (if (= 1 (count exports))
(st/emit! (de/request-simple-export {:export (first exports)})) (st/emit! (de/request-simple-export {:export (first exports)}))

View file

@ -38,7 +38,7 @@
:data local}))))) :data local})))))
(mf/defc right-sidebar (mf/defc right-sidebar
[{:keys [frame page file selected shapes page-id file-id from] [{:keys [frame page file selected shapes page-id file-id share-id from]
:or {from :inspect}}] :or {from :inspect}}]
(let [expanded (mf/use-state false) (let [expanded (mf/use-state false)
section (mf/use-state :info #_:code) section (mf/use-state :info #_:code)
@ -89,7 +89,8 @@
:frame frame :frame frame
:shapes shapes :shapes shapes
:from from :from from
:libraries libraries}]] :libraries libraries
:share-id share-id}]]
[:& tabs-element {:id :code :title (tr "inspect.tabs.code")} [:& tabs-element {:id :code :title (tr "inspect.tabs.code")}
[:& code {:frame frame [:& code {:frame frame

View file

@ -95,16 +95,17 @@
state)) state))
(mf/defc object-svg (mf/defc object-svg
[{:keys [page-id file-id object-id render-embed?]}] [{:keys [page-id file-id share-id object-id render-embed?]}]
(let [components-v2 (feat/use-feature :components-v2) (let [components-v2 (feat/use-feature :components-v2)
fetch-state (mf/use-fn fetch-state (mf/use-fn
(mf/deps file-id page-id object-id components-v2) (mf/deps file-id page-id share-id object-id components-v2)
(fn [] (fn []
(let [features (cond-> #{} components-v2 (conj "components/v2"))] (let [features (cond-> #{} components-v2 (conj "components/v2"))]
(->> (rx/zip (->> (rx/zip
(repo/cmd! :get-font-variants {:file-id file-id}) (repo/cmd! :get-font-variants {:file-id file-id :share-id share-id})
(repo/cmd! :get-page {:file-id file-id (repo/cmd! :get-page {:file-id file-id
:page-id page-id :page-id page-id
:share-id share-id
:object-id object-id :object-id object-id
:features features})) :features features}))
(rx/tap (fn [[fonts]] (rx/tap (fn [[fonts]]
@ -135,16 +136,17 @@
:render-embed? render-embed?}]))) :render-embed? render-embed?}])))
(mf/defc objects-svg (mf/defc objects-svg
[{:keys [page-id file-id object-ids render-embed?]}] [{:keys [page-id file-id share-id object-ids render-embed?]}]
(let [components-v2 (feat/use-feature :components-v2) (let [components-v2 (feat/use-feature :components-v2)
fetch-state (mf/use-fn fetch-state (mf/use-fn
(mf/deps file-id page-id components-v2) (mf/deps file-id page-id share-id components-v2)
(fn [] (fn []
(let [features (cond-> #{} components-v2 (conj "components/v2"))] (let [features (cond-> #{} components-v2 (conj "components/v2"))]
(->> (rx/zip (->> (rx/zip
(repo/cmd! :get-font-variants {:file-id file-id}) (repo/cmd! :get-font-variants {:file-id file-id :share-id share-id})
(repo/cmd! :get-page {:file-id file-id (repo/cmd! :get-page {:file-id file-id
:page-id page-id :page-id page-id
:share-id share-id
:features features})) :features features}))
(rx/tap (fn [[fonts]] (rx/tap (fn [[fonts]]
(when (seq fonts) (when (seq fonts)
@ -164,6 +166,7 @@
(s/def ::page-id ::us/uuid) (s/def ::page-id ::us/uuid)
(s/def ::file-id ::us/uuid) (s/def ::file-id ::us/uuid)
(s/def ::share-id ::us/uuid)
(s/def ::object-id (s/def ::object-id
(s/or :single ::us/uuid (s/or :single ::us/uuid
:multiple (s/coll-of ::us/uuid))) :multiple (s/coll-of ::us/uuid)))
@ -171,24 +174,25 @@
(s/def ::render-objects (s/def ::render-objects
(s/keys :req-un [::file-id ::page-id ::object-id] (s/keys :req-un [::file-id ::page-id ::object-id]
:opt-un [::render-embed])) :opt-un [::render-embed ::share-id]))
(defn- render-objects (defn- render-objects
[params] [params]
(let [{:keys [file-id (let [{:keys [file-id
page-id page-id
render-embed] render-embed
share-id]
:as params} :as params}
(us/conform ::render-objects params) (us/conform ::render-objects params)
[type object-id] (:object-id params)] [type object-id] (:object-id params)]
(case type (case type
:single :single
(mf/html (mf/html
[:& object-svg [:& object-svg
{:file-id file-id {:file-id file-id
:page-id page-id :page-id page-id
:share-id share-id
:object-id object-id :object-id object-id
:render-embed? render-embed}]) :render-embed? render-embed}])
@ -197,6 +201,7 @@
[:& objects-svg [:& objects-svg
{:file-id file-id {:file-id file-id
:page-id page-id :page-id page-id
:share-id share-id
:object-ids (into #{} object-id) :object-ids (into #{} object-id)
:render-embed? render-embed}])))) :render-embed? render-embed}]))))