@burdenoff/microfe-housingvista 2026.703.13 → 2026.709.2
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/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +23527 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +267 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-operations.js +67 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.d.ts +57868 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/housingvista/HousingVistaRoot.d.ts +5 -0
- package/dist/housingvista/HousingVistaRoot.d.ts.map +1 -0
- package/dist/housingvista/HousingVistaRoutes.d.ts +7 -0
- package/dist/housingvista/HousingVistaRoutes.d.ts.map +1 -0
- package/dist/housingvista/components/Breadcrumbs.d.ts +13 -0
- package/dist/housingvista/components/Breadcrumbs.d.ts.map +1 -0
- package/dist/housingvista/components/ChartCard.d.ts +12 -0
- package/dist/housingvista/components/ChartCard.d.ts.map +1 -0
- package/dist/housingvista/components/ContactOwnerDialog.d.ts +33 -0
- package/dist/housingvista/components/ContactOwnerDialog.d.ts.map +1 -0
- package/dist/housingvista/components/DataTable.d.ts +42 -0
- package/dist/housingvista/components/DataTable.d.ts.map +1 -0
- package/dist/housingvista/components/EmptyState.d.ts +19 -0
- package/dist/housingvista/components/EmptyState.d.ts.map +1 -0
- package/dist/housingvista/components/ErrorBoundary.d.ts +19 -0
- package/dist/housingvista/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/housingvista/components/FileUploader.d.ts +16 -0
- package/dist/housingvista/components/FileUploader.d.ts.map +1 -0
- package/dist/housingvista/components/FilterBar.d.ts +13 -0
- package/dist/housingvista/components/FilterBar.d.ts.map +1 -0
- package/dist/housingvista/components/LoadingSkeleton.d.ts +10 -0
- package/dist/housingvista/components/LoadingSkeleton.d.ts.map +1 -0
- package/dist/housingvista/components/PageLayout.d.ts +18 -0
- package/dist/housingvista/components/PageLayout.d.ts.map +1 -0
- package/dist/housingvista/components/PropertyCard.d.ts +26 -0
- package/dist/housingvista/components/PropertyCard.d.ts.map +1 -0
- package/dist/housingvista/components/ReviewsSection.d.ts +12 -0
- package/dist/housingvista/components/ReviewsSection.d.ts.map +1 -0
- package/dist/housingvista/components/StatCard.d.ts +18 -0
- package/dist/housingvista/components/StatCard.d.ts.map +1 -0
- package/dist/housingvista/components/StatusBadge.d.ts +12 -0
- package/dist/housingvista/components/StatusBadge.d.ts.map +1 -0
- package/dist/housingvista/components/index.d.ts +17 -0
- package/dist/housingvista/components/index.d.ts.map +1 -0
- package/dist/housingvista/context/HousingVistaContext.d.ts +15 -0
- package/dist/housingvista/context/HousingVistaContext.d.ts.map +1 -0
- package/dist/housingvista/hooks/index.d.ts +804 -0
- package/dist/housingvista/hooks/index.d.ts.map +1 -0
- package/dist/housingvista/hooks/index.js +1 -0
- package/dist/housingvista/hooks/index.js.map +1 -1
- package/dist/housingvista/hooks/messages.d.ts +65 -0
- package/dist/housingvista/hooks/messages.d.ts.map +1 -0
- package/dist/housingvista/hooks/platform.d.ts +140 -0
- package/dist/housingvista/hooks/platform.d.ts.map +1 -0
- package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts +16 -0
- package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts.map +1 -0
- package/dist/housingvista/hooks/useHousingVistaAnalytics.js +57 -0
- package/dist/housingvista/hooks/useHousingVistaAnalytics.js.map +1 -0
- package/dist/housingvista/hooks/useServerPagination.d.ts +12 -0
- package/dist/housingvista/hooks/useServerPagination.d.ts.map +1 -0
- package/dist/housingvista/index.d.ts +13 -0
- package/dist/housingvista/index.d.ts.map +1 -0
- package/dist/housingvista/index.js +2 -0
- package/dist/housingvista/lib/toast.d.ts +11 -0
- package/dist/housingvista/lib/toast.d.ts.map +1 -0
- package/dist/housingvista/pages/HomePage.d.ts +7 -0
- package/dist/housingvista/pages/HomePage.d.ts.map +1 -0
- package/dist/housingvista/pages/HomePage.js +135 -132
- package/dist/housingvista/pages/HomePage.js.map +1 -1
- package/dist/housingvista/pages/amc/AMCManagementPage.d.ts +2 -0
- package/dist/housingvista/pages/amc/AMCManagementPage.d.ts.map +1 -0
- package/dist/housingvista/pages/analytics/AnalyticsPage.d.ts +2 -0
- package/dist/housingvista/pages/analytics/AnalyticsPage.d.ts.map +1 -0
- package/dist/housingvista/pages/analytics/AnalyticsPage.js +136 -134
- package/dist/housingvista/pages/analytics/AnalyticsPage.js.map +1 -1
- package/dist/housingvista/pages/assets/AssetDetailPage.d.ts +9 -0
- package/dist/housingvista/pages/assets/AssetDetailPage.d.ts.map +1 -0
- package/dist/housingvista/pages/assets/AssetManagementPage.d.ts +2 -0
- package/dist/housingvista/pages/assets/AssetManagementPage.d.ts.map +1 -0
- package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
- package/dist/housingvista/pages/chat/ChatPage.d.ts +14 -0
- package/dist/housingvista/pages/chat/ChatPage.d.ts.map +1 -0
- package/dist/housingvista/pages/finance/HomeLoanDetailPage.d.ts +11 -0
- package/dist/housingvista/pages/finance/HomeLoanDetailPage.d.ts.map +1 -0
- package/dist/housingvista/pages/finance/HomeLoansPage.d.ts +2 -0
- package/dist/housingvista/pages/finance/HomeLoansPage.d.ts.map +1 -0
- package/dist/housingvista/pages/investments/InvestmentDetailPage.d.ts +2 -0
- package/dist/housingvista/pages/investments/InvestmentDetailPage.d.ts.map +1 -0
- package/dist/housingvista/pages/investments/InvestmentsPage.d.ts +2 -0
- package/dist/housingvista/pages/investments/InvestmentsPage.d.ts.map +1 -0
- package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
- package/dist/housingvista/pages/legal/LegalPage.d.ts +2 -0
- package/dist/housingvista/pages/legal/LegalPage.d.ts.map +1 -0
- package/dist/housingvista/pages/legal/LegalServiceDetailPage.d.ts +12 -0
- package/dist/housingvista/pages/legal/LegalServiceDetailPage.d.ts.map +1 -0
- package/dist/housingvista/pages/market/AreaInsightsPage.d.ts +2 -0
- package/dist/housingvista/pages/market/AreaInsightsPage.d.ts.map +1 -0
- package/dist/housingvista/pages/market/MarketAnalyticsPage.d.ts +2 -0
- package/dist/housingvista/pages/market/MarketAnalyticsPage.d.ts.map +1 -0
- package/dist/housingvista/pages/marketplace/MarketplacePage.d.ts +2 -0
- package/dist/housingvista/pages/marketplace/MarketplacePage.d.ts.map +1 -0
- package/dist/housingvista/pages/marketplace/ServiceDetailPage.d.ts +12 -0
- package/dist/housingvista/pages/marketplace/ServiceDetailPage.d.ts.map +1 -0
- package/dist/housingvista/pages/offers/OffersPage.d.ts +10 -0
- package/dist/housingvista/pages/offers/OffersPage.d.ts.map +1 -0
- package/dist/housingvista/pages/properties/AddPropertyPage.d.ts +8 -0
- package/dist/housingvista/pages/properties/AddPropertyPage.d.ts.map +1 -0
- package/dist/housingvista/pages/properties/AddPropertyPage.js +279 -278
- package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertiesPage.d.ts +7 -0
- package/dist/housingvista/pages/properties/PropertiesPage.d.ts.map +1 -0
- package/dist/housingvista/pages/properties/PropertiesPage.js +93 -86
- package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertyDetailPage.d.ts +9 -0
- package/dist/housingvista/pages/properties/PropertyDetailPage.d.ts.map +1 -0
- package/dist/housingvista/pages/properties/PropertyDetailPage.js +514 -511
- package/dist/housingvista/pages/properties/PropertyDetailPage.js.map +1 -1
- package/dist/housingvista/pages/rental/RentalManagementPage.d.ts +2 -0
- package/dist/housingvista/pages/rental/RentalManagementPage.d.ts.map +1 -0
- package/dist/housingvista/pages/settings/ProfilePage.d.ts +2 -0
- package/dist/housingvista/pages/settings/ProfilePage.d.ts.map +1 -0
- package/dist/housingvista/pages/settings/SettingsPage.d.ts +2 -0
- package/dist/housingvista/pages/settings/SettingsPage.d.ts.map +1 -0
- package/dist/housingvista/pages/shortlist/ShortlistPage.d.ts +8 -0
- package/dist/housingvista/pages/shortlist/ShortlistPage.d.ts.map +1 -0
- package/dist/housingvista/pages/transactions/TransactionDetailPage.d.ts +8 -0
- package/dist/housingvista/pages/transactions/TransactionDetailPage.d.ts.map +1 -0
- package/dist/housingvista/pages/transactions/TransactionsPage.d.ts +7 -0
- package/dist/housingvista/pages/transactions/TransactionsPage.d.ts.map +1 -0
- package/dist/housingvista/pages/transactions/milestones.d.ts +35 -0
- package/dist/housingvista/pages/transactions/milestones.d.ts.map +1 -0
- package/dist/housingvista/pages/verification/VerificationDetailPage.d.ts +10 -0
- package/dist/housingvista/pages/verification/VerificationDetailPage.d.ts.map +1 -0
- package/dist/housingvista/pages/verification/VerificationPage.d.ts +2 -0
- package/dist/housingvista/pages/verification/VerificationPage.d.ts.map +1 -0
- package/dist/housingvista/pages/viewings/ViewingsPage.d.ts +9 -0
- package/dist/housingvista/pages/viewings/ViewingsPage.d.ts.map +1 -0
- package/dist/housingvista/services/assistantApi.d.ts +90 -0
- package/dist/housingvista/services/assistantApi.d.ts.map +1 -0
- package/dist/housingvista/services/assistantApi.js +222 -0
- package/dist/housingvista/services/assistantApi.js.map +1 -0
- package/dist/housingvista/services/createSandboxAssistantTransport.d.ts +42 -0
- package/dist/housingvista/services/createSandboxAssistantTransport.d.ts.map +1 -0
- package/dist/housingvista/services/createSandboxAssistantTransport.js +120 -0
- package/dist/housingvista/services/createSandboxAssistantTransport.js.map +1 -0
- package/dist/housingvista/store/housingvistaStore.d.ts +72 -0
- package/dist/housingvista/store/housingvistaStore.d.ts.map +1 -0
- package/dist/housingvista/types/assistant.d.ts +16 -0
- package/dist/housingvista/types/assistant.d.ts.map +1 -0
- package/dist/housingvista/types/index.d.ts +1328 -0
- package/dist/housingvista/types/index.d.ts.map +1 -0
- package/dist/housingvista/utils/helpers.d.ts +25 -0
- package/dist/housingvista/utils/helpers.d.ts.map +1 -0
- package/dist/housingvista/utils/index.d.ts +2 -0
- package/dist/housingvista/utils/index.d.ts.map +1 -0
- package/dist/housingvista/utils/pageContext.d.ts +25 -0
- package/dist/housingvista/utils/pageContext.d.ts.map +1 -0
- package/dist/housingvista/utils/pageContext.js +77 -0
- package/dist/housingvista/utils/pageContext.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -3
- package/package.json +6 -2
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { cn as e, formatCurrency as t, formatNumber as n } from "../../utils/helpers.js";
|
|
2
2
|
import { PageLayout as r } from "../../components/PageLayout.js";
|
|
3
3
|
import { StatCard as i } from "../../components/StatCard.js";
|
|
4
|
-
import { DataTable as
|
|
5
|
-
import { EmptyState as
|
|
6
|
-
import { ChartCard as
|
|
7
|
-
import { LoadingSkeleton as
|
|
4
|
+
import { DataTable as ee } from "../../components/DataTable.js";
|
|
5
|
+
import { EmptyState as te } from "../../components/EmptyState.js";
|
|
6
|
+
import { ChartCard as a } from "../../components/ChartCard.js";
|
|
7
|
+
import { LoadingSkeleton as o } from "../../components/LoadingSkeleton.js";
|
|
8
|
+
import { useHousingVistaAnalytics as s, useTrackPageView as c } from "../../hooks/useHousingVistaAnalytics.js";
|
|
8
9
|
import { useAnalyticsData as l } from "../../hooks/index.js";
|
|
9
10
|
import { notify as u } from "../../lib/toast.js";
|
|
10
11
|
import "../../components/index.js";
|
|
@@ -17,33 +18,33 @@ import { Line as g } from "../../../node_modules/recharts/es6/cartesian/Line.js"
|
|
|
17
18
|
import { Area as _ } from "../../../node_modules/recharts/es6/cartesian/Area.js";
|
|
18
19
|
import { XAxis as v } from "../../../node_modules/recharts/es6/cartesian/XAxis.js";
|
|
19
20
|
import { YAxis as y } from "../../../node_modules/recharts/es6/cartesian/YAxis.js";
|
|
20
|
-
import { LineChart as
|
|
21
|
-
import { PieChart as
|
|
22
|
-
import { AreaChart as
|
|
23
|
-
import { useState as
|
|
24
|
-
import { Activity as
|
|
25
|
-
import { jsx as
|
|
26
|
-
import { EmphasisPanel as
|
|
21
|
+
import { LineChart as b } from "../../../node_modules/recharts/es6/chart/LineChart.js";
|
|
22
|
+
import { PieChart as x } from "../../../node_modules/recharts/es6/chart/PieChart.js";
|
|
23
|
+
import { AreaChart as S } from "../../../node_modules/recharts/es6/chart/AreaChart.js";
|
|
24
|
+
import { useState as C } from "react";
|
|
25
|
+
import { Activity as w, BarChart3 as T, Building as ne, Clock as re, DollarSign as ie, Download as ae, TrendingUp as oe } from "lucide-react";
|
|
26
|
+
import { jsx as E, jsxs as D } from "react/jsx-runtime";
|
|
27
|
+
import { EmphasisPanel as se, NextSteps as O } from "@burdenoff/fe-libs/ui";
|
|
27
28
|
//#region src/housingvista/pages/analytics/AnalyticsPage.tsx
|
|
28
|
-
var
|
|
29
|
+
var k = [
|
|
29
30
|
"var(--color-chart-1)",
|
|
30
31
|
"var(--color-chart-2)",
|
|
31
32
|
"var(--color-chart-3)",
|
|
32
33
|
"var(--color-chart-4)",
|
|
33
34
|
"var(--color-chart-5)"
|
|
34
|
-
],
|
|
35
|
+
], A = "var(--color-chart-2)", j = "var(--color-chart-1)", M = {
|
|
35
36
|
background: "var(--color-bg-surface)",
|
|
36
37
|
border: "1px solid var(--color-border-subtle)",
|
|
37
38
|
borderRadius: 10,
|
|
38
39
|
fontSize: 12,
|
|
39
40
|
boxShadow: "0 8px 24px rgb(0 0 0 / 0.12)"
|
|
40
|
-
},
|
|
41
|
+
}, N = {
|
|
41
42
|
color: "var(--color-text-primary)",
|
|
42
43
|
fontWeight: 600
|
|
43
|
-
},
|
|
44
|
+
}, P = {
|
|
44
45
|
fontSize: 11,
|
|
45
46
|
fill: "var(--color-text-secondary)"
|
|
46
|
-
},
|
|
47
|
+
}, F = [
|
|
47
48
|
{
|
|
48
49
|
value: 3,
|
|
49
50
|
label: "3M"
|
|
@@ -61,8 +62,9 @@ var A = [
|
|
|
61
62
|
label: "All"
|
|
62
63
|
}
|
|
63
64
|
];
|
|
64
|
-
function
|
|
65
|
-
|
|
65
|
+
function I() {
|
|
66
|
+
c("housingvista.analytics.viewed");
|
|
67
|
+
let { emitExport: I } = s(), { data: L, loading: R } = l(), [z, B] = C(12), V = () => {
|
|
66
68
|
if (!L) return;
|
|
67
69
|
let e = (e) => {
|
|
68
70
|
let t = String(e);
|
|
@@ -83,12 +85,12 @@ function L() {
|
|
|
83
85
|
n.revenue - n.expenses
|
|
84
86
|
].map(e).join(","));
|
|
85
87
|
let n = new Blob([t.join("\n")], { type: "text/csv;charset=utf-8;" }), r = URL.createObjectURL(n), i = document.createElement("a");
|
|
86
|
-
i.href = r, i.download = `housingvista-analytics-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`, document.body.appendChild(i), i.click(), document.body.removeChild(i), URL.revokeObjectURL(r), u.success("Report exported", "Your analytics data was downloaded as a CSV file.");
|
|
88
|
+
i.href = r, i.download = `housingvista-analytics-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`, document.body.appendChild(i), i.click(), document.body.removeChild(i), URL.revokeObjectURL(r), I("analytics"), u.success("Report exported", "Your analytics data was downloaded as a CSV file.");
|
|
87
89
|
}, H = [
|
|
88
90
|
{
|
|
89
91
|
key: "month",
|
|
90
92
|
header: "Month",
|
|
91
|
-
render: (e) => /* @__PURE__ */
|
|
93
|
+
render: (e) => /* @__PURE__ */ E("span", {
|
|
92
94
|
className: "font-medium text-text-primary",
|
|
93
95
|
children: e.month
|
|
94
96
|
})
|
|
@@ -96,7 +98,7 @@ function L() {
|
|
|
96
98
|
{
|
|
97
99
|
key: "revenue",
|
|
98
100
|
header: "Revenue",
|
|
99
|
-
render: (e) => /* @__PURE__ */
|
|
101
|
+
render: (e) => /* @__PURE__ */ E("span", {
|
|
100
102
|
className: "font-medium text-status-success-text",
|
|
101
103
|
children: t(e.revenue)
|
|
102
104
|
})
|
|
@@ -104,7 +106,7 @@ function L() {
|
|
|
104
106
|
{
|
|
105
107
|
key: "expenses",
|
|
106
108
|
header: "Expenses",
|
|
107
|
-
render: (e) => /* @__PURE__ */
|
|
109
|
+
render: (e) => /* @__PURE__ */ E("span", {
|
|
108
110
|
className: "font-medium text-status-error-text",
|
|
109
111
|
children: t(e.expenses)
|
|
110
112
|
})
|
|
@@ -115,7 +117,7 @@ function L() {
|
|
|
115
117
|
sortable: !1,
|
|
116
118
|
render: (n) => {
|
|
117
119
|
let r = n.revenue - n.expenses;
|
|
118
|
-
return /* @__PURE__ */
|
|
120
|
+
return /* @__PURE__ */ E("span", {
|
|
119
121
|
className: e("font-medium", r >= 0 ? "text-status-success-text" : "text-status-error-text"),
|
|
120
122
|
children: t(r)
|
|
121
123
|
});
|
|
@@ -127,27 +129,27 @@ function L() {
|
|
|
127
129
|
sortable: !1,
|
|
128
130
|
render: (t) => {
|
|
129
131
|
let n = t.revenue > 0 ? (t.revenue - t.expenses) / t.revenue * 100 : 0;
|
|
130
|
-
return /* @__PURE__ */
|
|
132
|
+
return /* @__PURE__ */ D("span", {
|
|
131
133
|
className: e("font-medium", n >= 0 ? "text-status-success-text" : "text-status-error-text"),
|
|
132
134
|
children: [n.toFixed(1), "%"]
|
|
133
135
|
});
|
|
134
136
|
}
|
|
135
137
|
}
|
|
136
138
|
];
|
|
137
|
-
if (R) return /* @__PURE__ */
|
|
139
|
+
if (R) return /* @__PURE__ */ D(r, {
|
|
138
140
|
title: "Analytics",
|
|
139
141
|
description: "Track your property portfolio performance and market insights",
|
|
140
|
-
children: [/* @__PURE__ */
|
|
142
|
+
children: [/* @__PURE__ */ E(o, { className: "h-28" }), /* @__PURE__ */ D("div", {
|
|
141
143
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
|
|
142
|
-
children: [/* @__PURE__ */
|
|
144
|
+
children: [/* @__PURE__ */ E(o, { className: "h-64" }), /* @__PURE__ */ E(o, { className: "h-64" })]
|
|
143
145
|
})]
|
|
144
146
|
});
|
|
145
|
-
if (!(L && (L.kpis.length > 0 || L.revenueByMonth.length > 0 || L.propertyTypeDistribution.length > 0))) return /* @__PURE__ */
|
|
147
|
+
if (!(L && (L.kpis.length > 0 || L.revenueByMonth.length > 0 || L.propertyTypeDistribution.length > 0))) return /* @__PURE__ */ E(r, {
|
|
146
148
|
title: "Analytics",
|
|
147
149
|
description: "Track your property portfolio performance and market insights",
|
|
148
|
-
children: /* @__PURE__ */
|
|
150
|
+
children: /* @__PURE__ */ E(te, {
|
|
149
151
|
illustration: "empty-generic",
|
|
150
|
-
icon: /* @__PURE__ */
|
|
152
|
+
icon: /* @__PURE__ */ E(T, { className: "h-12 w-12" }),
|
|
151
153
|
title: "No analytics yet",
|
|
152
154
|
description: "Once you have properties, transactions, and rentals recorded, revenue, occupancy, and portfolio insights will appear here."
|
|
153
155
|
})
|
|
@@ -161,19 +163,19 @@ function L() {
|
|
|
161
163
|
name: e.type.charAt(0).toUpperCase() + e.type.slice(1),
|
|
162
164
|
value: e.value,
|
|
163
165
|
count: e.count,
|
|
164
|
-
color:
|
|
165
|
-
})), Z = K.reduce((e, t) => e + t.revenue, 0), Q = K.reduce((e, t) => e + t.expenses, 0), $ = Z - Q,
|
|
166
|
-
return /* @__PURE__ */
|
|
166
|
+
color: k[t % k.length]
|
|
167
|
+
})), Z = K.reduce((e, t) => e + t.revenue, 0), Q = K.reduce((e, t) => e + t.expenses, 0), $ = Z - Q, ce = Z > 0 ? $ / Z * 100 : 0;
|
|
168
|
+
return /* @__PURE__ */ D(r, {
|
|
167
169
|
title: "Analytics",
|
|
168
170
|
description: "Track your property portfolio performance and market insights",
|
|
169
171
|
purpose: "Understand how your portfolio is actually performing — revenue versus expenses, occupancy, property-type mix, and profitability — so you can spot trends, compare periods, and decide where to buy, sell, or raise rents.",
|
|
170
|
-
actions: /* @__PURE__ */
|
|
172
|
+
actions: /* @__PURE__ */ D("button", {
|
|
171
173
|
onClick: V,
|
|
172
174
|
className: "inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]",
|
|
173
|
-
children: [/* @__PURE__ */
|
|
175
|
+
children: [/* @__PURE__ */ E(ae, { className: "h-4 w-4" }), "Export Report"]
|
|
174
176
|
}),
|
|
175
177
|
children: [
|
|
176
|
-
/* @__PURE__ */
|
|
178
|
+
/* @__PURE__ */ E(O, {
|
|
177
179
|
storageKey: "housingvista-analytics",
|
|
178
180
|
steps: [{
|
|
179
181
|
id: "performance",
|
|
@@ -182,16 +184,16 @@ function L() {
|
|
|
182
184
|
href: "#analytics-performance"
|
|
183
185
|
}]
|
|
184
186
|
}),
|
|
185
|
-
/* @__PURE__ */
|
|
187
|
+
/* @__PURE__ */ D("div", {
|
|
186
188
|
className: "flex flex-wrap items-center gap-3",
|
|
187
|
-
children: [/* @__PURE__ */
|
|
189
|
+
children: [/* @__PURE__ */ E("span", {
|
|
188
190
|
className: "text-sm font-medium text-text-secondary",
|
|
189
191
|
children: "Period"
|
|
190
|
-
}), /* @__PURE__ */
|
|
192
|
+
}), /* @__PURE__ */ E("div", {
|
|
191
193
|
role: "group",
|
|
192
194
|
"aria-label": "Select analytics period",
|
|
193
195
|
className: "inline-flex rounded-lg border border-border-subtle bg-bg-sunken/60 p-1",
|
|
194
|
-
children:
|
|
196
|
+
children: F.map((t) => /* @__PURE__ */ E("button", {
|
|
195
197
|
type: "button",
|
|
196
198
|
"aria-pressed": z === t.value,
|
|
197
199
|
onClick: () => B(t.value),
|
|
@@ -200,56 +202,56 @@ function L() {
|
|
|
200
202
|
}, t.value))
|
|
201
203
|
})]
|
|
202
204
|
}),
|
|
203
|
-
U.length > 0 && /* @__PURE__ */
|
|
205
|
+
U.length > 0 && /* @__PURE__ */ E(se, {
|
|
204
206
|
className: "p-4",
|
|
205
|
-
children: /* @__PURE__ */
|
|
207
|
+
children: /* @__PURE__ */ E("div", {
|
|
206
208
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
207
209
|
children: U.map((e) => {
|
|
208
210
|
let t = {
|
|
209
|
-
"Portfolio Value":
|
|
210
|
-
"Monthly Revenue":
|
|
211
|
-
"Occupancy Rate":
|
|
212
|
-
"Avg. Days to Rent":
|
|
213
|
-
}[e.label] ||
|
|
214
|
-
return /* @__PURE__ */
|
|
211
|
+
"Portfolio Value": ie,
|
|
212
|
+
"Monthly Revenue": oe,
|
|
213
|
+
"Occupancy Rate": ne,
|
|
214
|
+
"Avg. Days to Rent": re
|
|
215
|
+
}[e.label] || w;
|
|
216
|
+
return /* @__PURE__ */ E(i, {
|
|
215
217
|
label: e.label,
|
|
216
218
|
value: e.unit === "USD" ? e.value : `${n(e.value)}${e.unit === "%" ? "%" : ` ${e.unit}`}`,
|
|
217
219
|
prefix: e.unit === "USD" ? "$" : void 0,
|
|
218
|
-
icon: /* @__PURE__ */
|
|
220
|
+
icon: /* @__PURE__ */ E(t, { className: "h-4 w-4" }),
|
|
219
221
|
trend: e.trend === "up" ? "up" : e.trend === "down" ? "down" : "stable",
|
|
220
222
|
change: e.changePercent
|
|
221
223
|
}, e.id);
|
|
222
224
|
})
|
|
223
225
|
})
|
|
224
226
|
}),
|
|
225
|
-
/* @__PURE__ */
|
|
227
|
+
/* @__PURE__ */ D("div", {
|
|
226
228
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
227
|
-
children: [J.length > 0 && /* @__PURE__ */
|
|
229
|
+
children: [J.length > 0 && /* @__PURE__ */ E(a, {
|
|
228
230
|
title: "Revenue vs Expenses",
|
|
229
231
|
description: "Real income against costs across the selected period",
|
|
230
232
|
className: "lg:col-span-2",
|
|
231
|
-
actions: /* @__PURE__ */
|
|
233
|
+
actions: /* @__PURE__ */ D("div", {
|
|
232
234
|
className: "flex items-center gap-4 text-xs text-text-secondary",
|
|
233
|
-
children: [/* @__PURE__ */
|
|
235
|
+
children: [/* @__PURE__ */ D("span", {
|
|
234
236
|
className: "flex items-center gap-1.5",
|
|
235
|
-
children: [/* @__PURE__ */
|
|
237
|
+
children: [/* @__PURE__ */ E("span", {
|
|
236
238
|
className: "h-2.5 w-2.5 rounded-full",
|
|
237
|
-
style: { background:
|
|
239
|
+
style: { background: A }
|
|
238
240
|
}), "Revenue"]
|
|
239
|
-
}), /* @__PURE__ */
|
|
241
|
+
}), /* @__PURE__ */ D("span", {
|
|
240
242
|
className: "flex items-center gap-1.5",
|
|
241
|
-
children: [/* @__PURE__ */
|
|
243
|
+
children: [/* @__PURE__ */ E("span", {
|
|
242
244
|
className: "h-2.5 w-2.5 rounded-full",
|
|
243
|
-
style: { background:
|
|
245
|
+
style: { background: j }
|
|
244
246
|
}), "Expenses"]
|
|
245
247
|
})]
|
|
246
248
|
}),
|
|
247
|
-
children: /* @__PURE__ */
|
|
249
|
+
children: /* @__PURE__ */ E("div", {
|
|
248
250
|
className: "h-72 w-full",
|
|
249
|
-
children: /* @__PURE__ */
|
|
251
|
+
children: /* @__PURE__ */ E(f, {
|
|
250
252
|
width: "100%",
|
|
251
253
|
height: "100%",
|
|
252
|
-
children: /* @__PURE__ */
|
|
254
|
+
children: /* @__PURE__ */ D(S, {
|
|
253
255
|
data: J,
|
|
254
256
|
margin: {
|
|
255
257
|
top: 8,
|
|
@@ -258,73 +260,73 @@ function L() {
|
|
|
258
260
|
bottom: 0
|
|
259
261
|
},
|
|
260
262
|
children: [
|
|
261
|
-
/* @__PURE__ */
|
|
263
|
+
/* @__PURE__ */ D("defs", { children: [/* @__PURE__ */ D("linearGradient", {
|
|
262
264
|
id: "revGrad",
|
|
263
265
|
x1: "0",
|
|
264
266
|
y1: "0",
|
|
265
267
|
x2: "0",
|
|
266
268
|
y2: "1",
|
|
267
|
-
children: [/* @__PURE__ */
|
|
269
|
+
children: [/* @__PURE__ */ E("stop", {
|
|
268
270
|
offset: "5%",
|
|
269
|
-
stopColor:
|
|
271
|
+
stopColor: A,
|
|
270
272
|
stopOpacity: .35
|
|
271
|
-
}), /* @__PURE__ */
|
|
273
|
+
}), /* @__PURE__ */ E("stop", {
|
|
272
274
|
offset: "95%",
|
|
273
|
-
stopColor:
|
|
275
|
+
stopColor: A,
|
|
274
276
|
stopOpacity: .02
|
|
275
277
|
})]
|
|
276
|
-
}), /* @__PURE__ */
|
|
278
|
+
}), /* @__PURE__ */ D("linearGradient", {
|
|
277
279
|
id: "expGrad",
|
|
278
280
|
x1: "0",
|
|
279
281
|
y1: "0",
|
|
280
282
|
x2: "0",
|
|
281
283
|
y2: "1",
|
|
282
|
-
children: [/* @__PURE__ */
|
|
284
|
+
children: [/* @__PURE__ */ E("stop", {
|
|
283
285
|
offset: "5%",
|
|
284
|
-
stopColor:
|
|
286
|
+
stopColor: j,
|
|
285
287
|
stopOpacity: .3
|
|
286
|
-
}), /* @__PURE__ */
|
|
288
|
+
}), /* @__PURE__ */ E("stop", {
|
|
287
289
|
offset: "95%",
|
|
288
|
-
stopColor:
|
|
290
|
+
stopColor: j,
|
|
289
291
|
stopOpacity: .02
|
|
290
292
|
})]
|
|
291
293
|
})] }),
|
|
292
|
-
/* @__PURE__ */
|
|
294
|
+
/* @__PURE__ */ E(h, {
|
|
293
295
|
strokeDasharray: "3 3",
|
|
294
296
|
stroke: "var(--color-border-subtle)",
|
|
295
297
|
vertical: !1
|
|
296
298
|
}),
|
|
297
|
-
/* @__PURE__ */
|
|
299
|
+
/* @__PURE__ */ E(v, {
|
|
298
300
|
dataKey: "month",
|
|
299
|
-
tick:
|
|
301
|
+
tick: P,
|
|
300
302
|
tickLine: !1,
|
|
301
303
|
axisLine: !1
|
|
302
304
|
}),
|
|
303
|
-
/* @__PURE__ */
|
|
304
|
-
tick:
|
|
305
|
+
/* @__PURE__ */ E(y, {
|
|
306
|
+
tick: P,
|
|
305
307
|
tickLine: !1,
|
|
306
308
|
axisLine: !1,
|
|
307
309
|
width: 52,
|
|
308
310
|
tickFormatter: (e) => t(e)
|
|
309
311
|
}),
|
|
310
|
-
/* @__PURE__ */
|
|
311
|
-
contentStyle:
|
|
312
|
-
labelStyle:
|
|
312
|
+
/* @__PURE__ */ E(d, {
|
|
313
|
+
contentStyle: M,
|
|
314
|
+
labelStyle: N,
|
|
313
315
|
formatter: (e, n) => [t(e), n]
|
|
314
316
|
}),
|
|
315
|
-
/* @__PURE__ */
|
|
317
|
+
/* @__PURE__ */ E(_, {
|
|
316
318
|
type: "monotone",
|
|
317
319
|
dataKey: "revenue",
|
|
318
320
|
name: "Revenue",
|
|
319
|
-
stroke:
|
|
321
|
+
stroke: A,
|
|
320
322
|
strokeWidth: 2.5,
|
|
321
323
|
fill: "url(#revGrad)"
|
|
322
324
|
}),
|
|
323
|
-
/* @__PURE__ */
|
|
325
|
+
/* @__PURE__ */ E(_, {
|
|
324
326
|
type: "monotone",
|
|
325
327
|
dataKey: "expenses",
|
|
326
328
|
name: "Expenses",
|
|
327
|
-
stroke:
|
|
329
|
+
stroke: j,
|
|
328
330
|
strokeWidth: 2.5,
|
|
329
331
|
fill: "url(#expGrad)"
|
|
330
332
|
})
|
|
@@ -332,15 +334,15 @@ function L() {
|
|
|
332
334
|
})
|
|
333
335
|
})
|
|
334
336
|
})
|
|
335
|
-
}), X.length > 0 && /* @__PURE__ */
|
|
337
|
+
}), X.length > 0 && /* @__PURE__ */ D(a, {
|
|
336
338
|
title: "Property-Type Distribution",
|
|
337
339
|
description: "Portfolio value split by type",
|
|
338
|
-
children: [/* @__PURE__ */
|
|
340
|
+
children: [/* @__PURE__ */ D("div", {
|
|
339
341
|
className: "relative h-56 w-full",
|
|
340
|
-
children: [/* @__PURE__ */
|
|
342
|
+
children: [/* @__PURE__ */ E(f, {
|
|
341
343
|
width: "100%",
|
|
342
344
|
height: "100%",
|
|
343
|
-
children: /* @__PURE__ */
|
|
345
|
+
children: /* @__PURE__ */ D(x, { children: [/* @__PURE__ */ E(m, {
|
|
344
346
|
data: X,
|
|
345
347
|
dataKey: "value",
|
|
346
348
|
nameKey: "name",
|
|
@@ -349,36 +351,36 @@ function L() {
|
|
|
349
351
|
paddingAngle: 2,
|
|
350
352
|
stroke: "var(--color-bg-surface)",
|
|
351
353
|
strokeWidth: 2,
|
|
352
|
-
children: X.map((e) => /* @__PURE__ */
|
|
353
|
-
}), /* @__PURE__ */
|
|
354
|
-
contentStyle:
|
|
355
|
-
labelStyle:
|
|
354
|
+
children: X.map((e) => /* @__PURE__ */ E(p, { fill: e.color }, e.name))
|
|
355
|
+
}), /* @__PURE__ */ E(d, {
|
|
356
|
+
contentStyle: M,
|
|
357
|
+
labelStyle: N,
|
|
356
358
|
formatter: (e, n, r) => [`${t(e)} · ${r?.payload?.count ?? 0} properties`, r?.payload?.name]
|
|
357
359
|
})] })
|
|
358
|
-
}), /* @__PURE__ */
|
|
360
|
+
}), /* @__PURE__ */ D("div", {
|
|
359
361
|
className: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center",
|
|
360
|
-
children: [/* @__PURE__ */
|
|
362
|
+
children: [/* @__PURE__ */ E("span", {
|
|
361
363
|
className: "text-xs text-text-secondary",
|
|
362
364
|
children: "Total value"
|
|
363
|
-
}), /* @__PURE__ */
|
|
365
|
+
}), /* @__PURE__ */ E("span", {
|
|
364
366
|
className: "text-lg font-bold text-text-primary",
|
|
365
367
|
children: t(Y)
|
|
366
368
|
})]
|
|
367
369
|
})]
|
|
368
|
-
}), /* @__PURE__ */
|
|
370
|
+
}), /* @__PURE__ */ E("ul", {
|
|
369
371
|
className: "mt-3 space-y-2",
|
|
370
|
-
children: X.map((e) => /* @__PURE__ */
|
|
372
|
+
children: X.map((e) => /* @__PURE__ */ D("li", {
|
|
371
373
|
className: "flex items-center justify-between text-sm",
|
|
372
|
-
children: [/* @__PURE__ */
|
|
374
|
+
children: [/* @__PURE__ */ D("span", {
|
|
373
375
|
className: "flex items-center gap-2",
|
|
374
|
-
children: [/* @__PURE__ */
|
|
376
|
+
children: [/* @__PURE__ */ E("span", {
|
|
375
377
|
className: "h-2.5 w-2.5 rounded-full",
|
|
376
378
|
style: { background: e.color }
|
|
377
|
-
}), /* @__PURE__ */
|
|
379
|
+
}), /* @__PURE__ */ E("span", {
|
|
378
380
|
className: "text-text-primary",
|
|
379
381
|
children: e.name
|
|
380
382
|
})]
|
|
381
|
-
}), /* @__PURE__ */
|
|
383
|
+
}), /* @__PURE__ */ D("span", {
|
|
382
384
|
className: "text-text-secondary",
|
|
383
385
|
children: [Y > 0 ? Math.round(e.value / Y * 100) : 0, "%"]
|
|
384
386
|
})]
|
|
@@ -386,18 +388,18 @@ function L() {
|
|
|
386
388
|
})]
|
|
387
389
|
})]
|
|
388
390
|
}),
|
|
389
|
-
/* @__PURE__ */
|
|
391
|
+
/* @__PURE__ */ D("div", {
|
|
390
392
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
391
|
-
children: [q.length > 0 && /* @__PURE__ */
|
|
393
|
+
children: [q.length > 0 && /* @__PURE__ */ E(a, {
|
|
392
394
|
title: "Occupancy Trend",
|
|
393
395
|
description: "Share of units occupied over the selected period",
|
|
394
396
|
className: "lg:col-span-2",
|
|
395
|
-
children: /* @__PURE__ */
|
|
397
|
+
children: /* @__PURE__ */ E("div", {
|
|
396
398
|
className: "h-56 w-full",
|
|
397
|
-
children: /* @__PURE__ */
|
|
399
|
+
children: /* @__PURE__ */ E(f, {
|
|
398
400
|
width: "100%",
|
|
399
401
|
height: "100%",
|
|
400
|
-
children: /* @__PURE__ */
|
|
402
|
+
children: /* @__PURE__ */ D(b, {
|
|
401
403
|
data: q,
|
|
402
404
|
margin: {
|
|
403
405
|
top: 8,
|
|
@@ -406,31 +408,31 @@ function L() {
|
|
|
406
408
|
bottom: 0
|
|
407
409
|
},
|
|
408
410
|
children: [
|
|
409
|
-
/* @__PURE__ */
|
|
411
|
+
/* @__PURE__ */ E(h, {
|
|
410
412
|
strokeDasharray: "3 3",
|
|
411
413
|
stroke: "var(--color-border-subtle)",
|
|
412
414
|
vertical: !1
|
|
413
415
|
}),
|
|
414
|
-
/* @__PURE__ */
|
|
416
|
+
/* @__PURE__ */ E(v, {
|
|
415
417
|
dataKey: "month",
|
|
416
|
-
tick:
|
|
418
|
+
tick: P,
|
|
417
419
|
tickLine: !1,
|
|
418
420
|
axisLine: !1
|
|
419
421
|
}),
|
|
420
|
-
/* @__PURE__ */
|
|
421
|
-
tick:
|
|
422
|
+
/* @__PURE__ */ E(y, {
|
|
423
|
+
tick: P,
|
|
422
424
|
tickLine: !1,
|
|
423
425
|
axisLine: !1,
|
|
424
426
|
width: 40,
|
|
425
427
|
domain: [0, 100],
|
|
426
428
|
tickFormatter: (e) => `${e}%`
|
|
427
429
|
}),
|
|
428
|
-
/* @__PURE__ */
|
|
429
|
-
contentStyle:
|
|
430
|
-
labelStyle:
|
|
430
|
+
/* @__PURE__ */ E(d, {
|
|
431
|
+
contentStyle: M,
|
|
432
|
+
labelStyle: N,
|
|
431
433
|
formatter: (e) => [`${e}%`, "Occupancy"]
|
|
432
434
|
}),
|
|
433
|
-
/* @__PURE__ */
|
|
435
|
+
/* @__PURE__ */ E(g, {
|
|
434
436
|
type: "monotone",
|
|
435
437
|
dataKey: "rate",
|
|
436
438
|
stroke: "var(--color-chart-2)",
|
|
@@ -446,46 +448,46 @@ function L() {
|
|
|
446
448
|
})
|
|
447
449
|
})
|
|
448
450
|
})
|
|
449
|
-
}), K.length > 0 && /* @__PURE__ */
|
|
451
|
+
}), K.length > 0 && /* @__PURE__ */ E(a, {
|
|
450
452
|
title: "Period Summary",
|
|
451
453
|
description: "Totals across the selected range",
|
|
452
|
-
children: /* @__PURE__ */
|
|
454
|
+
children: /* @__PURE__ */ D("div", {
|
|
453
455
|
className: "space-y-4",
|
|
454
|
-
children: [/* @__PURE__ */
|
|
456
|
+
children: [/* @__PURE__ */ D("div", {
|
|
455
457
|
className: "flex items-center justify-between rounded-lg bg-bg-sunken/50 p-3",
|
|
456
|
-
children: [/* @__PURE__ */
|
|
458
|
+
children: [/* @__PURE__ */ D("div", { children: [/* @__PURE__ */ E("p", {
|
|
457
459
|
className: "text-sm text-text-secondary",
|
|
458
460
|
children: "Total Revenue"
|
|
459
|
-
}), /* @__PURE__ */
|
|
461
|
+
}), /* @__PURE__ */ E("p", {
|
|
460
462
|
className: "text-lg font-bold text-text-primary",
|
|
461
463
|
children: t(Z)
|
|
462
|
-
})] }), /* @__PURE__ */
|
|
464
|
+
})] }), /* @__PURE__ */ D("div", {
|
|
463
465
|
className: "text-right",
|
|
464
|
-
children: [/* @__PURE__ */
|
|
466
|
+
children: [/* @__PURE__ */ E("p", {
|
|
465
467
|
className: "text-sm text-text-secondary",
|
|
466
468
|
children: "Total Expenses"
|
|
467
|
-
}), /* @__PURE__ */
|
|
469
|
+
}), /* @__PURE__ */ E("p", {
|
|
468
470
|
className: "text-lg font-bold text-text-primary",
|
|
469
471
|
children: t(Q)
|
|
470
472
|
})]
|
|
471
473
|
})]
|
|
472
|
-
}), /* @__PURE__ */
|
|
474
|
+
}), /* @__PURE__ */ D("div", {
|
|
473
475
|
className: "grid grid-cols-2 gap-3",
|
|
474
|
-
children: [/* @__PURE__ */
|
|
476
|
+
children: [/* @__PURE__ */ D("div", {
|
|
475
477
|
className: "rounded-lg bg-status-success-bg-subtle p-3 text-center",
|
|
476
|
-
children: [/* @__PURE__ */
|
|
478
|
+
children: [/* @__PURE__ */ E("p", {
|
|
477
479
|
className: "text-xl font-bold text-status-success-text",
|
|
478
480
|
children: t($)
|
|
479
|
-
}), /* @__PURE__ */
|
|
481
|
+
}), /* @__PURE__ */ E("p", {
|
|
480
482
|
className: "text-xs text-text-secondary",
|
|
481
483
|
children: "Net Income"
|
|
482
484
|
})]
|
|
483
|
-
}), /* @__PURE__ */
|
|
485
|
+
}), /* @__PURE__ */ D("div", {
|
|
484
486
|
className: "rounded-lg bg-status-info-bg-subtle p-3 text-center",
|
|
485
|
-
children: [/* @__PURE__ */
|
|
487
|
+
children: [/* @__PURE__ */ D("p", {
|
|
486
488
|
className: "text-xl font-bold text-status-info-text",
|
|
487
|
-
children: [
|
|
488
|
-
}), /* @__PURE__ */
|
|
489
|
+
children: [ce.toFixed(1), "%"]
|
|
490
|
+
}), /* @__PURE__ */ E("p", {
|
|
489
491
|
className: "text-xs text-text-secondary",
|
|
490
492
|
children: "Profit Margin"
|
|
491
493
|
})]
|
|
@@ -494,13 +496,13 @@ function L() {
|
|
|
494
496
|
})
|
|
495
497
|
})]
|
|
496
498
|
}),
|
|
497
|
-
K.length > 0 && /* @__PURE__ */
|
|
499
|
+
K.length > 0 && /* @__PURE__ */ D("div", {
|
|
498
500
|
id: "analytics-performance",
|
|
499
501
|
className: "scroll-mt-6",
|
|
500
|
-
children: [/* @__PURE__ */
|
|
502
|
+
children: [/* @__PURE__ */ E("h2", {
|
|
501
503
|
className: "mb-4 text-lg font-semibold text-text-primary",
|
|
502
504
|
children: "Monthly Performance"
|
|
503
|
-
}), /* @__PURE__ */
|
|
505
|
+
}), /* @__PURE__ */ E(ee, {
|
|
504
506
|
columns: H,
|
|
505
507
|
data: K,
|
|
506
508
|
keyField: "month",
|
|
@@ -511,6 +513,6 @@ function L() {
|
|
|
511
513
|
});
|
|
512
514
|
}
|
|
513
515
|
//#endregion
|
|
514
|
-
export {
|
|
516
|
+
export { I as AnalyticsPage };
|
|
515
517
|
|
|
516
518
|
//# sourceMappingURL=AnalyticsPage.js.map
|