diff --git a/CHANGES.md b/CHANGES.md index c2447d24d..907682019 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -50,11 +50,14 @@ - Improved share link options. Now you can allow non-team members to comment and/or inspect [Taiga #3056] (https://tree.taiga.io/project/penpot/us/3056) - Signin/Signup from shared link [Taiga #3472](https://tree.taiga.io/project/penpot/us/3472) - Support for import/export binary format [Taiga #2991](https://tree.taiga.io/project/penpot/us/2991) -- Comments positioning [Taiga #https://2007](tree.taiga.io/project/penpot/us/2007) +- Comments positioning [Taiga #2007](https://tree.taiga.io/project/penpot/us/2007) +- Select all inside a group select only the objects at this group level [Taiga #2382](https://tree.taiga.io/project/penpot/issue/2382) ### :bug: Bugs fixed - Fix font rendering on grid thumbnails [Taiga #3473](https://tree.taiga.io/project/penpot/issue/3473) +- Fix intro action in multi input [Taiga #3541](https://tree.taiga.io/project/penpot/issue/3541) +- Fix team default image [Taiga #3919](https://tree.taiga.io/project/penpot/issue/3919) - Fix problem with group coordinates [#2008](https://github.com/penpot/penpot/issues/2008) - Fix problem with line-height and texts [Taiga #3578](https://tree.taiga.io/project/penpot/issue/3578) - Fix moving frame-guides outside frames [Taiga #3839](https://tree.taiga.io/project/penpot/issue/3839) @@ -64,7 +67,7 @@ - Fix copy and paste layers order [Taiga #1617](https://tree.taiga.io/project/penpot/issue/1617) - Fix unexpected removal of guides on copy&paste frames [Taiga #3887](https://tree.taiga.io/project/penpot/issue/3887) by @andrewzhurov - Fix props preserving on copy&paste texts [Taiga #3629](https://tree.taiga.io/project/penpot/issue/3629) by @andrewzhurov - +- Fix unexpected layers ungrouping on moving it [Taiga #3932](https://tree.taiga.io/project/penpot/issue/3932) by @andrewzhurov ### :arrow_up: Deps updates ### :heart: Community contributions by (Thank you!) diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index e1e7862a7..a8d10c96f 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -172,29 +172,56 @@ (let [objects (wsh/lookup-page-objects state)] (rx/of (dwc/expand-all-parents ids objects)))))) + + +(defn- select-siblings + [state parent] + (let [children (wsh/lookup-shapes state (:shapes parent)) + selected (into (d/ordered-set) + (comp (remove :blocked) (map :id)) + children)] + (rx/of (select-shapes selected)))) + +(defn- select-all-frame + [state] + (let [focus (:workspace-focus-selected state) + objects (-> (wsh/lookup-page-objects state) + (cp/focus-objects focus)) + + selected (let [frame-ids (into #{} (comp + (map (d/getf objects)) + (map :frame-id)) + (wsh/lookup-selected state)) + frame-id (if (= 1 (count frame-ids)) + (first frame-ids) + uuid/zero)] + (cph/get-immediate-children objects frame-id)) + + selected (into (d/ordered-set) + (comp (remove :blocked) (map :id)) + selected)] + + (rx/of (select-shapes selected)))) + + (defn select-all [] (ptk/reify ::select-all ptk/WatchEvent (watch [_ state _] - (let [focus (:workspace-focus-selected state) - objects (-> (wsh/lookup-page-objects state) - (cp/focus-objects focus)) + (let [current-selection-parents (->> (wsh/lookup-selected state) + (wsh/lookup-shapes state) + (into #{} (map :parent-id))) + num-parents (count current-selection-parents) + parent (when (= num-parents 1) + (wsh/lookup-shape state (first current-selection-parents)))] - selected (let [frame-ids (into #{} (comp - (map (d/getf objects)) - (map :frame-id)) - (wsh/lookup-selected state)) - frame-id (if (= 1 (count frame-ids)) - (first frame-ids) - uuid/zero)] - (cph/get-immediate-children objects frame-id)) - - selected (into (d/ordered-set) - (comp (remove :blocked) (map :id)) - selected)] - - (rx/of (select-shapes selected)))))) + (case num-parents + 0 (select-all-frame state) + 1 (if (cph/frame-shape? parent) + (select-all-frame state) + (select-siblings state parent)) + nil))))) (defn deselect-all "Clear all possible state of drawing, edition diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 51118544e..4357efc9a 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -737,7 +737,7 @@ displ (gmt/translate-matrix delta)] (rx/of (set-modifiers [id] {:displacement displ} false true) - (apply-modifiers)))))) + (apply-modifiers [id])))))) (defn- calculate-frame-for-move [ids] diff --git a/frontend/src/app/main/ui/components/forms.cljs b/frontend/src/app/main/ui/components/forms.cljs index 8b4723a28..24720a645 100644 --- a/frontend/src/app/main/ui/components/forms.cljs +++ b/frontend/src/app/main/ui/components/forms.cljs @@ -243,7 +243,7 @@ (into [] (distinct) (conj coll item))) (mf/defc multi-input - [{:keys [form label class name trim valid-item-fn] :as props}] + [{:keys [form label class name trim valid-item-fn on-submit] :as props}] (let [form (or form (mf/use-ctx form-ctx)) input-name (get props :name) touched? (get-in @form [:touched input-name]) @@ -297,8 +297,11 @@ (dom/prevent-default event) (dom/stop-propagation event) (let [val (cond-> @value trim str/trim)] - (reset! value "") - (swap! items conj-dedup {:text val :valid (valid-item-fn val)}))) + (when (and (kbd/enter? event) (str/empty? @value) (not-empty @items)) + (on-submit form)) + (when (not (str/empty? @value)) + (reset! value "") + (swap! items conj-dedup {:text val :valid (valid-item-fn val)})))) (and (kbd/backspace? event) (str/empty? @value)) diff --git a/frontend/src/app/main/ui/dashboard/team.cljs b/frontend/src/app/main/ui/dashboard/team.cljs index 4281a8219..98c92857f 100644 --- a/frontend/src/app/main/ui/dashboard/team.cljs +++ b/frontend/src/app/main/ui/dashboard/team.cljs @@ -142,7 +142,8 @@ :auto-focus? true :trim true :valid-item-fn us/parse-email - :label (tr "modals.invite-member.emails")}] + :label (tr "modals.invite-member.emails") + :on-submit on-submit}] [:& fm/select {:name :role :options roles}]] [:div.action-buttons @@ -605,7 +606,7 @@ [:div.label (tr "dashboard.team-info")] [:div.name (:name team)] [:div.icon - [:span.update-overlay {:on-click on-image-click} i/exit] + [:span.update-overlay {:on-click on-image-click} i/image] [:img {:src (cfg/resolve-team-photo-url team)}] [:& file-uploader {:accept "image/jpeg,image/png" :multi false diff --git a/frontend/src/app/main/ui/onboarding/team_choice.cljs b/frontend/src/app/main/ui/onboarding/team_choice.cljs index f577c873a..4a70f4f07 100644 --- a/frontend/src/app/main/ui/onboarding/team_choice.cljs +++ b/frontend/src/app/main/ui/onboarding/team_choice.cljs @@ -185,6 +185,7 @@ :auto-focus? true :trim true :valid-item-fn us/parse-email + :on-submit on-submit :label (tr "modals.invite-member.emails")}]] [:div.buttons