Compare commits
9 Commits
7b4f7dff0c
...
4799ed66f3
Author | SHA1 | Date | |
---|---|---|---|
|
4799ed66f3 | ||
283d90c707 | |||
066cab9da8 | |||
eddb1cab37 | |||
fba1b81b4c | |||
ad0b09c3df | |||
98d3afcd8e | |||
b4cfd91ff4 | |||
|
f68587419d |
@ -7,6 +7,7 @@ import { loadGuests } from '@/app/api/guests';
|
||||
import { Group, Guest } from '@/app/lib/definitions';
|
||||
import { classNames } from '@/app/ui/components/button';
|
||||
import GuestFormDialog from '@/app/ui/components/guest-form-dialog';
|
||||
import GroupFormDialog from '@/app/ui/components/group-form-dialog';
|
||||
import GroupsTable from '@/app/ui/groups/table';
|
||||
import SkeletonTable from '@/app/ui/guests/skeleton-row';
|
||||
import GuestsTable from '@/app/ui/guests/table';
|
||||
@ -31,6 +32,7 @@ export default function Page() {
|
||||
|
||||
const [groupsLoaded, setGroupsLoaded] = useState(false);
|
||||
const [groups, setGroups] = useState<Array<Group>>([]);
|
||||
const [groupBeingEdited, setGroupBeingEdited] = useState<Group | undefined>(undefined);
|
||||
|
||||
const [guestsLoaded, setGuestsLoaded] = useState(false);
|
||||
const [guests, setGuests] = useState<Array<Guest>>([]);
|
||||
@ -54,14 +56,33 @@ export default function Page() {
|
||||
onHide={() => { setGuestBeingEdited(undefined) }}
|
||||
/>
|
||||
<Suspense fallback={<SkeletonTable />}>
|
||||
<GuestsTable guests={guests} onUpdate={refreshGuests} onEdit={(guest) => setGuestBeingEdited(guest)} />
|
||||
<GuestsTable
|
||||
guests={guests}
|
||||
onUpdate={refreshGuests}
|
||||
onEdit={(guest) => setGuestBeingEdited(guest)}
|
||||
/>
|
||||
</Suspense>
|
||||
</div>
|
||||
</ TabPanel>
|
||||
<TabPanel header="Groups" leftIcon="pi pi-sitemap mx-2">
|
||||
<div className="flex w-full items-center justify-between">
|
||||
<div className="flex flex-col w-full items-center justify-between">
|
||||
|
||||
<button onClick={() => setGroupBeingEdited({})} className={classNames('primary')}>Add new</button>
|
||||
<GroupFormDialog
|
||||
key={groupBeingEdited?.id}
|
||||
groups={groups}
|
||||
onCreate={() => { refreshGroups(); setGroupBeingEdited(undefined) }}
|
||||
group={groupBeingEdited}
|
||||
visible={groupBeingEdited !== undefined}
|
||||
onHide={() => { setGroupBeingEdited(undefined) }}
|
||||
/>
|
||||
|
||||
<Suspense fallback={<SkeletonTable />}>
|
||||
<GroupsTable groups={groups} />
|
||||
<GroupsTable
|
||||
groups={groups}
|
||||
onUpdate={refreshGroups}
|
||||
onEdit={(group) => setGroupBeingEdited(group)}
|
||||
/>
|
||||
</Suspense>
|
||||
</div>
|
||||
</ TabPanel>
|
||||
|
@ -5,10 +5,22 @@
|
||||
import LoginForm from '@/app/ui/components/login-form';
|
||||
import RegistrationForm from '@/app/ui/components/registration-form';
|
||||
import { useParams } from 'next/navigation'
|
||||
import { useEffect } from 'react';
|
||||
import { retrieveCSRFToken } from '../api/authentication';
|
||||
import { getCsrfToken } from '../lib/utils';
|
||||
|
||||
export default async function Page() {
|
||||
const params = useParams<{ slug: string }>()
|
||||
|
||||
useEffect(() => {
|
||||
if (getCsrfToken() == 'unknown') {
|
||||
retrieveCSRFToken();
|
||||
}
|
||||
}, []);
|
||||
|
||||
if (typeof window !== 'undefined') {
|
||||
localStorage.setItem('slug', await params.slug);
|
||||
}
|
||||
|
||||
return (
|
||||
<main className="flex min-h-screen flex-col p-6">
|
||||
|
@ -43,6 +43,15 @@ function flattenErrors(errors: StructuredErrors): string[] {
|
||||
});
|
||||
}
|
||||
|
||||
// At this moment we're making an initial request to get a valid CSRF token
|
||||
export function retrieveCSRFToken() {
|
||||
return fetch(`/api/token`, {
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
}
|
||||
}).then((response) => { return null });
|
||||
}
|
||||
|
||||
export function register({ slug, email, password, passwordConfirmation, captcha, onRegister, onError }: {
|
||||
slug: string,
|
||||
email: string,
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* Copyright (C) 2024 Manuel Bustillo*/
|
||||
|
||||
import { Group } from '@/app/lib/definitions';
|
||||
import { getSlug } from '../lib/utils';
|
||||
import { getCsrfToken, getSlug } from '../lib/utils';
|
||||
|
||||
export function loadGroups(onLoad?: (groups: Group[]) => void) {
|
||||
fetch(`/api/${getSlug()}/groups`)
|
||||
@ -26,3 +26,56 @@ export function loadGroups(onLoad?: (groups: Group[]) => void) {
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
export function updateGroup(group: Group) {
|
||||
return fetch(`/api/${getSlug()}/groups/${group.id}`,
|
||||
{
|
||||
method: 'PUT',
|
||||
body: JSON.stringify({ group: {
|
||||
name: group.name,
|
||||
color: group.color,
|
||||
icon: group.icon,
|
||||
parent_id: group.parentId
|
||||
} }),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-CSRF-TOKEN': getCsrfToken(),
|
||||
}
|
||||
})
|
||||
.catch((error) => console.error(error));
|
||||
}
|
||||
|
||||
export function createGroup(group: Group, onCreate?: () => void) {
|
||||
fetch(`/api/${getSlug()}/groups`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
name: group.name,
|
||||
color: group.color,
|
||||
icon: group.icon,
|
||||
parent_id: group.parentId
|
||||
}),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-CSRF-TOKEN': getCsrfToken(),
|
||||
}
|
||||
})
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
onCreate && onCreate();
|
||||
})
|
||||
.catch((error) => console.error(error));
|
||||
}
|
||||
|
||||
export function destroyGroup(group: Group, onDestroy?: () => void) {
|
||||
fetch(`/api/${getSlug()}/groups/${group.id}`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': getCsrfToken(),
|
||||
}
|
||||
})
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
onDestroy && onDestroy();
|
||||
})
|
||||
.catch((error) => console.error(error));
|
||||
}
|
@ -32,11 +32,12 @@ export type TableArrangement = {
|
||||
}
|
||||
|
||||
export type Group = {
|
||||
id: string;
|
||||
name: string;
|
||||
guest_count: number;
|
||||
icon: string;
|
||||
children: Group[];
|
||||
id?: string;
|
||||
name?: string;
|
||||
guest_count?: number;
|
||||
icon?: string;
|
||||
children?: Group[];
|
||||
parentId?: string;
|
||||
color?: string;
|
||||
attendance?: AttendanceSummary
|
||||
};
|
||||
|
@ -6,13 +6,14 @@ import React, { useState } from 'react';
|
||||
import { TableArrangement, Guest } from '@/app/lib/definitions';
|
||||
import { lusitana } from '@/app/ui/fonts';
|
||||
import { Table } from '@/app/ui/components/table';
|
||||
import { getSlug } from '@/app/lib/utils';
|
||||
|
||||
export default function Arrangement({ id }: { id: string }) {
|
||||
|
||||
const [tables, setTables] = useState<Array<TableArrangement>>([]);
|
||||
|
||||
function loadTables() {
|
||||
fetch(`/api/tables_arrangements/${id}`)
|
||||
fetch(`/api/${getSlug()}/tables_arrangements/${id}`)
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
setTables(data.map((record: any) => {
|
||||
|
91
app/ui/components/group-form-dialog.tsx
Normal file
91
app/ui/components/group-form-dialog.tsx
Normal file
@ -0,0 +1,91 @@
|
||||
/* Copyright (C) 2024 Manuel Bustillo*/
|
||||
|
||||
'use client';
|
||||
|
||||
import { createGroup, updateGroup } from '@/app/api/groups';
|
||||
import { Group } from '@/app/lib/definitions';
|
||||
import { classNames } from '@/app/ui/components/button';
|
||||
import { Dialog } from 'primereact/dialog';
|
||||
import { ColorPicker } from 'primereact/colorpicker';
|
||||
import { Dropdown } from 'primereact/dropdown';
|
||||
import { FloatLabel } from 'primereact/floatlabel';
|
||||
import { InputText } from 'primereact/inputtext';
|
||||
import { useState } from 'react';
|
||||
|
||||
export default function GroupFormDialog({groups, onCreate, onHide, group, visible }: {
|
||||
groups: Group[],
|
||||
onCreate?: () => void,
|
||||
onHide: () => void,
|
||||
group?: Group,
|
||||
visible: boolean,
|
||||
}) {
|
||||
|
||||
const [name, setName] = useState(group?.name || '');
|
||||
const [icon, setIcon] = useState(group?.icon || '');
|
||||
const [color, setColor] = useState<string>(group?.color || '');
|
||||
const [parentId, setParentId] = useState(group?.parentId || '');
|
||||
|
||||
function resetForm() {
|
||||
setName('');
|
||||
setIcon('');
|
||||
setColor('');
|
||||
setParentId('');
|
||||
}
|
||||
|
||||
function submitGroup() {
|
||||
if (!(name)) {
|
||||
return
|
||||
}
|
||||
|
||||
if (group?.id !== undefined) {
|
||||
group.name = name;
|
||||
group.icon = icon;
|
||||
group.color = color;
|
||||
group.parentId = parentId;
|
||||
|
||||
updateGroup(group).then(() => {
|
||||
resetForm();
|
||||
onCreate && onCreate();
|
||||
});
|
||||
} else {
|
||||
group && createGroup({name, icon, color, parentId}, () => {
|
||||
resetForm();
|
||||
onCreate && onCreate();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
|
||||
<Dialog header="Add group" visible={visible} style={{ width: '60vw' }} onHide={onHide}>
|
||||
<div className="card flex justify-evenly py-5">
|
||||
<FloatLabel>
|
||||
<InputText id="name" className='rounded-sm' value={name} onChange={(e) => setName(e.target.value)} />
|
||||
<label htmlFor="name">Name</label>
|
||||
</FloatLabel>
|
||||
<FloatLabel>
|
||||
<InputText id="icon" className='rounded-sm' value={icon} onChange={(e) => setIcon(e.target.value)} />
|
||||
<label htmlFor="icon">Icon</label>
|
||||
</FloatLabel>
|
||||
<FloatLabel>
|
||||
<ColorPicker value={color} format='hex' onChange={(e) => setColor(`#${e.value}`)} />
|
||||
<label htmlFor="color" />
|
||||
</FloatLabel>
|
||||
<FloatLabel>
|
||||
<Dropdown id="parentId" className='rounded-sm min-w-32' value={parentId} onChange={(e) => setParentId(e.target.value)} options={
|
||||
groups.map((group) => {
|
||||
return { label: group.name, value: group.id };
|
||||
})
|
||||
} />
|
||||
<label htmlFor="parentId">Parent</label>
|
||||
</FloatLabel>
|
||||
|
||||
<button className={classNames('primary')} onClick={submitGroup} disabled={!(name.length > 0)}>
|
||||
{group?.id !== undefined ? 'Update' : 'Create'}
|
||||
</button>
|
||||
</div>
|
||||
</Dialog>
|
||||
</>
|
||||
);
|
||||
}
|
@ -54,7 +54,7 @@ export default function GuestFormDialog({ groups, onCreate, onHide, guest, visib
|
||||
return (
|
||||
<>
|
||||
|
||||
<Dialog header="Add guest" visible={visible} style={{ width: '50vw' }} onHide={onHide}>
|
||||
<Dialog header="Add guest" visible={visible} style={{ width: '60vw' }} onHide={onHide}>
|
||||
<div className="card flex justify-evenly py-5">
|
||||
<FloatLabel>
|
||||
<InputText id="username" className='rounded-sm' value={name} onChange={(e) => setName(e.target.value)} />
|
||||
|
@ -4,12 +4,18 @@
|
||||
|
||||
import { Group } from '@/app/lib/definitions';
|
||||
import TableOfContents from '../components/table-of-contents';
|
||||
import { PencilIcon, TrashIcon } from '@heroicons/react/24/outline';
|
||||
import { destroyGroup } from '@/app/api/groups';
|
||||
|
||||
export default function GroupsTable({ groups }: { groups: Group[] }) {
|
||||
export default function GroupsTable({ groups, onUpdate, onEdit }: {
|
||||
groups: Group[],
|
||||
onUpdate: () => void,
|
||||
onEdit: (group: Group) => void,
|
||||
}) {
|
||||
|
||||
return (
|
||||
<TableOfContents
|
||||
headers={['Name', 'Color', 'Confirmed', 'Tentative', 'Pending', 'Declined', 'Considered', 'Total']}
|
||||
headers={['Name', 'Color', 'Confirmed', 'Tentative', 'Pending', 'Declined', 'Considered', 'Total', 'Actions']}
|
||||
caption='Groups'
|
||||
elements={groups}
|
||||
rowRender={(group) => (
|
||||
@ -38,6 +44,12 @@ export default function GroupsTable({ groups }: { groups: Group[] }) {
|
||||
<td className="px-6 text-sm">
|
||||
{group.attendance?.total}
|
||||
</td>
|
||||
<td>
|
||||
<div className="flex flex-row items-center">
|
||||
<TrashIcon className='size-6 cursor-pointer' onClick={() => { destroyGroup(group, () => onUpdate()) }} />
|
||||
<PencilIcon className='size-6 cursor-pointer' onClick={() => onEdit(group)} />
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
)}
|
||||
/>
|
||||
|
@ -11,7 +11,7 @@
|
||||
"autoprefixer": "10.4.20",
|
||||
"bcrypt": "^5.1.1",
|
||||
"clsx": "^2.1.1",
|
||||
"next": "15.0.3",
|
||||
"next": "15.0.4",
|
||||
"next-auth": "5.0.0-beta.25",
|
||||
"postcss": "8.4.49",
|
||||
"primeicons": "^7.0.0",
|
||||
@ -33,5 +33,5 @@
|
||||
"engines": {
|
||||
"node": ">=23.0.0"
|
||||
},
|
||||
"packageManager": "pnpm@9.14.4+sha512.c8180b3fbe4e4bca02c94234717896b5529740a6cbadf19fa78254270403ea2f27d4e1d46a08a0f56c89b63dc8ebfd3ee53326da720273794e6200fcf0d184ab"
|
||||
"packageManager": "pnpm@9.15.0+sha512.76e2379760a4328ec4415815bcd6628dee727af3779aaa4c914e3944156c4299921a89f976381ee107d41f12cfa4b66681ca9c718f0668fa0831ed4c6d8ba56c"
|
||||
}
|
||||
|
92
pnpm-lock.yaml
generated
92
pnpm-lock.yaml
generated
@ -24,11 +24,11 @@ importers:
|
||||
specifier: ^2.1.1
|
||||
version: 2.1.1
|
||||
next:
|
||||
specifier: 15.0.3
|
||||
version: 15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)
|
||||
specifier: 15.0.4
|
||||
version: 15.0.4(@playwright/test@1.49.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)
|
||||
next-auth:
|
||||
specifier: 5.0.0-beta.25
|
||||
version: 5.0.0-beta.25(next@15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)
|
||||
version: 5.0.0-beta.25(next@15.0.4(@playwright/test@1.49.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)
|
||||
postcss:
|
||||
specifier: 8.4.49
|
||||
version: 8.4.49
|
||||
@ -236,53 +236,53 @@ packages:
|
||||
resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
|
||||
hasBin: true
|
||||
|
||||
'@next/env@15.0.3':
|
||||
resolution: {integrity: sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==}
|
||||
'@next/env@15.0.4':
|
||||
resolution: {integrity: sha512-WNRvtgnRVDD4oM8gbUcRc27IAhaL4eXQ/2ovGbgLnPGUvdyDr8UdXP4Q/IBDdAdojnD2eScryIDirv0YUCjUVw==}
|
||||
|
||||
'@next/swc-darwin-arm64@15.0.3':
|
||||
resolution: {integrity: sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw==}
|
||||
'@next/swc-darwin-arm64@15.0.4':
|
||||
resolution: {integrity: sha512-QecQXPD0yRHxSXWL5Ff80nD+A56sUXZG9koUsjWJwA2Z0ZgVQfuy7gd0/otjxoOovPVHR2eVEvPMHbtZP+pf9w==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@next/swc-darwin-x64@15.0.3':
|
||||
resolution: {integrity: sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==}
|
||||
'@next/swc-darwin-x64@15.0.4':
|
||||
resolution: {integrity: sha512-pb7Bye3y1Og3PlCtnz2oO4z+/b3pH2/HSYkLbL0hbVuTGil7fPen8/3pyyLjdiTLcFJ+ymeU3bck5hd4IPFFCA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@next/swc-linux-arm64-gnu@15.0.3':
|
||||
resolution: {integrity: sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==}
|
||||
'@next/swc-linux-arm64-gnu@15.0.4':
|
||||
resolution: {integrity: sha512-12oSaBFjGpB227VHzoXF3gJoK2SlVGmFJMaBJSu5rbpaoT5OjP5OuCLuR9/jnyBF1BAWMs/boa6mLMoJPRriMA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@next/swc-linux-arm64-musl@15.0.3':
|
||||
resolution: {integrity: sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==}
|
||||
'@next/swc-linux-arm64-musl@15.0.4':
|
||||
resolution: {integrity: sha512-QARO88fR/a+wg+OFC3dGytJVVviiYFEyjc/Zzkjn/HevUuJ7qGUUAUYy5PGVWY1YgTzeRYz78akQrVQ8r+sMjw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@next/swc-linux-x64-gnu@15.0.3':
|
||||
resolution: {integrity: sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==}
|
||||
'@next/swc-linux-x64-gnu@15.0.4':
|
||||
resolution: {integrity: sha512-Z50b0gvYiUU1vLzfAMiChV8Y+6u/T2mdfpXPHraqpypP7yIT2UV9YBBhcwYkxujmCvGEcRTVWOj3EP7XW/wUnw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@next/swc-linux-x64-musl@15.0.3':
|
||||
resolution: {integrity: sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==}
|
||||
'@next/swc-linux-x64-musl@15.0.4':
|
||||
resolution: {integrity: sha512-7H9C4FAsrTAbA/ENzvFWsVytqRYhaJYKa2B3fyQcv96TkOGVMcvyS6s+sj4jZlacxxTcn7ygaMXUPkEk7b78zw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@next/swc-win32-arm64-msvc@15.0.3':
|
||||
resolution: {integrity: sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==}
|
||||
'@next/swc-win32-arm64-msvc@15.0.4':
|
||||
resolution: {integrity: sha512-Z/v3WV5xRaeWlgJzN9r4PydWD8sXV35ywc28W63i37G2jnUgScA4OOgS8hQdiXLxE3gqfSuHTicUhr7931OXPQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@next/swc-win32-x64-msvc@15.0.3':
|
||||
resolution: {integrity: sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==}
|
||||
'@next/swc-win32-x64-msvc@15.0.4':
|
||||
resolution: {integrity: sha512-NGLchGruagh8lQpDr98bHLyWJXOBSmkEAfK980OiNBa7vNm6PsNoPvzTfstT78WyOeMRQphEQ455rggd7Eo+Dw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
@ -735,16 +735,16 @@ packages:
|
||||
nodemailer:
|
||||
optional: true
|
||||
|
||||
next@15.0.3:
|
||||
resolution: {integrity: sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==}
|
||||
next@15.0.4:
|
||||
resolution: {integrity: sha512-nuy8FH6M1FG0lktGotamQDCXhh5hZ19Vo0ht1AOIQWrYJLP598TIUagKtvJrfJ5AGwB/WmDqkKaKhMpVifvGPA==}
|
||||
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
'@opentelemetry/api': ^1.1.0
|
||||
'@playwright/test': ^1.41.2
|
||||
babel-plugin-react-compiler: '*'
|
||||
react: ^18.2.0 || 19.0.0-rc-66855b96-20241106
|
||||
react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106
|
||||
react: ^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0
|
||||
react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0
|
||||
sass: ^1.3.0
|
||||
peerDependenciesMeta:
|
||||
'@opentelemetry/api':
|
||||
@ -1294,30 +1294,30 @@ snapshots:
|
||||
- encoding
|
||||
- supports-color
|
||||
|
||||
'@next/env@15.0.3': {}
|
||||
'@next/env@15.0.4': {}
|
||||
|
||||
'@next/swc-darwin-arm64@15.0.3':
|
||||
'@next/swc-darwin-arm64@15.0.4':
|
||||
optional: true
|
||||
|
||||
'@next/swc-darwin-x64@15.0.3':
|
||||
'@next/swc-darwin-x64@15.0.4':
|
||||
optional: true
|
||||
|
||||
'@next/swc-linux-arm64-gnu@15.0.3':
|
||||
'@next/swc-linux-arm64-gnu@15.0.4':
|
||||
optional: true
|
||||
|
||||
'@next/swc-linux-arm64-musl@15.0.3':
|
||||
'@next/swc-linux-arm64-musl@15.0.4':
|
||||
optional: true
|
||||
|
||||
'@next/swc-linux-x64-gnu@15.0.3':
|
||||
'@next/swc-linux-x64-gnu@15.0.4':
|
||||
optional: true
|
||||
|
||||
'@next/swc-linux-x64-musl@15.0.3':
|
||||
'@next/swc-linux-x64-musl@15.0.4':
|
||||
optional: true
|
||||
|
||||
'@next/swc-win32-arm64-msvc@15.0.3':
|
||||
'@next/swc-win32-arm64-msvc@15.0.4':
|
||||
optional: true
|
||||
|
||||
'@next/swc-win32-x64-msvc@15.0.3':
|
||||
'@next/swc-win32-x64-msvc@15.0.4':
|
||||
optional: true
|
||||
|
||||
'@nodelib/fs.scandir@2.1.5':
|
||||
@ -1729,15 +1729,15 @@ snapshots:
|
||||
|
||||
nanoid@3.3.7: {}
|
||||
|
||||
next-auth@5.0.0-beta.25(next@15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704):
|
||||
next-auth@5.0.0-beta.25(next@15.0.4(@playwright/test@1.49.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704):
|
||||
dependencies:
|
||||
'@auth/core': 0.37.2
|
||||
next: 15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)
|
||||
next: 15.0.4(@playwright/test@1.49.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704)
|
||||
react: 19.0.0-rc-f38c22b244-20240704
|
||||
|
||||
next@15.0.3(@playwright/test@1.49.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704):
|
||||
next@15.0.4(@playwright/test@1.49.0)(react-dom@19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704))(react@19.0.0-rc-f38c22b244-20240704):
|
||||
dependencies:
|
||||
'@next/env': 15.0.3
|
||||
'@next/env': 15.0.4
|
||||
'@swc/counter': 0.1.3
|
||||
'@swc/helpers': 0.5.13
|
||||
busboy: 1.6.0
|
||||
@ -1747,14 +1747,14 @@ snapshots:
|
||||
react-dom: 19.0.0-rc-f38c22b244-20240704(react@19.0.0-rc-f38c22b244-20240704)
|
||||
styled-jsx: 5.1.6(react@19.0.0-rc-f38c22b244-20240704)
|
||||
optionalDependencies:
|
||||
'@next/swc-darwin-arm64': 15.0.3
|
||||
'@next/swc-darwin-x64': 15.0.3
|
||||
'@next/swc-linux-arm64-gnu': 15.0.3
|
||||
'@next/swc-linux-arm64-musl': 15.0.3
|
||||
'@next/swc-linux-x64-gnu': 15.0.3
|
||||
'@next/swc-linux-x64-musl': 15.0.3
|
||||
'@next/swc-win32-arm64-msvc': 15.0.3
|
||||
'@next/swc-win32-x64-msvc': 15.0.3
|
||||
'@next/swc-darwin-arm64': 15.0.4
|
||||
'@next/swc-darwin-x64': 15.0.4
|
||||
'@next/swc-linux-arm64-gnu': 15.0.4
|
||||
'@next/swc-linux-arm64-musl': 15.0.4
|
||||
'@next/swc-linux-x64-gnu': 15.0.4
|
||||
'@next/swc-linux-x64-musl': 15.0.4
|
||||
'@next/swc-win32-arm64-msvc': 15.0.4
|
||||
'@next/swc-win32-x64-msvc': 15.0.4
|
||||
'@playwright/test': 1.49.0
|
||||
sharp: 0.33.5
|
||||
transitivePeerDependencies:
|
||||
|
Loading…
x
Reference in New Issue
Block a user