diff --git a/exporter/src/app/handlers/export_shapes.cljs b/exporter/src/app/handlers/export_shapes.cljs index 348a68e4a..9327d2980 100644 --- a/exporter/src/app/handlers/export_shapes.cljs +++ b/exporter/src/app/handlers/export_shapes.cljs @@ -47,7 +47,7 @@ (s/def ::params (s/keys :req-un [::exports ::profile-id] - :opt-un [::wait ::name])) + :opt-un [::wait ::name ::skip-children])) (defn handler [{:keys [:request/auth-token] :as exchange} {:keys [exports] :as params}] @@ -60,7 +60,7 @@ (handle-multiple-export exchange (assoc params :exports exports))))) (defn- handle-single-export - [exchange {:keys [export wait profile-id name] :as params}] + [exchange {:keys [export wait profile-id name skip-children] :as params}] (let [topic (str profile-id) resource (rsc/create (:type export) (or name (:name export))) @@ -90,7 +90,7 @@ :resource-id (:id resource) :status "error" :cause (ex-message cause)}))) - + export (assoc export :skip-children skip-children) proc (-> (rd/render export on-progress) (p/then (constantly resource)) (p/catch on-error))] @@ -99,7 +99,7 @@ (assoc exchange :response/body (dissoc resource :path))))) (defn- handle-multiple-export - [exchange {:keys [exports wait profile-id name] :as params}] + [exchange {:keys [exports wait profile-id name skip-children] :as params}] (let [resource (rsc/create :zip (or name (-> exports first :name))) total (count exports) topic (str profile-id) @@ -141,7 +141,8 @@ proc (-> (p/do (p/loop [exports (seq exports)] - (when-let [export (first exports)] + (when-let [export (-> (first exports) + (assoc :skip-children skip-children))] (p/do (rd/render export append) (p/recur (rest exports))))) diff --git a/exporter/src/app/renderer/bitmap.cljs b/exporter/src/app/renderer/bitmap.cljs index e206bfe9b..54335be50 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 share-id token scale type objects] :as params} on-object] + [{:keys [file-id page-id share-id token scale type objects skip-children] :as params} on-object] (letfn [(prepare-options [uri] #js {:screen #js {:width bw/default-viewport-width :height bw/default-viewport-height} @@ -56,7 +56,8 @@ :page-id page-id :share-id share-id :object-id (mapv :id objects) - :route "objects"} + :route "objects" + :skip-children skip-children} uri (-> (cf/get :public-uri) (assoc :path "/render.html") (assoc :query (u/map->query-string params)))] diff --git a/frontend/src/app/main/render.cljs b/frontend/src/app/main/render.cljs index b916688d0..f63474127 100644 --- a/frontend/src/app/main/render.cljs +++ b/frontend/src/app/main/render.cljs @@ -444,14 +444,16 @@ (mf/defc object-svg {::mf/wrap [mf/memo]} - [{:keys [objects object-id embed] + [{:keys [objects object-id embed skip-children] :or {embed false} :as props}] (let [object (get objects object-id) object (cond-> object (:hide-fill-on-export object) - (assoc :fills [])) + (assoc :fills []) + skip-children + (assoc :shapes [])) {:keys [width height] :as bounds} (gsb/get-object-bounds objects object {:ignore-margin? false}) vbox (format-viewbox bounds) diff --git a/frontend/src/app/plugins/parser.cljs b/frontend/src/app/plugins/parser.cljs index caaa697f7..0033246e4 100644 --- a/frontend/src/app/plugins/parser.cljs +++ b/frontend/src/app/plugins/parser.cljs @@ -253,7 +253,8 @@ (d/without-nils {:type (-> (obj/get export "type") parse-keyword) :scale (obj/get export "scale" 1) - :suffix (obj/get export "suffix" "")}))) + :suffix (obj/get export "suffix" "") + :skip-children (obj/get export "skipChildren" false)}))) (defn parse-exports [^js exports] diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index c1dc10c8f..8e1548ad2 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -1138,6 +1138,7 @@ {:cmd :export-shapes :profile-id (:profile-id @st/state) :wait true + :skip-children (:skip-children value false) :exports [{:file-id file-id :page-id page-id :object-id id diff --git a/frontend/src/app/render.cljs b/frontend/src/app/render.cljs index 90d7f1a0a..56509025e 100644 --- a/frontend/src/app/render.cljs +++ b/frontend/src/app/render.cljs @@ -62,7 +62,7 @@ (mf/defc object-svg {::mf/wrap-props false} - [{:keys [object-id embed]}] + [{:keys [object-id embed skip-children]}] (let [objects (mf/deref ref:objects)] ;; Set the globa CSS to assign the page size, needed for PDF @@ -79,11 +79,12 @@ [:& render/object-svg {:objects objects :object-id object-id - :embed embed}]))) + :embed embed + :skip-children skip-children}]))) (mf/defc objects-svg {::mf/wrap-props false} - [{:keys [object-ids embed]}] + [{:keys [object-ids embed skip-children]}] (when-let [objects (mf/deref ref:objects)] (for [object-id object-ids] (let [objects (render/adapt-objects-for-shape objects object-id)] @@ -91,7 +92,8 @@ {:objects objects :key (str object-id) :object-id object-id - :embed embed}])))) + :embed embed + :skip-children skip-children}])))) (defn- fetch-objects-bundle [& {:keys [file-id page-id share-id object-id] :as options}] @@ -121,6 +123,7 @@ [:file-id ::sm/uuid] [:share-id {:optional true} ::sm/uuid] [:embed {:optional true} :boolean] + [:skip-children {:optional true} :boolean] [:object-id [:or ::sm/uuid @@ -135,7 +138,7 @@ (defn- render-objects [params] - (let [{:keys [file-id page-id embed share-id object-id] :as params} (render-objects-decoder params)] + (let [{:keys [file-id page-id embed share-id object-id skip-children] :as params} (render-objects-decoder params)] (if-not (render-objects-validator params) (do (js/console.error "invalid arguments") @@ -152,7 +155,8 @@ :page-id page-id :share-id share-id :object-id object-id - :embed embed}]) + :embed embed + :skip-children skip-children}]) (mf/html [:& objects-svg @@ -160,7 +164,8 @@ :page-id page-id :share-id share-id :object-ids (into #{} object-id) - :embed embed}])))))) + :embed embed + :skip-children skip-children}])))))) ;; ---- COMPONENTS SPRITE diff --git a/frontend/test/frontend_tests/plugins/context_shapes_test.cljs b/frontend/test/frontend_tests/plugins/context_shapes_test.cljs index 590162203..501a602c7 100644 --- a/frontend/test/frontend_tests/plugins/context_shapes_test.cljs +++ b/frontend/test/frontend_tests/plugins/context_shapes_test.cljs @@ -176,10 +176,10 @@ (t/is (= (-> (. shape -exports) (aget 0) (aget "type")) "pdf")) (t/is (= (-> (. shape -exports) (aget 0) (aget "scale")) 2)) (t/is (= (-> (. shape -exports) (aget 0) (aget "suffix")) "test")) - (t/is (= (get-in @store (get-shape-path :exports)) [{:type :pdf :scale 2 :suffix "test"}])) + (t/is (= (get-in @store (get-shape-path :exports)) [{:type :pdf :scale 2 :suffix "test" :skip-children false}])) (set! (.-exports shape) #js [#js {:type 10 :scale 2 :suffix "test"}]) - (t/is (= (get-in @store (get-shape-path :exports)) [{:type :pdf :scale 2 :suffix "test"}]))) + (t/is (= (get-in @store (get-shape-path :exports)) [{:type :pdf :scale 2 :suffix "test" :skip-children false}]))) (t/testing " - flipX" (set! (.-flipX shape) true)