diff --git a/PROJECT_SOP.md b/PROJECT_SOP.md index 66d8090..95507a9 100644 --- a/PROJECT_SOP.md +++ b/PROJECT_SOP.md @@ -412,6 +412,40 @@ All CRUD list pages MUST follow these consistent UI patterns: When adding products to orders, variable products MUST follow the Tokopedia/Shopee pattern: +**Responsive Modal Pattern:** +- **Desktop:** Use `Dialog` component (centered modal) +- **Mobile:** Use `Drawer` component (bottom sheet) +- **Detection:** Use `useMediaQuery("(min-width: 768px)")` + +**Implementation:** +```tsx +const isDesktop = useMediaQuery("(min-width: 768px)"); + +{/* Desktop: Dialog */} +{selectedProduct && isDesktop && ( + + + + {product.name} + + {/* Variation list */} + + +)} + +{/* Mobile: Drawer */} +{selectedProduct && !isDesktop && ( + + + + {product.name} + + {/* Variation list */} + + +)} +``` + **Desktop Pattern:** ``` [Search Product...] @@ -438,7 +472,6 @@ When adding products to orders, variable products MUST follow the Tokopedia/Shop ✓ Anker Earbuds Black Rp296,000 [-] 1 [+] [🗑️] -``` **Rules:** 1. ✅ Each variation is a **separate line item** @@ -447,6 +480,8 @@ When adding products to orders, variable products MUST follow the Tokopedia/Shop 4. ✅ Mobile: Click variation to open drawer for selection 5. ❌ Don't auto-select first variation 6. ❌ Don't hide variation selector +7. ✅ **Duplicate Handling**: Same product + same variation = increment quantity (NOT new row) +8. ✅ **Empty Attribute Values**: Filter empty attribute values - Use `.filter()` to remove empty strings **Implementation:** - Product search shows variable products diff --git a/admin-spa/src/routes/Orders/index.tsx b/admin-spa/src/routes/Orders/index.tsx index 316ac7a..3d75b2a 100644 --- a/admin-spa/src/routes/Orders/index.tsx +++ b/admin-spa/src/routes/Orders/index.tsx @@ -267,7 +267,7 @@ export default function Orders() {
- + { setPage(1); setStatus(v === 'all' ? undefined : v); }}>