bdsa-react-components 0.1.21 → 0.1.25

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 (74) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/CURSOR_INTEGRATION.md +25 -3
  3. package/INTEGRATION.md +0 -0
  4. package/README.md +0 -0
  5. package/dist/auth/DsaAuthProvider.d.ts +92 -0
  6. package/dist/auth/DsaAuthProvider.d.ts.map +1 -0
  7. package/dist/auth/DsaAuthStore.d.ts +5 -0
  8. package/dist/auth/DsaAuthStore.d.ts.map +1 -1
  9. package/dist/auth/index.d.ts +3 -1
  10. package/dist/auth/index.d.ts.map +1 -1
  11. package/dist/auth/types.d.ts +43 -0
  12. package/dist/auth/types.d.ts.map +1 -1
  13. package/dist/bdsa-schema.json +896 -0
  14. package/dist/components/DsaAuthManager/DsaAuthManager.d.ts +49 -4
  15. package/dist/components/DsaAuthManager/DsaAuthManager.d.ts.map +1 -1
  16. package/dist/components/DsaErrorBoundary/DsaErrorBoundary.d.ts +73 -0
  17. package/dist/components/DsaErrorBoundary/DsaErrorBoundary.d.ts.map +1 -0
  18. package/dist/components/DsaErrorBoundary/index.d.ts +3 -0
  19. package/dist/components/DsaErrorBoundary/index.d.ts.map +1 -0
  20. package/dist/components/FolderBrowser/FolderBrowser.d.ts.map +1 -1
  21. package/dist/components/FolderBrowser/FolderBrowser.types.d.ts +139 -2
  22. package/dist/components/FolderBrowser/FolderBrowser.types.d.ts.map +1 -1
  23. package/dist/components/FolderBrowser/useFolderBrowserDataFetching.d.ts +2 -0
  24. package/dist/components/FolderBrowser/useFolderBrowserDataFetching.d.ts.map +1 -1
  25. package/dist/components/FolderThumbnailBrowser/FolderThumbnailBrowser.d.ts +30 -0
  26. package/dist/components/FolderThumbnailBrowser/FolderThumbnailBrowser.d.ts.map +1 -1
  27. package/dist/components/ProtocolManager/ProtocolCard.d.ts +8 -0
  28. package/dist/components/ProtocolManager/ProtocolCard.d.ts.map +1 -0
  29. package/dist/components/ProtocolManager/ProtocolContext.d.ts +46 -0
  30. package/dist/components/ProtocolManager/ProtocolContext.d.ts.map +1 -0
  31. package/dist/components/ProtocolManager/ProtocolList.d.ts +8 -0
  32. package/dist/components/ProtocolManager/ProtocolList.d.ts.map +1 -0
  33. package/dist/components/ProtocolManager/ProtocolManager.d.ts +38 -0
  34. package/dist/components/ProtocolManager/ProtocolManager.d.ts.map +1 -0
  35. package/dist/components/ProtocolManager/ProtocolManager.types.d.ts +139 -0
  36. package/dist/components/ProtocolManager/ProtocolManager.types.d.ts.map +1 -0
  37. package/dist/components/ProtocolManager/ProtocolModal.d.ts +10 -0
  38. package/dist/components/ProtocolManager/ProtocolModal.d.ts.map +1 -0
  39. package/dist/components/ProtocolManager/ProtocolsTab.d.ts +10 -0
  40. package/dist/components/ProtocolManager/ProtocolsTab.d.ts.map +1 -0
  41. package/dist/components/ProtocolManager/adapters/DsaSyncAdapter.d.ts +76 -0
  42. package/dist/components/ProtocolManager/adapters/DsaSyncAdapter.d.ts.map +1 -0
  43. package/dist/components/ProtocolManager/storage/protocolStorage.d.ts +39 -0
  44. package/dist/components/ProtocolManager/storage/protocolStorage.d.ts.map +1 -0
  45. package/dist/components/ProtocolManager/testData.d.ts +23 -0
  46. package/dist/components/ProtocolManager/testData.d.ts.map +1 -0
  47. package/dist/components/ProtocolManager/utils/schemaValidator.d.ts +99 -0
  48. package/dist/components/ProtocolManager/utils/schemaValidator.d.ts.map +1 -0
  49. package/dist/components/SlideViewer/SlideViewer.d.ts +1 -1
  50. package/dist/components/SlideViewer/SlideViewer.d.ts.map +1 -1
  51. package/dist/components/SlideViewer/SlideViewer.types.d.ts +254 -21
  52. package/dist/components/SlideViewer/SlideViewer.types.d.ts.map +1 -1
  53. package/dist/components/SlideViewer/hooks/index.d.ts +2 -0
  54. package/dist/components/SlideViewer/hooks/index.d.ts.map +1 -1
  55. package/dist/components/SlideViewer/hooks/useAnnotationFetching.d.ts +2 -1
  56. package/dist/components/SlideViewer/hooks/useAnnotationFetching.d.ts.map +1 -1
  57. package/dist/components/SlideViewer/hooks/useOverlayTileSources.d.ts +9 -0
  58. package/dist/components/SlideViewer/hooks/useOverlayTileSources.d.ts.map +1 -0
  59. package/dist/components/SlideViewer/hooks/useViewportChange.d.ts +14 -0
  60. package/dist/components/SlideViewer/hooks/useViewportChange.d.ts.map +1 -0
  61. package/dist/components/ThumbnailGrid/ThumbnailGrid.d.ts +30 -0
  62. package/dist/components/ThumbnailGrid/ThumbnailGrid.d.ts.map +1 -1
  63. package/dist/index.cjs +55 -41
  64. package/dist/index.cjs.map +1 -1
  65. package/dist/index.d.ts +15 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +19916 -17906
  68. package/dist/index.js.map +1 -1
  69. package/dist/style.css +1 -1
  70. package/dist/utils/apiErrorHandling.d.ts +44 -0
  71. package/dist/utils/apiErrorHandling.d.ts.map +1 -0
  72. package/dist/utils/patchOsdPaperjs.d.ts.map +1 -1
  73. package/package.json +3 -3
  74. package/patches/osd-paperjs-annotation+0.4.14.patch +0 -0
