From 2da414fb3b2f4377f752b2b2eeb649855da024a7 Mon Sep 17 00:00:00 2001 From: mirivlad Date: Tue, 14 Jul 2026 22:33:43 +0800 Subject: [PATCH] fix: rename Browser workspace tool --- frontend/e2e/browser-inbox.spec.js | 14 +++++----- frontend/e2e/sidebar-opens-view.spec.js | 12 ++++----- frontend/e2e/ux-followup.spec.js | 4 +-- frontend/e2e/ux-today.spec.js | 18 ++++++------- frontend/e2e/workspace-templates.spec.js | 4 +-- frontend/src/lib/i18n/catalogs/en.js | 4 +-- frontend/src/lib/i18n/catalogs/ru.js | 4 +-- frontend/src/lib/test/wails-mock.js | 34 ++++++++++++------------ 8 files changed, 47 insertions(+), 47 deletions(-) diff --git a/frontend/e2e/browser-inbox.spec.js b/frontend/e2e/browser-inbox.spec.js index c92f4b3..1240b21 100644 --- a/frontend/e2e/browser-inbox.spec.js +++ b/frontend/e2e/browser-inbox.spec.js @@ -1,7 +1,7 @@ import { test, expect } from '@playwright/test'; import { waitForAppReady, setupConsoleCollector, resetMockState } from './helpers.js'; -test.describe('Browser Inbox workflow', () => { +test.describe('Browser workflow', () => { let consoleCollector; test.beforeEach(async ({ page }) => { @@ -16,14 +16,14 @@ test.describe('Browser Inbox workflow', () => { }); test('global inbox explains empty capture flow and exposes assignment filters', async ({ page }) => { - await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' }).click(); + await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' }).click(); const inbox = page.locator('.browser-inbox-root'); await expect(inbox).toBeVisible({ timeout: 10000 }); - await expect(inbox.locator('.browser-inbox-title')).toContainText('Browser Inbox'); + await expect(inbox.locator('.browser-inbox-title')).toHaveText('Browser'); await expect(inbox.locator('.browser-inbox-count')).toHaveText('0 items'); - await expect(inbox.locator('.browser-inbox-empty')).toContainText('No browser captures yet'); - await expect(inbox.locator('.browser-inbox-empty')).toContainText('send a page, selection, link, or file from the browser extension'); + await expect(inbox.locator('.browser-inbox-empty')).toContainText('No browser materials yet'); + await expect(inbox.locator('.browser-inbox-empty')).toContainText('Send a page, selection, or link from the extension'); await expect(inbox.locator('[data-browser-inbox-filter="status"]')).toBeVisible(); await expect(inbox.locator('[data-browser-inbox-filter="workspace"]')).toBeVisible(); await expect(inbox.locator('[data-browser-inbox-action="clear"]')).toBeDisabled(); @@ -47,7 +47,7 @@ test.describe('Browser Inbox workflow', () => { }], }); }); - await page.getByRole('tab', { name: 'Browser Inbox' }).click(); + await page.getByRole('tab', { name: 'Browser' }).click(); const inbox = page.locator('.browser-inbox-root'); await expect(inbox.locator('.browser-inbox-count')).toHaveText('1 item'); @@ -94,7 +94,7 @@ test.describe('Browser Inbox workflow', () => { ], }); }); - await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' }).click(); + await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' }).click(); const inbox = page.locator('.browser-inbox-root'); await expect(inbox.locator('.browser-inbox-count')).toHaveText('3 items'); diff --git a/frontend/e2e/sidebar-opens-view.spec.js b/frontend/e2e/sidebar-opens-view.spec.js index 11ae6cb..8cf849a 100644 --- a/frontend/e2e/sidebar-opens-view.spec.js +++ b/frontend/e2e/sidebar-opens-view.spec.js @@ -30,23 +30,23 @@ test.describe('B: Sidebar opens plugin view by item.view', () => { test('Sidebar item exists with correct label', async ({ page }) => { await expect(page.locator('.sidebar .nav-item').filter({ hasText: 'Plugin Manager' })).not.toBeVisible(); await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Activity' })).toBeVisible(); - await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' })).toBeVisible(); + await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' })).toBeVisible(); const sidebarItem = page.locator('.sidebar .plugin-item').filter({ hasText: 'Platform Test' }); await expect(sidebarItem).toBeVisible(); }); - test('Global Activity and Browser Inbox sidebar items open plugin views', async ({ page }) => { + test('Global Activity and Browser sidebar items open plugin views', async ({ page }) => { await page.locator('.sidebar .plugin-item').filter({ hasText: 'Activity' }).click(); await expect(page.locator('.view-container .view-header h2')).toHaveText('Activity', { timeout: 10000 }); - await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' }).click(); - await expect(page.locator('.view-container .view-header h2')).toHaveText('Browser Inbox', { timeout: 10000 }); + await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' }).click(); + await expect(page.locator('.view-container .view-header h2')).toHaveText('Browser', { timeout: 10000 }); }); test('selected global tool remains visibly active through navigation and sidebar reloads', async ({ page }) => { const activity = page.locator('.sidebar .plugin-item').filter({ hasText: 'Activity' }); - const browserInbox = page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' }); + const browserInbox = page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' }); await activity.click(); await expect(activity).toHaveAttribute('aria-current', 'page'); @@ -62,7 +62,7 @@ test.describe('B: Sidebar opens plugin view by item.view', () => { detail: { viewId: 'verstak.browser-inbox.view', pluginId: 'verstak.browser-inbox' }, })); }); - await expect(page.locator('.view-container .view-header h2')).toHaveText('Browser Inbox', { timeout: 10000 }); + await expect(page.locator('.view-container .view-header h2')).toHaveText('Browser', { timeout: 10000 }); await expect(browserInbox).toHaveAttribute('aria-current', 'page'); await expect(browserInbox).toHaveClass(/is-active/); await expect(activity).not.toHaveAttribute('aria-current', 'page'); diff --git a/frontend/e2e/ux-followup.spec.js b/frontend/e2e/ux-followup.spec.js index a4a6b32..48c2885 100644 --- a/frontend/e2e/ux-followup.spec.js +++ b/frontend/e2e/ux-followup.spec.js @@ -18,7 +18,7 @@ test.describe('UX follow-up fixes', () => { await expect(search).toBeVisible(); await expect(page.locator('.sidebar [data-global-search-input]')).toBeVisible(); - await page.locator('.sidebar .nav-item').filter({ hasText: 'Browser Inbox' }).click(); + await page.locator('.sidebar .nav-item').filter({ hasText: 'Browser' }).click(); await expect(page.locator('.browser-inbox-root')).toBeVisible({ timeout: 10000 }); await expect(search).toBeVisible(); }); @@ -67,7 +67,7 @@ test.describe('UX follow-up fixes', () => { const search = page.locator('[data-global-search-input]'); await search.fill('Research Search Result'); - const result = page.locator('[data-global-search-result-type="Browser Inbox"]').filter({ hasText: 'Research Search Result' }); + const result = page.locator('[data-global-search-result-type="Browser"]').filter({ hasText: 'Research Search Result' }); await expect(result).toBeVisible({ timeout: 10000 }); await result.click(); diff --git a/frontend/e2e/ux-today.spec.js b/frontend/e2e/ux-today.spec.js index 12cf3ce..7104ae7 100644 --- a/frontend/e2e/ux-today.spec.js +++ b/frontend/e2e/ux-today.spec.js @@ -56,7 +56,7 @@ test.describe('UX Overview workspace flow', () => { await page.getByRole('tab', { name: 'Overview' }).click(); await overview.locator('[data-overview-summary="captures"]').click(); - await expect(page.getByRole('tab', { name: 'Browser Inbox' })).toHaveAttribute('aria-selected', 'true'); + await expect(page.getByRole('tab', { name: 'Browser' })).toHaveAttribute('aria-selected', 'true'); await expect(page.locator('.browser-inbox-root')).toBeVisible({ timeout: 10000 }); await page.getByRole('tab', { name: 'Overview' }).click(); @@ -70,7 +70,7 @@ test.describe('UX Overview workspace flow', () => { await page.getByRole('tab', { name: 'Overview' }).click(); await overview.locator('[data-overview-summary="attention"]').click(); - await expect(page.getByRole('tab', { name: 'Browser Inbox' })).toHaveAttribute('aria-selected', 'true'); + await expect(page.getByRole('tab', { name: 'Browser' })).toHaveAttribute('aria-selected', 'true'); }); test('Overview keeps the Notes total factual when the Files plugin is unavailable', async ({ page }) => { @@ -80,13 +80,13 @@ test.describe('UX Overview workspace flow', () => { await expect(page.locator('[data-overview-summary="notes"]')).toContainText('1 total'); }); - test('Overview hides Browser Inbox cards and actions when the current Deal does not include it', async ({ page }) => { - await page.locator('button[title="New workspace"]').click(); + test('Overview hides Browser cards and actions when the current Deal does not include it', async ({ page }) => { + await page.locator('button[title="New Deal"]').click(); const modal = page.locator('[data-workspace-create-modal]'); await modal.locator('[data-workspace-name]').fill('MinimalOverview'); await modal.locator('[data-workspace-template]').selectOption('minimal'); - await modal.getByRole('button', { name: 'Create workspace' }).click(); - await expect(page.getByRole('tab', { name: 'Browser Inbox' })).toHaveCount(0); + await modal.getByRole('button', { name: 'Create Deal' }).click(); + await expect(page.getByRole('tab', { name: 'Browser' })).toHaveCount(0); await page.evaluate(async () => { await window.go.api.App.WritePluginSettings('verstak.browser-inbox', { @@ -107,7 +107,7 @@ test.describe('UX Overview workspace flow', () => { await expect(overview).not.toContainText('Inbox material must stay hidden'); }); - test('Overview refreshes when Browser Inbox is disabled through plugin state changes', async ({ page }) => { + test('Overview refreshes when Browser is disabled through plugin state changes', async ({ page }) => { await page.evaluate(async () => { await window.go.api.App.WritePluginSettings('verstak.browser-inbox', { 'captures:global': [{ @@ -123,7 +123,7 @@ test.describe('UX Overview workspace flow', () => { }); const overview = page.locator('[data-overview-root]'); - await expect(page.getByRole('tab', { name: 'Browser Inbox' })).toHaveCount(0); + await expect(page.getByRole('tab', { name: 'Browser' })).toHaveCount(0); await expect(overview.locator('[data-overview-summary="captures"]')).toHaveCount(0); await expect(overview.locator('[data-overview-action="browser-inbox"]')).toHaveCount(0); }); @@ -264,7 +264,7 @@ test.describe('UX Overview workspace flow', () => { await expect(candidates.nth(3)).toContainText('Changed file "draft.md"'); await candidates.nth(0).click(); - await expect(page.getByRole('tab', { name: 'Browser Inbox' })).toHaveAttribute('aria-selected', 'true'); + await expect(page.getByRole('tab', { name: 'Browser' })).toHaveAttribute('aria-selected', 'true'); await expect(page.locator('.browser-inbox-root')).toBeVisible({ timeout: 10000 }); await page.getByRole('tab', { name: 'Overview' }).click(); diff --git a/frontend/e2e/workspace-templates.spec.js b/frontend/e2e/workspace-templates.spec.js index f936d9d..cfc4483 100644 --- a/frontend/e2e/workspace-templates.spec.js +++ b/frontend/e2e/workspace-templates.spec.js @@ -28,7 +28,7 @@ test.describe('Workspace templates', () => { await expect(templateSelect).toHaveValue('default'); await expect(templateSelect).toHaveCSS('appearance', 'none'); await expect(modal.locator('[data-workspace-template-tools]')).toContainText('Notes'); - await expect(modal.locator('[data-workspace-template-tools]')).toContainText('Browser Inbox'); + await expect(modal.locator('[data-workspace-template-tools]')).toContainText('Browser'); await modal.getByRole('button', { name: 'Create Deal' }).click(); await expect(modal.locator('[data-workspace-create-error]')).toContainText('Name is required'); @@ -74,7 +74,7 @@ test.describe('Workspace templates', () => { await expect(page.getByRole('tab', { name: 'Journal' })).toHaveCount(0); await expect(page.getByRole('tab', { name: 'Secrets' })).toHaveCount(0); await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Todos' })).toBeVisible(); - await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' })).toBeVisible(); + await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' })).toBeVisible(); }); test('template explains an unavailable plugin and warns after incomplete creation', async ({ page }) => { diff --git a/frontend/src/lib/i18n/catalogs/en.js b/frontend/src/lib/i18n/catalogs/en.js index 9c87653..4c25967 100644 --- a/frontend/src/lib/i18n/catalogs/en.js +++ b/frontend/src/lib/i18n/catalogs/en.js @@ -150,7 +150,7 @@ export default { 'command.openOverview': 'Open Overview', 'command.openFiles': 'Open Files', 'command.openActivity': 'Open Activity', - 'command.openBrowserInbox': 'Open Browser Inbox', + 'command.openBrowserInbox': 'Open Browser', 'command.createMarkdown': 'Create Markdown File', 'command.createText': 'Create Text File', 'command.syncNow': 'Sync Now', @@ -172,7 +172,7 @@ export default { 'search.type.folder': 'Folder', 'search.type.file': 'File', 'search.type.journal': 'Journal', - 'search.type.browserInbox': 'Browser Inbox', + 'search.type.browserInbox': 'Browser', 'search.type.activity': 'Activity', 'workbench.noProvider': 'No provider', 'workbench.noViewer': 'No viewer/editor available', diff --git a/frontend/src/lib/i18n/catalogs/ru.js b/frontend/src/lib/i18n/catalogs/ru.js index a43c878..6bbc758 100644 --- a/frontend/src/lib/i18n/catalogs/ru.js +++ b/frontend/src/lib/i18n/catalogs/ru.js @@ -150,7 +150,7 @@ export default { 'command.openOverview': 'Открыть обзор', 'command.openFiles': 'Открыть файлы', 'command.openActivity': 'Открыть активность', - 'command.openBrowserInbox': 'Открыть входящие из браузера', + 'command.openBrowserInbox': 'Открыть Браузер', 'command.createMarkdown': 'Создать файл Markdown', 'command.createText': 'Создать текстовый файл', 'command.syncNow': 'Синхронизировать сейчас', @@ -172,7 +172,7 @@ export default { 'search.type.folder': 'Папка', 'search.type.file': 'Файл', 'search.type.journal': 'Журнал', - 'search.type.browserInbox': 'Входящие из браузера', + 'search.type.browserInbox': 'Браузер', 'search.type.activity': 'Активность', 'workbench.noProvider': 'Нет обработчика', 'workbench.noViewer': 'Нет доступного средства просмотра или редактора', diff --git a/frontend/src/lib/test/wails-mock.js b/frontend/src/lib/test/wails-mock.js index e979de2..809f1bd 100644 --- a/frontend/src/lib/test/wails-mock.js +++ b/frontend/src/lib/test/wails-mock.js @@ -242,19 +242,19 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ manifest: { schemaVersion: 1, id: 'verstak.browser-inbox', - name: 'Browser Inbox', + name: 'Browser', version: '0.1.0', apiVersion: '0.1.0', - description: 'Global browser capture queue with explicit workspace assignment.', + description: 'Global browser materials with explicit Deal assignment.', source: 'official', icon: 'inbox', provides: ['browser.inbox'], permissions: ['events.subscribe', 'files.read', 'storage.namespace', 'ui.register'], frontend: { entry: 'frontend/dist/index.js' }, contributes: { - views: [{ id: 'verstak.browser-inbox.view', title: 'Browser Inbox', icon: 'inbox', component: 'BrowserInboxView' }], - sidebarItems: [{ id: 'verstak.browser-inbox.sidebar', title: 'Browser Inbox', icon: 'inbox', view: 'verstak.browser-inbox.view', position: 30 }], - workspaceItems: [{ id: 'verstak.browser-inbox.workspace', title: 'Browser Inbox', icon: 'inbox', component: 'BrowserInboxView' }] + views: [{ id: 'verstak.browser-inbox.view', title: 'Browser', icon: 'inbox', component: 'BrowserInboxView' }], + sidebarItems: [{ id: 'verstak.browser-inbox.sidebar', title: 'Browser', icon: 'inbox', view: 'verstak.browser-inbox.view', position: 30 }], + workspaceItems: [{ id: 'verstak.browser-inbox.workspace', title: 'Browser', icon: 'inbox', component: 'BrowserInboxView' }] } }, rootPath: '/tmp/verstak-test/plugins/browser-inbox', @@ -297,7 +297,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ 'verstak.sync': 'Синхронизация', 'verstak.activity': 'Активность', 'verstak.journal': 'Журнал', - 'verstak.browser-inbox': 'Входящие из браузера', + 'verstak.browser-inbox': 'Браузер', 'verstak.search': 'Поиск', 'verstak.trash': 'Корзина', 'verstak.todo': 'Задачи', @@ -2456,7 +2456,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ } function title(capture) { - return capture.title || capture.fileName || capture.url || capture.captureId || 'Untitled capture'; + return capture.title || capture.fileName || capture.url || capture.captureId || 'Untitled material'; } function renderBrowserInbox(containerEl, props, api) { @@ -2473,7 +2473,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ containerEl.innerHTML = ''; var root = el('div', { className: 'browser-inbox-root', 'data-plugin-id': PLUGIN_ID }); var toolbar = el('div', { className: 'browser-inbox-toolbar' }); - var titleEl = el('span', { className: 'browser-inbox-title', textContent: rootPath ? 'Browser Inbox · ' + rootPath : 'Browser Inbox' }); + var titleEl = el('span', { className: 'browser-inbox-title', textContent: rootPath ? 'Browser · ' + rootPath : 'Browser' }); var countEl = el('span', { className: 'browser-inbox-count' }); var statusEl = el('span', { className: 'browser-inbox-status' }); var filtersEl = el('div', { className: 'browser-inbox-filters' }); @@ -2557,7 +2557,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ function renderWorkspaceFilterOptions() { if (rootPath) return; workspaceFilterEl.innerHTML = ''; - workspaceFilterEl.appendChild(option('', 'All workspaces')); + workspaceFilterEl.appendChild(option('', 'All Deals')); workspaceRoots().forEach(function (workspace) { workspaceFilterEl.appendChild(option(workspace, workspace)); }); @@ -2630,7 +2630,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ }) : captures).map(function (capture) { return capture.captureId; }); captures = captures.filter(function (capture) { return ids.indexOf(capture.captureId) === -1; }); selectedId = ''; - statusText = rootPath ? 'Workspace captures cleared' : 'Inbox cleared'; + statusText = rootPath ? 'Deal materials cleared' : 'Inbox cleared'; return persist(); } @@ -2672,7 +2672,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ listEl.appendChild(el('div', { className: 'browser-inbox-empty', textContent: captures.length === 0 - ? 'No browser captures yet. Keep this view open, then send a page, selection, link, or file from the browser extension.' + ? 'No browser materials yet. Send a page, selection, or link from the extension.' : 'No captures match the current filters.' })); return; @@ -2717,7 +2717,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ el('div', { className: 'browser-inbox-meta-value', textContent: capture.domain || '-' }), el('div', { className: 'browser-inbox-meta-label', textContent: 'Browser' }), el('div', { className: 'browser-inbox-meta-value', textContent: capture.browserName || capture.source || '-' }), - el('div', { className: 'browser-inbox-meta-label', textContent: 'Workspace' }), + el('div', { className: 'browser-inbox-meta-label', textContent: 'Deal' }), el('div', { className: 'browser-inbox-meta-value', textContent: capture.workspaceRootPath || 'Unassigned' }), el('div', { className: 'browser-inbox-meta-label', textContent: 'Status' }), el('div', { className: 'browser-inbox-meta-value', textContent: capture.processed ? 'Processed' : 'Unprocessed' }) @@ -4196,19 +4196,19 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ manifest: { schemaVersion: 1, id: 'verstak.browser-inbox', - name: 'Browser Inbox', + name: 'Browser', version: '0.1.0', apiVersion: '0.1.0', - description: 'Global browser capture queue with explicit workspace assignment.', + description: 'Global browser materials with explicit Deal assignment.', source: 'official', icon: 'inbox', provides: ['browser.inbox'], permissions: ['events.subscribe', 'files.read', 'storage.namespace', 'ui.register'], frontend: { entry: 'frontend/dist/index.js' }, contributes: { - views: [{ id: 'verstak.browser-inbox.view', title: 'Browser Inbox', icon: 'inbox', component: 'BrowserInboxView' }], - sidebarItems: [{ id: 'verstak.browser-inbox.sidebar', title: 'Browser Inbox', icon: 'inbox', view: 'verstak.browser-inbox.view', position: 30 }], - workspaceItems: [{ id: 'verstak.browser-inbox.workspace', title: 'Browser Inbox', icon: 'inbox', component: 'BrowserInboxView' }] + views: [{ id: 'verstak.browser-inbox.view', title: 'Browser', icon: 'inbox', component: 'BrowserInboxView' }], + sidebarItems: [{ id: 'verstak.browser-inbox.sidebar', title: 'Browser', icon: 'inbox', view: 'verstak.browser-inbox.view', position: 30 }], + workspaceItems: [{ id: 'verstak.browser-inbox.workspace', title: 'Browser', icon: 'inbox', component: 'BrowserInboxView' }] } }, rootPath: '/tmp/verstak-test/plugins/browser-inbox',