diff --git a/CHANGES.md b/CHANGES.md index 9de31fbe1..a0c6cf6a5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -34,6 +34,9 @@ - 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 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!) diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj index e3b88a8bc..c44c13aa4 100644 --- a/backend/src/app/rpc/commands/files.clj +++ b/backend/src/app/rpc/commands/files.clj @@ -512,6 +512,7 @@ [:map {:title "GetPage"} [:file-id ::sm/uuid] [:page-id {:optional true} ::sm/uuid] + [:share-id {:optional true} ::sm/uuid] [:object-id {:optional true} ::sm/uuid] [:features {:optional true} ::features]]) @@ -527,14 +528,12 @@ Mainly used for rendering purposes." {::doc/added "1.17" ::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)] - (check-read-permissions! conn profile-id file-id) - - (binding [pmap/*load-fn* (partial load-pointer conn file-id)] - (get-page conn params)))) - - + (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)] + (get-page conn params))))) ;; --- COMMAND QUERY: get-team-shared-files diff --git a/backend/src/app/rpc/commands/fonts.clj b/backend/src/app/rpc/commands/fonts.clj index 5aab17fde..256132e84 100644 --- a/backend/src/app/rpc/commands/fonts.clj +++ b/backend/src/app/rpc/commands/fonts.clj @@ -36,6 +36,7 @@ (s/def ::id ::us/uuid) (s/def ::name ::us/not-empty-string) (s/def ::project-id ::us/uuid) +(s/def ::share-id ::us/uuid) (s/def ::style valid-style) (s/def ::team-id ::us/uuid) (s/def ::weight valid-weight) @@ -47,7 +48,8 @@ (s/keys :req [::rpc/profile-id] :opt-un [::team-id ::file-id - ::project-id]) + ::project-id + ::share-id]) (fn [o] (or (contains? o :team-id) (contains? o :file-id) @@ -55,7 +57,7 @@ (sv/defmethod ::get-font-variants {::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)] (cond (uuid? team-id) @@ -74,11 +76,12 @@ (uuid? file-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]})] - (files/check-read-permissions! conn profile-id file-id) + project (db/get-by-id conn :project (:project-id file) {:columns [:id :team-id]}) + perms (files/get-permissions conn profile-id file-id share-id)] + (files/check-read-permissions! perms) (db/query conn :team-font-variant - {:team-id (:team-id project) - :deleted-at nil}))))) + {:team-id (:team-id project) + :deleted-at nil}))))) (declare create-font-variant) diff --git a/exporter/src/app/handlers/export_shapes.cljs b/exporter/src/app/handlers/export_shapes.cljs index 4a8e53dab..a8e108ae4 100644 --- a/exporter/src/app/handlers/export_shapes.cljs +++ b/exporter/src/app/handlers/export_shapes.cljs @@ -28,6 +28,7 @@ (s/def ::name ::us/string) (s/def ::object-id ::us/uuid) (s/def ::page-id ::us/uuid) +(s/def ::share-id ::us/uuid) (s/def ::profile-id ::us/uuid) (s/def ::scale ::us/number) (s/def ::suffix ::us/string) @@ -35,7 +36,8 @@ (s/def ::wait ::us/boolean) (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/coll-of ::export :kind vector? :min-count 1)) @@ -89,7 +91,6 @@ proc (-> (rd/render export on-progress) (p/then (constantly resource)) (p/catch on-error))] - (if wait (p/then proc #(assoc exchange :response/body (dissoc % :path))) (assoc exchange :response/body (dissoc resource :path))))) @@ -188,6 +189,7 @@ (process-partition [[part1 :as part]] {:file-id (:file-id part1) :page-id (:page-id part1) + :share-id (:share-id part1) :name (:name part1) :token token :type (:type part1) diff --git a/exporter/src/app/renderer.cljs b/exporter/src/app/renderer.cljs index 25d462a6c..b4abaca4b 100644 --- a/exporter/src/app/renderer.cljs +++ b/exporter/src/app/renderer.cljs @@ -18,12 +18,14 @@ (s/def ::type #{:jpeg :png :pdf :svg}) (s/def ::page-id ::us/uuid) (s/def ::file-id ::us/uuid) +(s/def ::share-id ::us/uuid) (s/def ::scale ::us/number) (s/def ::token ::us/string) (s/def ::filename ::us/string) (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/coll-of ::object :min-count 1)) diff --git a/exporter/src/app/renderer/bitmap.cljs b/exporter/src/app/renderer/bitmap.cljs index 074a826a7..38022db73 100644 --- a/exporter/src/app/renderer/bitmap.cljs +++ b/exporter/src/app/renderer/bitmap.cljs @@ -17,7 +17,7 @@ [promesa.core :as p])) (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] #js {:screen #js {:width bw/default-viewport-width :height bw/default-viewport-height} @@ -48,9 +48,9 @@ ;; take the screnshot of requested objects, one by one (p/run! (partial render-object page) objects) nil))] - (p/let [params {:file-id file-id :page-id page-id + :share-id share-id :object-id (mapv :id objects) :route "objects"} uri (-> (cf/get :public-uri) diff --git a/exporter/src/app/renderer/pdf.cljs b/exporter/src/app/renderer/pdf.cljs index a4f442c9f..1464f62f3 100644 --- a/exporter/src/app/renderer/pdf.cljs +++ b/exporter/src/app/renderer/pdf.cljs @@ -17,7 +17,7 @@ [promesa.core :as p])) (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] #js {:screen #js {:width bw/default-viewport-width :height bw/default-viewport-height} @@ -31,6 +31,7 @@ (prepare-uri [base-uri object-id] (let [params {:file-id file-id :page-id page-id + :share-id share-id :object-id object-id :route "objects"}] (-> base-uri diff --git a/exporter/src/app/renderer/svg.cljs b/exporter/src/app/renderer/svg.cljs index 277dac18d..ba3287a64 100644 --- a/exporter/src/app/renderer/svg.cljs +++ b/exporter/src/app/renderer/svg.cljs @@ -108,7 +108,7 @@ :height height})) (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] (let [ppmpath (str/concat pngpath "origin.ppm")] (l/trace :fn :convert-to-ppm :path ppmpath) @@ -338,9 +338,9 @@ ;; take the screnshot of requested objects, one by one (p/run! (partial render-object page) objects) nil))] - (p/let [params {:file-id file-id :page-id page-id + :share-id share-id :render-embed true :object-id (mapv :id objects) :route "objects"} diff --git a/frontend/src/app/main/data/exports.cljs b/frontend/src/app/main/data/exports.cljs index 1ad280bab..729d5d74f 100644 --- a/frontend/src/app/main/data/exports.cljs +++ b/frontend/src/app/main/data/exports.cljs @@ -75,7 +75,7 @@ {:exports (vec exports)}))))))) (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/WatchEvent (watch [_ _ _] @@ -87,8 +87,9 @@ (assoc :file-id file-id) (assoc :object-id (:id shape)) (assoc :shape (dissoc shape :exports)) - (assoc :name (:name shape))))] - (rx/of (modal/show :export-shapes {:exports (vec exports)})))))) + (assoc :name (:name shape)) + (cond-> share-id (assoc :share-id share-id))))] + (rx/of (modal/show :export-shapes {:exports (vec exports)})))))) #_TODO (defn show-workspace-export-frames-dialog [frames] diff --git a/frontend/src/app/main/ui/viewer.cljs b/frontend/src/app/main/ui/viewer.cljs index a9823e025..6df9120f1 100644 --- a/frontend/src/app/main/ui/viewer.cljs +++ b/frontend/src/app/main/ui/viewer.cljs @@ -215,7 +215,7 @@ (mf/defc viewer [{: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 allowed (or @@ -519,7 +519,8 @@ :size size :index index :viewer-pagination viewer-pagination - :interactions-mode interactions-mode}] + :interactions-mode interactions-mode + :share-id share-id}] [:& (mf/provider ctx/current-zoom) {:value zoom} diff --git a/frontend/src/app/main/ui/viewer/inspect.cljs b/frontend/src/app/main/ui/viewer/inspect.cljs index f1e901ad0..4faa90109 100644 --- a/frontend/src/app/main/ui/viewer/inspect.cljs +++ b/frontend/src/app/main/ui/viewer/inspect.cljs @@ -35,7 +35,7 @@ (dom/add-class! layout "force-visible")))))) (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) on-mouse-wheel (fn [event] @@ -76,4 +76,5 @@ [:& right-sidebar {:frame frame :selected (:selected local) :page page - :file file}]])) + :file file + :share-id share-id}]])) diff --git a/frontend/src/app/main/ui/viewer/inspect/attributes.cljs b/frontend/src/app/main/ui/viewer/inspect/attributes.cljs index 997b83a6c..19fc15311 100644 --- a/frontend/src/app/main/ui/viewer/inspect/attributes.cljs +++ b/frontend/src/app/main/ui/viewer/inspect/attributes.cljs @@ -34,7 +34,7 @@ :text [:layout :text :shadow :blur :stroke :layout-flex-item]}) (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) shapes (mf/with-memo [shapes] (mapv #(gsh/translate-to-frame % frame) shapes)) @@ -66,4 +66,5 @@ {:shapes shapes :type type :page-id page-id - :file-id file-id}]])) + :file-id file-id + :share-id share-id}]])) diff --git a/frontend/src/app/main/ui/viewer/inspect/exports.cljs b/frontend/src/app/main/ui/viewer/inspect/exports.cljs index 55f3a8397..fc8422f81 100644 --- a/frontend/src/app/main/ui/viewer/inspect/exports.cljs +++ b/frontend/src/app/main/ui/viewer/inspect/exports.cljs @@ -17,7 +17,7 @@ (mf/defc exports {::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 []) xstate (mf/deref refs/export) vstate (mf/deref refs/viewer-data) @@ -40,15 +40,17 @@ :exports @exports :filename filename :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 ;; shape-id because multiple shape-ids are handled ;; separately by the export-modal. - (let [defaults {:page-id page-id - :file-id file-id - :name filename - :object-id (-> shapes first :id)} + (let [defaults (-> {:page-id page-id + :file-id file-id + :name filename + :object-id (-> shapes first :id)} + (cond-> share-id (assoc :share-id share-id))) exports (mapv #(merge % defaults) @exports)] (if (= 1 (count exports)) (st/emit! (de/request-simple-export {:export (first exports)})) diff --git a/frontend/src/app/main/ui/viewer/inspect/right_sidebar.cljs b/frontend/src/app/main/ui/viewer/inspect/right_sidebar.cljs index c58123284..e3d03bc3f 100644 --- a/frontend/src/app/main/ui/viewer/inspect/right_sidebar.cljs +++ b/frontend/src/app/main/ui/viewer/inspect/right_sidebar.cljs @@ -38,7 +38,7 @@ :data local}))))) (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}}] (let [expanded (mf/use-state false) section (mf/use-state :info #_:code) @@ -89,7 +89,8 @@ :frame frame :shapes shapes :from from - :libraries libraries}]] + :libraries libraries + :share-id share-id}]] [:& tabs-element {:id :code :title (tr "inspect.tabs.code")} [:& code {:frame frame diff --git a/frontend/src/app/render.cljs b/frontend/src/app/render.cljs index 9f3db68af..20f6e0906 100644 --- a/frontend/src/app/render.cljs +++ b/frontend/src/app/render.cljs @@ -95,16 +95,17 @@ state)) (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) 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 [] (let [features (cond-> #{} components-v2 (conj "components/v2"))] (->> (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 :page-id page-id + :share-id share-id :object-id object-id :features features})) (rx/tap (fn [[fonts]] @@ -135,16 +136,17 @@ :render-embed? render-embed?}]))) (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) fetch-state (mf/use-fn - (mf/deps file-id page-id components-v2) + (mf/deps file-id page-id share-id components-v2) (fn [] (let [features (cond-> #{} components-v2 (conj "components/v2"))] (->> (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 :page-id page-id + :share-id share-id :features features})) (rx/tap (fn [[fonts]] (when (seq fonts) @@ -164,6 +166,7 @@ (s/def ::page-id ::us/uuid) (s/def ::file-id ::us/uuid) +(s/def ::share-id ::us/uuid) (s/def ::object-id (s/or :single ::us/uuid :multiple (s/coll-of ::us/uuid))) @@ -171,24 +174,25 @@ (s/def ::render-objects (s/keys :req-un [::file-id ::page-id ::object-id] - :opt-un [::render-embed])) + :opt-un [::render-embed ::share-id])) (defn- render-objects [params] (let [{:keys [file-id page-id - render-embed] + render-embed + share-id] :as params} (us/conform ::render-objects params) [type object-id] (:object-id params)] - (case type :single (mf/html [:& object-svg {:file-id file-id :page-id page-id + :share-id share-id :object-id object-id :render-embed? render-embed}]) @@ -197,6 +201,7 @@ [:& objects-svg {:file-id file-id :page-id page-id + :share-id share-id :object-ids (into #{} object-id) :render-embed? render-embed}]))))