@burdenoff/microfe-housingvista 2026.709.2 → 2026.709.3

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.
Files changed (83) hide show
  1. package/dist/housingvista/HousingVistaRoutes.d.ts.map +1 -1
  2. package/dist/housingvista/HousingVistaRoutes.js +136 -37
  3. package/dist/housingvista/HousingVistaRoutes.js.map +1 -1
  4. package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts +1 -1
  5. package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts.map +1 -1
  6. package/dist/housingvista/hooks/useHousingVistaAnalytics.js +4 -4
  7. package/dist/housingvista/hooks/useHousingVistaAnalytics.js.map +1 -1
  8. package/dist/housingvista/pages/amc/AMCManagementPage.d.ts.map +1 -1
  9. package/dist/housingvista/pages/amc/AMCManagementPage.js +62 -60
  10. package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
  11. package/dist/housingvista/pages/assets/AssetDetailPage.d.ts.map +1 -1
  12. package/dist/housingvista/pages/assets/AssetDetailPage.js +141 -138
  13. package/dist/housingvista/pages/assets/AssetDetailPage.js.map +1 -1
  14. package/dist/housingvista/pages/assets/AssetManagementPage.d.ts.map +1 -1
  15. package/dist/housingvista/pages/assets/AssetManagementPage.js +193 -191
  16. package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
  17. package/dist/housingvista/pages/chat/ChatPage.d.ts.map +1 -1
  18. package/dist/housingvista/pages/chat/ChatPage.js +115 -113
  19. package/dist/housingvista/pages/chat/ChatPage.js.map +1 -1
  20. package/dist/housingvista/pages/finance/HomeLoanDetailPage.d.ts.map +1 -1
  21. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js +152 -149
  22. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js.map +1 -1
  23. package/dist/housingvista/pages/finance/HomeLoansPage.d.ts.map +1 -1
  24. package/dist/housingvista/pages/finance/HomeLoansPage.js +141 -139
  25. package/dist/housingvista/pages/finance/HomeLoansPage.js.map +1 -1
  26. package/dist/housingvista/pages/investments/InvestmentDetailPage.d.ts.map +1 -1
  27. package/dist/housingvista/pages/investments/InvestmentDetailPage.js +290 -287
  28. package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
  29. package/dist/housingvista/pages/investments/InvestmentsPage.d.ts.map +1 -1
  30. package/dist/housingvista/pages/investments/InvestmentsPage.js +64 -62
  31. package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
  32. package/dist/housingvista/pages/legal/LegalPage.d.ts.map +1 -1
  33. package/dist/housingvista/pages/legal/LegalPage.js +95 -93
  34. package/dist/housingvista/pages/legal/LegalPage.js.map +1 -1
  35. package/dist/housingvista/pages/legal/LegalServiceDetailPage.d.ts.map +1 -1
  36. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js +129 -126
  37. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js.map +1 -1
  38. package/dist/housingvista/pages/market/AreaInsightsPage.d.ts.map +1 -1
  39. package/dist/housingvista/pages/market/AreaInsightsPage.js +99 -97
  40. package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
  41. package/dist/housingvista/pages/market/MarketAnalyticsPage.d.ts.map +1 -1
  42. package/dist/housingvista/pages/market/MarketAnalyticsPage.js +138 -136
  43. package/dist/housingvista/pages/market/MarketAnalyticsPage.js.map +1 -1
  44. package/dist/housingvista/pages/marketplace/MarketplacePage.d.ts.map +1 -1
  45. package/dist/housingvista/pages/marketplace/MarketplacePage.js +99 -97
  46. package/dist/housingvista/pages/marketplace/MarketplacePage.js.map +1 -1
  47. package/dist/housingvista/pages/marketplace/ServiceDetailPage.d.ts.map +1 -1
  48. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js +137 -134
  49. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js.map +1 -1
  50. package/dist/housingvista/pages/offers/OffersPage.d.ts.map +1 -1
  51. package/dist/housingvista/pages/offers/OffersPage.js +94 -92
  52. package/dist/housingvista/pages/offers/OffersPage.js.map +1 -1
  53. package/dist/housingvista/pages/properties/AddPropertyPage.d.ts.map +1 -1
  54. package/dist/housingvista/pages/properties/AddPropertyPage.js +280 -279
  55. package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
  56. package/dist/housingvista/pages/rental/RentalManagementPage.d.ts.map +1 -1
  57. package/dist/housingvista/pages/rental/RentalManagementPage.js +153 -151
  58. package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
  59. package/dist/housingvista/pages/settings/ProfilePage.d.ts.map +1 -1
  60. package/dist/housingvista/pages/settings/ProfilePage.js +52 -50
  61. package/dist/housingvista/pages/settings/ProfilePage.js.map +1 -1
  62. package/dist/housingvista/pages/settings/SettingsPage.d.ts.map +1 -1
  63. package/dist/housingvista/pages/settings/SettingsPage.js +54 -52
  64. package/dist/housingvista/pages/settings/SettingsPage.js.map +1 -1
  65. package/dist/housingvista/pages/shortlist/ShortlistPage.d.ts.map +1 -1
  66. package/dist/housingvista/pages/shortlist/ShortlistPage.js +43 -41
  67. package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -1
  68. package/dist/housingvista/pages/transactions/TransactionDetailPage.d.ts.map +1 -1
  69. package/dist/housingvista/pages/transactions/TransactionDetailPage.js +211 -208
  70. package/dist/housingvista/pages/transactions/TransactionDetailPage.js.map +1 -1
  71. package/dist/housingvista/pages/transactions/TransactionsPage.d.ts.map +1 -1
  72. package/dist/housingvista/pages/transactions/TransactionsPage.js +85 -83
  73. package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
  74. package/dist/housingvista/pages/verification/VerificationDetailPage.d.ts.map +1 -1
  75. package/dist/housingvista/pages/verification/VerificationDetailPage.js +25 -22
  76. package/dist/housingvista/pages/verification/VerificationDetailPage.js.map +1 -1
  77. package/dist/housingvista/pages/verification/VerificationPage.d.ts.map +1 -1
  78. package/dist/housingvista/pages/verification/VerificationPage.js +123 -121
  79. package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
  80. package/dist/housingvista/pages/viewings/ViewingsPage.d.ts.map +1 -1
  81. package/dist/housingvista/pages/viewings/ViewingsPage.js +128 -126
  82. package/dist/housingvista/pages/viewings/ViewingsPage.js.map +1 -1
  83. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionDetailPage.js","names":[],"sources":["../../../../src/housingvista/pages/transactions/TransactionDetailPage.tsx"],"sourcesContent":["/**\n * HousingVista Transaction Detail Page\n * Full transaction detail with milestones, documents, parties, financial breakdown.\n * Migrated from legacy housingvista-frontend transaction-detail.tsx\n * @module housingvista\n */\n\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n ArrowLeft,\n DollarSign,\n Calendar,\n FileText,\n Shield,\n CheckCircle,\n Clock,\n AlertCircle,\n XCircle,\n Download,\n Building,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { Breadcrumbs, StatusBadge, EmptyState, LoadingSkeleton, FileUploader } from '../../components';\nimport type { BreadcrumbItem } from '../../components';\nimport { useTransaction, useUpdateTransaction } from '../../hooks';\nimport { MilestoneStepper, parseMilestones } from './milestones';\nimport type { HvUploadedFile } from '../../hooks';\nimport type { User, TransactionDocument, TransactionMilestone, CommissionCharge } from '../../types';\nimport { notify } from '../../lib/toast';\nimport { formatCurrency, formatDate } from '../../utils/helpers';\n\n// ---- Status badge variant map ----\nconst statusVariantMap: Record<string, 'success' | 'warning' | 'error' | 'info' | 'default' | 'muted'> = {\n completed: 'success',\n in_progress: 'info',\n pending: 'warning',\n pending_approval: 'warning',\n negotiation: 'info',\n cancelled: 'error',\n disputed: 'error',\n overdue: 'error',\n draft: 'muted',\n};\n\n// ---- Status icon map ----\nconst statusIcons: Record<string, typeof CheckCircle> = {\n completed: CheckCircle,\n in_progress: Clock,\n pending: AlertCircle,\n pending_approval: AlertCircle,\n cancelled: XCircle,\n overdue: XCircle,\n};\n\n// ---- Safe formatters/guards for opaque JSON columns ----\n// The transaction's `documents`/`milestones`/`parties`/`escrow` fields (and the\n// date fields) arrive as opaque JSON from the server, so every access is guarded\n// to never throw on null / undefined / wrong-shape data.\nconst fmtDate = (value: unknown): string => {\n const iso =\n value instanceof Date ? value.toISOString() : typeof value === 'string' && value.length > 0 ? value : null;\n return iso ? formatDate(iso) : '—';\n};\n\nconst initials = (user?: Pick<User, 'firstName' | 'lastName'>): string => {\n const first = (user?.firstName ?? '').charAt(0);\n const last = (user?.lastName ?? '').charAt(0);\n return (first + last).toUpperCase() || '?';\n};\n\nconst fullName = (user?: Pick<User, 'firstName' | 'lastName'>): string =>\n `${user?.firstName ?? ''} ${user?.lastName ?? ''}`.trim() || 'Unknown';\n\nconst milestoneIconColor = (status: string): string => {\n if (status === 'completed') return 'text-status-success-text';\n if (status === 'in_progress') return 'text-status-warning-text';\n if (status === 'overdue') return 'text-status-error-text';\n return 'text-text-secondary';\n};\n\nexport const TransactionDetailPage = () => {\n const { id } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const { data: transaction, loading } = useTransaction(id);\n const { updateTransaction, loading: savingDocs } = useUpdateTransaction();\n\n // ---- Loading ----\n if (loading) {\n return (\n <div className=\"p-6\">\n <LoadingSkeleton variant=\"detail\" />\n </div>\n );\n }\n\n // ---- Not Found ----\n if (!transaction) {\n return (\n <div className=\"p-6\">\n <EmptyState\n illustration=\"empty-search\"\n icon={<FileText className=\"h-12 w-12\" />}\n title=\"Transaction Not Found\"\n description=\"The transaction you're looking for doesn't exist or has been removed.\"\n action={\n <button\n onClick={() => navigate('../transactions')}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Transactions\n </button>\n }\n />\n </div>\n );\n }\n\n // ---- Guarded views of opaque JSON columns ----\n const documents: TransactionDocument[] = Array.isArray(transaction.documents) ? transaction.documents : [];\n\n // Persist newly uploaded files by appending them (real files-svc ids + URLs)\n // to the transaction's `documents` JSON array — no fabricated entries.\n const handleDocumentsUploaded = async (files: HvUploadedFile[]) => {\n if (files.length === 0) return;\n const appended: TransactionDocument[] = files.map((file) => ({\n id: file.id,\n name: file.name,\n url: file.url,\n type: file.mimeType,\n signed: false,\n required: false,\n }));\n try {\n await updateTransaction(transaction.id, { documents: [...documents, ...appended] });\n notify.success(\n 'Document attached',\n `${files.length} document${files.length > 1 ? 's' : ''} added to this transaction.`\n );\n } catch (err) {\n notify.error('Could not attach document', (err as Error).message);\n }\n };\n const milestones: TransactionMilestone[] = Array.isArray(transaction.milestones) ? transaction.milestones : [];\n const escrow = transaction.escrow && typeof transaction.escrow === 'object' ? transaction.escrow : null;\n const escrowConditions: string[] = escrow && Array.isArray(escrow.conditions) ? escrow.conditions : [];\n const commission =\n transaction.commission && typeof transaction.commission === 'object' ? transaction.commission : null;\n const otherCharges: CommissionCharge[] =\n commission && Array.isArray(commission.otherCharges) ? commission.otherCharges : [];\n\n const property = transaction.property;\n const shortId = transaction.id.split('-')[1] ?? transaction.id;\n\n const parties: { role: string; user?: User }[] = [\n { role: 'Buyer', user: transaction.buyer },\n { role: 'Seller', user: transaction.seller },\n { role: 'Tenant', user: transaction.tenant },\n { role: 'Landlord', user: transaction.landlord },\n { role: 'Broker', user: transaction.broker },\n ];\n const presentParties = parties.filter((p): p is { role: string; user: User } => Boolean(p.user));\n\n const breadcrumbs: BreadcrumbItem[] = [\n { label: 'Transactions', href: '../transactions' },\n { label: `Transaction #${shortId}` },\n ];\n\n const milestonesCompleted = milestones.filter((m) => m?.status === 'completed').length;\n const totalMilestones = milestones.length;\n const progressPercent = totalMilestones > 0 ? Math.round((milestonesCompleted / totalMilestones) * 100) : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Breadcrumbs */}\n <Breadcrumbs items={breadcrumbs} />\n\n <PagePurpose className=\"max-w-3xl\">\n This is the single source of truth for one deal — its money, milestones, documents, parties, and escrow. Use it\n to see exactly where the transaction stands, what still needs signing or approval, and who to contact to move it\n to closing.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"housingvista-transaction-detail\"\n steps={[\n {\n id: 'milestones',\n label: 'Review what is due next',\n description: `${milestonesCompleted} of ${totalMilestones} milestones complete — check the timeline for the next step.`,\n href: '#transaction-milestones',\n },\n {\n id: 'documents',\n label: 'Upload or sign documents',\n description: 'Keep paperwork current so the deal can progress to closing.',\n href: '#transaction-documents',\n },\n {\n id: 'parties',\n label: 'Contact a party',\n description: 'Reach the buyer, seller, or broker to unblock the deal.',\n href: '#transaction-parties',\n },\n {\n id: 'back',\n label: 'Back to all transactions',\n description: 'Return to the full list of deals.',\n onClick: () => navigate('../transactions'),\n },\n ]}\n />\n\n {/* Header */}\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"flex items-center gap-4\">\n <button\n onClick={() => navigate('../transactions')}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-subtle px-3 py-1.5 text-sm text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">Transaction #{shortId}</h1>\n <div className=\"mt-1 flex items-center gap-2\">\n <StatusBadge\n label={transaction.status.replace(/_/g, ' ')}\n variant={statusVariantMap[transaction.status] ?? 'default'}\n dot\n />\n <StatusBadge label={transaction.type} variant=\"muted\" />\n </div>\n </div>\n </div>\n </div>\n\n {/* Key Info Cards — primary insight zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-4\">\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <DollarSign className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Amount</span>\n </div>\n <div className=\"mt-2 text-xl font-bold text-text-primary\">\n {formatCurrency(transaction.amount, transaction.currency)}\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <FileText className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Type</span>\n </div>\n <div className=\"mt-2 text-xl font-bold capitalize text-text-primary\">{transaction.type}</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Building className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Property</span>\n </div>\n <div className=\"mt-2 truncate text-sm font-bold text-text-primary\">{property?.title ?? '—'}</div>\n <div className=\"truncate text-xs text-text-secondary\">\n {property?.location?.city ?? '—'}\n {property?.location?.state ? `, ${property.location.state}` : ''}\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Calendar className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Progress</span>\n </div>\n <div className=\"mt-2 text-xl font-bold text-text-primary\">{progressPercent}%</div>\n <div className=\"mt-1 h-1.5 w-full rounded-full bg-bg-sunken\">\n <div\n className=\"h-1.5 rounded-full bg-action-primary-bg transition-all\"\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Deal stage timeline — horizontal at-a-glance progress */}\n {milestones.length > 0 && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <Shield className=\"h-5 w-5\" />\n Deal progress\n </h2>\n <MilestoneStepper milestones={parseMilestones(transaction.milestones)} />\n </div>\n )}\n\n {/* Main Content Grid */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Main content */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* Transaction Overview */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">Transaction Overview</h2>\n <div className=\"grid grid-cols-1 gap-6 sm:grid-cols-2\">\n <div>\n <h4 className=\"mb-3 text-sm font-medium text-text-primary\">Property Details</h4>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Property</dt>\n <dd className=\"font-medium text-text-primary\">{property?.title ?? '—'}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Location</dt>\n <dd className=\"text-text-primary\">\n {property?.location?.city ?? '—'}\n {property?.location?.state ? `, ${property.location.state}` : ''}\n </dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Type</dt>\n <dd className=\"capitalize text-text-primary\">\n {property?.type ? property.type.replace('_', ' ') : '—'}\n </dd>\n </div>\n </dl>\n </div>\n <div>\n <h4 className=\"mb-3 text-sm font-medium text-text-primary\">Transaction Details</h4>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Created</dt>\n <dd className=\"text-text-primary\">{fmtDate(transaction.createdAt)}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Last Updated</dt>\n <dd className=\"text-text-primary\">{fmtDate(transaction.updatedAt)}</dd>\n </div>\n {transaction.expectedCompletionDate && (\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Expected Completion</dt>\n <dd className=\"text-text-primary\">{fmtDate(transaction.expectedCompletionDate)}</dd>\n </div>\n )}\n {transaction.actualCompletionDate && (\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Completed</dt>\n <dd className=\"text-text-primary\">{fmtDate(transaction.actualCompletionDate)}</dd>\n </div>\n )}\n </dl>\n </div>\n </div>\n </div>\n\n {/* Financial Breakdown */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <DollarSign className=\"h-5 w-5\" />\n Financial Breakdown\n </h2>\n <div className=\"mb-4 flex items-center justify-between text-lg font-semibold\">\n <span className=\"text-text-primary\">Total Amount</span>\n <span className=\"text-2xl text-text-primary\">\n {formatCurrency(transaction.amount, transaction.currency)}\n </span>\n </div>\n {commission && (\n <div className=\"space-y-2 border-t border-border-subtle pt-4 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Broker Commission</span>\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(commission.brokerCommission ?? 0)}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Platform Commission</span>\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(commission.platformCommission ?? 0)}\n </span>\n </div>\n {otherCharges.map((charge, i) => (\n <div key={charge?.type ?? i} className=\"flex justify-between\">\n <span className=\"text-text-secondary\">{charge?.description ?? charge?.type ?? 'Charge'}</span>\n <span className=\"font-medium text-text-primary\">{formatCurrency(charge?.amount ?? 0)}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Milestones / Timeline */}\n <div\n id=\"transaction-milestones\"\n className=\"scroll-mt-6 rounded-lg border border-border-subtle bg-bg-surface p-6\"\n >\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <Shield className=\"h-5 w-5\" />\n Transaction Milestones\n </h2>\n {milestones.length > 0 ? (\n <div className=\"space-y-3\">\n {milestones.map((milestone, i) => {\n const status = typeof milestone?.status === 'string' ? milestone.status : '';\n const Icon = statusIcons[status] ?? Clock;\n return (\n <div\n key={milestone?.id ?? i}\n className=\"flex items-center justify-between rounded-lg bg-bg-sunken/50 p-4\"\n >\n <div className=\"flex items-start gap-3\">\n <Icon className={`mt-0.5 h-5 w-5 ${milestoneIconColor(status)}`} />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{milestone?.title ?? 'Milestone'}</p>\n {milestone?.description && (\n <p className=\"text-xs text-text-secondary\">{milestone.description}</p>\n )}\n <p className=\"mt-1 text-xs text-text-secondary\">Due: {fmtDate(milestone?.dueDate)}</p>\n </div>\n </div>\n <div className=\"text-right\">\n <StatusBadge\n label={status ? status.replace(/_/g, ' ') : 'pending'}\n variant={statusVariantMap[status] ?? 'default'}\n />\n {milestone?.completedAt && (\n <p className=\"mt-1 text-xs text-text-secondary\">\n Completed: {fmtDate(milestone.completedAt)}\n </p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-files\"\n title=\"No milestones yet\"\n description=\"Milestones will appear here as the deal progresses toward closing.\"\n className=\"border-0 bg-transparent p-4\"\n />\n )}\n </div>\n </div>\n\n {/* Right Sidebar */}\n <div className=\"space-y-6\">\n {/* Documents */}\n <div\n id=\"transaction-documents\"\n className=\"scroll-mt-6 rounded-lg border border-border-subtle bg-bg-surface p-5\"\n >\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Documents</h3>\n {documents.length > 0 ? (\n <div className=\"space-y-3\">\n {documents.map((doc, i) => (\n <div\n key={doc?.id ?? i}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <FileText className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{doc?.name ?? 'Document'}</p>\n <p className=\"text-xs text-text-secondary\">\n {doc?.signedAt ? fmtDate(doc.signedAt) : 'Not signed'}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusBadge\n label={doc?.signed ? 'Signed' : 'Pending'}\n variant={doc?.signed ? 'success' : 'warning'}\n />\n {typeof doc?.url === 'string' && doc.url ? (\n <a\n href={doc.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Download ${doc?.name ?? 'document'}`}\n className=\"rounded-md p-1 text-text-secondary transition-colors hover:text-text-primary\"\n >\n <Download className=\"h-4 w-4\" />\n </a>\n ) : null}\n </div>\n </div>\n ))}\n <FileUploader onUploaded={handleDocumentsUploaded} label={savingDocs ? 'Saving…' : 'Upload document'} />\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-files\"\n title=\"No documents yet\"\n description=\"Upload contracts, agreements, and disclosures to keep this deal moving.\"\n className=\"border-0 bg-transparent p-4\"\n action={\n <FileUploader\n onUploaded={handleDocumentsUploaded}\n label={savingDocs ? 'Saving…' : 'Upload document'}\n className=\"w-full\"\n />\n }\n />\n )}\n </div>\n\n {/* Parties Involved */}\n <div\n id=\"transaction-parties\"\n className=\"scroll-mt-6 rounded-lg border border-border-subtle bg-bg-surface p-5\"\n >\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Parties Involved</h3>\n {presentParties.length > 0 ? (\n <div className=\"space-y-4\">\n {presentParties.map(({ role, user }) => (\n <div key={role} className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-bg-sunken text-xs font-semibold text-text-primary\">\n {initials(user)}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{role}</p>\n <p className=\"text-xs text-text-secondary\">{fullName(user)}</p>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No parties yet\"\n description=\"Buyers, sellers, and brokers will appear here once they join the deal.\"\n className=\"border-0 bg-transparent p-4\"\n />\n )}\n </div>\n\n {/* Escrow (if exists) */}\n {escrow && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Escrow Details</h3>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Escrow Amount</dt>\n <dd className=\"font-medium text-text-primary\">{formatCurrency(escrow.amount ?? 0)}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Status</dt>\n <dd>\n <StatusBadge\n label={escrow.status ?? 'created'}\n variant={\n escrow.status === 'released'\n ? 'success'\n : escrow.status === 'funded'\n ? 'info'\n : escrow.status === 'refunded'\n ? 'warning'\n : 'muted'\n }\n />\n </dd>\n </div>\n {escrowConditions.length > 0 && (\n <div>\n <dt className=\"mb-1 text-text-secondary\">Release Conditions</dt>\n <dd>\n <ul className=\"list-inside list-disc text-xs text-text-primary\">\n {escrowConditions.map((condition, i) => (\n <li key={i}>{condition}</li>\n ))}\n </ul>\n </dd>\n </div>\n )}\n </dl>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"TransactionDetailPage.js","names":[],"sources":["../../../../src/housingvista/pages/transactions/TransactionDetailPage.tsx"],"sourcesContent":["/**\n * HousingVista Transaction Detail Page\n * Full transaction detail with milestones, documents, parties, financial breakdown.\n * Migrated from legacy housingvista-frontend transaction-detail.tsx\n * @module housingvista\n */\n\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n ArrowLeft,\n DollarSign,\n Calendar,\n FileText,\n Shield,\n CheckCircle,\n Clock,\n AlertCircle,\n XCircle,\n Download,\n Building,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { Breadcrumbs, StatusBadge, EmptyState, LoadingSkeleton, FileUploader } from '../../components';\nimport type { BreadcrumbItem } from '../../components';\nimport { useTransaction, useUpdateTransaction } from '../../hooks';\nimport { MilestoneStepper, parseMilestones } from './milestones';\nimport type { HvUploadedFile } from '../../hooks';\nimport type { User, TransactionDocument, TransactionMilestone, CommissionCharge } from '../../types';\nimport { notify } from '../../lib/toast';\nimport { formatCurrency, formatDate } from '../../utils/helpers';\nimport { useTrackPageView } from '../../hooks/useHousingVistaAnalytics';\n\n// ---- Status badge variant map ----\nconst statusVariantMap: Record<string, 'success' | 'warning' | 'error' | 'info' | 'default' | 'muted'> = {\n completed: 'success',\n in_progress: 'info',\n pending: 'warning',\n pending_approval: 'warning',\n negotiation: 'info',\n cancelled: 'error',\n disputed: 'error',\n overdue: 'error',\n draft: 'muted',\n};\n\n// ---- Status icon map ----\nconst statusIcons: Record<string, typeof CheckCircle> = {\n completed: CheckCircle,\n in_progress: Clock,\n pending: AlertCircle,\n pending_approval: AlertCircle,\n cancelled: XCircle,\n overdue: XCircle,\n};\n\n// ---- Safe formatters/guards for opaque JSON columns ----\n// The transaction's `documents`/`milestones`/`parties`/`escrow` fields (and the\n// date fields) arrive as opaque JSON from the server, so every access is guarded\n// to never throw on null / undefined / wrong-shape data.\nconst fmtDate = (value: unknown): string => {\n const iso =\n value instanceof Date ? value.toISOString() : typeof value === 'string' && value.length > 0 ? value : null;\n return iso ? formatDate(iso) : '—';\n};\n\nconst initials = (user?: Pick<User, 'firstName' | 'lastName'>): string => {\n const first = (user?.firstName ?? '').charAt(0);\n const last = (user?.lastName ?? '').charAt(0);\n return (first + last).toUpperCase() || '?';\n};\n\nconst fullName = (user?: Pick<User, 'firstName' | 'lastName'>): string =>\n `${user?.firstName ?? ''} ${user?.lastName ?? ''}`.trim() || 'Unknown';\n\nconst milestoneIconColor = (status: string): string => {\n if (status === 'completed') return 'text-status-success-text';\n if (status === 'in_progress') return 'text-status-warning-text';\n if (status === 'overdue') return 'text-status-error-text';\n return 'text-text-secondary';\n};\n\nexport const TransactionDetailPage = () => {\n const { id } = useParams<{ id: string }>();\n\n useTrackPageView('housingvista.transaction.viewed', id);\n const navigate = useNavigate();\n const { data: transaction, loading } = useTransaction(id);\n const { updateTransaction, loading: savingDocs } = useUpdateTransaction();\n\n // ---- Loading ----\n if (loading) {\n return (\n <div className=\"p-6\">\n <LoadingSkeleton variant=\"detail\" />\n </div>\n );\n }\n\n // ---- Not Found ----\n if (!transaction) {\n return (\n <div className=\"p-6\">\n <EmptyState\n illustration=\"empty-search\"\n icon={<FileText className=\"h-12 w-12\" />}\n title=\"Transaction Not Found\"\n description=\"The transaction you're looking for doesn't exist or has been removed.\"\n action={\n <button\n onClick={() => navigate('../transactions')}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Transactions\n </button>\n }\n />\n </div>\n );\n }\n\n // ---- Guarded views of opaque JSON columns ----\n const documents: TransactionDocument[] = Array.isArray(transaction.documents) ? transaction.documents : [];\n\n // Persist newly uploaded files by appending them (real files-svc ids + URLs)\n // to the transaction's `documents` JSON array — no fabricated entries.\n const handleDocumentsUploaded = async (files: HvUploadedFile[]) => {\n if (files.length === 0) return;\n const appended: TransactionDocument[] = files.map((file) => ({\n id: file.id,\n name: file.name,\n url: file.url,\n type: file.mimeType,\n signed: false,\n required: false,\n }));\n try {\n await updateTransaction(transaction.id, { documents: [...documents, ...appended] });\n notify.success(\n 'Document attached',\n `${files.length} document${files.length > 1 ? 's' : ''} added to this transaction.`\n );\n } catch (err) {\n notify.error('Could not attach document', (err as Error).message);\n }\n };\n const milestones: TransactionMilestone[] = Array.isArray(transaction.milestones) ? transaction.milestones : [];\n const escrow = transaction.escrow && typeof transaction.escrow === 'object' ? transaction.escrow : null;\n const escrowConditions: string[] = escrow && Array.isArray(escrow.conditions) ? escrow.conditions : [];\n const commission =\n transaction.commission && typeof transaction.commission === 'object' ? transaction.commission : null;\n const otherCharges: CommissionCharge[] =\n commission && Array.isArray(commission.otherCharges) ? commission.otherCharges : [];\n\n const property = transaction.property;\n const shortId = transaction.id.split('-')[1] ?? transaction.id;\n\n const parties: { role: string; user?: User }[] = [\n { role: 'Buyer', user: transaction.buyer },\n { role: 'Seller', user: transaction.seller },\n { role: 'Tenant', user: transaction.tenant },\n { role: 'Landlord', user: transaction.landlord },\n { role: 'Broker', user: transaction.broker },\n ];\n const presentParties = parties.filter((p): p is { role: string; user: User } => Boolean(p.user));\n\n const breadcrumbs: BreadcrumbItem[] = [\n { label: 'Transactions', href: '../transactions' },\n { label: `Transaction #${shortId}` },\n ];\n\n const milestonesCompleted = milestones.filter((m) => m?.status === 'completed').length;\n const totalMilestones = milestones.length;\n const progressPercent = totalMilestones > 0 ? Math.round((milestonesCompleted / totalMilestones) * 100) : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Breadcrumbs */}\n <Breadcrumbs items={breadcrumbs} />\n\n <PagePurpose className=\"max-w-3xl\">\n This is the single source of truth for one deal — its money, milestones, documents, parties, and escrow. Use it\n to see exactly where the transaction stands, what still needs signing or approval, and who to contact to move it\n to closing.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"housingvista-transaction-detail\"\n steps={[\n {\n id: 'milestones',\n label: 'Review what is due next',\n description: `${milestonesCompleted} of ${totalMilestones} milestones complete — check the timeline for the next step.`,\n href: '#transaction-milestones',\n },\n {\n id: 'documents',\n label: 'Upload or sign documents',\n description: 'Keep paperwork current so the deal can progress to closing.',\n href: '#transaction-documents',\n },\n {\n id: 'parties',\n label: 'Contact a party',\n description: 'Reach the buyer, seller, or broker to unblock the deal.',\n href: '#transaction-parties',\n },\n {\n id: 'back',\n label: 'Back to all transactions',\n description: 'Return to the full list of deals.',\n onClick: () => navigate('../transactions'),\n },\n ]}\n />\n\n {/* Header */}\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"flex items-center gap-4\">\n <button\n onClick={() => navigate('../transactions')}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-subtle px-3 py-1.5 text-sm text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">Transaction #{shortId}</h1>\n <div className=\"mt-1 flex items-center gap-2\">\n <StatusBadge\n label={transaction.status.replace(/_/g, ' ')}\n variant={statusVariantMap[transaction.status] ?? 'default'}\n dot\n />\n <StatusBadge label={transaction.type} variant=\"muted\" />\n </div>\n </div>\n </div>\n </div>\n\n {/* Key Info Cards — primary insight zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-4\">\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <DollarSign className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Amount</span>\n </div>\n <div className=\"mt-2 text-xl font-bold text-text-primary\">\n {formatCurrency(transaction.amount, transaction.currency)}\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <FileText className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Type</span>\n </div>\n <div className=\"mt-2 text-xl font-bold capitalize text-text-primary\">{transaction.type}</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Building className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Property</span>\n </div>\n <div className=\"mt-2 truncate text-sm font-bold text-text-primary\">{property?.title ?? '—'}</div>\n <div className=\"truncate text-xs text-text-secondary\">\n {property?.location?.city ?? '—'}\n {property?.location?.state ? `, ${property.location.state}` : ''}\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Calendar className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Progress</span>\n </div>\n <div className=\"mt-2 text-xl font-bold text-text-primary\">{progressPercent}%</div>\n <div className=\"mt-1 h-1.5 w-full rounded-full bg-bg-sunken\">\n <div\n className=\"h-1.5 rounded-full bg-action-primary-bg transition-all\"\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Deal stage timeline — horizontal at-a-glance progress */}\n {milestones.length > 0 && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <Shield className=\"h-5 w-5\" />\n Deal progress\n </h2>\n <MilestoneStepper milestones={parseMilestones(transaction.milestones)} />\n </div>\n )}\n\n {/* Main Content Grid */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Main content */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* Transaction Overview */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">Transaction Overview</h2>\n <div className=\"grid grid-cols-1 gap-6 sm:grid-cols-2\">\n <div>\n <h4 className=\"mb-3 text-sm font-medium text-text-primary\">Property Details</h4>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Property</dt>\n <dd className=\"font-medium text-text-primary\">{property?.title ?? '—'}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Location</dt>\n <dd className=\"text-text-primary\">\n {property?.location?.city ?? '—'}\n {property?.location?.state ? `, ${property.location.state}` : ''}\n </dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Type</dt>\n <dd className=\"capitalize text-text-primary\">\n {property?.type ? property.type.replace('_', ' ') : '—'}\n </dd>\n </div>\n </dl>\n </div>\n <div>\n <h4 className=\"mb-3 text-sm font-medium text-text-primary\">Transaction Details</h4>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Created</dt>\n <dd className=\"text-text-primary\">{fmtDate(transaction.createdAt)}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Last Updated</dt>\n <dd className=\"text-text-primary\">{fmtDate(transaction.updatedAt)}</dd>\n </div>\n {transaction.expectedCompletionDate && (\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Expected Completion</dt>\n <dd className=\"text-text-primary\">{fmtDate(transaction.expectedCompletionDate)}</dd>\n </div>\n )}\n {transaction.actualCompletionDate && (\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Completed</dt>\n <dd className=\"text-text-primary\">{fmtDate(transaction.actualCompletionDate)}</dd>\n </div>\n )}\n </dl>\n </div>\n </div>\n </div>\n\n {/* Financial Breakdown */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <DollarSign className=\"h-5 w-5\" />\n Financial Breakdown\n </h2>\n <div className=\"mb-4 flex items-center justify-between text-lg font-semibold\">\n <span className=\"text-text-primary\">Total Amount</span>\n <span className=\"text-2xl text-text-primary\">\n {formatCurrency(transaction.amount, transaction.currency)}\n </span>\n </div>\n {commission && (\n <div className=\"space-y-2 border-t border-border-subtle pt-4 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Broker Commission</span>\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(commission.brokerCommission ?? 0)}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Platform Commission</span>\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(commission.platformCommission ?? 0)}\n </span>\n </div>\n {otherCharges.map((charge, i) => (\n <div key={charge?.type ?? i} className=\"flex justify-between\">\n <span className=\"text-text-secondary\">{charge?.description ?? charge?.type ?? 'Charge'}</span>\n <span className=\"font-medium text-text-primary\">{formatCurrency(charge?.amount ?? 0)}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Milestones / Timeline */}\n <div\n id=\"transaction-milestones\"\n className=\"scroll-mt-6 rounded-lg border border-border-subtle bg-bg-surface p-6\"\n >\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <Shield className=\"h-5 w-5\" />\n Transaction Milestones\n </h2>\n {milestones.length > 0 ? (\n <div className=\"space-y-3\">\n {milestones.map((milestone, i) => {\n const status = typeof milestone?.status === 'string' ? milestone.status : '';\n const Icon = statusIcons[status] ?? Clock;\n return (\n <div\n key={milestone?.id ?? i}\n className=\"flex items-center justify-between rounded-lg bg-bg-sunken/50 p-4\"\n >\n <div className=\"flex items-start gap-3\">\n <Icon className={`mt-0.5 h-5 w-5 ${milestoneIconColor(status)}`} />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{milestone?.title ?? 'Milestone'}</p>\n {milestone?.description && (\n <p className=\"text-xs text-text-secondary\">{milestone.description}</p>\n )}\n <p className=\"mt-1 text-xs text-text-secondary\">Due: {fmtDate(milestone?.dueDate)}</p>\n </div>\n </div>\n <div className=\"text-right\">\n <StatusBadge\n label={status ? status.replace(/_/g, ' ') : 'pending'}\n variant={statusVariantMap[status] ?? 'default'}\n />\n {milestone?.completedAt && (\n <p className=\"mt-1 text-xs text-text-secondary\">\n Completed: {fmtDate(milestone.completedAt)}\n </p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-files\"\n title=\"No milestones yet\"\n description=\"Milestones will appear here as the deal progresses toward closing.\"\n className=\"border-0 bg-transparent p-4\"\n />\n )}\n </div>\n </div>\n\n {/* Right Sidebar */}\n <div className=\"space-y-6\">\n {/* Documents */}\n <div\n id=\"transaction-documents\"\n className=\"scroll-mt-6 rounded-lg border border-border-subtle bg-bg-surface p-5\"\n >\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Documents</h3>\n {documents.length > 0 ? (\n <div className=\"space-y-3\">\n {documents.map((doc, i) => (\n <div\n key={doc?.id ?? i}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <FileText className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{doc?.name ?? 'Document'}</p>\n <p className=\"text-xs text-text-secondary\">\n {doc?.signedAt ? fmtDate(doc.signedAt) : 'Not signed'}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusBadge\n label={doc?.signed ? 'Signed' : 'Pending'}\n variant={doc?.signed ? 'success' : 'warning'}\n />\n {typeof doc?.url === 'string' && doc.url ? (\n <a\n href={doc.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Download ${doc?.name ?? 'document'}`}\n className=\"rounded-md p-1 text-text-secondary transition-colors hover:text-text-primary\"\n >\n <Download className=\"h-4 w-4\" />\n </a>\n ) : null}\n </div>\n </div>\n ))}\n <FileUploader onUploaded={handleDocumentsUploaded} label={savingDocs ? 'Saving…' : 'Upload document'} />\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-files\"\n title=\"No documents yet\"\n description=\"Upload contracts, agreements, and disclosures to keep this deal moving.\"\n className=\"border-0 bg-transparent p-4\"\n action={\n <FileUploader\n onUploaded={handleDocumentsUploaded}\n label={savingDocs ? 'Saving…' : 'Upload document'}\n className=\"w-full\"\n />\n }\n />\n )}\n </div>\n\n {/* Parties Involved */}\n <div\n id=\"transaction-parties\"\n className=\"scroll-mt-6 rounded-lg border border-border-subtle bg-bg-surface p-5\"\n >\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Parties Involved</h3>\n {presentParties.length > 0 ? (\n <div className=\"space-y-4\">\n {presentParties.map(({ role, user }) => (\n <div key={role} className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-bg-sunken text-xs font-semibold text-text-primary\">\n {initials(user)}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{role}</p>\n <p className=\"text-xs text-text-secondary\">{fullName(user)}</p>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No parties yet\"\n description=\"Buyers, sellers, and brokers will appear here once they join the deal.\"\n className=\"border-0 bg-transparent p-4\"\n />\n )}\n </div>\n\n {/* Escrow (if exists) */}\n {escrow && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Escrow Details</h3>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Escrow Amount</dt>\n <dd className=\"font-medium text-text-primary\">{formatCurrency(escrow.amount ?? 0)}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Status</dt>\n <dd>\n <StatusBadge\n label={escrow.status ?? 'created'}\n variant={\n escrow.status === 'released'\n ? 'success'\n : escrow.status === 'funded'\n ? 'info'\n : escrow.status === 'refunded'\n ? 'warning'\n : 'muted'\n }\n />\n </dd>\n </div>\n {escrowConditions.length > 0 && (\n <div>\n <dt className=\"mb-1 text-text-secondary\">Release Conditions</dt>\n <dd>\n <ul className=\"list-inside list-disc text-xs text-text-primary\">\n {escrowConditions.map((condition, i) => (\n <li key={i}>{condition}</li>\n ))}\n </ul>\n </dd>\n </div>\n )}\n </dl>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionsPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/transactions/TransactionsPage.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AA0DH,eAAO,MAAM,gBAAgB,mCAgjB5B,CAAC"}
