PageSourceSearch

https://www.rehnumaa.com/assets/ExpensesAdmin-Cqy4kWd2.js

js rehnumaa.com collected 2026-10-05 02:06:11 UTC 7,194 bytes, 2 lines download raw bytes

1import{j as e}from"./vendor-motion-yVys5Rcg.js";import{r as c}from"./vendor-react-C4z-T9s6.js";import{a as $,u as V,b as B}from"./vendor-query-C_EqVzZE.js";import{Y as M,a4 as Q,B as p,Z as G,_ as z,$ as H,I as d,U as b,j as y,s as u}from"./index-BuNqgmNM.js";import{L as l}from"./label-B0spWvoM.js";import{T as X}from"./textarea-Cy3hN4KE.js";import{S as D,a as S,b as E,c as U,d as N}from"./select-JShIynmw.js";import{a as R}from"./ExpensesSection-DlI7bGGK.js";import{P as Y}from"./plus-D_bz34Fp.js";import{D as Z}from"./download-DpfJb4iN.js";import{R as J}from"./receipt-Dj1CwkDq.js";import{T as W}from"./trash-2-BzTekdrq.js";import"./vendor-pdf-Cg7uvKn4.js";import"./vendor-charts-BiysU4YY.js";import"./vendor-supabase-GlODc1dO.js";import"./index-C8CBWFml.js";import"./index-zu5n5joR.js";import"./chevron-down-C4OuVZ3M.js";import"./chevron-up-CV2e2dPp.js";import"./wallet-jX2h-ylH.js";function ye(){const T=$(),[h,I]=c.useState(""),[j,q]=c.useState("all"),[f,A]=c.useState(""),[g,L]=c.useState(""),[P,C]=c.useState(!1),[t,o]=c.useState({user_id:"",category:"Grocery",amount:"",description:"",expense_date:new Date().toISOString().slice(0,10),file:null}),{data:r,refetch:w}=V({queryKey:["admin-expenses",h,j,f,g],queryFn:async()=>{let s=u.from("expenses").select("*, profiles:user_id (full_name, email)").order("expense_date",{ascending:!1}).limit(500);h&&(s=s.eq("user_id",h)),j!=="all"&&(s=s.eq("category",j)),f&&(s=s.gte("expense_date",f)),g&&(s=s.lte("expense_date",g));const{data:a,error:n}=await s;if(n)throw n;return a}}),k=c.useMemo(()=>(r??[]).reduce((s,a)=>s+Number(a.amount),0),[r]),F=B({mutationFn:async s=>{const{error:a}=await u.from("expenses").delete().eq("id",s);if(a)throw a},onSuccess:()=>{y.success("Deleted"),T.invalidateQueries({queryKey:["admin-expenses"]})}}),O=async()=>{if(!t.user_id||!t.amount)return y.error("User ID and amount are required");try{let s=null;if(t.file){const n=t.file.name.split(".").pop(),m=`expenses/${t.user_id}/${crypto.randomUUID()}.${n}`,{error:x}=await u.storage.from("media").upload(m,t.file,{contentType:t.file.type,upsert:!1});if(x)throw x;s=u.storage.from("media").getPublicUrl(m).data.publicUrl}const{error:a}=await u.from("expenses").insert({user_id:t.user_id,category:t.category,amount:Number(t.amount),description:t.description||null,expense_date:t.expense_date,receipt_url:s});if(a)throw a;y.success("Expense added"),C(!1),o({...t,amount:"",description:"",file:null}),w()}catch(s){y.error(s.message||"Failed")}},K=()=>{const a=[["Date","User","Email","Category","Amount","Description"],...(r??[]).map(i=>{var v,_;return[i.expense_date,((v=i.profiles)==null?void 0:v.full_name)||"",((_=i.profiles)==null?void 0:_.email)||"",i.category,i.amount,(i.description||"").replace(/[\n,]/g," ")]})].map(i=>
1i.map(v=>`"${String(v).replace(/"/g,'""')}"`).join(",")).join(`
2`),n=new Blob([a],{type:"text/csv"}),m=URL.createObjectURL(n),x=document.createElement("a");x.href=m,x.download="expenses.csv",x.click(),URL.revokeObjectURL(m)};return e.jsxs("div",{className:"p-6 space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h1",{className:"text-2xl font-bold",children:"Expenses"}),e.jsxs(M,{open:P,onOpenChange:C,children:[e.jsx(Q,{asChild:!0,children:e.jsxs(p,{children:[e.jsx(Y,{className:"h-4 w-4 mr-1"})," Add Expense"]})}),e.jsxs(G,{children:[e.jsx(z,{children:e.jsx(H,{children:"Add Expense"})}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx(l,{children:"User ID"}),e.jsx(d,{value:t.user_id,onChange:s=>o({...t,user_id:s.target.value}),placeholder:"uuid"})]}),e.jsxs("div",{children:[e.jsx(l,{children:"Category"}),e.jsxs(D,{value:t.category,onValueChange:s=>o({...t,category:s}),children:[e.jsx(S,{children:e.jsx(E,{})}),e.jsx(U,{children:R.map(s=>e.jsx(N,{value:s,children:s},s))})]})]}),e.jsxs("div",{children:[e.jsx(l,{children:"Amount (PKR)"}),e.jsx(d,{type:"number",value:t.amount,onChange:s=>o({...t,amount:s.target.value})})]}),e.jsxs("div",{children:[e.jsx(l,{children:"Date"}),e.jsx(d,{type:"date",value:t.expense_date,onChange:s=>o({...t,expense_date:s.target.value})})]}),e.jsxs("div",{children:[e.jsx(l,{children:"Description"}),e.jsx(X,{value:t.description,onChange:s=>o({...t,description:s.target.value})})]}),e.jsxs("div",{children:[e.jsx(l,{children:"Receipt photo (optional)"}),e.jsx(d,{type:"file",accept:"image/*,application/pdf",onChange:s=>{var a;return o({...t,file:((a=s.target.files)==null?void 0:a[0])??null})}})]}),e.jsx(p,{className:"w-full",onClick:O,children:"Save"})]})]})]})]}),e.jsxs(b,{className:"p-4 flex flex-wrap items-end gap-3",children:[e.jsxs("div",{children:[e.jsx(l,{className:"text-xs",children:"User ID"}),e.jsx(d,{value:h,onChange:s=>I(s.target.value),className:"w-72"})]}),e.jsxs("div",{children:[e.jsx(l,{className:"text-xs",children:"Category"}),e.jsxs(D,{value:j,onValueChange:q,children:[e.jsx(S,{className:"w-44",children:e.jsx(E,{})}),e.jsxs(U,{children:[e.jsx(N,{value:"all",children:"All"}),R.map(s=>e.jsx(N,{value:s,children:s},s))]})]})]}),e.jsxs("div",{children:[e.jsx(l,{className:"text-xs",children:"From"}),e.jsx(d,{type:"date",value:f,onChange:s=>A(s.target.value)})]}),e.jsxs("div",{children:[e.jsx(l,{className:"text-xs",children:"To"}),e.jsx(d,{type:"date",value:g,onChange:s=>L(s.target.value)})]}),e.jsx(p,{variant:"outline",onClick:()=>w(),children:"Apply"}),e.jsxs(p,{variant:"outline",onClick:K,children:[e.jsx(Z,{className:"h-4 w-4 mr-1"})," CSV"]})]}),e.jsxs(b,{className:"p-0 overflow-hidden",children:[e.jsxs("div",{className:"p-4 border-b font-medium flex items-center justify-between",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx(J,{className:"h-4 w-4"})," ",(r==null?void 0:r.length)??0," expenses"]}),e.jsxs("span",{className:"text-sm",children:["Total: ",e.jsxs("strong",{children:["PKR ",k.toLocaleString()]})]})]}),r!=null&&r.length?e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"bg-muted/40",children:e.jsxs("tr",{children:[e.jsx("th",{className:"text-left p-3",children:"Date"}),e.jsx("th",{className:"text-left p-3",children:"User"}),e.jsx("th",{className:"text-left p-3",children:"Category"}),e.jsx("th",{className:"text-right p-3",children:"Amount"}),e.jsx("th",{className:"text-left p-3",children:"Description"}),e.jsx("th",{})]})}),e.jsx("tbody",{children:r.map(s=>{var a,n;return e.jsxs("tr",{className:"border-t",children:[e.jsx("td",{className:"p-3 text-xs",children:s.expense_date}),e.jsxs("td",{className:"p-3",children:[e.jsx("div",{children:((a=s.profiles)==null?void 0:a.full_name)||"—"}),e.jsx("div",{className:"text-xs text-muted-foreground",children:(n=s.profiles)==null?void 0:n.email})]}),e.jsx("td",{className:"p-3",children:s.category}),e.jsxs("td",{className:"p-3 text-right",children:["PKR ",Number(s.amount).toLocaleString()]}),e.jsx("td",{className:"p-3 text-xs",children:s.description}),e.jsx("td",{className:"p-3",children:e.jsx(p,{size:"icon",variant:"ghost",onClick:()=>F.mutate(s.id),children:e.jsx(W,{className:"h-4 w-4 text-destructive"})})})]},s.id)})})]}):e.jsx("div",{className:"p-6 text-sm text-muted-foreground text-center",children:"No expenses."})]})]})}export{ye as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.