bdsa-react-components 0.1.2 → 0.1.4

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.
@@ -1,6 +1,6 @@
1
1
  # bdsa-react-components - CURSOR Integration Guide
2
2
 
3
- **Version:** 0.1.2 | **Generated:** 2025-11-01T20:15:49.818Z
3
+ **Version:** 0.1.4 | **Generated:** 2025-11-02T18:53:09.742Z
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,77 @@ 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 `onAnnotationStateChange` - unified callback with complete state sync:
223
+
224
+ ```tsx
225
+ // Unified state - single state object for all annotation state
226
+ const [annotationState, setAnnotationState] = useState({
227
+ loadedIds: [] as string[],
228
+ opacities: new Map<string, number>(),
229
+ visibility: new Map<string, boolean>(),
230
+ })
231
+
232
+ const imageId = '6903df8dd26a6d93de19a9b2'
233
+
234
+ <>
235
+ <AnnotationManager
236
+ imageId={imageId}
237
+ apiBaseUrl="http://bdsa.pathology.emory.edu:8080/api/v1"
238
+ onAnnotationStateChange={(state) => {
239
+ // Single callback fires for all state changes (load, opacity, visibility)
240
+ // 70% less boilerplate than individual callbacks!
241
+ setAnnotationState({
242
+ loadedIds: state.loadedAnnotationIds,
243
+ opacities: state.opacities,
244
+ visibility: state.visibility,
245
+ })
246
+ }}
247
+ onAnnotationReady={(id) => {
248
+ // Shared handler - both components can use this
249
+ console.log('Annotation ready:', id)
250
+ }}
251
+ />
252
+ <SlideViewer
253
+ imageInfo={{ dziUrl: `.../item/${imageId}/tiles/dzi.dzi` }}
254
+ annotationIds={annotationState.loadedIds}
255
+ annotationOpacities={annotationState.opacities}
256
+ visibleAnnotations={annotationState.visibility}
257
+ apiBaseUrl="http://bdsa.pathology.emory.edu:8080/api/v1"
258
+ onAnnotationReady={(id) => console.log('Annotation ready:', id)}
259
+ height="800px"
260
+ />
261
+ </>
262
+ ```
263
+
264
+ **Alternative approach:** Using individual callbacks - more verbose but still supported:
265
+
266
+ ```tsx
267
+ const [annotationIds, setAnnotationIds] = useState<string[]>([])
268
+ const [opacities, setOpacities] = useState(new Map<string, number>())
269
+ const imageId = '6903df8dd26a6d93de19a9b2'
270
+
271
+ <>
272
+ <AnnotationManager
273
+ imageId={imageId}
274
+ apiBaseUrl="http://bdsa.pathology.emory.edu:8080/api/v1"
275
+ onLoadedAnnotationIdsChange={(ids) => setAnnotationIds(ids)}
276
+ onAnnotationOpacityChange={(id, opacity) => {
277
+ setOpacities(prev => new Map(prev).set(id, opacity))
278
+ }}
279
+ />
280
+ <SlideViewer
281
+ imageInfo={{ dziUrl: `.../item/${imageId}/tiles/dzi.dzi` }}
282
+ annotationIds={annotationIds}
283
+ annotationOpacities={opacities}
284
+ apiBaseUrl="http://bdsa.pathology.emory.edu:8080/api/v1"
285
+ height="800px"
286
+ />
287
+ </>
288
+ ```
289
+
290
+ **Legacy approach:** Using `onAnnotationsLoaded` - requires manual ID extraction:
221
291
 
222
292
  ```tsx
223
293
  const [annotationIds, setAnnotationIds] = useState<string[]>([])
@@ -238,6 +308,12 @@ const imageId = '6903df8dd26a6d93de19a9b2'
238
308
  </>
239
309
  ```
240
310
 
311
+ **Additional callbacks available (legacy - prefer `onAnnotationStateChange` for new code):**
312
+
313
+ - `onAnnotationLoad(id, data?)` - Fires when an annotation is loaded
314
+ - `onAnnotationHide(id)` - Fires when an annotation is hidden/unloaded
315
+ - `onAnnotationOpacityChange(id, opacity)` - Fires when opacity changes
316
+
241
317
  ### 3. FolderBrowser
242
318
 
