diff --git a/frontend/src/app/main/ui/components/forms.cljs b/frontend/src/app/main/ui/components/forms.cljs index 099b5e43dd..0d4a5fc55f 100644 --- a/frontend/src/app/main/ui/components/forms.cljs +++ b/frontend/src/app/main/ui/components/forms.cljs @@ -557,6 +557,32 @@ (dom/stop-propagation event) (swap! items (fn [items] (if (c/empty? items) items (pop items))))))))) + on-paste + (mf/use-fn + (fn [event] + (let [paste-data (-> event .-clipboardData (.getData "text"))] + (when (and (string? paste-data) + (re-find #"[,\s]" paste-data)) + (dom/prevent-default event) + (dom/stop-propagation event) + + ;; Mark as touched + (swap! form assoc-in [:touched input-name] true) + + ;; Split pasted text by commas and/or whitespace, add each valid part + (let [parts (->> (str/split paste-data #",|\s+") + (map str/trim) + (remove str/empty?))] + (doseq [part parts] + (when (valid-item-fn part) + (swap! items conj-dedup {:text part + :valid true + :caution (caution-item-fn part)}))) + + ;; Reset input value and mark as untouched after successful paste + (reset! value "") + (swap! form assoc-in [:touched input-name] false)))))) + on-blur (mf/use-fn (fn [_] @@ -590,6 +616,7 @@ :on-focus on-focus :on-blur on-blur :on-key-down on-key-down + :on-paste on-paste :value @value :on-change on-change :placeholder (when empty? label)}]