diff --git a/app/(main)/request/CartPage.module.css b/app/(main)/request/CartPage.module.css index ec018b2b..dfbfb4b3 100644 --- a/app/(main)/request/CartPage.module.css +++ b/app/(main)/request/CartPage.module.css @@ -1,9 +1,11 @@ .itemsCard { - width: 36.0625rem; + width: 100%; + min-width: 36.0625rem; height: auto; background: #fff; filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.05)); border-radius: 0.9375rem; + margin-bottom: 1rem; } .itemsCardHeader { diff --git a/app/(main)/request/[storeId]/cart/page.tsx b/app/(main)/request/[storeId]/cart/page.tsx index d4076f0b..862621b4 100644 --- a/app/(main)/request/[storeId]/cart/page.tsx +++ b/app/(main)/request/[storeId]/cart/page.tsx @@ -6,6 +6,7 @@ import Breadcrumbs from '@/app/(main)/components/Breadcrumbs'; import Link from 'next/link'; import TicketDestStoreDropdown from '@/app/(main)/components/TicketDestStoreDropdown'; import { Store } from '@/app/types/store'; +import AddOutOfStockToCartForm from '@/app/(main)/request/components/AddOutOfStockToCartForm'; export default async function CartPage({ params, @@ -70,6 +71,10 @@ export default async function CartPage({

0 in-stock · 0 out-of-stock

+
+

Out-of-Stock Request

+ +
); } @@ -115,18 +120,6 @@ export default async function CartPage({ }} />

Cart

- {hasItems ? ( -
-

Ticket Destination Store:

- ({ - store, - }))} - /> -
- ) : null} {showSuccess && (

Ticket submitted successfully!

@@ -135,7 +128,23 @@ export default async function CartPage({ )}
- {hasItems ? : null} +
+

Out-of-Stock Request

+ +
+ {hasItems ? ( +
+

Ticket Destination Store:

+ ({ + store, + }))} + /> + +
+ ) : null}
); diff --git a/app/(main)/request/[storeId]/page.tsx b/app/(main)/request/[storeId]/page.tsx index a759dfe9..98db603d 100644 --- a/app/(main)/request/[storeId]/page.tsx +++ b/app/(main)/request/[storeId]/page.tsx @@ -3,7 +3,6 @@ import ItemCard from '@/app/(main)/components/ItemCard'; import ItemSearch from '@/app/(main)/components/ItemSearch'; import Breadcrumbs from '@/app/(main)/components/Breadcrumbs'; import Link from 'next/link'; -import AddOutOfStockToCartForm from '@/app/(main)/request/components/AddOutOfStockToCartForm'; import styles from '@/app/(main)/request/Cart.module.css'; import Image from 'next/image'; import pinIcon from '@/public/pin-icon.svg'; @@ -152,8 +151,6 @@ export default async function RequestStorePage({ })) || [] } /> -

Out-of-Stock Request

-

In-Stock Items