1
+ {"version":3,"file":"TransactionsPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/transactions/TransactionsPage.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AA2DH,eAAO,MAAM,gBAAgB,mCAijB5B,CAAC"}
@@ -5,29 +5,30 @@ import { DataTable as ee } from "../../components/DataTable.js";
5
5
  import { StatusBadge as i } from "../../components/StatusBadge.js";
6
6
  import { EmptyState as a } from "../../components/EmptyState.js";
7
7
  import { FilterBar as o } from "../../components/FilterBar.js";
8
- import { useCreateTransaction as te, useProperties as ne, useTransactions as re } from "../../hooks/index.js";
8
+ import { useTrackPageView as te } from "../../hooks/useHousingVistaAnalytics.js";
9
+ import { useCreateTransaction as ne, useProperties as re, useTransactions as ie } from "../../hooks/index.js";
9
10
  import { notify as s } from "../../lib/toast.js";
10
11
  import "../../components/index.js";
11
- import { useServerPagination as ie } from "../../hooks/useServerPagination.js";
12
- import { MilestoneStepper as ae, ProgressBar as c, milestoneProgress as l, parseEscrow as u, parseMilestones as d } from "./milestones.js";
13
- import { useEffect as f, useMemo as p, useState as m } from "react";
14
- import { ArrowRight as oe, Building as se, CheckCircle as ce, DollarSign as le, Eye as ue, FileText as h, Plus as g, Shield as de, TrendingUp as fe, Upload as pe, Users as me } from "lucide-react";
15
- import { useNavigate as he } from "react-router-dom";
12
+ import { useServerPagination as ae } from "../../hooks/useServerPagination.js";
13
+ import { MilestoneStepper as c, ProgressBar as l, milestoneProgress as u, parseEscrow as d, parseMilestones as f } from "./milestones.js";
14
+ import { useEffect as p, useMemo as oe, useState as m } from "react";
15
+ import { ArrowRight as se, Building as ce, CheckCircle as le, DollarSign as ue, Eye as de, FileText as h, Plus as g, Shield as fe, TrendingUp as pe, Upload as me, Users as he } from "lucide-react";
16
+ import { useNavigate as ge } from "react-router-dom";
16
17
  import { jsx as _, jsxs as v } from "react/jsx-runtime";
