## Summary Two things, both fallout from #20360: 1. Rename the `Members → Access` tab to `Members → Invite`. The previous label leaned security-flavored; "Invite" reads as the verb users come here to do. 2. Fix the `signup_invite_email` Playwright test (failing on main, e.g. https://github.com/twentyhq/twenty/actions/runs/25671161586/job/75356474079). The invite-link button moved off the default Team tab when the Members page got tabbed; the test was looking for it on the wrong tab. ## Rename details - File: `SettingsWorkspaceMembersAccessTab.tsx` → `SettingsWorkspaceMembersInviteTab.tsx` (single git rename, ~99% similarity) - Exported component: `SettingsWorkspaceMembersAccessTab` → `SettingsWorkspaceMembersInviteTab` - Tab id (and URL hash): `access` → `invite` - Tab title: `Access` → `Invite` - Icon: `IconKey` → `IconUserPlus` - Doc breadcrumbs (3 files): `Members → Access` → `Members → Invite` ## E2E fix `MembersSection` (Page Object Model) now has an `inviteTab` locator (via `getByTestId('tab-invite')`) and a `goToInviteTab()` helper. Both `copyInviteLink` and `sendInviteEmail` click the Invite tab first, so they work regardless of which tab the page lands on initially. Idempotent if already there. ## Test plan - [x] CI green (e2e test + lint + typecheck + format) - Lingui `.po` files will pick up the new source paths on the next translation pass — not touched here. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
57 lines
1.5 KiB
TypeScript
57 lines
1.5 KiB
TypeScript
import { Locator, Page } from '@playwright/test';
|
|
|
|
export class MembersSection {
|
|
private readonly inviteTab: Locator;
|
|
private readonly inviteMembersField: Locator;
|
|
private readonly inviteMembersButton: Locator;
|
|
private readonly inviteLinkButton: Locator;
|
|
|
|
constructor(public readonly page: Page) {
|
|
this.page = page;
|
|
this.inviteTab = page.getByTestId('tab-invite');
|
|
this.inviteMembersField = page.getByPlaceholder(
|
|
'tim@apple.com, jony.ive@apple',
|
|
);
|
|
this.inviteMembersButton = page.getByRole('button', { name: 'Invite' });
|
|
this.inviteLinkButton = page.getByRole('button', { name: 'Copy link' });
|
|
}
|
|
|
|
async goToInviteTab() {
|
|
await this.inviteTab.click();
|
|
}
|
|
|
|
async copyInviteLink() {
|
|
await this.goToInviteTab();
|
|
await this.inviteLinkButton.click();
|
|
}
|
|
|
|
async sendInviteEmail(email: string) {
|
|
await this.goToInviteTab();
|
|
await this.inviteMembersField.click();
|
|
await this.inviteMembersField.fill(email);
|
|
await this.inviteMembersButton.click();
|
|
}
|
|
|
|
async deleteMember(email: string) {
|
|
await this.page
|
|
.locator(`//div[contains(., '${email}')]/../../div[last()]/div/button`)
|
|
.click();
|
|
}
|
|
|
|
async deleteInviteEmail(email: string) {
|
|
await this.page
|
|
.locator(
|
|
`//div[contains(., '${email}')]/../../div[last()]/div/button[first()]`,
|
|
)
|
|
.click();
|
|
}
|
|
|
|
async refreshInviteEmail(email: string) {
|
|
await this.page
|
|
.locator(
|
|
`//div[contains(., '${email}')]/../../div[last()]/div/button[last()]`,
|
|
)
|
|
.click();
|
|
}
|
|
}
|