mirror of
https://github.com/penpot/penpot.git
synced 2026-05-27 19:03:39 +00:00
🐛 Toggle token path on token rename
This commit is contained in:
parent
ed746bb694
commit
d9ee28229c
@ -141,6 +141,49 @@ test.describe("Tokens - node tree", () => {
|
|||||||
await expect(darkerNodeToken).toBeVisible();
|
await expect(darkerNodeToken).toBeVisible();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("Renaming a token into a collapsed group auto-expands that group", async ({
|
||||||
|
page,
|
||||||
|
}) => {
|
||||||
|
const { tokensSidebar, tokensUpdateCreateModal, tokenContextMenuForToken } =
|
||||||
|
await setupTokensFileRender(page);
|
||||||
|
|
||||||
|
// Create tokens in two separate groups
|
||||||
|
await createToken(page, "Color", "dark.base", "Value", "#000000");
|
||||||
|
await createToken(page, "Color", "light.accent", "Value", "#ffffff");
|
||||||
|
|
||||||
|
const lightGroup = tokensSidebar.getByRole("button", {
|
||||||
|
name: "light",
|
||||||
|
exact: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Collapse the light group so its children are hidden
|
||||||
|
await lightGroup.click();
|
||||||
|
|
||||||
|
const lightAccentToken = tokensSidebar.getByRole("button", {
|
||||||
|
name: "accent",
|
||||||
|
});
|
||||||
|
await expect(lightAccentToken).not.toBeVisible();
|
||||||
|
|
||||||
|
// Open the edit modal for the dark.base token
|
||||||
|
const darkBaseToken = tokensSidebar.getByRole("button", { name: "base" });
|
||||||
|
await darkBaseToken.click({ button: "right" });
|
||||||
|
await tokenContextMenuForToken.getByText("Edit token").click();
|
||||||
|
|
||||||
|
await expect(tokensUpdateCreateModal).toBeVisible();
|
||||||
|
|
||||||
|
// Rename to move it into the collapsed light group
|
||||||
|
const nameField = tokensUpdateCreateModal.getByLabel("Name");
|
||||||
|
await nameField.fill("light.base");
|
||||||
|
await tokensUpdateCreateModal
|
||||||
|
.getByRole("button", { name: "Save" })
|
||||||
|
.click();
|
||||||
|
|
||||||
|
// After rename, light group should be auto-expanded and both tokens visible
|
||||||
|
await expect(lightGroup).toBeVisible();
|
||||||
|
await expect(lightAccentToken).toBeVisible();
|
||||||
|
await expect(tokensSidebar.getByRole("button", { name: "base" })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
test("User removes node and all child tokens", async ({ page }) => {
|
test("User removes node and all child tokens", async ({ page }) => {
|
||||||
const { tokensSidebar } = await setupTokensFileRender(page);
|
const { tokensSidebar } = await setupTokensFileRender(page);
|
||||||
|
|
||||||
|
|||||||
@ -203,7 +203,22 @@
|
|||||||
(remove-path path paths)
|
(remove-path path paths)
|
||||||
(add-path path paths))))))))
|
(add-path path paths))))))))
|
||||||
|
|
||||||
|
(defn toggle-nested-token-path
|
||||||
|
[token-type new-name]
|
||||||
|
(ptk/reify ::toggle-nested-token-path
|
||||||
|
ptk/UpdateEvent
|
||||||
|
(update [_ state]
|
||||||
|
(let [type-str (name token-type)
|
||||||
|
segments (str/split new-name ".")
|
||||||
|
n-groups (dec (count segments))]
|
||||||
|
(if (pos? n-groups)
|
||||||
|
(update-in state [:workspace-tokens :folded-token-paths]
|
||||||
|
(fn [paths]
|
||||||
|
(reduce (fn [ps i]
|
||||||
|
(remove-path (str type-str "." (str/join "." (take i segments))) ps))
|
||||||
|
(or paths [])
|
||||||
|
(range 1 (inc n-groups)))))
|
||||||
|
state)))))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; TOKENS Actions
|
;; TOKENS Actions
|
||||||
@ -582,6 +597,7 @@
|
|||||||
(pcb/set-token (ctob/get-id token-set)
|
(pcb/set-token (ctob/get-id token-set)
|
||||||
id
|
id
|
||||||
token'))]
|
token'))]
|
||||||
|
(toggle-token-path (str (name token-type) "." (:name token)))
|
||||||
(rx/of (dch/commit-changes changes)
|
(rx/of (dch/commit-changes changes)
|
||||||
(ev/event (-> {::ev/name "edit-token" :type token-type}
|
(ev/event (-> {::ev/name "edit-token" :type token-type}
|
||||||
(merge (meta it))))))))))
|
(merge (meta it))))))))))
|
||||||
|
|||||||
@ -48,7 +48,6 @@
|
|||||||
(if (= active-tab :reference)
|
(if (= active-tab :reference)
|
||||||
(get value :reference)
|
(get value :reference)
|
||||||
value)
|
value)
|
||||||
|
|
||||||
value))
|
value))
|
||||||
|
|
||||||
(mf/defc form*
|
(mf/defc form*
|
||||||
@ -158,9 +157,10 @@
|
|||||||
|
|
||||||
on-remap-token
|
on-remap-token
|
||||||
(mf/use-fn
|
(mf/use-fn
|
||||||
(mf/deps token)
|
(mf/deps token token-type)
|
||||||
(fn [valid-token new-name old-name description]
|
(fn [valid-token new-name old-name description]
|
||||||
(st/emit!
|
(st/emit!
|
||||||
|
(dwtl/toggle-nested-token-path token-type new-name)
|
||||||
(dwtl/update-token (:id token)
|
(dwtl/update-token (:id token)
|
||||||
{:name new-name
|
{:name new-name
|
||||||
:value (:value valid-token)
|
:value (:value valid-token)
|
||||||
@ -171,9 +171,10 @@
|
|||||||
|
|
||||||
on-rename-token
|
on-rename-token
|
||||||
(mf/use-fn
|
(mf/use-fn
|
||||||
(mf/deps token)
|
(mf/deps token token-type)
|
||||||
(fn [valid-token name description]
|
(fn [valid-token name description]
|
||||||
(st/emit!
|
(st/emit!
|
||||||
|
(dwtl/toggle-nested-token-path token-type name)
|
||||||
(dwtl/update-token (:id token)
|
(dwtl/update-token (:id token)
|
||||||
{:name name
|
{:name name
|
||||||
:value (:value valid-token)
|
:value (:value valid-token)
|
||||||
@ -210,19 +211,22 @@
|
|||||||
(st/emit! (modal/show :tokens/remapping-confirmation {:remap-data remap-data
|
(st/emit! (modal/show :tokens/remapping-confirmation {:remap-data remap-data
|
||||||
:on-remap on-remap
|
:on-remap on-remap
|
||||||
:on-rename on-rename}))
|
:on-rename on-rename}))
|
||||||
(st/emit!
|
(do
|
||||||
(if is-create
|
(when is-rename
|
||||||
(dwtl/create-token (ctob/make-token {:name name
|
(st/emit! (dwtl/toggle-nested-token-path token-type name)))
|
||||||
:type token-type
|
(st/emit!
|
||||||
:value (:value valid-token)
|
(if is-create
|
||||||
:description description}))
|
(dwtl/create-token (ctob/make-token {:name name
|
||||||
(dwtl/update-token (:id token)
|
:type token-type
|
||||||
{:name name
|
:value (:value valid-token)
|
||||||
:value (:value valid-token)
|
:description description}))
|
||||||
:description description}))
|
(dwtl/update-token (:id token)
|
||||||
(dwtl/open-token-type (:type token))
|
{:name name
|
||||||
(dwtp/propagate-workspace-tokens)
|
:value (:value valid-token)
|
||||||
(modal/hide!)))))
|
:description description}))
|
||||||
|
(dwtl/open-token-type (:type token))
|
||||||
|
(dwtp/propagate-workspace-tokens)
|
||||||
|
(modal/hide!))))))
|
||||||
;; WORKAROUND: display validation errors in the form instead of crashing
|
;; WORKAROUND: display validation errors in the form instead of crashing
|
||||||
(fn [{:keys [errors]}]
|
(fn [{:keys [errors]}]
|
||||||
(let [error-messages (wte/humanize-errors errors)
|
(let [error-messages (wte/humanize-errors errors)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user