bdsa-react-components 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CURSOR_INTEGRATION.md +95 -2
- package/dist/components/AnnotationManager/AnnotationManager.d.ts +24 -0
- package/dist/components/AnnotationManager/AnnotationManager.d.ts.map +1 -1
- package/dist/index.cjs +16 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5120 -5113
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CURSOR_INTEGRATION.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# bdsa-react-components - CURSOR Integration Guide
|
|
2
2
|
|
|
3
|
-
**Version:** 0.1.
|
|
3
|
+
**Version:** 0.1.3 | **Generated:** 2025-11-01T22:49:22.223Z
|
|
4
4
|
|
|
5
5
|
> This document provides everything Cursor needs to integrate and use the bdsa-react-components library.
|
|
6
6
|
> Copy this entire document into your project's .cursorrules or docs folder.
|
|
@@ -217,7 +217,33 @@ const fetchWithAuth = async (url: string, options?: RequestInit) => {
|
|
|
217
217
|
/>
|
|
218
218
|
```
|
|
219
219
|
|
|
220
|
-
### 2. SlideViewer with API-Fetched Annotations
|
|
220
|
+
### 2. SlideViewer with API-Fetched Annotations (RECOMMENDED)
|
|
221
|
+
|
|
222
|
+
**Recommended approach:** Use `onLoadedAnnotationIdsChange` to sync annotation state:
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
const [annotationIds, setAnnotationIds] = useState<string[]>([])
|
|
226
|
+
const imageId = '6903df8dd26a6d93de19a9b2'
|
|
227
|
+
|
|
228
|
+
<>
|
|
229
|
+
<AnnotationManager
|
|
230
|
+
imageId={imageId}
|
|
231
|
+
apiBaseUrl="http://bdsa.pathology.emory.edu:8080/api/v1"
|
|
232
|
+
onLoadedAnnotationIdsChange={(ids) => {
|
|
233
|
+
// Automatically syncs when user loads/unloads annotations
|
|
234
|
+
setAnnotationIds(ids)
|
|
235
|
+
}}
|
|
236
|
+
/>
|
|
237
|
+
<SlideViewer
|
|
238
|
+
imageInfo={{ dziUrl: `.../item/${imageId}/tiles/dzi.dzi` }}
|
|
239
|
+
annotationIds={annotationIds}
|
|
240
|
+
apiBaseUrl="http://bdsa.pathology.emory.edu:8080/api/v1"
|
|
241
|
+
height="800px"
|
|
242
|
+
/>
|
|
243
|
+
</>
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Alternative (legacy):** Using `onAnnotationsLoaded` - requires manual ID extraction:
|
|
221
247
|
|
|
222
248
|
```tsx
|
|
223
249
|
const [annotationIds, setAnnotationIds] = useState<string[]>([])
|
|
@@ -238,6 +264,12 @@ const imageId = '6903df8dd26a6d93de19a9b2'
|
|
|
238
264
|
</>
|
|
239
265
|
```
|
|
240
266
|
|
|
267
|
+
**Additional callbacks available:**
|
|
268
|
+
|
|
269
|
+
- `onAnnotationLoad(id, data?)` - Fires when an annotation is loaded
|
|
270
|
+
- `onAnnotationHide(id)` - Fires when an annotation is hidden/unloaded
|
|
271
|
+
- `onAnnotationOpacityChange(id, opacity)` - Fires when opacity changes
|
|
272
|
+
|
|
241
273
|
### 3. FolderBrowser
|
|
242
274
|
|
|
243
275
|
```tsx
|
|
@@ -279,6 +311,67 @@ const imageId = '6903df8dd26a6d93de19a9b2'
|
|
|
279
311
|
- Ensure `dist/index.d.ts` exists in the library
|
|
280
312
|
- Restart TypeScript server in your editor (VS Code: Cmd+Shift+P → "TypeScript: Restart TS Server")
|
|
281
313
|
|
|
314
|
+
## Annotation Caching
|
|
315
|
+
|
|
316
|
+
The library includes automatic IndexedDB-based caching for annotation documents to speed up loading and reduce server requests.
|
|
317
|
+
|
|
318
|
+
### Auto-Enabled Caching
|
|
319
|
+
|
|
320
|
+
Both `AnnotationManager` and `SlideViewer` automatically create and use an `IndexedDBAnnotationCache` instance by default. This provides:
|
|
321
|
+
|
|
322
|
+
- **Persistent caching** across page refreshes (uses IndexedDB, 50MB+ capacity)
|
|
323
|
+
- **Automatic cache validation** using version hashes from annotation headers
|
|
324
|
+
- **Per-annotation cache indicators** (database icon) when cached
|
|
325
|
+
- **Per-annotation cache bypass** (refresh icon) to clear and reload specific annotations
|
|
326
|
+
|
|
327
|
+
### Disabling Cache
|
|
328
|
+
|
|
329
|
+
To disable caching globally for debugging:
|
|
330
|
+
|
|
331
|
+
```tsx
|
|
332
|
+
<AnnotationManager
|
|
333
|
+
imageId="..."
|
|
334
|
+
apiBaseUrl="..."
|
|
335
|
+
disableCache={true} // Disables all caching
|
|
336
|
+
/>
|
|
337
|
+
<SlideViewer
|
|
338
|
+
annotationIds={[...]}
|
|
339
|
+
disableCache={true} // Disables all caching
|
|
340
|
+
/>
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Cache Implementation
|
|
344
|
+
|
|
345
|
+
```tsx
|
|
346
|
+
import { IndexedDBAnnotationCache, MemoryAnnotationCache } from 'bdsa-react-components'
|
|
347
|
+
|
|
348
|
+
// Use a specific cache implementation (optional)
|
|
349
|
+
const cache = new IndexedDBAnnotationCache()
|
|
350
|
+
<AnnotationManager annotationCache={cache} ... />
|
|
351
|
+
<SlideViewer annotationCache={cache} ... />
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Cache Utilities
|
|
355
|
+
|
|
356
|
+
```tsx
|
|
357
|
+
import { checkIndexedDBQuota, requestPersistentStorage, logQuotaInfo } from 'bdsa-react-components'
|
|
358
|
+
|
|
359
|
+
// Check cache quota and usage
|
|
360
|
+
const quotaInfo = await checkIndexedDBQuota()
|
|
361
|
+
if (quotaInfo) {
|
|
362
|
+
console.log(`Usage: ${quotaInfo.usagePercent.toFixed(1)}%`)
|
|
363
|
+
console.log(`Available: ${quotaInfo.available} bytes`)
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Request persistent storage (prevents browser cleanup)
|
|
367
|
+
await requestPersistentStorage()
|
|
368
|
+
|
|
369
|
+
// Log quota info in readable format
|
|
370
|
+
await logQuotaInfo()
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
**Note:** IndexedDB storage limits are automatically managed by the browser. When quota is exceeded, the browser will prompt the user for permission to expand storage.
|
|
374
|
+
|
|
282
375
|
## Dependencies
|
|
283
376
|
|
|
284
377
|
**Peer:** react ^18.0.0, react-dom ^18.0.0
|
|
@@ -47,6 +47,30 @@ export interface AnnotationManagerProps {
|
|
|
47
47
|
onAnnotationOpacityChange?: (annotationId: string, opacity: number) => void;
|
|
48
48
|
/** Callback when annotation has finished loading and is ready (called by SlideViewer after rendering) */
|
|
49
49
|
onAnnotationReady?: (annotationId: string) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Callback fired whenever the list of loaded annotation IDs changes.
|
|
52
|
+
* This is called when:
|
|
53
|
+
* - User clicks "Load" on an annotation
|
|
54
|
+
* - User clicks "Hide" on an annotation
|
|
55
|
+
* - Annotations are unloaded
|
|
56
|
+
*
|
|
57
|
+
* @param annotationIds - Array of currently loaded annotation IDs
|
|
58
|
+
*/
|
|
59
|
+
onLoadedAnnotationIdsChange?: (annotationIds: string[]) => void;
|
|
60
|
+
/**
|
|
61
|
+
* Callback fired when an individual annotation is loaded.
|
|
62
|
+
* Useful for tracking which specific annotation was just loaded.
|
|
63
|
+
*
|
|
64
|
+
* @param annotationId - The ID of the annotation that was loaded
|
|
65
|
+
* @param annotationData - The full annotation document (optional, for performance)
|
|
66
|
+
*/
|
|
67
|
+
onAnnotationLoad?: (annotationId: string, annotationData?: unknown) => void;
|
|
68
|
+
/**
|
|
69
|
+
* Callback fired when an individual annotation is hidden/unloaded.
|
|
70
|
+
*
|
|
71
|
+
* @param annotationId - The ID of the annotation that was hidden
|
|
72
|
+
*/
|
|
73
|
+
onAnnotationHide?: (annotationId: string) => void;
|
|
50
74
|
/** Map of annotation IDs to their loaded state */
|
|
51
75
|
loadedAnnotations?: Set<string>;
|
|
52
76
|
/** Map of annotation IDs to their visibility state */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnotationManager.d.ts","sourceRoot":"","sources":["../../../src/components/AnnotationManager/AnnotationManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAEhF,OAAO,yBAAyB,CAAA;AAEhC,MAAM,WAAW,sBAAsB;IACnC,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;IAC1B,UAAU,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACpC,CAAA;IACD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,sBAAsB;IACnC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wFAAwF;IACxF,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnE,mGAAmG;IACnG,UAAU,CAAC,EAAE,WAAW,CAAA;IACxB,2CAA2C;IAC3C,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,sBAAsB,EAAE,KAAK,IAAI,CAAA;IACrE,6CAA6C;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,oFAAoF;IACpF,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,kDAAkD;IAClD,sBAAsB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IACxE,qDAAqD;IACrD,4BAA4B,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/E,+CAA+C;IAC/C,yBAAyB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3E,yGAAyG;IACzG,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAClD,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,sDAAsD;IACtD,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,mDAAmD;IACnD,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC;sHACkH;IAClH,eAAe,CAAC,EAAE;QACd,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAC1E,MAAM,CAAC,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KACxD,GAAG,IAAI,CAAA;IACR,gIAAgI;IAChI,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,wFAAwF;IACxF,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,OAAO,EAAE;QACpC,WAAW,EAAE,sBAAsB,EAAE,CAAA;QACrC,OAAO,EAAE,OAAO,CAAA;QAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;QACnB,aAAa,EAAE,MAAM,EAAE,CAAA;QACvB,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QAC9B,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACxC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACxC,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;QAC1C,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;QAChD,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;QAC3D,iBAAiB,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAA;KAC7D,KAAK,KAAK,CAAC,SAAS,CAAC,CAAA;CACzB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,+
|
|
1
|
+
{"version":3,"file":"AnnotationManager.d.ts","sourceRoot":"","sources":["../../../src/components/AnnotationManager/AnnotationManager.tsx"],"names":[],"mappings":"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"}
|