@burdenoff/microfe-housingvista 2026.709.2 → 2026.709.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/housingvista/HousingVistaRoutes.d.ts.map +1 -1
  2. package/dist/housingvista/HousingVistaRoutes.js +136 -37
  3. package/dist/housingvista/HousingVistaRoutes.js.map +1 -1
  4. package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts +1 -1
  5. package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts.map +1 -1
  6. package/dist/housingvista/hooks/useHousingVistaAnalytics.js +4 -4
  7. package/dist/housingvista/hooks/useHousingVistaAnalytics.js.map +1 -1
  8. package/dist/housingvista/pages/amc/AMCManagementPage.d.ts.map +1 -1
  9. package/dist/housingvista/pages/amc/AMCManagementPage.js +62 -60
  10. package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
  11. package/dist/housingvista/pages/assets/AssetDetailPage.d.ts.map +1 -1
  12. package/dist/housingvista/pages/assets/AssetDetailPage.js +141 -138
  13. package/dist/housingvista/pages/assets/AssetDetailPage.js.map +1 -1
  14. package/dist/housingvista/pages/assets/AssetManagementPage.d.ts.map +1 -1
  15. package/dist/housingvista/pages/assets/AssetManagementPage.js +193 -191
  16. package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
  17. package/dist/housingvista/pages/chat/ChatPage.d.ts.map +1 -1
  18. package/dist/housingvista/pages/chat/ChatPage.js +115 -113
  19. package/dist/housingvista/pages/chat/ChatPage.js.map +1 -1
  20. package/dist/housingvista/pages/finance/HomeLoanDetailPage.d.ts.map +1 -1
  21. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js +152 -149
  22. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js.map +1 -1
  23. package/dist/housingvista/pages/finance/HomeLoansPage.d.ts.map +1 -1
  24. package/dist/housingvista/pages/finance/HomeLoansPage.js +141 -139
  25. package/dist/housingvista/pages/finance/HomeLoansPage.js.map +1 -1
  26. package/dist/housingvista/pages/investments/InvestmentDetailPage.d.ts.map +1 -1
  27. package/dist/housingvista/pages/investments/InvestmentDetailPage.js +290 -287
  28. package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
  29. package/dist/housingvista/pages/investments/InvestmentsPage.d.ts.map +1 -1
  30. package/dist/housingvista/pages/investments/InvestmentsPage.js +64 -62
  31. package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
  32. package/dist/housingvista/pages/legal/LegalPage.d.ts.map +1 -1
  33. package/dist/housingvista/pages/legal/LegalPage.js +95 -93
  34. package/dist/housingvista/pages/legal/LegalPage.js.map +1 -1
  35. package/dist/housingvista/pages/legal/LegalServiceDetailPage.d.ts.map +1 -1
  36. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js +129 -126
  37. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js.map +1 -1
  38. package/dist/housingvista/pages/market/AreaInsightsPage.d.ts.map +1 -1
  39. package/dist/housingvista/pages/market/AreaInsightsPage.js +99 -97
  40. package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
  41. package/dist/housingvista/pages/market/MarketAnalyticsPage.d.ts.map +1 -1
  42. package/dist/housingvista/pages/market/MarketAnalyticsPage.js +138 -136
  43. package/dist/housingvista/pages/market/MarketAnalyticsPage.js.map +1 -1
  44. package/dist/housingvista/pages/marketplace/MarketplacePage.d.ts.map +1 -1
  45. package/dist/housingvista/pages/marketplace/MarketplacePage.js +99 -97
  46. package/dist/housingvista/pages/marketplace/MarketplacePage.js.map +1 -1
  47. package/dist/housingvista/pages/marketplace/ServiceDetailPage.d.ts.map +1 -1
  48. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js +137 -134
  49. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js.map +1 -1
  50. package/dist/housingvista/pages/offers/OffersPage.d.ts.map +1 -1
  51. package/dist/housingvista/pages/offers/OffersPage.js +94 -92
  52. package/dist/housingvista/pages/offers/OffersPage.js.map +1 -1
  53. package/dist/housingvista/pages/properties/AddPropertyPage.d.ts.map +1 -1
  54. package/dist/housingvista/pages/properties/AddPropertyPage.js +280 -279
  55. package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
  56. package/dist/housingvista/pages/rental/RentalManagementPage.d.ts.map +1 -1
  57. package/dist/housingvista/pages/rental/RentalManagementPage.js +153 -151
  58. package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
  59. package/dist/housingvista/pages/settings/ProfilePage.d.ts.map +1 -1
  60. package/dist/housingvista/pages/settings/ProfilePage.js +52 -50
  61. package/dist/housingvista/pages/settings/ProfilePage.js.map +1 -1
  62. package/dist/housingvista/pages/settings/SettingsPage.d.ts.map +1 -1
  63. package/dist/housingvista/pages/settings/SettingsPage.js +54 -52
  64. package/dist/housingvista/pages/settings/SettingsPage.js.map +1 -1
  65. package/dist/housingvista/pages/shortlist/ShortlistPage.d.ts.map +1 -1
  66. package/dist/housingvista/pages/shortlist/ShortlistPage.js +43 -41
  67. package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -1
  68. package/dist/housingvista/pages/transactions/TransactionDetailPage.d.ts.map +1 -1
  69. package/dist/housingvista/pages/transactions/TransactionDetailPage.js +211 -208
  70. package/dist/housingvista/pages/transactions/TransactionDetailPage.js.map +1 -1
  71. package/dist/housingvista/pages/transactions/TransactionsPage.d.ts.map +1 -1
  72. package/dist/housingvista/pages/transactions/TransactionsPage.js +85 -83
  73. package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
  74. package/dist/housingvista/pages/verification/VerificationDetailPage.d.ts.map +1 -1
  75. package/dist/housingvista/pages/verification/VerificationDetailPage.js +25 -22
  76. package/dist/housingvista/pages/verification/VerificationDetailPage.js.map +1 -1
  77. package/dist/housingvista/pages/verification/VerificationPage.d.ts.map +1 -1
  78. package/dist/housingvista/pages/verification/VerificationPage.js +123 -121
  79. package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
  80. package/dist/housingvista/pages/viewings/ViewingsPage.d.ts.map +1 -1
  81. package/dist/housingvista/pages/viewings/ViewingsPage.js +128 -126
  82. package/dist/housingvista/pages/viewings/ViewingsPage.js.map +1 -1
  83. package/package.json +1 -1
@@ -4,21 +4,22 @@ import { StatCard as i } from "../../components/StatCard.js";
4
4
  import { StatusBadge as a } from "../../components/StatusBadge.js";
5
5
  import { EmptyState as o } from "../../components/EmptyState.js";
6
6
  import { FilterBar as s } from "../../components/FilterBar.js";
7
+ import { useTrackPageView as c } from "../../hooks/useHousingVistaAnalytics.js";
7
8
  import { useAMCContracts as ee, useCreateAmcContract as te, useMaintenanceRequests as ne } from "../../hooks/index.js";
8
- import { notify as c } from "../../lib/toast.js";
9
+ import { notify as l } from "../../lib/toast.js";
9
10
  import "../../components/index.js";
