@salesforce/ui-bundle-template-app-react-sample-b2e 11.19.0 → 11.21.0

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 (102) hide show
  1. package/dist/CHANGELOG.md +16 -0
  2. package/dist/force-app/main/default/uiBundles/propertymanagementapp/package.json +4 -4
  3. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/applicationSearchService.ts +25 -43
  4. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/maintenanceRequestSearchService.ts +31 -65
  5. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceWorkers/maintenanceWorkerSearchService.ts +21 -43
  6. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/properties/propertySearchService.ts +33 -53
  7. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/applications/ApplicationCard.tsx +80 -0
  8. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/dashboard/GlobalSearchBar.tsx +2 -2
  9. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/layout/VerticalNav.tsx +28 -18
  10. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/maintenanceRequests/MaintenanceRequestCard.tsx +79 -52
  11. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/maintenanceWorkers/WorkerCard.tsx +87 -0
  12. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/search/UnifiedSearch.tsx +213 -0
  13. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/api/distinctValuesService.ts +84 -0
  14. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/api/searchService.ts +71 -0
  15. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/MergedSearchResults.tsx +263 -0
  16. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/Search.tsx +185 -0
  17. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/SearchResults.tsx +77 -0
  18. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/SourceSection.tsx +166 -0
  19. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/controls/PaginationControls.tsx +185 -0
  20. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/controls/ScopeSelector.tsx +55 -0
  21. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/controls/SearchBar.tsx +55 -0
  22. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/controls/SortControl.tsx +62 -0
  23. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/filters/ActiveFilters.tsx +61 -0
  24. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/filters/DefaultFilterPanel.tsx +125 -0
  25. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/{object-search/components → search/components/filters}/FilterContext.tsx +7 -20
  26. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/filters/inputs/BooleanFilter.tsx +50 -0
  27. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/filters/inputs/DateRangeFilter.tsx +160 -0
  28. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/filters/inputs/FilterFieldWrapper.tsx +26 -0
  29. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/filters/inputs/MultiSelectFilter.tsx +88 -0
  30. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/filters/inputs/NumericRangeFilter.tsx +78 -0
  31. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/filters/inputs/SelectFilter.tsx +46 -0
  32. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/filters/inputs/TextFilter.tsx +52 -0
  33. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/components/results/DefaultResultRow.tsx +109 -0
  34. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/config.json +83 -0
  35. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/{object-search → search}/hooks/useAsyncData.ts +3 -10
  36. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/hooks/useDistinctValues.ts +59 -0
  37. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/hooks/useSearch.ts +703 -0
  38. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/index.ts +90 -0
  39. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/loadConfig.ts +14 -0
  40. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/queryBuilder.ts +156 -0
  41. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/types.ts +307 -0
  42. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/utils/debounce.ts +17 -0
  43. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/utils/fieldUtils.ts +14 -0
  44. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/utils/filterUtils.ts +285 -0
  45. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/search/utils/sortUtils.ts +34 -0
  46. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/lib/constants.ts +16 -29
  47. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/lib/routeConfig.ts +1 -0
  48. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/lib/searchConfig.ts +190 -0
  49. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/ApplicationSearch.tsx +8 -385
  50. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/Home.tsx +4 -2
  51. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/MaintenanceRequestSearch.tsx +8 -458
  52. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/MaintenanceWorkerSearch.tsx +8 -341
  53. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/PropertySearch.tsx +7 -243
  54. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/pages/Search.tsx +16 -0
  55. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/routes.tsx +6 -0
  56. package/dist/force-app/main/default/uiBundles/propertymanagementapp/tsconfig.tsbuildinfo +1 -1
  57. package/dist/package-lock.json +2 -2
  58. package/dist/package.json +1 -1
  59. package/package.json +2 -2
  60. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/query/distinctApplicationStatus.graphql +0 -19
  61. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/applications/query/searchApplications.graphql +0 -65
  62. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/distinctMaintenanceRequestPriority.graphql +0 -19
  63. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/distinctMaintenanceRequestStatus.graphql +0 -19
  64. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/distinctMaintenanceRequestType.graphql +0 -19
  65. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceRequests/query/searchMaintenanceRequests.graphql +0 -82
  66. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceWorkers/query/distinctMaintenanceWorkerEmploymentType.graphql +0 -19
  67. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/maintenanceWorkers/query/searchMaintenanceWorkers.graphql +0 -64
  68. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/properties/query/distinctPropertyStatus.graphql +0 -19
  69. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/properties/query/distinctPropertyType.graphql +0 -19
  70. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/api/properties/query/searchProperties.graphql +0 -105
  71. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/shared/ObjectSearchErrorState.tsx +0 -45
  72. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/components/shared/UserAvatar.tsx +0 -35
  73. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/api/accountSearchService.ts +0 -46
  74. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/api/query/distinctAccountIndustries.graphql +0 -19
  75. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/api/query/distinctAccountTypes.graphql +0 -19
  76. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/api/query/getAccountDetail.graphql +0 -121
  77. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/api/query/searchAccounts.graphql +0 -51
  78. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/pages/AccountObjectDetailPage.tsx +0 -355
  79. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/pages/AccountSearch.tsx +0 -304
  80. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/__examples__/pages/Home.tsx +0 -34
  81. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/api/objectSearchService.ts +0 -82
  82. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/ActiveFilters.tsx +0 -89
  83. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/ObjectBreadcrumb.tsx +0 -66
  84. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/PaginationControls.tsx +0 -109
  85. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/SearchBar.tsx +0 -41
  86. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/SortControl.tsx +0 -143
  87. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/BooleanFilter.tsx +0 -78
  88. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/DateFilter.tsx +0 -128
  89. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/DateRangeFilter.tsx +0 -70
  90. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/FilterFieldWrapper.tsx +0 -43
  91. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/MultiSelectFilter.tsx +0 -105
  92. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/NumericRangeFilter.tsx +0 -171
  93. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/SearchFilter.tsx +0 -52
  94. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/SelectFilter.tsx +0 -97
  95. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/components/filters/TextFilter.tsx +0 -93
  96. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/hooks/useDebouncedCallback.ts +0 -34
  97. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/hooks/useObjectSearchParams.ts +0 -254
  98. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/utils/debounce.ts +0 -25
  99. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/utils/fieldUtils.ts +0 -29
  100. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/utils/filterUtils.ts +0 -404
  101. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/features/object-search/utils/sortUtils.ts +0 -38
  102. package/dist/force-app/main/default/uiBundles/propertymanagementapp/src/lib/filterUtils.ts +0 -11
