From 345ae020d6d3e637d0a3d7092cdcb851a34d41ff Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 20 Sep 2022 11:52:36 +0200 Subject: [PATCH 01/20] :paperclip: Update version.txt file --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 02ea503c4..5b49f490e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.15.3-beta +1.15.4-beta From 5ac123dc4b1a3979b9b5d5ac5c25761d3a68ee7e Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 21 Sep 2022 09:29:03 +0200 Subject: [PATCH 02/20] :sparkles: Improve error handling on onboarding questions form --- frontend/src/app/main/store.cljs | 4 ++ .../src/app/main/ui/onboarding/questions.cljs | 54 ++++++++++++++----- frontend/src/app/util/dom.cljs | 5 ++ 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/frontend/src/app/main/store.cljs b/frontend/src/app/main/store.cljs index c8d274c1c..49f1e752a 100644 --- a/frontend/src/app/main/store.cljs +++ b/frontend/src/app/main/store.cljs @@ -16,6 +16,10 @@ (defonce loader (l/atom false)) (defonce on-error (l/atom identity)) +(defmethod ptk/resolve :default + [type data] + (ptk/data-event type data)) + (defonce state (ptk/store {:resolve ptk/resolve :on-error (fn [e] (@on-error e))})) diff --git a/frontend/src/app/main/ui/onboarding/questions.cljs b/frontend/src/app/main/ui/onboarding/questions.cljs index 7a70b8660..266d0d4bc 100644 --- a/frontend/src/app/main/ui/onboarding/questions.cljs +++ b/frontend/src/app/main/ui/onboarding/questions.cljs @@ -7,35 +7,61 @@ (ns app.main.ui.onboarding.questions "External form for onboarding questions." (:require + [app.main.data.events :as ev] [app.main.data.users :as du] [app.main.store :as st] [app.util.dom :as dom] - [goog.events :as ev] + [goog.events :as gev] + [potok.core :as ptk] [promesa.core :as p] [rumext.alpha :as mf])) (defn load-arengu-sdk [container-ref email form-id] - (letfn [(on-init [] - (when-let [container (mf/ref-val container-ref)] + (letfn [(on-arengu-loaded [resolve reject] + (let [container (mf/ref-val container-ref)] (-> (.embed js/ArenguForms form-id container) (p/then (fn [form] - (.setHiddenField ^js form "email" email)))))) + (.setHiddenField ^js form "email" email) + (st/emit! (ptk/event ::ev/event {::ev/name "arengu-form-load-success" + ::ev/origin "onboarding-questions" + ::ev/type "fact"})) + (resolve))) + (p/catch reject)))) - (on-submit-success [_event] + (mark-as-answered [] (st/emit! (du/mark-questions-as-answered))) + + (initialize [cleaners resolve reject] + (let [script (dom/create-element "script") + head (unchecked-get js/document "head") + lkey1 (gev/listen js/document "af-submitForm-success" mark-as-answered) + lkey2 (gev/listen js/document "af-getForm-error" reject)] + + (unchecked-set script "src" "https://sdk.arengu.com/forms.js") + (unchecked-set script "onload" (partial on-arengu-loaded resolve reject)) + (dom/append-child! head script) + + (swap! cleaners conj + #(do (gev/unlistenByKey lkey1) + (gev/unlistenByKey lkey2))) + + (swap! cleaners conj + #(dom/remove-child! head script)))) + + (on-error [_] + (st/emit! (ptk/event ::ev/event {::ev/name "arengu-form-load-error" + ::ev/origin "onboarding-questions" + ::ev/type "fact"})) + (mark-as-answered)) ] - (let [script (dom/create-element "script") - head (unchecked-get js/document "head") - lkey1 (ev/listen js/document "af-submitForm-success" on-submit-success)] - - (unchecked-set script "src" "https://sdk.arengu.com/forms.js") - (unchecked-set script "onload" on-init) - (dom/append-child! head script) - + (let [cleaners (atom #{})] + (-> (p/create (partial initialize cleaners)) + (p/timeout 5000) + (p/catch on-error)) (fn [] - (ev/unlistenByKey lkey1))))) + (run! (fn [clean-fn] (clean-fn)) @cleaners))))) (mf/defc questions [{:keys [profile form-id]}] diff --git a/frontend/src/app/util/dom.cljs b/frontend/src/app/util/dom.cljs index 56d8c68a8..32be72f0b 100644 --- a/frontend/src/app/util/dom.cljs +++ b/frontend/src/app/util/dom.cljs @@ -264,6 +264,11 @@ (when (some? el) (.appendChild ^js el child))) +(defn remove-child! + [^js el child] + (when (some? el) + (.removeChild ^js el child))) + (defn get-first-child [^js el] (when (some? el) From bea96cb5865380be77be7199f571c42258859346 Mon Sep 17 00:00:00 2001 From: Eva Date: Tue, 20 Sep 2022 14:43:00 +0200 Subject: [PATCH 03/20] :bug: Fix recent colors --- frontend/src/app/main/ui/workspace/colorpalette.cljs | 4 +++- frontend/src/app/main/ui/workspace/colorpicker/harmony.cljs | 1 + frontend/src/app/main/ui/workspace/colorpicker/ramp.cljs | 1 + .../app/main/ui/workspace/colorpicker/slider_selector.cljs | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/colorpalette.cljs b/frontend/src/app/main/ui/workspace/colorpalette.cljs index 39b0e17bb..6ebb2bd65 100644 --- a/frontend/src/app/main/ui/workspace/colorpalette.cljs +++ b/frontend/src/app/main/ui/workspace/colorpalette.cljs @@ -36,7 +36,9 @@ (mf/defc palette [{:keys [current-colors recent-colors file-colors shared-libs selected on-select]}] - (let [state (mf/use-state {:show-menu false}) + (let [;; We had to do this due to a bug that leave some bugged colors + current-colors (filter #(some? (:color %)) current-colors) + state (mf/use-state {:show-menu false}) width (:width @state 0) visible (/ width 66) diff --git a/frontend/src/app/main/ui/workspace/colorpicker/harmony.cljs b/frontend/src/app/main/ui/workspace/colorpicker/harmony.cljs index b73e85843..3c6323a5b 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/harmony.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker/harmony.cljs @@ -131,6 +131,7 @@ :width canvas-side :height canvas-side :on-pointer-down handle-start-drag + :on-pointer-up handle-stop-drag :on-lost-pointer-capture handle-stop-drag :on-click calculate-pos :on-mouse-move #(when @dragging? (calculate-pos %))}] diff --git a/frontend/src/app/main/ui/workspace/colorpicker/ramp.cljs b/frontend/src/app/main/ui/workspace/colorpicker/ramp.cljs index 09a8cfa41..7684b0079 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/ramp.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker/ramp.cljs @@ -41,6 +41,7 @@ ] [:div.value-saturation-selector {:on-pointer-down handle-start-drag + :on-pointer-up handle-stop-drag :on-lost-pointer-capture handle-stop-drag :on-click calculate-pos :on-mouse-move #(when @dragging? (calculate-pos %))} diff --git a/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.cljs b/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.cljs index 9c47681d2..e6dafa65f 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker/slider_selector.cljs @@ -52,6 +52,7 @@ [:div.slider-selector {:class (str (if vertical? "vertical " "") class) :on-pointer-down handle-start-drag + :on-pointer-up handle-stop-drag :on-lost-pointer-capture handle-stop-drag :on-click calculate-pos :on-mouse-move #(when @dragging? (calculate-pos %))} From f444d3d01d104ed8f791663a97bbb3a7cfbf896d Mon Sep 17 00:00:00 2001 From: Eva Date: Tue, 20 Sep 2022 15:42:57 +0200 Subject: [PATCH 04/20] :bug: Fix opacity in color picker --- frontend/src/app/main/ui/workspace/colorpicker.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/colorpicker.cljs b/frontend/src/app/main/ui/workspace/colorpicker.cljs index c7024ec61..bf15bcb36 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker.cljs @@ -67,7 +67,7 @@ (mf/use-fn (mf/deps @drag?) (fn [color] - (let [recent-color (merge color) + (let [recent-color (merge current-color color) recent-color (dc/materialize-color-components recent-color)] (when (not @drag?) (st/emit! (dwl/add-recent-color recent-color))) From 199142045f0ea232fb4b22b84acb51f32817e2f1 Mon Sep 17 00:00:00 2001 From: Eva Date: Wed, 21 Sep 2022 13:20:09 +0200 Subject: [PATCH 05/20] :bug: Remove bugged colors from recents --- frontend/src/app/main/ui/workspace/colorpalette.cljs | 2 +- frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/workspace/colorpalette.cljs b/frontend/src/app/main/ui/workspace/colorpalette.cljs index 6ebb2bd65..501278cdc 100644 --- a/frontend/src/app/main/ui/workspace/colorpalette.cljs +++ b/frontend/src/app/main/ui/workspace/colorpalette.cljs @@ -37,7 +37,7 @@ (mf/defc palette [{:keys [current-colors recent-colors file-colors shared-libs selected on-select]}] (let [;; We had to do this due to a bug that leave some bugged colors - current-colors (filter #(some? (:color %)) current-colors) + current-colors (filter #(or (:gradient %) (:color %)) current-colors) state (mf/use-state {:show-menu false}) width (:width @state 0) diff --git a/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs b/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs index 8e3b6e392..9825d5da6 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs @@ -25,6 +25,7 @@ shared-libs (mf/deref refs/workspace-libraries) file-colors (mf/deref refs/workspace-file-colors) recent-colors (mf/deref refs/workspace-recent-colors) + recent-colors (filter #(or (:gradient %) (:color %)) recent-colors) on-library-change (mf/use-fn From 4961991e18c021f337f3f6d3d075c885828fdd8a Mon Sep 17 00:00:00 2001 From: Eva Date: Wed, 21 Sep 2022 13:20:39 +0200 Subject: [PATCH 06/20] :bug: Fix gradient colors in recents --- frontend/src/app/main/data/workspace/colors.cljs | 10 ++++++++-- frontend/src/app/main/ui/workspace/colorpicker.cljs | 4 +--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/frontend/src/app/main/data/workspace/colors.cljs b/frontend/src/app/main/data/workspace/colors.cljs index e6915bf1d..220567307 100644 --- a/frontend/src/app/main/data/workspace/colors.cljs +++ b/frontend/src/app/main/data/workspace/colors.cljs @@ -13,6 +13,7 @@ [app.main.data.modal :as md] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.layout :as layout] + [app.main.data.workspace.libraries :as dwl] [app.main.data.workspace.state-helpers :as wsh] [app.main.data.workspace.texts :as dwt] [app.util.color :as uc] @@ -487,7 +488,7 @@ (dissoc :stops))))))))) (defn update-colorpicker-color - [changes] + [changes add-recent?] (ptk/reify ::update-colorpicker-color ptk/UpdateEvent (update [_ state] @@ -502,7 +503,12 @@ (materialize-color-components)))) (-> state (assoc :type :color) - (dissoc :gradient :stops :editing-stop))))))))) + (dissoc :gradient :stops :editing-stop))))))) + ptk/WatchEvent + (watch [_ state _] + (when add-recent? + (let [formated-color (get-color-from-colorpicker-state (:colorpicker state))] + (rx/of (dwl/add-recent-color formated-color))))))) (defn update-colorpicker-gradient [changes] diff --git a/frontend/src/app/main/ui/workspace/colorpicker.cljs b/frontend/src/app/main/ui/workspace/colorpicker.cljs index bf15bcb36..54d69318e 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker.cljs @@ -69,9 +69,7 @@ (fn [color] (let [recent-color (merge current-color color) recent-color (dc/materialize-color-components recent-color)] - (when (not @drag?) - (st/emit! (dwl/add-recent-color recent-color))) - (st/emit! (dc/update-colorpicker-color color))))) + (st/emit! (dc/update-colorpicker-color recent-color (not @drag?)))))) handle-click-picker (mf/use-fn From aed065eec18a943d3f042e70ca2d70797d5d338a Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 21 Sep 2022 08:43:21 +0200 Subject: [PATCH 07/20] :bug: Fix using gradient for shadow fill --- frontend/src/app/main/data/workspace/colors.cljs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace/colors.cljs b/frontend/src/app/main/data/workspace/colors.cljs index 220567307..f40a5e1c5 100644 --- a/frontend/src/app/main/data/workspace/colors.cljs +++ b/frontend/src/app/main/data/workspace/colors.cljs @@ -243,7 +243,10 @@ ptk/WatchEvent (watch [_ _ _] (rx/of (dch/update-shapes ids (fn [shape] - (let [new-attrs (merge (get-in shape [:shadow index :color]) attrs)] + (let [;; If we try to set a gradient to a shadow (for example using the color selection from multiple shapes) let's use the first stop color + attrs (cond-> attrs + (:gradient attrs) (get-in [:gradient :stops 0])) + new-attrs (merge (get-in shape [:shadow index :color]) attrs)] (assoc-in shape [:shadow index :color] new-attrs)))))))) (defn add-stroke From 3063725a62067f59b8b02e3d70a61e40a3836b47 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 21 Sep 2022 11:58:41 +0200 Subject: [PATCH 08/20] :bug: Fix color type icon doesn't change --- frontend/src/app/main/data/workspace/colors.cljs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/data/workspace/colors.cljs b/frontend/src/app/main/data/workspace/colors.cljs index f40a5e1c5..18d8884e2 100644 --- a/frontend/src/app/main/data/workspace/colors.cljs +++ b/frontend/src/app/main/data/workspace/colors.cljs @@ -499,7 +499,10 @@ (fn [state] (let [state (-> state (update :current-color merge changes) - (update :current-color materialize-color-components))] + (update :current-color materialize-color-components) + ;; current color can be a library one I'm changing via colorpicker + (d/dissoc-in [:current-color :id]) + (d/dissoc-in [:current-color :file-id]))] (if-let [stop (:editing-stop state)] (update-in state [:stops stop] (fn [data] (->> changes (merge data) From 726baefa251419c38b44acd2ca2f703678b7d68c Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 21 Sep 2022 12:21:58 +0200 Subject: [PATCH 09/20] :bug: Fix add to recent colors when changing fill or opacity manually --- .../sidebar/options/rows/color_row.cljs | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs index 3f2200139..c16d88a27 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs @@ -10,7 +10,9 @@ [app.common.data.macros :as dm] [app.common.pages :as cp] [app.main.data.modal :as modal] + [app.main.data.workspace.libraries :as dwl] [app.main.refs :as refs] + [app.main.store :as st] [app.main.ui.components.color-bullet :as cb] [app.main.ui.components.color-input :refer [color-input]] [app.main.ui.components.numeric-input :refer [numeric-input]] @@ -73,18 +75,22 @@ (mf/use-fn (mf/deps color on-change) (fn [new-value] - (on-change (-> color - (assoc :color new-value) - (dissoc :gradient))))) + (let [color (-> color + (assoc :color new-value) + (dissoc :gradient))] + (st/emit! (dwl/add-recent-color color) + (on-change color))))) handle-opacity-change (mf/use-fn (mf/deps color on-change) (fn [value] - (on-change (assoc color - :opacity (/ value 100) - :id nil - :file-id nil)))) + (let [color (assoc color + :opacity (/ value 100) + :id nil + :file-id nil)] + (st/emit! (dwl/add-recent-color color) + (on-change color))))) handle-click-color (mf/use-fn From dfc1b03a602946aa93c248fe733c61bdbf6f3f68 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Wed, 21 Sep 2022 13:59:12 +0200 Subject: [PATCH 10/20] :paperclip: Update CHANGES.md file --- CHANGES.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 063ae3ec4..1108ac03e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,11 @@ - Fix problem with snap to grids [#2221](https://github.com/penpot/penpot/issues/2221) - Fix issue when scaling to value 0 [#2252](https://github.com/penpot/penpot/issues/2252) - Fix problem when moving shapes inside nested frames [Taiga #4113](https://tree.taiga.io/project/penpot/issue/4113) +- Fix color type icon does not change [Taiga #4133](https://tree.taiga.io/project/penpot/issue/4133) +- Fix recent colors are not working [Taiga #4153](https://tree.taiga.io/project/penpot/issue/4153) +- Fix change opacity in colorpicker cause bugged color [Taiga #4154](https://tree.taiga.io/project/penpot/issue/4154) +- Fix gradient colors don't arrive in recent colors palette (https://tree.taiga.io/project/penpot/issue/4155) +- Fix selected colors allow gradients in shadows [Taiga #4156](https://tree.taiga.io/project/penpot/issue/4156) ## 1.15.3-beta From f3115f8f3ac438be073ba5e9acfb6d215a48badb Mon Sep 17 00:00:00 2001 From: Eva Date: Wed, 21 Sep 2022 14:13:11 +0200 Subject: [PATCH 11/20] :bug: Remove gitter information from feedback page --- CHANGES.md | 1 + frontend/src/app/main/ui/settings/feedback.cljs | 8 -------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1108ac03e..2b75de8ad 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ ### :bug: Bugs fixed +- Remove gitter information from feedback page [Taiga #4157](https://tree.taiga.io/project/penpot/issue/4157) - Fix overlay remains open on frame change [Taiga #4066](https://tree.taiga.io/project/penpot/issue/4066) - Fix toggle overlay position [Taiga #4091](https://tree.taiga.io/project/penpot/issue/4091) - Fix overlay closed on clicked outside [Taiga #4027](https://tree.taiga.io/project/penpot/issue/4027) diff --git a/frontend/src/app/main/ui/settings/feedback.cljs b/frontend/src/app/main/ui/settings/feedback.cljs index 4b5055d85..a83c2d424 100644 --- a/frontend/src/app/main/ui/settings/feedback.cljs +++ b/frontend/src/app/main/ui/settings/feedback.cljs @@ -96,14 +96,6 @@ {:href "https://twitter.com/PenpotSupport" :target "_blank"} (tr "feedback.twitter-go-to")] - [:hr] - - [:h2 "Gitter"] - [:p (tr "feedback.chat-subtitle")] - [:a.btn-secondary.btn-large - {:href "https://gitter.im/penpot/community" :target "_blank"} - (tr "feedback.chat-start")] - ])) (mf/defc feedback-page From 6e33d5b31126b96b3d69a21619963b06a562ef41 Mon Sep 17 00:00:00 2001 From: Eva Date: Thu, 22 Sep 2022 13:21:27 +0200 Subject: [PATCH 12/20] :bug: Fix library color selector --- frontend/src/app/main/ui/hooks.cljs | 6 ++-- .../app/main/ui/hooks/mutable_observer.cljs | 2 +- .../app/main/ui/workspace/colorpalette.cljs | 32 +++++++++---------- .../ui/workspace/colorpicker/libraries.cljs | 8 ++--- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/frontend/src/app/main/ui/hooks.cljs b/frontend/src/app/main/ui/hooks.cljs index 6fc2c6850..1b9c06105 100644 --- a/frontend/src/app/main/ui/hooks.cljs +++ b/frontend/src/app/main/ui/hooks.cljs @@ -300,13 +300,13 @@ [key default] (let [id (use-id) state (mf/use-state (get @storage key default)) - stream (mf/with-memo [] + stream (mf/with-memo [id] (->> mbc/stream - (rx/filter #(= (:type %) key)) (rx/filter #(not= (:id %) id)) + (rx/filter #(= (:type %) key)) (rx/map deref)))] - (mf/with-effect [@state key] + (mf/with-effect [@state key id] (mbc/emit! id key @state) (swap! storage assoc key @state)) diff --git a/frontend/src/app/main/ui/hooks/mutable_observer.cljs b/frontend/src/app/main/ui/hooks/mutable_observer.cljs index 239deea2e..7a81188b2 100644 --- a/frontend/src/app/main/ui/hooks/mutable_observer.cljs +++ b/frontend/src/app/main/ui/hooks/mutable_observer.cljs @@ -27,7 +27,7 @@ (remove #(= "transform" (.-attributeName ^js %))))] (when (d/not-empty? mutations) (on-change (mf/ref-val node-ref)))))) - + set-node (mf/use-callback (mf/deps on-mutation) diff --git a/frontend/src/app/main/ui/workspace/colorpalette.cljs b/frontend/src/app/main/ui/workspace/colorpalette.cljs index 501278cdc..cf87281f8 100644 --- a/frontend/src/app/main/ui/workspace/colorpalette.cljs +++ b/frontend/src/app/main/ui/workspace/colorpalette.cljs @@ -37,17 +37,17 @@ (mf/defc palette [{:keys [current-colors recent-colors file-colors shared-libs selected on-select]}] (let [;; We had to do this due to a bug that leave some bugged colors - current-colors (filter #(or (:gradient %) (:color %)) current-colors) - state (mf/use-state {:show-menu false}) + current-colors (h/use-equal-memo (filter #(or (:gradient %) (:color %)) current-colors)) + state (mf/use-state {:show-menu false}) - width (:width @state 0) - visible (/ width 66) + width (:width @state 0) + visible (/ width 66) - offset (:offset @state 0) - max-offset (- (count current-colors) - visible) + offset (:offset @state 0) + max-offset (- (count current-colors) + visible) - container (mf/use-ref nil) + container (mf/use-ref nil) {:keys [on-pointer-down on-lost-pointer-capture on-mouse-move parent-ref size]} (use-resize-hook :palette 72 54 80 :y true :bottom) @@ -139,7 +139,7 @@ (tr "workspace.libraries.colors.file-library") (str/ffmt " (%)" (count file-colors)))] [:div.color-sample - (for [[i color] (map-indexed vector (take 7 (vals file-colors))) ] + (for [[i color] (map-indexed vector (take 7 (vals file-colors)))] [:& cb/color-bullet {:key (dm/str "color-" i) :color color}])]] @@ -150,7 +150,7 @@ [:div.library-name (str (tr "workspace.libraries.colors.recent-colors") (str/format " (%s)" (count recent-colors)))] [:div.color-sample - (for [[idx color] (map-indexed vector (take 7 (reverse recent-colors))) ] + (for [[idx color] (map-indexed vector (take 7 (reverse recent-colors)))] [:& cb/color-bullet {:key (str "color-" idx) :color color}])]]]] @@ -185,13 +185,11 @@ on-select (mf/use-fn #(reset! selected %))] (mf/with-effect [@selected] - (fn [] - (reset! colors - (into [] - (cond - (= @selected :recent) (reverse recent-colors) - (= @selected :file) (->> (vals file-colors) (sort-by :name)) - :else (->> (library->colors shared-libs @selected) (sort-by :name))))))) + (let [colors' (cond + (= @selected :recent) (reverse recent-colors) + (= @selected :file) (->> (vals file-colors) (sort-by :name)) + :else (->> (library->colors shared-libs @selected) (sort-by :name)))] + (reset! colors (into [] colors')))) (mf/with-effect [recent-colors @selected] (when (= @selected :recent) diff --git a/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs b/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs index 9825d5da6..82a7d9e7d 100644 --- a/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs +++ b/frontend/src/app/main/ui/workspace/colorpicker/libraries.cljs @@ -7,7 +7,7 @@ (ns app.main.ui.workspace.colorpicker.libraries (:require [app.common.data.macros :as dm] - [app.main.data.workspace.colors :as dc] + [app.main.data.workspace.colors :as mdc] [app.main.refs :as refs] [app.main.store :as st] [app.main.ui.components.color-bullet :refer [color-bullet]] @@ -19,13 +19,13 @@ (mf/defc libraries [{:keys [on-select-color on-add-library-color disable-gradient disable-opacity]}] - (let [selected (h/use-shared-state dc/colorpicker-selected-broadcast-key :recent) + (let [selected (h/use-shared-state mdc/colorpicker-selected-broadcast-key :recent) current-colors (mf/use-state []) shared-libs (mf/deref refs/workspace-libraries) file-colors (mf/deref refs/workspace-file-colors) recent-colors (mf/deref refs/workspace-recent-colors) - recent-colors (filter #(or (:gradient %) (:color %)) recent-colors) + recent-colors (h/use-equal-memo (filter #(or (:gradient %) (:color %)) recent-colors)) on-library-change (mf/use-fn @@ -81,7 +81,7 @@ i/plus]) [:div.color-bullet.button {:style {:background-color "var(--color-white)"} - :on-click #(st/emit! (dc/show-palette @selected))} + :on-click #(st/emit! (mdc/show-palette @selected))} i/palette] (for [[idx color] (map-indexed vector @current-colors)] From 79e35e26084416ba14608f3d5c5b556af72e836e Mon Sep 17 00:00:00 2001 From: Eva Date: Thu, 22 Sep 2022 13:33:34 +0200 Subject: [PATCH 13/20] :bug: Fix precision --- common/src/app/common/geom/matrix.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/app/common/geom/matrix.cljc b/common/src/app/common/geom/matrix.cljc index f83f5cca7..b9d8eca19 100644 --- a/common/src/app/common/geom/matrix.cljc +++ b/common/src/app/common/geom/matrix.cljc @@ -14,7 +14,7 @@ [app.common.spec :as us] [clojure.spec.alpha :as s])) -(def precision 3) +(def precision 6) ;; --- Matrix Impl From 5d01a0e24c38a9d180ac6f0fe4b0c18a1bdfe6d8 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 22 Sep 2022 14:04:00 +0200 Subject: [PATCH 14/20] :bug: Fix import files with unexpected format or invalid content --- CHANGES.md | 1 + frontend/src/app/main/ui/dashboard/import.cljs | 7 ++++--- frontend/src/app/worker/import.cljs | 15 ++++++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 2b75de8ad..fff4250c8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -17,6 +17,7 @@ - Fix change opacity in colorpicker cause bugged color [Taiga #4154](https://tree.taiga.io/project/penpot/issue/4154) - Fix gradient colors don't arrive in recent colors palette (https://tree.taiga.io/project/penpot/issue/4155) - Fix selected colors allow gradients in shadows [Taiga #4156](https://tree.taiga.io/project/penpot/issue/4156) +- Fix import files with unexpected format or invalid content [Taiga #4136](https://tree.taiga.io/project/penpot/issue/4136) ## 1.15.3-beta diff --git a/frontend/src/app/main/ui/dashboard/import.cljs b/frontend/src/app/main/ui/dashboard/import.cljs index 565dda8fb..bde0f44f3 100644 --- a/frontend/src/app/main/ui/dashboard/import.cljs +++ b/frontend/src/app/main/ui/dashboard/import.cljs @@ -304,7 +304,8 @@ success-files (->> @state :files (filter #(and (= (:status %) :import-finish) (empty? (:errors %)))) count) pending-analysis? (> (->> @state :files (filter #(= (:status %) :analyzing)) count) 0) pending-import? (> (->> @state :files (filter #(= (:status %) :importing)) count) 0) - files (->> (:files @state) (filterv (comp not :deleted?)))] + files (->> (:files @state) (filterv (comp not :deleted?))) + valid-files? (> (->> files (filterv (fn [x] (not= (:status x) :analyze-error))) count) 0)] (mf/use-effect (fn [] @@ -359,7 +360,7 @@ {:class "primary" :type "button" :value (tr "labels.continue") - :disabled pending-analysis? + :disabled (or pending-analysis? (not valid-files?)) :on-click handle-continue}]) (when (= :importing (:status @state)) @@ -367,5 +368,5 @@ {:class "primary" :type "button" :value (tr "labels.accept") - :disabled pending-import? + :disabled (or pending-import? (not valid-files?)) :on-click handle-accept}])]]]])) diff --git a/frontend/src/app/worker/import.cljs b/frontend/src/app/worker/import.cljs index aff53ab5b..a1538e4b4 100644 --- a/frontend/src/app/worker/import.cljs +++ b/frontend/src/app/worker/import.cljs @@ -19,6 +19,7 @@ [app.common.uuid :as uuid] [app.main.repo :as rp] [app.util.http :as http] + [app.util.i18n :as i18n :refer [tr]] [app.util.import.parser :as cip] [app.util.json :as json] [app.util.webapi :as wapi] @@ -526,7 +527,8 @@ sg (areduce u8 i ret "" (str ret (if (zero? i) "" " ") (.toString (aget u8 i) 8)))] (case sg "120 113 3 4" "application/zip" - "application/octet-stream"))) + "1 13 32 206" "application/octet-stream" + "other"))) (defmethod impl/handler :analyze-import [{:keys [files]}] @@ -560,8 +562,15 @@ :file-id file-id :files {file-id {:name (:name file)}} :status :ready} - :type "application/octet-stream"}))))) - (rx/catch #(rx/of {:uri (:uri file) :error (.-message %)})))))))) + :type "application/octet-stream"})))) + (->> st + (rx/filter (fn [data] (= "other" (:type data)))) + (rx/map (fn [_] + {:uri (:uri file) + :error (tr "dashboard.import.analyze-error")})))) + (rx/catch (fn [data] + (let [error (or (.-message data) (tr "dashboard.import.analyze-error"))] + (rx/of {:uri (:uri file) :error error})))))))))) (defmethod impl/handler :import-files [{:keys [project-id files]}] From 441e9627b5da1286478171e837519726ac33a8d5 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Thu, 22 Sep 2022 15:56:48 +0200 Subject: [PATCH 15/20] :bug: Fix Wrong shortcut button tip of Delete function --- CHANGES.md | 1 + frontend/src/app/main/data/shortcuts.cljs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index fff4250c8..1ac9d5ae5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -18,6 +18,7 @@ - Fix gradient colors don't arrive in recent colors palette (https://tree.taiga.io/project/penpot/issue/4155) - Fix selected colors allow gradients in shadows [Taiga #4156](https://tree.taiga.io/project/penpot/issue/4156) - Fix import files with unexpected format or invalid content [Taiga #4136](https://tree.taiga.io/project/penpot/issue/4136) +- Fix wrong shortcut button tip of "Delete" function [Taiga #4162](https://tree.taiga.io/project/penpot/issue/4162) ## 1.15.3-beta diff --git a/frontend/src/app/main/data/shortcuts.cljs b/frontend/src/app/main/data/shortcuts.cljs index 0494f9913..a30bba898 100644 --- a/frontend/src/app/main/data/shortcuts.cljs +++ b/frontend/src/app/main/data/shortcuts.cljs @@ -93,7 +93,7 @@ [] (if (cf/check-platform? :macos) mac-delete - "Supr")) + "Del")) (defn esc [] From 1ef4d42b28e930fbd53facc7fdc96af6a7b6356d Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 23 Sep 2022 08:16:18 +0200 Subject: [PATCH 16/20] :bug: Fix error after user drags layers in search functionality --- CHANGES.md | 1 + .../app/main/ui/workspace/sidebar/layers.cljs | 32 +++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1ac9d5ae5..06c1c20c2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -19,6 +19,7 @@ - Fix selected colors allow gradients in shadows [Taiga #4156](https://tree.taiga.io/project/penpot/issue/4156) - Fix import files with unexpected format or invalid content [Taiga #4136](https://tree.taiga.io/project/penpot/issue/4136) - Fix wrong shortcut button tip of "Delete" function [Taiga #4162](https://tree.taiga.io/project/penpot/issue/4162) +- Fix error after user drags any layer in search functionality [Taiga #4161](https://tree.taiga.io/project/penpot/issue/4161) ## 1.15.3-beta diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs index 05ad9bdfd..87265242d 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs @@ -90,7 +90,7 @@ (l/derived refs/workspace-local))) (mf/defc layer-item - [{:keys [index item selected objects] :as props}] + [{:keys [index item selected objects sortable?] :as props}] (let [id (:id item) selected? (contains? selected id) container? (or (cph/frame-shape? item) @@ -170,16 +170,17 @@ (when-not expanded? (st/emit! (dwc/toggle-collapse (:id item))))) - [dprops dref] (hooks/use-sortable - :data-type "penpot/layer" - :on-drop on-drop - :on-drag on-drag - :on-hold on-hold - :disabled @disable-drag - :detect-center? container? - :data {:id (:id item) - :index index - :name (:name item)}) + [dprops dref] (when sortable? + (hooks/use-sortable + :data-type "penpot/layer" + :on-drop on-drop + :on-drag on-drag + :on-hold on-hold + :disabled @disable-drag + :detect-center? container? + :data {:id (:id item) + :index index + :name (:name item)})) ref (mf/use-ref)] @@ -276,13 +277,15 @@ :selected selected :index index :objects objects - :key id}] + :key id + :sortable? true}] [:& layer-item {:item obj :selected selected :index index :objects objects - :key id}])))]])) + :key id + :sortable? true}])))]])) (mf/defc filters-tree {::mf/wrap [#(mf/memo % =) @@ -299,7 +302,8 @@ :selected selected :index index :objects objects - :key id}]))])) + :key id + :sortable? false}]))])) (defn calc-reparented-objects From 944cfd0fc4a2c396afc9203c5c6696808fc161ae Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 23 Sep 2022 08:23:27 +0200 Subject: [PATCH 17/20] :bug: Fix font search works only with lowercase letters --- CHANGES.md | 1 + frontend/src/app/main/ui/dashboard/fonts.cljs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 06c1c20c2..dfd0a30cb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -20,6 +20,7 @@ - Fix import files with unexpected format or invalid content [Taiga #4136](https://tree.taiga.io/project/penpot/issue/4136) - Fix wrong shortcut button tip of "Delete" function [Taiga #4162](https://tree.taiga.io/project/penpot/issue/4162) - Fix error after user drags any layer in search functionality [Taiga #4161](https://tree.taiga.io/project/penpot/issue/4161) +- Fix font search works only with lowercase letters [Taiga #4140](https://tree.taiga.io/project/penpot/issue/4140) ## 1.15.3-beta diff --git a/frontend/src/app/main/ui/dashboard/fonts.cljs b/frontend/src/app/main/ui/dashboard/fonts.cljs index 732aa0e4a..e5f42a86c 100644 --- a/frontend/src/app/main/ui/dashboard/fonts.cljs +++ b/frontend/src/app/main/ui/dashboard/fonts.cljs @@ -292,7 +292,7 @@ (mf/use-callback (fn [event] (let [val (dom/get-target-val event)] - (reset! sterm val))))] + (reset! sterm (str/lower val)))))] [:div.dashboard-installed-fonts [:h3 (tr "labels.installed-fonts")] From a9e8f4eb676c7a85b07059e5386108762abfb318 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 23 Sep 2022 09:17:59 +0200 Subject: [PATCH 18/20] :bug: Fix Terms and Privacy links overlapping --- CHANGES.md | 1 + frontend/resources/styles/main/layouts/login.scss | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index dfd0a30cb..d86a920e7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -21,6 +21,7 @@ - Fix wrong shortcut button tip of "Delete" function [Taiga #4162](https://tree.taiga.io/project/penpot/issue/4162) - Fix error after user drags any layer in search functionality [Taiga #4161](https://tree.taiga.io/project/penpot/issue/4161) - Fix font search works only with lowercase letters [Taiga #4140](https://tree.taiga.io/project/penpot/issue/4140) +- Fix Terms and Privacy links overlapping [Taiga #4137](https://tree.taiga.io/project/penpot/issue/4137) ## 1.15.3-beta diff --git a/frontend/resources/styles/main/layouts/login.scss b/frontend/resources/styles/main/layouts/login.scss index 574343485..b092b7e23 100644 --- a/frontend/resources/styles/main/layouts/login.scss +++ b/frontend/resources/styles/main/layouts/login.scss @@ -11,6 +11,8 @@ display: grid; grid-template-rows: auto; grid-template-columns: 33% auto; + height: 100vh; + overflow-y: scroll; } .auth-sidebar { @@ -53,6 +55,7 @@ height: 100vh; justify-content: center; position: relative; + min-height: 48rem; input { margin-bottom: 0px; From fad2e51cbe87a7ef32c799675065568f62264b9e Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 26 Sep 2022 14:14:35 +0200 Subject: [PATCH 19/20] :tada: Add better hashing approach for database locking on Uuids --- backend/deps.edn | 1 + backend/src/app/db.clj | 13 ++++++++++++- common/src/app/common/uuid.cljc | 12 +++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/backend/deps.edn b/backend/deps.edn index 650c8a479..a1c4feac5 100644 --- a/backend/deps.edn +++ b/backend/deps.edn @@ -30,6 +30,7 @@ com.zaxxer/HikariCP {:mvn/version "5.0.1"} funcool/datoteka {:mvn/version "3.0.64"} + io.whitfin/siphash {:mvn/version "2.0.0"} buddy/buddy-hashers {:mvn/version "1.8.158"} buddy/buddy-sign {:mvn/version "3.4.333"} diff --git a/backend/src/app/db.clj b/backend/src/app/db.clj index 8785f272e..85dad9b7f 100644 --- a/backend/src/app/db.clj +++ b/backend/src/app/db.clj @@ -27,6 +27,8 @@ com.zaxxer.hikari.HikariConfig com.zaxxer.hikari.HikariDataSource com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFactory + io.whitfin.siphash.SipHasher + io.whitfin.siphash.SipHasherContainer java.io.InputStream java.io.OutputStream java.lang.AutoCloseable @@ -431,10 +433,19 @@ ;; --- Locks +(def ^:private siphash-state + (SipHasher/container + (uuid/get-bytes uuid/zero))) + +(defn uuid->hash-code + [o] + (.hash ^SipHasherContainer siphash-state + ^bytes (uuid/get-bytes o))) + (defn- xact-check-param [n] (cond - (uuid? n) (uuid/get-word-high n) + (uuid? n) (uuid->hash-code n) (int? n) n :else (throw (IllegalArgumentException. "uuid or number allowed")))) diff --git a/common/src/app/common/uuid.cljc b/common/src/app/common/uuid.cljc index 1a71256ef..011a50b6e 100644 --- a/common/src/app/common/uuid.cljc +++ b/common/src/app/common/uuid.cljc @@ -12,7 +12,9 @@ #?(:clj [clojure.core :as c]) #?(:cljs [app.common.uuid-impl :as impl]) #?(:cljs [cljs.core :as c])) - #?(:clj (:import java.util.UUID))) + #?(:clj (:import + java.util.UUID + java.nio.ByteBuffer))) (def zero #uuid "00000000-0000-0000-0000-000000000000") @@ -51,3 +53,11 @@ #?(:clj (dm/export impl/get-word-low)) + +#?(:clj + (defn get-bytes + [^UUID o] + (let [buf (ByteBuffer/allocate 16)] + (.putLong buf (.getMostSignificantBits o)) + (.putLong buf (.getLeastSignificantBits o)) + (.array buf)))) From f67c4ddca0c78c40ca1fe57b44b477e3812ea758 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 26 Sep 2022 08:54:12 +0200 Subject: [PATCH 20/20] :bug: Fix woff2 generation --- backend/src/app/media.clj | 20 +++----------------- backend/test/app/services_fonts_test.clj | 2 -- backend/test/app/storage_test.clj | 6 +++--- 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/backend/src/app/media.clj b/backend/src/app/media.clj index 99cbe15cd..9434d8f2b 100644 --- a/backend/src/app/media.clj +++ b/backend/src/app/media.clj @@ -229,17 +229,6 @@ (when (zero? (:exit res)) foutput))) - (ttf-or-otf->woff2 [data] - ;; NOTE: foutput is not used directly, it represents the - ;; default output of the exection of the underlying - ;; command. - (let [finput (tmp/tempfile :prefix "penpot.font." :suffix ".tmp") - foutput (fs/path (str (fs/base finput) ".woff2")) - _ (bs/write-to-file! data finput) - res (sh/sh "woff2_compress" (str finput))] - (when (zero? (:exit res)) - foutput))) - (woff->sfnt [data] (let [finput (tmp/tempfile :prefix "penpot" :suffix "") _ (bs/write-to-file! data finput) @@ -271,15 +260,13 @@ (let [data (get input "font/ttf")] (-> input (update "font/otf" gen-if-nil #(ttf->otf data)) - (update "font/woff" gen-if-nil #(ttf-or-otf->woff data)) - (assoc "font/woff2" (ttf-or-otf->woff2 data)))) + (update "font/woff" gen-if-nil #(ttf-or-otf->woff data)))) (contains? current "font/otf") (let [data (get input "font/otf")] (-> input (update "font/woff" gen-if-nil #(ttf-or-otf->woff data)) - (assoc "font/ttf" (otf->ttf data)) - (assoc "font/woff2" (ttf-or-otf->woff2 data)))) + (assoc "font/ttf" (otf->ttf data)))) (contains? current "font/woff") (let [data (get input "font/woff") @@ -291,8 +278,7 @@ (let [stype (get-sfnt-type sfnt)] (cond-> input true - (-> (assoc "font/woff" data) - (assoc "font/woff2" (ttf-or-otf->woff2 sfnt))) + (-> (assoc "font/woff" data)) (= stype :otf) (-> (assoc "font/otf" sfnt) diff --git a/backend/test/app/services_fonts_test.clj b/backend/test/app/services_fonts_test.clj index dfe87e569..62619ae56 100644 --- a/backend/test/app/services_fonts_test.clj +++ b/backend/test/app/services_fonts_test.clj @@ -46,7 +46,6 @@ (t/is (uuid? (:ttf-file-id result))) (t/is (uuid? (:otf-file-id result))) (t/is (uuid? (:woff1-file-id result))) - (t/is (uuid? (:woff2-file-id result))) (t/are [k] (= (get params k) (get result k)) :team-id @@ -82,7 +81,6 @@ (t/is (uuid? (:ttf-file-id result))) (t/is (uuid? (:otf-file-id result))) (t/is (uuid? (:woff1-file-id result))) - (t/is (uuid? (:woff2-file-id result))) (t/are [k] (= (get params k) (get result k)) :team-id diff --git a/backend/test/app/storage_test.clj b/backend/test/app/storage_test.clj index 3a921c8aa..f2c276c9c 100644 --- a/backend/test/app/storage_test.clj +++ b/backend/test/app/storage_test.clj @@ -233,7 +233,7 @@ ;; run the touched gc task (let [task (:app.storage/gc-touched-task th/*system*) res (task {})] - (t/is (= 6 (:freeze res))) + (t/is (= 5 (:freeze res))) (t/is (= 0 (:delete res))) (let [result-1 (:result out1) @@ -248,7 +248,7 @@ ;; Run the task again (let [res (task {})] (t/is (= 2 (:freeze res))) - (t/is (= 4 (:delete res)))) + (t/is (= 3 (:delete res)))) ;; now check that there are no touched objects (let [res (db/exec-one! th/*pool* ["select count(*) from storage_object where touched_at is not null"])] @@ -256,7 +256,7 @@ ;; now check that all objects are marked to be deleted (let [res (db/exec-one! th/*pool* ["select count(*) from storage_object where deleted_at is not null"])] - (t/is (= 4 (:count res)))))))) + (t/is (= 3 (:count res)))))))) (t/deftest test-touched-gc-task-3 (let [storage (-> (:app.storage/storage th/*system*)