10
- import { useServerPagination as l } from "../../hooks/useServerPagination.js";
11
- import { useEffect as re, useMemo as u, useState as d } from "react";
12
- import { AlertTriangle as ie, Calendar as ae, Clock as f, DollarSign as oe, Download as se, MapPin as ce, Plus as p, RotateCcw as le, Shield as m, Wrench as h } from "lucide-react";
13
- import { useNavigate as g } from "react-router-dom";
14
- import { Fragment as ue, jsx as _, jsxs as v } from "react/jsx-runtime";
15
- import { Button as y, EmphasisPanel as de, NextSteps as fe, Pagination as pe, ResponsiveDialog as me, ResponsiveDialogContent as he, ResponsiveDialogDescription as ge, ResponsiveDialogFooter as _e, ResponsiveDialogHeader as ve, ResponsiveDialogTitle as ye } from "@burdenoff/fe-libs/ui";
11
+ import { useServerPagination as re } from "../../hooks/useServerPagination.js";
12
+ import { useEffect as ie, useMemo as u, useState as d } from "react";
13
+ import { AlertTriangle as f, Calendar as ae, Clock as oe, DollarSign as se, Download as ce, MapPin as le, Plus as p, RotateCcw as m, Shield as h, Wrench as g } from "lucide-react";
14
+ import { useNavigate as ue } from "react-router-dom";
15
+ import { Fragment as de, jsx as _, jsxs as v } from "react/jsx-runtime";
16
+ import { Button as y, EmphasisPanel as fe, NextSteps as pe, Pagination as me, ResponsiveDialog as he, ResponsiveDialogContent as ge, ResponsiveDialogDescription as _e, ResponsiveDialogFooter as ve, ResponsiveDialogHeader as ye, ResponsiveDialogTitle as be } from "@burdenoff/fe-libs/ui";
16
17
  //#region src/housingvista/pages/amc/AMCManagementPage.tsx
17
18
  var b = "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)]";
18
19
  function x(e) {
19
20
  return e ? new Date(e).toISOString() : "";
20
21
  }