@@ -2,19 +2,64 @@ import { default as React } from 'react';
2
2
 
3
3
  export interface DsaAuthManagerProps {
4
4
  /**
5
- * Callback when authentication status changes
5
+ * Callback function that fires whenever the authentication status changes.
6
+ *
7
+ * @param isAuthenticated - `true` if user is logged in, `false` otherwise
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * <DsaAuthManager
12
+ * onAuthChange={(isAuthenticated) => {
13
+ * console.log('Auth status:', isAuthenticated)
14
+ * // Update your app state, redirect, etc.
15
+ * }}
16
+ * />
17
+ * ```
6
18
  */
7
19
  onAuthChange?: (isAuthenticated: boolean) => void;
8
20
  /**
9
- * Show server URL configuration in login modal
21
+ * Whether to show server URL configuration in the login modal.
22
+ *
23
+ * - `true` (default): Users can enter/change the DSA server URL
24
+ * - `false`: Server URL is locked (must be configured programmatically via `dsaAuthStore`)
25
+ *
26
+ * @default true
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * // Allow users to configure server
31
+ * <DsaAuthManager allowServerConfig={true} />
32
+ *
33
+ * // Lock server URL (pre-configured)
34
+ * <DsaAuthManager allowServerConfig={false} />
35
+ * ```
10
36
  */
11
37
  allowServerConfig?: boolean;
12
38
  /**
13
- * Custom class name for the container
39
+ * Custom CSS class name to apply to the component container.
40
+ * Useful for styling integration with your application.
41
+ *
42
+ * @example
43
+ * ```tsx
44
+ * <DsaAuthManager className="my-custom-auth-manager" />
45
+ * ```
14
46
  */
15
47
  className?: string;
16
48
  /**
17
- * Show compact version (minimal UI)
49
+ * Show compact version of the component (minimal UI).
50
+ * Ideal for toolbars, headers, or space-constrained layouts.
51
+ *
52
+ * Compact mode shows:
53
+ * - Status indicator icon
54
+ * - User name (if authenticated)
55
+ * - Login/Logout button
56
+ *
57
+ * @default false
58
+ *
59
+ * @example
60
+ * ```tsx
61
+ * <DsaAuthManager compact={true} />
62
+ * ```
18
63
  */
19
64
  compact?: boolean;
20
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DsaAuthManager.d.ts","sourceRoot":"","sources":["../../../src/components/DsaAuthManager/DsaAuthManager.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,sBAAsB,CAAA;AAE7B,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,eAAe,EAAE,OAAO,KAAK,IAAI,CAAA;IACjD;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAmJxD,CAAA;AAwGD,eAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"DsaAuthManager.d.ts","sourceRoot":"","sources":["../../../src/components/DsaAuthManager/DsaAuthManager.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiFG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,sBAAsB,CAAA;AAE7B,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;;;;;;;OAcG;IACH,YAAY,CAAC,EAAE,CAAC,eAAe,EAAE,OAAO,KAAK,IAAI,CAAA;IACjD;;;;;;;;;;;;;;;;OAgBG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAmJxD,CAAA;AAwGD,eAAe,cAAc,CAAA"}
@@ -0,0 +1,73 @@
1
+ import { default as React, Component, ReactNode } from 'react';
2
+
3
+ export interface DsaErrorBoundaryProps {
4
+ /** Child components to wrap */
5
+ children: ReactNode;
6
+ /** Custom fallback UI component. Receives error and reset function. */
7
+ fallback?: (error: Error, reset: () => void) => ReactNode;
8
+ /** Callback when an error is caught */
9
+ onError?: (error: Error, errorInfo: React.ErrorInfo) => void;
10
+ /** Whether to show a "Retry" button (default: true) */
11
+ showRetry?: boolean;
12
+ /** Custom error message title */
13
+ errorTitle?: string;
14
+ /** Custom error message description */
15
+ errorDescription?: string;
16
+ /** Custom CSS class */
17
+ className?: string;
18
+ }
19
+ interface DsaErrorBoundaryState {
20
+ hasError: boolean;
21
+ error: Error | null;
22
+ errorInfo: React.ErrorInfo | null;
23
+ }
24
+ /**
25
+ * Error Boundary component for catching and displaying React errors gracefully.
26
+ *
27
+ * This component catches JavaScript errors anywhere in the child component tree,
28
+ * logs those errors, and displays a fallback UI instead of crashing the entire app.
29
+ *
30
+ * @example Basic usage
31
+ * ```tsx
32
+ * <DsaErrorBoundary>
33
+ * <FolderBrowser apiBaseUrl={apiBaseUrl} />
34
+ * </DsaErrorBoundary>
35
+ * ```
36
+ *
37
+ * @example With custom fallback
38
+ * ```tsx
39
+ * <DsaErrorBoundary
40
+ * fallback={(error, reset) => (
41
+ * <div>
42
+ * <h2>Something went wrong</h2>
43
+ * <p>{error.message}</p>
44
+ * <button onClick={reset}>Try Again</button>
45
+ * </div>
46
+ * )}
47
+ * >
48
+ * <SlideViewer imageInfo={imageInfo} />
49
+ * </DsaErrorBoundary>
50
+ * ```
51
+ *
52
+ * @example With error callback
53
+ * ```tsx
54
+ * <DsaErrorBoundary
55
+ * onError={(error, errorInfo) => {
56
+ * // Log to error reporting service
57
+ * logErrorToService(error, errorInfo)
58
+ * }}
59
+ * >
60
+ * <ThumbnailGrid apiBaseUrl={apiBaseUrl} />
61
+ * </DsaErrorBoundary>
62
+ * ```
63
+ */
64
+ export declare class DsaErrorBoundary extends Component<DsaErrorBoundaryProps, DsaErrorBoundaryState> {
65
+ constructor(props: DsaErrorBoundaryProps);
66
+ static getDerivedStateFromError(error: Error): Partial<DsaErrorBoundaryState>;
67
+ componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void;
68
+ handleReset: () => void;
69
+ render(): string | number | boolean | Iterable<React.ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
70
+ private isApiError;
71
+ }
72
+ export {};
73
+ //# sourceMappingURL=DsaErrorBoundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DsaErrorBoundary.d.ts","sourceRoot":"","sources":["../../../src/components/DsaErrorBoundary/DsaErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAExD,OAAO,wBAAwB,CAAA;AAE/B,MAAM,WAAW,qBAAqB;IAClC,+BAA+B;IAC/B,QAAQ,EAAE,SAAS,CAAA;IACnB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,SAAS,CAAA;IACzD,uCAAuC;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAA;IAC5D,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uCAAuC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,UAAU,qBAAqB;IAC3B,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBAAa,gBAAiB,SAAQ,SAAS,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;gBAC7E,KAAK,EAAE,qBAAqB;IASxC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAQ7E,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;IAe1D,WAAW,aAMV;IAED,MAAM;IA2EN,OAAO,CAAC,UAAU;CAGrB"}
@@ -0,0 +1,3 @@
1
+ export { DsaErrorBoundary } from './DsaErrorBoundary';
2
+ export type { DsaErrorBoundaryProps } from './DsaErrorBoundary';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DsaErrorBoundary/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"FolderBrowser.d.ts","sourceRoot":"","sources":["../../../src/components/FolderBrowser/FolderBrowser.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAChF,OAAO,qBAAqB,CAAA;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAKnG,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAA;AAEtE;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,2FA+tBzB,CAAA"}
1
+ {"version":3,"file":"FolderBrowser.d.ts","sourceRoot":"","sources":["../../../src/components/FolderBrowser/FolderBrowser.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAChF,OAAO,qBAAqB,CAAA;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAKnG,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAA;AAEtE;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,2FAuvBzB,CAAA"}
@@ -1,35 +1,94 @@
1
+ import { ApiErrorHandler } from '../../utils/apiErrorHandling';
1
2
  import { default as React } from 'react';
3
+
4
+ /**
5
+ * Represents a DSA Collection - a top-level container for organizing folders and items.
6
+ * Collections are the root organizational unit in the DSA hierarchy.
7
+ */
2
8
  export interface Collection {
9
+ /** Unique identifier for the collection */
3
10
  _id: string;
11
+ /** Display name of the collection */
4
12
  name: string;
13
+ /** Optional description of the collection */
5
14
  description?: string;
15
+ /** Whether the collection is publicly accessible */
6
16
  public?: boolean;
17
+ /** ISO timestamp when the collection was created */
7
18
  created?: string;
19
+ /** ISO timestamp when the collection was last updated */
8
20
  updated?: string;
21
+ /** Additional properties that may be present on the collection */
9
22
  [key: string]: unknown;
10
23
  }
24
+ /**
25
+ * Represents a DSA Folder - a container within a collection or another folder.
26
+ * Folders can contain subfolders and items, creating a hierarchical structure.
27
+ */
11
28
  export interface Folder {
29
+ /** Unique identifier for the folder */
12
30
  _id: string;
31
+ /** Display name of the folder */
13
32
  name: string;
33
+ /** Optional description of the folder */
14
34
  description?: string;
35
+ /** Whether the folder is publicly accessible */
15
36
  public?: boolean;
37
+ /** ISO timestamp when the folder was created */
16
38
  created?: string;
39
+ /** ISO timestamp when the folder was last updated */
17
40
  updated?: string;
41
+ /** ID of the parent resource (collection or folder) */
18
42
  parentId?: string;
43
+ /** Type of the parent resource */
19
44
  parentType?: 'collection' | 'folder';
45
+ /** Additional properties that may be present on the folder */
20
46
  [key: string]: unknown;
21
47
  }
48
+ /**
49
+ * Represents a DSA Item - a file or document stored in the DSA.
50
+ * Items are the leaf nodes in the DSA hierarchy and cannot contain other resources.
51
+ */
22
52
  export interface Item {
53
+ /** Unique identifier for the item */
23
54
  _id: string;
55
+ /** Display name of the item */
24
56
  name: string;
57
+ /** Optional description of the item */
25
58
  description?: string;
59
+ /** ID of the folder containing this item */
26
60
  folderId?: string;
61
+ /** ID of the collection containing this item (if directly in a collection) */
27
62
  collectionId?: string;
63
+ /** Whether the item is publicly accessible */
28
64
  public?: boolean;
65
+ /** ISO timestamp when the item was created */
29
66
  created?: string;
67
+ /** ISO timestamp when the item was last updated */
30
68
  updated?: string;
69
+ /** Additional properties that may be present on the item */
31
70
  [key: string]: unknown;
32
71
  }
72
+ /**
73
+ * A discriminated union type representing any DSA resource (collection, folder, or item).
74
+ * The `type` field allows TypeScript to narrow the type correctly.
75
+ *
76
+ * @example
77
+ * ```tsx
78
+ * function handleResource(resource: Resource) {
79
+ * if (resource.type === 'collection') {
80
+ * // TypeScript knows resource is a Collection here
81
+ * console.log('Collection:', resource.name)
82
+ * } else if (resource.type === 'folder') {
83
+ * // TypeScript knows resource is a Folder here
84
+ * console.log('Folder:', resource.name)
85
+ * } else {
86
+ * // TypeScript knows resource is an Item here
87
+ * console.log('Item:', resource.name)
88
+ * }
89
+ * }
90
+ * ```
91
+ */
33
92
  export type Resource = (Collection | Folder | Item) & {
34
93
  type: 'collection' | 'folder' | 'item';
35
94
  };
@@ -48,9 +107,40 @@ export interface FolderBrowserProps {
48
107
  onSelectionChange?: (resource: Resource) => void;
49
108
  /** Whether to show collections (default: true) */
50
109
  showCollections?: boolean;
51
- /** Root collection or folder ID to start from (if provided, only shows that resource and its children) */
110
+ /**
111
+ * Root collection or folder ID to start from.
112
+ * When provided, the component will navigate directly to and display only this resource and its children.
113
+ * This is useful for:
114
+ * - Deep linking to a specific folder/collection
115
+ * - Starting at a default or "home" folder
116
+ * - Restricting the view to a specific subtree
117
+ *
118
+ * @example
119
+ * ```tsx
120
+ * <FolderBrowser
121
+ * apiBaseUrl="http://bdsa.pathology.emory.edu:8080/api/v1"
122
+ * rootId="695d6a148c871f3a02969b00"
123
+ * rootType="collection"
124
+ * />
125
+ * ```
126
+ */
52
127
  rootId?: string;
53
- /** Type of root resource (required if rootId is provided) */
128
+ /**
129
+ * Type of root resource. Required if `rootId` is provided.
130
+ *
131
+ * - `'collection'`: Start at a specific collection
132
+ * - `'folder'`: Start at a specific folder
133
+ *
134
+ * @example
135
+ * ```tsx
136
+ * <FolderBrowser
137
+ * apiBaseUrl="http://bdsa.pathology.emory.edu:8080/api/v1"
138
+ * rootId="695d6a148c871f3a02969b00"
139
+ * rootType="folder"
140
+ * onResourceSelect={(resource) => console.log('Selected:', resource)}
141
+ * />
142
+ * ```
143
+ */
54
144
  rootType?: 'collection' | 'folder';
55
145
  /** Collection ID to auto-expand on load */
56
146
  startCollectionId?: string;
@@ -82,12 +172,59 @@ export interface FolderBrowserProps {
82
172
  showItems?: boolean;
83
173
  /** Whether to fetch items (for counting) even if not displaying them (default: false) */
84
174
  fetchItems?: boolean;
175
+ /**
176
+ * Controls how item pagination works when there are more items than `itemsPerPage`.
177
+ *
178
+ * - `'manual'` (default): Show `+N` indicator (e.g., `+25` for 25 more items).
179
+ * Single click loads next page, double click loads all remaining items.
180
+ * - `'auto'`: Auto-load all items when folder expands (no manual pagination needed).
181
+ * - `'button'`: Show explicit "Load More Items" button instead of `+N` indicator.
182
+ *
183
+ * @example
184
+ * ```tsx
185
+ * <FolderBrowser
186
+ * apiBaseUrl={apiBaseUrl}
187
+ * showItems={true}
188
+ * itemsPerPage={50}
189
+ * itemPaginationMode="auto" // Auto-load all items
190
+ * />
191
+ * ```
192
+ */
193
+ itemPaginationMode?: 'manual' | 'auto' | 'button';
85
194
  /** Filter function for items (applied after fetching) */
86
195
  itemFilter?: (item: Item) => boolean;
87
196
  /** Callback when items are fetched for a folder */
88
197
  onItemsFetched?: (folderId: string, items: Item[]) => void;
89
198
  /** Whether to show item count next to folder names (default: false) */
90
199
  showItemCount?: boolean;
200
+ /**
201
+ * Callback when an API error occurs.
202
+ * Provides error details and a retry function for transient failures.
203
+ *
204
+ * @param error - The error that occurred
205
+ * @param retry - Function to retry the failed operation
206
+ * @param context - Additional context about the error (endpoint, operation type, etc.)
207
+ *
208
+ * @example
209
+ * ```tsx
210
+ * <FolderBrowser
211
+ * apiBaseUrl="http://bdsa.pathology.emory.edu:8080/api/v1"
212
+ * onApiError={(error, retry, context) => {
213
+ * if (error.status === 401) {
214
+ * // Token expired, refresh and retry
215
+ * refreshToken().then(() => retry())
216
+ * } else if (error.status === 503) {
217
+ * // Server temporarily unavailable, retry after delay
218
+ * setTimeout(() => retry(), 2000)
219
+ * } else {
220
+ * // Show error to user
221
+ * showErrorNotification(error.message)
222
+ * }
223
+ * }}
224
+ * />
225
+ * ```
226
+ */
227
+ onApiError?: ApiErrorHandler;
91
228
  /** If true, enables debug logging to console. Default: false */
92
229
  debug?: boolean;
93
230
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FolderBrowser.types.d.ts","sourceRoot":"","sources":["../../../src/components/FolderBrowser/FolderBrowser.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FolderBrowser.types.d.ts","sourceRoot":"","sources":["../../../src/components/FolderBrowser/FolderBrowser.types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Collection, Folder, Item } from './FolderBrowser.types';
2
+ import { ApiErrorHandler } from '../../utils/apiErrorHandling';
2
3
  import { DebugLogger } from '../../utils/debugLog';
3
4
 
4
5
  export interface UseFolderBrowserDataFetchingParams {
@@ -10,6 +11,7 @@ export interface UseFolderBrowserDataFetchingParams {
10
11
  shouldFetchItems: boolean;
11
12
  itemFilter?: (item: Item) => boolean;
12
13
  onItemsFetched?: (folderId: string, items: Item[]) => void;
14
+ onApiError?: ApiErrorHandler;
13
15
  startCollectionId?: string;
14
16
  startFolderId?: string;
15
17
  rootId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useFolderBrowserDataFetching.d.ts","sourceRoot":"","sources":["../../../src/components/FolderBrowser/useFolderBrowserDataFetching.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useFolderBrowserDataFetching.d.ts","sourceRoot":"","sources":["../../../src/components/FolderBrowser/useFolderBrowserDataFetching.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { default as React } from 'react';
2
2
  import { Item } from '../../utils/itemUtils';
3
+ import { ApiErrorHandler } from '../../utils/apiErrorHandling';
3
4
 
4
5
  export interface FolderThumbnailBrowserProps {
5
6
  /** DSA folder ID to fetch items from */
@@ -42,6 +43,35 @@ export interface FolderThumbnailBrowserProps {
42
43
  getDatasetType?: (itemId: string) => 'train' | 'val' | 'test' | null;
43
44
  /** Show OpenSeadragon navigation controls (zoom, home, fullscreen) on thumbnails (default: false) */
44
45
  showViewerControls?: boolean;
46
+ /**
47
+ * Callback when an API error occurs.
48
+ * Provides error details and a retry function for transient failures.
49
+ *
50
+ * @param error - The error that occurred
51
+ * @param retry - Function to retry the failed operation
52
+ * @param context - Additional context about the error (endpoint, operation type, etc.)
53
+ *
54
+ * @example
55
+ * ```tsx
56
+ * <FolderThumbnailBrowser
57
+ * apiBaseUrl="http://bdsa.pathology.emory.edu:8080/api/v1"
58
+ * folderId="folder-123"
59
+ * onApiError={(error, retry, context) => {
60
+ * if (error.status === 401) {
61
+ * // Token expired, refresh and retry
62
+ * refreshToken().then(() => retry())
63
+ * } else if (error.isRetryable) {
64
+ * // Retry with delay
65
+ * setTimeout(() => retry(), 2000)
66
+ * } else {
67
+ * // Show error to user
68
+ * showErrorNotification(error.message)
69
+ * }
70
+ * }}
71
+ * />
72
+ * ```
73
+ */
74
+ onApiError?: ApiErrorHandler;
45
75
  /** Debug mode for logging */
46
76
  debug?: boolean;
47
77
  /** Custom CSS class */
@@ -1 +1 @@
1
- {"version":3,"file":"FolderThumbnailBrowser.d.ts","sourceRoot":"","sources":["../../../src/components/FolderThumbnailBrowser/FolderThumbnailBrowser.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAEhF,OAAO,EAAgC,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAE/E,OAAO,8BAA8B,CAAA;AAErC,MAAM,WAAW,2BAA2B;IAExC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,gDAAgD;IAChD,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;IAGd,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAA;IAClB,uGAAuG;IACvG,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,4CAA4C;IAC5C,UAAU,CAAC,EAAE,WAAW,CAAA;IACxB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAGnE,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAA;IAGnC,uDAAuD;IACvD,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClE,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,oCAAoC;IACpC,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAGrD,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gCAAgC;IAChC,gBAAgB,CAAC,EAAE;QACf,KAAK,EAAE,MAAM,EAAE,CAAA;QACf,GAAG,EAAE,MAAM,EAAE,CAAA;QACb,IAAI,EAAE,MAAM,EAAE,CAAA;KACjB,CAAA;IAGD,4CAA4C;IAC5C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC3C,yCAAyC;IACzC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAA;IAGpE,qGAAqG;IACrG,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAYD;;GAEG;AACH,eAAO,MAAM,sBAAsB,oGAgclC,CAAA"}
1
+ {"version":3,"file":"FolderThumbnailBrowser.d.ts","sourceRoot":"","sources":["../../../src/components/FolderThumbnailBrowser/FolderThumbnailBrowser.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAEhF,OAAO,EAAgC,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAE/E,OAAO,EAAkB,KAAK,eAAe,EAAiB,MAAM,8BAA8B,CAAA;AAClG,OAAO,8BAA8B,CAAA;AAErC,MAAM,WAAW,2BAA2B;IAExC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,gDAAgD;IAChD,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;IAGd,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAA;IAClB,uGAAuG;IACvG,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,4CAA4C;IAC5C,UAAU,CAAC,EAAE,WAAW,CAAA;IACxB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAGnE,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAA;IAGnC,uDAAuD;IACvD,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClE,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,oCAAoC;IACpC,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAGrD,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gCAAgC;IAChC,gBAAgB,CAAC,EAAE;QACf,KAAK,EAAE,MAAM,EAAE,CAAA;QACf,GAAG,EAAE,MAAM,EAAE,CAAA;QACb,IAAI,EAAE,MAAM,EAAE,CAAA;KACjB,CAAA;IAGD,4CAA4C;IAC5C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC3C,yCAAyC;IACzC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAA;IAGpE,qGAAqG;IACrG,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,6BAA6B;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAYD;;GAEG;AACH,eAAO,MAAM,sBAAsB,oGAohBlC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { ProtocolCardProps } from './ProtocolManager.types';
2
+
3
+ /**
4
+ * ProtocolCard - Displays a single protocol in a card format
5
+ */
6
+ export declare function ProtocolCard({ protocol, onEdit, onDelete, readOnly, showSync, }: ProtocolCardProps): import("react/jsx-runtime").JSX.Element;
7
+ export default ProtocolCard;
8
+ //# sourceMappingURL=ProtocolCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtocolCard.d.ts","sourceRoot":"","sources":["../../../src/components/ProtocolManager/ProtocolCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,oBAAoB,CAAC;AAE5B;;GAEG;AACH,wBAAgB,YAAY,CAAC,EACzB,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAgB,EAChB,QAAe,GAClB,EAAE,iBAAiB,2CA+InB;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { ProtocolContextValue, ProtocolProviderProps } from './ProtocolManager.types';
2
+
3
+ /**
4
+ * Protocol Context - Single source of truth for all protocols
5
+ *
6
+ * State Shape:
7
+ * {
8
+ * protocols: [
9
+ * { id, type: 'stain'|'region', name, ...otherFields },
10
+ * ...
11
+ * ],
12
+ * loading: boolean,
13
+ * error: string|null
14
+ * }
15
+ */
16
+ declare const ProtocolContext: import('react').Context<ProtocolContextValue | null>;
17
+ /**
18
+ * ProtocolProvider - Wrap your app with this to provide protocol state
19
+ *
20
+ * @param {ProtocolProviderProps} props
21
+ */
22
+ export declare function ProtocolProvider({ children, storage }: ProtocolProviderProps): import("react/jsx-runtime").JSX.Element;
23
+ /**
24
+ * useProtocols - The ONE hook you need for protocol management!
25
+ *
26
+ * @returns {ProtocolContextValue} Protocol state and actions
27
+ *
28
+ * @example
29
+ * function MyComponent() {
30
+ * const { protocols, stainProtocols, addProtocol, loading } = useProtocols();
31
+ *
32
+ * if (loading) return <div>Loading...</div>;
33
+ *
34
+ * return (
35
+ * <div>
36
+ * {stainProtocols.map(p => <div key={p.id}>{p.name}</div>)}
37
+ * <button onClick={() => addProtocol({ type: 'stain', name: 'H&E', id: '...' })}>
38
+ * Add Protocol
39
+ * </button>
40
+ * </div>
41
+ * );
42
+ * }
43
+ */
44
+ export declare function useProtocols(): ProtocolContextValue;
45
+ export default ProtocolContext;
46
+ //# sourceMappingURL=ProtocolContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtocolContext.d.ts","sourceRoot":"","sources":["../../../src/components/ProtocolManager/ProtocolContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGR,oBAAoB,EACpB,qBAAqB,EACxB,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;;;;GAYG;AAEH,QAAA,MAAM,eAAe,sDAAmD,CAAC;AAuIzE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,OAAwB,EAAE,EAAE,qBAAqB,2CAwF7F;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,IAAI,oBAAoB,CAMnD;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ProtocolListProps } from './ProtocolManager.types';
2
+
3
+ /**
4
+ * ProtocolList - Displays a grid of protocol cards
5
+ */
6
+ export declare function ProtocolList({ protocols, type, onAdd, onEdit, onDelete, readOnly, showSync, title, description, }: ProtocolListProps): import("react/jsx-runtime").JSX.Element;
7
+ export default ProtocolList;
8
+ //# sourceMappingURL=ProtocolList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtocolList.d.ts","sourceRoot":"","sources":["../../../src/components/ProtocolManager/ProtocolList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,oBAAoB,CAAC;AAE5B;;GAEG;AACH,wBAAgB,YAAY,CAAC,EACzB,SAAc,EACd,IAAI,EACJ,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAgB,EAChB,QAAe,EACf,KAAK,EACL,WAAW,GACd,EAAE,iBAAiB,2CAsCnB;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * ProtocolManager - Main component for managing stain and region protocols
3
+ *
4
+ * This is the primary entry point for protocol management functionality.
5
+ * It provides a complete interface for viewing, creating, editing, and managing
6
+ * protocols used in BDSA schema compliance.
7
+ *
8
+ * The component includes:
9
+ * - ProtocolProvider: Context provider for protocol state management
10
+ * - ProtocolsTab: Main UI component for protocol management
11
+ * - ProtocolCard: Individual protocol display
12
+ * - ProtocolList: Grid view of protocols
13
+ * - ProtocolModal: Create/edit modal for protocols
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * import { ProtocolProvider, ProtocolsTab } from 'bdsa-react-components';
18
+ *
19
+ * function App() {
20
+ * return (
21
+ * <ProtocolProvider>
22
+ * <ProtocolsTab />
23
+ * </ProtocolProvider>
24
+ * );
25
+ * }
26
+ * ```
27
+ */
28
+ export { ProtocolsTab as ProtocolManager } from './ProtocolsTab';
29
+ export { default } from './ProtocolsTab';
30
+ export { ProtocolProvider, useProtocols } from './ProtocolContext';
31
+ export { ProtocolCard } from './ProtocolCard';
32
+ export { ProtocolList } from './ProtocolList';
33
+ export { ProtocolModal } from './ProtocolModal';
34
+ export { ProtocolsTab } from './ProtocolsTab';
35
+ export { LocalStorageProtocolStorage, InMemoryProtocolStorage, defaultStorage, generateProtocolId, } from './storage/protocolStorage';
36
+ export { DsaSyncAdapter, NoOpDsaSyncAdapter } from './adapters/DsaSyncAdapter';
37
+ export type { Protocol, ProtocolType, ProtocolStorage, DsaSyncAdapter as DsaSyncAdapterType, SchemaValidator, ProtocolContextValue, ProtocolProviderProps, ProtocolCardProps, ProtocolListProps, ProtocolModalProps, ProtocolsTabProps, } from './ProtocolManager.types';
38
+ //# sourceMappingURL=ProtocolManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtocolManager.d.ts","sourceRoot":"","sources":["../../../src/components/ProtocolManager/ProtocolManager.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACH,2BAA2B,EAC3B,uBAAuB,EACvB,cAAc,EACd,kBAAkB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/E,YAAY,EACR,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,cAAc,IAAI,kBAAkB,EACpC,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,GACpB,MAAM,yBAAyB,CAAC"}