17
- import { useI18n as ge } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
18
- import { Button as y, EmphasisPanel as _e, GlassCard as ve, NextSteps as ye, ResponsiveDialog as be, ResponsiveDialogContent as xe, ResponsiveDialogDescription as Se, ResponsiveDialogFooter as Ce, ResponsiveDialogHeader as we, ResponsiveDialogTitle as b } from "@burdenoff/fe-libs/ui";
18
+ import { useI18n as _e } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
19
+ import { Button as y, EmphasisPanel as ve, GlassCard as ye, NextSteps as be, ResponsiveDialog as xe, ResponsiveDialogContent as Se, ResponsiveDialogDescription as Ce, ResponsiveDialogFooter as we, ResponsiveDialogHeader as b, ResponsiveDialogTitle as x } from "@burdenoff/fe-libs/ui";
19
20
  //#region src/housingvista/pages/transactions/TransactionsPage.tsx
20
- var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", S = [
21
+ var S = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", C = [
21
22
  "sale",
22
23
  "purchase",
23
24
  "rental",
24
25
  "lease"
25
- ], C = [
26
+ ], w = [
26
27
  "draft",
27
28
  "negotiation",
28
29
  "under_contract",
29
30
  "completed"
30
- ], w = {
31
+ ], T = {
31
32
  draft: "muted",
32
33
  negotiation: "info",
33
34
  under_contract: "warning",
@@ -37,43 +38,44 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
37
38
  completed: "success",
38
39
  cancelled: "error",
39
40
  disputed: "error"
40
- }, T = () => {
41
- let T = he(), { t: E } = ge(), D = ie(10), [O, k] = m(""), [Te, Ee] = m(""), [A, De] = m("all");
42
- f(() => {
43
- let e = setTimeout(() => Ee(O), 300);
41
+ }, E = () => {
42
+ te("housingvista.transaction.viewed");
43
+ let E = ge(), { t: D } = _e(), O = ae(10), [k, Te] = m(""), [Ee, De] = m(""), [A, Oe] = m("all");
44
+ p(() => {
45
+ let e = setTimeout(() => De(k), 300);
44
46
  return () => clearTimeout(e);
45
- }, [O]);
46
- let { data: j, loading: Oe } = re({
47
+ }, [k]);
48
+ let { data: j, loading: ke } = ie({
47
49
  filter: {
48
- search: Te.trim() || void 0,
50
+ search: Ee.trim() || void 0,
49
51
  status: A === "all" ? void 0 : A
50
52
  },
51
- pagination: D.pagination
52
- }), { createTransaction: ke, loading: M } = te(), { data: N } = ne({ pagination: {
53
+ pagination: O.pagination
54
+ }), { createTransaction: Ae, loading: M } = ne(), { data: N } = re({ pagination: {
53
55
  limit: 50,
54
56
  offset: 0
55
57
  } }), [P, F] = m(null);
56
- f(() => {
58
+ p(() => {
57
59
  if (j.length === 0) {
58
60
  P !== null && F(null);
59
61
  return;
60
62
  }
61
63
  (!P || !j.some((e) => e.id === P)) && F(j[0].id);
62
64
  }, [j, P]);
63
- let I = j.find((e) => e.id === P) ?? null, Ae = (e) => {
64
- k(e), D.setPage(1);
65
+ let I = j.find((e) => e.id === P) ?? null, je = (e) => {
66
+ Te(e), O.setPage(1);
65
67
  }, L = (e) => {
66
- De(e), D.setPage(1);
68
+ Oe(e), O.setPage(1);
67
69
  }, R = (e, t) => {
68
- let n = E(e);
70
+ let n = D(e);
69
71
  return n === e ? t : n;
70
- }, [je, z] = m(!1), [B, V] = m(""), [H, U] = m(""), [W, G] = m("sale"), [K, q] = m("draft"), [J, Y] = m(""), [X, Z] = m("USD"), Q = () => {
72
+ }, [Me, z] = m(!1), [B, V] = m(""), [H, U] = m(""), [W, G] = m("sale"), [K, q] = m("draft"), [J, Y] = m(""), [X, Z] = m("USD"), Q = () => {
71
73
  V(""), U(""), G("sale"), q("draft"), Y(""), Z("USD"), z(!0);
72
- }, Me = (e) => {
74
+ }, Ne = (e) => {
73
75
  V(e);
74
76
  let t = N.find((t) => t.id === e);
75
77
  t?.price?.currency && Z(t.price.currency);
76
- }, Ne = async (e) => {
78
+ }, Pe = async (e) => {
77
79
  if (e.preventDefault(), !B) {
78
80
  s.warning("Select a property", "Choose the property this transaction is for.");
79
81
  return;
@@ -88,7 +90,7 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
88
90
  return;
89
91
  }
90
92
  try {
91
- await ke({
93
+ await Ae({
92
94
  propertyId: B,
93
95
  title: H.trim(),
94
96
  type: W,
@@ -99,7 +101,7 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
99
101
  } catch (e) {
100
102
  s.error("Could not create transaction", e.message);
101
103
  }
102
- }, Pe = [
104
+ }, Fe = [
103
105
  {
104
106
  value: "all",
105
107
  label: R("housingvista.transactions.statusTabs.all", "All")
@@ -124,12 +126,12 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
124
126
  value: "pending_approval",
125
127
  label: R("housingvista.transactions.statusTabs.pending", "Pending")
126
128
  }
127
- ], $ = p(() => ({
129
+ ], $ = oe(() => ({
128
130
  total: j.length,
129
131
  totalValue: j.reduce((e, t) => e + t.amount, 0),
130
132
  active: j.filter((e) => e.status === "in_progress" || e.status === "negotiation" || e.status === "pending_approval").length,
131
133
  completed: j.filter((e) => e.status === "completed").length
132
- }), [j]), Fe = [
134
+ }), [j]), Ie = [
133
135
  {
134
136
  key: "id",
135
137
  header: R("housingvista.transactions.table.id", "ID"),
@@ -169,7 +171,7 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
169
171
  header: R("housingvista.transactions.table.status", "Status"),
170
172
  render: (e) => /* @__PURE__ */ _(i, {
171
173
  label: e.status.replace(/_/g, " "),
172
- variant: w[e.status] ?? "default",
174
+ variant: T[e.status] ?? "default",
173
175
  dot: !0
174
176
  })
175
177
  },
@@ -187,10 +189,10 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
187
189
  header: R("housingvista.transactions.table.progress", "Progress"),
188
190
  sortable: !1,
189
191
  render: (e) => {
190
- let t = l(d(e.milestones));
192
+ let t = u(f(e.milestones));
191
193
  return /* @__PURE__ */ v("div", {
192
194
  className: "flex min-w-28 items-center gap-2",
193
- children: [/* @__PURE__ */ _(c, {
195
+ children: [/* @__PURE__ */ _(l, {
194
196
  percent: t,
195
197
  className: "w-20"
196
198
  }), /* @__PURE__ */ v("span", {
@@ -215,10 +217,10 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
215
217
  sortable: !1,
216
218
  render: (e) => /* @__PURE__ */ v("button", {
217
219
  onClick: (t) => {
218
- t.stopPropagation(), T(e.id);
220
+ t.stopPropagation(), E(e.id);
219
221
  },
220
222
  className: "inline-flex items-center gap-1 text-xs font-medium text-text-secondary transition-colors hover:text-text-primary",
221
- children: [/* @__PURE__ */ _(ue, { className: "h-3.5 w-3.5" }), R("housingvista.transactions.table.view", "View")]
223
+ children: [/* @__PURE__ */ _(de, { className: "h-3.5 w-3.5" }), R("housingvista.transactions.table.view", "View")]
222
224
  })
223
225
  }
224
226
  ];
@@ -233,7 +235,7 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
233
235
  children: [/* @__PURE__ */ _(g, { className: "h-4 w-4" }), R("housingvista.transactions.actions.newTransaction", "New Transaction")]
234
236
  }),
235
237
  children: [
236
- /* @__PURE__ */ _(_e, {
238
+ /* @__PURE__ */ _(ve, {
237
239
  className: "p-4",
238
240
  children: /* @__PURE__ */ v("div", {
239
241
  className: "grid grid-cols-2 gap-4 lg:grid-cols-4",
@@ -247,22 +249,22 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
247
249
  label: R("housingvista.transactions.stats.totalValue", "Total Value"),
248
250
  value: $.totalValue,
249
251
  prefix: "$",
250
- icon: /* @__PURE__ */ _(le, { className: "h-5 w-5" })
252
+ icon: /* @__PURE__ */ _(ue, { className: "h-5 w-5" })
251
253
  }),
252
254
  /* @__PURE__ */ _(r, {
253
255
  label: R("housingvista.transactions.stats.active", "Active"),
254
256
  value: $.active,
255
- icon: /* @__PURE__ */ _(fe, { className: "h-5 w-5" })
257
+ icon: /* @__PURE__ */ _(pe, { className: "h-5 w-5" })
256
258
  }),
257
259
  /* @__PURE__ */ _(r, {
258
260
  label: R("housingvista.transactions.stats.completed", "Completed"),
259
261
  value: $.completed,
260
- icon: /* @__PURE__ */ _(ce, { className: "h-5 w-5" })
262
+ icon: /* @__PURE__ */ _(le, { className: "h-5 w-5" })
261
263
  })
262
264
  ]
263
265
  })
264
266
  }),
265
- /* @__PURE__ */ _(ye, {
267
+ /* @__PURE__ */ _(be, {
266
268
  storageKey: "housingvista-transactions",
267
269
  steps: [
268
270
  {
@@ -277,25 +279,25 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
277
279
  description: R("housingvista.transactions.nextSteps.openDesc", "Drill into escrow, approvals, and the full timeline."),
278
280
  onClick: () => {
279
281
  let e = j[0];
280
- e && T(`../transactions/${e.id}`);
282
+ e && E(`../transactions/${e.id}`);
281
283
  }
282
284
  },
283
285
  {
284
286
  id: "browse-properties",
285
287
  label: R("housingvista.transactions.nextSteps.browse", "Start a new deal from a listing"),
286
288
  description: R("housingvista.transactions.nextSteps.browseDesc", "Find a property to make an offer on."),
287
- onClick: () => T("../properties")
289
+ onClick: () => E("../properties")
288
290
  }
289
291
  ]
290
292
  }),
291
293
  /* @__PURE__ */ _(o, {
292
- searchValue: O,
293
- onSearchChange: Ae,
294
+ searchValue: k,
295
+ onSearchChange: je,
294
296
  searchPlaceholder: R("housingvista.transactions.search.placeholder", "Search by property or transaction ID...")
295
297
  }),
296
298
  /* @__PURE__ */ _("div", {
297
299
  className: "flex flex-wrap items-center gap-2",
298
- children: Pe.map((e) => /* @__PURE__ */ _("button", {
300
+ children: Fe.map((e) => /* @__PURE__ */ _("button", {
299
301
  onClick: () => L(e.value),
300
302
  className: `rounded-md px-3 py-1.5 text-sm font-medium transition-colors ${A === e.value ? "bg-action-primary-bg text-action-primary-text" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"}`,
301
303
  children: e.label
@@ -317,21 +319,21 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
317
319
  children: [/* @__PURE__ */ _("div", {
318
320
  className: "min-w-0",
319
321
  children: /* @__PURE__ */ _(ee, {
320
- columns: Fe,
322
+ columns: Ie,
321
323
  data: j,
322
324
  keyField: "id",
323
325
  onRowClick: (e) => F(e.id),
324
- pageSize: D.pageSize,
326
+ pageSize: O.pageSize,
325
327
  serverPagination: {
326
- page: D.page,
327
- pageSize: D.pageSize,
328
- hasNextPage: j.length >= D.pageSize,
329
- loading: Oe,
330
- onPageChange: D.setPage,
331
- onPageSizeChange: D.setPageSize
328
+ page: O.page,
329
+ pageSize: O.pageSize,
330
+ hasNextPage: j.length >= O.pageSize,
331
+ loading: ke,
332
+ onPageChange: O.setPage,
333
+ onPageSizeChange: O.setPageSize
332
334
  }
333
335
  })
334
- }), I && /* @__PURE__ */ v(ve, {
336
+ }), I && /* @__PURE__ */ v(ye, {
335
337
  treatment: "insight",
336
338
  className: "h-fit p-5 xl:sticky xl:top-6",
337
339
  children: [
@@ -348,13 +350,13 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
348
350
  })]
349
351
  }), /* @__PURE__ */ _(i, {
350
352
  label: I.status.replace(/_/g, " "),
351
- variant: w[I.status] ?? "default",
353
+ variant: T[I.status] ?? "default",
352
354
  dot: !0
353
355
  })]
354
356
  }),
355
357
  /* @__PURE__ */ v("div", {
356
358
  className: "mb-4 flex items-center gap-2 text-sm text-text-primary",
357
- children: [/* @__PURE__ */ _(se, { className: "h-4 w-4 shrink-0 text-text-secondary" }), /* @__PURE__ */ _("span", {
359
+ children: [/* @__PURE__ */ _(ce, { className: "h-4 w-4 shrink-0 text-text-secondary" }), /* @__PURE__ */ _("span", {
358
360
  className: "truncate",
359
361
  children: I.property?.title ?? "Property"
360
362
  })]
@@ -363,11 +365,11 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
363
365
  className: "mb-4 rounded-lg bg-bg-sunken/50 p-3",
364
366
  children: [/* @__PURE__ */ v("div", {
365
367
  className: "mb-2 flex items-center gap-1.5 text-xs font-medium text-text-secondary",
366
- children: [/* @__PURE__ */ _(de, { className: "h-3.5 w-3.5" }), "Deal stages"]
367
- }), /* @__PURE__ */ _(ae, { milestones: d(I.milestones) })]
368
+ children: [/* @__PURE__ */ _(fe, { className: "h-3.5 w-3.5" }), "Deal stages"]
369
+ }), /* @__PURE__ */ _(c, { milestones: f(I.milestones) })]
368
370
  }),
369
371
  (() => {
370
- let t = u(I.escrow), n = t?.amount != null;
372
+ let t = d(I.escrow), n = t?.amount != null;
371
373
  return /* @__PURE__ */ v("div", {
372
374
  className: "mb-4",
373
375
  children: [
@@ -392,8 +394,8 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
392
394
  children: [/* @__PURE__ */ v(y, {
393
395
  type: "button",
394
396
  size: "sm",
395
- onClick: () => T(`${I.id}#transaction-parties`),
396
- children: [/* @__PURE__ */ _(me, { className: "h-4 w-4" }), /* @__PURE__ */ _("span", {
397
+ onClick: () => E(`${I.id}#transaction-parties`),
398
+ children: [/* @__PURE__ */ _(he, { className: "h-4 w-4" }), /* @__PURE__ */ _("span", {
397
399
  className: "ml-1",
398
400
  children: "Parties"
399
401
  })]
@@ -401,8 +403,8 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
401
403
  type: "button",
402
404
  variant: "outline",
403
405
  size: "sm",
404
- onClick: () => T(`${I.id}#transaction-documents`),
405
- children: [/* @__PURE__ */ _(pe, { className: "h-4 w-4" }), /* @__PURE__ */ _("span", {
406
+ onClick: () => E(`${I.id}#transaction-documents`),
407
+ children: [/* @__PURE__ */ _(me, { className: "h-4 w-4" }), /* @__PURE__ */ _("span", {
406
408
  className: "ml-1",
407
409
  children: "Documents"
408
410
  })]
@@ -413,8 +415,8 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
413
415
  variant: "ghost",
414
416
  size: "sm",
415
417
  className: "mt-2 w-full",
416
- onClick: () => T(I.id),
417
- children: ["Open full deal", /* @__PURE__ */ _(oe, { className: "ml-1 h-4 w-4" })]
418
+ onClick: () => E(I.id),
419
+ children: ["Open full deal", /* @__PURE__ */ _(se, { className: "ml-1 h-4 w-4" })]
418
420
  })
419
421
  ]
420
422
  })]
@@ -430,15 +432,15 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
430
432
  children: [/* @__PURE__ */ _(g, { className: "h-4 w-4" }), R("housingvista.transactions.empty.createNewTransaction", "Create New Transaction")]
431
433
  })
432
434
  }),
433
- /* @__PURE__ */ _(be, {
434
- open: je,
435
+ /* @__PURE__ */ _(xe, {
436
+ open: Me,
435
437
  onOpenChange: z,
436
- children: /* @__PURE__ */ _(xe, {
438
+ children: /* @__PURE__ */ _(Se, {
437
439
  className: "sm:max-w-lg",
438
440
  children: /* @__PURE__ */ v("form", {
439
- onSubmit: Ne,
441
+ onSubmit: Pe,
440
442
  children: [
441
- /* @__PURE__ */ v(we, { children: [/* @__PURE__ */ _(b, { children: R("housingvista.transactions.create.title", "New transaction") }), /* @__PURE__ */ _(Se, { children: R("housingvista.transactions.create.description", "Start a deal against a property. You can add documents, milestones, and escrow later.") })] }),
443
+ /* @__PURE__ */ v(b, { children: [/* @__PURE__ */ _(x, { children: R("housingvista.transactions.create.title", "New transaction") }), /* @__PURE__ */ _(Ce, { children: R("housingvista.transactions.create.description", "Start a deal against a property. You can add documents, milestones, and escrow later.") })] }),
442
444
  /* @__PURE__ */ v("div", {
443
445
  className: "space-y-3 py-2",
444
446
  children: [
@@ -448,8 +450,8 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
448
450
  }), /* @__PURE__ */ v("select", {
449
451
  required: !0,
450
452
  value: B,
451
- onChange: (e) => Me(e.target.value),
452
- className: x,
453
+ onChange: (e) => Ne(e.target.value),
454
+ className: S,
453
455
  children: [/* @__PURE__ */ _("option", {
454
456
  value: "",
455
457
  disabled: !0,
@@ -468,7 +470,7 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
468
470
  placeholder: R("housingvista.transactions.create.titlePlaceholder", "e.g. Maple Court purchase"),
469
471
  value: H,
470
472
  onChange: (e) => U(e.target.value),
471
- className: x
473
+ className: S
472
474
  })] }),
473
475
  /* @__PURE__ */ v("div", {
474
476
  className: "grid grid-cols-1 gap-3 sm:grid-cols-2",
@@ -478,8 +480,8 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
478
480
  }), /* @__PURE__ */ _("select", {
479
481
  value: W,
480
482
  onChange: (e) => G(e.target.value),
481
- className: x,
482
- children: S.map((e) => /* @__PURE__ */ _("option", {
483
+ className: S,
484
+ children: C.map((e) => /* @__PURE__ */ _("option", {
483
485
  value: e,
484
486
  className: "capitalize",
485
487
  children: e
@@ -490,8 +492,8 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
490
492
  }), /* @__PURE__ */ _("select", {
491
493
  value: K,
492
494
  onChange: (e) => q(e.target.value),
493
- className: x,
494
- children: C.map((e) => /* @__PURE__ */ _("option", {
495
+ className: S,
496
+ children: w.map((e) => /* @__PURE__ */ _("option", {
495
497
  value: e,
496
498
  children: e.replace(/_/g, " ")
497
499
  }, e))
@@ -510,7 +512,7 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
510
512
  placeholder: "0.00",
511
513
  value: J,
512
514
  onChange: (e) => Y(e.target.value),
513
- className: x
515
+ className: S
514
516
  })] }), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
515
517
  className: "mb-1.5 block text-sm font-medium text-text-primary",
516
518
  children: R("housingvista.transactions.create.currency", "Currency")
@@ -520,12 +522,12 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
520
522
  value: X,
521
523
  onChange: (e) => Z(e.target.value.toUpperCase()),
522
524
  maxLength: 3,
523
- className: x
525
+ className: S
524
526
  })] })]
525
527
  })
526
528
  ]
527
529
  }),
528
- /* @__PURE__ */ v(Ce, { children: [/* @__PURE__ */ _(y, {
530
+ /* @__PURE__ */ v(we, { children: [/* @__PURE__ */ _(y, {
529
531
  type: "button",
530
532
  variant: "outline",
531
533
  onClick: () => z(!1),
@@ -543,6 +545,6 @@ var x = "h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 t
543
545
  });
544
546
  };
545
547
  //#endregion
546
- export { T as TransactionsPage };
548
+ export { E as TransactionsPage };
547
549
 
548
550
  //# sourceMappingURL=TransactionsPage.js.map