@@ -1,346 +1,13 @@
1
- import { useMemo, useState } from "react";
2
- import { useNavigate } from "react-router";
3
- import {
4
- searchMaintenanceWorkers,
5
- fetchDistinctMaintenanceWorkerType,
6
- type MaintenanceWorkerSearchNode,
7
- } from "../api/maintenanceWorkers/maintenanceWorkerSearchService";
8
- import { useAsyncData } from "../hooks/useAsyncData";
9
- import {
10
- useObjectSearchParams,
11
- type UseObjectSearchParamsReturn,
12
- } from "../features/object-search/hooks/useObjectSearchParams";
13
- import type { FilterFieldConfig } from "../features/object-search/utils/filterUtils";
14
- import type { SortFieldConfig } from "../features/object-search/utils/sortUtils";
15
- import { PageHeader } from "../components/layout/PageHeader";
16
- import { PageContainer } from "../components/layout/PageContainer";
17
- import {
18
- FilterProvider,
19
- FilterResetButton,
20
- } from "../features/object-search/components/FilterContext";
21
- import { FilterRow } from "../components/layout/FilterRow";
22
- import { SearchFilter } from "../features/object-search/components/filters/SearchFilter";
23
- import { MultiSelectFilter } from "../features/object-search/components/filters/MultiSelectFilter";
24
- import { TextFilter } from "../features/object-search/components/filters/TextFilter";
25
- import { NumericRangeFilter } from "../features/object-search/components/filters/NumericRangeFilter";
26
- import { DateFilter } from "../features/object-search/components/filters/DateFilter";
27
- import { ObjectSearchErrorState } from "../components/shared/ObjectSearchErrorState";
28
- import PaginationControls from "../features/object-search/components/PaginationControls";
29
- import { WorkerDetailsModal } from "../components/maintenanceWorkers/WorkerDetailsModal";
30
- import { Skeleton } from "../components/ui/skeleton";
31
- import {
32
- Table,
33
- TableHeader,
34
- TableBody,
35
- TableRow,
36
- TableHead,
37
- TableCell,
38
- } from "../components/ui/table";
39
- import type {
40
- Maintenance_Worker__C_Filter,
41
- Maintenance_Worker__C_OrderBy,
42
- } from "../api/graphql-operations-types";
43
- import { PAGINATION_CONFIG } from "../lib/constants";
44
-
45
- const FILTER_CONFIGS: FilterFieldConfig[] = [
46
- {
47
- field: "search",
48
- label: "Search",
49
- type: "search",
50
- searchFields: ["Name", "Phone__c"],
51
- placeholder: "By name, or phone...",
52
- },
53
- { field: "Employment_Type__c", label: "Employment Type", type: "picklist" },
54
- { field: "Location__c", label: "Location", type: "text", placeholder: "Location" },
55
- { field: "Hourly_Rate__c", label: "Hourly Rate", type: "numeric" },
56
- { field: "CreatedDate", label: "Created Date", type: "datetime" },
57
- ];
58
-
59
- const SORT_CONFIGS: SortFieldConfig<string>[] = [
60
- { field: "Name", label: "Name" },
61
- { field: "Employment_Type__c", label: "Employment Type" },
62
- { field: "Hourly_Rate__c", label: "Hourly Rate" },
63
- { field: "Rating__c", label: "Rating" },
64
- { field: "CreatedDate", label: "Created Date" },
65
- ];
1
+ import { UnifiedSearch } from "../components/search/UnifiedSearch";
2
+ import { SOURCE_KEYS } from "../lib/searchConfig";
66
3
 
