@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.
- package/dist/housingvista/HousingVistaRoutes.d.ts.map +1 -1
- package/dist/housingvista/HousingVistaRoutes.js +136 -37
- package/dist/housingvista/HousingVistaRoutes.js.map +1 -1
- package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts +1 -1
- package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts.map +1 -1
- package/dist/housingvista/hooks/useHousingVistaAnalytics.js +4 -4
- package/dist/housingvista/hooks/useHousingVistaAnalytics.js.map +1 -1
- package/dist/housingvista/pages/amc/AMCManagementPage.d.ts.map +1 -1
- package/dist/housingvista/pages/amc/AMCManagementPage.js +62 -60
- package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
- package/dist/housingvista/pages/assets/AssetDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/assets/AssetDetailPage.js +141 -138
- package/dist/housingvista/pages/assets/AssetDetailPage.js.map +1 -1
- package/dist/housingvista/pages/assets/AssetManagementPage.d.ts.map +1 -1
- package/dist/housingvista/pages/assets/AssetManagementPage.js +193 -191
- package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
- package/dist/housingvista/pages/chat/ChatPage.d.ts.map +1 -1
- package/dist/housingvista/pages/chat/ChatPage.js +115 -113
- package/dist/housingvista/pages/chat/ChatPage.js.map +1 -1
- package/dist/housingvista/pages/finance/HomeLoanDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/finance/HomeLoanDetailPage.js +152 -149
- package/dist/housingvista/pages/finance/HomeLoanDetailPage.js.map +1 -1
- package/dist/housingvista/pages/finance/HomeLoansPage.d.ts.map +1 -1
- package/dist/housingvista/pages/finance/HomeLoansPage.js +141 -139
- package/dist/housingvista/pages/finance/HomeLoansPage.js.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentDetailPage.js +290 -287
- package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentsPage.js +64 -62
- package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
- package/dist/housingvista/pages/legal/LegalPage.d.ts.map +1 -1
- package/dist/housingvista/pages/legal/LegalPage.js +95 -93
- package/dist/housingvista/pages/legal/LegalPage.js.map +1 -1
- package/dist/housingvista/pages/legal/LegalServiceDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/legal/LegalServiceDetailPage.js +129 -126
- package/dist/housingvista/pages/legal/LegalServiceDetailPage.js.map +1 -1
- package/dist/housingvista/pages/market/AreaInsightsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/market/AreaInsightsPage.js +99 -97
- package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
- package/dist/housingvista/pages/market/MarketAnalyticsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/market/MarketAnalyticsPage.js +138 -136
- package/dist/housingvista/pages/market/MarketAnalyticsPage.js.map +1 -1
- package/dist/housingvista/pages/marketplace/MarketplacePage.d.ts.map +1 -1
- package/dist/housingvista/pages/marketplace/MarketplacePage.js +99 -97
- package/dist/housingvista/pages/marketplace/MarketplacePage.js.map +1 -1
- package/dist/housingvista/pages/marketplace/ServiceDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/marketplace/ServiceDetailPage.js +137 -134
- package/dist/housingvista/pages/marketplace/ServiceDetailPage.js.map +1 -1
- package/dist/housingvista/pages/offers/OffersPage.d.ts.map +1 -1
- package/dist/housingvista/pages/offers/OffersPage.js +94 -92
- package/dist/housingvista/pages/offers/OffersPage.js.map +1 -1
- package/dist/housingvista/pages/properties/AddPropertyPage.d.ts.map +1 -1
- package/dist/housingvista/pages/properties/AddPropertyPage.js +280 -279
- package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
- package/dist/housingvista/pages/rental/RentalManagementPage.d.ts.map +1 -1
- package/dist/housingvista/pages/rental/RentalManagementPage.js +153 -151
- package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
- package/dist/housingvista/pages/settings/ProfilePage.d.ts.map +1 -1
- package/dist/housingvista/pages/settings/ProfilePage.js +52 -50
- package/dist/housingvista/pages/settings/ProfilePage.js.map +1 -1
- package/dist/housingvista/pages/settings/SettingsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/settings/SettingsPage.js +54 -52
- package/dist/housingvista/pages/settings/SettingsPage.js.map +1 -1
- package/dist/housingvista/pages/shortlist/ShortlistPage.d.ts.map +1 -1
- package/dist/housingvista/pages/shortlist/ShortlistPage.js +43 -41
- package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionDetailPage.js +211 -208
- package/dist/housingvista/pages/transactions/TransactionDetailPage.js.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionsPage.js +85 -83
- package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
- package/dist/housingvista/pages/verification/VerificationDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/verification/VerificationDetailPage.js +25 -22
- package/dist/housingvista/pages/verification/VerificationDetailPage.js.map +1 -1
- package/dist/housingvista/pages/verification/VerificationPage.d.ts.map +1 -1
- package/dist/housingvista/pages/verification/VerificationPage.js +123 -121
- package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
- package/dist/housingvista/pages/viewings/ViewingsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/viewings/ViewingsPage.js +128 -126
- package/dist/housingvista/pages/viewings/ViewingsPage.js.map +1 -1
- 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":";;;;;;;;;;;;;;;;AAiCA,IAAM,IAAmG;CACvG,WAAW;CACX,aAAa;CACb,SAAS;CACT,kBAAkB;CAClB,aAAa;CACb,WAAW;CACX,UAAU;CACV,SAAS;CACT,OAAO;CACR,EAGK,IAAkD;CACtD,WAAW;CACX,aAAa;CACb,SAAS;CACT,kBAAkB;CAClB,WAAW;CACX,SAAS;CACV,EAMK,KAAW,MAA2B;CAC1C,IAAM,IACJ,aAAiB,OAAO,EAAM,aAAa,GAAG,OAAO,KAAU,YAAY,EAAM,SAAS,IAAI,IAAQ;AACxG,QAAO,IAAM,EAAW,EAAI,GAAG;GAG3B,KAAY,QACD,GAAM,aAAa,IAAI,OAAO,EAAE,IACjC,GAAM,YAAY,IAAI,OAAO,EAAE,EACvB,aAAa,IAAI,KAGnC,KAAY,MAChB,GAAG,GAAM,aAAa,GAAG,GAAG,GAAM,YAAY,KAAK,MAAM,IAAI,WAEzD,KAAsB,MACtB,MAAW,cAAoB,6BAC/B,MAAW,gBAAsB,6BACjC,MAAW,YAAkB,2BAC1B,uBAGI,UAA8B;CACzC,IAAM,EAAE,UAAO,GAA2B;AAE1C,GAAiB,mCAAmC,EAAG;CACvD,IAAM,IAAW,GAAa,EACxB,EAAE,MAAM,GAAa,eAAY,EAAe,EAAG,EACnD,EAAE,sBAAmB,SAAS,MAAe,GAAsB;AAGzE,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EAChC,CAAA;AAKV,KAAI,CAAC,EACH,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,cAAa;GACb,MAAM,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA;GACxC,OAAM;GACN,aAAY;GACZ,QACE,kBAAC,UAAD;IACE,eAAe,EAAS,kBAAkB;IAC1C,WAAU;cAFZ,CAIE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,uBAE1B;;GAEX,CAAA;EACE,CAAA;CAKV,IAAM,IAAmC,MAAM,QAAQ,EAAY,UAAU,GAAG,EAAY,YAAY,EAAE,EAIpG,IAA0B,OAAO,MAA4B;AACjE,MAAI,EAAM,WAAW,EAAG;EACxB,IAAM,IAAkC,EAAM,KAAK,OAAU;GAC3D,IAAI,EAAK;GACT,MAAM,EAAK;GACX,KAAK,EAAK;GACV,MAAM,EAAK;GACX,QAAQ;GACR,UAAU;GACX,EAAE;AACH,MAAI;AAEF,GADA,MAAM,EAAkB,EAAY,IAAI,EAAE,WAAW,CAAC,GAAG,GAAW,GAAG,EAAS,EAAE,CAAC,EACnF,EAAO,QACL,qBACA,GAAG,EAAM,OAAO,WAAW,EAAM,SAAS,IAAI,MAAM,GAAG,6BACxD;WACM,GAAK;AACZ,KAAO,MAAM,6BAA8B,EAAc,QAAQ;;IAG/D,IAAqC,MAAM,QAAQ,EAAY,WAAW,GAAG,EAAY,aAAa,EAAE,EACxG,IAAS,EAAY,UAAU,OAAO,EAAY,UAAW,WAAW,EAAY,SAAS,MAC7F,IAA6B,KAAU,MAAM,QAAQ,EAAO,WAAW,GAAG,EAAO,aAAa,EAAE,EAChG,IACJ,EAAY,cAAc,OAAO,EAAY,cAAe,WAAW,EAAY,aAAa,MAC5F,IACJ,KAAc,MAAM,QAAQ,EAAW,aAAa,GAAG,EAAW,eAAe,EAAE,EAE/E,IAAW,EAAY,UACvB,IAAU,EAAY,GAAG,MAAM,IAAI,CAAC,MAAM,EAAY,IAStD,IAP2C;EAC/C;GAAE,MAAM;GAAS,MAAM,EAAY;GAAO;EAC1C;GAAE,MAAM;GAAU,MAAM,EAAY;GAAQ;EAC5C;GAAE,MAAM;GAAU,MAAM,EAAY;GAAQ;EAC5C;GAAE,MAAM;GAAY,MAAM,EAAY;GAAU;EAChD;GAAE,MAAM;GAAU,MAAM,EAAY;GAAQ;EAC7C,CAC8B,QAAQ,MAAyC,EAAQ,EAAE,KAAM,EAE1F,IAAgC,CACpC;EAAE,OAAO;EAAgB,MAAM;EAAmB,EAClD,EAAE,OAAO,gBAAgB,KAAW,CACrC,EAEK,IAAsB,EAAW,QAAQ,MAAM,GAAG,WAAW,YAAY,CAAC,QAC1E,IAAkB,EAAW,QAC7B,IAAkB,IAAkB,IAAI,KAAK,MAAO,IAAsB,IAAmB,IAAI,GAAG;AAE1G,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,kBAAC,GAAD,EAAa,OAAO,GAAe,CAAA;GAEnC,kBAAC,GAAD;IAAa,WAAU;cAAY;IAIrB,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa,GAAG,EAAoB,MAAM,EAAgB;MAC1D,MAAM;MACP;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM;MACP;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM;MACP;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAS,kBAAkB;MAC3C;KACF;IACD,CAAA;GAGF,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,UAAD;MACE,eAAe,EAAS,kBAAkB;MAC1C,WAAU;gBAFZ,CAIE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,OAE1B;SACT,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;MAAI,WAAU;gBAAd,CAAqD,iBAAc,EAAa;SAChF,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,OAAO,EAAY,OAAO,QAAQ,MAAM,IAAI;OAC5C,SAAS,EAAiB,EAAY,WAAW;OACjD,KAAA;OACA,CAAA,EACF,kBAAC,GAAD;OAAa,OAAO,EAAY;OAAM,SAAQ;OAAU,CAAA,CACpD;QACF,EAAA,CAAA,CACF;;IACF,CAAA;GAGN,kBAAC,GAAD;IAAe,WAAU;cACvB,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,EAClC,kBAAC,QAAD;SAAM,WAAU;mBAAsB;SAAa,CAAA,CAC/C;WACN,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAe,EAAY,QAAQ,EAAY,SAAS;QACrD,CAAA,CACF;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAChC,kBAAC,QAAD;SAAM,WAAU;mBAAsB;SAAW,CAAA,CAC7C;WACN,kBAAC,OAAD;QAAK,WAAU;kBAAuD,EAAY;QAAW,CAAA,CACzF;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAChC,kBAAC,QAAD;UAAM,WAAU;oBAAsB;UAAe,CAAA,CACjD;;QACN,kBAAC,OAAD;SAAK,WAAU;mBAAqD,GAAU,SAAS;SAAU,CAAA;QACjG,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACG,GAAU,UAAU,QAAQ,KAC5B,GAAU,UAAU,QAAQ,KAAK,EAAS,SAAS,UAAU,GAC1D;;QACF;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAChC,kBAAC,QAAD;UAAM,WAAU;oBAAsB;UAAe,CAAA,CACjD;;QACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CAA2D,GAAgB,IAAO;;QAClF,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UACE,WAAU;UACV,OAAO,EAAE,OAAO,GAAG,EAAgB,IAAI;UACvC,CAAA;SACE,CAAA;QACF;;MACF;;IACQ,CAAA;GAGf,EAAW,SAAS,KACnB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,gBAE3B;QACL,kBAAC,GAAD,EAAkB,YAAY,EAAgB,EAAY,WAAW,EAAI,CAAA,CACrE;;GAIR,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,MAAD;QAAI,WAAU;kBAAiD;QAAyB,CAAA,EACxF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;SAAI,WAAU;mBAA6C;SAAqB,CAAA,EAChF,kBAAC,MAAD;SAAI,WAAU;mBAAd;UACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;YAAa,CAAA,EACjD,kBAAC,MAAD;YAAI,WAAU;sBAAiC,GAAU,SAAS;YAAS,CAAA,CACvE;;UACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;YAAa,CAAA,EACjD,kBAAC,MAAD;YAAI,WAAU;sBAAd,CACG,GAAU,UAAU,QAAQ,KAC5B,GAAU,UAAU,QAAQ,KAAK,EAAS,SAAS,UAAU,GAC3D;cACD;;UACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;YAAS,CAAA,EAC7C,kBAAC,MAAD;YAAI,WAAU;sBACX,GAAU,OAAO,EAAS,KAAK,QAAQ,KAAK,IAAI,GAAG;YACjD,CAAA,CACD;;UACH;WACD,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;SAAI,WAAU;mBAA6C;SAAwB,CAAA,EACnF,kBAAC,MAAD;SAAI,WAAU;mBAAd;UACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;YAAY,CAAA,EAChD,kBAAC,MAAD;YAAI,WAAU;sBAAqB,EAAQ,EAAY,UAAU;YAAM,CAAA,CACnE;;UACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;YAAiB,CAAA,EACrD,kBAAC,MAAD;YAAI,WAAU;sBAAqB,EAAQ,EAAY,UAAU;YAAM,CAAA,CACnE;;UACL,EAAY,0BACX,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;YAAwB,CAAA,EAC5D,kBAAC,MAAD;YAAI,WAAU;sBAAqB,EAAQ,EAAY,uBAAuB;YAAM,CAAA,CAChF;;UAEP,EAAY,wBACX,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBAAsB;YAAc,CAAA,EAClD,kBAAC,MAAD;YAAI,WAAU;sBAAqB,EAAQ,EAAY,qBAAqB;YAAM,CAAA,CAC9E;;UAEL;WACD,EAAA,CAAA,CACF;UACF;;MAGN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,MAAD;SAAI,WAAU;mBAAd,CACE,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,EAAA,sBAE/B;;QACL,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD;UAAM,WAAU;oBAAoB;UAAmB,CAAA,EACvD,kBAAC,QAAD;UAAM,WAAU;oBACb,EAAe,EAAY,QAAQ,EAAY,SAAS;UACpD,CAAA,CACH;;QACL,KACC,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD;YAAM,WAAU;sBAAsB;YAAwB,CAAA,EAC9D,kBAAC,QAAD;YAAM,WAAU;sBACb,EAAe,EAAW,oBAAoB,EAAE;YAC5C,CAAA,CACH;;UACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD;YAAM,WAAU;sBAAsB;YAA0B,CAAA,EAChE,kBAAC,QAAD;YAAM,WAAU;sBACb,EAAe,EAAW,sBAAsB,EAAE;YAC9C,CAAA,CACH;;UACL,EAAa,KAAK,GAAQ,MACzB,kBAAC,OAAD;WAA6B,WAAU;qBAAvC,CACE,kBAAC,QAAD;YAAM,WAAU;sBAAuB,GAAQ,eAAe,GAAQ,QAAQ;YAAgB,CAAA,EAC9F,kBAAC,QAAD;YAAM,WAAU;sBAAiC,EAAe,GAAQ,UAAU,EAAE;YAAQ,CAAA,CACxF;aAHI,GAAQ,QAAQ,EAGpB,CACN;UACE;;QAEJ;;MAGN,kBAAC,OAAD;OACE,IAAG;OACH,WAAU;iBAFZ,CAIE,kBAAC,MAAD;QAAI,WAAU;kBAAd,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,yBAE3B;WACJ,EAAW,SAAS,IACnB,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAW,KAAK,GAAW,MAAM;SAChC,IAAM,IAAS,OAAO,GAAW,UAAW,WAAW,EAAU,SAAS;AAE1E,gBACE,kBAAC,OAAD;UAEE,WAAU;oBAFZ,CAIE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAPO,EAAY,MAAW,GAO9B,EAAM,WAAW,kBAAkB,EAAmB,EAAO,IAAM,CAAA,EACnE,kBAAC,OAAD,EAAA,UAAA;YACE,kBAAC,KAAD;aAAG,WAAU;uBAAyC,GAAW,SAAS;aAAgB,CAAA;YACzF,GAAW,eACV,kBAAC,KAAD;aAAG,WAAU;uBAA+B,EAAU;aAAgB,CAAA;YAExE,kBAAC,KAAD;aAAG,WAAU;uBAAb,CAAgD,SAAM,EAAQ,GAAW,QAAQ,CAAK;;YAClF,EAAA,CAAA,CACF;cACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,GAAD;YACE,OAAO,IAAS,EAAO,QAAQ,MAAM,IAAI,GAAG;YAC5C,SAAS,EAAiB,MAAW;YACrC,CAAA,EACD,GAAW,eACV,kBAAC,KAAD;YAAG,WAAU;sBAAb,CAAgD,eAClC,EAAQ,EAAU,YAAY,CACxC;cAEF;aACF;YAxBC,GAAW,MAAM,EAwBlB;UAER;QACE,CAAA,GAEN,kBAAC,GAAD;QACE,cAAa;QACb,OAAM;QACN,aAAY;QACZ,WAAU;QACV,CAAA,CAEA;;MACF;QAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEE,kBAAC,OAAD;OACE,IAAG;OACH,WAAU;iBAFZ,CAIE,kBAAC,MAAD;QAAI,WAAU;kBAAiD;QAAc,CAAA,EAC5E,EAAU,SAAS,IAClB,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACG,EAAU,KAAK,GAAK,MACnB,kBAAC,OAAD;SAEE,WAAU;mBAFZ,CAIE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,EACpD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAyC,GAAK,QAAQ;WAAe,CAAA,EAClF,kBAAC,KAAD;WAAG,WAAU;qBACV,GAAK,WAAW,EAAQ,EAAI,SAAS,GAAG;WACvC,CAAA,CACA,EAAA,CAAA,CACF;aACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WACE,OAAO,GAAK,SAAS,WAAW;WAChC,SAAS,GAAK,SAAS,YAAY;WACnC,CAAA,EACD,OAAO,GAAK,OAAQ,YAAY,EAAI,MACnC,kBAAC,KAAD;WACE,MAAM,EAAI;WACV,QAAO;WACP,KAAI;WACJ,cAAY,YAAY,GAAK,QAAQ;WACrC,WAAU;qBAEV,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;WAC9B,CAAA,GACF,KACA;YACF;WA7BC,GAAK,MAAM,EA6BZ,CACN,EACF,kBAAC,GAAD;SAAc,YAAY;SAAyB,OAAO,IAAa,YAAY;SAAqB,CAAA,CACpG;YAEN,kBAAC,GAAD;QACE,cAAa;QACb,OAAM;QACN,aAAY;QACZ,WAAU;QACV,QACE,kBAAC,GAAD;SACE,YAAY;SACZ,OAAO,IAAa,YAAY;SAChC,WAAU;SACV,CAAA;QAEJ,CAAA,CAEA;;MAGN,kBAAC,OAAD;OACE,IAAG;OACH,WAAU;iBAFZ,CAIE,kBAAC,MAAD;QAAI,WAAU;kBAAiD;QAAqB,CAAA,EACnF,EAAe,SAAS,IACvB,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAe,KAAK,EAAE,SAAM,cAC3B,kBAAC,OAAD;SAAgB,WAAU;mBAA1B,CACE,kBAAC,OAAD;UAAK,WAAU;oBACZ,EAAS,EAAK;UACX,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;UAAG,WAAU;oBAAyC;UAAS,CAAA,EAC/D,kBAAC,KAAD;UAAG,WAAU;oBAA+B,EAAS,EAAK;UAAK,CAAA,CAC3D,EAAA,CAAA,CACF;WARI,EAQJ,CACN;QACE,CAAA,GAEN,kBAAC,GAAD;QACE,cAAa;QACb,OAAM;QACN,aAAY;QACZ,WAAU;QACV,CAAA,CAEA;;MAGL,KACC,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,MAAD;QAAI,WAAU;kBAAiD;QAAmB,CAAA,EAClF,kBAAC,MAAD;QAAI,WAAU;kBAAd;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,MAAD;WAAI,WAAU;qBAAsB;WAAkB,CAAA,EACtD,kBAAC,MAAD;WAAI,WAAU;qBAAiC,EAAe,EAAO,UAAU,EAAE;WAAM,CAAA,CACnF;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,MAAD;WAAI,WAAU;qBAAsB;WAAW,CAAA,EAC/C,kBAAC,MAAD,EAAA,UACE,kBAAC,GAAD;WACE,OAAO,EAAO,UAAU;WACxB,SACE,EAAO,WAAW,aACd,YACA,EAAO,WAAW,WAChB,SACA,EAAO,WAAW,aAChB,YACA;WAEV,CAAA,EACC,CAAA,CACD;;SACL,EAAiB,SAAS,KACzB,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;UAAI,WAAU;oBAA2B;UAAuB,CAAA,EAChE,kBAAC,MAAD,EAAA,UACE,kBAAC,MAAD;UAAI,WAAU;oBACX,EAAiB,KAAK,GAAW,MAChC,kBAAC,MAAD,EAAA,UAAa,GAAe,EAAnB,EAAmB,CAC5B;UACC,CAAA,EACF,CAAA,CACD,EAAA,CAAA;SAEL;UACD;;MAEJ;OACF;;GACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionsPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/transactions/TransactionsPage.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
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 {
|
|
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
|
|
12
|
-
import { MilestoneStepper as
|
|
13
|
-
import { useEffect as
|
|
14
|
-
import { ArrowRight as
|
|
15
|
-
import { useNavigate as
|
|
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
|
|
18
|
-
import { Button as y, EmphasisPanel as
|
|
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
|
|
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
|
-
],
|
|
26
|
+
], w = [
|
|
26
27
|
"draft",
|
|
27
28
|
"negotiation",
|
|
28
29
|
"under_contract",
|
|
29
30
|
"completed"
|
|
30
|
-
],
|
|
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
|
-
},
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
}, [
|
|
46
|
-
let { data: j, loading:
|
|
47
|
+
}, [k]);
|
|
48
|
+
let { data: j, loading: ke } = ie({
|
|
47
49
|
filter: {
|
|
48
|
-
search:
|
|
50
|
+
search: Ee.trim() || void 0,
|
|
49
51
|
status: A === "all" ? void 0 : A
|
|
50
52
|
},
|
|
51
|
-
pagination:
|
|
52
|
-
}), { createTransaction:
|
|
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
|
-
|
|
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,
|
|
64
|
-
|
|
65
|
+
let I = j.find((e) => e.id === P) ?? null, je = (e) => {
|
|
66
|
+
Te(e), O.setPage(1);
|
|
65
67
|
}, L = (e) => {
|
|
66
|
-
|
|
68
|
+
Oe(e), O.setPage(1);
|
|
67
69
|
}, R = (e, t) => {
|
|
68
|
-
let n =
|
|
70
|
+
let n = D(e);
|
|
69
71
|
return n === e ? t : n;
|
|
70
|
-
}, [
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
|
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
|
-
},
|
|
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
|
-
], $ =
|
|
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]),
|
|
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:
|
|
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 =
|
|
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__ */ _(
|
|
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(),
|
|
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__ */ _(
|
|
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__ */ _(
|
|
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__ */ _(
|
|
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__ */ _(
|
|
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__ */ _(
|
|
262
|
+
icon: /* @__PURE__ */ _(le, { className: "h-5 w-5" })
|
|
261
263
|
})
|
|
262
264
|
]
|
|
263
265
|
})
|
|
264
266
|
}),
|
|
265
|
-
/* @__PURE__ */ _(
|
|
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 &&
|
|
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: () =>
|
|
289
|
+
onClick: () => E("../properties")
|
|
288
290
|
}
|
|
289
291
|
]
|
|
290
292
|
}),
|
|
291
293
|
/* @__PURE__ */ _(o, {
|
|
292
|
-
searchValue:
|
|
293
|
-
onSearchChange:
|
|
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:
|
|
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:
|
|
322
|
+
columns: Ie,
|
|
321
323
|
data: j,
|
|
322
324
|
keyField: "id",
|
|
323
325
|
onRowClick: (e) => F(e.id),
|
|
324
|
-
pageSize:
|
|
326
|
+
pageSize: O.pageSize,
|
|
325
327
|
serverPagination: {
|
|
326
|
-
page:
|
|
327
|
-
pageSize:
|
|
328
|
-
hasNextPage: j.length >=
|
|
329
|
-
loading:
|
|
330
|
-
onPageChange:
|
|
331
|
-
onPageSizeChange:
|
|
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(
|
|
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:
|
|
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__ */ _(
|
|
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__ */ _(
|
|
367
|
-
}), /* @__PURE__ */ _(
|
|
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 =
|
|
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: () =>
|
|
396
|
-
children: [/* @__PURE__ */ _(
|
|
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: () =>
|
|
405
|
-
children: [/* @__PURE__ */ _(
|
|
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: () =>
|
|
417
|
-
children: ["Open full deal", /* @__PURE__ */ _(
|
|
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__ */ _(
|
|
434
|
-
open:
|
|
435
|
+
/* @__PURE__ */ _(xe, {
|
|
436
|
+
open: Me,
|
|
435
437
|
onOpenChange: z,
|
|
436
|
-
children: /* @__PURE__ */ _(
|
|
438
|
+
children: /* @__PURE__ */ _(Se, {
|
|
437
439
|
className: "sm:max-w-lg",
|
|
438
440
|
children: /* @__PURE__ */ v("form", {
|
|
439
|
-
onSubmit:
|
|
441
|
+
onSubmit: Pe,
|
|
440
442
|
children: [
|
|
441
|
-
/* @__PURE__ */ v(
|
|
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) =>
|
|
452
|
-
className:
|
|
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:
|
|
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:
|
|
482
|
-
children:
|
|
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:
|
|
494
|
-
children:
|
|
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:
|
|
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:
|
|
525
|
+
className: S
|
|
524
526
|
})] })]
|
|
525
527
|
})
|
|
526
528
|
]
|
|
527
529
|
}),
|
|
528
|
-
/* @__PURE__ */ v(
|
|
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 {
|
|
548
|
+
export { E as TransactionsPage };
|
|
547
549
|
|
|
548
550
|
//# sourceMappingURL=TransactionsPage.js.map
|