Compare commits

...

233 Commits

Author SHA1 Message Date
60e322b407 Merge pull request 'Update dependency @types/node to v24.0.10' (#307) from renovate/node-24.x into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 34s
Playwright Tests / test (push) Successful in 4m6s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m21s
Reviewed-on: #307
2025-07-05 09:33:40 +00:00
Renovate Bot
881c7ac9f9 Update dependency @types/node to v24.0.10
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 4m39s
Add copyright notice / copyright_notice (pull_request) Successful in 6m23s
Build Nginx-based docker image / build-static-assets (push) Successful in 16m44s
Playwright Tests / test (pull_request) Successful in 25m42s
2025-07-05 02:05:02 +00:00
694c084a6d Merge pull request 'Update dependency next to v15.3.5' (#309) from renovate/next-15.x into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 1m54s
Playwright Tests / test (push) Successful in 25m47s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h15m46s
2025-07-05 02:04:07 +00:00
Renovate Bot
c7f1e626fa Update dependency next to v15.3.5
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 43s
Check usage of free licenses / build-static-assets (pull_request) Successful in 35s
Playwright Tests / test (pull_request) Successful in 14m58s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h6m47s
2025-07-04 02:05:10 +00:00
b7b78c251e Merge pull request 'Update dependency @playwright/test to v1.53.2' (#304) from renovate/playwright-test-1.x-lockfile into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 2m56s
Playwright Tests / test (push) Successful in 17m55s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h22m23s
2025-07-04 02:04:50 +00:00
Renovate Bot
0a7b435398 Update dependency @playwright/test to v1.53.2
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 3m48s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m57s
Build Nginx-based docker image / build-static-assets (push) Successful in 29m12s
Playwright Tests / test (pull_request) Successful in 43m31s
2025-07-03 02:07:33 +00:00
7e31629de6 Merge pull request 'Add a button to download a PDF file with all QR codes' (#306) from invitations-download-pdf into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 54s
Playwright Tests / test (push) Successful in 4m15s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m54s
Reviewed-on: #306
2025-07-01 15:54:30 +00:00
b4ec903ce0 Add a button to download a PDF file with all QR codes
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 29s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m34s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m17s
Playwright Tests / test (pull_request) Successful in 4m18s
2025-07-01 17:49:49 +02:00
d390d6e055 Merge pull request 'Update dependency node to v24.3.0' (#300) from renovate/node-24.x into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 43s
Playwright Tests / test (push) Successful in 5m12s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m31s
Reviewed-on: #300
2025-06-30 15:47:28 +00:00
Renovate Bot
f4e49d2594 Update dependency node to v24.3.0
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 8m31s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m20s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h5m37s
Playwright Tests / test (pull_request) Successful in 58m48s
2025-06-30 02:06:50 +00:00
Renovate Bot
140650d682 Update dependency next-auth to v5.0.0-beta.29
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 4m11s
Playwright Tests / test (push) Successful in 19m33s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m7s
Add copyright notice / copyright_notice (pull_request) Successful in 7m32s
Build Nginx-based docker image / build-static-assets (push) Successful in 29m53s
Playwright Tests / test (pull_request) Successful in 18m56s
2025-06-29 02:04:57 +00:00
Renovate Bot
c239f81e8b Update dependency @atlaskit/pragmatic-drag-and-drop to v1.7.4
All checks were successful
Build Nginx-based docker image / build-static-assets (push) Successful in 38m37s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m39s
Add copyright notice / copyright_notice (pull_request) Successful in 2m41s
Playwright Tests / test (pull_request) Successful in 20m17s
Check usage of free licenses / build-static-assets (push) Successful in 4m0s
Playwright Tests / test (push) Successful in 18m22s
2025-06-28 02:03:55 +00:00
1e52f68d16 Merge pull request 'Update dependency @tiptap/pm to v2.23.0' (#302) from renovate/tiptap-pm-2.x-lockfile into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 54s
Playwright Tests / test (push) Successful in 6m32s
Build Nginx-based docker image / build-static-assets (push) Successful in 8m56s
Reviewed-on: #302
2025-06-27 06:44:21 +00:00
Renovate Bot
7ee0502a66 Update dependency @tiptap/pm to v2.23.0
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m44s
Add copyright notice / copyright_notice (pull_request) Successful in 2m12s
Build Nginx-based docker image / build-static-assets (push) Successful in 46m44s
Playwright Tests / test (pull_request) Successful in 52m0s
2025-06-27 02:07:15 +00:00
Renovate Bot
f3af4ade2b Update pnpm to v10.12.3
Some checks failed
Playwright Tests / test (push) Failing after 50m53s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h12m32s
Playwright Tests / test (pull_request) Successful in 28m38s
Check usage of free licenses / build-static-assets (push) Successful in 4m50s
Check usage of free licenses / build-static-assets (pull_request) Successful in 7m2s
Add copyright notice / copyright_notice (pull_request) Successful in 7m17s
2025-06-25 02:05:37 +00:00
Renovate Bot
0788f7c6e4 Update dependency @tiptap/react to v2.22.3
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 4m18s
Playwright Tests / test (push) Successful in 17m12s
Build Nginx-based docker image / build-static-assets (push) Successful in 18m55s
Add copyright notice / copyright_notice (pull_request) Successful in 2m28s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m9s
Playwright Tests / test (pull_request) Successful in 33m8s
2025-06-23 02:07:12 +00:00
203887da10 Merge pull request 'Update dependency zod to v3.25.67' (#289) from renovate/zod-3.x-lockfile into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 1m16s
Playwright Tests / test (push) Successful in 4m53s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m28s
Reviewed-on: #289
2025-06-22 08:55:25 +00:00
fc7bb9729d Merge pull request 'Update dependency @tiptap/pm to v2.22.3' (#292) from renovate/tiptap-pm-2.x-lockfile into main
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Reviewed-on: #292
2025-06-22 08:55:19 +00:00
Renovate Bot
d354c15e64 Update dependency @tiptap/pm to v2.22.3
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m44s
Add copyright notice / copyright_notice (pull_request) Successful in 2m47s
Playwright Tests / test (pull_request) Successful in 39m17s
Build Nginx-based docker image / build-static-assets (push) Successful in 52m56s
2025-06-22 02:07:23 +00:00
Renovate Bot
79e4998e3c Update dependency zod to v3.25.67
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m34s
Add copyright notice / copyright_notice (pull_request) Successful in 2m49s
Build Nginx-based docker image / build-static-assets (push) Successful in 39m48s
Playwright Tests / test (pull_request) Successful in 40m34s
2025-06-22 02:07:11 +00:00
Renovate Bot
07e89b4717 Update dependency @atlaskit/pragmatic-drag-and-drop to v1.7.3
Some checks failed
Add copyright notice / copyright_notice (pull_request) Successful in 1m49s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m2s
Playwright Tests / test (pull_request) Successful in 39m15s
Check usage of free licenses / build-static-assets (push) Successful in 1m34s
Playwright Tests / test (push) Failing after 40m27s
Build Nginx-based docker image / build-static-assets (push) Successful in 58m2s
2025-06-21 02:06:39 +00:00
4c52444110 Merge pull request 'Update dependency @playwright/test to v1.53.1' (#290) from renovate/playwright-test-1.x-lockfile into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 1m32s
Playwright Tests / test (push) Successful in 6m25s
Build Nginx-based docker image / build-static-assets (push) Successful in 7m47s
Reviewed-on: #290
2025-06-20 09:12:56 +00:00
cb51fbddd7 Merge pull request 'Update dependency @tiptap/react to v2.14.1' (#293) from renovate/tiptap-react-2.x-lockfile into main
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Reviewed-on: #293
2025-06-20 09:12:46 +00:00
Renovate Bot
dcd61a0f38 Update dependency @tiptap/react to v2.14.1
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 1m16s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m32s
Build Nginx-based docker image / build-static-assets (push) Successful in 28m24s
Playwright Tests / test (pull_request) Successful in 35m45s
2025-06-20 02:06:59 +00:00
Renovate Bot
4e908ba62a Update dependency @playwright/test to v1.53.1
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m29s
Add copyright notice / copyright_notice (pull_request) Successful in 2m27s
Build Nginx-based docker image / build-static-assets (push) Successful in 27m52s
Playwright Tests / test (pull_request) Successful in 32m21s
2025-06-20 02:06:48 +00:00
b8ecc6de98 Merge pull request 'Update dependency next to v15.3.4' (#291) from renovate/next-15.x into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 56s
Playwright Tests / test (push) Successful in 7m16s
Build Nginx-based docker image / build-static-assets (push) Successful in 7m35s
Reviewed-on: #291
2025-06-19 06:59:27 +00:00
Renovate Bot
3338dcb604 Update dependency next to v15.3.4
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m30s
Add copyright notice / copyright_notice (pull_request) Successful in 4m31s
Playwright Tests / test (pull_request) Successful in 30m41s
Build Nginx-based docker image / build-static-assets (push) Successful in 36m59s
2025-06-19 02:07:50 +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
71a976eced Merge pull request 'Update node Docker tag to v24' (#249) from renovate/node-24.x into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 31s
Playwright Tests / test (push) Successful in 4m22s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m20s
Reviewed-on: #249
2025-06-15 13:37:43 +00:00
41bd2ad2b5 Fix CI to use the node versino defined in .nvmrc
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 4m27s
Add copyright notice / copyright_notice (pull_request) Successful in 4m37s
Build Nginx-based docker image / build-static-assets (push) Successful in 7m2s
Playwright Tests / test (pull_request) Successful in 8m10s
2025-06-15 13:35:24 +02:00
cd6574389f Merge pull request 'Add a confirmation dialog before deleting a guest' (#284) from confirmation-dialog-remove-guest into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 51s
Playwright Tests / test (push) Successful in 11m49s
Build Nginx-based docker image / build-static-assets (push) Successful in 12m11s
Reviewed-on: #284
2025-06-15 11:28:14 +00:00
e9e0ec7c13 Update .nvmrc
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m21s
Add copyright notice / copyright_notice (pull_request) Successful in 1m59s
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Playwright Tests / test (pull_request) Successful in 11m39s
2025-06-15 13:27:44 +02:00
cb89310425 Update specs accordingly
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 55s
Add copyright notice / copyright_notice (pull_request) Successful in 1m7s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m53s
Playwright Tests / test (pull_request) Successful in 4m0s
2025-06-15 13:24:09 +02:00
1e2829da25 Merge pull request 'Fix the color of the table arrangements' (#285) from fix-table-arrangement-colors into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 41s
Playwright Tests / test (push) Successful in 5m37s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m4s
Reviewed-on: #285
2025-06-15 10:45:35 +00:00
4d1f83cc33 Fix the color of the table arrangements
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m8s
Add copyright notice / copyright_notice (pull_request) Successful in 1m8s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m13s
Playwright Tests / test (pull_request) Successful in 4m6s
2025-06-15 12:32:06 +02:00
471b98fb53 Add a confirmation dialog before deleting a guest
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m44s
Add copyright notice / copyright_notice (pull_request) Successful in 2m24s
Build Nginx-based docker image / build-static-assets (push) Successful in 8m30s
Playwright Tests / test (pull_request) Failing after 8m55s
2025-06-15 12:12:04 +02:00
Renovate Bot
055ef75510 Update node Docker tag to v24
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 2m49s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m50s
Build Nginx-based docker image / build-static-assets (push) Successful in 10m4s
Playwright Tests / test (pull_request) Successful in 10m24s
2025-06-15 02:04:31 +00:00
8306cfe249 Merge pull request 'Adjust group creation to avoid a full reload' (#283) from group-specs into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 44s
Playwright Tests / test (push) Successful in 4m18s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m1s
Reviewed-on: #283
2025-06-14 17:05:46 +00:00
67e4ad5d16 Refactor feature to add groups avoiding reload and improve specs
All checks were successful
Build Nginx-based docker image / build-static-assets (push) Successful in 2m0s
Check usage of free licenses / build-static-assets (pull_request) Successful in 45s
Add copyright notice / copyright_notice (pull_request) Successful in 59s
Playwright Tests / test (pull_request) Successful in 3m44s
2025-06-14 11:27:44 +02:00
5164491e64 Merge pull request 'Extract API mocks to their own file' (#282) from extract-mocks into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 34s
Playwright Tests / test (push) Successful in 4m7s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m44s
Reviewed-on: #282
2025-06-14 07:49:10 +00:00
89e9c211d7 Refactor: extract groups specs to their own file 2025-06-14 09:46:35 +02:00
02760e5068 Extract API mocks to their own file
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m11s
Add copyright notice / copyright_notice (pull_request) Successful in 1m27s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m12s
Playwright Tests / test (pull_request) Successful in 4m18s
2025-06-14 09:44:31 +02:00
2ebd9796e3 Merge pull request 'Fix minor UI bugs and test guest CRUD' (#281) from improve-specs-guests into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 46s
Playwright Tests / test (push) Successful in 4m14s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m46s
Reviewed-on: #281
2025-06-14 06:35:14 +00:00
c50263f760 Fix bug where updated guest is duplicated
All checks were successful
Build Nginx-based docker image / build-static-assets (push) Successful in 2m20s
Check usage of free licenses / build-static-assets (pull_request) Successful in 42s
Add copyright notice / copyright_notice (pull_request) Successful in 55s
Playwright Tests / test (pull_request) Successful in 3m3s
2025-06-14 08:22:13 +02:00
5c524c2559 Merge create and list guests into a single test 2025-06-14 07:28:03 +02:00
ae5a986f25 Merge pull request 'Update dependency bcrypt to v6' (#251) from renovate/bcrypt-6.x into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 53s
Playwright Tests / test (push) Successful in 4m13s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m21s
Reviewed-on: #251
2025-06-14 05:18:57 +00:00
0a28127c4d Merge pull request 'Update dependency @types/node to v22.15.31' (#276) from renovate/node-22.x into main
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Reviewed-on: #276
2025-06-14 05:18:51 +00:00
7ae23204ff Merge pull request 'Update dependency zod to v3.25.64' (#266) from renovate/zod-3.x-lockfile into main
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Reviewed-on: #266
2025-06-14 05:18:41 +00:00
c000d1c9b4 Merge pull request 'Update dependency postcss to v8.5.5' (#280) from renovate/postcss-8.x into main
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Reviewed-on: #280
2025-06-14 05:18:26 +00:00
Renovate Bot
3b95dde33e Update dependency bcrypt to v6
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m29s
Add copyright notice / copyright_notice (pull_request) Successful in 3m53s
Build Nginx-based docker image / build-static-assets (push) Successful in 21m46s
Playwright Tests / test (pull_request) Successful in 19m39s
2025-06-14 02:05:44 +00:00
Renovate Bot
2cae594794 Update dependency zod to v3.25.64
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 9m30s
Check usage of free licenses / build-static-assets (pull_request) Successful in 9m53s
Build Nginx-based docker image / build-static-assets (push) Successful in 29m18s
Playwright Tests / test (pull_request) Successful in 23m16s
2025-06-14 02:05:27 +00:00
Renovate Bot
46fa8133c3 Update dependency postcss to v8.5.5
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m26s
Add copyright notice / copyright_notice (pull_request) Successful in 2m26s
Playwright Tests / test (pull_request) Successful in 18m57s
Build Nginx-based docker image / build-static-assets (push) Successful in 24m30s
2025-06-14 02:05:11 +00:00
Renovate Bot
5c5766dfe0 Update dependency @types/node to v22.15.31
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 2m11s
Check usage of free licenses / build-static-assets (pull_request) Successful in 58s
Build Nginx-based docker image / build-static-assets (push) Successful in 21m10s
Playwright Tests / test (pull_request) Successful in 24m7s
2025-06-14 02:05:02 +00:00
02a7270da0 Merge pull request 'Update dependency primereact to v10.9.6' (#265) from renovate/primereact-10.x-lockfile into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 1m7s
Playwright Tests / test (push) Successful in 5m0s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m36s
Reviewed-on: #265
2025-06-13 10:40:18 +00:00
759fcde872 Merge pull request 'Update dependency use-debounce to v10.0.5' (#275) from renovate/use-debounce-10.x-lockfile into main
Some checks failed
Check usage of free licenses / build-static-assets (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Reviewed-on: #275
2025-06-13 10:40:09 +00:00
b1a5ea5a1f Merge pull request 'Update dependency @playwright/test to v1.53.0' (#277) from renovate/playwright-test-1.x-lockfile into main
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Reviewed-on: #277
2025-06-13 10:40:00 +00:00
Renovate Bot
1bea961002 Update dependency @playwright/test to v1.53.0
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 5m50s
Add copyright notice / copyright_notice (pull_request) Successful in 8m0s
Playwright Tests / test (pull_request) Successful in 25m16s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m17s
2025-06-13 02:06:43 +00:00
Renovate Bot
83c2f1c43e Update dependency use-debounce to v10.0.5
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m51s
Add copyright notice / copyright_notice (pull_request) Successful in 8m49s
Build Nginx-based docker image / build-static-assets (push) Successful in 46m7s
Playwright Tests / test (pull_request) Successful in 49m58s
2025-06-13 02:06:07 +00:00
Renovate Bot
c5bd36d230 Update dependency primereact to v10.9.6
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 2m36s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m33s
Playwright Tests / test (pull_request) Successful in 46m21s
Build Nginx-based docker image / build-static-assets (push) Successful in 48m54s
2025-06-13 02:05:56 +00:00
a74ef0c8b6 Merge pull request 'Add a link to the invitation in the invitation card' (#262) from invitation-link into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 59s
Playwright Tests / test (push) Successful in 6m35s
Build Nginx-based docker image / build-static-assets (push) Successful in 7m18s
Reviewed-on: #262
2025-06-12 21:08:05 +00:00
87cf2d3bb2 Merge pull request 'Display a basic invitation form on invites page' (#279) from invitation-form into main
Some checks failed
Check usage of free licenses / build-static-assets (push) Successful in 1m57s
Playwright Tests / test (push) Has been cancelled
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Reviewed-on: #279
2025-06-12 21:04:34 +00:00
5c1f8b0dbe Update the path of the invitation
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 57s
Add copyright notice / copyright_notice (pull_request) Successful in 1m15s
Build Nginx-based docker image / build-static-assets (push) Successful in 11m23s
2025-06-12 22:56:37 +02:00
24e60231d0 Display a basic invitation form on invites page
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 22s
Add copyright notice / copyright_notice (pull_request) Successful in 26s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m22s
Playwright Tests / test (pull_request) Successful in 9m39s
2025-06-12 22:54:25 +02:00
943da9c7e8 Merge pull request 'Store the current slug when accessing the website directly' (#278) from fix/slug-website into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 37s
Playwright Tests / test (push) Successful in 4m2s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m23s
Reviewed-on: #278
2025-06-12 17:11:22 +00:00
cc698102f2 Store the current slug when accessing the website directly
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 30s
Add copyright notice / copyright_notice (pull_request) Successful in 58s
Build Nginx-based docker image / build-static-assets (push) Successful in 2m58s
Playwright Tests / test (pull_request) Successful in 4m25s
2025-06-12 19:06:23 +02:00
Renovate Bot
79f499b8a6 Update pnpm to v10.12.1
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 8m10s
Add copyright notice / copyright_notice (pull_request) Successful in 8m38s
Playwright Tests / test (pull_request) Successful in 25m49s
Playwright Tests / test (push) Failing after 4s
Check usage of free licenses / build-static-assets (push) Successful in 1m3s
Build Nginx-based docker image / build-static-assets (push) Successful in 47m47s
2025-06-10 02:06:48 +00:00
845a2bcfa1 Merge pull request 'Update dependency @types/node to v22.15.30' (#268) from renovate/node-22.x into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 1m8s
Playwright Tests / test (push) Successful in 6m32s
Build Nginx-based docker image / build-static-assets (push) Successful in 9m19s
Reviewed-on: #268
2025-06-09 06:15:30 +00:00
6ae0b70213 Merge pull request 'Update dependency @atlaskit/pragmatic-drag-and-drop to v1.7.2' (#264) from renovate/atlaskit-pragmatic-drag-and-drop-1.x-lockfile into main
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
Reviewed-on: #264
2025-06-09 06:15:19 +00:00
Renovate Bot
91557fa332 Update dependency @types/node to v22.15.30
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 3m11s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m18s
Playwright Tests / test (pull_request) Successful in 18m16s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h21m43s
2025-06-09 02:04:42 +00:00
Renovate Bot
6a4a20fae9 Update dependency @atlaskit/pragmatic-drag-and-drop to v1.7.2
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m16s
Add copyright notice / copyright_notice (pull_request) Successful in 3m33s
Playwright Tests / test (pull_request) Successful in 20m4s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h9m28s
2025-06-09 02:04:27 +00:00
0dc182f712 Merge pull request 'Render the website inside an iframe to preview the changes being applied' (#273) from website-preview-iframe into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 1m7s
Playwright Tests / test (push) Successful in 6m17s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m42s
Reviewed-on: #273
2025-06-08 21:43:46 +00:00
0d35668efe Render the website inside an iframe to preview the changes being applied
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m39s
Add copyright notice / copyright_notice (pull_request) Successful in 2m15s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m45s
Playwright Tests / test (pull_request) Successful in 6m46s
2025-06-08 23:36:32 +02:00
a60523b97a Merge pull request 'Implement WYSIWYG to edit the website content' (#272) from website-editor into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 43s
Playwright Tests / test (push) Successful in 4m13s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m14s
Reviewed-on: #272
2025-06-08 19:10:41 +00:00
55a2703577 Fix interface of API
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m4s
Add copyright notice / copyright_notice (pull_request) Successful in 2m37s
Playwright Tests / test (pull_request) Successful in 9m15s
Build Nginx-based docker image / build-static-assets (push) Successful in 10m53s
2025-06-08 20:59:45 +02:00
981f5079e3 Use dompurify to sanitize content before rendering
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 54s
Playwright Tests / test (pull_request) Failing after 1m9s
Add copyright notice / copyright_notice (pull_request) Successful in 1m14s
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
2025-06-08 20:57:22 +02:00
0b8a444b39 Implement debouncing
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 50s
Playwright Tests / test (pull_request) Failing after 54s
Add copyright notice / copyright_notice (pull_request) Successful in 1m5s
Build Nginx-based docker image / build-static-assets (push) Failing after 2m51s
2025-06-08 20:52:16 +02:00
847666bfc8 Configure API to send website updates on change 2025-06-08 20:52:16 +02:00
97d47b339a Add copyright notice
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 48s
Add copyright notice / copyright_notice (pull_request) Successful in 1m56s
Build Nginx-based docker image / build-static-assets (push) Successful in 7m30s
Playwright Tests / test (pull_request) Failing after 10m28s
2025-06-08 18:04:42 +00:00
82f9cf8e4b Initial steps to create a WYSIWYG for the website
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m20s
Add copyright notice / copyright_notice (pull_request) Successful in 1m28s
Playwright Tests / test (pull_request) Successful in 6m58s
2025-06-08 20:03:23 +02:00
2e7043bb3c Merge pull request 'Make website design responsive' (#271) from website-responsive into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 31s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m3s
Playwright Tests / test (push) Successful in 5m5s
Reviewed-on: #271
2025-06-08 17:26:00 +00:00
965b6ccd22 Make website design responsive
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 42s
Add copyright notice / copyright_notice (pull_request) Successful in 53s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m51s
Playwright Tests / test (pull_request) Successful in 4m46s
2025-06-08 19:20:57 +02:00
1a5424fc8a Merge pull request 'Create the layout of the public website' (#270) from website into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 42s
Playwright Tests / test (push) Successful in 3m26s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m5s
Reviewed-on: #270
2025-06-08 16:53:59 +00:00
9d59485ad6 Create the layout of the public website
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 49s
Add copyright notice / copyright_notice (pull_request) Successful in 1m3s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m23s
Playwright Tests / test (pull_request) Successful in 4m6s
2025-06-08 18:49:37 +02:00
171de9f1aa Merge pull request 'Create new guest without reloading guests list' (#269) from create-guest-without-reload into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 43s
Playwright Tests / test (push) Successful in 4m29s
Build Nginx-based docker image / build-static-assets (push) Successful in 4m46s
Reviewed-on: #269
2025-06-08 15:48:35 +00:00
ee2e33ee51 Create new guest without reloading guests list
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 33s
Add copyright notice / copyright_notice (pull_request) Successful in 53s
Playwright Tests / test (pull_request) Successful in 5m42s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m11s
2025-06-08 17:42:19 +02:00
7f68756d16 Merge pull request 'Update pnpm to v10.11.1' (#267) from renovate/pnpm-10.x into main
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 49s
Playwright Tests / test (push) Successful in 4m35s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m37s
Reviewed-on: #267
2025-06-08 11:50:33 +00:00
671ae8cb6e Merge branch 'main' into renovate/pnpm-10.x
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m23s
Add copyright notice / copyright_notice (pull_request) Successful in 1m37s
Playwright Tests / test (pull_request) Successful in 11m1s
Build Nginx-based docker image / build-static-assets (push) Successful in 12m13s
2025-06-08 11:38:16 +00:00
730d3ad1a1 Merge pull request 'Restore execution of playwright tests' (#130) from restore-playwright into main
Some checks failed
Check usage of free licenses / build-static-assets (push) Successful in 50s
Playwright Tests / test (push) Successful in 10m58s
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Reviewed-on: #130
2025-06-08 11:37:29 +00:00
f51b646430 Copy static and build files int the standalone directory
All checks were successful
Check usage of free licenses / build-static-assets (pull_request) Successful in 50s
Add copyright notice / copyright_notice (pull_request) Successful in 1m0s
Playwright Tests / test (pull_request) Successful in 4m47s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m29s
2025-06-08 13:30:12 +02:00
f3799a26b6 Remove debug logs 2025-06-08 13:21:45 +02:00
1c0570d1a8 Fix additional use of localstorage in the server side
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 58s
Add copyright notice / copyright_notice (pull_request) Successful in 1m19s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m39s
Playwright Tests / test (pull_request) Failing after 9m0s
2025-06-08 13:12:51 +02:00
7719929e43 Prevent slug from being null
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 25s
Add copyright notice / copyright_notice (pull_request) Successful in 32s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m46s
Playwright Tests / test (pull_request) Failing after 14m45s
2025-06-08 12:42:46 +02:00
2c3480f980 Fix use of localstorage in server side
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 48s
Playwright Tests / test (pull_request) Failing after 54s
Add copyright notice / copyright_notice (pull_request) Successful in 1m4s
Build Nginx-based docker image / build-static-assets (push) Failing after 2m34s
2025-06-08 12:33:44 +02:00
22a2cba3fe Fix the path used for checking upstatus 2025-06-08 12:19:01 +02:00
01717b392c Revert "Try localhost"
This reverts commit e0da10c0006d8f984771dbdc38508b69f902835e.
2025-06-08 11:49:44 +02:00
85f918b397 Fix the waiting URL
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 33s
Add copyright notice / copyright_notice (pull_request) Successful in 47s
Playwright Tests / test (pull_request) Failing after 5m38s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m4s
2025-06-08 11:42:59 +02:00
e0da10c000 Try localhost
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m40s
Add copyright notice / copyright_notice (pull_request) Successful in 1m40s
Playwright Tests / test (pull_request) Failing after 13m49s
Build Nginx-based docker image / build-static-assets (push) Successful in 14m7s
2025-06-08 11:10:00 +02:00
8b0cab93c9 Fix environment variable name
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m10s
Add copyright notice / copyright_notice (pull_request) Successful in 4m0s
Playwright Tests / test (pull_request) Failing after 13m38s
Build Nginx-based docker image / build-static-assets (push) Successful in 15m8s
2025-06-08 10:48:51 +02:00
6490e585ee Run the server in 127.0.0.1 host
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 5m14s
Add copyright notice / copyright_notice (pull_request) Successful in 6m34s
Playwright Tests / test (pull_request) Failing after 20m27s
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
2025-06-08 10:27:13 +02:00
d6f603d70c Run standalone node server instead of development build
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 7m7s
Add copyright notice / copyright_notice (pull_request) Successful in 7m15s
Playwright Tests / test (pull_request) Failing after 21m40s
Build Nginx-based docker image / build-static-assets (push) Successful in 23m2s
2025-06-08 10:03:57 +02:00
acdbee40bf Wait for the service to be ready
Some checks failed
Add copyright notice / copyright_notice (pull_request) Successful in 2m34s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m53s
Playwright Tests / test (pull_request) Failing after 13m47s
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
2025-06-08 09:47:48 +02:00
4455c0e6d4 Run playwright tests in verbose mode
Some checks failed
Add copyright notice / copyright_notice (pull_request) Successful in 2m0s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m21s
Build Nginx-based docker image / build-static-assets (push) Successful in 13m39s
Playwright Tests / test (pull_request) Has been cancelled
2025-06-08 09:33:11 +02:00
fed86088c3 Use pnpm to build and run the service
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m25s
Add copyright notice / copyright_notice (pull_request) Successful in 1m28s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m24s
Playwright Tests / test (pull_request) Failing after 20m54s
2025-06-08 09:18:10 +02:00
Renovate Bot
e2c0f91b23 Update pnpm to v10.11.1
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Failing after 51s
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Failing after 32s
Check usage of free licenses / build-static-assets (pull_request) Failing after 21s
2025-06-04 02:08:28 +00:00
c03df8920c Merge pull request 'Update dependency zod to v3.25.46' (#263) from renovate/zod-3.x-lockfile into main
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 37s
Build Nginx-based docker image / build-static-assets (push) Successful in 7m29s
Reviewed-on: #263
2025-06-02 06:27:11 +00:00
Renovate Bot
d6a9415cd9 Update dependency zod to v3.25.46
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m10s
Add copyright notice / copyright_notice (pull_request) Successful in 3m3s
Build Nginx-based docker image / build-static-assets (push) Successful in 37m24s
2025-06-02 02:04:13 +00:00
87bd3fac4b Add a link to the invitation in the invitation card
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 38s
Add copyright notice / copyright_notice (pull_request) Successful in 39s
Build Nginx-based docker image / build-static-assets (push) Successful in 2m20s
2025-06-02 00:08:42 +02:00
3748805377 WIP specs for guest creation
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 40s
Add copyright notice / copyright_notice (pull_request) Successful in 54s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m28s
Playwright Tests / test (pull_request) Failing after 14m3s
2025-06-01 23:46:25 +02:00
e8551dd877 Upgrade playwright to the latest version
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Failing after 1m23s
Add copyright notice / copyright_notice (pull_request) Successful in 2m20s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m20s
Playwright Tests / test (pull_request) Failing after 12m4s
2025-06-01 23:19:12 +02:00
0455fcd8da Enhance the specs for groups 2025-06-01 23:13:05 +02:00
19232477fd Enhance guests tests
Some checks failed
Add copyright notice / copyright_notice (pull_request) Successful in 3m38s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m53s
Build Nginx-based docker image / build-static-assets (push) Successful in 20m22s
Playwright Tests / test (pull_request) Failing after 23m25s
2025-06-01 22:50:41 +02:00
15ccccd927 Merge remote-tracking branch 'origin/main' into enhance-specs 2025-06-01 22:28:53 +02:00
c649f327e0 Merge pull request 'Update dependency postcss to v8.5.4' (#259) from renovate/postcss-8.x into main
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 53s
Build Nginx-based docker image / build-static-assets (push) Successful in 16m11s
Reviewed-on: #259
2025-06-01 20:27:40 +00:00
0b9de712ff Restore basic Playwright tests
Some checks failed
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m16s
Add copyright notice / copyright_notice (pull_request) Successful in 2m31s
Build Nginx-based docker image / build-static-assets (push) Successful in 14m52s
Playwright Tests / test (pull_request) Failing after 18m31s
2025-06-01 22:26:10 +02:00
0c51ef656b Merge pull request 'Update dependency zod to v3.25.45' (#255) from renovate/zod-3.x-lockfile into main
Some checks failed
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Has been cancelled
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Reviewed-on: #255
2025-06-01 20:24:49 +00:00
9366a6ff15 Merge branch 'main' into renovate/zod-3.x-lockfile
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m23s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m45s
Build Nginx-based docker image / build-static-assets (push) Successful in 13m31s
2025-06-01 20:08:51 +00:00
73b6d9aa67 Merge branch 'main' into renovate/postcss-8.x
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 3m3s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m50s
Build Nginx-based docker image / build-static-assets (push) Successful in 18m46s
2025-06-01 20:08:36 +00:00
777d0821a0 Merge pull request 'Add a feature to handle invitations' (#261) from feat/invitations into main
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m3s
Build Nginx-based docker image / build-static-assets (push) Successful in 8m58s
Reviewed-on: #261
2025-06-01 18:09:41 +00:00
10b741cd37 Merge branch 'feat/invitations' of https://gitea.bustikiller.com/bustikiller/wedding-planner-frontend into feat/invitations
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 1m0s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m0s
Build Nginx-based docker image / build-static-assets (push) Successful in 8m15s
2025-06-01 20:01:17 +02:00
79b7011e37 Merge remote-tracking branch 'origin/main' into feat/invitations 2025-06-01 20:00:19 +02:00
f8a52b9968 Add copyright notice
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m9s
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Add copyright notice / copyright_notice (pull_request) Successful in 1m26s
2025-06-01 17:59:55 +00:00
98d9a2544d Exlude considered guests from the list of invitations
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 50s
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Add copyright notice / copyright_notice (pull_request) Successful in 1m3s
2025-06-01 19:58:14 +02:00
72691f7070 Add a confirmation dialog 2025-06-01 17:48:47 +02:00
f256e0f9e7 Allow deleting an invitation 2025-06-01 17:47:50 +02:00
e6bb090b66 Update invitation via API when a guest is added 2025-06-01 17:39:02 +02:00
b820bc837a Add newly created invitations to the start of the list 2025-06-01 17:15:39 +02:00
790d75d2ff Fix UI assignment of guests to invitations 2025-06-01 17:07:47 +02:00
fb82695174 Basic drag and drop behavior 2025-06-01 16:31:54 +02:00
4c7548a664 Merge branch 'main' into restore-playwright
Some checks failed
Add copyright notice / copyright_notice (pull_request) Successful in 40s
Check usage of free licenses / build-static-assets (pull_request) Successful in 44s
Build Nginx-based docker image / build-static-assets (push) Successful in 2m51s
Playwright Tests / test (pull_request) Failing after 15m12s
2025-06-01 13:53:56 +00:00
ecc2550146 Display empty invitations 2025-06-01 15:35:02 +02:00
16cd9e6175 Display number of guests and invitations 2025-06-01 15:30:30 +02:00
94ff03f617 Use a darker green and 4 columns for the invitations 2025-06-01 14:17:02 +02:00
54da3212cb Add an independent scroll for each column 2025-06-01 14:05:59 +02:00
537c285bd4 Initial draft of the invitations board 2025-06-01 13:29:14 +02:00
879ad14c2a Merge pull request 'Display a toast indicating affinities have been reset' (#260) from feat/notification-affinities-reset into main
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 24s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m0s
Reviewed-on: #260
2025-06-01 07:17:02 +00:00
9f0fcf58c4 Display a toast indicating affinities have been reset
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 46s
Check usage of free licenses / build-static-assets (pull_request) Successful in 51s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m52s
2025-06-01 09:13:02 +02:00
Renovate Bot
af955d47f3 Update dependency zod to v3.25.45
Some checks failed
Add copyright notice / copyright_notice (pull_request) Failing after 33s
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Failing after 41s
Build Nginx-based docker image / build-static-assets (push) Successful in 40m45s
2025-06-01 02:07:54 +00:00
Renovate Bot
b4596176cd Update dependency postcss to v8.5.4
Some checks failed
Add copyright notice / copyright_notice (pull_request) Failing after 15s
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Failing after 25s
Build Nginx-based docker image / build-static-assets (push) Successful in 40m44s
2025-06-01 02:07:36 +00:00
Renovate Bot
099d336f7f Update dependency @types/node to v22.15.29
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 1m36s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m26s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 4m26s
Build Nginx-based docker image / build-static-assets (push) Successful in 44m34s
2025-05-31 02:06:07 +00:00
Renovate Bot
e97d083912 Update dependency next to v15.3.3
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m0s
Add copyright notice / copyright_notice (pull_request) Successful in 2m34s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m30s
Build Nginx-based docker image / build-static-assets (push) Failing after 49m8s
2025-05-30 02:06:16 +00:00
Renovate Bot
33049c868d Update dependency @types/react to v18.3.23
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 6m21s
Check usage of free licenses / build-static-assets (pull_request) Successful in 6m9s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m47s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h6m2s
2025-05-28 02:07:19 +00:00
Renovate Bot
8c51314eda Update dependency @types/node to v22.15.19
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m31s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m21s
Check usage of free licenses / build-static-assets (push) Successful in 46s
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Successful in 7m14s
2025-05-19 02:06:05 +00:00
Renovate Bot
4bab405fae Update dependency node to v23.11.1
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m38s
Add copyright notice / copyright_notice (pull_request) Successful in 4m38s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Failing after 6m53s
Build Nginx-based docker image / build-static-assets (push) Failing after 7m58s
2025-05-15 02:08:00 +00:00
Renovate Bot
31f5051e10 Update pnpm to v10.11.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 1m52s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m10s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 4m57s
Build Nginx-based docker image / build-static-assets (push) Successful in 59m46s
2025-05-14 02:05:10 +00:00
Renovate Bot
d73ac480f4 Update dependency @types/react to v18.3.21
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m46s
Add copyright notice / copyright_notice (pull_request) Successful in 2m40s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 33s
Build Nginx-based docker image / build-static-assets (push) Successful in 14m23s
2025-05-12 02:04:28 +00:00
Renovate Bot
29c4ad410e Update dependency next-auth to v5.0.0-beta.28
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m35s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m43s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m20s
Build Nginx-based docker image / build-static-assets (push) Successful in 17m45s
2025-05-11 02:06:28 +00:00
Renovate Bot
d069d5bb26 Update dependency next to v15.3.2
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 3m57s
Check usage of free licenses / build-static-assets (pull_request) Successful in 5m28s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 5m18s
Build Nginx-based docker image / build-static-assets (push) Successful in 47m31s
2025-05-10 02:07:11 +00:00
Renovate Bot
a03a67234c Update dependency @types/node to v22.15.17
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m40s
Add copyright notice / copyright_notice (pull_request) Successful in 3m47s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 4m13s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h4m55s
2025-05-09 02:05:04 +00:00
593c019fd3 Merge pull request 'Update dependency zod to v3.24.4' (#245) from renovate/zod-3.x-lockfile into main
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 22s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m33s
Reviewed-on: #245
2025-05-05 08:04:59 +00:00
Renovate Bot
c18fbe96bc Update dependency zod to v3.24.4
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 1m16s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m56s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m43s
2025-05-05 02:03:43 +00:00
Renovate Bot
906477030b Update dependency @types/react-dom to v18.3.7
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 6m32s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m43s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 6m53s
Build Nginx-based docker image / build-static-assets (push) Successful in 42m12s
2025-05-01 02:06:46 +00:00
Renovate Bot
eb8a7a7f85 Update pnpm to v10.10.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 6m45s
Check usage of free licenses / build-static-assets (pull_request) Successful in 6m42s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 4m28s
Build Nginx-based docker image / build-static-assets (push) Successful in 52m38s
2025-04-30 02:06:51 +00:00
Renovate Bot
a03b957f39 Update dependency @types/node to v22.15.3
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 1m13s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m8s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 4m35s
Build Nginx-based docker image / build-static-assets (push) Successful in 55m51s
2025-04-29 02:05:26 +00:00
Renovate Bot
b77831fb27 Update dependency primereact to v10.9.5
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 10m46s
Check usage of free licenses / build-static-assets (pull_request) Successful in 8m15s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 2m44s
Build Nginx-based docker image / build-static-assets (push) Failing after 3m58s
2025-04-27 02:07:22 +00:00
Renovate Bot
0e7419ee60 Update dependency @types/node to v22.15.2
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 6m44s
Check usage of free licenses / build-static-assets (pull_request) Successful in 5m57s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 7m8s
Build Nginx-based docker image / build-static-assets (push) Successful in 39m25s
2025-04-26 02:06:20 +00:00
d74f28c18d Merge pull request 'Update dependency next-auth to v5.0.0-beta.27' (#238) from renovate/next-auth-5.x into main
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 36s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m42s
Reviewed-on: #238
2025-04-25 04:58:36 +00:00
f7120d5043 Merge pull request 'Update pnpm to v10' (#198) from renovate/pnpm-10.x into main
Some checks failed
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (push) Has been cancelled
Reviewed-on: #198
2025-04-25 04:58:28 +00:00
2503d0f26b Merge pull request 'Update dependency @types/node to v22.15.0' (#239) from renovate/node-22.x into main
Some checks failed
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (push) Has been cancelled
Reviewed-on: #239
2025-04-25 04:58:11 +00:00
Renovate Bot
bee0abc8d0 Update dependency @types/node to v22.15.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 7m33s
Add copyright notice / copyright_notice (pull_request) Successful in 12m46s
Build Nginx-based docker image / build-static-assets (push) Successful in 37m15s
2025-04-25 02:07:11 +00:00
Renovate Bot
6eec7dd8db Update dependency next-auth to v5.0.0-beta.27
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 8m1s
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 8m56s
Build Nginx-based docker image / build-static-assets (push) Successful in 45m55s
2025-04-25 02:06:57 +00:00
Renovate Bot
676ab5e22d Update pnpm to v10
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m6s
Add copyright notice / copyright_notice (pull_request) Successful in 2m37s
Build Nginx-based docker image / build-static-assets (push) Successful in 13m26s
2025-04-23 02:07:40 +00:00
Renovate Bot
fd8a0d5851 Update dependency @playwright/test to v1.52.0
All checks were successful
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Successful in 31m1s
Check usage of free licenses / build-static-assets (push) Successful in 2m56s
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m20s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m20s
2025-04-22 02:05:41 +00:00
Renovate Bot
a3b321ea4c Update dependency next-auth to v5.0.0-beta.26
All checks were successful
Add copyright notice / copyright_notice (pull_request) Successful in 1m9s
Playwright Tests / test (pull_request) Has been skipped
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Successful in 25m37s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m13s
Check usage of free licenses / build-static-assets (push) Successful in 3m25s
2025-04-21 02:05:35 +00:00
Renovate Bot
547231194e Update dependency zod to v3.24.3
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m31s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m57s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Failing after 52s
Build Nginx-based docker image / build-static-assets (push) Failing after 59s
2025-04-19 02:05:29 +00:00
Renovate Bot
7e87120e6b Update dependency next to v15.3.1
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m37s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m46s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 2m55s
Build Nginx-based docker image / build-static-assets (push) Successful in 34m27s
2025-04-18 02:03:58 +00:00
Renovate Bot
72078f9e92 Update dependency @types/node to v22.14.1
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 4m18s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m35s
Check usage of free licenses / build-static-assets (push) Successful in 2m40s
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Successful in 37m53s
2025-04-12 02:04:37 +00:00
Renovate Bot
03be408a5a Update dependency next to v15.3.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 4m52s
Check usage of free licenses / build-static-assets (pull_request) Successful in 4m52s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 3m4s
Build Nginx-based docker image / build-static-assets (push) Successful in 23m45s
2025-04-10 02:05:02 +00:00
Renovate Bot
334bc4dd60 Update dependency node to v23.11.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 3m39s
Check usage of free licenses / build-static-assets (pull_request) Successful in 4m37s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m25s
Build Nginx-based docker image / build-static-assets (push) Successful in 9m18s
2025-04-06 02:05:29 +00:00
Renovate Bot
479ce993b6 Update dependency typescript to v5.8.3
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m54s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m26s
Check usage of free licenses / build-static-assets (push) Successful in 2m28s
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Successful in 38m57s
2025-04-05 02:05:23 +00:00
Renovate Bot
4f41a84912 Update dependency @types/node to v22.14.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 1m56s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m26s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 3m37s
Build Nginx-based docker image / build-static-assets (push) Successful in 21m58s
2025-04-04 02:06:43 +00:00
Renovate Bot
a920a5017e Update dependency @types/react-dom to v18.3.6
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m46s
Add copyright notice / copyright_notice (pull_request) Successful in 4m34s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 3m25s
Build Nginx-based docker image / build-static-assets (push) Failing after 51m16s
2025-04-03 02:04:58 +00:00
Renovate Bot
9045b04874 Update dependency primereact to v10.9.4
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m22s
Add copyright notice / copyright_notice (pull_request) Successful in 3m29s
Check usage of free licenses / build-static-assets (push) Failing after 39s
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Failing after 17m49s
2025-04-01 02:04:38 +00:00
Renovate Bot
b8d1489115 Update dependency @types/node to v22.13.14
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 4m48s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m20s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 10m35s
Build Nginx-based docker image / build-static-assets (push) Successful in 46m29s
2025-03-28 03:08:59 +00:00
Renovate Bot
a77f8b33de Update dependency next to v15.2.4
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 1m49s
Check usage of free licenses / build-static-assets (pull_request) Successful in 54s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Failing after 8m5s
Build Nginx-based docker image / build-static-assets (push) Failing after 8m16s
2025-03-27 03:06:24 +00:00
Renovate Bot
b3ac60c385 Update dependency @types/react to v18.3.20
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 4m7s
Check usage of free licenses / build-static-assets (pull_request) Successful in 5m16s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 2m33s
Build Nginx-based docker image / build-static-assets (push) Successful in 34m7s
2025-03-26 03:05:57 +00:00
Renovate Bot
c44c2dedd6 Update dependency @types/node to v22.13.13
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 5m5s
Check usage of free licenses / build-static-assets (pull_request) Successful in 6m29s
Check usage of free licenses / build-static-assets (push) Successful in 2m4s
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Successful in 57m45s
2025-03-25 03:05:41 +00:00
Renovate Bot
48b72f0501 Update dependency @types/node to v22.13.11
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 58s
Add copyright notice / copyright_notice (pull_request) Successful in 1m23s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 47s
Build Nginx-based docker image / build-static-assets (push) Successful in 11m58s
2025-03-22 03:04:40 +00:00
Renovate Bot
6cfdf1f93b Update dependency node to v23.10.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 5m30s
Check usage of free licenses / build-static-assets (pull_request) Successful in 5m44s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 3m12s
Build Nginx-based docker image / build-static-assets (push) Successful in 15m31s
2025-03-21 03:05:28 +00:00
Renovate Bot
0e17a2ac22 Update dependency @types/react to v18.3.19
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m45s
Add copyright notice / copyright_notice (pull_request) Successful in 2m51s
Check usage of free licenses / build-static-assets (push) Successful in 3m4s
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Successful in 43m1s
2025-03-20 03:04:45 +00:00
Renovate Bot
f512872f16 Update dependency next to v15.2.3
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m28s
Add copyright notice / copyright_notice (pull_request) Successful in 3m39s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m56s
Build Nginx-based docker image / build-static-assets (push) Successful in 29m46s
2025-03-19 03:04:25 +00:00
Renovate Bot
6cde7a9023 Update dependency @playwright/test to v1.51.1
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m54s
Check usage of free licenses / build-static-assets (pull_request) Successful in 4m7s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 4m48s
Build Nginx-based docker image / build-static-assets (push) Successful in 20m55s
2025-03-18 03:04:57 +00:00
Renovate Bot
f5cdb559cf Update pnpm to v9.15.9
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m24s
Add copyright notice / copyright_notice (pull_request) Successful in 5m41s
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Failing after 48s
Check usage of free licenses / build-static-assets (push) Successful in 2m32s
2025-03-14 03:08:04 +00:00
Renovate Bot
e7dea7bf94 Update dependency primereact to v10.9.3
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 4m44s
Add copyright notice / copyright_notice (pull_request) Successful in 6m57s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m58s
Build Nginx-based docker image / build-static-assets (push) Successful in 40m5s
2025-03-13 03:07:37 +00:00
Renovate Bot
63a258c39d Update dependency next to v15.2.2
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 6m7s
Add copyright notice / copyright_notice (pull_request) Successful in 8m11s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Failing after 7m58s
Build Nginx-based docker image / build-static-assets (push) Successful in 56m59s
2025-03-12 03:06:52 +00:00
Renovate Bot
ce46cd9b25 Update dependency @types/node to v22.13.10
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 4m10s
Add copyright notice / copyright_notice (pull_request) Successful in 5m19s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 9m36s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h4m21s
2025-03-11 03:06:08 +00:00
Renovate Bot
6dd213709e Update dependency autoprefixer to v10.4.21
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m14s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m55s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 3m51s
Build Nginx-based docker image / build-static-assets (push) Successful in 44m14s
2025-03-09 16:44:26 +00:00
9d90f4b073 Merge pull request 'Update dependency @playwright/test to v1.51.0' (#212) from renovate/playwright-test-1.x-lockfile into main
Some checks failed
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Failing after 2m8s
Check usage of free licenses / build-static-assets (push) Successful in 18m21s
Reviewed-on: #212
2025-03-09 00:24:50 +00:00
Renovate Bot
7eb5ff8392 Update dependency @playwright/test to v1.51.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m58s
Add copyright notice / copyright_notice (pull_request) Successful in 2m53s
Build Nginx-based docker image / build-static-assets (push) Successful in 14m38s
2025-03-08 03:04:29 +00:00
Renovate Bot
73b42d4850 Update pnpm to v9.15.7
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m41s
Add copyright notice / copyright_notice (pull_request) Successful in 2m12s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m42s
Build Nginx-based docker image / build-static-assets (push) Successful in 21m27s
2025-03-07 03:06:20 +00:00
Renovate Bot
aae8e2191d Update dependency node to v23.9.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m49s
Add copyright notice / copyright_notice (pull_request) Successful in 2m42s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m38s
Build Nginx-based docker image / build-static-assets (push) Successful in 20m38s
2025-03-06 03:10:40 +00:00
Renovate Bot
54b7e118f8 Update dependency next to v15.2.1
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 3m18s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m13s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m51s
Build Nginx-based docker image / build-static-assets (push) Successful in 32m47s
2025-03-05 03:08:39 +00:00
Renovate Bot
17e1869c9f Update dependency @types/node to v22.13.9
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m12s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m41s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 5m0s
Build Nginx-based docker image / build-static-assets (push) Successful in 45m2s
2025-03-04 03:07:14 +00:00
Renovate Bot
31f480c74e Update pnpm to v9.15.6
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 7m8s
Add copyright notice / copyright_notice (pull_request) Successful in 8m14s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m56s
Build Nginx-based docker image / build-static-assets (push) Successful in 46m26s
2025-03-03 03:08:58 +00:00
Renovate Bot
4c03b428b4 Update dependency postcss to v8.5.3
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 8m6s
Add copyright notice / copyright_notice (pull_request) Successful in 11m31s
Build Nginx-based docker image / build-static-assets (push) Failing after 41s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 6m57s
2025-03-02 03:08:04 +00:00
Renovate Bot
cda483d6f7 Update dependency typescript to v5.8.2
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 4m2s
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m50s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 8m47s
Build Nginx-based docker image / build-static-assets (push) Successful in 1h5m6s
2025-03-01 03:08:48 +00:00
Renovate Bot
cffb4e1c4a Update dependency uuid to v11.1.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m54s
Add copyright notice / copyright_notice (pull_request) Successful in 8m17s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 8m8s
Build Nginx-based docker image / build-static-assets (push) Successful in 58m12s
2025-02-20 03:12:42 +00:00
Renovate Bot
fa904b5de2 Update dependency node to v23.8.0
All checks were successful
Check usage of free licenses / build-static-assets (push) Successful in 3m21s
Build Nginx-based docker image / build-static-assets (push) Successful in 43m12s
Playwright Tests / test (push) Has been skipped
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m53s
Add copyright notice / copyright_notice (pull_request) Successful in 4m55s
2025-02-19 03:11:38 +00:00
Renovate Bot
cff2c5ddc2 Update pnpm to v9.15.5
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 6m2s
Check usage of free licenses / build-static-assets (pull_request) Successful in 5m9s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 7m43s
Build Nginx-based docker image / build-static-assets (push) Successful in 51m39s
2025-02-18 03:11:39 +00:00
Renovate Bot
6ed957c4e5 Update dependency zod to v3.24.2
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 4m48s
Check usage of free licenses / build-static-assets (pull_request) Successful in 4m48s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 3m56s
Build Nginx-based docker image / build-static-assets (push) Failing after 29m13s
2025-02-17 03:12:57 +00:00
Renovate Bot
38d75ce80d Update dependency @types/node to v22.13.4
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m18s
Add copyright notice / copyright_notice (pull_request) Successful in 4m52s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 2m20s
Build Nginx-based docker image / build-static-assets (push) Failing after 17m35s
2025-02-16 03:13:18 +00:00
Renovate Bot
61077bb11e Update dependency next to v15.1.7
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m53s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m27s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 39s
Build Nginx-based docker image / build-static-assets (push) Failing after 5m21s
2025-02-12 03:08:42 +00:00
Renovate Bot
95e4949e1d Update dependency postcss to v8.5.2
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m29s
Add copyright notice / copyright_notice (pull_request) Successful in 2m12s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 3m16s
Build Nginx-based docker image / build-static-assets (push) Failing after 6m10s
2025-02-11 03:05:44 +00:00
Renovate Bot
c77a1cfbba Update dependency @types/node to v22.13.1
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 2m0s
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m12s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 3m11s
Build Nginx-based docker image / build-static-assets (push) Failing after 45m29s
2025-02-04 03:06:50 +00:00
Renovate Bot
dc499893b3 Update dependency @types/node to v22.13.0
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 5m57s
Add copyright notice / copyright_notice (pull_request) Successful in 6m51s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m12s
Build Nginx-based docker image / build-static-assets (push) Failing after 3m28s
2025-02-02 03:08:54 +00:00
Renovate Bot
c835744663 Update dependency @playwright/test to v1.50.1
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m25s
Add copyright notice / copyright_notice (pull_request) Successful in 2m29s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 6m18s
Build Nginx-based docker image / build-static-assets (push) Failing after 30m57s
2025-02-01 03:06:39 +00:00
Renovate Bot
3892e5c885 Update dependency node to v23.7.0
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 57s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m14s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m46s
Build Nginx-based docker image / build-static-assets (push) Failing after 19m8s
2025-01-31 03:03:44 +00:00
Renovate Bot
d8bc79e755 Update dependency @types/node to v22.12.0
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 3m59s
Add copyright notice / copyright_notice (pull_request) Successful in 4m52s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 5m54s
Build Nginx-based docker image / build-static-assets (push) Successful in 28m14s
2025-01-28 03:07:42 +00:00
Renovate Bot
4b219e922d Update dependency primereact to v10.9.2
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m49s
Add copyright notice / copyright_notice (pull_request) Successful in 4m0s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 3m47s
Build Nginx-based docker image / build-static-assets (push) Failing after 40m5s
2025-01-27 03:05:52 +00:00
9a2ce5b654 Merge pull request 'Simulations life cycle improvements' (#191) from mark-expired-simulations into main
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 19s
Build Nginx-based docker image / build-static-assets (push) Successful in 3m47s
Reviewed-on: #191
2025-01-26 13:07:58 +00:00
0d1c46a349 Fix redundant class definitions
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 1m27s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m53s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m0s
2025-01-26 13:47:17 +01:00
157401bae5 Display a toast message after successfully creating a simulation
All checks were successful
Build Nginx-based docker image / build-static-assets (push) Successful in 2m52s
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 25s
Check usage of free licenses / build-static-assets (pull_request) Successful in 49s
2025-01-26 13:33:35 +01:00
bf7e871a1b Display a button to create new simulations 2025-01-26 13:21:23 +01:00
e597b4fc00 Mark expired rows with red background 2025-01-26 13:09:31 +01:00
53a2752964 Remove references to unsupported dark theme 2025-01-26 13:06:29 +01:00
1184a529cf Display an icon indicating whether a simulation is still valid 2025-01-26 13:05:32 +01:00
Renovate Bot
58962e2f48 Update dependency next to v15.1.6
Some checks failed
Add copyright notice / copyright_notice (pull_request) Successful in 5m33s
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 6m4s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 2m5s
Build Nginx-based docker image / build-static-assets (push) Failing after 2m56s
2025-01-25 03:10:32 +00:00
Renovate Bot
b8f878a77a Update dependency @playwright/test to v1.50.0
Some checks failed
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Failing after 4m47s
Check usage of free licenses / build-static-assets (push) Successful in 5m28s
2025-01-24 03:58:22 +00:00
Renovate Bot
2c28b80e23 Update dependency @types/node to v22.10.10
Some checks failed
Add copyright notice / copyright_notice (pull_request) Successful in 1m45s
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m30s
Check usage of free licenses / build-static-assets (push) Successful in 7m10s
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
2025-01-24 03:07:25 +00:00
Renovate Bot
2b550aa60c Update dependency node to v23.6.1
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Add copyright notice / copyright_notice (pull_request) Successful in 1m59s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m45s
Check usage of free licenses / build-static-assets (push) Failing after 8s
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Failing after 26s
2025-01-22 03:04:42 +00:00
Renovate Bot
c691359356 Update dependency postcss to v8.5.1
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m50s
Build Nginx-based docker image / build-static-assets (push) Successful in 30m20s
2025-01-16 04:07:16 +00:00
Renovate Bot
4e5202bdba Update dependency @types/node to v22.10.7
Some checks failed
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Add copyright notice / copyright_notice (pull_request) Successful in 2m22s
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m36s
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 4m51s
2025-01-16 03:07:47 +00:00
Renovate Bot
cdf688e8af Update pnpm to v9.15.4
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 50s
Build Nginx-based docker image / build-static-assets (push) Successful in 10m18s
2025-01-14 03:21:43 +00:00
Renovate Bot
46a686f578 Update dependency @types/node to v22.10.6
Some checks failed
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 2m51s
Add copyright notice / copyright_notice (pull_request) Successful in 6m1s
Playwright Tests / test (push) Has been skipped
Build Nginx-based docker image / build-static-assets (push) Has been cancelled
Check usage of free licenses / build-static-assets (push) Has been cancelled
2025-01-14 03:05:07 +00:00
5c2249621d Merge pull request 'Update copyright assignment to cover 2025 and include all contributors' (#180) from copyright-2025 into main
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m15s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m34s
Reviewed-on: #180
2025-01-13 20:43:00 +00:00
501bb3a81a Update copyright assignment to cover 2025 and include all contributors
All checks were successful
Playwright Tests / test (pull_request) Has been skipped
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m12s
Add copyright notice / copyright_notice (pull_request) Successful in 1m32s
Build Nginx-based docker image / build-static-assets (push) Successful in 6m2s
2025-01-13 21:36:52 +01:00
69f6fcbebe Merge pull request 'Define a button to reset the affinities of all groups' (#179) from reset-all-affinities into main
All checks were successful
Playwright Tests / test (push) Has been skipped
Check usage of free licenses / build-static-assets (push) Successful in 1m28s
Build Nginx-based docker image / build-static-assets (push) Successful in 5m40s
Reviewed-on: #179
2025-01-13 20:31:56 +00:00
ff2a1ccf7f Restore execution of playwright tests
Some checks failed
Add copyright notice / copyright_notice (pull_request) Successful in 31s
Check usage of free licenses / build-static-assets (pull_request) Successful in 1m11s
Playwright Tests / test (pull_request) Failing after 8m21s
2024-12-02 08:14:36 +01:00
68 changed files with 2326 additions and 925 deletions

View File

@ -16,7 +16,7 @@ jobs:
ref: ${{ github.head_ref }} ref: ${{ github.head_ref }}
- uses: VinnyBabuManjaly/copyright-action@v1.0.0 - uses: VinnyBabuManjaly/copyright-action@v1.0.0
with: with:
CopyrightString: '/* Copyright (C) 2024 Manuel Bustillo*/\n\n' CopyrightString: '/* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/\n\n'
FileType: '.tsx, .jsx, .ts' FileType: '.tsx, .jsx, .ts'
Path: 'app/, config/, db/' Path: 'app/, config/, db/'
IgnorePath: 'testfolder1/a/, testfolder3' IgnorePath: 'testfolder1/a/, testfolder3'

View File

@ -9,7 +9,6 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
test: test:
if: false
timeout-minutes: 60 timeout-minutes: 60
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: container:
@ -18,14 +17,19 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: lts/* node-version-file: .nvmrc
- name: Install dependencies - name: Install dependencies
run: npm install -g pnpm && pnpm install run: npm install -g pnpm && pnpm install
- name: Build the service that will be tested - name: Build the service that will be tested
run: npm run build run: |
pnpm run build
cp -r public .next/standalone/
cp -r .next/static .next/standalone/.next/
- name: Install Playwright Browsers - name: Install Playwright Browsers
run: pnpm exec playwright install --with-deps run: pnpm exec playwright install --with-deps
- name: Run the service that will be tested - name: Run the service that will be tested
run: npm run start & run: HOSTNAME=127.0.0.1 node .next/standalone/server.js &
- name: Wait for the service to be ready
run: npx wait-on http://127.0.0.1:3000/default/ --timeout 30000
- name: Run Playwright tests - name: Run Playwright tests
run: pnpm exec playwright test run: pnpm exec playwright test

2
.nvmrc
View File

@ -1 +1 @@
23.6.0 24.3.0

View File

@ -1,6 +1,6 @@
# Based on https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile # Based on https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile
FROM node:23-alpine AS base FROM node:24-alpine AS base
# Install dependencies only when needed # Install dependencies only when needed
FROM base AS deps FROM base AS deps

View File

@ -1,6 +1,6 @@
# Based on https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile # Based on https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile
FROM node:23-alpine AS base FROM node:24-alpine AS base
# Install dependencies only when needed # Install dependencies only when needed
FROM base AS deps FROM base AS deps

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client' 'use client'

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
@ -14,46 +14,97 @@ import GroupsTable from '@/app/ui/groups/table';
import SkeletonTable from '@/app/ui/guests/skeleton-row'; import SkeletonTable from '@/app/ui/guests/skeleton-row';
import GuestsTable from '@/app/ui/guests/table'; import GuestsTable from '@/app/ui/guests/table';
import { TabPanel, TabView } from 'primereact/tabview'; import { TabPanel, TabView } from 'primereact/tabview';
import { Suspense, useState } from 'react'; import { Toast } from 'primereact/toast';
import { Suspense, useEffect, useRef, useState } from 'react';
import InvitationsBoard from '@/app/ui/invitations/board';
import { Invitation, InvitationSerializer } from '@/app/lib/invitation';
import { Entity } from '@/app/lib/definitions';
export default function Page() { export default function Page() {
const [slug, setSlug] = useState<string>("default");
useEffect(() => {
setSlug(getSlug());
refreshGroups();
refreshGuests();
refreshInvitations();
}, []);
const toast = useRef<Toast>(null);
function refreshGuests() { function refreshGuests() {
new AbstractApi<Guest>().getAll(new GuestSerializer(), (objects: Guest[]) => { new AbstractApi<Guest>().getAll(new GuestSerializer(), (objects: Guest[]) => {
setGuests(objects); setGuests(objects);
setGuestsLoaded(true);
}); });
} }
function refreshGroups() { function refreshGroups() {
new AbstractApi<Group>().getAll(new GroupSerializer(), (objects: Group[]) => { new AbstractApi<Group>().getAll(new GroupSerializer(), (objects: Group[]) => {
setGroups(objects); setGroups(objects);
setGroupsLoaded(true); });
}
function refreshInvitations() {
new AbstractApi<Invitation>().getAll(new InvitationSerializer(), (objects: Invitation[]) => {
setInvitations(objects);
}); });
} }
function resetAffinities() { function resetAffinities() {
fetch(`/api/${getSlug()}/groups/affinities/reset`, { fetch(`/api/${slug}/groups/affinities/reset`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Accept': 'application/json', 'Accept': 'application/json',
'X-CSRF-TOKEN': getCsrfToken(), 'X-CSRF-TOKEN': getCsrfToken(),
} }
}) })
.then(response => {
if (response.ok) {
showAffinitiesResetSuccess();
} else {
console.error('Failed to reset affinities');
}
})
.catch(error => {
console.error('Error resetting affinities:', error);
});
}
function showAffinitiesResetSuccess() {
toast.current?.show({
severity: 'success',
summary: 'Affinities reset',
detail: 'All affinities have been reset to default values.'
});
} }
const [groupsLoaded, setGroupsLoaded] = useState(false);
const [groups, setGroups] = useState<Array<Group>>([]); const [groups, setGroups] = useState<Array<Group>>([]);
const [groupBeingEdited, setGroupBeingEdited] = useState<Group | undefined>(undefined); const [groupBeingEdited, setGroupBeingEdited] = useState<Group | undefined>(undefined);
const [groupAffinitiesBeingEditted, setGroupAffinitiesBeingEditted] = useState<Group | undefined>(undefined); const [groupAffinitiesBeingEditted, setGroupAffinitiesBeingEditted] = useState<Group | undefined>(undefined);
const [guestsLoaded, setGuestsLoaded] = useState(false);
const [guests, setGuests] = useState<Array<Guest>>([]); const [guests, setGuests] = useState<Array<Guest>>([]);
const [guestBeingEdited, setGuestBeingEdited] = useState<Guest | undefined>(undefined); const [guestBeingEdited, setGuestBeingEdited] = useState<Guest | undefined>(undefined);
!groupsLoaded && refreshGroups(); const [invitations, setInvitations] = useState<Array<Invitation>>([]);
!guestsLoaded && refreshGuests();
function updateList<T extends Entity>(originalList: T[], element: T): T[] {
{
const index = originalList.findIndex(g => g.id === element?.id);
if (index !== -1) {
// Replace existing element
return [
element!,
...originalList.slice(0, index),
...originalList.slice(index + 1)
];
} else {
// Add new element at the start
return [element!, ...originalList];
}
}
}
return ( return (
<div className="w-full"> <div className="w-full">
@ -64,7 +115,10 @@ export default function Page() {
<GuestFormDialog <GuestFormDialog
key={guestBeingEdited?.id} key={guestBeingEdited?.id}
groups={groups} groups={groups}
onCreate={() => { refreshGuests(); setGuestBeingEdited(undefined) }} onCreate={(newGuest) => {
setGuests(guests => updateList(guests, newGuest));
setGuestBeingEdited(undefined);
}}
guest={guestBeingEdited} guest={guestBeingEdited}
visible={guestBeingEdited !== undefined} visible={guestBeingEdited !== undefined}
onHide={() => { setGuestBeingEdited(undefined) }} onHide={() => { setGuestBeingEdited(undefined) }}
@ -82,6 +136,7 @@ export default function Page() {
<div className="flex flex-col w-full items-center justify-between"> <div className="flex flex-col w-full items-center justify-between">
<div> <div>
<Toast ref={toast} />
<button onClick={() => setGroupBeingEdited({})} className={classNames('primary')}>Add new</button> <button onClick={() => setGroupBeingEdited({})} className={classNames('primary')}>Add new</button>
<button onClick={resetAffinities} className={classNames('yellow')}>Reset affinities</button> <button onClick={resetAffinities} className={classNames('yellow')}>Reset affinities</button>
</div> </div>
@ -89,7 +144,10 @@ export default function Page() {
<GroupFormDialog <GroupFormDialog
key={groupBeingEdited?.id} key={groupBeingEdited?.id}
groups={groups} groups={groups}
onCreate={() => { refreshGroups(); setGroupBeingEdited(undefined) }} onCreate={(newGroup) => {
setGroups(groups => updateList(groups, newGroup));
setGroupBeingEdited(undefined)
}}
group={groupBeingEdited} group={groupBeingEdited}
visible={groupBeingEdited !== undefined} visible={groupBeingEdited !== undefined}
onHide={() => { setGroupBeingEdited(undefined) }} onHide={() => { setGroupBeingEdited(undefined) }}
@ -112,6 +170,9 @@ export default function Page() {
</Suspense> </Suspense>
</div> </div>
</ TabPanel> </ TabPanel>
<TabPanel header="Invitations" leftIcon="pi pi-envelope mx-2">
<InvitationsBoard guests={guests} invitations={invitations} />
</TabPanel>
</ TabView> </ TabView>
</div> </div>

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import SideNav from '@/app/ui/dashboard/sidenav'; import SideNav from '@/app/ui/dashboard/sidenav';

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client' 'use client'

View File

@ -1,16 +1,42 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
import { AbstractApi } from '@/app/api/abstract-api';
import { TableSimulation, TableSimulationSerializer } from '@/app/lib/tableSimulation';
import Arrangement from '@/app/ui/arrangements/arrangement'; import Arrangement from '@/app/ui/arrangements/arrangement';
import React, { useState } from 'react';
import ArrangementsTable from '@/app/ui/arrangements/arrangements-table'; import ArrangementsTable from '@/app/ui/arrangements/arrangements-table';
import { classNames } from '@/app/ui/components/button';
import { Toast } from 'primereact/toast';
import React, { useRef, useState } from 'react';
export default function Page() { export default function Page() {
const toast = useRef<Toast>(null);
const show = () => {
toast.current?.show({
severity: 'success',
summary: 'Simulation created',
detail: 'Table distributions will be calculated shortly, please come back in some minutes'
});
};
const [currentArrangement, setCurrentArrangement] = useState<string | null>(null); const [currentArrangement, setCurrentArrangement] = useState<string | null>(null);
function createSimulation() {
const api = new AbstractApi<TableSimulation>();
const serializer = new TableSimulationSerializer();
api.create(serializer, new TableSimulation(), show);
}
return ( return (
<> <>
<div className="flex flex-col w-full items-center justify-between">
<Toast ref={toast} />
<button onClick={createSimulation} className={classNames('primary')}>Add new</button>
</div>
<ArrangementsTable onArrangementSelected={setCurrentArrangement} /> <ArrangementsTable onArrangementSelected={setCurrentArrangement} />
{currentArrangement && <Arrangement key={currentArrangement} id={currentArrangement} />} {currentArrangement && <Arrangement key={currentArrangement} id={currentArrangement} />}
</> </>

View File

@ -0,0 +1,65 @@
/* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'
import { AbstractApi } from '@/app/api/abstract-api';
import { getSlug } from '@/app/lib/utils';
import { Website, WebsiteSerializer } from '@/app/lib/website';
import { useEffect, useState } from 'react';
import Tiptap from '../../../components/Tiptap';
export default function Page() {
const [website, setWebsite] = useState<Website>()
const api = new AbstractApi<Website>();
const serializer = new WebsiteSerializer();
const [slug, setSlug] = useState<string>("default");
useEffect(() => { setSlug(getSlug()) }, []);
const [iframeKey, setIframeKey] = useState<number>(Math.random());
const [timeoutId, setTimeoutId] = useState<NodeJS.Timeout | null>(null);
useEffect(() => {
api.get(serializer, undefined, (loadedWebsite) => {
setWebsite(loadedWebsite);
});
}, []);
const updateWebsite = (newContent: string) => {
// Debounce API update: send after 500ms of no further changes
if (timeoutId) {
clearTimeout(timeoutId);
}
setTimeoutId(
setTimeout(() => {
api.update(serializer, new Website('', newContent), () => {
setIframeKey(Math.random()); // Change key to force iframe reload
});
}, 500)
);
}
return (
<div className="flex">
<div className="w-1/2 border rounded-lg p-4">
<Tiptap
key={website?.content ?? 'empty'}
content={website?.content || ''}
onUpdate={updateWebsite}
/>
</div>
<div className="w-1/2 border rounded-lg p-4 ml-4">
<iframe
key={iframeKey}
src={`/${slug}/site`}
title="Website Preview"
className="w-full h-[80vh] rounded"
/>
</div>
</div>
);
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
@ -16,11 +16,11 @@ export default async function Page() {
if (getCsrfToken() == 'unknown') { if (getCsrfToken() == 'unknown') {
retrieveCSRFToken(); retrieveCSRFToken();
} }
}, []);
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
localStorage.setItem('slug', await params.slug); localStorage.setItem('slug', params.slug);
} }
}, []);
return ( return (
<main className="flex min-h-screen flex-col p-6"> <main className="flex min-h-screen flex-col p-6">

View File

@ -0,0 +1,119 @@
/* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'
import { AbstractApi } from "@/app/api/abstract-api";
import { Invitation, InvitationSerializer } from "@/app/lib/invitation";
import { useParams } from "next/navigation";
import { useEffect, useState } from "react";
import { FloatLabel } from "primereact/floatlabel";
import { Dropdown } from "primereact/dropdown";
import { Guest, GuestSerializer, GuestStatus } from "@/app/lib/guest";
import { Button } from "primereact/button";
type FormResponse = {
attendance: GuestStatus;
};
function GuestForm({ guest, idx }: { guest: Guest, idx: number }) {
const [response, setResponse] = useState<FormResponse>({
attendance: guest.status!
});
const [pendingChanges, setPendingChanges] = useState(false);
const [sending, setSending] = useState(false);
console.log('GuestForm response', response.attendance);
const attendanceOptions: { name: string, code: GuestStatus }[] = [
{
name: 'Attending',
code: 'confirmed'
},
{
name: 'Declined',
code: 'declined'
},
{
name: 'Tentative',
code: 'tentative'
}
];
const api = new AbstractApi<Guest>();
const serializer = new GuestSerializer();
const submitForm = () => {
setSending(true);
setPendingChanges(false);
api.update(serializer, {
id: guest.id!,
status: response.attendance,
}, () => setSending(false));
}
return (
<div
key={guest.id}
className={`px-2 py-6 flex flex-col items-center ${idx !== 0 ? 'border-t border-gray-300' : ''}`}
>
<h2 className="m-2 text-xl font-semibold">{guest.name}</h2>
<Dropdown
value={response.attendance}
options={attendanceOptions}
optionLabel="name"
optionValue="code"
className="rounded-md w-full max-w-xs border border-gray-300"
checkmark={true}
highlightOnSelect={false}
onChange={(e) => {
setPendingChanges(true);
setResponse({ ...response, attendance: e.value })
}}
/>
<Button
label="Save"
icon="pi pi-save"
loading={sending}
onClick={submitForm}
disabled={!pendingChanges || sending}
className="mt-4 max-w-xs"
/>
</div>
)
}
export default function Page() {
const params = useParams<{ slug: string, id: string }>()
const [invitation, setInvitation] = useState<Invitation>();
useEffect(() => {
localStorage.setItem('slug', params.slug);
const api = new AbstractApi<Invitation>();
const serializer = new InvitationSerializer();
api.get(serializer, params.id, (invitation: Invitation) => {
setInvitation(invitation);
});
}, []);
return (
<div className="flex flex-col items-center">
<h1 className="text-2xl font-bold mb-4">Invitation</h1>
{invitation ? (
<div>
<p>We have reserved {invitation.guests.length} seats in your honor. Please, confirm attendance submitting the following form:</p>
{invitation.guests.map((guest, idx) => (
<GuestForm key={guest.id} guest={guest} idx={idx} />
))}
</div>
) : (
<p>Loading...</p>
)}
</div>
);
}

View File

@ -0,0 +1,41 @@
/* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import SideNav from '@/app/ui/dashboard/sidenav';
import Image from 'next/image';
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<div className="flex h-screen flex-col">
<div className="w-full lg:h-72 h-36 relative">
<Image
src="/header.png"
alt="Header"
fill
style={{ objectFit: 'cover', objectPosition: 'center', zIndex: 0 }}
priority
/>
</div>
<div className="flex-grow flex items-center justify-center lg:p-24 py-8 bg-[#e1d5c7] relative">
<div className="absolute left-1/2 lg:top-24 top-8 z-10 -translate-x-1/2 -translate-y-1/2 flex justify-center w-full pointer-events-none w-12 h-12 lg:w-24 lg:h-24">
<Image
src="/stamp.png"
alt="Stamp"
width={120}
height={120}
className="object-contain"
priority
/>
</div>
<div className="max-w-4xl w-full h-full bg-[#f9f9f7] shadow-lg">
<div
className="max-w-4xl lg:m-6 m-3 lg:px-6 px-3 lg:py-24 py-2 border-2 border-[#d3d3d1] rounded-xl text-[#958971] flex justify-center"
style={{ height: 'calc(100% - 3rem)' }}
>
{children}
</div>
</div>
</div>
</div>
);
}

34
app/[slug]/site/page.tsx Normal file
View File

@ -0,0 +1,34 @@
/* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'
import { AbstractApi } from '@/app/api/abstract-api';
import { Website, WebsiteSerializer } from '@/app/lib/website';
import { useState, useEffect } from 'react';
import DOMPurify from "dompurify";
import { useParams } from 'next/navigation';
export default function Page() {
const params = useParams<{ slug: string }>()
useEffect(() => {
if (typeof window !== 'undefined') {
localStorage.setItem('slug', params.slug);
}
}, []);
const [websiteContent, setWebsiteContent] = useState<string>("");
const api = new AbstractApi<Website>();
const serializer = new WebsiteSerializer();
useEffect(() => {
api.get(serializer, undefined, (loadedWebsite) => {
setWebsiteContent(loadedWebsite.content || "");
});
}, []);
return (
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(websiteContent) }} />
);
}

View File

@ -1,12 +1,13 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { Entity } from '@/app/lib/definitions'; import { Entity } from '@/app/lib/definitions';
import { getCsrfToken, getSlug } from '@/app/lib/utils'; import { getCsrfToken, getSlug } from '@/app/lib/utils';
export interface Api<T extends Entity> { export interface Api<T extends Entity> {
getAll(serializable: Serializable<T> ,callback: (objets: T[]) => void): void; getAll(serializable: Serializable<T>, callback: (objets: T[]) => void): void;
get(serializable: Serializable<T>, id: string, callback: (object: T) => void): void; get(serializable: Serializable<T>, id: string, callback: (object: T) => void): void;
create(serializable: Serializable<T>, object: T, callback: () => void): void; create(serializable: Serializable<T>, object: T, callback: (object: T) => void): void;
update(serializable: Serializable<T>, object: T, callback: () => void): void; update(serializable: Serializable<T>, object: T, callback: () => void): void;
destroy(serializable: Serializable<T>, object: T, callback: () => void): void; destroy(serializable: Serializable<T>, object: T, callback: () => void): void;
} }
@ -30,8 +31,21 @@ export class AbstractApi<T extends Entity> implements Api<T> {
}); });
} }
get(serializable: Serializable<T>, id: string, callback: (object: T) => void): void { getAllPdf(serializable: Serializable<T>, callback: () => void): void {
fetch(`/api/${getSlug()}/${serializable.apiPath()}/${id}`) fetch(`/api/${getSlug()}/${serializable.apiPath()}`, {
headers: {
'Accept': 'application/pdf',
}
}).then(res => res.blob())
.then(blob => {
var file = window.URL.createObjectURL(blob);
window.location.assign(file);
});
}
get(serializable: Serializable<T>, id: (string | undefined), callback: (object: T) => void): void {
const endpoint = id ? `/api/${getSlug()}/${serializable.apiPath()}/${id}` : `/api/${getSlug()}/${serializable.apiPath()}`;
fetch(endpoint)
.then((response) => response.json()) .then((response) => response.json())
.then((data) => { .then((data) => {
callback(serializable.fromJson(data)); callback(serializable.fromJson(data));
@ -40,27 +54,38 @@ export class AbstractApi<T extends Entity> implements Api<T> {
}); });
} }
update(serializable: Serializable<T>, object: T, callback: () => void): void { update(serializable: Serializable<T>, object: T, callback: (updatedObject: T) => void): void {
fetch(`/api/${getSlug()}/${serializable.apiPath()}/${object.id}`, { const endpoint = object.id ? `/api/${getSlug()}/${serializable.apiPath()}/${object.id}` : `/api/${getSlug()}/${serializable.apiPath()}`;
fetch(endpoint, {
method: 'PUT', method: 'PUT',
body: serializable.toJson(object), body: serializable.toJson(object),
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Accept': 'application/json',
'X-CSRF-TOKEN': getCsrfToken(), 'X-CSRF-TOKEN': getCsrfToken(),
} }
}).then(callback) }).then((response) => response.json())
.then((data) => {
callback(serializable.fromJson(data));
})
.catch((error) => console.error(error)); .catch((error) => console.error(error));
} }
create(serializable: Serializable<T>, object: T, callback: () => void): void { create(serializable: Serializable<T>, object: T, callback: (createdObject: T) => void): void {
fetch(`/api/${getSlug()}/${serializable.apiPath()}`, { fetch(`/api/${getSlug()}/${serializable.apiPath()}`, {
method: 'POST', method: 'POST',
body: serializable.toJson(object), body: serializable.toJson(object),
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Accept': 'application/json',
'X-CSRF-TOKEN': getCsrfToken(), 'X-CSRF-TOKEN': getCsrfToken(),
} }
}).then(callback) })
.then((response) => response.json())
.then((data) => {
callback(serializable.fromJson(data));
})
.catch((error) => console.error(error)); .catch((error) => console.error(error));
} }

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { asArray, getCsrfToken, getSlug } from '@/app/lib/utils'; import { asArray, getCsrfToken, getSlug } from '@/app/lib/utils';
import { Captcha, StructuredErrors, User } from '@/app/lib/definitions'; import { Captcha, StructuredErrors, User } from '@/app/lib/definitions';

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { data } from "autoprefixer"; import { data } from "autoprefixer";
import { getCsrfToken } from "../lib/utils"; import { getCsrfToken } from "../lib/utils";

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { TableArrangement } from '@/app/lib/definitions'; import { TableArrangement } from '@/app/lib/definitions';
import { getSlug } from '../lib/utils'; import { getSlug } from '../lib/utils';
@ -12,6 +12,7 @@ export function loadTableSimulations(onLoad?: (tableSimulations: TableArrangemen
id: record.id, id: record.id,
name: record.name, name: record.name,
discomfort: record.discomfort, discomfort: record.discomfort,
valid: record.valid,
}); });
})); }));
}, (error) => { }, (error) => {

22
app/components/Tiptap.tsx Normal file
View File

@ -0,0 +1,22 @@
/* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'
import { useEditor, EditorContent } from '@tiptap/react'
import StarterKit from '@tiptap/starter-kit'
const Tiptap = ({ content, onUpdate }: { content: string, onUpdate: (newContent:string) => void }) => {
const editor = useEditor({
extensions: [StarterKit],
content: content || '<p>Type something here...</p>',
onUpdate({ editor }) {
onUpdate(editor.getHTML());
},
immediatelyRender: false,
})
return <EditorContent editor={editor} />
}
export default Tiptap

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import '@/app/ui/global.css' import '@/app/ui/global.css'

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
export class Affinities { export class Affinities {
[key:string]: number; [key:string]: number;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { AttendanceSummary } from "./group"; import { AttendanceSummary } from "./group";
import { Guest } from "./guest"; import { Guest } from "./guest";
@ -12,7 +12,8 @@ export type TableArrangement = {
number: number; number: number;
name: string; name: string;
guests?: Guest[]; guests?: Guest[];
discomfort?: number discomfort?: number;
valid?: boolean;
} }
export type User = { export type User = {

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { Serializable } from "../api/abstract-api"; import { Serializable } from "../api/abstract-api";
import { Entity } from "./definitions"; import { Entity } from "./definitions";

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { Entity } from "./definitions"; import { Entity } from "./definitions";

View File

@ -1,7 +1,8 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { Serializable } from "../api/abstract-api"; import { Serializable } from "../api/abstract-api";
import { Entity } from "./definitions"; import { Entity } from "./definitions";
import { Group } from "./group";
export const guestStatuses = ['considered', 'invited', 'confirmed', 'declined', 'tentative'] as const; export const guestStatuses = ['considered', 'invited', 'confirmed', 'declined', 'tentative'] as const;
export type GuestStatus = typeof guestStatuses[number]; export type GuestStatus = typeof guestStatuses[number];
@ -9,30 +10,28 @@ export type GuestStatus = typeof guestStatuses[number];
export class Guest implements Entity { export class Guest implements Entity {
id?: string; id?: string;
name?: string; name?: string;
group_name?: string;
groupId?: string;
color?: string; color?: string;
status?: GuestStatus; status?: GuestStatus;
children?: Guest[]; children?: Guest[];
group?: Group;
constructor(id?: string, name?: string, group_name?: string, groupId?: string, color?: string, status?: GuestStatus, children?: Guest[]) { constructor(id?: string, name?: string, color?: string, status?: GuestStatus, children?: Guest[], Group?: Group) {
this.id = id; this.id = id;
this.name = name; this.name = name;
this.group_name = group_name;
this.groupId = groupId;
this.color = color; this.color = color;
this.status = status; this.status = status;
this.children = children; this.children = children;
this.group = Group;
} }
} }
export class GuestSerializer implements Serializable<Guest> { export class GuestSerializer implements Serializable<Guest> {
fromJson(data: any): Guest { fromJson(data: any): Guest {
return new Guest(data.id, data.name, data.group?.name, data.group?.id, data.color, data.status, data.children); return new Guest(data.id, data.name, data.color, data.status, data.children, new Group(data.group?.id, data.group?.name));
} }
toJson(guest: Guest): string { toJson(guest: Guest): string {
return JSON.stringify({ guest: { name: guest.name, status: guest.status, group_id: guest.groupId } }); return JSON.stringify({ guest: { name: guest.name, status: guest.status, group_id: guest.group?.id } });
} }
apiPath(): string { apiPath(): string {

28
app/lib/invitation.tsx Normal file
View File

@ -0,0 +1,28 @@
/* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { Entity } from "./definitions";
import { Guest } from "./guest";
export class Invitation implements Entity {
id?: string;
guests: Array<Guest>;
constructor(id?: string, guests: Array<Guest> = []) {
this.id = id;
this.guests = guests;
}
}
export class InvitationSerializer {
fromJson(data: any): Invitation {
return new Invitation(data.id, (data.guests || []).map((guest: any) => new Guest(guest.id, guest.name, guest.color, guest.status, guest.children)));
}
toJson(invitation: Invitation): string {
return JSON.stringify({ invitation: { guest_ids: invitation.guests.map(guest => guest.id) } });
}
apiPath(): string {
return 'invitations';
}
}

View File

@ -1,7 +1,8 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { Serializable } from "../api/abstract-api"; import { Serializable } from "../api/abstract-api";
import { Entity } from "./definitions"; import { Entity } from "./definitions";
import { Group } from "./group";
import { Guest } from "./guest"; import { Guest } from "./guest";
export type Discomfort = { export type Discomfort = {
@ -19,12 +20,12 @@ export type Table = {
} }
export class TableSimulation implements Entity { export class TableSimulation implements Entity {
id: string; id?: string;
tables: Table[]; tables: Table[];
constructor(id: string, tables: Table[]) { constructor(id?: string, tables?: Table[]) {
this.id = id; this.id = id;
this.tables = tables; this.tables = tables || [];
} }
} }
@ -33,7 +34,7 @@ export class TableSimulationSerializer implements Serializable<TableSimulation>
return new TableSimulation(data.id, data.tables.map((table: any) => { return new TableSimulation(data.id, data.tables.map((table: any) => {
return { return {
number: table.number, number: table.number,
guests: table.guests.map((guest: any) => new Guest(guest.id, guest.name, guest.group?.name, guest.group?.id, guest.color)), guests: table.guests.map((guest: any) => new Guest(guest.id, guest.name, guest.color, guest.status, [], guest.group)),
discomfort: { discomfort: {
discomfort: table.discomfort.discomfort, discomfort: table.discomfort.discomfort,
breakdown: { breakdown: {
@ -53,10 +54,10 @@ export class TableSimulationSerializer implements Serializable<TableSimulation>
return { return {
id: guest.id, id: guest.id,
name: guest.name, name: guest.name,
group_id: guest.groupId,
color: guest.color, color: guest.color,
status: guest.status, status: guest.status,
children: guest.children, children: guest.children,
group: new Group(guest.group?.id, guest.group?.name)
} }
}), }),
discomfort: table.discomfort, discomfort: table.discomfort,

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
export const getCsrfToken = () => { export const getCsrfToken = () => {
return document.cookie return document.cookie

30
app/lib/website.tsx Normal file
View File

@ -0,0 +1,30 @@
/* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { Serializable } from "../api/abstract-api";
import { Entity } from "./definitions";
export class Website implements Entity {
id?: string;
content?: string;
constructor(id: string, content: string) {
this.id = id;
this.content = content;
}
}
export class WebsiteSerializer implements Serializable<Website> {
fromJson(data: any): Website {
return new Website("", data.content);
}
toJson(website: Website): string {
return JSON.stringify({ website: { content: website.content } });
}
apiPath(): string {
return 'website';
}
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import * as HeroIcon from '@heroicons/react/24/outline' import * as HeroIcon from '@heroicons/react/24/outline'
import { ComponentProps } from 'react' import { ComponentProps } from 'react'

View File

@ -1,11 +1,10 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
import { AbstractApi } from '@/app/api/abstract-api'; import { AbstractApi } from '@/app/api/abstract-api';
import { TableArrangement } from '@/app/lib/definitions'; import { TableArrangement } from '@/app/lib/definitions';
import { TableSimulation, TableSimulationSerializer } from '@/app/lib/tableSimulation'; import { TableSimulation, TableSimulationSerializer } from '@/app/lib/tableSimulation';
import { getSlug } from '@/app/lib/utils';
import { Table } from '@/app/ui/components/table'; import { Table } from '@/app/ui/components/table';
import { lusitana } from '@/app/ui/fonts'; import { lusitana } from '@/app/ui/fonts';
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client' 'use client'
@ -7,8 +7,11 @@ import { TableArrangement } from '@/app/lib/definitions';
import { classNames } from "../components/button"; import { classNames } from "../components/button";
import TableOfContents from "../components/table-of-contents"; import TableOfContents from "../components/table-of-contents";
import { loadTableSimulations } from "@/app/api/tableSimulations"; import { loadTableSimulations } from "@/app/api/tableSimulations";
import { ArchiveBoxXMarkIcon, CheckBadgeIcon } from "@heroicons/react/24/outline";
import { Tooltip } from "primereact/tooltip";
import clsx from "clsx";
export default function ArrangementsTable ({onArrangementSelected}: {onArrangementSelected: (arrangementId: string) => void}) { export default function ArrangementsTable({ onArrangementSelected }: { onArrangementSelected: (arrangementId: string) => void }) {
const [arrangements, setArrangements] = useState<Array<TableArrangement>>([]); const [arrangements, setArrangements] = useState<Array<TableArrangement>>([]);
const [arrangementsLoaded, setArrangementsLoaded] = useState(false); const [arrangementsLoaded, setArrangementsLoaded] = useState(false);
@ -25,14 +28,17 @@ export default function ArrangementsTable ({onArrangementSelected}: {onArrangeme
!arrangementsLoaded && refreshSimulations(); !arrangementsLoaded && refreshSimulations();
return( return (
<TableOfContents <TableOfContents
headers={['Name', 'Discomfort', 'Actions']} headers={['Name', 'Discomfort', 'Actions', 'Status']}
caption='Simulations' caption='Simulations'
elements={arrangements} elements={arrangements}
rowRender={(arrangement) => ( rowRender={(arrangement) => (
<tr key={arrangement.id} className="bg-white border-b odd:bg-white odd:dark:bg-gray-900 even:bg-gray-50 even:dark:bg-gray-800"> <tr key={arrangement.id} className={clsx("border-b", {
<th scope="row" className="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white"> "bg-white odd:bg-white even:bg-gray-50": arrangement.valid,
"bg-red-50 odd:bg-red-50 even:bg-red-100": !arrangement.valid
})}>
<th scope="row" className="px-6 py-4 font-medium text-gray-900 whitespace-nowrap">
{arrangement.name} {arrangement.name}
</th> </th>
<td className="px-6 py-4"> <td className="px-6 py-4">
@ -41,6 +47,15 @@ export default function ArrangementsTable ({onArrangementSelected}: {onArrangeme
<td> <td>
<button data-arrangement-id={arrangement.id} onClick={arrangementClicked} className={classNames('primary')}>Load</button> <button data-arrangement-id={arrangement.id} onClick={arrangementClicked} className={classNames('primary')}>Load</button>
</td> </td>
<td>
<Tooltip target=".tooltip-status" />
{
arrangement.valid ?
<CheckBadgeIcon className='size-6 tooltip-status' data-pr-position="right" data-pr-tooltip="Simulation is valid" /> :
<ArchiveBoxXMarkIcon className='size-6 tooltip-status' data-pr-position="right" data-pr-tooltip="Simulation is expired due to attendance or affinity changes" />
}
</td>
</tr> </tr>
)} )}
/> />

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import clsx from 'clsx'; import clsx from 'clsx';

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';

View File

@ -1,11 +1,11 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import clsx from "clsx"; import clsx from "clsx";
type ButtonColor = 'primary' | 'blue' | 'green' | 'red' | 'yellow' | 'gray'; type ButtonColor = 'primary' | 'blue' | 'green' | 'red' | 'yellow' | 'gray';
export function classNames(type: ButtonColor) { export function classNames(type: ButtonColor) {
return (clsx("text-white py-1 px-2 mx-1 rounded disabled:opacity-50 disabled:cursor-not-allowed", { return (clsx("text-white py-1 px-2 m-2 rounded disabled:opacity-50 disabled:cursor-not-allowed", {
'bg-blue-400 hover:bg-blue-600': type === 'primary' || type === 'blue', 'bg-blue-400 hover:bg-blue-600': type === 'primary' || type === 'blue',
'bg-green-500 hover:bg-green-600': type === 'green', 'bg-green-500 hover:bg-green-600': type === 'green',
'bg-red-500 hover:bg-red-600': type === 'red', 'bg-red-500 hover:bg-red-600': type === 'red',

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import clsx from "clsx" import clsx from "clsx"
import { Icon } from "../../types"; import { Icon } from "../../types";

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { Slider } from 'primereact/slider'; import { Slider } from 'primereact/slider';

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import React, { useState } from 'react'; import React, { useState } from 'react';

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
@ -14,7 +14,7 @@ import { useState } from 'react';
export default function GroupFormDialog({ groups, onCreate, onHide, group, visible }: { export default function GroupFormDialog({ groups, onCreate, onHide, group, visible }: {
groups: Group[], groups: Group[],
onCreate?: () => void, onCreate?: (newGroup: Group) => void,
onHide: () => void, onHide: () => void,
group?: Group, group?: Group,
visible: boolean, visible: boolean,
@ -46,15 +46,15 @@ export default function GroupFormDialog({ groups, onCreate, onHide, group, visib
group.color = color; group.color = color;
group.parentId = parentId; group.parentId = parentId;
api.update(serializer, group, () => { api.update(serializer, group, (newGroup) => {
resetForm(); resetForm();
onCreate && onCreate(); onCreate && onCreate(newGroup);
}); });
} else { } else {
api.create(serializer, new Group(undefined, name, undefined, icon, undefined, parentId, color), () => { api.create(serializer, new Group(undefined, name, undefined, icon, undefined, parentId, color), (newGroup) => {
resetForm(); resetForm();
onCreate && onCreate(); onCreate && onCreate(newGroup);
}); });
} }
} }

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
@ -15,14 +15,14 @@ import { useState } from 'react';
export default function GuestFormDialog({ groups, onCreate, onHide, guest, visible }: { export default function GuestFormDialog({ groups, onCreate, onHide, guest, visible }: {
groups: Group[], groups: Group[],
onCreate?: () => void, onCreate?: (guest: Guest) => void,
onHide: () => void, onHide: () => void,
guest?: Guest, guest?: Guest,
visible: boolean, visible: boolean,
}) { }) {
const [name, setName] = useState(guest?.name || ''); const [name, setName] = useState(guest?.name || '');
const [group, setGroup] = useState(guest?.groupId || null); const [group, setGroup] = useState(guest?.group?.id || null);
const [status, setStatus] = useState<GuestStatus | null>(guest?.status || null); const [status, setStatus] = useState<GuestStatus | null>(guest?.status || null);
const api = new AbstractApi<Guest>(); const api = new AbstractApi<Guest>();
@ -41,17 +41,17 @@ export default function GuestFormDialog({ groups, onCreate, onHide, guest, visib
if (guest?.id !== undefined) { if (guest?.id !== undefined) {
guest.name = name; guest.name = name;
guest.groupId = group; guest.group!.id = group;
guest.status = status; guest.status = status;
api.update(serializer, guest, () => { api.update(serializer, guest, (updatedGuest) => {
resetForm(); resetForm();
onCreate && onCreate(); onCreate && onCreate(updatedGuest);
}); });
} else { } else {
api.create(serializer, new Guest(undefined, name, undefined, group, undefined, status), ()=> { api.create(serializer, new Guest(undefined, name, undefined, status, [], groups.find((g) => g.id === group)), (newGuest)=> {
resetForm(); resetForm();
onCreate && onCreate(); onCreate && onCreate(newGuest);
}); });
} }
} }
@ -62,8 +62,8 @@ export default function GuestFormDialog({ groups, onCreate, onHide, guest, visib
<Dialog header="Add guest" visible={visible} style={{ width: '60vw' }} onHide={onHide}> <Dialog header="Add guest" visible={visible} style={{ width: '60vw' }} onHide={onHide}>
<div className="card flex justify-evenly py-5"> <div className="card flex justify-evenly py-5">
<FloatLabel> <FloatLabel>
<InputText id="username" className='rounded-sm' value={name} onChange={(e) => setName(e.target.value)} /> <InputText id="name" className='rounded-sm' value={name} onChange={(e) => setName(e.target.value)} />
<label htmlFor="username">Username</label> <label htmlFor="name">Name</label>
</FloatLabel> </FloatLabel>
<FloatLabel> <FloatLabel>
<Dropdown id="group" className='rounded-sm min-w-32' value={group} onChange={(e) => setGroup(e.target.value)} options={ <Dropdown id="group" className='rounded-sm min-w-32' value={group} onChange={(e) => setGroup(e.target.value)} options={

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
@ -15,6 +15,9 @@ export default function LoginForm() {
const [email, setEmail] = useState(""); const [email, setEmail] = useState("");
const [password, setPassword] = useState(""); const [password, setPassword] = useState("");
const [slug, setSlug] = useState<string>("default");
useEffect(() => {setSlug(getSlug())}, []);
const router = useRouter(); const router = useRouter();
const [currentUser, setCurrentUser] = useState<User | null>(null); const [currentUser, setCurrentUser] = useState<User | null>(null);
@ -41,7 +44,7 @@ export default function LoginForm() {
password: password, password: password,
onLogin: (user) => { onLogin: (user) => {
setCurrentUser(user); setCurrentUser(user);
router.push(`${getSlug()}/dashboard`) router.push(`${slug}/dashboard`)
} }
})}> })}>
Sign in Sign in

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
@ -17,7 +17,9 @@ export default function RegistrationForm() {
const [email, setEmail] = useState<string>(""); const [email, setEmail] = useState<string>("");
const [password, setPassword] = useState<string>(""); const [password, setPassword] = useState<string>("");
const [passwordConfirmation, setPasswordConfirmation] = useState<string>(""); const [passwordConfirmation, setPasswordConfirmation] = useState<string>("");
const [slug, setSlug] = useState<string>(getSlug());
const [slug, setSlug] = useState<string>("default");
useEffect(() => { setSlug(getSlug()) }, []);
const [captchaId, setCaptchaId] = useState<string>(""); const [captchaId, setCaptchaId] = useState<string>("");
const [captchaUrl, setCaptchaUrl] = useState<string>(""); const [captchaUrl, setCaptchaUrl] = useState<string>("");

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
export default function TableOfContents<Type>({ headers, caption, elements, rowRender }: { headers: string[], caption: string, elements: Type[], rowRender: (element: Type) => JSX.Element }) { export default function TableOfContents<Type>({ headers, caption, elements, rowRender }: { headers: string[], caption: string, elements: Type[], rowRender: (element: Type) => JSX.Element }) {
return ( return (

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { Guest } from "@/app/lib/guest"; import { Guest } from "@/app/lib/guest";
import { Table as TableType } from "@/app/lib/tableSimulation"; import { Table as TableType } from "@/app/lib/tableSimulation";

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { GlobalSummary as Summary} from '@/app/lib/definitions'; import { GlobalSummary as Summary} from '@/app/lib/definitions';
import { MainCard, SecondaryCard } from '../components/dashboard-cards'; import { MainCard, SecondaryCard } from '../components/dashboard-cards';

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
export default function Loading() { export default function Loading() {
return <div>Loading...</div>; return <div>Loading...</div>;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client' 'use client'
@ -6,24 +6,30 @@ import {
UserGroupIcon, UserGroupIcon,
RectangleGroupIcon, RectangleGroupIcon,
BanknotesIcon, BanknotesIcon,
GlobeAltIcon,
} from '@heroicons/react/24/outline'; } from '@heroicons/react/24/outline';
import Link from 'next/link'; import Link from 'next/link';
import { usePathname } from 'next/navigation'; import { usePathname } from 'next/navigation';
import clsx from 'clsx'; import clsx from 'clsx';
import { getSlug } from '@/app/lib/utils'; import { getSlug } from '@/app/lib/utils';
import { useEffect, useState } from 'react';
// Map of links to display in the side navigation. // Map of links to display in the side navigation.
// Depending on the size of the application, this would be stored in a database. // Depending on the size of the application, this would be stored in a database.
const links = [
{ name: 'Guests', href: `/${getSlug()}/dashboard/guests`, icon: UserGroupIcon },
{ name: 'Expenses', href: `/${getSlug()}/dashboard/expenses`, icon: BanknotesIcon },
{ name: 'Table distributions', href: `/${getSlug()}/dashboard/tables`, icon: RectangleGroupIcon },
];
export default function NavLinks() { export default function NavLinks() {
const pathname = usePathname(); const pathname = usePathname();
const [slug, setSlug] = useState<string>("default");
useEffect(() => { setSlug(getSlug()) }, []);
const links = [
{ name: 'Guests', href: `/${slug}/dashboard/guests`, icon: UserGroupIcon },
{ name: 'Expenses', href: `/${slug}/dashboard/expenses`, icon: BanknotesIcon },
{ name: 'Table distributions', href: `/${slug}/dashboard/tables`, icon: RectangleGroupIcon },
{ name: 'Website builder', href: `/${slug}/dashboard/website`, icon: GlobeAltIcon },
];
return ( return (
<> <>
{links.map((link) => { {links.map((link) => {

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
@ -9,15 +9,23 @@ import { gloriaHallelujah } from '@/app/ui/fonts';
import { logout } from '@/app/api/authentication'; import { logout } from '@/app/api/authentication';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { getSlug } from '@/app/lib/utils'; import { getSlug } from '@/app/lib/utils';
import { useEffect, useState } from 'react';
export default function SideNav() { export default function SideNav() {
const router = useRouter(); const router = useRouter();
const [slug, setSlug] = useState<string>("default");
useEffect(() => { setSlug(getSlug()) }, []);
const [currentUser, setCurrentUser] = useState<{ email: string } | null>(null);
useEffect(() => { setCurrentUser(JSON.parse(localStorage.getItem('currentUser') || '{}')) }, []);
return ( return (
<div className="flex h-full flex-col px-3 py-4 md:px-2"> <div className="flex h-full flex-col px-3 py-4 md:px-2">
<Link <Link
className="mb-2 flex h-20 items-center justify-start rounded-md bg-blue-600 p-4 md:h-20" className="mb-2 flex h-20 items-center justify-start rounded-md bg-blue-600 p-4 md:h-20"
href={`/${getSlug()}/dashboard`} href={`/${slug}/dashboard`}
> >
<div className={`${gloriaHallelujah.className} "w-32 text-white md:w-40 antialiased`}> <div className={`${gloriaHallelujah.className} "w-32 text-white md:w-40 antialiased`}>
<h1>Wedding Planner</h1> <h1>Wedding Planner</h1>
@ -26,14 +34,14 @@ export default function SideNav() {
<div className="flex grow flex-row justify-between space-x-2 md:flex-col md:space-x-0 md:space-y-2"> <div className="flex grow flex-row justify-between space-x-2 md:flex-col md:space-x-0 md:space-y-2">
<NavLinks /> <NavLinks />
<div className="hidden h-auto w-full grow rounded-md bg-gray-50 md:block"></div> <div className="hidden h-auto w-full grow rounded-md bg-gray-50 md:block"></div>
<span>Logged in as {JSON.parse(localStorage.getItem('currentUser') || '{}').email}</span> <span>Logged in as {currentUser?.email}</span>
<button <button
className="flex h-[48px] w-full grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3" className="flex h-[48px] w-full grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3"
onClick={() => { onClick={() => {
logout({ logout({
onLogout: () => { onLogout: () => {
localStorage.clear(); localStorage.clear();
router.push(`/${getSlug()}`); router.push(`/${slug}`);
} }
}); });
}} }}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client' 'use client'

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import { Inter, Lusitana, Gloria_Hallelujah} from 'next/font/google'; import { Inter, Lusitana, Gloria_Hallelujah} from 'next/font/google';

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
@ -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

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
import Skeleton from '@/app/ui/skeleton'; import Skeleton from '@/app/ui/skeleton';

View File

@ -1,9 +1,9 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';
import { AbstractApi } from '@/app/api/abstract-api'; import { AbstractApi } from '@/app/api/abstract-api';
import { Guest , GuestSerializer} from '@/app/lib/guest'; import { Guest, GuestSerializer } from '@/app/lib/guest';
import { PencilIcon, TrashIcon } from '@heroicons/react/24/outline'; import { PencilIcon, TrashIcon } from '@heroicons/react/24/outline';
import clsx from 'clsx'; import clsx from 'clsx';
import TableOfContents from '../components/table-of-contents'; import TableOfContents from '../components/table-of-contents';
@ -28,7 +28,7 @@ export default function guestsTable({ guests, onUpdate, onEdit }: {
{guest.name} {guest.name}
</td> </td>
<td className="px-6 py-4"> <td className="px-6 py-4">
{guest.group_name} {guest.group?.name}
</td> </td>
<td className="px-6 py-4"> <td className="px-6 py-4">
<span className="flex items-center text-sm dark:text-white me-3"> <span className="flex items-center text-sm dark:text-white me-3">
@ -48,7 +48,12 @@ export default function guestsTable({ guests, onUpdate, onEdit }: {
</td> </td>
<td> <td>
<div className="flex flex-row items-center"> <div className="flex flex-row items-center">
<TrashIcon className='size-6 cursor-pointer' onClick={() => { api.destroy(serializer, guest, onUpdate)}} /> <TrashIcon className='size-6 cursor-pointer' onClick={() => {
if (window.confirm(`Are you sure you want to delete guest "${guest.name}"?`)) {
api.destroy(serializer, guest, onUpdate)
}
}}
/>
<PencilIcon className='size-6 cursor-pointer' onClick={() => onEdit(guest)} /> <PencilIcon className='size-6 cursor-pointer' onClick={() => onEdit(guest)} />
</div> </div>
</td> </td>

View File

@ -0,0 +1,211 @@
/* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client';
import { AbstractApi } from "@/app/api/abstract-api";
import { Guest } from "@/app/lib/guest";
import { Invitation, InvitationSerializer } from "@/app/lib/invitation";
import { getSlug } from "@/app/lib/utils";
import { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
import { LinkIcon, TrashIcon } from "@heroicons/react/24/outline";
import { useEffect, useRef } from "react";
import { useState } from "react";
import { classNames } from "../components/button";
function InvitationCard({ invitation, allGuests, onGuestAdded, onDestroy }: {
invitation: Invitation,
allGuests: Guest[],
onGuestAdded: (guest: Guest) => void,
onDestroy: (invitation: Invitation) => void
}
) {
const [guests, setGuests] = useState<Guest[]>(invitation.guests);
const ref = useRef<HTMLDivElement | null>(null);
const api = new AbstractApi<Invitation>();
const serializer = new InvitationSerializer();
const iconClassName = "w-5 h-5 text-white absolute top-2 opacity-0 group-hover:opacity-100 cursor-pointer";
useEffect(() => {
if (ref.current) {
return dropTargetForElements({
element: ref.current,
onDrop: (data) => {
const guestId = data.source.element.dataset.guestId;
if (guestId) {
const guestToAdd = allGuests.find((guest) => guest.id === guestId);
if (guestToAdd) {
setGuests((prevGuests) => [...prevGuests, guestToAdd]);
invitation.guests.push(guestToAdd);
api.update(serializer, invitation, () => {
onGuestAdded(guestToAdd);
});
}
}
},
});
}
}, []);
return (
<div
key={invitation.id}
ref={ref}
className="relative flex items-center justify-center w-full bg-green-800 border border-green-900 group"
style={{ aspectRatio: "1.618 / 1" }}
>
<LinkIcon
className={`${iconClassName} right-8`}
onClick={() => {
navigator.clipboard.writeText(`https://${window.location.host}/${getSlug()}/site/invitation/${invitation.id}`);
}}
/>
<TrashIcon
className={`${iconClassName} right-2`}
onClick={() => {
if (window.confirm("Are you sure you want to delete this invitation?")) {
api.destroy(serializer, invitation, () => {
onDestroy(invitation);
});
}
}}
/>
{guests.length === 0 ? (
<p className="text-center text-yellow-500 text-lg italic">
(empty invitation)
</p>
) : (
<ul className="text-center text-yellow-500 text-lg">
{guests.map((guest) => (
<li key={guest.id}>{guest.name}</li>
))}
</ul>
)}
</div>
)
}
function GuestCard(guest: Guest) {
const ref = useRef<HTMLDivElement | null>(null);
useEffect(() => {
if (ref.current) {
return draggable({
element: ref.current,
});
}
}, [guest.id]);
return (
<div
key={guest.id}
ref={ref}
className="mb-4 p-4 border border-gray-300 rounded-lg shadow-sm bg-white cursor-move"
draggable="true"
data-guest-id={guest.id}>
<h3 className="text-md font-medium">{guest.name}</h3>
</div>
)
}
export default function InvitationsBoard({ guests, invitations: originalInvitations }: {
guests: Array<Guest>,
invitations: Array<Invitation>
}) {
const api = new AbstractApi<Invitation>();
const serializer = new InvitationSerializer();
const [invitations, setInvitations] = useState<Invitation[]>(originalInvitations);
const [unassignedGuests, setUnassignedGuests] = useState<Guest[]>(
guests.filter(
(guest) =>
guest.status !== 'considered' &&
!invitations.some((invitation) =>
invitation.guests.some((invitedGuest) => invitedGuest.id === guest.id)
)
)
);
// Sort invitations to display those without guests at the top
const sortedInvitations = [...invitations].sort((a, b) => {
if (a.guests.length === 0 && b.guests.length > 0) return -1;
if (a.guests.length > 0 && b.guests.length === 0) return 1;
return 0;
});
function handleCreateInvitation() {
api.create(serializer, new Invitation(), (createdInvitation) => {
setInvitations((prevInvitations) => [createdInvitation, ...prevInvitations]);
});
}
function handleDownloadQrCodes() {
api.getAllPdf(serializer, () => {
console.log("QR codes downloaded");
});
}
return (
<div className="flex h-screen">
{/* Left Column: Guests */}
<div className="w-1/4 h-full overflow-auto border-r border-gray-300 p-4">
<h2 className="text-lg font-semibold mb-4">{unassignedGuests.length} guests without invitation</h2>
<div>
{unassignedGuests.map((guest) => (
<GuestCard key={guest.id} {...guest} />
))}
</div>
</div>
{/* Right Column: Invitations */}
<div className="w-3/4 h-full overflow-auto p-4">
<h2 className="text-lg font-semibold mb-4">
{invitations.length} invitations
</h2>
<button
onClick={handleCreateInvitation}
className={classNames('primary')}
>
Create New Invitation
</button>
<button
onClick={handleDownloadQrCodes}
className={classNames('primary')}
>
Download QR codes
</button>
<div className="grid grid-cols-4 gap-6">
{sortedInvitations.map((invitation) => (
<InvitationCard
key={invitation.id}
invitation={invitation}
allGuests={guests}
onGuestAdded={(guestAdded: Guest) => {
setUnassignedGuests((prevUnassignedGuests) => prevUnassignedGuests.filter(g => g.id !== guestAdded.id));
}}
onDestroy={(invitationToDestroy: Invitation) => {
setInvitations((prevInvitations) => prevInvitations.filter(i => i.id !== invitationToDestroy.id));
setUnassignedGuests((prevUnassignedGuests) => [
...prevUnassignedGuests,
...invitationToDestroy.guests
]);
}}
/>
))}
</div>
</div>
</div>
);
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
'use client'; 'use client';

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2024 Manuel Bustillo*/ /* Copyright (C) 2024-2025 LibreWeddingPlanner contributors*/
export default function Skeleton({ className }: { className: string }) { export default function Skeleton({ className }: { className: string }) {
return <div className={`bg-slate-200 motion-safe:animate-pulse rounded ${className}`} />; return <div className={`bg-slate-200 motion-safe:animate-pulse rounded ${className}`} />;

View File

@ -6,33 +6,39 @@
"start": "next start" "start": "next start"
}, },
"dependencies": { "dependencies": {
"@atlaskit/pragmatic-drag-and-drop": "^1.7.0",
"@heroicons/react": "^2.1.4", "@heroicons/react": "^2.1.4",
"@tailwindcss/forms": "^0.5.7", "@tailwindcss/forms": "^0.5.7",
"autoprefixer": "10.4.20", "@tiptap/pm": "^2.14.0",
"bcrypt": "^5.1.1", "@tiptap/react": "^2.14.0",
"@tiptap/starter-kit": "^2.14.0",
"autoprefixer": "10.4.21",
"bcrypt": "^6.0.0",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"next": "15.1.4", "dompurify": "^3.2.6",
"next-auth": "5.0.0-beta.25", "next": "15.3.5",
"postcss": "8.4.49", "next-auth": "5.0.0-beta.29",
"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",
"react-dom": "19.0.0-rc-f38c22b244-20240704", "react-dom": "19.0.0-rc-f38c22b244-20240704",
"tailwindcss": "3.4.17", "tailwindcss": "3.4.17",
"typescript": "5.7.3", "typescript": "5.8.3",
"use-debounce": "^10.0.1", "use-debounce": "^10.0.1",
"uuid": "11.0.5", "uuid": "11.1.0",
"zod": "^3.23.8" "zod": "^3.23.8"
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "^1.46.0", "@playwright/test": "^1.52.0",
"@types/bcrypt": "^5.0.2", "@types/bcrypt": "^5.0.2",
"@types/node": "22.10.5", "@types/node": "24.0.10",
"@types/react": "18.3.18", "@types/react": "18.3.23",
"@types/react-dom": "18.3.5" "@types/react-dom": "18.3.7",
"wait-on": "^8.0.3"
}, },
"engines": { "engines": {
"node": ">=23.0.0" "node": ">=23.0.0"
}, },
"packageManager": "pnpm@9.15.3+sha512.1f79bc245a66eb0b07c5d4d83131240774642caaa86ef7d0434ab47c0d16f66b04e21e0c086eb61e62c77efc4d7f7ec071afad3796af64892fae66509173893a" "packageManager": "pnpm@10.12.3+sha512.467df2c586056165580ad6dfb54ceaad94c5a30f80893ebdec5a44c5aa73c205ae4a5bb9d5ed6bb84ea7c249ece786642bbb49d06a307df218d03da41c317417"
} }

View File

@ -43,11 +43,6 @@ export default defineConfig({
use: { ...devices['Desktop Firefox'] }, use: { ...devices['Desktop Firefox'] },
}, },
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},
/* Test against mobile viewports. */ /* Test against mobile viewports. */
// { // {
// name: 'Mobile Chrome', // name: 'Mobile Chrome',

1808
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

BIN
public/header.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 KiB

BIN
public/stamp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

82
tests/groups.spec.ts Normal file
View File

@ -0,0 +1,82 @@
import { test, expect, Page } from '@playwright/test'
import mockGroupsAPI from './mocks/groups';
import mockGuestsAPI from './mocks/guests';
test('should allow CRUD on groups', async ({ page }) => {
await mockGuestsAPI({ page });
await mockGroupsAPI({ page });
await page.goto('/default/dashboard/guests');
await page.getByRole('tab', { name: 'Groups' }).click();
await expect(page.getByRole('button', { name: 'Add new' })).toBeVisible();
await expect(page.getByRole('button', { name: 'Reset affinities' })).toBeVisible();
// List all groups
await expect(page.getByRole('row')).toHaveCount(3); // 1 header row + 2 data rows
await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(0)).toHaveText('Name');
await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(1)).toHaveText('Color');
await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(2)).toHaveText('Confirmed');
await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(3)).toHaveText('Tentative');
await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(4)).toHaveText('Pending');
await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(5)).toHaveText('Declined');
await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(6)).toHaveText('Considered');
await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(7)).toHaveText('Total');
await expect(page.getByRole('row').nth(0).getByRole('columnheader').nth(8)).toHaveText('Actions');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toContainText('Pam\'s family');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(2)).toHaveText('0');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('0');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(4)).toHaveText('1');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(5)).toHaveText('0');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(6)).toHaveText('2');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(7)).toHaveText('3');
await expect(page.getByRole('row').nth(1).locator('svg:visible')).toHaveCount(3);
await expect(page.getByRole('row').nth(2).getByRole('cell').nth(0)).toContainText('Pam\'s work');
await expect(page.getByRole('row').nth(2).getByRole('cell').nth(2)).toHaveText('0');
await expect(page.getByRole('row').nth(2).getByRole('cell').nth(3)).toHaveText('2');
await expect(page.getByRole('row').nth(2).getByRole('cell').nth(4)).toHaveText('0');
await expect(page.getByRole('row').nth(2).getByRole('cell').nth(5)).toHaveText('0');
await expect(page.getByRole('row').nth(2).getByRole('cell').nth(6)).toHaveText('0');
await expect(page.getByRole('row').nth(2).getByRole('cell').nth(7)).toHaveText('2');
await expect(page.getByRole('row').nth(2).locator('svg:visible')).toHaveCount(3);
// Add a new group
await page.getByRole('button', { name: 'Add new' }).click();
const dialog = page.getByRole('dialog');
await expect(dialog).toBeVisible();
await dialog.getByLabel('Name').fill("Pam's friends");
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(page.getByRole('row').nth(1).getByRole('cell').nth(0)).toContainText('Pam\'s friends');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(2)).toHaveText('0');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(3)).toHaveText('0');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(4)).toHaveText('0');
await expect(page.getByRole('row').nth(1).getByRole('cell').nth(5)).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).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

@ -1,100 +1,76 @@
import { test, expect, Page } from '@playwright/test' import { expect, test } from '@playwright/test';
import mockGroupsAPI from './mocks/groups';
import mockGuestsAPI from './mocks/guests';
const mockGuestsAPI = ({ page }: { page: Page }) => { test('should allow CRUD on guests', async ({ page }) => {
page.route('*/**/api/default/guests', async route => {
const json = [
{
"id": "f4a09c28-40ea-4553-90a5-96935a59cac6",
"status": "tentative",
"name": "Kristofer Rohan DVM",
"group": {
"id": "2fcb8b22-6b07-4c34-92e3-a2535dbc5b14",
"name": "Childhood friends",
}
},
{
"id": "bd585c40-0937-4cde-960a-bb23acfd6f18",
"status": "invited",
"name": "Olevia Quigley Jr.",
"group": {
"id": "da8edf26-3e1e-4cbb-b985-450c49fffe01",
"name": "Work",
}
},
];
await route.fulfill({ json })
})
}
const mockGroupsAPI = ({ page }: { page: Page }) => {
page.route('*/**/api/default/groups', async route => {
const json = [
{
"id": "ee44ffb9-1147-4842-a378-9eaeb0f0871a",
"name": "Pam's family",
"icon": "pi pi-users",
"parent_id": "cd9645e1-02c6-4fb9-bba6-1a960754b01c",
"color": "#ff0000",
"total": 3,
"considered": 2,
"invited": 1,
"confirmed": 0,
"declined": 0,
"tentative": 0
},
{
"id": "c8bda6ca-d8af-4bb8-b2bf-e6ec1c21b1e6",
"name": "Pam's work",
"icon": "pi pi-desktop",
"parent_id": "cd9645e1-02c6-4fb9-bba6-1a960754b01c",
"color": "#00ff00",
"total": 2,
"considered": 0,
"invited": 0,
"confirmed": 0,
"declined": 0,
"tentative": 2
},
];
await route.fulfill({ json })
})
}
test('should display the list of guests', async ({ page }) => {
await mockGuestsAPI({ page }); await mockGuestsAPI({ page });
await page.goto('/default/dashboard/guests');
await expect(page.getByRole('tab', { name: 'Groups' })).toBeVisible();
await expect(page.getByRole('tab', { name: 'Guests' })).toBeVisible();
await expect(page.getByText('There are 2 elements in the list')).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Kristofer Rohan DVM' })).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Childhood friends' })).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Tentative' })).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('button', { name: 'Confirm' })).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('button', { name: 'Decline' })).toBeVisible();
await expect(page.getByRole('row').nth(2).getByRole('cell', { name: 'Olevia Quigley Jr.' })).toBeVisible();
await expect(page.getByRole('row').nth(2).getByRole('cell', { name: 'Work' })).toBeVisible();
await expect(page.getByRole('row').nth(2).getByRole('cell', { name: 'Invited' })).toBeVisible();
await expect(page.getByRole('row').nth(2).getByRole('button', { name: 'Confirm' })).toBeVisible();
await expect(page.getByRole('row').nth(2).getByRole('button', { name: 'Tentative' })).toBeVisible();
await expect(page.getByRole('row').nth(2).getByRole('button', { name: 'Decline' })).toBeVisible();
});
test('should display the list of groups', async ({ page }) => {
await mockGroupsAPI({ page }); await mockGroupsAPI({ page });
await page.goto('/default/dashboard/guests'); await page.goto('/default/dashboard/guests');
await page.getByRole('tab', { name: 'Groups' }).click();
await expect(page.getByRole('button', { name: 'Add new' })).toBeVisible();
await expect(page.getByRole('tab', { name: 'Guests' })).toBeVisible();
await expect(page.getByRole('tab', { name: 'Groups' })).toBeVisible();
await expect(page.getByRole('tab', { name: 'Invitations' })).toBeVisible();
// List all guests
await expect(page.getByText('There are 2 elements in the list')).toBeVisible(); await expect(page.getByText('There are 2 elements in the list')).toBeVisible();
await expect(page.getByRole('row')).toHaveCount(3); // 1 header row + 2 data rows
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Kristofer Rohan DVM' })).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: "Pam's family" })).toBeVisible(); await expect(page.getByRole('row').nth(1).getByRole('cell', { name: "Pam's family" })).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Tentative' })).toBeVisible();
await expect(page.getByRole('row').nth(1).locator('svg')).toHaveCount(2);
await expect(page.getByRole('row').nth(2).getByRole('cell', { name: 'Olevia Quigley Jr.' })).toBeVisible();
await expect(page.getByRole('row').nth(2).getByRole('cell', { name: "Pam's work" })).toBeVisible(); await expect(page.getByRole('row').nth(2).getByRole('cell', { name: "Pam's work" })).toBeVisible();
await expect(page.getByRole('row').nth(2).getByRole('cell', { name: 'Invited' })).toBeVisible();
await expect(page.getByRole('row').nth(2).locator('svg')).toHaveCount(2);
// Add a new guest
await page.getByRole('button', { name: 'Add new' }).click();
await page.getByRole('dialog').getByLabel('Name').fill('John Snow');
await page.locator('#group').click();
await page.getByRole('option', { name: "Pam's work" }).click();
await page.locator('#status').click();
await page.getByRole('option', { name: 'Invited' }).click();
await page.getByRole('dialog').getByRole('button', { name: 'Create' }).click();
await expect(page.getByText('There are 3 elements in the list')).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'John Snow' })).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: "Pam\'s work" })).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Invited' })).toBeVisible();
await expect(page.getByRole('row').nth(1).locator('svg')).toHaveCount(2);
// Edit the just-added John Snow
await page.getByRole('row').nth(1).locator('svg').nth(1).click(); // Click edit icon
const dialog = page.getByRole('dialog');
await expect(dialog.getByLabel('Name')).toHaveValue('John Snow');
await dialog.getByLabel('Name').fill('John Fire');
await dialog.locator('#group').click();
await page.getByRole('option', { name: "Pam's family" }).click();
await dialog.locator('#status').click();
await page.getByRole('option', { name: 'Declined' }).click();
await dialog.getByRole('button', { name: 'Update' }).click();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'John Fire' })).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Pam\'s Family' })).toBeVisible();
await expect(page.getByRole('row').nth(1).getByRole('cell', { name: 'Declined' })).toBeVisible();
await expect(page.getByText('There are 3 elements in the list')).toBeVisible();
// Delete John Fire
page.on('dialog', dialog => dialog.accept());
await page.getByRole('row').nth(1).locator('svg').nth(0).click(); // Click delete icon
await expect(page.getByText('There are 2 elements in the list')).toBeVisible();
}); });

86
tests/mocks/groups.tsx Normal file
View File

@ -0,0 +1,86 @@
import { Page } from "@playwright/test";
export default async function mockGroupsAPI({ page }: { page: Page }): Promise<void> {
page.route('*/**/api/default/groups', async route => {
if (route.request().method() === 'GET') {
const json = [
{
"id": "ee44ffb9-1147-4842-a378-9eaeb0f0871a",
"name": "Pam's family",
"icon": "pi pi-users",
"parent_id": null,
"color": "#ff0000",
"attendance": {
"total": 3,
"considered": 2,
"invited": 1,
"confirmed": 0,
"declined": 0,
"tentative": 0
}
},
{
"id": "c8bda6ca-d8af-4bb8-b2bf-e6ec1c21b1e6",
"name": "Pam's work",
"icon": "pi pi-desktop",
"parent_id": null,
"color": "#00ff00",
"attendance": {
"total": 2,
"considered": 0,
"invited": 0,
"confirmed": 0,
"declined": 0,
"tentative": 2
}
},
];
await route.fulfill({ json })
} else if (route.request().method() === 'POST') {
const json = {
"id": "4d55bc34-6f42-4e2e-82a1-71ae32da2466",
"name": "Pam's 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 })
}
})
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 });
}
});
}

61
tests/mocks/guests.tsx Normal file
View File

@ -0,0 +1,61 @@
import { Page } from "@playwright/test";
export default async function mockGuestsAPI({ page }: { page: Page }): Promise<void> {
page.route('*/**/api/default/guests', async route => {
if (route.request().method() === 'GET') {
const json = [
{
"id": "f4a09c28-40ea-4553-90a5-96935a59cac6",
"status": "tentative",
"name": "Kristofer Rohan DVM",
"group": {
"id": "ee44ffb9-1147-4842-a378-9eaeb0f0871a",
"name": "Pam's family",
}
},
{
"id": "bd585c40-0937-4cde-960a-bb23acfd6f18",
"status": "invited",
"name": "Olevia Quigley Jr.",
"group": {
"id": "c8bda6ca-d8af-4bb8-b2bf-e6ec1c21b1e6",
"name": "Pam's work",
}
},
];
await route.fulfill({ json })
} else if (route.request().method() === 'POST') {
const json = {
"id": "ff58aa2d-643d-4c29-be9c-50e10ae6853c",
"name": "John Snow",
"status": "invited",
"group": {
"id": "c8bda6ca-d8af-4bb8-b2bf-e6ec1c21b1e6",
"name": "Pam's work",
}
};
await route.fulfill({ json });
}
})
page.route("*/**/api/default/guests/*", async route => {
if (route.request().method() === 'PUT') {
const json = {
"id": "ff58aa2d-643d-4c29-be9c-50e10ae6853c",
"name": "John Fire",
"status": "declined",
"group": {
"id": "ee44ffb9-1147-4842-a378-9eaeb0f0871a",
"name": "Pam's family",
}
}
await route.fulfill({ json });
} else if (route.request().method() === 'DELETE') {
const json = {}
await route.fulfill({ json });
}
});
}