Merge remote-tracking branch 'origin/staging' into develop

This commit is contained in:
Andrey Antukh 2025-07-08 11:04:29 +02:00
commit e554b9fcb7
7 changed files with 25 additions and 62 deletions

View File

@ -21,7 +21,7 @@
- Fix display error message on register form [Taiga #11444](https://tree.taiga.io/project/penpot/issue/11444) - Fix display error message on register form [Taiga #11444](https://tree.taiga.io/project/penpot/issue/11444)
- Fix toggle focus mode did not restore viewport and selection upon exit [GitHub #6280](https://github.com/penpot/penpot/issues/6820) - Fix toggle focus mode did not restore viewport and selection upon exit [GitHub #6280](https://github.com/penpot/penpot/issues/6820)
## 2.8.0 (Next / Unreleased) ## 2.8.0
### :rocket: Epics and highlights ### :rocket: Epics and highlights
@ -36,8 +36,8 @@ on [its own changelog](library/CHANGES.md)
**Penpot migrate from Redis to Valkey** **Penpot migrate from Redis to Valkey**
As [Valkey](https://valkey.io/) is an opne-souce fork of [Redis](https://redis.io/) As [Valkey](https://valkey.io/) is an opne-souce fork of [Redis](https://redis.io/)
version 7.2.4, this version of Penpot will be compatible with Redis but may diverge version 7.2.4, this version of Penpot will be compatible with Redis but may diverge
in future versions. Therefore, **migration from Redis to ValKey is recommended for all in future versions. Therefore, **migration from Redis to ValKey is recommended for all
on-premises instances** that want to keep up to date. on-premises instances** that want to keep up to date.
### :heart: Community contributions (Thank you!) ### :heart: Community contributions (Thank you!)

View File

@ -139,7 +139,8 @@
'~:status', CASE COALESCE(p.props->'~:subscription'->>'~:type', 'professional') '~:status', CASE COALESCE(p.props->'~:subscription'->>'~:type', 'professional')
WHEN 'professional' THEN 'active' WHEN 'professional' THEN 'active'
ELSE COALESCE(p.props->'~:subscription'->>'~:status', 'incomplete') ELSE COALESCE(p.props->'~:subscription'->>'~:status', 'incomplete')
END END,
'~:seats', p.props->'~:quantity'
) AS subscription ) AS subscription
FROM team_profile_rel AS tp FROM team_profile_rel AS tp
JOIN team AS t ON (t.id = tp.team_id) JOIN team AS t ON (t.id = tp.team_id)

View File

@ -1020,8 +1020,8 @@
[data _] [data _]
(let [update-colors (let [update-colors
(fn [colors] (fn [colors]
(into {} (filter #(-> % val types.color/valid-color?) colors)))] (into {} (filter #(-> % val types.color/valid-library-color?) colors)))]
(update data :colors update-colors))) (d/update-when data :colors update-colors)))
(defmethod migrate-data "legacy-52" (defmethod migrate-data "legacy-52"
[data _] [data _]
@ -1035,7 +1035,6 @@
(update data :pages-index d/update-vals update-page))) (update data :pages-index d/update-vals update-page)))
(defmethod migrate-data "legacy-53" (defmethod migrate-data "legacy-53"
[data _] [data _]
(migrate-data data "legacy-26")) (migrate-data data "legacy-26"))
@ -1518,6 +1517,17 @@
(d/update-when data :colors d/update-vals clear-color))) (d/update-when data :colors d/update-vals clear-color)))
(defmethod migrate-data "0009-clean-library-colors"
[data _]
(d/update-when data :colors
(fn [colors]
(reduce-kv (fn [colors id color]
(if (types.color/valid-library-color? color)
colors
(dissoc colors id)))
colors
colors))))
(defmethod migrate-data "0009-add-partial-text-touched-flags" (defmethod migrate-data "0009-add-partial-text-touched-flags"
[data _] [data _]
(letfn [(update-object [page object] (letfn [(update-object [page object]
@ -1607,4 +1617,5 @@
"0006-fix-old-texts-fills" "0006-fix-old-texts-fills"
"0007-clear-invalid-strokes-and-fills-v2" "0007-clear-invalid-strokes-and-fills-v2"
"0008-fix-library-colors-v4" "0008-fix-library-colors-v4"
"0009-clean-library-colors"
"0009-add-partial-text-touched-flags"])) "0009-add-partial-text-touched-flags"]))

View File

@ -117,6 +117,7 @@
[:ref-id {:optional true} ::sm/uuid] [:ref-id {:optional true} ::sm/uuid]
[:ref-file {:optional true} ::sm/uuid]]) [:ref-file {:optional true} ::sm/uuid]])
;; This schema represent an "applied color"
(def schema:color (def schema:color
[:and [:and
[:merge {:title "Color"} [:merge {:title "Color"}

View File

@ -20,7 +20,8 @@
[app.common.schema.generators :as sg] [app.common.schema.generators :as sg]
[app.common.svg.path :as svg.path] [app.common.svg.path :as svg.path]
[app.common.transit :as t] [app.common.transit :as t]
[app.common.types.path :as-alias path]) [app.common.types.path :as-alias path]
[cuerdas.core :as str])
(:import (:import
#?(:cljs [goog.string StringBuffer] #?(:cljs [goog.string StringBuffer]
:clj [java.nio ByteBuffer ByteOrder]))) :clj [java.nio ByteBuffer ByteOrder])))
@ -530,7 +531,9 @@
:decode/json (fn [s] :decode/json (fn [s]
(cond (cond
(string? s) (string? s)
(from-string s) (if (str/empty? s)
(from-plain [])
(from-string s))
(vector? s) (vector? s)
(let [decode-fn (deref decoder)] (let [decode-fn (deref decoder)]

View File

@ -15,7 +15,6 @@
[app.main.ui.inspect.attributes.blur :refer [blur-panel]] [app.main.ui.inspect.attributes.blur :refer [blur-panel]]
[app.main.ui.inspect.attributes.fill :refer [fill-panel]] [app.main.ui.inspect.attributes.fill :refer [fill-panel]]
[app.main.ui.inspect.attributes.geometry :refer [geometry-panel]] [app.main.ui.inspect.attributes.geometry :refer [geometry-panel]]
[app.main.ui.inspect.attributes.image :refer [image-panel]]
[app.main.ui.inspect.attributes.layout :refer [layout-panel]] [app.main.ui.inspect.attributes.layout :refer [layout-panel]]
[app.main.ui.inspect.attributes.layout-element :refer [layout-element-panel]] [app.main.ui.inspect.attributes.layout-element :refer [layout-element-panel]]
[app.main.ui.inspect.attributes.shadow :refer [shadow-panel]] [app.main.ui.inspect.attributes.shadow :refer [shadow-panel]]
@ -69,7 +68,6 @@
:stroke stroke-panel :stroke stroke-panel
:shadow shadow-panel :shadow shadow-panel
:blur blur-panel :blur blur-panel
:image image-panel
:text text-panel :text text-panel
:svg svg-panel :svg svg-panel
:variant variant-panel*) :variant variant-panel*)

View File

@ -1,51 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.main.ui.inspect.attributes.image
(:require-macros [app.main.style :as stl])
(:require
[app.common.files.helpers :as cfh]
[app.common.media :as cm]
[app.config :as cf]
[app.main.ui.components.copy-button :refer [copy-button*]]
[app.util.code-gen.style-css :as css]
[app.util.i18n :refer [tr]]
[cuerdas.core :as str]
[rumext.v2 :as mf]))
(defn has-image? [shape]
(= (:type shape) :image))
(mf/defc image-panel
[{:keys [objects shapes]}]
(for [shape (filter cfh/image-shape? shapes)]
[:div {:class (stl/css :attributes-block)
:key (str "image-" (:id shape))}
[:div {:class (stl/css :image-wrapper)}
[:img {:src (cf/resolve-file-media (-> shape :metadata))}]]
[:div {:class (stl/css :image-row)}
[:div {:class (stl/css :global/attr-label)}
(tr "inspect.attributes.image.width")]
[:div {:class (stl/css :global/attr-value)}
[:> copy-button* {:data (css/get-css-property objects (:metadata shape) :width)}
[:div {:class (stl/css :button-children)} (css/get-css-value objects (:metadata shape) :width)]]]]
[:div {:class (stl/css :image-row)}
[:div {:class (stl/css :global/attr-label)}
(tr "inspect.attributes.image.height")]
[:div {:class (stl/css :global/attr-value)}
[:> copy-button* {:data (css/get-css-property objects (:metadata shape) :height)}
[:div {:class (stl/css :button-children)} (css/get-css-value objects (:metadata shape) :height)]]]]
(let [mtype (-> shape :metadata :mtype)
name (:name shape)
extension (cm/mtype->extension mtype)]
[:a {:class (stl/css :download-button)
:target "_blank"
:download (cond-> name extension (str/concat extension))
:href (cf/resolve-file-media (-> shape :metadata))}
(tr "inspect.attributes.image.download")])]))