243
319
  ```tsx
@@ -279,6 +355,67 @@ const imageId = '6903df8dd26a6d93de19a9b2'
279
355
  - Ensure `dist/index.d.ts` exists in the library
280
356
  - Restart TypeScript server in your editor (VS Code: Cmd+Shift+P → "TypeScript: Restart TS Server")
281
357
 
358
+ ## Annotation Caching
359
+
360
+ The library includes automatic IndexedDB-based caching for annotation documents to speed up loading and reduce server requests.
361
+
362
+ ### Auto-Enabled Caching
363
+
364
+ Both `AnnotationManager` and `SlideViewer` automatically create and use an `IndexedDBAnnotationCache` instance by default. This provides:
365
+
366
+ - **Persistent caching** across page refreshes (uses IndexedDB, 50MB+ capacity)
367
+ - **Automatic cache validation** using version hashes from annotation headers
368
+ - **Per-annotation cache indicators** (database icon) when cached
369
+ - **Per-annotation cache bypass** (refresh icon) to clear and reload specific annotations
370
+
371
+ ### Disabling Cache
372
+
373
+ To disable caching globally for debugging:
374
+
375
+ ```tsx
376
+ <AnnotationManager
377
+ imageId="..."
378
+ apiBaseUrl="..."
379
+ disableCache={true} // Disables all caching
380
+ />
381
+ <SlideViewer
382
+ annotationIds={[...]}
383
+ disableCache={true} // Disables all caching
384
+ />
385
+ ```
386
+
387
+ ### Cache Implementation
388
+
389
+ ```tsx
390
+ import { IndexedDBAnnotationCache, MemoryAnnotationCache } from 'bdsa-react-components'
391
+
392
+ // Use a specific cache implementation (optional)
393
+ const cache = new IndexedDBAnnotationCache()
394
+ <AnnotationManager annotationCache={cache} ... />
395
+ <SlideViewer annotationCache={cache} ... />
396
+ ```
397
+
398
+ ### Cache Utilities
399
+
400
+ ```tsx
401
+ import { checkIndexedDBQuota, requestPersistentStorage, logQuotaInfo } from 'bdsa-react-components'
402
+
403
+ // Check cache quota and usage
404
+ const quotaInfo = await checkIndexedDBQuota()
405
+ if (quotaInfo) {
406
+ console.log(`Usage: ${quotaInfo.usagePercent.toFixed(1)}%`)
407
+ console.log(`Available: ${quotaInfo.available} bytes`)
408
+ }
409
+
410
+ // Request persistent storage (prevents browser cleanup)
411
+ await requestPersistentStorage()
412
+
413
+ // Log quota info in readable format
414
+ await logQuotaInfo()
415
+ ```
416
+
417
+ **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.
418
+
282
419
  ## Dependencies
283
420
 
284
421
  **Peer:** react ^18.0.0, react-dom ^18.0.0
@@ -47,6 +47,60 @@ 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;
74
+ /**
75
+ * Callback fired whenever annotation state changes.
76
+ * Provides complete state snapshot - annotation IDs, opacities, visibility, etc.
77
+ * This is the primary way to sync with SlideViewer and eliminates the need for
78
+ * multiple individual callbacks.
79
+ *
80
+ * This callback fires whenever:
81
+ * - An annotation is loaded/unloaded
82
+ * - Annotation opacity changes
83
+ * - Annotation visibility changes
84
+ *
85
+ * @param state - Complete annotation state snapshot
86
+ */
87
+ onAnnotationStateChange?: (state: {
88
+ /** Array of currently loaded annotation IDs */
89
+ loadedAnnotationIds: string[];
90
+ /** Map of annotation ID -> opacity (0.0 to 1.0) */
91
+ opacities: Map<string, number>;
92
+ /** Map of annotation ID -> visibility (true = visible, false = hidden) */
93
+ visibility: Map<string, boolean>;
94
+ }) => void;
95
+ /**
96
+ * Callback fired whenever any annotation opacity changes.
97
+ * Provides complete map of all opacities - convenience alternative to individual callbacks.
98
+ *
99
+ * This is a convenience callback. For complete state sync, use `onAnnotationStateChange` instead.
100
+ *
101
+ * @param opacities - Map of all annotation ID -> opacity values
102
+ */
103
+ onAnnotationOpacitiesChange?: (opacities: Map<string, number>) => void;
50
104
  /** Map of annotation IDs to their loaded state */
51
105
  loadedAnnotations?: Set<string>;
52
106
  /** 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":"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"}
1
+ {"version":3,"file":"AnnotationManager.d.ts","sourceRoot":"","sources":["../../../src/components/AnnotationManager/AnnotationManager.tsx"],"names":[],"mappings":"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"}