21
- function be(e) {
22
+ function xe(e) {
22
23
  switch (e) {
23
24
  case "active": return "success";
24
25
  case "expiring_soon": return "warning";
@@ -28,25 +29,26 @@ function be(e) {
28
29
  }
29
30
  }
30
31
  function S() {
31
- let S = g(), C = l(10), [w, T] = d(""), [xe, E] = d("");
32
- re(() => {
33
- let e = setTimeout(() => E(w), 300);
32
+ c("housingvista.amc.viewed");
33
+ let S = ue(), C = re(10), [w, T] = d(""), [E, D] = d("");
34
+ ie(() => {
35
+ let e = setTimeout(() => D(w), 300);
34
36
  return () => clearTimeout(e);
35
37
  }, [w]);
36
- let { data: D } = ee({
37
- filter: { search: xe.trim() || void 0 },
38
+ let { data: O } = ee({
39
+ filter: { search: E.trim() || void 0 },
38
40
  pagination: C.pagination
39
- }), { createAmcContract: O, loading: k } = te(), { data: A } = ne({
41
+ }), { createAmcContract: k, loading: A } = te(), { data: j } = ne({
40
42
  filter: { status: "open" },
41
43
  pagination: {
42
44
  limit: 100,
43
45
  offset: 0
44
46
  }
45
- }), j = A.length, M = (e) => {
47
+ }), M = j.length, Se = (e) => {
46
48
  T(e), C.setPage(1);
47
- }, Se = () => {
48
- if (D.length === 0) {
49
- c.warning("Nothing to export", "There are no contracts to export yet.");
49
+ }, Ce = () => {
50
+ if (O.length === 0) {
51
+ l.warning("Nothing to export", "There are no contracts to export yet.");
50
52
  return;
51
53
  }
52
54
  let e = (e) => `"${e.replace(/"/g, "\"\"")}"`, t = [
@@ -58,7 +60,7 @@ function S() {
58
60
  "End",
59
61
  "Status",
60
62
  "Services"
61
- ], n = D.map((t) => [
63
+ ], n = O.map((t) => [
62
64
  t.packageName,
63
65
  t.propertyTitle,
64
66
  t.providerName,
@@ -68,25 +70,25 @@ function S() {
68
70
  t.status,
69
71
  t.servicesIncluded.join("; ")
70
72
  ].map((t) => e(String(t))).join(",")), r = [t.map(e).join(","), ...n].join("\n"), i = new Blob([r], { type: "text/csv;charset=utf-8;" }), a = URL.createObjectURL(i), o = document.createElement("a");
71
- o.href = a, o.download = `housingvista-amc-contracts-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`, document.body.appendChild(o), o.click(), document.body.removeChild(o), URL.revokeObjectURL(a), c.success("Export ready", `${D.length} contracts exported to CSV.`);
72
- }, [Ce, N] = d(!1), [P, F] = d(""), [I, L] = d(""), [R, z] = d(""), [B, V] = d(""), [H, U] = d(""), [W, G] = d(""), [K, q] = d("active"), [J, Y] = d(""), X = () => {
73
+ o.href = a, o.download = `housingvista-amc-contracts-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`, document.body.appendChild(o), o.click(), document.body.removeChild(o), URL.revokeObjectURL(a), l.success("Export ready", `${O.length} contracts exported to CSV.`);
74
+ }, [we, N] = d(!1), [P, F] = d(""), [I, L] = d(""), [R, z] = d(""), [B, V] = d(""), [H, U] = d(""), [W, G] = d(""), [K, q] = d("active"), [J, Y] = d(""), X = () => {
73
75
  F(""), L(""), z(""), V(""), U(""), G(""), q("active"), Y("");
74
76
  }, Z = () => {
75
77
  X(), N(!0);
76
- }, we = async (e) => {
78
+ }, Te = async (e) => {
77
79
  e.preventDefault();
78
80
  let t = Number(B);
79
81
  if (!P.trim() || !I.trim() || !R.trim()) {
80
- c.warning("Missing details", "Property, package and provider are required.");
82
+ l.warning("Missing details", "Property, package and provider are required.");
81
83
  return;
82
84
  }
83
85
  if (!Number.isFinite(t) || t <= 0) {
84
- c.warning("Enter a valid monthly cost");
86
+ l.warning("Enter a valid monthly cost");
85
87
  return;
86
88
  }
87
89
  let n = J.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
88
90
  try {
89
- await O({
91
+ await k({
90
92
  propertyTitle: P.trim(),
91
93
  packageName: I.trim(),
92
94
  providerName: R.trim(),
@@ -95,20 +97,20 @@ function S() {
95
97
  endDate: x(W),
96
98
  status: K,
97
99
  servicesIncluded: n.length > 0 ? n : void 0
98
- }), c.success("Contract created", `${I.trim()} added for ${P.trim()}.`), N(!1), X();
100
+ }), l.success("Contract created", `${I.trim()} added for ${P.trim()}.`), N(!1), X();
99
101
  } catch (e) {
100
- c.error("Could not create contract", e.message);
102
+ l.error("Could not create contract", e.message);
101
103
  }
102
104
  }, Q = u(() => ({
103
- activeContracts: D.filter((e) => e.status === "active" || e.status === "expiring_soon").length,
104
- pendingRenewals: D.filter((e) => e.status === "expiring_soon").length,
105
- totalMonthlySpent: D.filter((e) => e.status === "active" || e.status === "expiring_soon").reduce((e, t) => e + t.monthlyCost, 0),
106
- upcomingServices: D.filter((e) => {
105
+ activeContracts: O.filter((e) => e.status === "active" || e.status === "expiring_soon").length,
106
+ pendingRenewals: O.filter((e) => e.status === "expiring_soon").length,
107
+ totalMonthlySpent: O.filter((e) => e.status === "active" || e.status === "expiring_soon").reduce((e, t) => e + t.monthlyCost, 0),
108
+ upcomingServices: O.filter((e) => {
107
109
  if (!e.nextServiceDate) return !1;
108
110
  let t = new Date(e.nextServiceDate), n = /* @__PURE__ */ new Date(), r = (t.getTime() - n.getTime()) / (1e3 * 60 * 60 * 24);
109
111
  return r >= 0 && r <= 30;
110
112
  }).length
111
- }), [D]), $ = u(() => D.filter((e) => e.nextServiceDate && (e.status === "active" || e.status === "expiring_soon")).sort((e, t) => new Date(e.nextServiceDate).getTime() - new Date(t.nextServiceDate).getTime()), [D]), Te = {
113
+ }), [O]), $ = u(() => O.filter((e) => e.nextServiceDate && (e.status === "active" || e.status === "expiring_soon")).sort((e, t) => new Date(e.nextServiceDate).getTime() - new Date(t.nextServiceDate).getTime()), [O]), Ee = {
112
114
  active: "border-l-4 border-l-status-success-border",
113
115
  expiring_soon: "border-l-4 border-l-status-warning-border bg-status-warning-bg-subtle/30",
114
116
  expired: "border-l-4 border-l-status-error-border",
@@ -121,9 +123,9 @@ function S() {
121
123
  actions: /* @__PURE__ */ v("div", {
122
124
  className: "flex items-center gap-2",
123
125
  children: [/* @__PURE__ */ v("button", {
124
- onClick: Se,
126
+ onClick: Ce,
125
127
  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",
126
- children: [/* @__PURE__ */ _(se, { className: "h-4 w-4" }), "Export"]
128
+ children: [/* @__PURE__ */ _(ce, { className: "h-4 w-4" }), "Export"]
127
129
  }), /* @__PURE__ */ v(y, {
128
130
  type: "button",
129
131
  onClick: Z,
@@ -132,7 +134,7 @@ function S() {
132
134
  })]
133
135
  }),
134
136
  children: [
135
- /* @__PURE__ */ _(de, {
137
+ /* @__PURE__ */ _(fe, {
136
138
  className: "p-4",
137
139
  children: /* @__PURE__ */ v("div", {
138
140
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
@@ -140,18 +142,18 @@ function S() {
140
142
  /* @__PURE__ */ _(i, {
141
143
  label: "Active Contracts",
142
144
  value: Q.activeContracts,
143
- icon: /* @__PURE__ */ _(m, { className: "h-4 w-4" })
145
+ icon: /* @__PURE__ */ _(h, { className: "h-4 w-4" })
144
146
  }),
145
147
  /* @__PURE__ */ _(i, {
146
148
  label: "Pending Renewals",
147
149
  value: Q.pendingRenewals,
148
- icon: /* @__PURE__ */ _(le, { className: "h-4 w-4" })
150
+ icon: /* @__PURE__ */ _(m, { className: "h-4 w-4" })
149
151
  }),
150
152
  /* @__PURE__ */ _(i, {
151
153
  label: "Total Monthly Spent",
152
154
  value: Q.totalMonthlySpent,
153
155
  prefix: "$",
154
- icon: /* @__PURE__ */ _(oe, { className: "h-4 w-4" })
156
+ icon: /* @__PURE__ */ _(se, { className: "h-4 w-4" })
155
157
  }),
156
158
  /* @__PURE__ */ _(i, {
157
159
  label: "Upcoming Services",
@@ -161,7 +163,7 @@ function S() {
161
163
  ]
162
164
  })
163
165
  }),
164
- /* @__PURE__ */ _(fe, {
166
+ /* @__PURE__ */ _(pe, {
165
167
  storageKey: "housingvista-amc",
166
168
  steps: [
167
169
  {
@@ -175,7 +177,7 @@ function S() {
175
177
  label: "Compare your providers",
176
178
  description: "Search by provider name to weigh coverage and monthly cost.",
177
179
  onClick: () => {
178
- let e = D[0]?.providerName;
180
+ let e = O[0]?.providerName;
179
181
  e && (T(e), C.setPage(1));
180
182
  }
181
183
  },
@@ -198,13 +200,13 @@ function S() {
198
200
  children: "All Contracts"
199
201
  }), /* @__PURE__ */ _(s, {
200
202
  searchValue: w,
201
- onSearchChange: M,
203
+ onSearchChange: Se,
202
204
  searchPlaceholder: "Search contracts, providers, properties..."
203
205
  })]
204
- }), D.length > 0 ? /* @__PURE__ */ v(ue, { children: [/* @__PURE__ */ _("div", {
206
+ }), O.length > 0 ? /* @__PURE__ */ v(de, { children: [/* @__PURE__ */ _("div", {
205
207
  className: "space-y-3",
206
- children: D.map((r) => /* @__PURE__ */ v("div", {
207
- className: e("rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm", Te[r.status]),
208
+ children: O.map((r) => /* @__PURE__ */ v("div", {
209
+ className: e("rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm", Ee[r.status]),
208
210
  children: [/* @__PURE__ */ v("div", {
209
211
  className: "flex flex-wrap items-start justify-between gap-2",
210
212
  children: [/* @__PURE__ */ v("div", {
@@ -212,7 +214,7 @@ function S() {
212
214
  children: [
213
215
  /* @__PURE__ */ v("p", {
214
216
  className: "flex items-center gap-1 text-xs text-text-secondary",
215
- children: [/* @__PURE__ */ _(ce, { className: "h-3 w-3" }), "Property"]
217
+ children: [/* @__PURE__ */ _(le, { className: "h-3 w-3" }), "Property"]
216
218
  }),
217
219
  /* @__PURE__ */ _("h3", {
218
220
  className: "truncate text-base font-semibold text-text-primary",
@@ -225,7 +227,7 @@ function S() {
225
227
  ]
226
228
  }), /* @__PURE__ */ _(a, {
227
229
  label: r.status.replace("_", " "),
228
- variant: be(r.status),
230
+ variant: xe(r.status),
229
231
  dot: !0
230
232
  })]
231
233
  }), /* @__PURE__ */ v("div", {
@@ -265,16 +267,16 @@ function S() {
265
267
  ]
266
268
  })]
267
269
  }, r.id))
268
- }), /* @__PURE__ */ _(pe, {
270
+ }), /* @__PURE__ */ _(me, {
269
271
  page: C.page,
270
272
  pageSize: C.pageSize,
271
- hasNextPage: D.length >= C.pageSize,
273
+ hasNextPage: O.length >= C.pageSize,
272
274
  hasPreviousPage: C.page > 1,
273
275
  onPageChange: C.setPage,
274
276
  onPageSizeChange: C.setPageSize
275
277
  })] }) : /* @__PURE__ */ _(o, {
276
278
  illustration: "empty-search",
277
- icon: /* @__PURE__ */ _(m, { className: "h-12 w-12" }),
279
+ icon: /* @__PURE__ */ _(h, { className: "h-12 w-12" }),
278
280
  title: "No contracts found",
279
281
  description: "Try adjusting your search criteria or create a new contract.",
280
282
  action: /* @__PURE__ */ v(y, {
@@ -304,7 +306,7 @@ function S() {
304
306
  className: "flex gap-3",
305
307
  children: [/* @__PURE__ */ _("div", {
306
308
  className: e("flex h-9 w-9 shrink-0 items-center justify-center rounded-full", s ? "bg-status-error-bg-subtle" : o ? "bg-status-warning-bg-subtle" : "bg-status-info-bg-subtle"),
307
- children: s ? /* @__PURE__ */ _(ie, { className: "h-4 w-4 text-status-error-text" }) : o ? /* @__PURE__ */ _(f, { className: "h-4 w-4 text-status-warning-text" }) : /* @__PURE__ */ _(h, { className: "h-4 w-4 text-status-info-text" })
309
+ children: s ? /* @__PURE__ */ _(f, { className: "h-4 w-4 text-status-error-text" }) : o ? /* @__PURE__ */ _(oe, { className: "h-4 w-4 text-status-warning-text" }) : /* @__PURE__ */ _(g, { className: "h-4 w-4 text-status-info-text" })
308
310
  }), /* @__PURE__ */ v("div", {
309
311
  className: "min-w-0",
310
312
  children: [
@@ -339,26 +341,26 @@ function S() {
339
341
  className: "flex w-full items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 text-left shadow-sm transition-colors hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]",
340
342
  children: [/* @__PURE__ */ _("div", {
341
343
  className: "rounded-lg bg-status-info-bg-subtle p-2.5",
342
- children: /* @__PURE__ */ _(h, { className: "h-5 w-5 text-status-info-text" })
344
+ children: /* @__PURE__ */ _(g, { className: "h-5 w-5 text-status-info-text" })
343
345
  }), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
344
346
  className: "text-sm text-text-secondary",
345
347
  children: "Open maintenance requests"
346
348
  }), /* @__PURE__ */ _("p", {
347
349
  className: "text-xl font-bold text-text-primary",
348
- children: j
350
+ children: M
349
351
  })] })]
350
352
  })]
351
353
  })]
352
354
  }),
353
- /* @__PURE__ */ _(me, {
354
- open: Ce,
355
+ /* @__PURE__ */ _(he, {
356
+ open: we,
355
357
  onOpenChange: N,
356
- children: /* @__PURE__ */ _(he, {
358
+ children: /* @__PURE__ */ _(ge, {
357
359
  className: "sm:max-w-lg",
358
360
  children: /* @__PURE__ */ v("form", {
359
- onSubmit: we,
361
+ onSubmit: Te,
360
362
  children: [
361
- /* @__PURE__ */ v(ve, { children: [/* @__PURE__ */ _(ye, { children: "New maintenance contract" }), /* @__PURE__ */ _(ge, { children: "Set up an Annual Maintenance Contract to track coverage, cost and renewal dates." })] }),
363
+ /* @__PURE__ */ v(ye, { children: [/* @__PURE__ */ _(be, { children: "New maintenance contract" }), /* @__PURE__ */ _(_e, { children: "Set up an Annual Maintenance Contract to track coverage, cost and renewal dates." })] }),
362
364
  /* @__PURE__ */ v("div", {
363
365
  className: "space-y-3 py-2",
364
366
  children: [
@@ -473,15 +475,15 @@ function S() {
473
475
  })] })
474
476
  ]
475
477
  }),
476
- /* @__PURE__ */ v(_e, { children: [/* @__PURE__ */ _(y, {
478
+ /* @__PURE__ */ v(ve, { children: [/* @__PURE__ */ _(y, {
477
479
  type: "button",
478
480
  variant: "outline",
479
481
  onClick: () => N(!1),
480
482
  children: "Cancel"
481
483
  }), /* @__PURE__ */ _(y, {
482
484
  type: "submit",
483
- disabled: k,
484
- children: k ? "Saving…" : "Create contract"
485
+ disabled: A,
486
+ children: A ? "Saving…" : "Create contract"
485
487
  })] })
486
488
  ]
487
489
  })
@@ -1 +1 @@
1
- {"version":3,"file":"AMCManagementPage.js","names":[],"sources":["../../../../src/housingvista/pages/amc/AMCManagementPage.tsx"],"sourcesContent":["import { useState, useMemo, useEffect, type FormEvent } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Shield,\n DollarSign,\n Calendar,\n Plus,\n Download,\n Clock,\n AlertTriangle,\n Wrench,\n RotateCcw,\n MapPin,\n} from 'lucide-react';\nimport {\n Button,\n EmphasisPanel,\n NextSteps,\n Pagination,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components';\nimport { StatCard } from '../../components';\nimport { StatusBadge } from '../../components';\nimport { FilterBar } from '../../components';\nimport { EmptyState } from '../../components';\nimport { useAMCContracts, useCreateAmcContract, useMaintenanceRequests } from '../../hooks';\nimport { useServerPagination } from '../../hooks/useServerPagination';\nimport { cn, formatCurrency, formatDate } from '../../utils/helpers';\nimport { notify } from '../../lib/toast';\nimport type { AMCContract } from '../../types';\n\nconst inputClass =\n '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)]';\n\ntype AmcStatus = 'active' | 'expiring_soon' | 'expired' | 'cancelled';\n\nfunction toIso(value: string): string {\n return value ? new Date(value).toISOString() : '';\n}\n\nfunction getStatusVariant(status: AMCContract['status']): 'success' | 'warning' | 'error' | 'muted' {\n switch (status) {\n case 'active':\n return 'success';\n case 'expiring_soon':\n return 'warning';\n case 'expired':\n return 'error';\n case 'cancelled':\n return 'muted';\n default:\n return 'muted';\n }\n}\n\nexport function AMCManagementPage() {\n const navigate = useNavigate();\n const pagination = useServerPagination(10);\n const [search, setSearch] = useState('');\n const [debouncedSearch, setDebouncedSearch] = useState('');\n\n // Debounce the raw search input into the value that feeds the server filter.\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedSearch(search), 300);\n return () => clearTimeout(timer);\n }, [search]);\n\n const { data: amcContracts } = useAMCContracts({\n filter: { search: debouncedSearch.trim() || undefined },\n pagination: pagination.pagination,\n });\n\n const { createAmcContract, loading: creating } = useCreateAmcContract();\n\n // Open maintenance requests across the portfolio — real count for the sidebar stat.\n const { data: maintenanceRequests } = useMaintenanceRequests({\n filter: { status: 'open' },\n pagination: { limit: 100, offset: 0 },\n });\n const openMaintenanceCount = maintenanceRequests.length;\n\n const handleSearchChange = (value: string) => {\n setSearch(value);\n pagination.setPage(1);\n };\n\n const handleExport = () => {\n if (amcContracts.length === 0) {\n notify.warning('Nothing to export', 'There are no contracts to export yet.');\n return;\n }\n const escape = (value: string) => `\"${value.replace(/\"/g, '\"\"')}\"`;\n const headers = ['Package', 'Property', 'Provider', 'Monthly Cost', 'Start', 'End', 'Status', 'Services'];\n const rows = amcContracts.map((c) =>\n [\n c.packageName,\n c.propertyTitle,\n c.providerName,\n String(c.monthlyCost),\n c.startDate,\n c.endDate,\n c.status,\n c.servicesIncluded.join('; '),\n ]\n .map((cell) => escape(String(cell)))\n .join(',')\n );\n const csv = [headers.map(escape).join(','), ...rows].join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `housingvista-amc-contracts-${new Date().toISOString().slice(0, 10)}.csv`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n notify.success('Export ready', `${amcContracts.length} contracts exported to CSV.`);\n };\n\n const [createOpen, setCreateOpen] = useState(false);\n const [propertyTitle, setPropertyTitle] = useState('');\n const [packageName, setPackageName] = useState('');\n const [providerName, setProviderName] = useState('');\n const [monthlyCost, setMonthlyCost] = useState('');\n const [startDate, setStartDate] = useState('');\n const [endDate, setEndDate] = useState('');\n const [status, setStatus] = useState<AmcStatus>('active');\n const [servicesIncluded, setServicesIncluded] = useState('');\n\n const resetForm = () => {\n setPropertyTitle('');\n setPackageName('');\n setProviderName('');\n setMonthlyCost('');\n setStartDate('');\n setEndDate('');\n setStatus('active');\n setServicesIncluded('');\n };\n\n const openCreate = () => {\n resetForm();\n setCreateOpen(true);\n };\n\n const handleCreate = async (e: FormEvent) => {\n e.preventDefault();\n const cost = Number(monthlyCost);\n if (!propertyTitle.trim() || !packageName.trim() || !providerName.trim()) {\n notify.warning('Missing details', 'Property, package and provider are required.');\n return;\n }\n if (!Number.isFinite(cost) || cost <= 0) {\n notify.warning('Enter a valid monthly cost');\n return;\n }\n const services = servicesIncluded\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n try {\n await createAmcContract({\n propertyTitle: propertyTitle.trim(),\n packageName: packageName.trim(),\n providerName: providerName.trim(),\n monthlyCost: cost,\n startDate: toIso(startDate),\n endDate: toIso(endDate),\n status,\n servicesIncluded: services.length > 0 ? services : undefined,\n });\n notify.success('Contract created', `${packageName.trim()} added for ${propertyTitle.trim()}.`);\n setCreateOpen(false);\n resetForm();\n } catch (err) {\n notify.error('Could not create contract', (err as Error).message);\n }\n };\n\n const stats = useMemo(() => {\n const activeContracts = amcContracts.filter((c) => c.status === 'active' || c.status === 'expiring_soon').length;\n const pendingRenewals = amcContracts.filter((c) => c.status === 'expiring_soon').length;\n const totalMonthlySpent = amcContracts\n .filter((c) => c.status === 'active' || c.status === 'expiring_soon')\n .reduce((sum, c) => sum + c.monthlyCost, 0);\n const upcomingServices = amcContracts.filter((c) => {\n if (!c.nextServiceDate) return false;\n const serviceDate = new Date(c.nextServiceDate);\n const now = new Date();\n const daysUntil = (serviceDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24);\n return daysUntil >= 0 && daysUntil <= 30;\n }).length;\n return { activeContracts, pendingRenewals, totalMonthlySpent, upcomingServices };\n }, [amcContracts]);\n\n const scheduledServices = useMemo(\n () =>\n amcContracts\n .filter((c) => c.nextServiceDate && (c.status === 'active' || c.status === 'expiring_soon'))\n .sort((a, b) => new Date(a.nextServiceDate).getTime() - new Date(b.nextServiceDate).getTime()),\n [amcContracts]\n );\n\n // Accent styling per contract status for the card treatment.\n const statusAccent: Record<AMCContract['status'], string> = {\n active: 'border-l-4 border-l-status-success-border',\n expiring_soon: 'border-l-4 border-l-status-warning-border bg-status-warning-bg-subtle/30',\n expired: 'border-l-4 border-l-status-error-border',\n cancelled: 'border-l-4 border-l-border-strong',\n };\n\n return (\n <PageLayout\n title=\"AMC Management\"\n description=\"Manage Annual Maintenance Contracts and service packages\"\n purpose=\"Keep your properties maintained without surprises. Track every Annual Maintenance Contract, see what each covers and costs, get ahead of renewals, and know which services are due in the next 30 days so nothing slips.\"\n actions={\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handleExport}\n 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\"\n >\n <Download className=\"h-4 w-4\" />\n Export\n </button>\n <Button type=\"button\" onClick={openCreate} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n New Contract\n </Button>\n </div>\n }\n >\n {/* Stats — primary insight zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-4\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard label=\"Active Contracts\" value={stats.activeContracts} icon={<Shield className=\"h-4 w-4\" />} />\n <StatCard label=\"Pending Renewals\" value={stats.pendingRenewals} icon={<RotateCcw className=\"h-4 w-4\" />} />\n <StatCard\n label=\"Total Monthly Spent\"\n value={stats.totalMonthlySpent}\n prefix=\"$\"\n icon={<DollarSign className=\"h-4 w-4\" />}\n />\n <StatCard label=\"Upcoming Services\" value={stats.upcomingServices} icon={<Calendar className=\"h-4 w-4\" />} />\n </div>\n </EmphasisPanel>\n\n <NextSteps\n storageKey=\"housingvista-amc\"\n steps={[\n {\n id: 'pick-property',\n label: 'Add coverage for a property',\n description: 'Choose a property to set up a new maintenance contract.',\n onClick: () => navigate('../properties'),\n },\n {\n id: 'compare-providers',\n label: 'Compare your providers',\n description: 'Search by provider name to weigh coverage and monthly cost.',\n onClick: () => {\n const firstProvider = amcContracts[0]?.providerName;\n if (firstProvider) {\n setSearch(firstProvider);\n pagination.setPage(1);\n }\n },\n },\n {\n id: 'check-legal',\n label: 'Review contract paperwork',\n description: 'Open the legal hub to manage the underlying documents.',\n onClick: () => navigate('../legal'),\n },\n ]}\n />\n\n {/* Contract cards (left) + service schedule & open-maintenance sidebar (right) */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"space-y-4 lg:col-span-2\">\n <div className=\"flex flex-col gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">All Contracts</h2>\n <FilterBar\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder=\"Search contracts, providers, properties...\"\n />\n </div>\n {amcContracts.length > 0 ? (\n <>\n <div className=\"space-y-3\">\n {amcContracts.map((contract) => (\n <div\n key={contract.id}\n className={cn(\n 'rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm',\n statusAccent[contract.status]\n )}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <p className=\"flex items-center gap-1 text-xs text-text-secondary\">\n <MapPin className=\"h-3 w-3\" />\n Property\n </p>\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{contract.propertyTitle}</h3>\n <p className=\"text-xs text-text-secondary\">{contract.packageName}</p>\n </div>\n <StatusBadge\n label={contract.status.replace('_', ' ')}\n variant={getStatusVariant(contract.status)}\n dot\n />\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-4 border-t border-border-subtle pt-4 sm:grid-cols-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Provider</p>\n <p className=\"mt-0.5 text-sm font-medium text-text-primary\">{contract.providerName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Coverage</p>\n <p className=\"mt-0.5 truncate text-sm font-medium text-text-primary\">\n {contract.servicesIncluded.length > 0\n ? contract.servicesIncluded.slice(0, 2).join(', ')\n : '—'}\n {contract.servicesIncluded.length > 2 ? ` +${contract.servicesIncluded.length - 2}` : ''}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Monthly Cost</p>\n <p className=\"mt-0.5 text-sm font-semibold text-text-primary\">\n {formatCurrency(contract.monthlyCost)}\n <span className=\"text-xs font-normal text-text-secondary\">/mo</span>\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Renewal Date</p>\n <p className=\"mt-0.5 text-sm font-medium text-text-primary\">{formatDate(contract.endDate)}</p>\n </div>\n </div>\n </div>\n ))}\n </div>\n <Pagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n hasNextPage={amcContracts.length >= pagination.pageSize}\n hasPreviousPage={pagination.page > 1}\n onPageChange={pagination.setPage}\n onPageSizeChange={pagination.setPageSize}\n />\n </>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<Shield className=\"h-12 w-12\" />}\n title=\"No contracts found\"\n description=\"Try adjusting your search criteria or create a new contract.\"\n action={\n <Button type=\"button\" onClick={openCreate} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n New Contract\n </Button>\n }\n />\n )}\n </div>\n\n {/* Sidebar */}\n <aside className=\"space-y-6 lg:col-span-1\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Upcoming Service Schedule</h3>\n {scheduledServices.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No services scheduled\"\n description=\"Upcoming service dates from your active contracts will appear here.\"\n className=\"border-0 bg-transparent p-4\"\n />\n ) : (\n <ol className=\"space-y-4\">\n {scheduledServices.map((contract) => {\n const serviceDate = new Date(contract.nextServiceDate);\n const now = new Date();\n const daysUntil = Math.ceil((serviceDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n const isUrgent = daysUntil <= 7;\n const isPast = daysUntil < 0;\n return (\n <li key={contract.id} className=\"flex gap-3\">\n <div\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-full',\n isPast\n ? 'bg-status-error-bg-subtle'\n : isUrgent\n ? 'bg-status-warning-bg-subtle'\n : 'bg-status-info-bg-subtle'\n )}\n >\n {isPast ? (\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n ) : isUrgent ? (\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n ) : (\n <Wrench className=\"h-4 w-4 text-status-info-text\" />\n )}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">{formatDate(contract.nextServiceDate)}</p>\n <p className=\"truncate text-sm text-text-primary\">\n {contract.packageName} — {contract.propertyTitle}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">{contract.providerName}</p>\n <p\n className={cn(\n 'text-xs font-medium',\n isPast\n ? 'text-status-error-text'\n : isUrgent\n ? 'text-status-warning-text'\n : 'text-text-secondary'\n )}\n >\n {isPast\n ? `${Math.abs(daysUntil)} days overdue`\n : daysUntil === 0\n ? 'Today'\n : `In ${daysUntil} days`}\n </p>\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigate('../rental')}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 text-left shadow-sm transition-colors hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"rounded-lg bg-status-info-bg-subtle p-2.5\">\n <Wrench className=\"h-5 w-5 text-status-info-text\" />\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Open maintenance requests</p>\n <p className=\"text-xl font-bold text-text-primary\">{openMaintenanceCount}</p>\n </div>\n </button>\n </aside>\n </div>\n\n {/* New Contract dialog */}\n <ResponsiveDialog open={createOpen} onOpenChange={setCreateOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <form onSubmit={handleCreate}>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New maintenance contract</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Set up an Annual Maintenance Contract to track coverage, cost and renewal dates.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3 py-2\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Property *</label>\n <input\n type=\"text\"\n required\n placeholder=\"e.g. Maple Court\"\n value={propertyTitle}\n onChange={(e) => setPropertyTitle(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Package *</label>\n <input\n type=\"text\"\n required\n placeholder=\"e.g. Premium Care\"\n value={packageName}\n onChange={(e) => setPackageName(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Provider *</label>\n <input\n type=\"text\"\n required\n placeholder=\"Service company\"\n value={providerName}\n onChange={(e) => setProviderName(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Monthly cost *</label>\n <input\n type=\"number\"\n required\n min={0}\n step=\"0.01\"\n placeholder=\"0.00\"\n value={monthlyCost}\n onChange={(e) => setMonthlyCost(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Start date</label>\n <input\n type=\"date\"\n value={startDate}\n onChange={(e) => setStartDate(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">End date</label>\n <input\n type=\"date\"\n value={endDate}\n onChange={(e) => setEndDate(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Status</label>\n <select\n value={status}\n onChange={(e) => setStatus(e.target.value as AmcStatus)}\n className={inputClass}\n >\n <option value=\"active\">Active</option>\n <option value=\"expiring_soon\">Expiring soon</option>\n <option value=\"expired\">Expired</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n </div>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Services included</label>\n <input\n type=\"text\"\n placeholder=\"Comma-separated, e.g. Plumbing, Electrical, HVAC\"\n value={servicesIncluded}\n onChange={(e) => setServicesIncluded(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setCreateOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={creating}>\n {creating ? 'Saving…' : 'Create contract'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AMCManagementPage.js","names":[],"sources":["../../../../src/housingvista/pages/amc/AMCManagementPage.tsx"],"sourcesContent":["import { useState, useMemo, useEffect, type FormEvent } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Shield,\n DollarSign,\n Calendar,\n Plus,\n Download,\n Clock,\n AlertTriangle,\n Wrench,\n RotateCcw,\n MapPin,\n} from 'lucide-react';\nimport {\n Button,\n EmphasisPanel,\n NextSteps,\n Pagination,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components';\nimport { StatCard } from '../../components';\nimport { StatusBadge } from '../../components';\nimport { FilterBar } from '../../components';\nimport { EmptyState } from '../../components';\nimport { useAMCContracts, useCreateAmcContract, useMaintenanceRequests } from '../../hooks';\nimport { useServerPagination } from '../../hooks/useServerPagination';\nimport { cn, formatCurrency, formatDate } from '../../utils/helpers';\nimport { notify } from '../../lib/toast';\nimport type { AMCContract } from '../../types';\nimport { useTrackPageView } from '../../hooks/useHousingVistaAnalytics';\n\nconst inputClass =\n '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)]';\n\ntype AmcStatus = 'active' | 'expiring_soon' | 'expired' | 'cancelled';\n\nfunction toIso(value: string): string {\n return value ? new Date(value).toISOString() : '';\n}\n\nfunction getStatusVariant(status: AMCContract['status']): 'success' | 'warning' | 'error' | 'muted' {\n switch (status) {\n case 'active':\n return 'success';\n case 'expiring_soon':\n return 'warning';\n case 'expired':\n return 'error';\n case 'cancelled':\n return 'muted';\n default:\n return 'muted';\n }\n}\n\nexport function AMCManagementPage() {\n useTrackPageView('housingvista.amc.viewed');\n const navigate = useNavigate();\n const pagination = useServerPagination(10);\n const [search, setSearch] = useState('');\n const [debouncedSearch, setDebouncedSearch] = useState('');\n\n // Debounce the raw search input into the value that feeds the server filter.\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedSearch(search), 300);\n return () => clearTimeout(timer);\n }, [search]);\n\n const { data: amcContracts } = useAMCContracts({\n filter: { search: debouncedSearch.trim() || undefined },\n pagination: pagination.pagination,\n });\n\n const { createAmcContract, loading: creating } = useCreateAmcContract();\n\n // Open maintenance requests across the portfolio — real count for the sidebar stat.\n const { data: maintenanceRequests } = useMaintenanceRequests({\n filter: { status: 'open' },\n pagination: { limit: 100, offset: 0 },\n });\n const openMaintenanceCount = maintenanceRequests.length;\n\n const handleSearchChange = (value: string) => {\n setSearch(value);\n pagination.setPage(1);\n };\n\n const handleExport = () => {\n if (amcContracts.length === 0) {\n notify.warning('Nothing to export', 'There are no contracts to export yet.');\n return;\n }\n const escape = (value: string) => `\"${value.replace(/\"/g, '\"\"')}\"`;\n const headers = ['Package', 'Property', 'Provider', 'Monthly Cost', 'Start', 'End', 'Status', 'Services'];\n const rows = amcContracts.map((c) =>\n [\n c.packageName,\n c.propertyTitle,\n c.providerName,\n String(c.monthlyCost),\n c.startDate,\n c.endDate,\n c.status,\n c.servicesIncluded.join('; '),\n ]\n .map((cell) => escape(String(cell)))\n .join(',')\n );\n const csv = [headers.map(escape).join(','), ...rows].join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `housingvista-amc-contracts-${new Date().toISOString().slice(0, 10)}.csv`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n notify.success('Export ready', `${amcContracts.length} contracts exported to CSV.`);\n };\n\n const [createOpen, setCreateOpen] = useState(false);\n const [propertyTitle, setPropertyTitle] = useState('');\n const [packageName, setPackageName] = useState('');\n const [providerName, setProviderName] = useState('');\n const [monthlyCost, setMonthlyCost] = useState('');\n const [startDate, setStartDate] = useState('');\n const [endDate, setEndDate] = useState('');\n const [status, setStatus] = useState<AmcStatus>('active');\n const [servicesIncluded, setServicesIncluded] = useState('');\n\n const resetForm = () => {\n setPropertyTitle('');\n setPackageName('');\n setProviderName('');\n setMonthlyCost('');\n setStartDate('');\n setEndDate('');\n setStatus('active');\n setServicesIncluded('');\n };\n\n const openCreate = () => {\n resetForm();\n setCreateOpen(true);\n };\n\n const handleCreate = async (e: FormEvent) => {\n e.preventDefault();\n const cost = Number(monthlyCost);\n if (!propertyTitle.trim() || !packageName.trim() || !providerName.trim()) {\n notify.warning('Missing details', 'Property, package and provider are required.');\n return;\n }\n if (!Number.isFinite(cost) || cost <= 0) {\n notify.warning('Enter a valid monthly cost');\n return;\n }\n const services = servicesIncluded\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n try {\n await createAmcContract({\n propertyTitle: propertyTitle.trim(),\n packageName: packageName.trim(),\n providerName: providerName.trim(),\n monthlyCost: cost,\n startDate: toIso(startDate),\n endDate: toIso(endDate),\n status,\n servicesIncluded: services.length > 0 ? services : undefined,\n });\n notify.success('Contract created', `${packageName.trim()} added for ${propertyTitle.trim()}.`);\n setCreateOpen(false);\n resetForm();\n } catch (err) {\n notify.error('Could not create contract', (err as Error).message);\n }\n };\n\n const stats = useMemo(() => {\n const activeContracts = amcContracts.filter((c) => c.status === 'active' || c.status === 'expiring_soon').length;\n const pendingRenewals = amcContracts.filter((c) => c.status === 'expiring_soon').length;\n const totalMonthlySpent = amcContracts\n .filter((c) => c.status === 'active' || c.status === 'expiring_soon')\n .reduce((sum, c) => sum + c.monthlyCost, 0);\n const upcomingServices = amcContracts.filter((c) => {\n if (!c.nextServiceDate) return false;\n const serviceDate = new Date(c.nextServiceDate);\n const now = new Date();\n const daysUntil = (serviceDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24);\n return daysUntil >= 0 && daysUntil <= 30;\n }).length;\n return { activeContracts, pendingRenewals, totalMonthlySpent, upcomingServices };\n }, [amcContracts]);\n\n const scheduledServices = useMemo(\n () =>\n amcContracts\n .filter((c) => c.nextServiceDate && (c.status === 'active' || c.status === 'expiring_soon'))\n .sort((a, b) => new Date(a.nextServiceDate).getTime() - new Date(b.nextServiceDate).getTime()),\n [amcContracts]\n );\n\n // Accent styling per contract status for the card treatment.\n const statusAccent: Record<AMCContract['status'], string> = {\n active: 'border-l-4 border-l-status-success-border',\n expiring_soon: 'border-l-4 border-l-status-warning-border bg-status-warning-bg-subtle/30',\n expired: 'border-l-4 border-l-status-error-border',\n cancelled: 'border-l-4 border-l-border-strong',\n };\n\n return (\n <PageLayout\n title=\"AMC Management\"\n description=\"Manage Annual Maintenance Contracts and service packages\"\n purpose=\"Keep your properties maintained without surprises. Track every Annual Maintenance Contract, see what each covers and costs, get ahead of renewals, and know which services are due in the next 30 days so nothing slips.\"\n actions={\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handleExport}\n 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\"\n >\n <Download className=\"h-4 w-4\" />\n Export\n </button>\n <Button type=\"button\" onClick={openCreate} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n New Contract\n </Button>\n </div>\n }\n >\n {/* Stats — primary insight zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-4\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard label=\"Active Contracts\" value={stats.activeContracts} icon={<Shield className=\"h-4 w-4\" />} />\n <StatCard label=\"Pending Renewals\" value={stats.pendingRenewals} icon={<RotateCcw className=\"h-4 w-4\" />} />\n <StatCard\n label=\"Total Monthly Spent\"\n value={stats.totalMonthlySpent}\n prefix=\"$\"\n icon={<DollarSign className=\"h-4 w-4\" />}\n />\n <StatCard label=\"Upcoming Services\" value={stats.upcomingServices} icon={<Calendar className=\"h-4 w-4\" />} />\n </div>\n </EmphasisPanel>\n\n <NextSteps\n storageKey=\"housingvista-amc\"\n steps={[\n {\n id: 'pick-property',\n label: 'Add coverage for a property',\n description: 'Choose a property to set up a new maintenance contract.',\n onClick: () => navigate('../properties'),\n },\n {\n id: 'compare-providers',\n label: 'Compare your providers',\n description: 'Search by provider name to weigh coverage and monthly cost.',\n onClick: () => {\n const firstProvider = amcContracts[0]?.providerName;\n if (firstProvider) {\n setSearch(firstProvider);\n pagination.setPage(1);\n }\n },\n },\n {\n id: 'check-legal',\n label: 'Review contract paperwork',\n description: 'Open the legal hub to manage the underlying documents.',\n onClick: () => navigate('../legal'),\n },\n ]}\n />\n\n {/* Contract cards (left) + service schedule & open-maintenance sidebar (right) */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"space-y-4 lg:col-span-2\">\n <div className=\"flex flex-col gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">All Contracts</h2>\n <FilterBar\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder=\"Search contracts, providers, properties...\"\n />\n </div>\n {amcContracts.length > 0 ? (\n <>\n <div className=\"space-y-3\">\n {amcContracts.map((contract) => (\n <div\n key={contract.id}\n className={cn(\n 'rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm',\n statusAccent[contract.status]\n )}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <p className=\"flex items-center gap-1 text-xs text-text-secondary\">\n <MapPin className=\"h-3 w-3\" />\n Property\n </p>\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{contract.propertyTitle}</h3>\n <p className=\"text-xs text-text-secondary\">{contract.packageName}</p>\n </div>\n <StatusBadge\n label={contract.status.replace('_', ' ')}\n variant={getStatusVariant(contract.status)}\n dot\n />\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-4 border-t border-border-subtle pt-4 sm:grid-cols-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Provider</p>\n <p className=\"mt-0.5 text-sm font-medium text-text-primary\">{contract.providerName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Coverage</p>\n <p className=\"mt-0.5 truncate text-sm font-medium text-text-primary\">\n {contract.servicesIncluded.length > 0\n ? contract.servicesIncluded.slice(0, 2).join(', ')\n : '—'}\n {contract.servicesIncluded.length > 2 ? ` +${contract.servicesIncluded.length - 2}` : ''}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Monthly Cost</p>\n <p className=\"mt-0.5 text-sm font-semibold text-text-primary\">\n {formatCurrency(contract.monthlyCost)}\n <span className=\"text-xs font-normal text-text-secondary\">/mo</span>\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Renewal Date</p>\n <p className=\"mt-0.5 text-sm font-medium text-text-primary\">{formatDate(contract.endDate)}</p>\n </div>\n </div>\n </div>\n ))}\n </div>\n <Pagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n hasNextPage={amcContracts.length >= pagination.pageSize}\n hasPreviousPage={pagination.page > 1}\n onPageChange={pagination.setPage}\n onPageSizeChange={pagination.setPageSize}\n />\n </>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<Shield className=\"h-12 w-12\" />}\n title=\"No contracts found\"\n description=\"Try adjusting your search criteria or create a new contract.\"\n action={\n <Button type=\"button\" onClick={openCreate} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n New Contract\n </Button>\n }\n />\n )}\n </div>\n\n {/* Sidebar */}\n <aside className=\"space-y-6 lg:col-span-1\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Upcoming Service Schedule</h3>\n {scheduledServices.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No services scheduled\"\n description=\"Upcoming service dates from your active contracts will appear here.\"\n className=\"border-0 bg-transparent p-4\"\n />\n ) : (\n <ol className=\"space-y-4\">\n {scheduledServices.map((contract) => {\n const serviceDate = new Date(contract.nextServiceDate);\n const now = new Date();\n const daysUntil = Math.ceil((serviceDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n const isUrgent = daysUntil <= 7;\n const isPast = daysUntil < 0;\n return (\n <li key={contract.id} className=\"flex gap-3\">\n <div\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-full',\n isPast\n ? 'bg-status-error-bg-subtle'\n : isUrgent\n ? 'bg-status-warning-bg-subtle'\n : 'bg-status-info-bg-subtle'\n )}\n >\n {isPast ? (\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n ) : isUrgent ? (\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n ) : (\n <Wrench className=\"h-4 w-4 text-status-info-text\" />\n )}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">{formatDate(contract.nextServiceDate)}</p>\n <p className=\"truncate text-sm text-text-primary\">\n {contract.packageName} — {contract.propertyTitle}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">{contract.providerName}</p>\n <p\n className={cn(\n 'text-xs font-medium',\n isPast\n ? 'text-status-error-text'\n : isUrgent\n ? 'text-status-warning-text'\n : 'text-text-secondary'\n )}\n >\n {isPast\n ? `${Math.abs(daysUntil)} days overdue`\n : daysUntil === 0\n ? 'Today'\n : `In ${daysUntil} days`}\n </p>\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigate('../rental')}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 text-left shadow-sm transition-colors hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"rounded-lg bg-status-info-bg-subtle p-2.5\">\n <Wrench className=\"h-5 w-5 text-status-info-text\" />\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Open maintenance requests</p>\n <p className=\"text-xl font-bold text-text-primary\">{openMaintenanceCount}</p>\n </div>\n </button>\n </aside>\n </div>\n\n {/* New Contract dialog */}\n <ResponsiveDialog open={createOpen} onOpenChange={setCreateOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <form onSubmit={handleCreate}>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New maintenance contract</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Set up an Annual Maintenance Contract to track coverage, cost and renewal dates.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3 py-2\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Property *</label>\n <input\n type=\"text\"\n required\n placeholder=\"e.g. Maple Court\"\n value={propertyTitle}\n onChange={(e) => setPropertyTitle(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Package *</label>\n <input\n type=\"text\"\n required\n placeholder=\"e.g. Premium Care\"\n value={packageName}\n onChange={(e) => setPackageName(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Provider *</label>\n <input\n type=\"text\"\n required\n placeholder=\"Service company\"\n value={providerName}\n onChange={(e) => setProviderName(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Monthly cost *</label>\n <input\n type=\"number\"\n required\n min={0}\n step=\"0.01\"\n placeholder=\"0.00\"\n value={monthlyCost}\n onChange={(e) => setMonthlyCost(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Start date</label>\n <input\n type=\"date\"\n value={startDate}\n onChange={(e) => setStartDate(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">End date</label>\n <input\n type=\"date\"\n value={endDate}\n onChange={(e) => setEndDate(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Status</label>\n <select\n value={status}\n onChange={(e) => setStatus(e.target.value as AmcStatus)}\n className={inputClass}\n >\n <option value=\"active\">Active</option>\n <option value=\"expiring_soon\">Expiring soon</option>\n <option value=\"expired\">Expired</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n </div>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Services included</label>\n <input\n type=\"text\"\n placeholder=\"Comma-separated, e.g. Plumbing, Electrical, HVAC\"\n value={servicesIncluded}\n onChange={(e) => setServicesIncluded(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setCreateOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={creating}>\n {creating ? 'Saving…' : 'Create contract'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssetDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/assets/AssetDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwCH,wBAAgB,eAAe,gCAwQ9B"}
1
+ {"version":3,"file":"AssetDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/assets/AssetDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyCH,wBAAgB,eAAe,gCA0Q9B"}