67
4
  export default function MaintenanceWorkerSearch() {
68
- const [selectedWorker, setSelectedWorker] = useState<MaintenanceWorkerSearchNode | null>(null);
69
-
70
- const { data: typeOptions } = useAsyncData(fetchDistinctMaintenanceWorkerType, []);
71
-
72
- const { filters, query, pagination, resetAll } = useObjectSearchParams<
73
- Maintenance_Worker__C_Filter,
74
- Maintenance_Worker__C_OrderBy
75
- >(FILTER_CONFIGS, SORT_CONFIGS, PAGINATION_CONFIG);
76
-
77
- const { data, loading, error } = useAsyncData(
78
- () =>
79
- searchMaintenanceWorkers({
80
- where: query.where,
81
- orderBy: query.orderBy,
82
- first: pagination.pageSize,
83
- after: pagination.afterCursor,
84
- }),
85
- [query.where, query.orderBy, pagination.pageSize, pagination.afterCursor],
86
- );
87
-
88
- const validMaintenanceWorkerNodes = useMemo(
89
- () =>
90
- (data?.edges ?? []).reduce<MaintenanceWorkerSearchNode[]>((acc, edge) => {
91
- if (edge?.node) acc.push(edge.node);
92
- return acc;
93
- }, []),
94
- [data?.edges],
95
- );
96
-
97
- const pageInfo = data?.pageInfo;
98
- const hasNextPage = pageInfo?.hasNextPage ?? false;
99
- const hasPreviousPage = pagination.pageIndex > 0;
100
-
101
- return (
102
- <>
103
- <PageContainer>
104
- <PageHeader title="Maintenance Workers" description="View and filter maintenance workers" />
105
- <MaintenanceWorkerSearchFilters
106
- filters={filters}
107
- typeOptions={typeOptions ?? []}
108
- resetAll={resetAll}
109
- />
110
-
111
- <div className="bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden">
112
- <Table aria-label="Maintenance workers">
113
- <MaintenanceWorkerSearchTableHeader />
114
- <TableBody>
115
- {loading && <MaintenanceWorkerSearchSkeleton pageSize={pagination.pageSize} />}
116
-
117
- {!loading && error && <MaintenanceWorkerSearchErrorState />}
118
-
119
- {!loading && !error && validMaintenanceWorkerNodes.length === 0 && (
120
- <MaintenanceWorkerSearchNoResults />
121
- )}
122
-
123
- {!loading && !error && validMaintenanceWorkerNodes.length > 0 && (
124
- <MaintenanceWorkerSearchTable
125
- workerNodes={validMaintenanceWorkerNodes}
126
- setSelectedWorker={setSelectedWorker}
127
- />
128
- )}
129
- </TableBody>
130
- </Table>
131
- </div>
132
-
133
- <PaginationControls
134
- pageIndex={pagination.pageIndex}
135
- hasNextPage={hasNextPage}
136
- hasPreviousPage={hasPreviousPage}
137
- pageSize={pagination.pageSize}
138
- pageSizeOptions={PAGINATION_CONFIG.validPageSizes}
139
- onNextPage={() => {
140
- if (pageInfo?.endCursor) pagination.goToNextPage(pageInfo.endCursor);
141
- }}
142
- onPreviousPage={pagination.goToPreviousPage}
143
- onPageSizeChange={pagination.setPageSize}
144
- disabled={loading || !!error}
145
- />
146
- </PageContainer>
147
-
148
- {!loading && !error && selectedWorker && (
149
- <WorkerDetailsModal
150
- worker={selectedWorker}
151
- isOpen={!!selectedWorker}
152
- onClose={() => setSelectedWorker(null)}
153
- />
154
- )}
155
- </>
156
- );
157
- }
158
-
159
- function MaintenanceWorkerSearchFilters({
160
- filters,
161
- typeOptions,
162
- resetAll,
163
- }: {
164
- filters: UseObjectSearchParamsReturn<
165
- Maintenance_Worker__C_Filter,
166
- Maintenance_Worker__C_OrderBy
167
- >["filters"];
168
- typeOptions: Array<{ value: string; label: string }>;
169
- resetAll: () => void;
170
- }) {
171
- return (
172
- <FilterProvider
173
- filters={filters.active}
174
- onFilterChange={filters.set}
175
- onFilterRemove={filters.remove}
176
- onReset={resetAll}
177
- >
178
- <FilterRow ariaLabel="Maintenance Workers filters">
179
- <SearchFilter
180
- field="search"
181
- label="Search"
182
- placeholder="By name, or phone..."
183
- className="w-full sm:w-50"
184
- />
185
- <MultiSelectFilter
186
- field="Employment_Type__c"
187
- label="Employment Type"
188
- options={typeOptions}
189
- className="w-full sm:w-36"
190
- />
191
- <TextFilter
192
- field="Location__c"
193
- label="Location"
194
- placeholder="Location"
195
- className="w-full sm:w-50"
196
- />
197
- <NumericRangeFilter
198
- field="Hourly_Rate__c"
199
- label="Hourly Rate"
200
- min={0}
201
- max={1000}
202
- className="w-full sm:w-50"
203
- />
204
- <DateFilter
205
- field="CreatedDate"
206
- label="Created Date"
207
- filterType="datetime"
208
- className="w-full sm:w-56"
209
- />
210
- <FilterResetButton />
211
- </FilterRow>
212
- </FilterProvider>
213
- );
214
- }
215
-
216
- function MaintenanceWorkerSearchTableHeader() {
217
- return (
218
- <TableHeader>
219
- <TableRow>
220
- <TableHead className="w-3/12 px-6 py-4 bg-gray-50 text-sm font-semibold text-purple-700 uppercase tracking-wide">
221
- Name
222
- </TableHead>
223
- <TableHead className="w-2/12 px-6 py-4 bg-gray-50 text-sm font-semibold text-purple-700 uppercase tracking-wide">
224
- Phone
225
- </TableHead>
226
- <TableHead className="w-2/12 px-6 py-4 bg-gray-50 text-sm font-semibold text-purple-700 uppercase tracking-wide">
227
- Location
228
- </TableHead>
229
- <TableHead className="w-2/12 px-6 py-4 bg-gray-50 text-sm font-semibold text-purple-700 uppercase tracking-wide">
230
- Organization
231
- </TableHead>
232
- <TableHead className="w-2/12 px-6 py-4 bg-gray-50 text-sm font-semibold text-purple-700 uppercase tracking-wide">
233
- Active Requests
234
- </TableHead>
235
- <TableHead className="w-1/12 px-6 py-4 bg-gray-50 text-sm font-semibold text-purple-700 uppercase tracking-wide">
236
- Status
237
- </TableHead>
238
- </TableRow>
239
- </TableHeader>
240
- );
241
- }
242
-
243
- function MaintenanceWorkerSearchNoResults() {
244
- return (
245
- <TableRow>
246
- <TableCell colSpan={6} className="text-center py-12 text-gray-500">
247
- No maintenance workers found
248
- </TableCell>
249
- </TableRow>
250
- );
251
- }
252
-
253
- function MaintenanceWorkerSearchTable({
254
- workerNodes,
255
- setSelectedWorker,
256
- }: {
257
- workerNodes: MaintenanceWorkerSearchNode[];
258
- setSelectedWorker: (worker: MaintenanceWorkerSearchNode) => void;
259
- }) {
260
- return (
261
- <>
262
- {workerNodes.map((worker) => {
263
- const name = worker.Name?.value ?? "";
264
- const isActive = worker.IsActive__c?.value;
265
- return (
266
- <TableRow
267
- key={worker.Id}
268
- role="button"
269
- tabIndex={0}
270
- aria-label={name}
271
- onClick={() => setSelectedWorker(worker)}
272
- onKeyDown={(e) => {
273
- if (e.key === "Enter" || e.key === " ") {
274
- e.preventDefault();
275
- setSelectedWorker(worker);
276
- }
277
- }}
278
- className="hover:bg-gray-50 transition-colors cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-purple focus-visible:ring-inset"
279
- >
280
- <TableCell className="px-6 py-4 font-medium text-gray-900">{name}</TableCell>
281
- <TableCell className="px-6 py-4 text-gray-600">
282
- {worker.Phone__c?.value ?? "\u2014"}
283
- </TableCell>
284
- <TableCell className="px-6 py-4 text-gray-600">
285
- {worker.Location__c?.value ?? "\u2014"}
286
- </TableCell>
287
- <TableCell className="px-6 py-4 text-gray-600">
288
- {worker.Employment_Type__c?.value ?? worker.Type__c?.value ?? "\u2014"}
289
- </TableCell>
290
- <TableCell className="px-6 py-4 text-gray-600">
291
- {worker.Maintenance_Requests__r?.totalCount ?? 0}
292
- </TableCell>
293
- <TableCell className="px-6 py-4 text-gray-600">
294
- {typeof isActive === "boolean" ? (isActive ? "Active" : "Inactive") : "\u2014"}
295
- </TableCell>
296
- </TableRow>
297
- );
298
- })}
299
- </>
300
- );
301
- }
302
-
303
- function MaintenanceWorkerSearchSkeleton({ pageSize }: { pageSize: number }) {
304
- return (
305
- <>
306
- {Array.from({ length: pageSize }, (_, i) => (
307
- <TableRow key={i}>
308
- <TableCell className="w-3/12 px-6 py-4">
309
- <Skeleton className="h-5 w-3/4" />
310
- </TableCell>
311
- <TableCell className="w-2/12 px-6 py-4">
312
- <Skeleton className="h-5 w-2/3" />
313
- </TableCell>
314
- <TableCell className="w-2/12 px-6 py-4">
315
- <Skeleton className="h-5 w-2/3" />
316
- </TableCell>
317
- <TableCell className="w-2/12 px-6 py-4">
318
- <Skeleton className="h-5 w-2/3" />
319
- </TableCell>
320
- <TableCell className="w-2/12 px-6 py-4">
321
- <Skeleton className="h-5 w-1/4" />
322
- </TableCell>
323
- <TableCell className="w-1/12 px-6 py-4">
324
- <Skeleton className="h-5 w-1/2" />
325
- </TableCell>
326
- </TableRow>
327
- ))}
328
- </>
329
- );
330
- }
331
-
332
- function MaintenanceWorkerSearchErrorState() {
333
- const navigate = useNavigate();
334
-
335
5
  return (
336
- <TableRow>
337
- <TableCell colSpan={6} className="p-0">
338
- <ObjectSearchErrorState
339
- message="There was an error loading the maintenance workers. Please try again."
340
- onGoHome={() => navigate("/")}
341
- onRetry={() => navigate(0)}
342
- />
343
- </TableCell>
344
- </TableRow>
6
+ <UnifiedSearch
7
+ title="Maintenance Workers"
8
+ subtitle="Find maintenance workers and contractors"
9
+ searchPlaceholder="Search by name or phone..."
10
+ restrictTo={SOURCE_KEYS.WORKERS}
11
+ />
345
12
  );
346
13
  }
