@burdenoff/microfe-assethandler 2026.1108.1 → 2026.1110.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -235,7 +235,7 @@ function B() {
235
235
  children: [/* @__PURE__ */ d(te, { className: "mr-2 h-4 w-4" }), "Edit Budget"]
236
236
  })]
237
237
  }),
238
- /* @__PURE__ */ d(w, { children: "Drill into a single budget to see exactly how it is being consumed: what was allocated, what has been spent, what remains, and every transaction charged against it. Use it to catch overruns early and decide whether to reallocate, cut spend or top up." }),
238
+ /* @__PURE__ */ d(w, { children: "Review the recorded allocation, spent amount, and remaining balance for this budget. Transactions shown below share its category; they are not allocated to this budget and do not automatically change its spent amount. Update the recorded budget totals when reviewing departmental spend." }),
239
239
  /* @__PURE__ */ f("div", {
240
240
  className: "grid gap-4 md:grid-cols-3",
241
241
  children: [
@@ -299,10 +299,10 @@ function B() {
299
299
  ]
300
300
  })]
301
301
  })] }),
302
- /* @__PURE__ */ f(h, { children: [/* @__PURE__ */ f(v, { children: [/* @__PURE__ */ d(y, { children: "Related Transactions" }), /* @__PURE__ */ f(_, { children: [
303
- "Transactions in ",
302
+ /* @__PURE__ */ f(h, { children: [/* @__PURE__ */ f(v, { children: [/* @__PURE__ */ d(y, { children: "Transactions in the same category" }), /* @__PURE__ */ f(_, { children: [
303
+ "Workspace transactions in ",
304
304
  K.category,
305
- " category"
305
+ "; category matches do not establish a budget allocation."
306
306
  ] })] }), /* @__PURE__ */ d(g, {
307
307
  className: "p-0",
308
308
  children: /* @__PURE__ */ f("div", {
@@ -364,8 +364,8 @@ function B() {
364
364
  }, e.id)) })]
365
365
  }), Q.length === 0 && /* @__PURE__ */ d(ne, {
366
366
  illustration: "empty-data",
367
- title: "No related transactions",
368
- description: `No spend has been charged to the ${K.category} category yet.`
367
+ title: "No transactions in this category",
368
+ description: `No workspace transactions have been recorded in the ${K.category} category yet.`
369
369
  })]
370
370
  })
371
371
  })] })
@@ -1 +1 @@
1
- {"version":3,"file":"FinanceBudgetDetailPage.js","names":["BUDGET_QUERY","UPDATE_BUDGET_MUTATION","BUDGET_STATUSES","humanize","value","c","statusVariant","status","FinanceBudgetDetailPage","money","useAssetMoney","navigate","useAssetHandlerNavigate","useParams","useAssetHandlerStore","useQuery","budgetId","budget","data","editOpen","setEditOpen","useState","form","setForm","openEdit","updateBudget","saving","useMutation","notify","refetch","error","handleSave","parsedAllocated","parsedSpent","loading","Loader2","NotFoundState","relatedTxns","transactions","t","utilizationPct","ResponsiveDialog","ResponsiveDialogContent","ResponsiveDialogHeader","ResponsiveDialogTitle","ResponsiveDialogDescription","Label","Input","p","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","s","ResponsiveDialogFooter","Button","ArrowLeft","GradientText","Badge","Edit","PagePurpose","Card","CardContent","EmphasisPanel","CardHeader","CardTitle","CardDescription","txn","IllustratedEmptyState"],"sources":["../../../src/assethandler/pages/FinanceBudgetDetailPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useAssetMoney } from '../providers/AssetHandlerProvider';\nimport { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Edit, Loader2 } from 'lucide-react';\nimport { useParams } from 'react-router';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { NotFoundState } from '../components';\nimport { notify } from '../utils/toast';\n\n// ─── Backend types ────────────────────────────────────────────────────────────\ntype AssetBudgetStatus = 'ON_TRACK' | 'OVER_BUDGET' | 'UNDER_BUDGET';\n\ninterface AssetBudget {\n id: string;\n name: string;\n category: string;\n allocated: number;\n spent: number;\n remaining: number;\n period: string;\n department: string;\n status: AssetBudgetStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nconst BUDGET_QUERY = gql`\n query AssetHandlerBudget($id: ID!) {\n budget(id: $id) {\n id\n name\n category\n allocated\n spent\n remaining\n period\n department\n status\n createdAt\n updatedAt\n }\n }\n`;\n\nconst UPDATE_BUDGET_MUTATION = gql`\n mutation AssetHandlerUpdateBudget($id: ID!, $input: AssetHandlerUpdateBudgetInput!) {\n updateBudget(id: $id, input: $input) {\n id\n name\n }\n }\n`;\n\ninterface BudgetQueryResult {\n budget: AssetBudget | null;\n}\ninterface UpdateBudgetResult {\n updateBudget: { id: string; name: string };\n}\n\nconst BUDGET_STATUSES: AssetBudgetStatus[] = ['ON_TRACK', 'OVER_BUDGET', 'UNDER_BUDGET'];\n\nconst humanize = (value: string) =>\n value\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/^\\w/, (c) => c.toUpperCase());\n\nconst statusVariant = (status: string): 'default' | 'secondary' | 'destructive' | 'outline' =>\n status === 'OVER_BUDGET' ? 'destructive' : status === 'UNDER_BUDGET' ? 'secondary' : 'default';\n\nexport function FinanceBudgetDetailPage() {\n const { format: money } = useAssetMoney();\n const navigate = useAssetHandlerNavigate();\n const { budgetId } = useParams<{ budgetId: string }>();\n const { transactions } = useAssetHandlerStore();\n\n const { data, loading, refetch } = useQuery<BudgetQueryResult>(BUDGET_QUERY, {\n variables: { id: budgetId ?? '' },\n skip: !budgetId,\n fetchPolicy: 'cache-and-network',\n });\n\n const budget = data?.budget ?? null;\n\n const [editOpen, setEditOpen] = useState(false);\n const [form, setForm] = useState({\n name: '',\n category: '',\n department: '',\n period: '',\n allocated: '',\n spent: '',\n status: 'ON_TRACK' as AssetBudgetStatus,\n });\n\n const openEdit = () => {\n if (!budget) return;\n setForm({\n name: budget.name,\n category: budget.category,\n department: budget.department,\n period: budget.period,\n allocated: String(budget.allocated),\n spent: String(budget.spent),\n status: budget.status,\n });\n setEditOpen(true);\n };\n\n const [updateBudget, { loading: saving }] = useMutation<UpdateBudgetResult>(\n UPDATE_BUDGET_MUTATION,\n {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Budget updated', 'Your changes have been saved.');\n setEditOpen(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not update budget', error.message),\n }\n );\n\n const handleSave = () => {\n if (!budgetId) return;\n const parsedAllocated = Number(form.allocated);\n const parsedSpent = Number(form.spent);\n if (\n !form.name.trim() ||\n !form.category.trim() ||\n !form.department.trim() ||\n !form.period.trim()\n ) {\n notify.warning('Missing details', 'Name, category, department and period are required.');\n return;\n }\n if (!Number.isFinite(parsedAllocated) || !Number.isFinite(parsedSpent)) {\n notify.warning('Invalid numbers', 'Allocated and spent must be numeric.');\n return;\n }\n void updateBudget({\n variables: {\n id: budgetId,\n input: {\n name: form.name.trim(),\n category: form.category.trim(),\n department: form.department.trim(),\n period: form.period.trim(),\n allocated: parsedAllocated,\n spent: parsedSpent,\n status: form.status,\n },\n },\n });\n };\n\n if (loading && !budget) {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center p-6\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n }\n\n if (!budget) {\n return (\n <NotFoundState\n entityLabel=\"Budget\"\n onBack={() => navigate('/finance/finance-hub')}\n backLabel=\"Back to finance\"\n />\n );\n }\n\n const relatedTxns = transactions.filter((t) => t.category === budget.category);\n const utilizationPct = budget.allocated ? Math.round((budget.spent / budget.allocated) * 100) : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <ResponsiveDialog open={editOpen} onOpenChange={setEditOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit Budget</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update the allocation and status for this budget.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Name *</Label>\n <Input\n value={form.name}\n onChange={(e) => setForm((p) => ({ ...p, name: e.target.value }))}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Category *</Label>\n <Input\n value={form.category}\n onChange={(e) => setForm((p) => ({ ...p, category: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Department *</Label>\n <Input\n value={form.department}\n onChange={(e) => setForm((p) => ({ ...p, department: e.target.value }))}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Period *</Label>\n <Input\n value={form.period}\n onChange={(e) => setForm((p) => ({ ...p, period: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select\n value={form.status}\n onValueChange={(v) => setForm((p) => ({ ...p, status: v as AssetBudgetStatus }))}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {BUDGET_STATUSES.map((s) => (\n <SelectItem key={s} value={s}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Allocated *</Label>\n <Input\n type=\"number\"\n value={form.allocated}\n onChange={(e) => setForm((p) => ({ ...p, allocated: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Spent *</Label>\n <Input\n type=\"number\"\n value={form.spent}\n onChange={(e) => setForm((p) => ({ ...p, spent: e.target.value }))}\n />\n </div>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setEditOpen(false)} disabled={saving}>\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={saving}>\n {saving ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {saving ? 'Saving…' : 'Save Changes'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n onClick={() => navigate('/finance/finance-hub')}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{budget.name}</GradientText>\n </h1>\n <Badge variant={statusVariant(budget.status)}>{humanize(budget.status)}</Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {budget.department} &middot; {budget.period}\n </p>\n </div>\n </div>\n <Button size=\"sm\" onClick={openEdit}>\n <Edit className=\"mr-2 h-4 w-4\" />\n Edit Budget\n </Button>\n </div>\n\n <PagePurpose>\n Drill into a single budget to see exactly how it is being consumed: what was allocated, what\n has been spent, what remains, and every transaction charged against it. Use it to catch\n overruns early and decide whether to reallocate, cut spend or top up.\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Allocated</p>\n <p className=\"text-2xl font-bold tabular-nums\">{money(budget.allocated)}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Spent</p>\n <p className=\"text-2xl font-bold tabular-nums\">{money(budget.spent)}</p>\n <p className=\"text-xs text-text-secondary\">{utilizationPct}% utilized</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Remaining</p>\n <p\n className={`text-2xl font-bold ${budget.remaining < 0 ? 'text-status-error-text' : 'text-status-success-text'}`}\n >\n {money(budget.remaining)}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <EmphasisPanel>\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>Budget Utilization</CardTitle>\n </CardHeader>\n <CardContent className=\"px-0 pb-0\">\n <div className=\"h-4 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all ${budget.status === 'OVER_BUDGET' ? 'bg-status-error-bg' : 'bg-action-primary-bg'}`}\n style={{ width: `${Math.min(utilizationPct, 100)}%` }}\n />\n </div>\n <p className=\"text-sm text-text-secondary mt-2\">\n {utilizationPct}% of {money(budget.allocated)} allocated budget consumed\n </p>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle>Related Transactions</CardTitle>\n <CardDescription>Transactions in {budget.category} category</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Description</th>\n <th className=\"text-right p-3 font-medium\">Amount</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Date</th>\n </tr>\n </thead>\n <tbody>\n {relatedTxns.map((txn) => (\n <tr\n key={txn.id}\n className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\"\n onClick={() => navigate('/transactions/' + txn.id)}\n >\n <td className=\"p-3 font-mono text-xs\">{txn.id}</td>\n <td className=\"p-3 truncate max-w-xs\">{txn.description}</td>\n <td className=\"p-3 text-right font-medium\">{money(Math.abs(txn.amount))}</td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{txn.status}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{new Date(txn.date).toLocaleDateString()}</td>\n </tr>\n ))}\n </tbody>\n </table>\n {relatedTxns.length === 0 && (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No related transactions\"\n description={`No spend has been charged to the ${budget.category} category yet.`}\n />\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FinanceBudgetDetailPage.js","names":["BUDGET_QUERY","UPDATE_BUDGET_MUTATION","BUDGET_STATUSES","humanize","value","c","statusVariant","status","FinanceBudgetDetailPage","money","useAssetMoney","navigate","useAssetHandlerNavigate","useParams","useAssetHandlerStore","useQuery","budgetId","budget","data","editOpen","setEditOpen","useState","form","setForm","openEdit","updateBudget","saving","useMutation","notify","refetch","error","handleSave","parsedAllocated","parsedSpent","loading","Loader2","NotFoundState","relatedTxns","transactions","t","utilizationPct","ResponsiveDialog","ResponsiveDialogContent","ResponsiveDialogHeader","ResponsiveDialogTitle","ResponsiveDialogDescription","Label","Input","p","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","s","ResponsiveDialogFooter","Button","ArrowLeft","GradientText","Badge","Edit","PagePurpose","Card","CardContent","EmphasisPanel","CardHeader","CardTitle","CardDescription","txn","IllustratedEmptyState"],"sources":["../../../src/assethandler/pages/FinanceBudgetDetailPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useAssetMoney } from '../providers/AssetHandlerProvider';\nimport { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Edit, Loader2 } from 'lucide-react';\nimport { useParams } from 'react-router';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { NotFoundState } from '../components';\nimport { notify } from '../utils/toast';\n\n// ─── Backend types ────────────────────────────────────────────────────────────\ntype AssetBudgetStatus = 'ON_TRACK' | 'OVER_BUDGET' | 'UNDER_BUDGET';\n\ninterface AssetBudget {\n id: string;\n name: string;\n category: string;\n allocated: number;\n spent: number;\n remaining: number;\n period: string;\n department: string;\n status: AssetBudgetStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nconst BUDGET_QUERY = gql`\n query AssetHandlerBudget($id: ID!) {\n budget(id: $id) {\n id\n name\n category\n allocated\n spent\n remaining\n period\n department\n status\n createdAt\n updatedAt\n }\n }\n`;\n\nconst UPDATE_BUDGET_MUTATION = gql`\n mutation AssetHandlerUpdateBudget($id: ID!, $input: AssetHandlerUpdateBudgetInput!) {\n updateBudget(id: $id, input: $input) {\n id\n name\n }\n }\n`;\n\ninterface BudgetQueryResult {\n budget: AssetBudget | null;\n}\ninterface UpdateBudgetResult {\n updateBudget: { id: string; name: string };\n}\n\nconst BUDGET_STATUSES: AssetBudgetStatus[] = ['ON_TRACK', 'OVER_BUDGET', 'UNDER_BUDGET'];\n\nconst humanize = (value: string) =>\n value\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/^\\w/, (c) => c.toUpperCase());\n\nconst statusVariant = (status: string): 'default' | 'secondary' | 'destructive' | 'outline' =>\n status === 'OVER_BUDGET' ? 'destructive' : status === 'UNDER_BUDGET' ? 'secondary' : 'default';\n\nexport function FinanceBudgetDetailPage() {\n const { format: money } = useAssetMoney();\n const navigate = useAssetHandlerNavigate();\n const { budgetId } = useParams<{ budgetId: string }>();\n const { transactions } = useAssetHandlerStore();\n\n const { data, loading, refetch } = useQuery<BudgetQueryResult>(BUDGET_QUERY, {\n variables: { id: budgetId ?? '' },\n skip: !budgetId,\n fetchPolicy: 'cache-and-network',\n });\n\n const budget = data?.budget ?? null;\n\n const [editOpen, setEditOpen] = useState(false);\n const [form, setForm] = useState({\n name: '',\n category: '',\n department: '',\n period: '',\n allocated: '',\n spent: '',\n status: 'ON_TRACK' as AssetBudgetStatus,\n });\n\n const openEdit = () => {\n if (!budget) return;\n setForm({\n name: budget.name,\n category: budget.category,\n department: budget.department,\n period: budget.period,\n allocated: String(budget.allocated),\n spent: String(budget.spent),\n status: budget.status,\n });\n setEditOpen(true);\n };\n\n const [updateBudget, { loading: saving }] = useMutation<UpdateBudgetResult>(\n UPDATE_BUDGET_MUTATION,\n {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Budget updated', 'Your changes have been saved.');\n setEditOpen(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not update budget', error.message),\n }\n );\n\n const handleSave = () => {\n if (!budgetId) return;\n const parsedAllocated = Number(form.allocated);\n const parsedSpent = Number(form.spent);\n if (\n !form.name.trim() ||\n !form.category.trim() ||\n !form.department.trim() ||\n !form.period.trim()\n ) {\n notify.warning('Missing details', 'Name, category, department and period are required.');\n return;\n }\n if (!Number.isFinite(parsedAllocated) || !Number.isFinite(parsedSpent)) {\n notify.warning('Invalid numbers', 'Allocated and spent must be numeric.');\n return;\n }\n void updateBudget({\n variables: {\n id: budgetId,\n input: {\n name: form.name.trim(),\n category: form.category.trim(),\n department: form.department.trim(),\n period: form.period.trim(),\n allocated: parsedAllocated,\n spent: parsedSpent,\n status: form.status,\n },\n },\n });\n };\n\n if (loading && !budget) {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center p-6\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n }\n\n if (!budget) {\n return (\n <NotFoundState\n entityLabel=\"Budget\"\n onBack={() => navigate('/finance/finance-hub')}\n backLabel=\"Back to finance\"\n />\n );\n }\n\n const relatedTxns = transactions.filter((t) => t.category === budget.category);\n const utilizationPct = budget.allocated ? Math.round((budget.spent / budget.allocated) * 100) : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <ResponsiveDialog open={editOpen} onOpenChange={setEditOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit Budget</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update the allocation and status for this budget.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Name *</Label>\n <Input\n value={form.name}\n onChange={(e) => setForm((p) => ({ ...p, name: e.target.value }))}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Category *</Label>\n <Input\n value={form.category}\n onChange={(e) => setForm((p) => ({ ...p, category: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Department *</Label>\n <Input\n value={form.department}\n onChange={(e) => setForm((p) => ({ ...p, department: e.target.value }))}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Period *</Label>\n <Input\n value={form.period}\n onChange={(e) => setForm((p) => ({ ...p, period: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select\n value={form.status}\n onValueChange={(v) => setForm((p) => ({ ...p, status: v as AssetBudgetStatus }))}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {BUDGET_STATUSES.map((s) => (\n <SelectItem key={s} value={s}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Allocated *</Label>\n <Input\n type=\"number\"\n value={form.allocated}\n onChange={(e) => setForm((p) => ({ ...p, allocated: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Spent *</Label>\n <Input\n type=\"number\"\n value={form.spent}\n onChange={(e) => setForm((p) => ({ ...p, spent: e.target.value }))}\n />\n </div>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setEditOpen(false)} disabled={saving}>\n Cancel\n </Button>\n <Button onClick={handleSave} disabled={saving}>\n {saving ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {saving ? 'Saving…' : 'Save Changes'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n onClick={() => navigate('/finance/finance-hub')}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{budget.name}</GradientText>\n </h1>\n <Badge variant={statusVariant(budget.status)}>{humanize(budget.status)}</Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {budget.department} &middot; {budget.period}\n </p>\n </div>\n </div>\n <Button size=\"sm\" onClick={openEdit}>\n <Edit className=\"mr-2 h-4 w-4\" />\n Edit Budget\n </Button>\n </div>\n\n <PagePurpose>\n Review the recorded allocation, spent amount, and remaining balance for this budget.\n Transactions shown below share its category; they are not allocated to this budget and do\n not automatically change its spent amount. Update the recorded budget totals when reviewing\n departmental spend.\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Allocated</p>\n <p className=\"text-2xl font-bold tabular-nums\">{money(budget.allocated)}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Spent</p>\n <p className=\"text-2xl font-bold tabular-nums\">{money(budget.spent)}</p>\n <p className=\"text-xs text-text-secondary\">{utilizationPct}% utilized</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Remaining</p>\n <p\n className={`text-2xl font-bold ${budget.remaining < 0 ? 'text-status-error-text' : 'text-status-success-text'}`}\n >\n {money(budget.remaining)}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <EmphasisPanel>\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>Budget Utilization</CardTitle>\n </CardHeader>\n <CardContent className=\"px-0 pb-0\">\n <div className=\"h-4 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all ${budget.status === 'OVER_BUDGET' ? 'bg-status-error-bg' : 'bg-action-primary-bg'}`}\n style={{ width: `${Math.min(utilizationPct, 100)}%` }}\n />\n </div>\n <p className=\"text-sm text-text-secondary mt-2\">\n {utilizationPct}% of {money(budget.allocated)} allocated budget consumed\n </p>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle>Transactions in the same category</CardTitle>\n <CardDescription>\n Workspace transactions in {budget.category}; category matches do not establish a budget\n allocation.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Description</th>\n <th className=\"text-right p-3 font-medium\">Amount</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Date</th>\n </tr>\n </thead>\n <tbody>\n {relatedTxns.map((txn) => (\n <tr\n key={txn.id}\n className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\"\n onClick={() => navigate('/transactions/' + txn.id)}\n >\n <td className=\"p-3 font-mono text-xs\">{txn.id}</td>\n <td className=\"p-3 truncate max-w-xs\">{txn.description}</td>\n <td className=\"p-3 text-right font-medium\">{money(Math.abs(txn.amount))}</td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{txn.status}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{new Date(txn.date).toLocaleDateString()}</td>\n </tr>\n ))}\n </tbody>\n </table>\n {relatedTxns.length === 0 && (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No transactions in this category\"\n description={`No workspace transactions have been recorded in the ${budget.category} category yet.`}\n />\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-assethandler",
3
- "version": "2026.1108.1",
3
+ "version": "2026.1110.1",
4
4
  "description": "Burdenoff AssetHandler Microfrontend",
5
5
  "type": "module",
6
6
  "files": [