@burdenoff/microfe-housingvista 2026.608.1 → 2026.624.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/housingvista/components/DataTable.js +70 -30
- package/dist/housingvista/components/DataTable.js.map +1 -1
- package/dist/housingvista/hooks/index.js +120 -110
- package/dist/housingvista/hooks/index.js.map +1 -1
- package/dist/housingvista/hooks/useServerPagination.js +23 -0
- package/dist/housingvista/hooks/useServerPagination.js.map +1 -0
- package/dist/housingvista/pages/assets/AssetManagementPage.js +94 -85
- package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
- package/dist/housingvista/pages/rental/RentalManagementPage.js +114 -105
- package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionsPage.js +102 -93
- package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
- package/dist/housingvista/pages/verification/VerificationPage.js +49 -40
- package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,25 +3,25 @@ import { useCallback as t, useMemo as n, useState as r } from "react";
|
|
|
3
3
|
import { ChevronDown as i, ChevronLeft as a, ChevronRight as o, ChevronUp as s, ChevronsUpDown as c } from "lucide-react";
|
|
4
4
|
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
5
|
//#region src/housingvista/components/DataTable.tsx
|
|
6
|
-
function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h = "No data available", className: g, pageSize: _ = 10, selectable: v = !1, selectedKeys: y, onSelectionChange: b }) {
|
|
7
|
-
let [
|
|
8
|
-
|
|
9
|
-
}, [
|
|
10
|
-
let n = e[
|
|
6
|
+
function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h = "No data available", className: g, pageSize: _ = 10, selectable: v = !1, selectedKeys: y, onSelectionChange: b, serverPagination: x }) {
|
|
7
|
+
let [S, C] = r(null), [w, T] = r(null), [E, D] = r(0), O = t((e) => {
|
|
8
|
+
S === e ? w === "asc" ? T("desc") : w === "desc" ? (C(null), T(null)) : T("asc") : (C(e), T("asc")), D(0);
|
|
9
|
+
}, [S, w]), k = n(() => !S || !w ? f : [...f].sort((e, t) => {
|
|
10
|
+
let n = e[S], r = t[S];
|
|
11
11
|
if (n == null && r == null) return 0;
|
|
12
12
|
if (n == null) return 1;
|
|
13
13
|
if (r == null) return -1;
|
|
14
14
|
let i = typeof n == "number" && typeof r == "number" ? n - r : String(n).localeCompare(String(r));
|
|
15
|
-
return
|
|
15
|
+
return w === "asc" ? i : -i;
|
|
16
16
|
}), [
|
|
17
17
|
f,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
]),
|
|
18
|
+
S,
|
|
19
|
+
w
|
|
20
|
+
]), A = x?.pageSize ?? _, j = Math.max(1, Math.ceil(k.length / A)), M = x ? k : k.slice(E * A, (E + 1) * A), N = v && y ? M.every((e) => y.has(String(e[p]))) : !1, P = () => {
|
|
21
21
|
if (!b || !y) return;
|
|
22
22
|
let e = new Set(y);
|
|
23
|
-
|
|
24
|
-
},
|
|
23
|
+
N ? M.forEach((t) => e.delete(String(t[p]))) : M.forEach((t) => e.add(String(t[p]))), b(e);
|
|
24
|
+
}, F = (e) => {
|
|
25
25
|
if (!b || !y) return;
|
|
26
26
|
let t = String(e[p]), n = new Set(y);
|
|
27
27
|
n.has(t) ? n.delete(t) : n.add(t), b(n);
|
|
@@ -44,24 +44,24 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
44
44
|
className: "w-10 px-3 py-3",
|
|
45
45
|
children: /* @__PURE__ */ l("input", {
|
|
46
46
|
type: "checkbox",
|
|
47
|
-
checked:
|
|
48
|
-
onChange:
|
|
47
|
+
checked: N && M.length > 0,
|
|
48
|
+
onChange: P,
|
|
49
49
|
className: "h-4 w-4 rounded border-border"
|
|
50
50
|
})
|
|
51
51
|
}), d.map((t) => {
|
|
52
|
-
let n = t.sortable !== !1, r =
|
|
52
|
+
let n = t.sortable !== !1, r = S === t.key;
|
|
53
53
|
return /* @__PURE__ */ l("th", {
|
|
54
54
|
className: e("px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-muted-foreground", n && "cursor-pointer select-none hover:text-foreground", t.className),
|
|
55
|
-
onClick: n ? () =>
|
|
55
|
+
onClick: n ? () => O(t.key) : void 0,
|
|
56
56
|
children: /* @__PURE__ */ u("span", {
|
|
57
57
|
className: "inline-flex items-center gap-1",
|
|
58
|
-
children: [t.header, n && (r ? l(
|
|
58
|
+
children: [t.header, n && (r ? l(w === "asc" ? s : i, { className: "h-3 w-3" }) : /* @__PURE__ */ l(c, { className: "h-3 w-3 opacity-30" }))]
|
|
59
59
|
})
|
|
60
60
|
}, t.key);
|
|
61
61
|
})]
|
|
62
62
|
}) }), /* @__PURE__ */ l("tbody", {
|
|
63
63
|
className: "divide-y divide-border bg-card",
|
|
64
|
-
children:
|
|
64
|
+
children: M.map((t) => {
|
|
65
65
|
let n = String(t[p]), r = v && y?.has(n);
|
|
66
66
|
return /* @__PURE__ */ u("tr", {
|
|
67
67
|
className: e("transition-colors", m && "cursor-pointer hover:bg-muted/50", r && "bg-primary/5"),
|
|
@@ -72,7 +72,7 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
72
72
|
children: /* @__PURE__ */ l("input", {
|
|
73
73
|
type: "checkbox",
|
|
74
74
|
checked: r ?? !1,
|
|
75
|
-
onChange: () =>
|
|
75
|
+
onChange: () => F(t),
|
|
76
76
|
className: "h-4 w-4 rounded border-border"
|
|
77
77
|
})
|
|
78
78
|
}), d.map((n) => /* @__PURE__ */ l("td", {
|
|
@@ -83,41 +83,81 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
83
83
|
})
|
|
84
84
|
})]
|
|
85
85
|
})
|
|
86
|
-
}),
|
|
86
|
+
}), x ? /* @__PURE__ */ u("div", {
|
|
87
|
+
className: "flex flex-col gap-3 rounded-lg border border-border bg-card p-3 text-sm sm:flex-row sm:items-center sm:justify-between",
|
|
88
|
+
children: [/* @__PURE__ */ u("span", {
|
|
89
|
+
className: "text-muted-foreground",
|
|
90
|
+
children: ["Page ", x.page]
|
|
91
|
+
}), /* @__PURE__ */ u("div", {
|
|
92
|
+
className: "flex flex-wrap items-center gap-2",
|
|
93
|
+
children: [
|
|
94
|
+
x.onPageSizeChange ? /* @__PURE__ */ l("select", {
|
|
95
|
+
value: x.pageSize,
|
|
96
|
+
onChange: (e) => x.onPageSizeChange?.(Number(e.target.value)),
|
|
97
|
+
disabled: x.loading,
|
|
98
|
+
className: "h-8 rounded-md border border-border bg-card px-2 text-sm text-foreground disabled:opacity-50",
|
|
99
|
+
"aria-label": "Rows per page",
|
|
100
|
+
children: [
|
|
101
|
+
10,
|
|
102
|
+
25,
|
|
103
|
+
50,
|
|
104
|
+
100
|
|
105
|
+
].map((e) => /* @__PURE__ */ u("option", {
|
|
106
|
+
value: e,
|
|
107
|
+
children: [e, " / page"]
|
|
108
|
+
}, e))
|
|
109
|
+
}) : null,
|
|
110
|
+
/* @__PURE__ */ u("button", {
|
|
111
|
+
type: "button",
|
|
112
|
+
onClick: () => x.onPageChange(x.page - 1),
|
|
113
|
+
disabled: x.loading || x.page <= 1,
|
|
114
|
+
className: "inline-flex items-center gap-1 rounded-md border border-border px-3 py-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40",
|
|
115
|
+
children: [/* @__PURE__ */ l(a, { className: "h-4 w-4" }), "Previous"]
|
|
116
|
+
}),
|
|
117
|
+
/* @__PURE__ */ u("button", {
|
|
118
|
+
type: "button",
|
|
119
|
+
onClick: () => x.onPageChange(x.page + 1),
|
|
120
|
+
disabled: x.loading || !(x.hasNextPage ?? k.length >= x.pageSize),
|
|
121
|
+
className: "inline-flex items-center gap-1 rounded-md border border-border px-3 py-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40",
|
|
122
|
+
children: ["Next", /* @__PURE__ */ l(o, { className: "h-4 w-4" })]
|
|
123
|
+
})
|
|
124
|
+
]
|
|
125
|
+
})]
|
|
126
|
+
}) : k.length > _ ? /* @__PURE__ */ u("div", {
|
|
87
127
|
className: "flex items-center justify-between text-sm",
|
|
88
128
|
children: [/* @__PURE__ */ u("span", {
|
|
89
129
|
className: "text-muted-foreground",
|
|
90
130
|
children: [
|
|
91
131
|
"Showing ",
|
|
92
|
-
|
|
132
|
+
E * _ + 1,
|
|
93
133
|
"-",
|
|
94
|
-
Math.min((
|
|
134
|
+
Math.min((E + 1) * _, k.length),
|
|
95
135
|
" of ",
|
|
96
|
-
|
|
136
|
+
k.length
|
|
97
137
|
]
|
|
98
138
|
}), /* @__PURE__ */ u("div", {
|
|
99
139
|
className: "flex items-center gap-1",
|
|
100
140
|
children: [
|
|
101
141
|
/* @__PURE__ */ l("button", {
|
|
102
|
-
onClick: () =>
|
|
103
|
-
disabled:
|
|
142
|
+
onClick: () => D((e) => Math.max(0, e - 1)),
|
|
143
|
+
disabled: E === 0,
|
|
104
144
|
className: "rounded-md border border-border p-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40",
|
|
105
145
|
children: /* @__PURE__ */ l(a, { className: "h-4 w-4" })
|
|
106
146
|
}),
|
|
107
|
-
Array.from({ length:
|
|
108
|
-
onClick: () =>
|
|
109
|
-
className: e("h-8 w-8 rounded-md text-xs font-medium transition-colors", n ===
|
|
147
|
+
Array.from({ length: j }).map((t, n) => /* @__PURE__ */ l("button", {
|
|
148
|
+
onClick: () => D(n),
|
|
149
|
+
className: e("h-8 w-8 rounded-md text-xs font-medium transition-colors", n === E ? "bg-foreground text-background" : "text-muted-foreground hover:bg-muted"),
|
|
110
150
|
children: n + 1
|
|
111
151
|
}, n)),
|
|
112
152
|
/* @__PURE__ */ l("button", {
|
|
113
|
-
onClick: () =>
|
|
114
|
-
disabled:
|
|
153
|
+
onClick: () => D((e) => Math.min(j - 1, e + 1)),
|
|
154
|
+
disabled: E >= j - 1,
|
|
115
155
|
className: "rounded-md border border-border p-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40",
|
|
116
156
|
children: /* @__PURE__ */ l(o, { className: "h-4 w-4" })
|
|
117
157
|
})
|
|
118
158
|
]
|
|
119
159
|
})]
|
|
120
|
-
})]
|
|
160
|
+
}) : null]
|
|
121
161
|
});
|
|
122
162
|
}
|
|
123
163
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.js","names":[],"sources":["../../../src/housingvista/components/DataTable.tsx"],"sourcesContent":["import { useState, useMemo, useCallback, type ReactNode } from 'react';\nimport { ChevronUp, ChevronDown, ChevronsUpDown, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../utils/helpers';\n\nexport interface Column<T> {\n key: string;\n header: string;\n render?: (item: T) => ReactNode;\n className?: string;\n sortable?: boolean;\n}\n\ntype SortDirection = 'asc' | 'desc' | null;\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n data: T[];\n keyField: string;\n onRowClick?: (item: T) => void;\n emptyMessage?: string;\n className?: string;\n pageSize?: number;\n selectable?: boolean;\n selectedKeys?: Set<string>;\n onSelectionChange?: (keys: Set<string>) => void;\n}\n\nexport function DataTable<T extends object>({\n columns,\n data,\n keyField,\n onRowClick,\n emptyMessage = 'No data available',\n className,\n pageSize = 10,\n selectable = false,\n selectedKeys,\n onSelectionChange,\n}: DataTableProps<T>) {\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortDir, setSortDir] = useState<SortDirection>(null);\n const [page, setPage] = useState(0);\n\n const handleSort = useCallback(\n (key: string) => {\n if (sortKey === key) {\n if (sortDir === 'asc') setSortDir('desc');\n else if (sortDir === 'desc') {\n setSortKey(null);\n setSortDir(null);\n } else setSortDir('asc');\n } else {\n setSortKey(key);\n setSortDir('asc');\n }\n setPage(0);\n },\n [sortKey, sortDir]\n );\n\n const sorted = useMemo(() => {\n if (!sortKey || !sortDir) return data;\n return [...data].sort((a, b) => {\n const av = (a as Record<string, unknown>)[sortKey];\n const bv = (b as Record<string, unknown>)[sortKey];\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n const cmp = typeof av === 'number' && typeof bv === 'number' ? av - bv : String(av).localeCompare(String(bv));\n return sortDir === 'asc' ? cmp : -cmp;\n });\n }, [data, sortKey, sortDir]);\n\n const totalPages = Math.max(1, Math.ceil(sorted.length / pageSize));\n const paged = sorted.slice(page * pageSize, (page + 1) * pageSize);\n\n const allPageKeysSelected =\n selectable && selectedKeys\n ? paged.every((item) => selectedKeys.has(String((item as Record<string, unknown>)[keyField])))\n : false;\n\n const handleSelectAll = () => {\n if (!onSelectionChange || !selectedKeys) return;\n const keys = new Set(selectedKeys);\n if (allPageKeysSelected) {\n paged.forEach((item) => keys.delete(String((item as Record<string, unknown>)[keyField])));\n } else {\n paged.forEach((item) => keys.add(String((item as Record<string, unknown>)[keyField])));\n }\n onSelectionChange(keys);\n };\n\n const handleSelectRow = (item: T) => {\n if (!onSelectionChange || !selectedKeys) return;\n const key = String((item as Record<string, unknown>)[keyField]);\n const keys = new Set(selectedKeys);\n if (keys.has(key)) keys.delete(key);\n else keys.add(key);\n onSelectionChange(keys);\n };\n\n if (data.length === 0) {\n return (\n <div className=\"flex items-center justify-center rounded-lg border border-border bg-card p-12\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-3', className)}>\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border bg-muted/50\">\n {selectable && (\n <th className=\"w-10 px-3 py-3\">\n <input\n type=\"checkbox\"\n checked={allPageKeysSelected && paged.length > 0}\n onChange={handleSelectAll}\n className=\"h-4 w-4 rounded border-border\"\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable !== false;\n const isActive = sortKey === col.key;\n return (\n <th\n key={col.key}\n className={cn(\n 'px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-muted-foreground',\n isSortable && 'cursor-pointer select-none hover:text-foreground',\n col.className\n )}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.header}\n {isSortable &&\n (isActive ? (\n sortDir === 'asc' ? (\n <ChevronUp className=\"h-3 w-3\" />\n ) : (\n <ChevronDown className=\"h-3 w-3\" />\n )\n ) : (\n <ChevronsUpDown className=\"h-3 w-3 opacity-30\" />\n ))}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border bg-card\">\n {paged.map((item) => {\n const rowKey = String((item as Record<string, unknown>)[keyField]);\n const isSelected = selectable && selectedKeys?.has(rowKey);\n return (\n <tr\n key={rowKey}\n className={cn(\n 'transition-colors',\n onRowClick && 'cursor-pointer hover:bg-muted/50',\n isSelected && 'bg-primary/5'\n )}\n onClick={() => onRowClick?.(item)}\n >\n {selectable && (\n <td className=\"w-10 px-3 py-3\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n checked={isSelected ?? false}\n onChange={() => handleSelectRow(item)}\n className=\"h-4 w-4 rounded border-border\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className={cn('px-4 py-3 text-sm text-foreground', col.className)}>\n {col.render ? col.render(item) : String((item as Record<string, unknown>)[col.key] ?? '')}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {sorted.length > pageSize && (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">\n Showing {page * pageSize + 1}-{Math.min((page + 1) * pageSize, sorted.length)} of {sorted.length}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => setPage((p) => Math.max(0, p - 1))}\n disabled={page === 0}\n className=\"rounded-md border border-border p-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n {Array.from({ length: totalPages }).map((_, i) => (\n <button\n key={i}\n onClick={() => setPage(i)}\n className={cn(\n 'h-8 w-8 rounded-md text-xs font-medium transition-colors',\n i === page ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted'\n )}\n >\n {i + 1}\n </button>\n ))}\n <button\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n disabled={page >= totalPages - 1}\n className=\"rounded-md border border-border p-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataTable.js","names":[],"sources":["../../../src/housingvista/components/DataTable.tsx"],"sourcesContent":["import { useState, useMemo, useCallback, type ReactNode } from 'react';\nimport { ChevronUp, ChevronDown, ChevronsUpDown, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../utils/helpers';\n\nexport interface Column<T> {\n key: string;\n header: string;\n render?: (item: T) => ReactNode;\n className?: string;\n sortable?: boolean;\n}\n\ntype SortDirection = 'asc' | 'desc' | null;\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n data: T[];\n keyField: string;\n onRowClick?: (item: T) => void;\n emptyMessage?: string;\n className?: string;\n pageSize?: number;\n selectable?: boolean;\n selectedKeys?: Set<string>;\n onSelectionChange?: (keys: Set<string>) => void;\n serverPagination?: {\n page: number;\n pageSize: number;\n hasNextPage?: boolean;\n loading?: boolean;\n onPageChange: (page: number) => void;\n onPageSizeChange?: (pageSize: number) => void;\n };\n}\n\nexport function DataTable<T extends object>({\n columns,\n data,\n keyField,\n onRowClick,\n emptyMessage = 'No data available',\n className,\n pageSize = 10,\n selectable = false,\n selectedKeys,\n onSelectionChange,\n serverPagination,\n}: DataTableProps<T>) {\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortDir, setSortDir] = useState<SortDirection>(null);\n const [page, setPage] = useState(0);\n\n const handleSort = useCallback(\n (key: string) => {\n if (sortKey === key) {\n if (sortDir === 'asc') setSortDir('desc');\n else if (sortDir === 'desc') {\n setSortKey(null);\n setSortDir(null);\n } else setSortDir('asc');\n } else {\n setSortKey(key);\n setSortDir('asc');\n }\n setPage(0);\n },\n [sortKey, sortDir]\n );\n\n const sorted = useMemo(() => {\n if (!sortKey || !sortDir) return data;\n return [...data].sort((a, b) => {\n const av = (a as Record<string, unknown>)[sortKey];\n const bv = (b as Record<string, unknown>)[sortKey];\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n const cmp = typeof av === 'number' && typeof bv === 'number' ? av - bv : String(av).localeCompare(String(bv));\n return sortDir === 'asc' ? cmp : -cmp;\n });\n }, [data, sortKey, sortDir]);\n\n const effectivePageSize = serverPagination?.pageSize ?? pageSize;\n const totalPages = Math.max(1, Math.ceil(sorted.length / effectivePageSize));\n const paged = serverPagination ? sorted : sorted.slice(page * effectivePageSize, (page + 1) * effectivePageSize);\n\n const allPageKeysSelected =\n selectable && selectedKeys\n ? paged.every((item) => selectedKeys.has(String((item as Record<string, unknown>)[keyField])))\n : false;\n\n const handleSelectAll = () => {\n if (!onSelectionChange || !selectedKeys) return;\n const keys = new Set(selectedKeys);\n if (allPageKeysSelected) {\n paged.forEach((item) => keys.delete(String((item as Record<string, unknown>)[keyField])));\n } else {\n paged.forEach((item) => keys.add(String((item as Record<string, unknown>)[keyField])));\n }\n onSelectionChange(keys);\n };\n\n const handleSelectRow = (item: T) => {\n if (!onSelectionChange || !selectedKeys) return;\n const key = String((item as Record<string, unknown>)[keyField]);\n const keys = new Set(selectedKeys);\n if (keys.has(key)) keys.delete(key);\n else keys.add(key);\n onSelectionChange(keys);\n };\n\n if (data.length === 0) {\n return (\n <div className=\"flex items-center justify-center rounded-lg border border-border bg-card p-12\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-3', className)}>\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border bg-muted/50\">\n {selectable && (\n <th className=\"w-10 px-3 py-3\">\n <input\n type=\"checkbox\"\n checked={allPageKeysSelected && paged.length > 0}\n onChange={handleSelectAll}\n className=\"h-4 w-4 rounded border-border\"\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable !== false;\n const isActive = sortKey === col.key;\n return (\n <th\n key={col.key}\n className={cn(\n 'px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-muted-foreground',\n isSortable && 'cursor-pointer select-none hover:text-foreground',\n col.className\n )}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.header}\n {isSortable &&\n (isActive ? (\n sortDir === 'asc' ? (\n <ChevronUp className=\"h-3 w-3\" />\n ) : (\n <ChevronDown className=\"h-3 w-3\" />\n )\n ) : (\n <ChevronsUpDown className=\"h-3 w-3 opacity-30\" />\n ))}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border bg-card\">\n {paged.map((item) => {\n const rowKey = String((item as Record<string, unknown>)[keyField]);\n const isSelected = selectable && selectedKeys?.has(rowKey);\n return (\n <tr\n key={rowKey}\n className={cn(\n 'transition-colors',\n onRowClick && 'cursor-pointer hover:bg-muted/50',\n isSelected && 'bg-primary/5'\n )}\n onClick={() => onRowClick?.(item)}\n >\n {selectable && (\n <td className=\"w-10 px-3 py-3\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n checked={isSelected ?? false}\n onChange={() => handleSelectRow(item)}\n className=\"h-4 w-4 rounded border-border\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className={cn('px-4 py-3 text-sm text-foreground', col.className)}>\n {col.render ? col.render(item) : String((item as Record<string, unknown>)[col.key] ?? '')}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {serverPagination ? (\n <div className=\"flex flex-col gap-3 rounded-lg border border-border bg-card p-3 text-sm sm:flex-row sm:items-center sm:justify-between\">\n <span className=\"text-muted-foreground\">Page {serverPagination.page}</span>\n <div className=\"flex flex-wrap items-center gap-2\">\n {serverPagination.onPageSizeChange ? (\n <select\n value={serverPagination.pageSize}\n onChange={(event) => serverPagination.onPageSizeChange?.(Number(event.target.value))}\n disabled={serverPagination.loading}\n className=\"h-8 rounded-md border border-border bg-card px-2 text-sm text-foreground disabled:opacity-50\"\n aria-label=\"Rows per page\"\n >\n {[10, 25, 50, 100].map((option) => (\n <option key={option} value={option}>\n {option} / page\n </option>\n ))}\n </select>\n ) : null}\n <button\n type=\"button\"\n onClick={() => serverPagination.onPageChange(serverPagination.page - 1)}\n disabled={serverPagination.loading || serverPagination.page <= 1}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-3 py-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n Previous\n </button>\n <button\n type=\"button\"\n onClick={() => serverPagination.onPageChange(serverPagination.page + 1)}\n disabled={\n serverPagination.loading ||\n !(serverPagination.hasNextPage ?? sorted.length >= serverPagination.pageSize)\n }\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-3 py-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n Next\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ) : sorted.length > pageSize ? (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">\n Showing {page * pageSize + 1}-{Math.min((page + 1) * pageSize, sorted.length)} of {sorted.length}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => setPage((p) => Math.max(0, p - 1))}\n disabled={page === 0}\n className=\"rounded-md border border-border p-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n {Array.from({ length: totalPages }).map((_, i) => (\n <button\n key={i}\n onClick={() => setPage(i)}\n className={cn(\n 'h-8 w-8 rounded-md text-xs font-medium transition-colors',\n i === page ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted'\n )}\n >\n {i + 1}\n </button>\n ))}\n <button\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n disabled={page >= totalPages - 1}\n className=\"rounded-md border border-border p-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { gql as e } from "@apollo/client";
|
|
2
2
|
import { useQuery as t } from "@apollo/client/react";
|
|
3
3
|
//#region src/housingvista/hooks/index.ts
|
|
4
|
-
var n =
|
|
4
|
+
var n = {
|
|
5
|
+
limit: 50,
|
|
6
|
+
offset: 0
|
|
7
|
+
}, r = (e = n) => ({ pagination: {
|
|
8
|
+
limit: e.limit ?? n.limit,
|
|
9
|
+
offset: e.offset ?? n.offset
|
|
10
|
+
} }), i = e`
|
|
5
11
|
query GetDashboardStats {
|
|
6
12
|
housingvistaDashboardStats {
|
|
7
13
|
totalProperties
|
|
@@ -18,9 +24,9 @@ var n = e`
|
|
|
18
24
|
upcomingViewings
|
|
19
25
|
}
|
|
20
26
|
}
|
|
21
|
-
`,
|
|
22
|
-
query GetProperties {
|
|
23
|
-
housingvistaProperties {
|
|
27
|
+
`, a = e`
|
|
28
|
+
query GetProperties($pagination: HousingVistaPaginationInput) {
|
|
29
|
+
housingvistaProperties(pagination: $pagination) {
|
|
24
30
|
id
|
|
25
31
|
title
|
|
26
32
|
description
|
|
@@ -81,9 +87,9 @@ var n = e`
|
|
|
81
87
|
updatedAt
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
|
-
`,
|
|
85
|
-
query GetTransactions {
|
|
86
|
-
housingvistaTransactions {
|
|
90
|
+
`, o = e`
|
|
91
|
+
query GetTransactions($pagination: HousingVistaPaginationInput) {
|
|
92
|
+
housingvistaTransactions(pagination: $pagination) {
|
|
87
93
|
id
|
|
88
94
|
type
|
|
89
95
|
status
|
|
@@ -94,6 +100,10 @@ var n = e`
|
|
|
94
100
|
property {
|
|
95
101
|
id
|
|
96
102
|
title
|
|
103
|
+
location {
|
|
104
|
+
city
|
|
105
|
+
state
|
|
106
|
+
}
|
|
97
107
|
images {
|
|
98
108
|
id
|
|
99
109
|
url
|
|
@@ -126,9 +136,9 @@ var n = e`
|
|
|
126
136
|
}
|
|
127
137
|
}
|
|
128
138
|
}
|
|
129
|
-
`,
|
|
130
|
-
query GetInvestments {
|
|
131
|
-
housingvistaInvestments {
|
|
139
|
+
`, s = e`
|
|
140
|
+
query GetInvestments($pagination: HousingVistaPaginationInput) {
|
|
141
|
+
housingvistaInvestments(pagination: $pagination) {
|
|
132
142
|
id
|
|
133
143
|
investmentType
|
|
134
144
|
totalValue
|
|
@@ -146,9 +156,9 @@ var n = e`
|
|
|
146
156
|
}
|
|
147
157
|
}
|
|
148
158
|
}
|
|
149
|
-
`,
|
|
150
|
-
query GetRentalUnits {
|
|
151
|
-
housingvistaRentalUnits {
|
|
159
|
+
`, c = e`
|
|
160
|
+
query GetRentalUnits($pagination: HousingVistaPaginationInput) {
|
|
161
|
+
housingvistaRentalUnits(pagination: $pagination) {
|
|
152
162
|
id
|
|
153
163
|
propertyId
|
|
154
164
|
propertyTitle
|
|
@@ -165,9 +175,9 @@ var n = e`
|
|
|
165
175
|
securityDeposit
|
|
166
176
|
}
|
|
167
177
|
}
|
|
168
|
-
`,
|
|
169
|
-
query GetAssets {
|
|
170
|
-
housingvistaAssets {
|
|
178
|
+
`, l = e`
|
|
179
|
+
query GetAssets($pagination: HousingVistaPaginationInput) {
|
|
180
|
+
housingvistaAssets(pagination: $pagination) {
|
|
171
181
|
id
|
|
172
182
|
title
|
|
173
183
|
type
|
|
@@ -183,9 +193,9 @@ var n = e`
|
|
|
183
193
|
lastValuationDate
|
|
184
194
|
}
|
|
185
195
|
}
|
|
186
|
-
`,
|
|
187
|
-
query GetAmcContracts {
|
|
188
|
-
housingvistaAmcContracts {
|
|
196
|
+
`, u = e`
|
|
197
|
+
query GetAmcContracts($pagination: HousingVistaPaginationInput) {
|
|
198
|
+
housingvistaAmcContracts(pagination: $pagination) {
|
|
189
199
|
id
|
|
190
200
|
propertyId
|
|
191
201
|
propertyTitle
|
|
@@ -199,9 +209,9 @@ var n = e`
|
|
|
199
209
|
servicesIncluded
|
|
200
210
|
}
|
|
201
211
|
}
|
|
202
|
-
`,
|
|
203
|
-
query GetMarketplaceServices {
|
|
204
|
-
housingvistaMarketplaceServices {
|
|
212
|
+
`, d = e`
|
|
213
|
+
query GetMarketplaceServices($pagination: HousingVistaPaginationInput) {
|
|
214
|
+
housingvistaMarketplaceServices(pagination: $pagination) {
|
|
205
215
|
id
|
|
206
216
|
name
|
|
207
217
|
providerName
|
|
@@ -217,9 +227,9 @@ var n = e`
|
|
|
217
227
|
featured
|
|
218
228
|
}
|
|
219
229
|
}
|
|
220
|
-
`,
|
|
221
|
-
query GetVerifications {
|
|
222
|
-
housingvistaVerificationItems {
|
|
230
|
+
`, f = e`
|
|
231
|
+
query GetVerifications($pagination: HousingVistaPaginationInput) {
|
|
232
|
+
housingvistaVerificationItems(pagination: $pagination) {
|
|
223
233
|
id
|
|
224
234
|
entityType
|
|
225
235
|
entityId
|
|
@@ -231,9 +241,9 @@ var n = e`
|
|
|
231
241
|
notes
|
|
232
242
|
}
|
|
233
243
|
}
|
|
234
|
-
`,
|
|
235
|
-
query GetLegalServices {
|
|
236
|
-
housingvistaLegalServices {
|
|
244
|
+
`, p = e`
|
|
245
|
+
query GetLegalServices($pagination: HousingVistaPaginationInput) {
|
|
246
|
+
housingvistaLegalServices(pagination: $pagination) {
|
|
237
247
|
id
|
|
238
248
|
title
|
|
239
249
|
category
|
|
@@ -247,9 +257,9 @@ var n = e`
|
|
|
247
257
|
documentsRequired
|
|
248
258
|
}
|
|
249
259
|
}
|
|
250
|
-
`,
|
|
251
|
-
query GetHomeLoans {
|
|
252
|
-
housingvistaHomeLoanOffers {
|
|
260
|
+
`, m = e`
|
|
261
|
+
query GetHomeLoans($pagination: HousingVistaPaginationInput) {
|
|
262
|
+
housingvistaHomeLoanOffers(pagination: $pagination) {
|
|
253
263
|
id
|
|
254
264
|
bankName
|
|
255
265
|
bankLogo
|
|
@@ -264,9 +274,9 @@ var n = e`
|
|
|
264
274
|
prepaymentCharges
|
|
265
275
|
}
|
|
266
276
|
}
|
|
267
|
-
`,
|
|
268
|
-
query GetMarketTrends {
|
|
269
|
-
housingvistaMarketTrends {
|
|
277
|
+
`, h = e`
|
|
278
|
+
query GetMarketTrends($pagination: HousingVistaPaginationInput) {
|
|
279
|
+
housingvistaMarketTrends(pagination: $pagination) {
|
|
270
280
|
month
|
|
271
281
|
avgPrice
|
|
272
282
|
avgRent
|
|
@@ -275,9 +285,9 @@ var n = e`
|
|
|
275
285
|
priceChangePercent
|
|
276
286
|
}
|
|
277
287
|
}
|
|
278
|
-
`,
|
|
279
|
-
query GetAreaInsights {
|
|
280
|
-
housingvistaAreaInsights {
|
|
288
|
+
`, g = e`
|
|
289
|
+
query GetAreaInsights($pagination: HousingVistaPaginationInput) {
|
|
290
|
+
housingvistaAreaInsights(pagination: $pagination) {
|
|
281
291
|
id
|
|
282
292
|
areaName
|
|
283
293
|
city
|
|
@@ -294,8 +304,8 @@ var n = e`
|
|
|
294
304
|
upcomingProjects
|
|
295
305
|
}
|
|
296
306
|
}
|
|
297
|
-
`,
|
|
298
|
-
let { data: e, loading:
|
|
307
|
+
`, _ = () => {
|
|
308
|
+
let { data: e, loading: n, error: r } = t(i);
|
|
299
309
|
return {
|
|
300
310
|
data: e?.housingvistaDashboardStats || {
|
|
301
311
|
totalProperties: 0,
|
|
@@ -311,13 +321,13 @@ var n = e`
|
|
|
311
321
|
unreadMessages: 0,
|
|
312
322
|
upcomingViewings: 0
|
|
313
323
|
},
|
|
314
|
-
loading:
|
|
315
|
-
error:
|
|
324
|
+
loading: n,
|
|
325
|
+
error: r
|
|
316
326
|
};
|
|
317
|
-
},
|
|
318
|
-
let { data:
|
|
327
|
+
}, v = (e) => {
|
|
328
|
+
let { data: n, loading: i, error: a } = t(o, { variables: r(e) });
|
|
319
329
|
return {
|
|
320
|
-
data: (
|
|
330
|
+
data: (n?.housingvistaTransactions || []).map((e) => ({
|
|
321
331
|
id: `act-${e.id}`,
|
|
322
332
|
type: "transaction_update",
|
|
323
333
|
title: `Transaction: ${e.type}`,
|
|
@@ -328,107 +338,107 @@ var n = e`
|
|
|
328
338
|
actorName: e.buyer ? `${e.buyer.firstName} ${e.buyer.lastName}` : e.tenant ? `${e.tenant.firstName} ${e.tenant.lastName}` : "System",
|
|
329
339
|
actorAvatar: e.buyer?.avatar || e.tenant?.avatar
|
|
330
340
|
})),
|
|
331
|
-
loading:
|
|
332
|
-
error:
|
|
341
|
+
loading: i,
|
|
342
|
+
error: a
|
|
333
343
|
};
|
|
334
|
-
},
|
|
335
|
-
let { data:
|
|
344
|
+
}, y = (e) => {
|
|
345
|
+
let { data: n, loading: i, error: o } = t(a, { variables: r(e) });
|
|
336
346
|
return {
|
|
337
|
-
data:
|
|
338
|
-
loading:
|
|
339
|
-
error:
|
|
347
|
+
data: n?.housingvistaProperties || [],
|
|
348
|
+
loading: i,
|
|
349
|
+
error: o
|
|
340
350
|
};
|
|
341
|
-
},
|
|
342
|
-
let { data:
|
|
351
|
+
}, b = (e) => {
|
|
352
|
+
let { data: n, loading: i, error: a } = t(o, { variables: r(e) });
|
|
343
353
|
return {
|
|
344
|
-
data:
|
|
345
|
-
loading:
|
|
346
|
-
error:
|
|
354
|
+
data: n?.housingvistaTransactions || [],
|
|
355
|
+
loading: i,
|
|
356
|
+
error: a
|
|
347
357
|
};
|
|
348
|
-
},
|
|
349
|
-
let { data:
|
|
358
|
+
}, x = (e) => {
|
|
359
|
+
let { data: n, loading: i, error: a } = t(s, { variables: r(e) });
|
|
350
360
|
return {
|
|
351
|
-
data:
|
|
352
|
-
loading:
|
|
353
|
-
error:
|
|
361
|
+
data: n?.housingvistaInvestments || [],
|
|
362
|
+
loading: i,
|
|
363
|
+
error: a
|
|
354
364
|
};
|
|
355
|
-
},
|
|
356
|
-
let { data:
|
|
365
|
+
}, S = (e) => {
|
|
366
|
+
let { data: n, loading: i, error: a } = t(c, { variables: r(e) });
|
|
357
367
|
return {
|
|
358
|
-
data:
|
|
359
|
-
loading:
|
|
360
|
-
error:
|
|
368
|
+
data: n?.housingvistaRentalUnits || [],
|
|
369
|
+
loading: i,
|
|
370
|
+
error: a
|
|
361
371
|
};
|
|
362
|
-
},
|
|
363
|
-
let { data:
|
|
372
|
+
}, C = (e) => {
|
|
373
|
+
let { data: n, loading: i, error: a } = t(l, { variables: r(e) });
|
|
364
374
|
return {
|
|
365
|
-
data:
|
|
366
|
-
loading:
|
|
367
|
-
error:
|
|
375
|
+
data: n?.housingvistaAssets || [],
|
|
376
|
+
loading: i,
|
|
377
|
+
error: a
|
|
368
378
|
};
|
|
369
|
-
},
|
|
370
|
-
let { data:
|
|
379
|
+
}, w = (e) => {
|
|
380
|
+
let { data: n, loading: i, error: a } = t(u, { variables: r(e) });
|
|
371
381
|
return {
|
|
372
|
-
data:
|
|
373
|
-
loading:
|
|
374
|
-
error:
|
|
382
|
+
data: n?.housingvistaAmcContracts || [],
|
|
383
|
+
loading: i,
|
|
384
|
+
error: a
|
|
375
385
|
};
|
|
376
|
-
},
|
|
377
|
-
let { data:
|
|
386
|
+
}, T = (e) => {
|
|
387
|
+
let { data: n, loading: i, error: a } = t(d, { variables: r(e) });
|
|
378
388
|
return {
|
|
379
|
-
data:
|
|
380
|
-
loading:
|
|
381
|
-
error:
|
|
389
|
+
data: n?.housingvistaMarketplaceServices || [],
|
|
390
|
+
loading: i,
|
|
391
|
+
error: a
|
|
382
392
|
};
|
|
383
|
-
},
|
|
393
|
+
}, E = () => ({
|
|
384
394
|
data: [],
|
|
385
395
|
loading: !1,
|
|
386
396
|
error: null
|
|
387
|
-
}),
|
|
397
|
+
}), D = () => ({
|
|
388
398
|
data: [],
|
|
389
399
|
loading: !1,
|
|
390
400
|
error: null
|
|
391
|
-
}),
|
|
392
|
-
let { data:
|
|
401
|
+
}), O = (e) => {
|
|
402
|
+
let { data: n, loading: i, error: a } = t(f, { variables: r(e) });
|
|
393
403
|
return {
|
|
394
|
-
data:
|
|
395
|
-
loading:
|
|
396
|
-
error:
|
|
404
|
+
data: n?.housingvistaVerificationItems || [],
|
|
405
|
+
loading: i,
|
|
406
|
+
error: a
|
|
397
407
|
};
|
|
398
|
-
},
|
|
399
|
-
let { data:
|
|
408
|
+
}, k = (e) => {
|
|
409
|
+
let { data: n, loading: i, error: a } = t(p, { variables: r(e) });
|
|
400
410
|
return {
|
|
401
|
-
data:
|
|
402
|
-
loading:
|
|
403
|
-
error:
|
|
411
|
+
data: n?.housingvistaLegalServices || [],
|
|
412
|
+
loading: i,
|
|
413
|
+
error: a
|
|
404
414
|
};
|
|
405
|
-
},
|
|
406
|
-
let { data:
|
|
415
|
+
}, A = (e) => {
|
|
416
|
+
let { data: n, loading: i, error: a } = t(m, { variables: r(e) });
|
|
407
417
|
return {
|
|
408
|
-
data:
|
|
409
|
-
loading:
|
|
410
|
-
error:
|
|
418
|
+
data: n?.housingvistaHomeLoanOffers || [],
|
|
419
|
+
loading: i,
|
|
420
|
+
error: a
|
|
411
421
|
};
|
|
412
|
-
},
|
|
413
|
-
let { data:
|
|
422
|
+
}, j = (e) => {
|
|
423
|
+
let { data: n, loading: i, error: a } = t(h, { variables: r(e) });
|
|
414
424
|
return {
|
|
415
|
-
data:
|
|
416
|
-
loading:
|
|
417
|
-
error:
|
|
425
|
+
data: n?.housingvistaMarketTrends || [],
|
|
426
|
+
loading: i,
|
|
427
|
+
error: a
|
|
418
428
|
};
|
|
419
|
-
},
|
|
420
|
-
let { data:
|
|
429
|
+
}, M = (e) => {
|
|
430
|
+
let { data: n, loading: i, error: a } = t(g, { variables: r(e) });
|
|
421
431
|
return {
|
|
422
|
-
data:
|
|
423
|
-
loading:
|
|
424
|
-
error:
|
|
432
|
+
data: n?.housingvistaAreaInsights || [],
|
|
433
|
+
loading: i,
|
|
434
|
+
error: a
|
|
425
435
|
};
|
|
426
|
-
},
|
|
436
|
+
}, N = () => ({
|
|
427
437
|
data: null,
|
|
428
438
|
loading: !1,
|
|
429
439
|
error: null
|
|
430
440
|
});
|
|
431
441
|
//#endregion
|
|
432
|
-
export {
|
|
442
|
+
export { w as useAMCContracts, N as useAnalyticsData, M as useAreaInsights, C as useAssets, E as useConversations, _ as useDashboardStats, A as useHomeLoans, x as useInvestments, k as useLegalServices, j as useMarketTrends, T as useMarketplaceServices, D as useNotifications, y as useProperties, v as useRecentActivities, S as useRentalUnits, b as useTransactions, O as useVerifications };
|
|
433
443
|
|
|
434
444
|
//# sourceMappingURL=index.js.map
|