mirror of
https://github.com/penpot/penpot.git
synced 2025-06-11 09:21:37 +02:00
🐛 Fix allow a comment length of 750 chars and show error text if exceeded (#5810)
This commit is contained in:
parent
f173e15bb3
commit
7fd0ca2243
5 changed files with 43 additions and 15 deletions
|
@ -38,6 +38,8 @@
|
||||||
(def r-mentions-split #"@\[[^\]]*\]\([^\)]*\)")
|
(def r-mentions-split #"@\[[^\]]*\]\([^\)]*\)")
|
||||||
(def r-mentions #"@\[([^\]]*)\]\(([^\)]*)\)")
|
(def r-mentions #"@\[([^\]]*)\]\(([^\)]*)\)")
|
||||||
|
|
||||||
|
(def comment-max-length 750)
|
||||||
|
|
||||||
(defn- format-comment
|
(defn- format-comment
|
||||||
[{:keys [content]}]
|
[{:keys [content]}]
|
||||||
(->> (d/interleave-all
|
(->> (d/interleave-all
|
||||||
|
@ -442,7 +444,7 @@
|
||||||
[:map {:title "create-comment-thread"}
|
[:map {:title "create-comment-thread"}
|
||||||
[:file-id ::sm/uuid]
|
[:file-id ::sm/uuid]
|
||||||
[:position ::gpt/point]
|
[:position ::gpt/point]
|
||||||
[:content [:string {:max 750}]]
|
[:content [:string {:max comment-max-length}]]
|
||||||
[:page-id ::sm/uuid]
|
[:page-id ::sm/uuid]
|
||||||
[:frame-id ::sm/uuid]
|
[:frame-id ::sm/uuid]
|
||||||
[:share-id {:optional true} [:maybe ::sm/uuid]]
|
[:share-id {:optional true} [:maybe ::sm/uuid]]
|
||||||
|
@ -585,7 +587,7 @@
|
||||||
schema:create-comment
|
schema:create-comment
|
||||||
[:map {:title "create-comment"}
|
[:map {:title "create-comment"}
|
||||||
[:thread-id ::sm/uuid]
|
[:thread-id ::sm/uuid]
|
||||||
[:content [:string {:max 250}]]
|
[:content [:string {:max comment-max-length}]]
|
||||||
[:share-id {:optional true} [:maybe ::sm/uuid]]
|
[:share-id {:optional true} [:maybe ::sm/uuid]]
|
||||||
[:mentions {:optional true} [::sm/set ::sm/uuid]]])
|
[:mentions {:optional true} [::sm/set ::sm/uuid]]])
|
||||||
|
|
||||||
|
@ -655,7 +657,7 @@
|
||||||
schema:update-comment
|
schema:update-comment
|
||||||
[:map {:title "update-comment"}
|
[:map {:title "update-comment"}
|
||||||
[:id ::sm/uuid]
|
[:id ::sm/uuid]
|
||||||
[:content [:string {:max 250}]]
|
[:content [:string {:max comment-max-length}]]
|
||||||
[:share-id {:optional true} [:maybe ::sm/uuid]]
|
[:share-id {:optional true} [:maybe ::sm/uuid]]
|
||||||
[:mentions {:optional true} [::sm/set ::sm/uuid]]])
|
[:mentions {:optional true} [::sm/set ::sm/uuid]]])
|
||||||
|
|
||||||
|
|
|
@ -146,7 +146,7 @@
|
||||||
;; Input text for comments with mentions
|
;; Input text for comments with mentions
|
||||||
(mf/defc comment-input*
|
(mf/defc comment-input*
|
||||||
{::mf/private true}
|
{::mf/private true}
|
||||||
[{:keys [value placeholder max-length autofocus on-focus on-blur on-change on-esc on-ctrl-enter]}]
|
[{:keys [value placeholder autofocus on-focus on-blur on-change on-esc on-ctrl-enter]}]
|
||||||
|
|
||||||
(let [value (d/nilv value "")
|
(let [value (d/nilv value "")
|
||||||
prev-value (h/use-previous value)
|
prev-value (h/use-previous value)
|
||||||
|
@ -196,7 +196,7 @@
|
||||||
(dom/append-child! node (create-text-node)))
|
(dom/append-child! node (create-text-node)))
|
||||||
|
|
||||||
(let [new-input (parse-nodes node)]
|
(let [new-input (parse-nodes node)]
|
||||||
(when (and on-change (<= (count new-input) max-length))
|
(when on-change
|
||||||
(on-change new-input))))))
|
(on-change new-input))))))
|
||||||
|
|
||||||
handle-select
|
handle-select
|
||||||
|
@ -637,6 +637,10 @@
|
||||||
:disabled is-disabled}
|
:disabled is-disabled}
|
||||||
(tr "labels.post")]]))
|
(tr "labels.post")]]))
|
||||||
|
|
||||||
|
(defn- exceeds-length?
|
||||||
|
[content]
|
||||||
|
(> (count content) 750))
|
||||||
|
|
||||||
(mf/defc comment-reply-form*
|
(mf/defc comment-reply-form*
|
||||||
{::mf/props :obj
|
{::mf/props :obj
|
||||||
::mf/private true}
|
::mf/private true}
|
||||||
|
@ -644,7 +648,8 @@
|
||||||
(let [show-buttons? (mf/use-state false)
|
(let [show-buttons? (mf/use-state false)
|
||||||
content (mf/use-state "")
|
content (mf/use-state "")
|
||||||
|
|
||||||
disabled? (blank-content? @content)
|
disabled? (or (blank-content? @content)
|
||||||
|
(exceeds-length? @content))
|
||||||
|
|
||||||
on-focus
|
on-focus
|
||||||
(mf/use-fn
|
(mf/use-fn
|
||||||
|
@ -678,8 +683,10 @@
|
||||||
:on-blur on-blur
|
:on-blur on-blur
|
||||||
:on-focus on-focus
|
:on-focus on-focus
|
||||||
:on-ctrl-enter on-submit*
|
:on-ctrl-enter on-submit*
|
||||||
:on-change on-change
|
:on-change on-change}]
|
||||||
:max-length 750}]
|
(when (exceeds-length? @content)
|
||||||
|
[:div {:class (stl/css :error-text)}
|
||||||
|
(tr "errors.character-limit-exceeded")])
|
||||||
(when (or @show-buttons? (seq @content))
|
(when (or @show-buttons? (seq @content))
|
||||||
[:> comment-form-buttons* {:on-submit on-submit*
|
[:> comment-form-buttons* {:on-submit on-submit*
|
||||||
:on-cancel on-cancel
|
:on-cancel on-cancel
|
||||||
|
@ -690,7 +697,8 @@
|
||||||
[{:keys [content on-submit on-cancel]}]
|
[{:keys [content on-submit on-cancel]}]
|
||||||
(let [content (mf/use-state content)
|
(let [content (mf/use-state content)
|
||||||
|
|
||||||
disabled? (blank-content? @content)
|
disabled? (or (blank-content? @content)
|
||||||
|
(exceeds-length? @content))
|
||||||
|
|
||||||
on-change
|
on-change
|
||||||
(mf/use-fn
|
(mf/use-fn
|
||||||
|
@ -706,8 +714,10 @@
|
||||||
{:value @content
|
{:value @content
|
||||||
:autofocus true
|
:autofocus true
|
||||||
:on-ctrl-enter on-submit*
|
:on-ctrl-enter on-submit*
|
||||||
:on-change on-change
|
:on-change on-change}]
|
||||||
:max-length 750}]
|
(when (exceeds-length? @content)
|
||||||
|
[:div {:class (stl/css :error-text)}
|
||||||
|
(tr "errors.character-limit-exceeded")])
|
||||||
[:> comment-form-buttons* {:on-submit on-submit*
|
[:> comment-form-buttons* {:on-submit on-submit*
|
||||||
:on-cancel on-cancel
|
:on-cancel on-cancel
|
||||||
:is-disabled disabled?}]]))
|
:is-disabled disabled?}]]))
|
||||||
|
@ -726,7 +736,8 @@
|
||||||
pos-x (* (:x position) zoom)
|
pos-x (* (:x position) zoom)
|
||||||
pos-y (* (:y position) zoom)
|
pos-y (* (:y position) zoom)
|
||||||
|
|
||||||
disabled? (blank-content? content)
|
disabled? (or (blank-content? content)
|
||||||
|
(exceeds-length? content))
|
||||||
|
|
||||||
on-esc
|
on-esc
|
||||||
(mf/use-fn
|
(mf/use-fn
|
||||||
|
@ -769,8 +780,10 @@
|
||||||
:autofocus true
|
:autofocus true
|
||||||
:on-esc on-esc
|
:on-esc on-esc
|
||||||
:on-change on-change
|
:on-change on-change
|
||||||
:on-ctrl-enter on-submit*
|
:on-ctrl-enter on-submit*}]
|
||||||
:max-length 750}]
|
(when (exceeds-length? content)
|
||||||
|
[:div {:class (stl/css :error-text)}
|
||||||
|
(tr "errors.character-limit-exceeded")])
|
||||||
[:> comment-form-buttons* {:on-submit on-submit*
|
[:> comment-form-buttons* {:on-submit on-submit*
|
||||||
:on-cancel on-esc
|
:on-cancel on-esc
|
||||||
:is-disabled disabled?}]]
|
:is-disabled disabled?}]]
|
||||||
|
|
|
@ -22,6 +22,11 @@
|
||||||
color: var(--comment-subtitle-color);
|
color: var(--comment-subtitle-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.error-text {
|
||||||
|
@include bodySmallTypography;
|
||||||
|
color: var(--color-foreground-error);
|
||||||
|
}
|
||||||
|
|
||||||
.location {
|
.location {
|
||||||
color: var(--comment-subtitle-color);
|
color: var(--comment-subtitle-color);
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -246,6 +251,7 @@
|
||||||
grid-template-columns: 1fr auto auto;
|
grid-template-columns: 1fr auto auto;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
gap: $s-8;
|
gap: $s-8;
|
||||||
|
margin-top: $s-8;
|
||||||
}
|
}
|
||||||
|
|
||||||
.open-mentions-button {
|
.open-mentions-button {
|
||||||
|
@ -321,7 +327,6 @@
|
||||||
border: $s-1 solid var(--input-border-color);
|
border: $s-1 solid var(--input-border-color);
|
||||||
color: var(--input-foreground-color);
|
color: var(--input-foreground-color);
|
||||||
height: $s-36;
|
height: $s-36;
|
||||||
margin-bottom: $s-8;
|
|
||||||
max-width: $s-260;
|
max-width: $s-260;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding: $s-8;
|
padding: $s-8;
|
||||||
|
|
|
@ -1152,6 +1152,10 @@ msgstr "The fonts %s could not be loaded"
|
||||||
msgid "errors.cannot-upload"
|
msgid "errors.cannot-upload"
|
||||||
msgstr "Cannot upload the media file."
|
msgstr "Cannot upload the media file."
|
||||||
|
|
||||||
|
#: src/app/main/ui/comments.cljs:689
|
||||||
|
msgid "errors.character-limit-exceeded"
|
||||||
|
msgstr "Character limit exceeded"
|
||||||
|
|
||||||
#: src/app/main/data/workspace.cljs:1463, src/app/main/data/workspace.cljs:1660
|
#: src/app/main/data/workspace.cljs:1463, src/app/main/data/workspace.cljs:1660
|
||||||
msgid "errors.clipboard-not-implemented"
|
msgid "errors.clipboard-not-implemented"
|
||||||
msgstr "Your browser cannot do this operation"
|
msgstr "Your browser cannot do this operation"
|
||||||
|
|
|
@ -1160,6 +1160,10 @@ msgstr "No se han podido cargar las fuentes %s"
|
||||||
msgid "errors.cannot-upload"
|
msgid "errors.cannot-upload"
|
||||||
msgstr "No se puede cargar el archivo multimedia."
|
msgstr "No se puede cargar el archivo multimedia."
|
||||||
|
|
||||||
|
#: src/app/main/ui/comments.cljs:689
|
||||||
|
msgid "errors.character-limit-exceeded"
|
||||||
|
msgstr "Se ha superado el límite de caracteres"
|
||||||
|
|
||||||
#: src/app/main/data/workspace.cljs:1463, src/app/main/data/workspace.cljs:1660
|
#: src/app/main/data/workspace.cljs:1463, src/app/main/data/workspace.cljs:1660
|
||||||
msgid "errors.clipboard-not-implemented"
|
msgid "errors.clipboard-not-implemented"
|
||||||
msgstr "Tu navegador no puede realizar esta operación"
|
msgstr "Tu navegador no puede realizar esta operación"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue