mirror of
https://github.com/penpot/penpot.git
synced 2025-05-14 21:06:41 +02:00
🐛 Fix name generation and handling on creating objects (files, tokens, ...) (#5745)
* ✨ Update function implementation * ✨ Add tests for a new function implementation * ✨ Update function usages according to new signature * ✨ Update docstrings * ✨ Use simpler assertion * 💄 Replace concat with cons on name-seq * 🐛 Fix incorrect error handling on legacy workspace redirect --------- Co-authored-by: Andrey Fedorov <oran9e.red@gmail.com>
This commit is contained in:
parent
bce30eb522
commit
315b389a66
10 changed files with 144 additions and 58 deletions
|
@ -25,6 +25,7 @@
|
|||
[app.util.time :as dt]
|
||||
[beicon.v2.core :as rx]
|
||||
[clojure.set :as set]
|
||||
[cuerdas.core :as str]
|
||||
[potok.v2.core :as ptk]))
|
||||
|
||||
(log/set-level! :warn)
|
||||
|
@ -247,9 +248,9 @@
|
|||
(ptk/reify ::create-project
|
||||
ptk/WatchEvent
|
||||
(watch [_ state _]
|
||||
(let [projects (get state :projects)
|
||||
unames (cfh/get-used-names projects)
|
||||
name (cfh/generate-unique-name unames (str (tr "dashboard.new-project-prefix") " 1"))
|
||||
(let [unames (cfh/get-used-names (get state :projects))
|
||||
base-name (tr "dashboard.new-project-prefix")
|
||||
name (cfh/generate-unique-name base-name unames :immediate-suffix? true)
|
||||
team-id (:current-team-id state)
|
||||
params {:name name
|
||||
:team-id team-id}
|
||||
|
@ -280,13 +281,18 @@
|
|||
:name name})
|
||||
|
||||
ptk/WatchEvent
|
||||
(watch [_ _ _]
|
||||
(watch [_ state _]
|
||||
(let [{:keys [on-success on-error]
|
||||
:or {on-success identity
|
||||
on-error rx/throw}} (meta params)
|
||||
|
||||
new-name (str name " " (tr "dashboard.copy-suffix"))]
|
||||
|
||||
projects (get state :projects)
|
||||
unames (cfh/get-used-names projects)
|
||||
suffix-fn (fn [copy-count]
|
||||
(str/concat " "
|
||||
(tr "dashboard.copy-suffix")
|
||||
(when (> copy-count 1)
|
||||
(str " " copy-count))))
|
||||
new-name (cfh/generate-unique-name name unames :suffix-fn suffix-fn)]
|
||||
(->> (rp/cmd! :duplicate-project {:project-id id :name new-name})
|
||||
(rx/tap on-success)
|
||||
(rx/map project-duplicated)
|
||||
|
@ -477,15 +483,15 @@
|
|||
(let [{:keys [on-success on-error]
|
||||
:or {on-success identity
|
||||
on-error rx/throw}} (meta params)
|
||||
|
||||
files (get state :files)
|
||||
unames (cfh/get-used-names files)
|
||||
name (or name (cfh/generate-unique-name unames (str (tr "dashboard.new-file-prefix") " 1")))
|
||||
features (-> (features/get-team-enabled-features state)
|
||||
(set/difference cfeat/frontend-only-features))
|
||||
params (-> params
|
||||
(assoc :name name)
|
||||
(assoc :features features))]
|
||||
unames (cfh/get-used-names (get state :files))
|
||||
base-name (tr "dashboard.new-file-prefix")
|
||||
name (or name
|
||||
(cfh/generate-unique-name base-name unames :immediate-suffix? true))
|
||||
features (-> (features/get-team-enabled-features state)
|
||||
(set/difference cfeat/frontend-only-features))
|
||||
params (-> params
|
||||
(assoc :name name)
|
||||
(assoc :features features))]
|
||||
|
||||
(->> (rp/cmd! :create-file params)
|
||||
(rx/tap on-success)
|
||||
|
@ -500,13 +506,17 @@
|
|||
(dm/assert! (string? name))
|
||||
(ptk/reify ::duplicate-file
|
||||
ptk/WatchEvent
|
||||
(watch [_ _ _]
|
||||
(watch [_ state _]
|
||||
(let [{:keys [on-success on-error]
|
||||
:or {on-success identity
|
||||
on-error rx/throw}} (meta params)
|
||||
|
||||
new-name (str name " " (tr "dashboard.copy-suffix"))]
|
||||
|
||||
unames (cfh/get-used-names (get state :files))
|
||||
suffix-fn (fn [copy-count]
|
||||
(str/concat " "
|
||||
(tr "dashboard.copy-suffix")
|
||||
(when (> copy-count 1)
|
||||
(str " " copy-count))))
|
||||
new-name (cfh/generate-unique-name name unames :suffix-fn suffix-fn)]
|
||||
(->> (rp/cmd! :duplicate-file {:file-id id :name new-name})
|
||||
(rx/tap on-success)
|
||||
(rx/map file-created)
|
||||
|
@ -589,10 +599,10 @@
|
|||
name (if in-project?
|
||||
(let [files (get state :files)
|
||||
unames (cfh/get-used-names files)]
|
||||
(cfh/generate-unique-name unames (str (tr "dashboard.new-file-prefix") " 1")))
|
||||
(cfh/generate-unique-name (tr "dashboard.new-file-prefix") unames :immediate-suffix? true))
|
||||
(let [projects (get state :projects)
|
||||
unames (cfh/get-used-names projects)]
|
||||
(cfh/generate-unique-name unames (str (tr "dashboard.new-project-prefix") " 1"))))
|
||||
(cfh/generate-unique-name (tr "dashboard.new-project-prefix") unames :immediate-suffix? true)))
|
||||
params (if in-project?
|
||||
{:project-id (:project-id pparams)
|
||||
:name name}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
(:require
|
||||
[app.common.data.macros :as dm]
|
||||
[app.common.files.changes-builder :as pcb]
|
||||
[app.common.files.helpers :as cfh]
|
||||
[app.common.geom.point :as gpt]
|
||||
[app.common.logic.tokens :as clt]
|
||||
[app.common.types.shape :as cts]
|
||||
|
@ -286,10 +287,21 @@
|
|||
(ptk/reify ::duplicate-token
|
||||
ptk/WatchEvent
|
||||
(watch [_ state _]
|
||||
(when-let [token (some-> (dwts/get-selected-token-set-token state token-name)
|
||||
(update :name #(str/concat % "-copy")))]
|
||||
(rx/of
|
||||
(update-create-token {:token token}))))))
|
||||
(let [token-set (dwts/get-selected-token-set state)
|
||||
token (some-> token-set (ctob/get-token token-name))
|
||||
tokens (some-> token-set (ctob/get-tokens))
|
||||
suffix-fn (fn [copy-count]
|
||||
(let [suffix (tr "workspace.token.duplicate-suffix")]
|
||||
(str/concat "-"
|
||||
suffix
|
||||
(when (> copy-count 1)
|
||||
(str "-" copy-count)))))
|
||||
unames (map :name tokens)
|
||||
copy-name (cfh/generate-unique-name token-name unames :suffix-fn suffix-fn)]
|
||||
(when token
|
||||
(rx/of
|
||||
(update-create-token
|
||||
{:token (assoc token :name copy-name)})))))))
|
||||
|
||||
(defn set-token-type-section-open
|
||||
[token-type open?]
|
||||
|
|
|
@ -507,10 +507,8 @@
|
|||
(watch [it state _]
|
||||
(let [pages (-> (dsh/lookup-file-data state)
|
||||
(get :pages-index))
|
||||
|
||||
unames (cfh/get-used-names pages)
|
||||
name (cfh/generate-unique-name unames "Page 1")
|
||||
|
||||
name (cfh/generate-unique-name "Page" unames :immediate-suffix? true)
|
||||
changes (-> (pcb/empty-changes it)
|
||||
(pcb/add-empty-page id name))]
|
||||
|
||||
|
@ -527,7 +525,13 @@
|
|||
page (get pages page-id)
|
||||
|
||||
unames (cfh/get-used-names pages)
|
||||
name (cfh/generate-unique-name unames (:name page))
|
||||
suffix-fn (fn [copy-count]
|
||||
(str/concat " "
|
||||
(tr "dashboard.copy-suffix")
|
||||
(when (> copy-count 1)
|
||||
(str " " copy-count))))
|
||||
base-name (:name page)
|
||||
name (cfh/generate-unique-name base-name unames :suffix-fn suffix-fn)
|
||||
objects (update-vals (:objects page) #(dissoc % :use-for-thumbnail))
|
||||
|
||||
main-instances-ids (set (keep #(when (ctk/main-instance? (val %)) (key %)) objects))
|
||||
|
|
|
@ -44,9 +44,9 @@
|
|||
(dsh/lookup-page state page-id)
|
||||
(dsh/lookup-page state))
|
||||
|
||||
flows (get page :flows)
|
||||
unames (cfh/get-used-names (vals flows))
|
||||
name (or name (cfh/generate-unique-name unames "Flow 1"))
|
||||
unames (cfh/get-used-names (vals (get page :flows)))
|
||||
name (or name
|
||||
(cfh/generate-unique-name "Flow" unames :immediate-suffix? true))
|
||||
|
||||
flow-id (or flow-id (uuid/next))
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
[app.config :as cf]
|
||||
[app.main.data.common :as dcm]
|
||||
[app.main.data.team :as dtm]
|
||||
[app.main.errors :as errors]
|
||||
[app.main.refs :as refs]
|
||||
[app.main.repo :as rp]
|
||||
[app.main.router :as rt]
|
||||
|
@ -29,7 +30,6 @@
|
|||
[app.util.dom :as dom]
|
||||
[app.util.i18n :refer [tr]]
|
||||
[beicon.v2.core :as rx]
|
||||
[potok.v2.core :as ptk]
|
||||
[rumext.v2 :as mf]))
|
||||
|
||||
(def auth-page
|
||||
|
@ -61,8 +61,7 @@
|
|||
:file-id file-id
|
||||
:page-id page-id
|
||||
:layout layout)))
|
||||
ptk/handle-error)))
|
||||
|
||||
errors/on-error)))
|
||||
[:> loader*
|
||||
{:title (tr "labels.loading")
|
||||
:overlay true}])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue