diff --git a/CHANGES.md b/CHANGES.md index 5552fbdaf..eacd6e897 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -49,6 +49,7 @@ - Fix problem with hover layers when hidden/blocked [Github #5074](https://github.com/penpot/penpot/issues/5074) - Fix problem with precision on boolean calculation [Taiga #8482](https://tree.taiga.io/project/penpot/issue/8482) - Fix problem when translating multiple path points [Github #4459](https://github.com/penpot/penpot/issues/4459) +- Fix problem on importing (and exporting) files with flows [Taiga #8914](https://tree.taiga.io/project/penpot/issue/8914) ## 2.2.1 diff --git a/backend/src/app/rpc/commands/files_temp.clj b/backend/src/app/rpc/commands/files_temp.clj index 17000d79c..f639bebdb 100644 --- a/backend/src/app/rpc/commands/files_temp.clj +++ b/backend/src/app/rpc/commands/files_temp.clj @@ -45,37 +45,38 @@ (sv/defmethod ::create-temp-file {::doc/added "1.17" ::doc/module :files - ::sm/params schema:create-temp-file} - [cfg {:keys [::rpc/profile-id project-id] :as params}] - (db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}] - (projects/check-edition-permissions! conn profile-id project-id) - (let [team (teams/get-team conn :profile-id profile-id :project-id project-id) + ::sm/params schema:create-temp-file + ::db/transaction true} + [{:keys [::db/conn] :as cfg} {:keys [::rpc/profile-id project-id] :as params}] + (projects/check-edition-permissions! conn profile-id project-id) + (let [team (teams/get-team conn :profile-id profile-id :project-id project-id) + ;; When we create files, we only need to respect the team + ;; features, because some features can be enabled + ;; globally, but the team is still not migrated properly. + input-features + (:features params #{}) - ;; When we create files, we only need to respect the team - ;; features, because some features can be enabled - ;; globally, but the team is still not migrated properly. - input-features (:features params #{}) + ;; If the imported project doesn't contain v2 we need to remove it + team-features + (cond-> (cfeat/get-team-enabled-features cf/flags team) + (not (contains? input-features "components/v2")) + (disj "components/v2")) - ;; If the imported project doesn't contain v2 we need to remove it - team-features - (cond-> (cfeat/get-team-enabled-features cf/flags team) - (not (contains? input-features "components/v2")) - (disj "components/v2")) + ;; We also include all no migration features declared by + ;; client; that enables the ability to enable a runtime + ;; feature on frontend and make it permanent on file + features + (-> input-features + (set/intersection cfeat/no-migration-features) + (set/union team-features)) + params + (-> params + (assoc :profile-id profile-id) + (assoc :deleted-at (dt/in-future {:days 1})) + (assoc :features features))] - ;; We also include all no migration features declared by - ;; client; that enables the ability to enable a runtime - ;; feature on frontend and make it permanent on file - features (-> input-features - (set/intersection cfeat/no-migration-features) - (set/union team-features)) - - params (-> params - (assoc :profile-id profile-id) - (assoc :deleted-at (dt/in-future {:days 1})) - (assoc :features features))] - - (files.create/create-file cfg params))))) + (files.create/create-file cfg params))) ;; --- MUTATION COMMAND: update-temp-file diff --git a/frontend/src/app/main/ui/dashboard/templates.cljs b/frontend/src/app/main/ui/dashboard/templates.cljs index ae9a8f5be..f410c332d 100644 --- a/frontend/src/app/main/ui/dashboard/templates.cljs +++ b/frontend/src/app/main/ui/dashboard/templates.cljs @@ -195,19 +195,17 @@ (fn [_event] (swap! collapsed* not))) - update-can-move - (fn [scroll-left scroll-available client-width] - (reset! can-move {:left (> scroll-left 0) - :right (> scroll-available client-width)})) - on-scroll (mf/use-fn (fn [e] - (let [scroll (dom/get-target-scroll e) - scroll-left (:scroll-left scroll) + (let [scroll (dom/get-target-scroll e) + scroll-left (:scroll-left scroll) scroll-available (- (:scroll-width scroll) scroll-left) - client-rect (dom/get-client-size (dom/get-target e))] - (update-can-move scroll-left scroll-available (unchecked-get client-rect "width"))))) + client-rect (dom/get-client-size (dom/get-target e)) + client-width (unchecked-get client-rect "width")] + + (reset! can-move {:left (> scroll-left 0) + :right (> scroll-available client-width)})))) on-move-left (mf/use-fn #(move-left)) @@ -231,7 +229,7 @@ (let [content (mf/ref-val content-ref)] (when (and (some? content) (some? templates)) (dom/scroll-to content #js {:behavior "instant" :left 0 :top 0}) - (.dispatchEvent content (js/Event. "scroll"))))) + (dom/dispatch-event content (dom/event "scroll"))))) (mf/with-effect [profile collapsed] (swap! storage/global assoc ::collapsed collapsed) diff --git a/frontend/src/app/main/ui/shapes/export.cljs b/frontend/src/app/main/ui/shapes/export.cljs index 9a8dce9d4..6671ccd48 100644 --- a/frontend/src/app/main/ui/shapes/export.cljs +++ b/frontend/src/app/main/ui/shapes/export.cljs @@ -173,7 +173,7 @@ (mf/defc export-flows [{:keys [flows]}] [:> "penpot:flows" #js {} - (for [{:keys [id name starting-frame]} flows] + (for [{:keys [id name starting-frame]} (vals flows)] [:> "penpot:flow" #js {:id id :name name :starting-frame starting-frame}])]) diff --git a/frontend/src/app/util/dom.cljs b/frontend/src/app/util/dom.cljs index 101c88b18..874d9c927 100644 --- a/frontend/src/app/util/dom.cljs +++ b/frontend/src/app/util/dom.cljs @@ -720,6 +720,19 @@ [filename blob] (trigger-download-uri filename (.-type ^js blob) (wapi/create-uri blob))) +(defn event + "Create an instance of DOM Event" + ([^string type] + (js/Event. type)) + ([^string type options] + (js/Event. type options))) + +(defn dispatch-event + [target event] + (when (some? target) + (.dispatchEvent ^js target event))) + + (defn save-as [uri filename mtype description] diff --git a/frontend/src/app/util/storage.cljs b/frontend/src/app/util/storage.cljs index d8f393733..b7b604c14 100644 --- a/frontend/src/app/util/storage.cljs +++ b/frontend/src/app/util/storage.cljs @@ -10,6 +10,7 @@ [app.common.transit :as t] [app.util.functions :as fns] [app.util.globals :as g] + [app.util.time :as dt] [cuerdas.core :as str] [okulary.util :as ou])) @@ -157,3 +158,11 @@ (defonce user (create-storage local-storage-backend "penpot-user")) (defonce storage (create-storage local-storage-backend "penpot")) (defonce session (create-storage session-storage-backend "penpot")) + +(defonce before-unload + (letfn [(on-before-unload [_] + (binding [*sync* true] + (swap! global assoc ::last-refresh (dt/now)) + (swap! user assoc ::last-refresh (dt/now))))] + (.addEventListener g/window "beforeunload" on-before-unload) + on-before-unload)) diff --git a/frontend/src/app/worker/import.cljs b/frontend/src/app/worker/import.cljs index cd6f11c8d..43a9db654 100644 --- a/frontend/src/app/worker/import.cljs +++ b/frontend/src/app/worker/import.cljs @@ -458,8 +458,10 @@ page-data (-> (parser/parse-page-data content) (assoc :name page-name) (assoc :id (resolve page-id))) + flows (->> (get page-data :flows) - (update-vals #(update % :starting-frame resolve)) + (map #(update % :starting-frame resolve)) + (d/index-by :id) (not-empty)) guides (-> (get page-data :guides) @@ -815,9 +817,12 @@ :errors (:errors file) :file-id (:file-id data)}))))))) (rx/catch (fn [cause] - (log/error :hint (ex-message cause) - :file-id (:file-id data) - :cause cause) + (let [data (ex-data cause)] + (log/error :hint (ex-message cause) + :file-id (:file-id data)) + (when-let [explain (:explain data)] + (js/console.log explain))) + (rx/of {:status :import-error :file-id (:file-id data) :error (ex-message cause)