Compare commits

..

8 Commits

Author SHA1 Message Date
Renovate Bot
d0ae3b6f04 Update dependency tailwindcss to v4
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Failing after 56s
Add copyright notice / copyright_notice (pull_request) Failing after 1m20s
Check usage of free licenses / build-static-assets (pull_request) Failing after 1m11s
Playwright Tests / test (pull_request) Failing after 1m15s
2025-06-18 02:08:07 +00:00
e09a6892cc Merge pull request 'Improve groups specs and add confirmation dialog to delete action' (#288) from groups-specs into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 39s
Playwright Tests / test (push) Successful in 4m16s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m38s
Reviewed-on: #288
2025-06-17 18:45:56 +00:00
bcc86f2c3b Add specs when group is deleted (+ add confirmation dialog)
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m9s
Add copyright notice / copyright_notice (pull_request) Successful in 1m33s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m29s
Playwright Tests / test (pull_request) Successful in 4m40s
2025-06-17 20:39:40 +02:00
1b957879d4 Add specs for group update operation 2025-06-17 20:35:50 +02:00
536f74cd7a Merge pull request 'Update dependency @types/node to v24.0.3' (#286) from renovate/node-24.x into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 1m7s
Playwright Tests / test (push) Successful in 6m48s
Build Nginx-based docker image / build-static-assets (push) Successful in 7m34s
Reviewed-on: #286
2025-06-17 17:15:54 +00:00
2399f6238c Merge pull request 'Update dependency postcss to v8.5.6' (#287) from renovate/postcss-8.x into main
Some checks failed
Check usage of free licenses / build-static-assets (push) Has been cancelled
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Reviewed-on: #287
2025-06-17 17:15:39 +00:00
Renovate Bot
5d2c43cfef Update dependency postcss to v8.5.6
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 6m3s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m24s
Build Nginx-based docker image / build-static-assets (push) Successful in 16m33s
Playwright Tests / test (pull_request) Successful in 11m1s
2025-06-17 02:04:30 +00:00
Renovate Bot
2055c95c82 Update dependency @types/node to v24.0.3
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 5m3s
Add copyright notice / copyright_notice (pull_request) Successful in 6m14s
Build Nginx-based docker image / build-static-assets (push) Successful in 16m45s
Playwright Tests / test (pull_request) Successful in 17m23s
2025-06-17 02:04:23 +00:00
5 changed files with 78 additions and 30 deletions

View File

@ -21,7 +21,12 @@ export default function GroupsTable({ groups, onUpdate, onEdit, onEditAffinities
const actions = (group: Group) => ( const actions = (group: Group) => (
<div className="flex flex-row items-center"> <div className="flex flex-row items-center">
<TrashIcon className='size-6 cursor-pointer' onClick={() => { api.destroy(serializer, group, onUpdate) }} /> <TrashIcon className='size-6 cursor-pointer' onClick={() => {
if (window.confirm(`Are you sure you want to delete guest "${group.name}"?`)) {
api.destroy(serializer, group, onUpdate)
}
}}
/>
<PencilIcon className='size-6 cursor-pointer' onClick={() => onEdit(group)} /> <PencilIcon className='size-6 cursor-pointer' onClick={() => onEdit(group)} />
<AdjustmentsHorizontalIcon className='size-6 cursor-pointer' onClick={() => onEditAffinities(group)} /> <AdjustmentsHorizontalIcon className='size-6 cursor-pointer' onClick={() => onEditAffinities(group)} />
</div> </div>

View File

@ -18,7 +18,7 @@
"dompurify": "^3.2.6", "dompurify": "^3.2.6",
"next": "15.3.3", "next": "15.3.3",
"next-auth": "5.0.0-beta.28", "next-auth": "5.0.0-beta.28",
"postcss": "8.5.5", "postcss": "8.5.6",
"primeicons": "^7.0.0", "primeicons": "^7.0.0",
"primereact": "^10.8.2", "primereact": "^10.8.2",
"react": "19.0.0-rc-f38c22b244-20240704", "react": "19.0.0-rc-f38c22b244-20240704",
@ -32,7 +32,7 @@
"devDependencies": { "devDependencies": {
"@playwright/test": "^1.52.0", "@playwright/test": "^1.52.0",
"@types/bcrypt": "^5.0.2", "@types/bcrypt": "^5.0.2",
"@types/node": "24.0.1", "@types/node": "24.0.3",
"@types/react": "18.3.23", "@types/react": "18.3.23",
"@types/react-dom": "18.3.7", "@types/react-dom": "18.3.7",
"wait-on": "^8.0.3" "wait-on": "^8.0.3"

28
pnpm-lock.yaml generated
View File

@ -28,7 +28,7 @@ importers:
version: 2.14.0 version: 2.14.0
autoprefixer: autoprefixer:
specifier: 10.4.21 specifier: 10.4.21
version: 10.4.21(postcss@8.5.5) version: 10.4.21(postcss@8.5.6)
bcrypt: bcrypt:
specifier: ^6.0.0 specifier: ^6.0.0
version: 6.0.0 version: 6.0.0
@ -45,8 +45,8 @@ importers:
specifier: 5.0.0-beta.28 specifier: 5.0.0-beta.28
version: 5.0.0-beta.28(next@15.3.3(@playwright/test@1.53.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704) version: 5.0.0-beta.28(next@15.3.3(@playwright/test@1.53.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)
postcss: postcss:
specifier: 8.5.5 specifier: 8.5.6
version: 8.5.5 version: 8.5.6
primeicons: primeicons:
specifier: ^7.0.0 specifier: ^7.0.0
version: 7.0.0 version: 7.0.0
@ -82,8 +82,8 @@ importers:
specifier: ^5.0.2 specifier: ^5.0.2
version: 5.0.2 version: 5.0.2
'@types/node': '@types/node':
specifier: 24.0.1 specifier: 24.0.3
version: 24.0.1 version: 24.0.3
'@types/react': '@types/react':
specifier: 18.3.23 specifier: 18.3.23
version: 18.3.23 version: 18.3.23
@ -469,8 +469,8 @@ packages:
'@types/mdurl@2.0.0': '@types/mdurl@2.0.0':
resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==}
'@types/node@24.0.1': '@types/node@24.0.3':
resolution: {integrity: sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==} resolution: {integrity: sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==}
'@types/prop-types@15.7.12': '@types/prop-types@15.7.12':
resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==}
@ -804,8 +804,8 @@ packages:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
postcss@8.5.5: postcss@8.5.6:
resolution: {integrity: sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==} resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
preact-render-to-string@6.5.11: preact-render-to-string@6.5.11:
@ -1335,7 +1335,7 @@ snapshots:
'@types/bcrypt@5.0.2': '@types/bcrypt@5.0.2':
dependencies: dependencies:
'@types/node': 24.0.1 '@types/node': 24.0.3
'@types/linkify-it@5.0.0': {} '@types/linkify-it@5.0.0': {}
@ -1346,7 +1346,7 @@ snapshots:
'@types/mdurl@2.0.0': {} '@types/mdurl@2.0.0': {}
'@types/node@24.0.1': '@types/node@24.0.3':
dependencies: dependencies:
undici-types: 7.8.0 undici-types: 7.8.0
@ -1374,14 +1374,14 @@ snapshots:
asynckit@0.4.0: {} asynckit@0.4.0: {}
autoprefixer@10.4.21(postcss@8.5.5): autoprefixer@10.4.21(postcss@8.5.6):
dependencies: dependencies:
browserslist: 4.24.4 browserslist: 4.24.4
caniuse-lite: 1.0.30001702 caniuse-lite: 1.0.30001702
fraction.js: 4.3.7 fraction.js: 4.3.7
normalize-range: 0.1.2 normalize-range: 0.1.2
picocolors: 1.1.1 picocolors: 1.1.1
postcss: 8.5.5 postcss: 8.5.6
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
axios@1.9.0: axios@1.9.0:
@ -1657,7 +1657,7 @@ snapshots:
picocolors: 1.1.1 picocolors: 1.1.1
source-map-js: 1.2.1 source-map-js: 1.2.1
postcss@8.5.5: postcss@8.5.6:
dependencies: dependencies:
nanoid: 3.3.11 nanoid: 3.3.11
picocolors: 1.1.1 picocolors: 1.1.1

View File

@ -52,6 +52,8 @@ test('should allow CRUD on groups', async ({ page }) => {
await dialog.getByLabel('Name').fill("Pam's friends"); await dialog.getByLabel('Name').fill("Pam's friends");
await dialog.getByRole('button', { name: 'Create' }).click(); await dialog.getByRole('button', { name: 'Create' }).click();
await expect(page.getByRole('row')).toHaveCount(4); // 1 header row + 3 data rows
await expect(dialog).not.toBeVisible(); await expect(dialog).not.toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toContainText('Pam\'s friends'); await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toContainText('Pam\'s friends');
@ -62,4 +64,19 @@ test('should allow CRUD on groups', async ({ page }) => {
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(6)).toHaveText('0'); await expect(page.getByRole('row').nth(1).getByRole('cell').nth(6)).toHaveText('0');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(7)).toHaveText('0'); await expect(page.getByRole('row').nth(1).getByRole('cell').nth(7)).toHaveText('0');
await expect(page.getByRole('row').nth(1).locator('svg:visible')).toHaveCount(3); await expect(page.getByRole('row').nth(1).locator('svg:visible')).toHaveCount(3);
// Modify the newly added group
await page.getByRole('row').nth(1).locator('svg').nth(2).click(); // Click edit icon
await expect(dialog).toBeVisible();
await expect(dialog.getByLabel('Name')).toHaveValue("Pam's friends");
await dialog.getByLabel('Name').fill('Pam\'s best friends');
await dialog.getByRole('button', { name: 'Update' }).click();
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toContainText('Pam\'s best friends');
// Delete the newly added group
page.on('dialog', dialog => dialog.accept());
await page.getByRole('row').nth(1).locator('svg').nth(1).click(); // Click delete icon
await expect(page.getByRole('row')).toHaveCount(3); // 1 header row + 2 data rows
}); });

View File

@ -57,4 +57,30 @@ export default async function mockGroupsAPI({ page }: { page: Page }): Promise<v
await route.fulfill({ json }) await route.fulfill({ json })
} }
}) })
page.route("*/**/api/default/groups/*", async route => {
if (route.request().method() === 'PUT') {
const json = {
"id": "4d55bc34-6f42-4e2e-82a1-71ae32da2466",
"name": "Pam's best friends",
"icon": "pi pi-desktop",
"parent_id": null,
"color": "#0000ff",
"attendance": {
"total": 0,
"considered": 0,
"invited": 0,
"confirmed": 0,
"declined": 0,
"tentative": 0
}
}
await route.fulfill({ json });
} else if (route.request().method() === 'DELETE') {
const json = {}
await route.fulfill({ json });
}
});
} }