@@ -1,249 +1,13 @@
1
- import { useMemo, useState } from "react";
2
- import { useNavigate } from "react-router";
3
- import {
4
- searchProperties,
5
- fetchDistinctPropertyStatus,
6
- fetchDistinctPropertyType,
7
- type PropertySearchNode,
8
- } from "../api/properties/propertySearchService";
9
- import { useAsyncData } from "../hooks/useAsyncData";
10
- import {
11
- useObjectSearchParams,
12
- type UseObjectSearchParamsReturn,
13
- } from "../features/object-search/hooks/useObjectSearchParams";
14
- import type { FilterFieldConfig } from "../features/object-search/utils/filterUtils";
15
- import type { SortFieldConfig } from "../features/object-search/utils/sortUtils";
16
- import type { Property__C_Filter, Property__C_OrderBy } from "../api/graphql-operations-types";
17
- import { PageHeader } from "../components/layout/PageHeader";
18
- import { PageContainer } from "../components/layout/PageContainer";
19
- import {
20
- FilterProvider,
21
- FilterResetButton,
22
- } from "../features/object-search/components/FilterContext";
23
- import { FilterRow } from "../components/layout/FilterRow";
24
- import { SearchFilter } from "../features/object-search/components/filters/SearchFilter";
25
- import { MultiSelectFilter } from "../features/object-search/components/filters/MultiSelectFilter";
26
- import { NumericRangeFilter } from "../features/object-search/components/filters/NumericRangeFilter";
27
- import { ObjectSearchErrorState } from "../components/shared/ObjectSearchErrorState";
28
- import PaginationControls from "../features/object-search/components/PaginationControls";
29
- import { PropertyCard } from "../components/properties/PropertyCard";
30
- import { PropertyDetailsModal } from "../components/properties/PropertyDetailsModal";
31
- import { Skeleton } from "../components/ui/skeleton";
32
- import { PAGINATION_CONFIG } from "../lib/constants";
33
-
34
- const FILTER_CONFIGS: FilterFieldConfig[] = [
35
- {
36
- field: "search",
37
- label: "Search",
38
- type: "search",
39
- searchFields: ["Name", "Address__c"],
40
- placeholder: "Search by name or address...",
41
- },
42
- { field: "Status__c", label: "Status", type: "picklist" },
43
- { field: "Type__c", label: "Type", type: "picklist" },
44
- { field: "Monthly_Rent__c", label: "Monthly Rent", type: "numeric" },
45
- { field: "Bedrooms__c", label: "Bedrooms", type: "numeric" },
46
- ];
47
-
48
- const PROPERTY_SORT_CONFIGS: SortFieldConfig<string>[] = [
49
- { field: "Name", label: "Name" },
50
- { field: "Monthly_Rent__c", label: "Monthly Rent" },
51
- { field: "Status__c", label: "Status" },
52
- { field: "CreatedDate", label: "Created Date" },
53
- ];
1
+ import { UnifiedSearch } from "../components/search/UnifiedSearch";
2
+ import { SOURCE_KEYS } from "../lib/searchConfig";
54
3
 
