From 66f83db0e50101f3a4a148240569381ff532e2cc Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Wed, 5 Nov 2025 10:14:10 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(frontend)=20add=20"Add=20Emoji"=20but?= =?UTF-8?q?ton=20to=20doc=20options=20menu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add "Add Emoji" button to doc options menu - Remove default emoji when none selected - Improve doc options styling --- .../__tests__/app-impress/doc-header.spec.ts | 27 ++++- .../__tests__/app-impress/doc-tree.spec.ts | 2 +- .../docs/doc-header/components/DocTitle.tsx | 31 ++--- .../docs/doc-header/components/DocToolBox.tsx | 112 +++++++++--------- 4 files changed, 102 insertions(+), 70 deletions(-) diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts index 89f05286..99635176 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-header.spec.ts @@ -68,9 +68,18 @@ test.describe('Doc Header', () => { await createDoc(page, 'doc-update-emoji', browserName, 1); const emojiPicker = page.locator('.--docs--doc-title').getByRole('button'); + const optionMenu = page.getByLabel('Open the document options'); + const addEmojiMenuItem = page.getByRole('menuitem', { name: 'Add emoji' }); + const removeEmojiMenuItem = page.getByRole('menuitem', { + name: 'Remove emoji', + }); // Top parent should not have emoji picker await expect(emojiPicker).toBeHidden(); + await optionMenu.click(); + await expect(addEmojiMenuItem).toBeHidden(); + await expect(removeEmojiMenuItem).toBeHidden(); + await page.keyboard.press('Escape'); const { name: docChild } = await createRootSubPage( page, @@ -80,13 +89,23 @@ test.describe('Doc Header', () => { await verifyDocName(page, docChild); - await expect(emojiPicker).toBeVisible(); + // Emoji picker should be hidden initially + await expect(emojiPicker).toBeHidden(); + + // Add emoji + await optionMenu.click(); + await expect(removeEmojiMenuItem).toBeHidden(); + await addEmojiMenuItem.click(); + await expect(emojiPicker).toHaveText('📄'); + + // Change emoji await emojiPicker.click({ delay: 100, }); await page.getByRole('button', { name: '😀' }).first().click(); await expect(emojiPicker).toHaveText('😀'); + // Update title const docTitle = page.getByRole('textbox', { name: 'Document title' }); await docTitle.fill('Hello Emoji World'); await docTitle.blur(); @@ -95,6 +114,12 @@ test.describe('Doc Header', () => { // Check the tree const row = await getTreeRow(page, 'Hello Emoji World'); await expect(row.getByText('😀')).toBeVisible(); + + // Remove emoji + await optionMenu.click(); + await expect(addEmojiMenuItem).toBeHidden(); + await removeEmojiMenuItem.click(); + await expect(emojiPicker).toBeHidden(); }); test('it deletes the doc', async ({ page, browserName }) => { diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-tree.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-tree.spec.ts index 422231f7..0e3bf49c 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-tree.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-tree.spec.ts @@ -352,7 +352,7 @@ test.describe('Doc Tree', () => { await page.getByRole('menuitem', { name: 'Remove emoji' }).click(); await expect(row.getByText('😀')).toBeHidden(); - await expect(titleEmojiPicker).not.toHaveText('😀'); + await expect(titleEmojiPicker).toBeHidden(); }); }); diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx index c3d66918..33905caa 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocTitle.tsx @@ -55,8 +55,16 @@ const DocTitleEmojiPicker = ({ doc }: DocTitleProps) => { const { colorsTokens } = useCunninghamTheme(); const { emoji } = getEmojiAndTitle(doc.title ?? ''); + if (!emoji) { + return null; + } + return ( - + { `} > { const { isDesktop } = useResponsiveStore(); const { t } = useTranslation(); const { colorsTokens } = useCunninghamTheme(); - const { spacingsTokens } = useCunninghamTheme(); const { isTopRoot } = useDocUtils(doc); const { untitledDocument } = useTrans(); const { emoji, titleWithoutEmoji } = getEmojiAndTitle(doc.title ?? ''); @@ -139,19 +152,9 @@ const DocTitleInput = ({ doc }: DocTitleProps) => { className="--docs--doc-title" $direction="row" $align="center" - $gap={spacingsTokens['xs']} + $gap="4px" $minHeight="40px" > - {isTopRoot && ( -