From 90f7e97d5b0ac46c425939ba50dd66894d7938b2 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 1 Sep 2023 11:37:47 +0200 Subject: [PATCH 1/7] :sparkles: Improve kondo analyze function for db/with-atomic Allow pass options as third argument on params vector --- .clj-kondo/hooks/export.clj | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/.clj-kondo/hooks/export.clj b/.clj-kondo/hooks/export.clj index 71a837597..e56d2f559 100644 --- a/.clj-kondo/hooks/export.clj +++ b/.clj-kondo/hooks/export.clj @@ -41,18 +41,22 @@ (defn penpot-with-atomic [{:keys [node]}] - (let [[_ params & other] (:children node) + (let [[params & body] (rest (:children node))] + (if (api/vector-node? params) + (let [[sym val opts] (:children params)] + (when-not (and sym val) + (throw (ex-info "No sym and val provided" {}))) + {:node (api/list-node + (list* + (api/token-node 'let) + (api/vector-node [sym val]) + opts + body))}) - result (if (api/vector-node? params) - (api/list-node - (into [(api/token-node (symbol "clojure.core" "with-open")) params] other)) - (api/list-node - (into [(api/token-node (symbol "clojure.core" "with-open")) - (api/vector-node [params params])] - other))) - - ] - {:node result})) + {:node (api/list-node + (into [(api/token-node 'let) + (api/vector-node [params params])] + body))}))) (defn penpot-defrecord [{:keys [:node]}] From c7f9774524c32cbf09d7992dbe3b98b1664470bf Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 1 Sep 2023 11:38:25 +0200 Subject: [PATCH 2/7] :sparkles: Add more flexible call flow for db interacting methods --- backend/src/app/db.clj | 60 ++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/backend/src/app/db.clj b/backend/src/app/db.clj index 13046c15c..ba705d480 100644 --- a/backend/src/app/db.clj +++ b/backend/src/app/db.clj @@ -145,6 +145,10 @@ [v] (instance? javax.sql.DataSource v)) +(defn connection? + [conn] + (instance? Connection conn)) + (s/def ::conn some?) (s/def ::nilable-pool (s/nilable ::pool)) (s/def ::pool pool?) @@ -230,46 +234,59 @@ [pool] (jdbc/get-connection pool)) +(defn- resolve-connectable + [o] + (if (connection? o) + o + (if (pool? o) + o + (or (::conn o) (::pool o))))) + + (def ^:private default-opts {:builder-fn sql/as-kebab-maps}) (defn exec! ([ds sv] - (jdbc/execute! ds sv default-opts)) + (-> (resolve-connectable ds) + (jdbc/execute! sv default-opts))) ([ds sv opts] - (jdbc/execute! ds sv (merge default-opts opts)))) + (-> (resolve-connectable ds) + (jdbc/execute! sv (merge default-opts opts))))) (defn exec-one! ([ds sv] - (jdbc/execute-one! ds sv default-opts)) + (-> (resolve-connectable ds) + (jdbc/execute-one! sv default-opts))) ([ds sv opts] - (jdbc/execute-one! ds sv - (-> (merge default-opts opts) - (assoc :return-keys (::return-keys? opts false)))))) + (-> (resolve-connectable ds) + (jdbc/execute-one! sv + (-> (merge default-opts opts) + (assoc :return-keys (::return-keys? opts false))))))) (defn insert! [ds table params & {:as opts}] - (exec-one! ds - (sql/insert table params opts) - (merge {::return-keys? true} opts))) + (-> (resolve-connectable ds) + (exec-one! (sql/insert table params opts) + (merge {::return-keys? true} opts)))) (defn insert-multi! [ds table cols rows & {:as opts}] - (exec! ds - (sql/insert-multi table cols rows opts) - (merge {::return-keys? true} opts))) + (-> (resolve-connectable ds) + (exec! (sql/insert-multi table cols rows opts) + (merge {::return-keys? true} opts)))) (defn update! [ds table params where & {:as opts}] - (exec-one! ds - (sql/update table params where opts) - (merge {::return-keys? true} opts))) + (-> (resolve-connectable ds) + (exec-one! (sql/update table params where opts) + (merge {::return-keys? true} opts)))) (defn delete! [ds table params & {:as opts}] - (exec-one! ds - (sql/delete table params opts) - (merge {::return-keys? true} opts))) + (-> (resolve-connectable ds) + (exec-one! (sql/delete table params opts) + (merge {::return-keys? true} opts)))) (defn is-row-deleted? [{:keys [deleted-at]}] @@ -301,7 +318,8 @@ (defn plan [ds sql] - (jdbc/plan ds sql sql/default-opts)) + (-> (resolve-connectable ds) + (jdbc/plan sql sql/default-opts))) (defn get-by-id [ds table id & {:as opts}] @@ -371,10 +389,6 @@ [data] (org.postgresql.util.PGInterval. ^String data)) -(defn connection? - [conn] - (instance? Connection conn)) - (defn savepoint ([^Connection conn] (.setSavepoint conn)) From a097ed29a98b6c0501c55f8f36f3c760e3d6755c Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 1 Sep 2023 13:32:21 +0200 Subject: [PATCH 3/7] :sparkles: Fix extensibility and naming of workspace shape fixer --- common/src/app/common/pages/changes.cljc | 15 +++++++++++---- common/src/app/common/types/shape_tree.cljc | 4 ++-- frontend/src/app/main/data/workspace.cljs | 2 +- ...en_shape_links.cljs => fix_broken_shapes.cljs} | 12 ++++++------ 4 files changed, 20 insertions(+), 13 deletions(-) rename frontend/src/app/main/data/workspace/{fix_broken_shape_links.cljs => fix_broken_shapes.cljs} (83%) diff --git a/common/src/app/common/pages/changes.cljc b/common/src/app/common/pages/changes.cljc index 43895ac46..0b0af2fcc 100644 --- a/common/src/app/common/pages/changes.cljc +++ b/common/src/app/common/pages/changes.cljc @@ -97,6 +97,7 @@ [:map {:title "FixObjChange"} [:type [:= :fix-obj]] [:id ::sm/uuid] + [:fix {:optional true} :keyword] [:page-id {:optional true} ::sm/uuid] [:component-id {:optional true} ::sm/uuid]]] @@ -402,10 +403,16 @@ (d/update-in-when data [:components component-id] ctst/delete-shape id ignore-touched))) (defmethod process-change :fix-obj - [data {:keys [page-id component-id] :as params}] - (if page-id - (d/update-in-when data [:pages-index page-id] ctst/fix-shape-children params) - (d/update-in-when data [:components component-id] ctst/fix-shape-children params))) + [data {:keys [page-id component-id id] :as params}] + (letfn [(fix-container [container] + (case (:fix params :broken-children) + :broken-children (ctst/fix-broken-children container id) + (ex/raise :type :internal + :code :fix-not-implemented + :fix (:fix params))))] + (if page-id + (d/update-in-when data [:pages-index page-id] fix-container) + (d/update-in-when data [:components component-id] fix-container)))) ;; FIXME: remove, seems like this method is already unused ;; reg-objects operation "regenerates" the geometry and selrect of the parent groups diff --git a/common/src/app/common/types/shape_tree.cljc b/common/src/app/common/types/shape_tree.cljc index a6455e5d9..2798c9ff8 100644 --- a/common/src/app/common/types/shape_tree.cljc +++ b/common/src/app/common/types/shape_tree.cljc @@ -99,10 +99,10 @@ (update container :objects delete-from-objects)))) -(defn fix-shape-children +(defn fix-broken-children "Checks and fix the children relations of the shape. If a children does not exists on the objects tree, it will be removed from shape." - [{:keys [objects] :as container} {:keys [id] :as params}] + [{:keys [objects] :as container} id] (let [contains? (partial contains? objects)] (d/update-in-when container [:objects id :shapes] (fn [shapes] diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 431c1bfd5..e4e37c3f7 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -46,7 +46,7 @@ [app.main.data.workspace.drawing.common :as dwdc] [app.main.data.workspace.edition :as dwe] [app.main.data.workspace.fix-bool-contents :as fbc] - [app.main.data.workspace.fix-broken-shape-links :as fbs] + [app.main.data.workspace.fix-broken-shapes :as fbs] [app.main.data.workspace.fix-deleted-fonts :as fdf] [app.main.data.workspace.groups :as dwg] [app.main.data.workspace.guides :as dwgu] diff --git a/frontend/src/app/main/data/workspace/fix_broken_shape_links.cljs b/frontend/src/app/main/data/workspace/fix_broken_shapes.cljs similarity index 83% rename from frontend/src/app/main/data/workspace/fix_broken_shape_links.cljs rename to frontend/src/app/main/data/workspace/fix_broken_shapes.cljs index e547f0c03..9e2e28af3 100644 --- a/frontend/src/app/main/data/workspace/fix_broken_shape_links.cljs +++ b/frontend/src/app/main/data/workspace/fix_broken_shapes.cljs @@ -4,15 +4,15 @@ ;; ;; Copyright (c) KALEIDOS INC -(ns app.main.data.workspace.fix-broken-shape-links +(ns app.main.data.workspace.fix-broken-shapes (:require [app.main.data.workspace.changes :as dch] [beicon.core :as rx] [potok.core :as ptk])) -(defn- generate-changes +(defn- generate-broken-link-changes [attr {:keys [objects id] :as container}] - (let [base {:type :fix-obj attr id} + (let [base {:type :fix-obj :fix :broken-children attr id} contains? (partial contains? objects) xform (comp ;; FIXME: Ensure all obj have id field (this is needed @@ -36,14 +36,14 @@ (defn fix-broken-shapes [] - (ptk/reify ::fix-broken-shape-links + (ptk/reify ::fix-broken-shapes ptk/WatchEvent (watch [it state _] (let [data (get state :workspace-data) changes (concat - (mapcat (partial generate-changes :page-id) + (mapcat (partial generate-broken-link-changes :page-id) (vals (:pages-index data))) - (mapcat (partial generate-changes :component-id) + (mapcat (partial generate-broken-link-changes :component-id) (vals (:components data))))] (if (seq changes) From 6a3b963a77115a09c683a56c6a1ef15f5f97b4d5 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 1 Sep 2023 13:37:50 +0200 Subject: [PATCH 4/7] :bug: Add migration that fixes all frames that does not have `:shapes` attr --- common/src/app/common/files/defaults.cljc | 2 +- common/src/app/common/files/migrations.cljc | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/common/src/app/common/files/defaults.cljc b/common/src/app/common/files/defaults.cljc index d0ee2994c..3cfaccf20 100644 --- a/common/src/app/common/files/defaults.cljc +++ b/common/src/app/common/files/defaults.cljc @@ -6,4 +6,4 @@ (ns app.common.files.defaults) -(def version 29) +(def version 30) diff --git a/common/src/app/common/files/migrations.cljc b/common/src/app/common/files/migrations.cljc index c2ee6ff84..ae11417ac 100644 --- a/common/src/app/common/files/migrations.cljc +++ b/common/src/app/common/files/migrations.cljc @@ -561,3 +561,18 @@ (-> data (update :pages-index update-vals update-container) (update :components update-vals update-container)))) + +(defmethod migrate 30 + [data] + (letfn [(update-object [object] + (if (and (cph/frame-shape? object) + (not (:shapes object))) + (assoc object :shapes []) + object)) + + (update-container [container] + (update container :objects update-vals update-object))] + + (-> data + (update :pages-index update-vals update-container) + (update :components update-vals update-container)))) From bd734c109545d2e21784ab601c82c051a7fedbc3 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 1 Sep 2023 13:55:23 +0200 Subject: [PATCH 5/7] :bug: Fix log level setting on file migrations ns --- common/src/app/common/files/migrations.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/app/common/files/migrations.cljc b/common/src/app/common/files/migrations.cljc index ae11417ac..df4144c87 100644 --- a/common/src/app/common/files/migrations.cljc +++ b/common/src/app/common/files/migrations.cljc @@ -23,7 +23,7 @@ [app.common.uuid :as uuid] [cuerdas.core :as str])) -#?(:cljs (log/set-level! :info)) +#?(:cljs (l/set-level! :info)) (defmulti migrate :version) From c54deb0218214b36cffa36f7a78634cf1b042498 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 4 Sep 2023 11:49:14 +0200 Subject: [PATCH 6/7] :bug: Fix proportion lock toggle callback Add missing dependency --- .../app/main/ui/workspace/sidebar/options/menus/measures.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/measures.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/measures.cljs index 3bf1fee2b..f06a40923 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/measures.cljs @@ -169,7 +169,7 @@ on-proportion-lock-change (mf/use-callback - (mf/deps ids) + (mf/deps ids proportion-lock) (fn [_] (let [new-lock (if (= proportion-lock :multiple) true (not proportion-lock))] (run! #(st/emit! (udw/set-shape-proportion-lock % new-lock)) ids)))) From b68b802b6d4dbe55b1ab240dc3362e1d3f741777 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 4 Sep 2023 12:01:29 +0200 Subject: [PATCH 7/7] :bug: Fix shape radius type toggle on workspace --- common/src/app/common/types/shape/radius.cljc | 15 +++++---------- .../workspace/sidebar/options/menus/measures.cljs | 10 +++++----- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/common/src/app/common/types/shape/radius.cljc b/common/src/app/common/types/shape/radius.cljc index 415dd4c93..3edb18cd0 100644 --- a/common/src/app/common/types/shape/radius.cljc +++ b/common/src/app/common/types/shape/radius.cljc @@ -51,19 +51,14 @@ (defn switch-to-radius-1 [shape] (let [r (if (all-equal? shape) (:r1 shape) 0)] - (cond-> shape - (:r1 shape) - (-> (assoc :rx r :ry r) - (dissoc :r1 :r2 :r3 :r4))))) + (-> shape + (assoc :rx r :ry r) + (dissoc :r1 :r2 :r3 :r4)))) (defn switch-to-radius-4 [shape] - (cond-> shape - (:rx shape) - (-> (assoc :r1 (:rx shape) - :r2 (:rx shape) - :r3 (:rx shape) - :r4 (:rx shape)) + (let [rx (:rx shape 0)] + (-> (assoc shape :r1 rx :r2 rx :r3 rx :r4 rx) (dissoc :rx :ry)))) (defn set-radius-1 diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/measures.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/measures.cljs index f06a40923..9761d869a 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/measures.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/measures.cljs @@ -207,7 +207,7 @@ on-switch-to-radius-1 (mf/use-callback - (mf/deps ids) + (mf/deps ids change-radius) (fn [_value] (if all-equal? (st/emit! (change-radius ctsr/switch-to-radius-1)) @@ -215,20 +215,20 @@ on-switch-to-radius-4 (mf/use-callback - (mf/deps ids) + (mf/deps ids change-radius) (fn [_value] (st/emit! (change-radius ctsr/switch-to-radius-4)) (reset! radius-multi? false))) on-radius-1-change (mf/use-callback - (mf/deps ids) + (mf/deps ids change-radius) (fn [value] (st/emit! (change-radius #(ctsr/set-radius-1 % value))))) on-radius-multi-change (mf/use-callback - (mf/deps ids) + (mf/deps ids change-radius) (fn [event] (let [value (-> event dom/get-target dom/get-value d/parse-integer)] (when (some? value) @@ -238,7 +238,7 @@ on-radius-4-change (mf/use-callback - (mf/deps ids) + (mf/deps ids change-radius) (fn [value attr] (st/emit! (change-radius #(ctsr/set-radius-4 % attr value)))))