55
4
  export default function PropertySearch() {
56
- const [selectedProperty, setSelectedProperty] = useState<PropertySearchNode | null>(null);
57
-
58
- const { data: statusOptions } = useAsyncData(fetchDistinctPropertyStatus, []);
59
- const { data: typeOptions } = useAsyncData(fetchDistinctPropertyType, []);
60
-
61
- const { filters, query, pagination, resetAll } = useObjectSearchParams<
62
- Property__C_Filter,
63
- Property__C_OrderBy
64
- >(FILTER_CONFIGS, PROPERTY_SORT_CONFIGS, PAGINATION_CONFIG);
65
-
66
- const { data, loading, error } = useAsyncData(
67
- () =>
68
- searchProperties({
69
- where: query.where,
70
- orderBy: query.orderBy,
71
- first: pagination.pageSize,
72
- after: pagination.afterCursor,
73
- }),
74
- [query.where, query.orderBy, pagination.pageSize, pagination.afterCursor],
75
- );
76
-
77
- const validPropertyNodes = useMemo(
78
- () =>
79
- (data?.edges ?? []).reduce<PropertySearchNode[]>((acc, edge) => {
80
- if (edge?.node) acc.push(edge.node);
81
- return acc;
82
- }, []),
83
- [data?.edges],
84
- );
85
-
86
- const pageInfo = data?.pageInfo;
87
- const hasNextPage = pageInfo?.hasNextPage ?? false;
88
- const hasPreviousPage = pagination.pageIndex > 0;
89
-
90
- return (
91
- <>
92
- <PageContainer>
93
- <PageHeader title="Properties" description="Browse and manage available properties" />
94
- <PropertySearchFilters
95
- filters={filters}
96
- statusOptions={statusOptions ?? []}
97
- typeOptions={typeOptions ?? []}
98
- resetAll={resetAll}
99
- />
100
-
101
- {loading && <PropertySearchSkeleton pageSize={pagination.pageSize} />}
102
-
103
- {!loading && error && <PropertySearchErrorState />}
104
-
105
- {!loading && !error && validPropertyNodes.length === 0 && <PropertySearchNoResults />}
106
-
107
- {!loading && !error && validPropertyNodes.length > 0 && (
108
- <PropertySearchGrid
109
- propertyNodes={validPropertyNodes}
110
- setSelectedProperty={setSelectedProperty}
111
- />
112
- )}
113
-
114
- <PaginationControls
115
- pageIndex={pagination.pageIndex}
116
- hasNextPage={hasNextPage}
117
- hasPreviousPage={hasPreviousPage}
118
- pageSize={pagination.pageSize}
119
- pageSizeOptions={PAGINATION_CONFIG.validPageSizes}
120
- onNextPage={() => {
121
- if (pageInfo?.endCursor) pagination.goToNextPage(pageInfo.endCursor);
122
- }}
123
- onPreviousPage={pagination.goToPreviousPage}
124
- onPageSizeChange={pagination.setPageSize}
125
- disabled={loading || !!error}
126
- />
127
- </PageContainer>
128
-
129
- {!loading && !error && selectedProperty && (
130
- <PropertyDetailsModal
131
- property={selectedProperty}
132
- isOpen={!!selectedProperty}
133
- onClose={() => setSelectedProperty(null)}
134
- />
135
- )}
136
- </>
137
- );
138
- }
139
-
140
- function PropertySearchFilters({
141
- filters,
142
- statusOptions,
143
- typeOptions,
144
- resetAll,
145
- }: {
146
- filters: UseObjectSearchParamsReturn<Property__C_Filter, Property__C_OrderBy>["filters"];
147
- statusOptions: Array<{ value: string; label: string }>;
148
- typeOptions: Array<{ value: string; label: string }>;
149
- resetAll: () => void;
150
- }) {
151
- return (
152
- <FilterProvider
153
- filters={filters.active}
154
- onFilterChange={filters.set}
155
- onFilterRemove={filters.remove}
156
- onReset={resetAll}
157
- >
158
- <FilterRow ariaLabel="Properties filters">
159
- <SearchFilter
160
- field="search"
161
- label="Search"
162
- placeholder="Search by name or address..."
163
- className="w-full sm:w-80"
164
- />
165
- <MultiSelectFilter
166
- field="Status__c"
167
- label="Status"
168
- options={statusOptions}
169
- className="w-full sm:w-36"
170
- />
171
- <MultiSelectFilter
172
- field="Type__c"
173
- label="Type"
174
- options={typeOptions}
175
- className="w-full sm:w-36"
176
- />
177
- <NumericRangeFilter
178
- field="Monthly_Rent__c"
179
- label="Monthly Rent"
180
- min={0}
181
- max={100_000}
182
- className="w-full sm:w-50"
183
- />
184
- <NumericRangeFilter
185
- field="Bedrooms__c"
186
- label="Bedrooms"
187
- min={0}
188
- max={20}
189
- className="w-full sm:w-50"
190
- />
191
- <FilterResetButton />
192
- </FilterRow>
193
- </FilterProvider>
194
- );
195
- }
196
-
197
- function PropertySearchNoResults() {
198
- return (
199
- <div className="text-center py-12">
200
- <p className="text-gray-500 text-lg">No properties found</p>
201
- </div>
202
- );
203
- }
204
-
205
- function PropertySearchGrid({
206
- propertyNodes,
207
- setSelectedProperty,
208
- }: {
209
- propertyNodes: PropertySearchNode[];
210
- setSelectedProperty: (property: PropertySearchNode) => void;
211
- }) {
212
- return (
213
- <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
214
- {propertyNodes.map((property) => (
215
- <PropertyCard key={property.Id} property={property} onClick={setSelectedProperty} />
216
- ))}
217
- </div>
218
- );
219
- }
220
-
221
- function PropertySearchSkeleton({ pageSize }: { pageSize: number }) {
222
- return (
223
- <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
224
- {Array.from({ length: pageSize }, (_, i) => (
225
- <div key={i} className="bg-white rounded-lg shadow-md overflow-hidden">
226
- <Skeleton className="h-48 w-full rounded-none" />
227
- <div className="p-6 space-y-2">
228
- <Skeleton className="h-6 w-48" />
229
- <Skeleton className="h-4 w-full" />
230
- <Skeleton className="h-4 w-40" />
231
- <Skeleton className="h-4 w-24" />
232
- </div>
233
- </div>
234
- ))}
235
- </div>
236
- );
237
- }
238
-
239
- function PropertySearchErrorState() {
240
- const navigate = useNavigate();
241
-
242
5
  return (
243
- <ObjectSearchErrorState
244
- message="There was an error loading the properties. Please try again."
245
- onGoHome={() => navigate("/")}
246
- onRetry={() => navigate(0)}
6
+ <UnifiedSearch
7
+ title="Properties"
8
+ subtitle="Browse and search rental properties"
9
+ searchPlaceholder="Search by name or address..."
10
+ restrictTo={SOURCE_KEYS.PROPERTIES}
247
11
  />
248
12
  );
249
13
  }
