/* =========================================================================== VESTIRÉ STUDIO — admin: gowns · gown editor · users · sales → window =========================================================================== */ const { useState, useEffect, useRef, useMemo } = React; /* ---- GOWNS MANAGEMENT ---------------------------------------------------- */ function AGowns({ ctx }) { const [q, setQ] = useState(""); const [cat, setCat] = useState("All"); const list = ctx.gowns.filter((g) => (cat === "All" || g.category === cat) && (q === "" || g.name.toLowerCase().includes(q.toLowerCase()))); return (
setQ(e.target.value)} />
ctx.nav("gownEdit", { id: null })}>Add gown
{["All", ...VS.categories].map((c) => )}
{list.map((g) => ( ))}
GownCategoryOfferedRentBuyStockActions
{g.name}{g.color} · {g.occasion}
{g.category} {g.transaction} {g.priceRent ? VS.peso(g.priceRent) : "—"} {g.priceBuy ? VS.peso(g.priceBuy) : "—"}
{g.stock}
); } /* ---- GOWN EDITOR --------------------------------------------------------- */ function AGownEdit({ ctx }) { const id = ctx.route.params && ctx.route.params.id; const existing = id ? ctx.gowns.find((g) => g.id === id) : null; const [f, setF] = useState(existing || { name: "", category: "Wedding", transaction: "Rental", priceRent: "", priceBuy: "", stock: 1, sizes: ["S", "M", "L"], color: "", occasion: "", image: (ctx.gowns[0] && ctx.gowns[0].image) || "img/g1.jpg", desc: "" }); const set = (k) => (e) => setF((p) => ({ ...p, [k]: e.target.value })); const toggleSize = (s) => setF((p) => ({ ...p, sizes: p.sizes.includes(s) ? p.sizes.filter((x) => x !== s) : [...p.sizes, s] })); function save() { ctx.saveGown({ ...f, id: id || undefined, priceRent: +f.priceRent || 0, priceBuy: +f.priceBuy || 0, stock: +f.stock, gallery: existing ? existing.gallery : [f.image] }); ctx.showToast(existing ? "Gown updated" : "Gown added to catalog"); ctx.nav("gowns"); } return (
ctx.nav("gowns")}>Gowns

{existing ? "Edit gown" : "Add a gown"}

{["XS", "S", "M", "L", "XL"].map((s) => )}