@authhero/react-admin 0.22.0 → 0.24.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @authhero/react-admin
2
2
 
3
+ ## 0.24.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 9d6cfb8: Wrap adapters as part of the multi-tenant package
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [9d6cfb8]
12
+ - @authhero/adapter-interfaces@0.122.0
13
+ - @authhero/widget@0.7.1
14
+
15
+ ## 0.23.0
16
+
17
+ ### Minor Changes
18
+
19
+ - 7277798: Improve logging for changing emails
20
+
3
21
  ## 0.22.0
4
22
 
5
23
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@authhero/react-admin",
3
- "version": "0.22.0",
3
+ "version": "0.24.0",
4
4
  "packageManager": "pnpm@10.20.0",
5
5
  "private": false,
6
6
  "repository": {
@@ -88,6 +88,65 @@ function createHeaders(tenantId?: string): Headers {
88
88
  return headers;
89
89
  }
90
90
 
91
+ // Helper for client-side paging, sorting, and search on pre-fetched data
92
+ interface ClientSideListParams {
93
+ data: any[];
94
+ page: number;
95
+ perPage: number;
96
+ sortField?: string;
97
+ sortOrder?: "ASC" | "DESC";
98
+ searchQuery?: string;
99
+ searchFields?: string[];
100
+ idKey?: string;
101
+ }
102
+
103
+ function clientSideListHandler({
104
+ data,
105
+ page,
106
+ perPage,
107
+ sortField,
108
+ sortOrder,
109
+ searchQuery,
110
+ searchFields = ["name"],
111
+ idKey = "id",
112
+ }: ClientSideListParams): { data: any[]; total: number } {
113
+ let filtered = data;
114
+
115
+ // Apply client-side search filter
116
+ if (searchQuery) {
117
+ const query = searchQuery.toLowerCase();
118
+ filtered = data.filter((item: any) =>
119
+ searchFields.some((field) =>
120
+ item[field]?.toString().toLowerCase().includes(query),
121
+ ),
122
+ );
123
+ }
124
+
125
+ // Apply client-side sorting
126
+ if (sortField) {
127
+ filtered = [...filtered].sort((a: any, b: any) => {
128
+ const aVal = a[sortField] || "";
129
+ const bVal = b[sortField] || "";
130
+ const comparison = String(aVal).localeCompare(String(bVal));
131
+ return sortOrder === "DESC" ? -comparison : comparison;
132
+ });
133
+ }
134
+
135
+ // Apply client-side pagination
136
+ const total = filtered.length;
137
+ const startIndex = (page - 1) * perPage;
138
+ const endIndex = startIndex + perPage;
139
+ const paged = filtered.slice(startIndex, endIndex);
140
+
141
+ return {
142
+ data: paged.map((item: any) => ({
143
+ id: item[idKey] || item.id,
144
+ ...item,
145
+ })),
146
+ total,
147
+ };
148
+ }
149
+
91
150
  // Helper to handle singleton resource fetching
92
151
  async function fetchSingleton(
93
152
  resource: string,
@@ -201,15 +260,7 @@ export default (
201
260
  resourceKey: "resource_servers",
202
261
  idKey: "id",
203
262
  },
204
- organizations: {
205
- fetch: (client) =>
206
- client.organizations.list({
207
- from: String((page - 1) * (perPage || 10)),
208
- take: perPage || 10,
209
- }),
210
- resourceKey: "organizations",
211
- idKey: "id",
212
- },
263
+ // Organizations handled separately with client-side paging/search
213
264
  // Logs removed from SDK handlers - using HTTP directly for full control
214
265
  rules: {
215
266
  fetch: (client) => client.rules.list(),
@@ -273,6 +324,26 @@ export default (
273
324
  );
274
325
  }
275
326
 
327
+ // Handle organizations with client-side paging and search (fetch 500, filter locally)
328
+ if (resource === "organizations" && !resourcePath.includes("/")) {
329
+ const result = await managementClient.organizations.list({
330
+ from: "0",
331
+ take: 500,
332
+ });
333
+ const { data: allOrgs } = normalizeSDKResponse(result, "organizations");
334
+
335
+ return clientSideListHandler({
336
+ data: allOrgs,
337
+ page,
338
+ perPage: perPage || 10,
339
+ sortField: field,
340
+ sortOrder: order,
341
+ searchQuery: params.filter?.q,
342
+ searchFields: ["name", "display_name"],
343
+ idKey: "id",
344
+ });
345
+ }
346
+
276
347
  // Handle logs with direct HTTP for full control over query params
277
348
  if (resource === "logs") {
278
349
  const headers = createHeaders(tenantId);