feat: pin table row actions and add them to details pages

This commit is contained in:
Elias Schneider
2026-10-04 23:04:17 +02:00
parent 1be9ba9991
commit 3e201b5bb2
23 changed files with 469 additions and 258 deletions
+12
View File
@@ -101,6 +101,18 @@ test('Delete an API', async ({ page }) => {
await expect(page.getByRole('row', { name: apis.orders.name })).not.toBeVisible();
});
test('Delete an API from the details page', async ({ page }) => {
await page.goto(`/settings/admin/apis/${apis.orders.id}`);
await page.getByRole('button', { name: 'Actions' }).click();
await page.getByRole('menuitem', { name: 'Delete' }).click();
await page.getByRole('alertdialog').getByRole('button', { name: 'Delete' }).click();
await expect(page.locator('[data-type="success"]')).toHaveText('API deleted successfully');
await page.waitForURL((url) => url.pathname === '/settings/admin/apis');
await expect(page.getByRole('row', { name: apis.orders.name })).not.toBeVisible();
});
test('Grant a client user-delegated and client access to API permissions', async ({ page }) => {
// Nextcloud has no API access granted by default
await page.goto(`/settings/admin/oidc-clients/${oidcClients.nextcloud.id}`);
+15
View File
@@ -716,6 +716,21 @@ test('Delete OIDC client', async ({ page }) => {
await expect(page.getByRole('row', { name: oidcClient.name })).not.toBeVisible();
});
test('Delete OIDC client from the details page', async ({ page }) => {
const oidcClient = oidcClients.nextcloud;
await page.goto(`/settings/admin/oidc-clients/${oidcClient.id}`);
await page.getByRole('button', { name: 'Actions' }).click();
await page.getByRole('menuitem', { name: 'Delete' }).click();
await page.getByRole('button', { name: 'Delete' }).click();
await expect(page.locator('[data-type="success"]')).toHaveText(
'OIDC client deleted successfully'
);
await page.waitForURL((url) => url.pathname === '/settings/admin/oidc-clients');
await expect(page.getByRole('row', { name: oidcClient.name })).not.toBeVisible();
});
test('Filter OIDC clients by PAR requirement', async ({ page, request }) => {
const parClient = oidcClients.parClient;
+13
View File
@@ -72,6 +72,19 @@ test('Delete user group', async ({ page }) => {
await expect(page.getByRole('row', { name: group.name })).not.toBeVisible();
});
test('Delete user group from the details page', async ({ page }) => {
const group = userGroups.developers;
await page.goto(`/settings/admin/user-groups/${group.id}`);
await page.getByRole('button', { name: 'Actions' }).click();
await page.getByRole('menuitem', { name: 'Delete' }).click();
await page.getByRole('button', { name: 'Delete' }).click();
await expect(page.locator('[data-type="success"]')).toHaveText('User group deleted successfully');
await page.waitForURL((url) => url.pathname === '/settings/admin/user-groups');
await expect(page.getByRole('row', { name: group.name })).not.toBeVisible();
});
test('Update user group custom claims', async ({ page }) => {
await page.goto(`/settings/admin/user-groups/${userGroups.designers.id}`);
+31
View File
@@ -113,6 +113,37 @@ test('Delete user', async ({ page }) => {
).not.toBeVisible();
});
test('Delete user from the details page', async ({ page }) => {
await page.goto('/settings/admin/users');
await page.getByRole('row', { name: `${users.craig.firstname} ${users.craig.lastname}` }).click();
await page.waitForURL(`/settings/admin/users/${users.craig.id}`);
// A pending edit must not block leaving the page once the user is gone
await page.getByLabel('First name').fill('Changed');
await page.getByRole('button', { name: 'Actions' }).click();
await page.getByRole('menuitem', { name: 'Delete' }).click();
await page.getByRole('alertdialog').getByRole('button', { name: 'Delete' }).click();
await expect(page.locator('[data-type="success"]')).toHaveText('User deleted successfully');
await page.waitForURL((url) => url.pathname === '/settings/admin/users');
await expect(
page.getByRole('row', {
name: `${users.craig.firstname} ${users.craig.lastname}`
})
).not.toBeVisible();
});
test('Create one time access token from the details page', async ({ page }) => {
await page.goto(`/settings/admin/users/${users.craig.id}`);
await page.getByRole('button', { name: 'Actions' }).click();
await page.getByRole('menuitem', { name: 'Login Code' }).click();
await page.getByRole('button', { name: 'Show Code' }).click();
await expect(page.getByTestId('login-code-link')).toBeVisible();
});
test('Update user', async ({ page }) => {
const user = users.craig;