Compare commits

..

3 Commits

Author SHA1 Message Date
Renovate Bot
6641a1aaa8 Update dependency @tiptap/pm to v2.24.0
Some checks failed
Add copyright notice / copyright_notice (pull_request) Failing after 30s
Check usage of free licenses / build-static-assets (pull_request) Failing after 41s
Playwright Tests / test (pull_request) Failing after 18s
Build Nginx-based docker image / build-static-assets (push) Successful in 39m8s
2025-07-03 02:08:15 +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
4 changed files with 111 additions and 84 deletions

View File

@ -3,6 +3,7 @@
import { Entity } from '@/app/lib/definitions';
import { getCsrfToken, getSlug } from '@/app/lib/utils';
export interface Api<T extends Entity> {
getAll(serializable: Serializable<T>, callback: (objets: T[]) => void): void;
get(serializable: Serializable<T>, id: string, callback: (object: T) => void): void;
@ -30,6 +31,18 @@ export class AbstractApi<T extends Entity> implements Api<T> {
});
}
getAllPdf(serializable: Serializable<T>, callback: () => void): void {
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)

View File

@ -5,7 +5,7 @@ import clsx from "clsx";
type ButtonColor = 'primary' | 'blue' | 'green' | 'red' | 'yellow' | 'gray';
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-green-500 hover:bg-green-600': type === 'green',
'bg-red-500 hover:bg-red-600': type === 'red',

View File

@ -10,6 +10,7 @@ import { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-d
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,
@ -144,6 +145,12 @@ export default function InvitationsBoard({ guests, invitations: originalInvitati
});
}
function handleDownloadQrCodes() {
api.getAllPdf(serializer, () => {
console.log("QR codes downloaded");
});
}
return (
<div className="flex h-screen">
{/* Left Column: Guests */}
@ -164,11 +171,18 @@ export default function InvitationsBoard({ guests, invitations: originalInvitati
<button
onClick={handleCreateInvitation}
className="mb-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
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">

164
pnpm-lock.yaml generated
View File

@ -19,10 +19,10 @@ importers:
version: 0.5.10(tailwindcss@3.4.17)
'@tiptap/pm':
specifier: ^2.14.0
version: 2.23.1
version: 2.24.0
'@tiptap/react':
specifier: ^2.14.0
version: 2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)
version: 2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)
'@tiptap/starter-kit':
specifier: ^2.14.0
version: 2.14.0
@ -485,8 +485,8 @@ packages:
peerDependencies:
'@tiptap/core': ^2.7.0
'@tiptap/pm@2.23.1':
resolution: {integrity: sha512-iAx4rP0k4Xd9Ywh+Gpaz5IWfY2CYRpiwVXWekTHLlNRFtrVIWVpMxaQr2mvRU2g0Ca6rz5w3KzkHBMqrI3dIBA==}
'@tiptap/pm@2.24.0':
resolution: {integrity: sha512-rjvy3LmNweyDU/ttqQd+fi4A29KbcqNiQ/oWvzv7JNPS9bh4WmuSeWvlNfivo39hHXe46OQhzRVJrSAvyKp+wQ==}
'@tiptap/react@2.22.3':
resolution: {integrity: sha512-Te6e6/carhUAavcJgxC03rffLAZz1or4cjnRDFNF8G4vPOqkNgQd368N47wTMjwh5mQTdMUUI3ToZIpc45Q7Tw==}
@ -1592,104 +1592,104 @@ snapshots:
mini-svg-data-uri: 1.4.4
tailwindcss: 3.4.17
'@tiptap/core@2.14.0(@tiptap/pm@2.23.1)':
'@tiptap/core@2.14.0(@tiptap/pm@2.24.0)':
dependencies:
'@tiptap/pm': 2.23.1
'@tiptap/pm': 2.24.0
'@tiptap/extension-blockquote@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-blockquote@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-bold@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-bold@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-bubble-menu@2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)':
'@tiptap/extension-bubble-menu@2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/pm': 2.23.1
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/pm': 2.24.0
tippy.js: 6.3.7
'@tiptap/extension-bullet-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-bullet-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-code-block@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)':
'@tiptap/extension-code-block@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/pm': 2.23.1
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/pm': 2.24.0
'@tiptap/extension-code@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-code@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-document@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-document@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-dropcursor@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)':
'@tiptap/extension-dropcursor@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/pm': 2.23.1
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/pm': 2.24.0
'@tiptap/extension-floating-menu@2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)':
'@tiptap/extension-floating-menu@2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/pm': 2.23.1
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/pm': 2.24.0
tippy.js: 6.3.7
'@tiptap/extension-gapcursor@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)':
'@tiptap/extension-gapcursor@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/pm': 2.23.1
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/pm': 2.24.0
'@tiptap/extension-hard-break@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-hard-break@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-heading@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-heading@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-history@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)':
'@tiptap/extension-history@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/pm': 2.23.1
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/pm': 2.24.0
'@tiptap/extension-horizontal-rule@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)':
'@tiptap/extension-horizontal-rule@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/pm': 2.23.1
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/pm': 2.24.0
'@tiptap/extension-italic@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-italic@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-list-item@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-list-item@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-ordered-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-ordered-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-paragraph@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-paragraph@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-strike@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-strike@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-text-style@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-text-style@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-text@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))':
'@tiptap/extension-text@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/pm@2.23.1':
'@tiptap/pm@2.24.0':
dependencies:
prosemirror-changeset: 2.3.1
prosemirror-collab: 1.3.1
@ -1710,12 +1710,12 @@ snapshots:
prosemirror-transform: 1.10.4
prosemirror-view: 1.40.0
'@tiptap/react@2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)':
'@tiptap/react@2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/extension-bubble-menu': 2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)
'@tiptap/extension-floating-menu': 2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)
'@tiptap/pm': 2.23.1
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-bubble-menu': 2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)
'@tiptap/extension-floating-menu': 2.22.3(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)
'@tiptap/pm': 2.24.0
'@types/use-sync-external-store': 0.0.6
fast-deep-equal: 3.1.3
react: 19.0.0-rc-f38c22b244-20240704
@ -1724,27 +1724,27 @@ snapshots:
'@tiptap/starter-kit@2.14.0':
dependencies:
'@tiptap/core': 2.14.0(@tiptap/pm@2.23.1)
'@tiptap/extension-blockquote': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-bold': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-bullet-list': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-code': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-code-block': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)
'@tiptap/extension-document': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-dropcursor': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)
'@tiptap/extension-gapcursor': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)
'@tiptap/extension-hard-break': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-heading': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-history': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)
'@tiptap/extension-horizontal-rule': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))(@tiptap/pm@2.23.1)
'@tiptap/extension-italic': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-list-item': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-ordered-list': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-paragraph': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-strike': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-text': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/extension-text-style': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.23.1))
'@tiptap/pm': 2.23.1
'@tiptap/core': 2.14.0(@tiptap/pm@2.24.0)
'@tiptap/extension-blockquote': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-bold': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-bullet-list': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-code': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-code-block': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)
'@tiptap/extension-document': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-dropcursor': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)
'@tiptap/extension-gapcursor': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)
'@tiptap/extension-hard-break': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-heading': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-history': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)
'@tiptap/extension-horizontal-rule': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))(@tiptap/pm@2.24.0)
'@tiptap/extension-italic': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-list-item': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-ordered-list': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-paragraph': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-strike': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-text': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/extension-text-style': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.24.0))
'@tiptap/pm': 2.24.0
'@types/bcrypt@5.0.2':
dependencies: