From 55dec6934d2c685776c9969325882f4459f52538 Mon Sep 17 00:00:00 2001 From: 1004yeeun Date: Thu, 14 May 2026 21:12:19 -0700 Subject: [PATCH 1/9] add destination store dropdown for all stores carts --- app/(main)/request/all/cart/page.tsx | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/app/(main)/request/all/cart/page.tsx b/app/(main)/request/all/cart/page.tsx index 41fb490f..2d6ee2c4 100644 --- a/app/(main)/request/all/cart/page.tsx +++ b/app/(main)/request/all/cart/page.tsx @@ -8,6 +8,7 @@ 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'; type DraftTicket = { ticket_id: string; @@ -20,7 +21,7 @@ type DraftTicket = { export default async function AllCartsPage({ searchParams, }: { - searchParams: Promise<{ submitted?: string; ticketId?: string }>; + searchParams: Promise<{ submitted?: string; ticketId: string }>; }) { const { submitted, ticketId } = await searchParams; const showSuccess = submitted === '1' && !!ticketId; @@ -38,7 +39,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) { @@ -119,6 +120,22 @@ export default async function AllCartsPage({ {store.name} +
+

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, + }, + }))} + /> +
{showSuccess && (

Ticket submitted successfully!

From 844c414f256a77478a9393983f95f3d73c7fede4 Mon Sep 17 00:00:00 2001 From: 1004yeeun Date: Thu, 14 May 2026 21:35:21 -0700 Subject: [PATCH 2/9] fix width styling to be consistent for .itemsCardHeader in both CartPage and TicketItemsList styles --- app/(main)/request/CartPage.module.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 { From 87a95599da2bc84c9e72b5459b2ccca012510604 Mon Sep 17 00:00:00 2001 From: 1004yeeun Date: Thu, 14 May 2026 22:20:51 -0700 Subject: [PATCH 3/9] style the accordions (remove white background behind body content, remove horizontal spacing around the body content, and remove all borders) --- app/(main)/request/all/Accordion.module.css | 18 ++++++++++++++++++ app/(main)/request/all/cart/page.tsx | 15 +++++++++------ app/(main)/request/all/page.tsx | 7 ++++--- 3 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 app/(main)/request/all/Accordion.module.css diff --git a/app/(main)/request/all/Accordion.module.css b/app/(main)/request/all/Accordion.module.css new file mode 100644 index 00000000..3cc16628 --- /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; +} \ No newline at end of file diff --git a/app/(main)/request/all/cart/page.tsx b/app/(main)/request/all/cart/page.tsx index 2d6ee2c4..045980dc 100644 --- a/app/(main)/request/all/cart/page.tsx +++ b/app/(main)/request/all/cart/page.tsx @@ -9,6 +9,7 @@ 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'; type DraftTicket = { ticket_id: string; @@ -70,9 +71,11 @@ export default async function AllCartsPage({ {sortedStores.map((store) => { return ( - - {store.name} - + + + {store.name} + +

ITEMS

@@ -117,9 +120,9 @@ export default async function AllCartsPage({ return ( - - {store.name} - + + {store.name} +

Ticket Destination Store:

- - {store.name} - + + {store.name} +

Out-of-Stock Request

{storeItems.length > 0 ? ( From 305ce9f294c7088c2090a42b707781b1d847b752 Mon Sep 17 00:00:00 2001 From: 1004yeeun Date: Thu, 14 May 2026 22:25:11 -0700 Subject: [PATCH 4/9] move the AddOutOfStockToCartForm from /request/all to cart --- app/(main)/request/all/cart/page.tsx | 3 +++ app/(main)/request/all/page.tsx | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/(main)/request/all/cart/page.tsx b/app/(main)/request/all/cart/page.tsx index 045980dc..aa00152a 100644 --- a/app/(main)/request/all/cart/page.tsx +++ b/app/(main)/request/all/cart/page.tsx @@ -10,6 +10,7 @@ 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; @@ -162,6 +163,8 @@ export default async function AllCartsPage({
)} +

Out-of-Stock Request

+ diff --git a/app/(main)/request/all/page.tsx b/app/(main)/request/all/page.tsx index c910b826..a4dca4b9 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'; @@ -173,8 +172,6 @@ export default async function RequestAllStoresPage({ {store.name} -

Out-of-Stock Request

- {storeItems.length > 0 ? (

In-Stock Items

From b990d795c2e4ff345c93e0da852c40afb931a905 Mon Sep 17 00:00:00 2001 From: 1004yeeun Date: Thu, 14 May 2026 22:34:26 -0700 Subject: [PATCH 5/9] make spacing for AddOutOfStockToCartForm on cart consistent --- app/(main)/request/components/SubmitTicketButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/(main)/request/components/SubmitTicketButton.tsx b/app/(main)/request/components/SubmitTicketButton.tsx index 36d6a489..3b55f1ee 100644 --- a/app/(main)/request/components/SubmitTicketButton.tsx +++ b/app/(main)/request/components/SubmitTicketButton.tsx @@ -27,7 +27,7 @@ export default function SubmitTicketButton({ ticketId }: { ticketId: string }) { return (
- {error &&

{error}

} From 6c5c071042471efd11385517fb775e739d18459d Mon Sep 17 00:00:00 2001 From: 1004yeeun Date: Thu, 14 May 2026 22:42:21 -0700 Subject: [PATCH 6/9] move the AddOutOfStockToCartForm from /request/[storeId] to the cart --- app/(main)/request/[storeId]/cart/page.tsx | 9 +++++++++ app/(main)/request/[storeId]/page.tsx | 3 --- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/(main)/request/[storeId]/cart/page.tsx b/app/(main)/request/[storeId]/cart/page.tsx index d4076f0b..9927c390 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

+ +
); } @@ -135,6 +140,10 @@ export default async function CartPage({ )}
+
+

Out-of-Stock Request

+ +
{hasItems ? : 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 ? (
From cdbf829592491d3a8264a3bcffd773fd9db886e6 Mon Sep 17 00:00:00 2001 From: 1004yeeun Date: Thu, 14 May 2026 22:46:47 -0700 Subject: [PATCH 7/9] move AddOutOfStockToCartForm in request/all/cart above the submit button, and get rid of styling previously added for spacing --- app/(main)/request/all/cart/page.tsx | 29 ++++++++++++++----- .../request/components/SubmitTicketButton.tsx | 2 +- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/app/(main)/request/all/cart/page.tsx b/app/(main)/request/all/cart/page.tsx index aa00152a..849d30d4 100644 --- a/app/(main)/request/all/cart/page.tsx +++ b/app/(main)/request/all/cart/page.tsx @@ -121,8 +121,13 @@ export default async function AllCartsPage({ return ( - - {store.name} + + + {store.name} +

Ticket Destination Store:

@@ -151,20 +156,28 @@ export default async function AllCartsPage({ {draftTicket ? (
+
+

Out-of-Stock Request

+ +
{draftTicket.ticket_items[0].count > 0 ? ( ) : null}
) : ( -
-
-

ITEMS

-

0 in-stock · 0 out-of-stock

+
+
+
+

ITEMS

+

0 in-stock · 0 out-of-stock

+
+
+
+

Out-of-Stock Request

+
)} -

Out-of-Stock Request

- diff --git a/app/(main)/request/components/SubmitTicketButton.tsx b/app/(main)/request/components/SubmitTicketButton.tsx index 3b55f1ee..36d6a489 100644 --- a/app/(main)/request/components/SubmitTicketButton.tsx +++ b/app/(main)/request/components/SubmitTicketButton.tsx @@ -27,7 +27,7 @@ export default function SubmitTicketButton({ ticketId }: { ticketId: string }) { return (
- {error &&

{error}

} From fc28581c264672bfa9081b3ca2e705812bfcf696 Mon Sep 17 00:00:00 2001 From: 1004yeeun Date: Thu, 14 May 2026 22:53:14 -0700 Subject: [PATCH 8/9] format with prettier --- app/(main)/request/all/Accordion.module.css | 18 +++++++++--------- app/(main)/request/all/cart/page.tsx | 5 ++++- app/(main)/request/all/page.tsx | 9 +++++++-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/app/(main)/request/all/Accordion.module.css b/app/(main)/request/all/Accordion.module.css index 3cc16628..8ee0159c 100644 --- a/app/(main)/request/all/Accordion.module.css +++ b/app/(main)/request/all/Accordion.module.css @@ -1,18 +1,18 @@ .accordionSpacing { - margin-bottom: 1rem; + margin-bottom: 1rem; } .accordionBody { - background-color: transparent; - border: none; + background-color: transparent; + border: none; } -.accordionHeader :global(.accordion-button){ - box-shadow: none; - border: none; +.accordionHeader :global(.accordion-button) { + box-shadow: none; + border: none; } .accordionBodySpacing { - padding-left: 0; - padding-right: 0; -} \ No newline at end of file + 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 849d30d4..914f9c90 100644 --- a/app/(main)/request/all/cart/page.tsx +++ b/app/(main)/request/all/cart/page.tsx @@ -72,7 +72,10 @@ export default async function AllCartsPage({ {sortedStores.map((store) => { return ( - + {store.name} diff --git a/app/(main)/request/all/page.tsx b/app/(main)/request/all/page.tsx index a4dca4b9..e737d971 100644 --- a/app/(main)/request/all/page.tsx +++ b/app/(main)/request/all/page.tsx @@ -169,8 +169,13 @@ export default async function RequestAllStoresPage({ const storeItems = itemsByStore.get(store.store_id) || []; return ( - - {store.name} + + + {store.name} + {storeItems.length > 0 ? (
From 98be9f4ee6a96b6f9777328b6aed8f2237f7d3c1 Mon Sep 17 00:00:00 2001 From: joy-y-cheng Date: Sun, 17 May 2026 02:52:46 -0700 Subject: [PATCH 9/9] Revalidate paths and clean up submission behavior --- app/(main)/request/[storeId]/cart/page.tsx | 26 +++++----- app/(main)/request/all/cart/page.tsx | 51 +++++++------------ .../request/components/SubmitTicketButton.tsx | 14 +---- app/actions/ticket.ts | 13 +++-- 4 files changed, 40 insertions(+), 64 deletions(-) diff --git a/app/(main)/request/[storeId]/cart/page.tsx b/app/(main)/request/[storeId]/cart/page.tsx index 9927c390..862621b4 100644 --- a/app/(main)/request/[storeId]/cart/page.tsx +++ b/app/(main)/request/[storeId]/cart/page.tsx @@ -120,18 +120,6 @@ export default async function CartPage({ }} />

Cart

- {hasItems ? ( -
-

Ticket Destination Store:

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

Ticket submitted successfully!

@@ -144,7 +132,19 @@ export default async function CartPage({

Out-of-Stock Request

- {hasItems ? : null} + {hasItems ? ( +
+

Ticket Destination Store:

+ ({ + store, + }))} + /> + +
+ ) : null}
); diff --git a/app/(main)/request/all/cart/page.tsx b/app/(main)/request/all/cart/page.tsx index 914f9c90..ef673db3 100644 --- a/app/(main)/request/all/cart/page.tsx +++ b/app/(main)/request/all/cart/page.tsx @@ -1,7 +1,6 @@ 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'; @@ -20,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 @@ -132,30 +125,6 @@ export default async function AllCartsPage({ {store.name} -
-

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, - }, - }))} - /> -
- {showSuccess && ( -
-

Ticket submitted successfully!

- - Go to ticket - -
- )} {draftTicket ? (
@@ -164,7 +133,23 @@ export default async function AllCartsPage({
{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}
) : ( 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(