{items && items.length > 0 ? (
diff --git a/app/(main)/request/all/Accordion.module.css b/app/(main)/request/all/Accordion.module.css new file mode 100644 index 00000000..8ee0159c --- /dev/null +++ b/app/(main)/request/all/Accordion.module.css @@ -0,0 +1,18 @@ +.accordionSpacing { + margin-bottom: 1rem; +} + +.accordionBody { + background-color: transparent; + border: none; +} + +.accordionHeader :global(.accordion-button) { + box-shadow: none; + border: none; +} + +.accordionBodySpacing { + padding-left: 0; + padding-right: 0; +} diff --git a/app/(main)/request/all/cart/page.tsx b/app/(main)/request/all/cart/page.tsx index 41fb490f..ef673db3 100644 --- a/app/(main)/request/all/cart/page.tsx +++ b/app/(main)/request/all/cart/page.tsx @@ -1,13 +1,15 @@ import { createClient } from '@/app/lib/supabase/server-client'; import TicketItemsList from '@/app/(main)/components/TicketItemsList'; import SubmitTicketButton from '@/app/(main)/request/components/SubmitTicketButton'; -import Link from 'next/link'; import styles from '@/app/(main)/request/CartPage.module.css'; import Accordion from 'react-bootstrap/Accordion'; import AccordionBody from 'react-bootstrap/AccordionBody'; import AccordionHeader from 'react-bootstrap/AccordionHeader'; import AccordionItem from 'react-bootstrap/AccordionItem'; import Breadcrumbs from '@/app/(main)/components/Breadcrumbs'; +import TicketDestStoreDropdown from '@/app/(main)/components/TicketDestStoreDropdown'; +import accordionStyles from '@/app/(main)/request/all/Accordion.module.css'; +import AddOutOfStockToCartForm from '@/app/(main)/request/components/AddOutOfStockToCartForm'; type DraftTicket = { ticket_id: string; @@ -17,13 +19,7 @@ type DraftTicket = { }[]; }; -export default async function AllCartsPage({ - searchParams, -}: { - searchParams: Promise<{ submitted?: string; ticketId?: string }>; -}) { - const { submitted, ticketId } = await searchParams; - const showSuccess = submitted === '1' && !!ticketId; +export default async function AllCartsPage() { const supabase = await createClient(); // Get the current user @@ -38,7 +34,7 @@ export default async function AllCartsPage({ // Fetch stores const { data: stores, error: storesError } = await supabase .from('stores') - .select('store_id, name') + .select('store_id, name, street_address') .order('name'); if (storesError || !stores) { @@ -69,9 +65,14 @@ export default async function AllCartsPage({ {sortedStores.map((store) => { return ( - - {store.name} - + + + {store.name} + +

ITEMS

@@ -116,29 +117,52 @@ export default async function AllCartsPage({ return ( - - {store.name} - - {showSuccess && ( -
-

Ticket submitted successfully!

- - Go to ticket - -
- )} + + + {store.name} + + {draftTicket ? (
+
+

Out-of-Stock Request

+ +
{draftTicket.ticket_items[0].count > 0 ? ( - +
+

Ticket Destination Store:

+ s.store_id !== store.store_id) + .map((s) => ({ + store: { + store_id: s.store_id, + name: s.name, + street_address: s.street_address, + }, + }))} + /> + +
) : null}
) : ( -
-
-

ITEMS

-

0 in-stock · 0 out-of-stock

+
+
+
+

ITEMS

+

0 in-stock · 0 out-of-stock

+
+
+
+

Out-of-Stock Request

+
)} diff --git a/app/(main)/request/all/page.tsx b/app/(main)/request/all/page.tsx index 949832a4..e737d971 100644 --- a/app/(main)/request/all/page.tsx +++ b/app/(main)/request/all/page.tsx @@ -2,7 +2,6 @@ import { createClient } from '@/app/lib/supabase/server-client'; import ItemSearch from '@/app/(main)/components/ItemSearch'; import ItemCard from '@/app/(main)/components/ItemCard'; import Link from 'next/link'; -import AddOutOfStockToCartForm from '@/app/(main)/request/components/AddOutOfStockToCartForm'; import Accordion from 'react-bootstrap/Accordion'; import AccordionBody from 'react-bootstrap/AccordionBody'; import AccordionHeader from 'react-bootstrap/AccordionHeader'; @@ -11,6 +10,7 @@ import Breadcrumbs from '@/app/(main)/components/Breadcrumbs'; import styles from '@/app/(main)/request/Cart.module.css'; import Image from 'next/image'; import cartIcon from '@/public/cart-icon.svg'; +import accordionStyles from '@/app/(main)/request/all/Accordion.module.css'; type SearchParams = { query?: string; @@ -169,11 +169,14 @@ export default async function RequestAllStoresPage({ const storeItems = itemsByStore.get(store.store_id) || []; return ( - - {store.name} - -

Out-of-Stock Request

- + + + {store.name} + + {storeItems.length > 0 ? (

In-Stock Items

diff --git a/app/(main)/request/components/SubmitTicketButton.tsx b/app/(main)/request/components/SubmitTicketButton.tsx index 36d6a489..2cb18570 100644 --- a/app/(main)/request/components/SubmitTicketButton.tsx +++ b/app/(main)/request/components/SubmitTicketButton.tsx @@ -1,27 +1,15 @@ 'use client'; import { useState, useTransition } from 'react'; import { updateTicketStatus } from '@/app/actions/ticket'; -import { usePathname, useRouter, useSearchParams } from 'next/navigation'; export default function SubmitTicketButton({ ticketId }: { ticketId: string }) { const [isPending, startTransition] = useTransition(); const [error, setError] = useState(null); - const router = useRouter(); - const pathname = usePathname(); - const searchParams = useSearchParams(); - const handleSubmit = async () => { setError(null); startTransition(async () => { const result = await updateTicketStatus('requested', ticketId); - if (result.success) { - const params = new URLSearchParams(searchParams?.toString() || ''); - params.set('submitted', '1'); - params.set('ticketId', ticketId); - router.replace(`${pathname}?${params.toString()}`); - } else { - setError(result.error || 'Failed to submit ticket.'); - } + if (!result.success) setError(result.error || 'Failed to submit ticket.'); }); }; diff --git a/app/actions/ticket.ts b/app/actions/ticket.ts index 4c623300..4ce87b45 100644 --- a/app/actions/ticket.ts +++ b/app/actions/ticket.ts @@ -242,11 +242,11 @@ export async function addToCart( return { success: false, data: null, error: itemError.message }; } - return { success: true, data: ticketItem }; - } + revalidatePath(`/request/${storeId}/cart`); + revalidatePath(`/request/all/cart`); - // If description is provided - if (description) { + return { success: true, data: ticketItem }; + } else if (description) { // Create a ticket item in ticket_items const { data: ticketItem, error: itemError } = await supabase .from('ticket_items') @@ -262,10 +262,13 @@ export async function addToCart( return { success: false, data: null, error: itemError.message }; } + revalidatePath(`/request/${storeId}/cart`); + revalidatePath(`/request/all/cart`); + return { success: true, data: ticketItem }; } - return { success: true, data: ticket }; + return { success: true, data: null }; } export async function updateTicketDestStore(