@@ -0,0 +1,16 @@
1
+ import { UnifiedSearch } from "../components/search/UnifiedSearch";
2
+
3
+ /**
4
+ * Unified search across every searchable object (properties, maintenance
5
+ * requests, workers, applications). A scope selector lets the user narrow to a
6
+ * single object; one global pagination control advances every in-scope source.
7
+ */
8
+ export default function Search() {
9
+ return (
10
+ <UnifiedSearch
11
+ title="Search"
12
+ subtitle="Search across properties, maintenance requests, workers, and applications."
13
+ searchPlaceholder="Search everything…"
14
+ />
15
+ );
16
+ }
@@ -3,6 +3,7 @@ import AppLayout from './appLayout';
3
3
  import Home from './pages/Home';
4
4
  import NotFound from './pages/NotFound';
5
5
  import { Navigate } from "react-router";
6
+ import Search from "./pages/Search";
6
7
  import PropertySearch from "./pages/PropertySearch";
7
8
  import MaintenanceRequestSearch from "./pages/MaintenanceRequestSearch";
8
9
  import MaintenanceWorkerSearch from "./pages/MaintenanceWorkerSearch";
@@ -23,6 +24,11 @@ export const routes: RouteObject[] = [
23
24
  path: '*',
24
25
  element: <NotFound />
25
26
  },
