@truenorth-it/dataverse-client 1.0.6 → 1.0.7
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/README.md +189 -0
- package/package.json +14 -1
- package/sdk/dist/client.d.ts +7 -0
- package/sdk/dist/client.d.ts.map +1 -1
- package/sdk/dist/client.js +32 -16
- package/sdk/dist/client.js.map +1 -1
- package/sdk/dist/codegen.d.ts.map +1 -1
- package/sdk/dist/codegen.js.map +1 -1
- package/sdk/dist/index.d.ts +5 -1
- package/sdk/dist/index.d.ts.map +1 -1
- package/sdk/dist/index.js +4 -0
- package/sdk/dist/index.js.map +1 -1
- package/sdk/dist/quick-date.d.ts +36 -0
- package/sdk/dist/quick-date.d.ts.map +1 -0
- package/sdk/dist/quick-date.js +118 -0
- package/sdk/dist/quick-date.js.map +1 -0
- package/sdk/dist/realtime.d.ts +66 -0
- package/sdk/dist/realtime.d.ts.map +1 -0
- package/sdk/dist/realtime.js +129 -0
- package/sdk/dist/realtime.js.map +1 -0
- package/sdk/dist/types.d.ts +22 -0
- package/sdk/dist/types.d.ts.map +1 -1
package/README.md
CHANGED
|
@@ -234,6 +234,30 @@ for (const c of result.data) {
|
|
|
234
234
|
|
|
235
235
|
> **With types:** `client.me.list<Case>("case", ...)` — gives full autocomplete on `result.data`.
|
|
236
236
|
|
|
237
|
+
### List activity records by subtype
|
|
238
|
+
|
|
239
|
+
Activity tables (`caseactivities`, `contactactivities`) support subtype filtering to retrieve specific activity types:
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
// List all phone calls for your cases
|
|
243
|
+
const phoneCalls = await client.me.list("caseactivities", {
|
|
244
|
+
subtype: "phonecall",
|
|
245
|
+
select: ["activityid", "subject", "activitytypecode"],
|
|
246
|
+
top: 20,
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
// List all activity types at once
|
|
250
|
+
const allActivities = await client.me.list("caseactivities", {
|
|
251
|
+
subtype: "all",
|
|
252
|
+
orderBy: "createdon:desc",
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
// Each record includes a _link to its canonical URL
|
|
256
|
+
for (const activity of allActivities.data) {
|
|
257
|
+
console.log(activity._link); // "/api/v2/me/caseactivities/phonecall/a1b2c3d4-..."
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
237
261
|
### Get a single record
|
|
238
262
|
|
|
239
263
|
```typescript
|
|
@@ -356,6 +380,9 @@ Used by `list()`:
|
|
|
356
380
|
| `filter` | `string \| string[]` | OData-style filter expressions |
|
|
357
381
|
| `filterLogic` | `"and" \| "or"` | How to combine multiple filters (default: `"and"`) |
|
|
358
382
|
| `expand` | `string` | Expand related lookups |
|
|
383
|
+
| `subtype` | `string` | Activity subtype filter (e.g. `"phonecall"`, `"email"`, `"task"`, `"all"`) — only for activity tables |
|
|
384
|
+
| `created` | `string` | Quick filter on creation date — e.g. `"today"`, `"7d"`, `"thismonth"`, `"2026-01-01..2026-02-01"` |
|
|
385
|
+
| `modified` | `string` | Quick filter on last-modified date (same formats as `created`) |
|
|
359
386
|
|
|
360
387
|
`lookup()` accepts the same options plus:
|
|
361
388
|
|
|
@@ -365,6 +392,47 @@ Used by `list()`:
|
|
|
365
392
|
|
|
366
393
|
`get()` accepts only `select` and `expand`.
|
|
367
394
|
|
|
395
|
+
### Quick date filter values
|
|
396
|
+
|
|
397
|
+
| Format | Examples | Description |
|
|
398
|
+
|--------|----------|-------------|
|
|
399
|
+
| Named period | `today`, `yesterday`, `thisweek`, `lastweek`, `thismonth`, `lastmonth`, `thisyear` | Human-friendly period presets |
|
|
400
|
+
| Relative | `1h`, `24h`, `7d`, `30d`, `90d` | Sliding window from now |
|
|
401
|
+
| Date range | `2026-01-01..2026-02-01`, `2026-01-01..`, `..2026-02-01` | Explicit date range (inclusive start, exclusive end) |
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
// Cases created in the last 7 days
|
|
405
|
+
const recent = await client.me.list<Case>("case", { created: "7d" });
|
|
406
|
+
|
|
407
|
+
// Cases modified today
|
|
408
|
+
const updated = await client.me.list<Case>("case", { modified: "today" });
|
|
409
|
+
|
|
410
|
+
// Combine with regular filters
|
|
411
|
+
const urgentRecent = await client.me.list<Case>("case", {
|
|
412
|
+
created: "thismonth",
|
|
413
|
+
filter: "prioritycode eq 1",
|
|
414
|
+
});
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
The SDK resolves these client-side — dates are converted into standard `filter` conditions before the request is sent. This means quick dates work with **any server version**, even older deployments that don't support the `created`/`modified` parameters natively.
|
|
418
|
+
|
|
419
|
+
### Standalone utility
|
|
420
|
+
|
|
421
|
+
The resolution logic is also exported for direct use:
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
import { resolveQuickDate, quickDateToFilters } from "@truenorth-it/dataverse-client";
|
|
425
|
+
|
|
426
|
+
resolveQuickDate("7d");
|
|
427
|
+
// → { ge: "2026-02-08T12:00:00.000Z" }
|
|
428
|
+
|
|
429
|
+
resolveQuickDate("today");
|
|
430
|
+
// → { ge: "2026-02-15T00:00:00.000Z", lt: "2026-02-16T00:00:00.000Z" }
|
|
431
|
+
|
|
432
|
+
quickDateToFilters("createdon", "thisweek");
|
|
433
|
+
// → ["createdon ge 2026-02-09T00:00:00.000Z"]
|
|
434
|
+
```
|
|
435
|
+
|
|
368
436
|
## Error handling
|
|
369
437
|
|
|
370
438
|
```typescript
|
|
@@ -386,6 +454,122 @@ try {
|
|
|
386
454
|
| 403 | Insufficient permissions |
|
|
387
455
|
| 404 | Unknown table or contact not found |
|
|
388
456
|
|
|
457
|
+
## Real-time notifications
|
|
458
|
+
|
|
459
|
+
The SDK includes a React hook that connects to Azure SignalR and automatically invalidates TanStack Query caches when data changes on the server. When another user (or an MCP client) creates or updates a record, your portal's UI refreshes instantly — no polling required.
|
|
460
|
+
|
|
461
|
+
### Prerequisites
|
|
462
|
+
|
|
463
|
+
Install the SignalR client as a peer dependency:
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
npm install @microsoft/signalr
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
The API must have `SIGNALR_CONNECTION_STRING` configured. When it's not set, `negotiate()` returns a 404 and the hook gracefully does nothing.
|
|
470
|
+
|
|
471
|
+
### Negotiate
|
|
472
|
+
|
|
473
|
+
The client exposes a `negotiate()` method that exchanges your Auth0 token for a SignalR connection token:
|
|
474
|
+
|
|
475
|
+
```typescript
|
|
476
|
+
const { url, accessToken } = await client.negotiate();
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
You don't usually call this directly — the `useRealtime` hook handles it.
|
|
480
|
+
|
|
481
|
+
### useRealtime hook
|
|
482
|
+
|
|
483
|
+
```tsx
|
|
484
|
+
import { useCallback } from "react";
|
|
485
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
486
|
+
import { createClient, useRealtime } from "@truenorth-it/dataverse-client";
|
|
487
|
+
|
|
488
|
+
function App() {
|
|
489
|
+
const client = useApiClient();
|
|
490
|
+
const queryClient = useQueryClient();
|
|
491
|
+
|
|
492
|
+
const negotiate = useCallback(() => client.negotiate(), [client]);
|
|
493
|
+
|
|
494
|
+
const { connected, error } = useRealtime({
|
|
495
|
+
negotiate,
|
|
496
|
+
queryClient,
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
// connected: true when the SignalR connection is active
|
|
500
|
+
// error: last error message, or null
|
|
501
|
+
}
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
That's all you need. When a `dataChanged` event arrives (e.g. for table `"case"`), the hook automatically calls `queryClient.invalidateQueries()` for the matching query keys. TanStack Query refetches in the background and your UI updates.
|
|
505
|
+
|
|
506
|
+
### Options
|
|
507
|
+
|
|
508
|
+
```typescript
|
|
509
|
+
interface RealtimeOptions {
|
|
510
|
+
negotiate: () => Promise<{ url: string; accessToken: string }>;
|
|
511
|
+
queryClient: QueryClient;
|
|
512
|
+
tableQueryKeys?: Record<string, readonly (readonly unknown[])[]>;
|
|
513
|
+
onEvent?: (event: DataChangeEvent) => void;
|
|
514
|
+
enabled?: boolean; // default: true
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
| Option | Description |
|
|
519
|
+
|--------|-------------|
|
|
520
|
+
| `negotiate` | Function that returns a SignalR token (from `client.negotiate()`) |
|
|
521
|
+
| `queryClient` | TanStack React Query client instance |
|
|
522
|
+
| `tableQueryKeys` | Custom mapping of table names to query key prefixes (see below) |
|
|
523
|
+
| `onEvent` | Optional callback for every data change event |
|
|
524
|
+
| `enabled` | Set to `false` to disable the connection |
|
|
525
|
+
|
|
526
|
+
### Default table-to-query-key mapping
|
|
527
|
+
|
|
528
|
+
The hook ships with sensible defaults:
|
|
529
|
+
|
|
530
|
+
```typescript
|
|
531
|
+
{
|
|
532
|
+
case: [["cases"], ["aggStats"]],
|
|
533
|
+
casenotes: [["caseNotes"]],
|
|
534
|
+
caseactivities: [["caseActivities"]],
|
|
535
|
+
caseemails: [["caseActivities"]],
|
|
536
|
+
casephonecalls: [["caseActivities"]],
|
|
537
|
+
casetasks: [["caseActivities"]],
|
|
538
|
+
caseappointments:[["caseActivities"]],
|
|
539
|
+
}
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
Override or extend for your own tables:
|
|
543
|
+
|
|
544
|
+
```typescript
|
|
545
|
+
useRealtime({
|
|
546
|
+
negotiate,
|
|
547
|
+
queryClient,
|
|
548
|
+
tableQueryKeys: {
|
|
549
|
+
// Keep defaults
|
|
550
|
+
case: [["cases"], ["aggStats"]],
|
|
551
|
+
casenotes: [["caseNotes"]],
|
|
552
|
+
// Add your custom tables
|
|
553
|
+
invoice: [["invoices"]],
|
|
554
|
+
project: [["projects"], ["projectStats"]],
|
|
555
|
+
},
|
|
556
|
+
});
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### DataChangeEvent
|
|
560
|
+
|
|
561
|
+
Events received from the server:
|
|
562
|
+
|
|
563
|
+
```typescript
|
|
564
|
+
interface DataChangeEvent {
|
|
565
|
+
table: string; // e.g. "case", "casenotes"
|
|
566
|
+
action: "created" | "updated" | "deleted";
|
|
567
|
+
recordId: string; // GUID of the affected record
|
|
568
|
+
timestamp: string; // ISO 8601
|
|
569
|
+
actor?: string; // email of the user who made the change
|
|
570
|
+
}
|
|
571
|
+
```
|
|
572
|
+
|
|
389
573
|
## Response field patterns
|
|
390
574
|
|
|
391
575
|
These patterns apply to **all** API responses, whether or not you use generated types.
|
|
@@ -436,7 +620,12 @@ import type {
|
|
|
436
620
|
SchemaResponse, SchemaTableInput,
|
|
437
621
|
// Errors
|
|
438
622
|
ApiErrorBody,
|
|
623
|
+
// Real-time notifications
|
|
624
|
+
NegotiateResponse, DataChangeEvent, RealtimeOptions, RealtimeState,
|
|
439
625
|
} from "@truenorth-it/dataverse-client";
|
|
626
|
+
|
|
627
|
+
// React hook (requires @microsoft/signalr peer dependency)
|
|
628
|
+
import { useRealtime } from "@truenorth-it/dataverse-client";
|
|
440
629
|
```
|
|
441
630
|
|
|
442
631
|
Table-specific types come from your generated file:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truenorth-it/dataverse-client",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./sdk/dist/index.js",
|
|
6
6
|
"types": "./sdk/dist/index.d.ts",
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"zod": "^3.25.76"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
+
"@microsoft/signalr": "^10.0.0",
|
|
54
55
|
"@tailwindcss/vite": "^4.1.18",
|
|
55
56
|
"@testing-library/jest-dom": "^6.9.1",
|
|
56
57
|
"@testing-library/react": "^16.3.2",
|
|
@@ -72,6 +73,18 @@
|
|
|
72
73
|
"vite": "^5.0.12",
|
|
73
74
|
"vitest": "^4.0.18"
|
|
74
75
|
},
|
|
76
|
+
"peerDependencies": {
|
|
77
|
+
"@microsoft/signalr": ">=8.0.0",
|
|
78
|
+
"@tanstack/react-query": ">=5.0.0"
|
|
79
|
+
},
|
|
80
|
+
"peerDependenciesMeta": {
|
|
81
|
+
"@microsoft/signalr": {
|
|
82
|
+
"optional": true
|
|
83
|
+
},
|
|
84
|
+
"@tanstack/react-query": {
|
|
85
|
+
"optional": true
|
|
86
|
+
}
|
|
87
|
+
},
|
|
75
88
|
"engines": {
|
|
76
89
|
"node": ">=18"
|
|
77
90
|
}
|
package/sdk/dist/client.d.ts
CHANGED
|
@@ -37,6 +37,11 @@ export interface MeScopeClient extends ScopeClient {
|
|
|
37
37
|
/** Get authenticated identity + Dataverse contact info */
|
|
38
38
|
whoami(): Promise<WhoamiResponse>;
|
|
39
39
|
}
|
|
40
|
+
/** SignalR negotiate response */
|
|
41
|
+
export interface NegotiateResponse {
|
|
42
|
+
url: string;
|
|
43
|
+
accessToken: string;
|
|
44
|
+
}
|
|
40
45
|
/** Dataverse Contact API client */
|
|
41
46
|
export interface DataverseClient {
|
|
42
47
|
/** Operations on the authenticated user's own records */
|
|
@@ -49,6 +54,8 @@ export interface DataverseClient {
|
|
|
49
54
|
choices(table: string, field?: string): Promise<FieldChoicesResponse | TableChoicesResponse>;
|
|
50
55
|
/** Fetch table schema (single table or all tables) */
|
|
51
56
|
schema(table?: string): Promise<TableSchema | TableSchema[]>;
|
|
57
|
+
/** Negotiate a SignalR connection token for real-time notifications */
|
|
58
|
+
negotiate(): Promise<NegotiateResponse>;
|
|
52
59
|
}
|
|
53
60
|
/** Create a configured API client instance */
|
|
54
61
|
export declare function createClient(config: ClientConfig): DataverseClient;
|
package/sdk/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/sdk/dist/client.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { quickDateToFilters } from "./quick-date.js";
|
|
1
2
|
/** Error thrown when the API returns a non-OK response */
|
|
2
3
|
export class ApiError extends Error {
|
|
3
4
|
status;
|
|
@@ -11,6 +12,23 @@ export class ApiError extends Error {
|
|
|
11
12
|
this.body = body;
|
|
12
13
|
}
|
|
13
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Collect all filter strings, including any resolved from `created`/`modified`
|
|
17
|
+
* quick date shortcuts. Resolves client-side so the SDK works against any
|
|
18
|
+
* server version — no dependency on the server supporting these params.
|
|
19
|
+
*/
|
|
20
|
+
function collectFilters(options) {
|
|
21
|
+
const filters = [];
|
|
22
|
+
if (options.filter) {
|
|
23
|
+
const raw = Array.isArray(options.filter) ? options.filter : [options.filter];
|
|
24
|
+
filters.push(...raw);
|
|
25
|
+
}
|
|
26
|
+
if (options.created)
|
|
27
|
+
filters.push(...quickDateToFilters("createdon", options.created));
|
|
28
|
+
if (options.modified)
|
|
29
|
+
filters.push(...quickDateToFilters("modifiedon", options.modified));
|
|
30
|
+
return filters;
|
|
31
|
+
}
|
|
14
32
|
function buildQueryString(options) {
|
|
15
33
|
const params = new URLSearchParams();
|
|
16
34
|
if (options.select?.length)
|
|
@@ -28,14 +46,9 @@ function buildQueryString(options) {
|
|
|
28
46
|
if (options.filterLogic && options.filterLogic !== "and") {
|
|
29
47
|
params.set("filterLogic", options.filterLogic);
|
|
30
48
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
: [options.filter];
|
|
35
|
-
for (const f of filters) {
|
|
36
|
-
params.append("filter", f);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
49
|
+
const filters = collectFilters(options);
|
|
50
|
+
for (const f of filters)
|
|
51
|
+
params.append("filter", f);
|
|
39
52
|
const qs = params.toString();
|
|
40
53
|
return qs ? `?${qs}` : "";
|
|
41
54
|
}
|
|
@@ -71,20 +84,20 @@ function buildAggregateQueryString(options) {
|
|
|
71
84
|
if (options.filterLogic && options.filterLogic !== "and") {
|
|
72
85
|
params.set("filterLogic", options.filterLogic);
|
|
73
86
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
: [options.filter];
|
|
78
|
-
for (const f of filters)
|
|
79
|
-
params.append("filter", f);
|
|
80
|
-
}
|
|
87
|
+
const filters = collectFilters(options);
|
|
88
|
+
for (const f of filters)
|
|
89
|
+
params.append("filter", f);
|
|
81
90
|
const qs = params.toString();
|
|
82
91
|
return qs ? `?${qs}` : "";
|
|
83
92
|
}
|
|
84
93
|
function createScopeClient(config, scope) {
|
|
85
94
|
return {
|
|
86
95
|
list(table, options = {}) {
|
|
87
|
-
|
|
96
|
+
const { subtype, ...queryOptions } = options;
|
|
97
|
+
const path = subtype
|
|
98
|
+
? `/${scope}/${table}/${subtype}${buildQueryString(queryOptions)}`
|
|
99
|
+
: `/${scope}/${table}${buildQueryString(queryOptions)}`;
|
|
100
|
+
return request(config, "GET", path);
|
|
88
101
|
},
|
|
89
102
|
get(table, id, options = {}) {
|
|
90
103
|
return request(config, "GET", `/${scope}/${table}/${id}${buildQueryString(options)}`);
|
|
@@ -132,6 +145,9 @@ export function createClient(config) {
|
|
|
132
145
|
? request(config, "GET", `/schema${qs}`)
|
|
133
146
|
: request(config, "GET", `/schema${qs}`);
|
|
134
147
|
},
|
|
148
|
+
negotiate() {
|
|
149
|
+
return request(config, "POST", "/negotiate");
|
|
150
|
+
},
|
|
135
151
|
};
|
|
136
152
|
}
|
|
137
153
|
//# sourceMappingURL=client.js.map
|
package/sdk/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,8EAA8E;AAC9E,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CAC5D;AAsHD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,iBAAiB,EAAE,GAC5B,MAAM,
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,8EAA8E;AAC9E,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CAC5D;AAsHD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,iBAAiB,EAAE,GAC5B,MAAM,CA2CR"}
|
package/sdk/dist/codegen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"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"}
|
package/sdk/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export { createClient, ApiError } from "./client.js";
|
|
2
|
-
export type { DataverseClient, ScopeClient, MeScopeClient, } from "./client.js";
|
|
2
|
+
export type { DataverseClient, ScopeClient, MeScopeClient, NegotiateResponse, } from "./client.js";
|
|
3
3
|
export type { ClientConfig, QueryOptions, LookupOptions, AggregateOptions, PaginatedResponse, SingleResponse, AggregateResponse, WhoamiResponse, TableSchema, SchemaField, ExpandSchema, Choice, FieldChoicesResponse, TableChoicesResponse, ApiErrorBody, } from "./types.js";
|
|
4
|
+
export { resolveQuickDate, quickDateToFilters } from "./quick-date.js";
|
|
5
|
+
export type { DateRange } from "./quick-date.js";
|
|
4
6
|
export { generateTableTypes } from "./codegen.js";
|
|
5
7
|
export type { SchemaTableInput, SchemaResponse, TableChoicesInput } from "./codegen.js";
|
|
8
|
+
export { useRealtime } from "./realtime.js";
|
|
9
|
+
export type { DataChangeEvent, RealtimeOptions, RealtimeState } from "./realtime.js";
|
|
6
10
|
//# sourceMappingURL=index.d.ts.map
|
package/sdk/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACrD,YAAY,EACV,eAAe,EACf,WAAW,EACX,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACrD,YAAY,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACb,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,MAAM,EACN,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGxF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
package/sdk/dist/index.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export { createClient, ApiError } from "./client.js";
|
|
2
|
+
// Quick date resolution — resolve "7d", "today", etc. into ISO 8601 bounds
|
|
3
|
+
export { resolveQuickDate, quickDateToFilters } from "./quick-date.js";
|
|
2
4
|
// Codegen — generate TypeScript interfaces from a schema response
|
|
3
5
|
export { generateTableTypes } from "./codegen.js";
|
|
6
|
+
// Real-time notifications via Azure SignalR (requires @microsoft/signalr peer dep)
|
|
7
|
+
export { useRealtime } from "./realtime.js";
|
|
4
8
|
//# sourceMappingURL=index.js.map
|
package/sdk/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAyBrD,2EAA2E;AAC3E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGvE,kEAAkE;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,mFAAmF;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quick date filter resolution — converts human-friendly shortcuts
|
|
3
|
+
* like "today", "7d", "thisweek" into ISO 8601 datetime bounds.
|
|
4
|
+
*
|
|
5
|
+
* Used internally by the SDK client and also exported for standalone use.
|
|
6
|
+
*/
|
|
7
|
+
export interface DateRange {
|
|
8
|
+
/** Greater-than-or-equal bound (ISO 8601) */
|
|
9
|
+
ge?: string;
|
|
10
|
+
/** Less-than bound (ISO 8601) */
|
|
11
|
+
lt?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resolve a quick date shortcut into ISO 8601 datetime bounds.
|
|
15
|
+
*
|
|
16
|
+
* @param value - Shortcut string: "today", "7d", "2026-01-01..2026-02-01", etc.
|
|
17
|
+
* @param now - Reference time (defaults to current time)
|
|
18
|
+
* @returns Object with `ge` and/or `lt` ISO 8601 strings
|
|
19
|
+
* @throws Error if the value is not a recognised format
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* resolveQuickDate("7d") // → { ge: "2026-02-08T12:00:00.000Z" }
|
|
24
|
+
* resolveQuickDate("today") // → { ge: "2026-02-15T00:00:00.000Z", lt: "2026-02-16T00:00:00.000Z" }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveQuickDate(value: string, now?: Date): DateRange;
|
|
28
|
+
/**
|
|
29
|
+
* Convert a quick date shortcut into filter strings ready for the API.
|
|
30
|
+
*
|
|
31
|
+
* @param field - Dataverse field name (e.g. "createdon", "modifiedon")
|
|
32
|
+
* @param value - Shortcut string
|
|
33
|
+
* @returns Array of filter strings like ["createdon ge 2026-02-08T12:00:00.000Z"]
|
|
34
|
+
*/
|
|
35
|
+
export declare function quickDateToFilters(field: string, value: string): string[];
|
|
36
|
+
//# sourceMappingURL=quick-date.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-date.d.ts","sourceRoot":"","sources":["../src/quick-date.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AA+CD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAa,GAAG,SAAS,CAqC3E;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAMzE"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quick date filter resolution — converts human-friendly shortcuts
|
|
3
|
+
* like "today", "7d", "thisweek" into ISO 8601 datetime bounds.
|
|
4
|
+
*
|
|
5
|
+
* Used internally by the SDK client and also exported for standalone use.
|
|
6
|
+
*/
|
|
7
|
+
function startOfDay(d) {
|
|
8
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));
|
|
9
|
+
}
|
|
10
|
+
const PERIODS = {
|
|
11
|
+
today: (now) => {
|
|
12
|
+
const s = startOfDay(now);
|
|
13
|
+
const e = new Date(s);
|
|
14
|
+
e.setUTCDate(e.getUTCDate() + 1);
|
|
15
|
+
return { ge: s.toISOString(), lt: e.toISOString() };
|
|
16
|
+
},
|
|
17
|
+
yesterday: (now) => {
|
|
18
|
+
const e = startOfDay(now);
|
|
19
|
+
const s = new Date(e);
|
|
20
|
+
s.setUTCDate(s.getUTCDate() - 1);
|
|
21
|
+
return { ge: s.toISOString(), lt: e.toISOString() };
|
|
22
|
+
},
|
|
23
|
+
thisweek: (now) => {
|
|
24
|
+
const s = startOfDay(now);
|
|
25
|
+
const day = s.getUTCDay() || 7;
|
|
26
|
+
s.setUTCDate(s.getUTCDate() - (day - 1));
|
|
27
|
+
return { ge: s.toISOString() };
|
|
28
|
+
},
|
|
29
|
+
lastweek: (now) => {
|
|
30
|
+
const mon = startOfDay(now);
|
|
31
|
+
const day = mon.getUTCDay() || 7;
|
|
32
|
+
mon.setUTCDate(mon.getUTCDate() - (day - 1));
|
|
33
|
+
const prev = new Date(mon);
|
|
34
|
+
prev.setUTCDate(prev.getUTCDate() - 7);
|
|
35
|
+
return { ge: prev.toISOString(), lt: mon.toISOString() };
|
|
36
|
+
},
|
|
37
|
+
thismonth: (now) => ({
|
|
38
|
+
ge: new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1)).toISOString(),
|
|
39
|
+
}),
|
|
40
|
+
lastmonth: (now) => ({
|
|
41
|
+
ge: new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() - 1, 1)).toISOString(),
|
|
42
|
+
lt: new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1)).toISOString(),
|
|
43
|
+
}),
|
|
44
|
+
thisyear: (now) => ({
|
|
45
|
+
ge: new Date(Date.UTC(now.getUTCFullYear(), 0, 1)).toISOString(),
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
const RELATIVE_RE = /^(\d+)(h|d)$/;
|
|
49
|
+
const RANGE_RE = /^(\d{4}-\d{2}-\d{2})?\.\.(\d{4}-\d{2}-\d{2})?$/;
|
|
50
|
+
/**
|
|
51
|
+
* Resolve a quick date shortcut into ISO 8601 datetime bounds.
|
|
52
|
+
*
|
|
53
|
+
* @param value - Shortcut string: "today", "7d", "2026-01-01..2026-02-01", etc.
|
|
54
|
+
* @param now - Reference time (defaults to current time)
|
|
55
|
+
* @returns Object with `ge` and/or `lt` ISO 8601 strings
|
|
56
|
+
* @throws Error if the value is not a recognised format
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* resolveQuickDate("7d") // → { ge: "2026-02-08T12:00:00.000Z" }
|
|
61
|
+
* resolveQuickDate("today") // → { ge: "2026-02-15T00:00:00.000Z", lt: "2026-02-16T00:00:00.000Z" }
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export function resolveQuickDate(value, now = new Date()) {
|
|
65
|
+
const v = value.trim().toLowerCase();
|
|
66
|
+
const period = PERIODS[v];
|
|
67
|
+
if (period)
|
|
68
|
+
return period(now);
|
|
69
|
+
const rel = RELATIVE_RE.exec(v);
|
|
70
|
+
if (rel) {
|
|
71
|
+
const n = parseInt(rel[1], 10);
|
|
72
|
+
const from = new Date(now);
|
|
73
|
+
if (rel[2] === "h")
|
|
74
|
+
from.setUTCHours(from.getUTCHours() - n);
|
|
75
|
+
else
|
|
76
|
+
from.setUTCDate(from.getUTCDate() - n);
|
|
77
|
+
return { ge: from.toISOString() };
|
|
78
|
+
}
|
|
79
|
+
const range = RANGE_RE.exec(v);
|
|
80
|
+
if (range) {
|
|
81
|
+
const [, s, e] = range;
|
|
82
|
+
if (!s && !e)
|
|
83
|
+
throw new Error(`Invalid date range '${value}'`);
|
|
84
|
+
const result = {};
|
|
85
|
+
if (s) {
|
|
86
|
+
const d = new Date(s + "T00:00:00Z");
|
|
87
|
+
if (isNaN(d.getTime()))
|
|
88
|
+
throw new Error(`Invalid start date '${s}'`);
|
|
89
|
+
result.ge = d.toISOString();
|
|
90
|
+
}
|
|
91
|
+
if (e) {
|
|
92
|
+
const d = new Date(e + "T00:00:00Z");
|
|
93
|
+
if (isNaN(d.getTime()))
|
|
94
|
+
throw new Error(`Invalid end date '${e}'`);
|
|
95
|
+
d.setUTCDate(d.getUTCDate() + 1);
|
|
96
|
+
result.lt = d.toISOString();
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
throw new Error(`Unknown quick date value '${value}'. Use: today, yesterday, thisweek, lastweek, thismonth, lastmonth, thisyear, 1h, 24h, 7d, 30d, 90d, or YYYY-MM-DD..YYYY-MM-DD`);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Convert a quick date shortcut into filter strings ready for the API.
|
|
104
|
+
*
|
|
105
|
+
* @param field - Dataverse field name (e.g. "createdon", "modifiedon")
|
|
106
|
+
* @param value - Shortcut string
|
|
107
|
+
* @returns Array of filter strings like ["createdon ge 2026-02-08T12:00:00.000Z"]
|
|
108
|
+
*/
|
|
109
|
+
export function quickDateToFilters(field, value) {
|
|
110
|
+
const { ge, lt } = resolveQuickDate(value);
|
|
111
|
+
const filters = [];
|
|
112
|
+
if (ge)
|
|
113
|
+
filters.push(`${field} ge ${ge}`);
|
|
114
|
+
if (lt)
|
|
115
|
+
filters.push(`${field} lt ${lt}`);
|
|
116
|
+
return filters;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=quick-date.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-date.js","sourceRoot":"","sources":["../src/quick-date.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for real-time notifications via Azure SignalR Service.
|
|
3
|
+
*
|
|
4
|
+
* Connects to SignalR using the negotiate endpoint from the API,
|
|
5
|
+
* listens for data change events, and automatically invalidates
|
|
6
|
+
* TanStack React Query caches so the UI stays fresh.
|
|
7
|
+
*
|
|
8
|
+
* Requires peer dependencies: @microsoft/signalr, @tanstack/react-query, react
|
|
9
|
+
*/
|
|
10
|
+
/** Event received when data changes on the server */
|
|
11
|
+
export interface DataChangeEvent {
|
|
12
|
+
table: string;
|
|
13
|
+
action: "created" | "updated" | "deleted";
|
|
14
|
+
recordId: string;
|
|
15
|
+
timestamp: string;
|
|
16
|
+
actor?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Minimal subset of TanStack QueryClient we need (avoids hard dependency) */
|
|
19
|
+
interface QueryClientLike {
|
|
20
|
+
invalidateQueries(options: {
|
|
21
|
+
queryKey: readonly unknown[];
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/** Options for the useRealtime hook */
|
|
25
|
+
export interface RealtimeOptions {
|
|
26
|
+
/** Function that returns a SignalR negotiate response (from client.negotiate()) */
|
|
27
|
+
negotiate: () => Promise<{
|
|
28
|
+
url: string;
|
|
29
|
+
accessToken: string;
|
|
30
|
+
}>;
|
|
31
|
+
/** TanStack React Query client — used to invalidate queries on data changes */
|
|
32
|
+
queryClient: QueryClientLike;
|
|
33
|
+
/**
|
|
34
|
+
* Map of table route names to arrays of query key prefixes to invalidate.
|
|
35
|
+
* Defaults cover common tables; extend or override for your app.
|
|
36
|
+
*/
|
|
37
|
+
tableQueryKeys?: Record<string, readonly (readonly unknown[])[]>;
|
|
38
|
+
/** Optional callback invoked for every data change event */
|
|
39
|
+
onEvent?: (event: DataChangeEvent) => void;
|
|
40
|
+
/** Set to false to disable the connection (default: true) */
|
|
41
|
+
enabled?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/** State returned by the useRealtime hook */
|
|
44
|
+
export interface RealtimeState {
|
|
45
|
+
/** Whether the SignalR connection is currently active */
|
|
46
|
+
connected: boolean;
|
|
47
|
+
/** Last connection error message, if any */
|
|
48
|
+
error: string | null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* React hook that connects to Azure SignalR and invalidates queries
|
|
52
|
+
* when data changes are broadcast by the API.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```tsx
|
|
56
|
+
* const realtime = useRealtime({
|
|
57
|
+
* negotiate: () => client.negotiate(),
|
|
58
|
+
* queryClient,
|
|
59
|
+
* });
|
|
60
|
+
* // realtime.connected — boolean
|
|
61
|
+
* // realtime.error — string | null
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare function useRealtime(options: RealtimeOptions): RealtimeState;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=realtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8EAA8E;AAC9E,UAAU,eAAe;IACvB,iBAAiB,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E;AAED,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,mFAAmF;IACnF,SAAS,EAAE,MAAM,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,+EAA+E;IAC/E,WAAW,EAAE,eAAe,CAAC;IAC7B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACjE,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3C,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAaD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CA+GnE"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for real-time notifications via Azure SignalR Service.
|
|
3
|
+
*
|
|
4
|
+
* Connects to SignalR using the negotiate endpoint from the API,
|
|
5
|
+
* listens for data change events, and automatically invalidates
|
|
6
|
+
* TanStack React Query caches so the UI stays fresh.
|
|
7
|
+
*
|
|
8
|
+
* Requires peer dependencies: @microsoft/signalr, @tanstack/react-query, react
|
|
9
|
+
*/
|
|
10
|
+
import { useState, useEffect, useRef } from "react";
|
|
11
|
+
/** Default mapping from table route names to React Query key prefixes */
|
|
12
|
+
const DEFAULT_TABLE_QUERY_KEYS = {
|
|
13
|
+
case: [["cases"], ["aggStats"]],
|
|
14
|
+
casenotes: [["caseNotes"]],
|
|
15
|
+
caseactivities: [["caseActivities"]],
|
|
16
|
+
caseemails: [["caseActivities"]],
|
|
17
|
+
casephonecalls: [["caseActivities"]],
|
|
18
|
+
casetasks: [["caseActivities"]],
|
|
19
|
+
caseappointments: [["caseActivities"]],
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* React hook that connects to Azure SignalR and invalidates queries
|
|
23
|
+
* when data changes are broadcast by the API.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* const realtime = useRealtime({
|
|
28
|
+
* negotiate: () => client.negotiate(),
|
|
29
|
+
* queryClient,
|
|
30
|
+
* });
|
|
31
|
+
* // realtime.connected — boolean
|
|
32
|
+
* // realtime.error — string | null
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export function useRealtime(options) {
|
|
36
|
+
const { negotiate, queryClient, tableQueryKeys, onEvent, enabled = true, } = options;
|
|
37
|
+
const [connected, setConnected] = useState(false);
|
|
38
|
+
const [error, setError] = useState(null);
|
|
39
|
+
// Use refs for callbacks to avoid reconnecting when they change
|
|
40
|
+
const onEventRef = useRef(onEvent);
|
|
41
|
+
onEventRef.current = onEvent;
|
|
42
|
+
const queryClientRef = useRef(queryClient);
|
|
43
|
+
queryClientRef.current = queryClient;
|
|
44
|
+
const tableQueryKeysRef = useRef(tableQueryKeys);
|
|
45
|
+
tableQueryKeysRef.current = tableQueryKeys;
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (!enabled) {
|
|
48
|
+
setConnected(false);
|
|
49
|
+
setError(null);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
let stopped = false;
|
|
53
|
+
let connection = null;
|
|
54
|
+
async function connect() {
|
|
55
|
+
try {
|
|
56
|
+
// Dynamic import — @microsoft/signalr is a peer dependency
|
|
57
|
+
const signalR = await import("@microsoft/signalr");
|
|
58
|
+
if (stopped)
|
|
59
|
+
return;
|
|
60
|
+
const { url, accessToken } = await negotiate();
|
|
61
|
+
if (stopped)
|
|
62
|
+
return;
|
|
63
|
+
const conn = new signalR.HubConnectionBuilder()
|
|
64
|
+
.withUrl(url, {
|
|
65
|
+
accessTokenFactory: () => accessToken,
|
|
66
|
+
})
|
|
67
|
+
.withAutomaticReconnect([0, 2000, 5000, 10000, 30000])
|
|
68
|
+
.configureLogging(signalR.LogLevel.Warning)
|
|
69
|
+
.build();
|
|
70
|
+
conn.onreconnecting(() => {
|
|
71
|
+
if (!stopped)
|
|
72
|
+
setConnected(false);
|
|
73
|
+
});
|
|
74
|
+
conn.onreconnected(() => {
|
|
75
|
+
if (!stopped) {
|
|
76
|
+
setConnected(true);
|
|
77
|
+
setError(null);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
conn.onclose((err) => {
|
|
81
|
+
if (!stopped) {
|
|
82
|
+
setConnected(false);
|
|
83
|
+
if (err)
|
|
84
|
+
setError(err.message);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
conn.on("dataChanged", (event) => {
|
|
88
|
+
if (stopped)
|
|
89
|
+
return;
|
|
90
|
+
// Notify callback
|
|
91
|
+
onEventRef.current?.(event);
|
|
92
|
+
// Invalidate matching query keys
|
|
93
|
+
const mapping = tableQueryKeysRef.current ?? DEFAULT_TABLE_QUERY_KEYS;
|
|
94
|
+
const keys = mapping[event.table];
|
|
95
|
+
if (keys) {
|
|
96
|
+
for (const queryKey of keys) {
|
|
97
|
+
queryClientRef.current.invalidateQueries({ queryKey });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
await conn.start();
|
|
102
|
+
connection = conn;
|
|
103
|
+
if (!stopped) {
|
|
104
|
+
setConnected(true);
|
|
105
|
+
setError(null);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Cleanup was called while connecting
|
|
109
|
+
conn.stop();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
if (!stopped) {
|
|
114
|
+
const message = err instanceof Error ? err.message : "Failed to connect to real-time notifications";
|
|
115
|
+
setError(message);
|
|
116
|
+
setConnected(false);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
connect();
|
|
121
|
+
return () => {
|
|
122
|
+
stopped = true;
|
|
123
|
+
setConnected(false);
|
|
124
|
+
connection?.stop();
|
|
125
|
+
};
|
|
126
|
+
}, [negotiate, enabled]);
|
|
127
|
+
return { connected, error };
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=realtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime.js","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}
|
package/sdk/dist/types.d.ts
CHANGED
|
@@ -23,6 +23,24 @@ export interface QueryOptions {
|
|
|
23
23
|
filterLogic?: "and" | "or";
|
|
24
24
|
/** Expand related lookup fields, e.g. "primarycontactid(contactid,fullname)" */
|
|
25
25
|
expand?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Activity subtype for polymorphic tables (e.g. caseactivities, contactactivities).
|
|
28
|
+
* Use "phonecall", "email", "task", "appointment", etc. to filter by type.
|
|
29
|
+
* Use "all" to list all types. Each record includes a `_link` field.
|
|
30
|
+
*/
|
|
31
|
+
subtype?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Quick filter on record creation date (createdon).
|
|
34
|
+
* Named periods: today, yesterday, thisweek, lastweek, thismonth, lastmonth, thisyear.
|
|
35
|
+
* Relative durations: 1h, 24h, 7d, 30d, 90d.
|
|
36
|
+
* Date ranges: "2026-01-01..2026-02-01", "2026-01-01..", "..2026-02-01".
|
|
37
|
+
*/
|
|
38
|
+
created?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Quick filter on record last-modified date (modifiedon).
|
|
41
|
+
* Same formats as `created`.
|
|
42
|
+
*/
|
|
43
|
+
modified?: string;
|
|
26
44
|
}
|
|
27
45
|
/** Query options for lookup endpoints (summary data only — no sensitive fields) */
|
|
28
46
|
export interface LookupOptions extends QueryOptions {
|
|
@@ -136,6 +154,10 @@ export interface AggregateOptions {
|
|
|
136
154
|
filter?: string | string[];
|
|
137
155
|
/** Logic to combine multiple filters: "and" (default) or "or" */
|
|
138
156
|
filterLogic?: "and" | "or";
|
|
157
|
+
/** Quick filter on creation date (same formats as QueryOptions.created) */
|
|
158
|
+
created?: string;
|
|
159
|
+
/** Quick filter on last-modified date (same formats as QueryOptions.modified) */
|
|
160
|
+
modified?: string;
|
|
139
161
|
}
|
|
140
162
|
/** Non-paginated aggregate response */
|
|
141
163
|
export interface AggregateResponse<T = Record<string, unknown>> {
|
package/sdk/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,iEAAiE;IACjE,WAAW,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|