27
+ {
28
+ path: "search",
29
+ element: <Search />,
30
+ handle: { showInNavigation: true, label: "Search" }
31
+ },
26
32
  {
27
33
  path: "maintenance",
28
34
  children: [
@@ -1 +1 @@
1
- {"root":["./src/app.tsx","./src/appLayout.tsx","./src/index.ts","./src/navigationMenu.tsx","./src/router-utils.tsx","./src/routes.tsx","./src/api/graphql-operations-types.ts","./src/api/graphqlClient.ts","./src/api/applications/applicationSearchService.ts","./src/api/applications/applications.ts","./src/api/dashboard/dashboard.ts","./src/api/maintenanceRequests/maintenanceRequestSearchService.ts","./src/api/maintenanceRequests/maintenanceRequests.ts","./src/api/maintenanceWorkers/maintenanceWorkerSearchService.ts","./src/api/properties/properties.ts","./src/api/properties/propertySearchService.ts","./src/components/AgentforceConversationClient.tsx","./src/components/alerts/status-alert.tsx","./src/components/applications/ApplicationDetailsModal.tsx","./src/components/dashboard/GlobalSearchBar.tsx","./src/components/dashboard/IssuesDonutChart.tsx","./src/components/dashboard/MaintenanceTable.tsx","./src/components/dashboard/StatCard.tsx","./src/components/layout/FilterRow.tsx","./src/components/layout/PageContainer.tsx","./src/components/layout/PageHeader.tsx","./src/components/layout/TopBar.tsx","./src/components/layout/VerticalNav.tsx","./src/components/layouts/card-layout.tsx","./src/components/maintenanceRequests/MaintenanceDetailsModal.tsx","./src/components/maintenanceRequests/MaintenanceRequestCard.tsx","./src/components/maintenanceWorkers/WorkerDetailsModal.tsx","./src/components/properties/PropertyCard.tsx","./src/components/properties/PropertyDetailsModal.tsx","./src/components/shared/ObjectSearchErrorState.tsx","./src/components/shared/UserAvatar.tsx","./src/components/ui/alert.tsx","./src/components/ui/avatar.tsx","./src/components/ui/badge.tsx","./src/components/ui/breadcrumb.tsx","./src/components/ui/button.tsx","./src/components/ui/calendar.tsx","./src/components/ui/card.tsx","./src/components/ui/checkbox.tsx","./src/components/ui/collapsible.tsx","./src/components/ui/datePicker.tsx","./src/components/ui/dialog.tsx","./src/components/ui/dropdown-menu.tsx","./src/components/ui/field.tsx","./src/components/ui/index.ts","./src/components/ui/input.tsx","./src/components/ui/label.tsx","./src/components/ui/pagination.tsx","./src/components/ui/popover.tsx","./src/components/ui/select.tsx","./src/components/ui/separator.tsx","./src/components/ui/skeleton.tsx","./src/components/ui/sonner.tsx","./src/components/ui/spinner.tsx","./src/components/ui/table.tsx","./src/components/ui/tabs.tsx","./src/features/object-search/__examples__/api/accountSearchService.ts","./src/features/object-search/__examples__/pages/AccountObjectDetailPage.tsx","./src/features/object-search/__examples__/pages/AccountSearch.tsx","./src/features/object-search/__examples__/pages/Home.tsx","./src/features/object-search/api/objectSearchService.ts","./src/features/object-search/components/ActiveFilters.tsx","./src/features/object-search/components/FilterContext.tsx","./src/features/object-search/components/ObjectBreadcrumb.tsx","./src/features/object-search/components/PaginationControls.tsx","./src/features/object-search/components/SearchBar.tsx","./src/features/object-search/components/SortControl.tsx","./src/features/object-search/components/filters/BooleanFilter.tsx","./src/features/object-search/components/filters/DateFilter.tsx","./src/features/object-search/components/filters/DateRangeFilter.tsx","./src/features/object-search/components/filters/FilterFieldWrapper.tsx","./src/features/object-search/components/filters/MultiSelectFilter.tsx","./src/features/object-search/components/filters/NumericRangeFilter.tsx","./src/features/object-search/components/filters/SearchFilter.tsx","./src/features/object-search/components/filters/SelectFilter.tsx","./src/features/object-search/components/filters/TextFilter.tsx","./src/features/object-search/hooks/useAsyncData.ts","./src/features/object-search/hooks/useDebouncedCallback.ts","./src/features/object-search/hooks/useObjectSearchParams.ts","./src/features/object-search/utils/debounce.ts","./src/features/object-search/utils/fieldUtils.ts","./src/features/object-search/utils/filterUtils.ts","./src/features/object-search/utils/sortUtils.ts","./src/hooks/useAsyncData.ts","./src/lib/constants.ts","./src/lib/filterUtils.ts","./src/lib/routeConfig.ts","./src/lib/utils.ts","./src/pages/ApplicationSearch.tsx","./src/pages/Home.tsx","./src/pages/MaintenanceRequestSearch.tsx","./src/pages/MaintenanceWorkerSearch.tsx","./src/pages/NotFound.tsx","./src/pages/PropertySearch.tsx","./src/types/conversation.ts","./src/types/globals.d.ts","./e2e/app.spec.ts","./vite-env.d.ts","./vitest-env.d.ts","./vitest.setup.ts","../../../../../../../../../sdk/platform-sdk/types/env.d.ts"],"version":"5.9.3"}
1
+ {"root":["./src/app.tsx","./src/appLayout.tsx","./src/index.ts","./src/navigationMenu.tsx","./src/router-utils.tsx","./src/routes.tsx","./src/api/graphql-operations-types.ts","./src/api/graphqlClient.ts","./src/api/applications/applicationSearchService.ts","./src/api/applications/applications.ts","./src/api/dashboard/dashboard.ts","./src/api/maintenanceRequests/maintenanceRequestSearchService.ts","./src/api/maintenanceRequests/maintenanceRequests.ts","./src/api/maintenanceWorkers/maintenanceWorkerSearchService.ts","./src/api/properties/properties.ts","./src/api/properties/propertySearchService.ts","./src/components/AgentforceConversationClient.tsx","./src/components/alerts/status-alert.tsx","./src/components/applications/ApplicationCard.tsx","./src/components/applications/ApplicationDetailsModal.tsx","./src/components/dashboard/GlobalSearchBar.tsx","./src/components/dashboard/IssuesDonutChart.tsx","./src/components/dashboard/MaintenanceTable.tsx","./src/components/dashboard/StatCard.tsx","./src/components/layout/FilterRow.tsx","./src/components/layout/PageContainer.tsx","./src/components/layout/PageHeader.tsx","./src/components/layout/TopBar.tsx","./src/components/layout/VerticalNav.tsx","./src/components/layouts/card-layout.tsx","./src/components/maintenanceRequests/MaintenanceDetailsModal.tsx","./src/components/maintenanceRequests/MaintenanceRequestCard.tsx","./src/components/maintenanceWorkers/WorkerCard.tsx","./src/components/maintenanceWorkers/WorkerDetailsModal.tsx","./src/components/properties/PropertyCard.tsx","./src/components/properties/PropertyDetailsModal.tsx","./src/components/search/UnifiedSearch.tsx","./src/components/ui/alert.tsx","./src/components/ui/avatar.tsx","./src/components/ui/badge.tsx","./src/components/ui/breadcrumb.tsx","./src/components/ui/button.tsx","./src/components/ui/calendar.tsx","./src/components/ui/card.tsx","./src/components/ui/checkbox.tsx","./src/components/ui/collapsible.tsx","./src/components/ui/datePicker.tsx","./src/components/ui/dialog.tsx","./src/components/ui/dropdown-menu.tsx","./src/components/ui/field.tsx","./src/components/ui/index.ts","./src/components/ui/input.tsx","./src/components/ui/label.tsx","./src/components/ui/pagination.tsx","./src/components/ui/popover.tsx","./src/components/ui/select.tsx","./src/components/ui/separator.tsx","./src/components/ui/skeleton.tsx","./src/components/ui/sonner.tsx","./src/components/ui/spinner.tsx","./src/components/ui/table.tsx","./src/components/ui/tabs.tsx","./src/features/search/index.ts","./src/features/search/loadConfig.ts","./src/features/search/queryBuilder.ts","./src/features/search/types.ts","./src/features/search/api/distinctValuesService.ts","./src/features/search/api/searchService.ts","./src/features/search/components/MergedSearchResults.tsx","./src/features/search/components/Search.tsx","./src/features/search/components/SearchResults.tsx","./src/features/search/components/SourceSection.tsx","./src/features/search/components/controls/PaginationControls.tsx","./src/features/search/components/controls/ScopeSelector.tsx","./src/features/search/components/controls/SearchBar.tsx","./src/features/search/components/controls/SortControl.tsx","./src/features/search/components/filters/ActiveFilters.tsx","./src/features/search/components/filters/DefaultFilterPanel.tsx","./src/features/search/components/filters/FilterContext.tsx","./src/features/search/components/filters/inputs/BooleanFilter.tsx","./src/features/search/components/filters/inputs/DateRangeFilter.tsx","./src/features/search/components/filters/inputs/FilterFieldWrapper.tsx","./src/features/search/components/filters/inputs/MultiSelectFilter.tsx","./src/features/search/components/filters/inputs/NumericRangeFilter.tsx","./src/features/search/components/filters/inputs/SelectFilter.tsx","./src/features/search/components/filters/inputs/TextFilter.tsx","./src/features/search/components/results/DefaultResultRow.tsx","./src/features/search/hooks/useAsyncData.ts","./src/features/search/hooks/useDistinctValues.ts","./src/features/search/hooks/useSearch.ts","./src/features/search/utils/debounce.ts","./src/features/search/utils/fieldUtils.ts","./src/features/search/utils/filterUtils.ts","./src/features/search/utils/sortUtils.ts","./src/hooks/useAsyncData.ts","./src/lib/constants.ts","./src/lib/routeConfig.ts","./src/lib/searchConfig.ts","./src/lib/utils.ts","./src/pages/ApplicationSearch.tsx","./src/pages/Home.tsx","./src/pages/MaintenanceRequestSearch.tsx","./src/pages/MaintenanceWorkerSearch.tsx","./src/pages/NotFound.tsx","./src/pages/PropertySearch.tsx","./src/pages/Search.tsx","./src/types/conversation.ts","./src/types/globals.d.ts","./e2e/app.spec.ts","./vite-env.d.ts","./vitest-env.d.ts","./vitest.setup.ts","../../../../../../../../../sdk/platform-sdk/types/env.d.ts"],"version":"5.9.3"}