@gen3/frontend 0.10.98 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/dist/cjs/index.js +539 -664
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/dts/api/staticNotebook/index.d.ts +4 -0
  4. package/dist/dts/api/staticNotebook/index.d.ts.map +1 -0
  5. package/dist/dts/api/staticNotebook/index.js +118 -0
  6. package/dist/dts/api/staticNotebook/index.js.map +1 -0
  7. package/dist/dts/api/staticNotebooks/index.d.ts +4 -0
  8. package/dist/dts/api/staticNotebooks/index.d.ts.map +1 -0
  9. package/dist/dts/api/staticNotebooks/index.js +118 -0
  10. package/dist/dts/api/staticNotebooks/index.js.map +1 -0
  11. package/dist/dts/components/Protected/ProtectedContent.d.ts.map +1 -1
  12. package/dist/dts/components/Protected/ProtectedContent.js +9 -4
  13. package/dist/dts/components/Protected/ProtectedContent.js.map +1 -1
  14. package/dist/dts/components/charts/CollapsableCharts.d.ts +3 -0
  15. package/dist/dts/components/charts/CollapsableCharts.d.ts.map +1 -1
  16. package/dist/dts/components/charts/CollapsableCharts.js +2 -2
  17. package/dist/dts/components/charts/CollapsableCharts.js.map +1 -1
  18. package/dist/dts/components/charts/index.d.ts +2 -1
  19. package/dist/dts/components/charts/index.d.ts.map +1 -1
  20. package/dist/dts/components/charts/index.js +2 -1
  21. package/dist/dts/components/charts/index.js.map +1 -1
  22. package/dist/dts/components/charts/types.d.ts +9 -0
  23. package/dist/dts/components/charts/types.d.ts.map +1 -1
  24. package/dist/dts/components/facets/FacetSelector.d.ts.map +1 -1
  25. package/dist/dts/components/facets/FacetSelector.js +7 -4
  26. package/dist/dts/components/facets/FacetSelector.js.map +1 -1
  27. package/dist/dts/features/Analysis/AnalysisBreadcrumbs.d.ts +11 -0
  28. package/dist/dts/features/Analysis/AnalysisBreadcrumbs.d.ts.map +1 -0
  29. package/dist/dts/features/Analysis/AnalysisBreadcrumbs.js +20 -0
  30. package/dist/dts/features/Analysis/AnalysisBreadcrumbs.js.map +1 -0
  31. package/dist/dts/features/Analysis/AnalysisBreadcrumbs.unit.test.d.ts +3 -0
  32. package/dist/dts/features/Analysis/AnalysisBreadcrumbs.unit.test.d.ts.map +1 -0
  33. package/dist/dts/features/Analysis/AnalysisBreadcrumbs.unit.test.js +78 -0
  34. package/dist/dts/features/Analysis/AnalysisBreadcrumbs.unit.test.js.map +1 -0
  35. package/dist/dts/features/Analysis/AnalysisCard.d.ts.map +1 -1
  36. package/dist/dts/features/Analysis/AnalysisCard.js +6 -4
  37. package/dist/dts/features/Analysis/AnalysisCard.js.map +1 -1
  38. package/dist/dts/features/Analysis/AnalysisCard.stories.d.ts +34 -0
  39. package/dist/dts/features/Analysis/AnalysisCard.stories.d.ts.map +1 -0
  40. package/dist/dts/features/Analysis/AnalysisCard.stories.js +25 -0
  41. package/dist/dts/features/Analysis/AnalysisCard.stories.js.map +1 -0
  42. package/dist/dts/features/Analysis/AnalysisCardCompact.stories.d.ts +22 -10
  43. package/dist/dts/features/Analysis/AnalysisCardCompact.stories.d.ts.map +1 -1
  44. package/dist/dts/features/Analysis/AnalysisCenter.js +2 -2
  45. package/dist/dts/features/Analysis/AnalysisCenter.js.map +1 -1
  46. package/dist/dts/features/Analysis/AnalysisPanel.stories.d.ts +22 -0
  47. package/dist/dts/features/Analysis/AnalysisPanel.stories.d.ts.map +1 -0
  48. package/dist/dts/features/Analysis/AnalysisPanel.stories.js +28 -0
  49. package/dist/dts/features/Analysis/AnalysisPanel.stories.js.map +1 -0
  50. package/dist/dts/features/Analysis/AnalysisWorkspace.d.ts +29 -0
  51. package/dist/dts/features/Analysis/AnalysisWorkspace.d.ts.map +1 -0
  52. package/dist/dts/features/Analysis/AnalysisWorkspace.js +37 -0
  53. package/dist/dts/features/Analysis/AnalysisWorkspace.js.map +1 -0
  54. package/dist/dts/features/Analysis/TextDescription.js +1 -1
  55. package/dist/dts/features/Analysis/context.d.ts +29 -0
  56. package/dist/dts/features/Analysis/context.d.ts.map +1 -0
  57. package/dist/dts/features/Analysis/context.js +34 -0
  58. package/dist/dts/features/Analysis/context.js.map +1 -0
  59. package/dist/dts/features/Analysis/types.d.ts +6 -0
  60. package/dist/dts/features/Analysis/types.d.ts.map +1 -1
  61. package/dist/dts/features/Analysis/types.js.map +1 -1
  62. package/dist/dts/features/CohortBuilder/CohortPanel.d.ts +22 -3
  63. package/dist/dts/features/CohortBuilder/CohortPanel.d.ts.map +1 -1
  64. package/dist/dts/features/CohortBuilder/CohortPanel.js +47 -17
  65. package/dist/dts/features/CohortBuilder/CohortPanel.js.map +1 -1
  66. package/dist/dts/features/CohortBuilder/ExplorerTable/ExplorerTable.d.ts.map +1 -1
  67. package/dist/dts/features/CohortBuilder/ExplorerTable/ExplorerTable.js.map +1 -1
  68. package/dist/dts/features/CohortBuilder/types.d.ts +2 -1
  69. package/dist/dts/features/CohortBuilder/types.d.ts.map +1 -1
  70. package/dist/dts/features/CohortBuilder/types.js.map +1 -1
  71. package/dist/dts/features/CohortDiscovery/CohortDiscovery.d.ts.map +1 -1
  72. package/dist/dts/features/CohortDiscovery/CohortDiscovery.js +10 -9
  73. package/dist/dts/features/CohortDiscovery/CohortDiscovery.js.map +1 -1
  74. package/dist/dts/features/CohortDiscovery/Requests/RequestsPanel.d.ts.map +1 -1
  75. package/dist/dts/features/CohortDiscovery/Requests/RequestsPanel.js +1 -2
  76. package/dist/dts/features/CohortDiscovery/Requests/RequestsPanel.js.map +1 -1
  77. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.d.ts.map +1 -1
  78. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.js +1 -0
  79. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.js.map +1 -1
  80. package/dist/dts/features/CohortDiscovery/constants.d.ts +2 -0
  81. package/dist/dts/features/CohortDiscovery/constants.d.ts.map +1 -0
  82. package/dist/dts/features/CohortDiscovery/constants.js +4 -0
  83. package/dist/dts/features/CohortDiscovery/constants.js.map +1 -0
  84. package/dist/dts/features/CohortDiscovery/queryApi.d.ts.map +1 -1
  85. package/dist/dts/features/CohortDiscovery/queryApi.js +2 -381
  86. package/dist/dts/features/CohortDiscovery/queryApi.js.map +1 -1
  87. package/dist/dts/features/Dictionary/types.d.ts +3 -3
  88. package/dist/dts/features/Dictionary/types.d.ts.map +1 -1
  89. package/dist/dts/features/Discovery/DiscoveryIndexPanel.js +2 -2
  90. package/dist/dts/features/Discovery/DiscoveryIndexPanel.js.map +1 -1
  91. package/dist/dts/features/Discovery/types.d.ts +4 -16
  92. package/dist/dts/features/Discovery/types.d.ts.map +1 -1
  93. package/dist/dts/features/Discovery/types.js.map +1 -1
  94. package/dist/dts/features/Navigation/NavPageLayout.d.ts +3 -3
  95. package/dist/dts/features/Navigation/NavPageLayout.d.ts.map +1 -1
  96. package/dist/dts/features/Navigation/NavPageLayout.js +2 -2
  97. package/dist/dts/features/Navigation/NavPageLayout.js.map +1 -1
  98. package/dist/dts/features/Navigation/TopBar/TopBar.d.ts.map +1 -1
  99. package/dist/dts/features/Navigation/TopBar/TopBar.js +3 -2
  100. package/dist/dts/features/Navigation/TopBar/TopBar.js.map +1 -1
  101. package/dist/dts/features/Navigation/index.d.ts +2 -2
  102. package/dist/dts/features/Navigation/index.d.ts.map +1 -1
  103. package/dist/dts/features/Navigation/index.js +2 -1
  104. package/dist/dts/features/Navigation/index.js.map +1 -1
  105. package/dist/dts/features/Navigation/types.d.ts +7 -1
  106. package/dist/dts/features/Navigation/types.d.ts.map +1 -1
  107. package/dist/dts/features/Navigation/types.js +19 -1
  108. package/dist/dts/features/Navigation/types.js.map +1 -1
  109. package/dist/dts/features/StaticNotebook/StaticNotebook.d.ts +4 -0
  110. package/dist/dts/features/StaticNotebook/StaticNotebook.d.ts.map +1 -0
  111. package/dist/dts/features/StaticNotebook/StaticNotebook.js +79 -0
  112. package/dist/dts/features/StaticNotebook/StaticNotebook.js.map +1 -0
  113. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.d.ts +6 -0
  114. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.d.ts.map +1 -0
  115. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.js +10 -0
  116. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.js.map +1 -0
  117. package/dist/dts/features/StaticNotebook/StaticNotebookViewer.d.ts +6 -0
  118. package/dist/dts/features/StaticNotebook/StaticNotebookViewer.d.ts.map +1 -0
  119. package/dist/dts/features/StaticNotebook/StaticNotebookViewer.js +91 -0
  120. package/dist/dts/features/StaticNotebook/StaticNotebookViewer.js.map +1 -0
  121. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.d.ts +4 -0
  122. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.d.ts.map +1 -0
  123. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.js +129 -0
  124. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.js.map +1 -0
  125. package/dist/dts/features/StaticNotebook/constants.d.ts +4 -0
  126. package/dist/dts/features/StaticNotebook/constants.d.ts.map +1 -0
  127. package/dist/dts/features/StaticNotebook/constants.js +5 -0
  128. package/dist/dts/features/StaticNotebook/constants.js.map +1 -0
  129. package/dist/dts/features/StaticNotebook/index.d.ts +4 -0
  130. package/dist/dts/features/StaticNotebook/index.d.ts.map +1 -0
  131. package/dist/dts/features/StaticNotebook/index.js +4 -0
  132. package/dist/dts/features/StaticNotebook/index.js.map +1 -0
  133. package/dist/dts/features/Study/index.d.ts +5 -1
  134. package/dist/dts/features/Study/index.d.ts.map +1 -1
  135. package/dist/dts/features/Study/index.js +5 -1
  136. package/dist/dts/features/Study/index.js.map +1 -1
  137. package/dist/dts/index.d.ts +3 -1
  138. package/dist/dts/index.d.ts.map +1 -1
  139. package/dist/dts/index.js +4 -2
  140. package/dist/dts/index.js.map +1 -1
  141. package/dist/dts/lib/common/staticProps.d.ts.map +1 -1
  142. package/dist/dts/lib/common/staticProps.js +28 -8
  143. package/dist/dts/lib/common/staticProps.js.map +1 -1
  144. package/dist/dts/lib/content/types.d.ts +2 -2
  145. package/dist/dts/lib/content/types.d.ts.map +1 -1
  146. package/dist/dts/lib/notebooks/index.d.ts +3 -0
  147. package/dist/dts/lib/notebooks/index.d.ts.map +1 -0
  148. package/dist/dts/lib/notebooks/index.js +96 -0
  149. package/dist/dts/lib/notebooks/index.js.map +1 -0
  150. package/dist/dts/pages/AiSearch/AiSearch.js +1 -1
  151. package/dist/dts/pages/AiSearch/AiSearch.js.map +1 -1
  152. package/dist/dts/pages/AiSearch/data.js +1 -1
  153. package/dist/dts/pages/AiSearch/data.js.map +1 -1
  154. package/dist/dts/pages/Analysis/Analysis.js +1 -1
  155. package/dist/dts/pages/Analysis/Analysis.js.map +1 -1
  156. package/dist/dts/pages/Crosswalk/Crosswalk.js +1 -1
  157. package/dist/dts/pages/Crosswalk/Crosswalk.js.map +1 -1
  158. package/dist/dts/pages/DataDictionary/DataDictionary.js +1 -1
  159. package/dist/dts/pages/DataDictionary/DataDictionary.js.map +1 -1
  160. package/dist/dts/pages/DataLibrary/DataLibrary.js +1 -1
  161. package/dist/dts/pages/DataLibrary/DataLibrary.js.map +1 -1
  162. package/dist/dts/pages/Discovery/Discovery.js +1 -1
  163. package/dist/dts/pages/Discovery/Discovery.js.map +1 -1
  164. package/dist/dts/pages/Explorer/Explorer.js +1 -1
  165. package/dist/dts/pages/Explorer/Explorer.js.map +1 -1
  166. package/dist/dts/pages/Explorer/data.d.ts.map +1 -1
  167. package/dist/dts/pages/Explorer/data.js +17 -4
  168. package/dist/dts/pages/Explorer/data.js.map +1 -1
  169. package/dist/dts/pages/Landing/Landing.js +1 -1
  170. package/dist/dts/pages/Landing/Landing.js.map +1 -1
  171. package/dist/dts/pages/Landing/about-us.js +1 -1
  172. package/dist/dts/pages/Landing/about-us.js.map +1 -1
  173. package/dist/dts/pages/Landing/contact.js +1 -1
  174. package/dist/dts/pages/Landing/contact.js.map +1 -1
  175. package/dist/dts/pages/Landing/resource.js +1 -1
  176. package/dist/dts/pages/Landing/resource.js.map +1 -1
  177. package/dist/dts/pages/Login/Login.js +1 -1
  178. package/dist/dts/pages/Login/Login.js.map +1 -1
  179. package/dist/dts/pages/NotebookLite/NotebookLite.js +1 -1
  180. package/dist/dts/pages/NotebookLite/NotebookLite.js.map +1 -1
  181. package/dist/dts/pages/Profile/Profile.js +1 -1
  182. package/dist/dts/pages/Profile/Profile.js.map +1 -1
  183. package/dist/dts/pages/Query/Query.js +1 -1
  184. package/dist/dts/pages/Query/Query.js.map +1 -1
  185. package/dist/dts/pages/Submission/Submission.js +1 -1
  186. package/dist/dts/pages/Submission/Submission.js.map +1 -1
  187. package/dist/dts/pages/TabbedCohortBuilder/TabbedCohortBuilderPage.js +1 -1
  188. package/dist/dts/pages/TabbedCohortBuilder/TabbedCohortBuilderPage.js.map +1 -1
  189. package/dist/dts/pages/Theme/Colors.js +1 -1
  190. package/dist/dts/pages/Theme/Colors.js.map +1 -1
  191. package/dist/dts/pages/Workspace/Workspace.js +1 -1
  192. package/dist/dts/pages/Workspace/Workspace.js.map +1 -1
  193. package/dist/dts/pages/Workspace/WorkspaceNoAccess.js +1 -1
  194. package/dist/dts/pages/Workspace/WorkspaceNoAccess.js.map +1 -1
  195. package/dist/dts/pages/admin/Workspace/WorkspaceNotebooks.js +1 -1
  196. package/dist/dts/pages/admin/Workspace/WorkspaceNotebooks.js.map +1 -1
  197. package/dist/dts/pages/admin/analysis/Analysis.js +1 -1
  198. package/dist/dts/pages/admin/analysis/Analysis.js.map +1 -1
  199. package/dist/dts/pages/admin/analysis/data.d.ts +1 -1
  200. package/dist/dts/pages/admin/authz/Authz.js +1 -1
  201. package/dist/dts/pages/admin/authz/Authz.js.map +1 -1
  202. package/dist/dts/pages/admin/authz/data.d.ts +1 -1
  203. package/dist/dts/types/icons.d.ts +2 -2
  204. package/dist/dts/types/icons.d.ts.map +1 -1
  205. package/dist/dts/types/icons.js +2 -2
  206. package/dist/dts/types/icons.js.map +1 -1
  207. package/dist/esm/index.js +532 -666
  208. package/dist/esm/index.js.map +1 -1
  209. package/dist/index.d.ts +86 -23
  210. package/dist/tsconfig.tsbuildinfo +1 -1
  211. package/package.json +4 -3
package/dist/cjs/index.js CHANGED
@@ -47,6 +47,7 @@ var lu = require('react-icons/lu');
47
47
  require('universal-cookie');
48
48
  var modals = require('@mantine/modals');
49
49
  var GraphiQL = require('graphiql');
50
+ var router$1 = require('next/dist/client/router');
50
51
  var fs = require('fs');
51
52
  var path = require('path');
52
53
  var react$1 = require('redux-persist/integration/react');
@@ -62,6 +63,7 @@ var filesize = require('filesize');
62
63
  var dnd = require('@hello-pangea/dnd');
63
64
  var plugin = require('tailwindcss/plugin');
64
65
  var cookie = require('cookie');
66
+ var DOMPurify = require('isomorphic-dompurify');
65
67
 
66
68
  function _interopNamespaceDefault(e) {
67
69
  var n = Object.create(null);
@@ -2777,6 +2779,69 @@ const Charts = ({ charts, data, counts, isSuccess, numCols = DEFAULT_COLS, style
2777
2779
  });
2778
2780
  };
2779
2781
 
2782
+ const CollapsableCharts = ({ config, data })=>{
2783
+ const [showLegends, setShowLegends] = React.useState(config.showLegends?.enabled);
2784
+ if (!(config?.charts && Object.keys(config.charts).length > 0)) {
2785
+ return /*#__PURE__*/ jsxRuntime.jsx(core$1.Center, {
2786
+ children: /*#__PURE__*/ jsxRuntime.jsx(ErrorCard, {
2787
+ message: "Charts Section not setup properly"
2788
+ })
2789
+ });
2790
+ }
2791
+ return /*#__PURE__*/ jsxRuntime.jsx(core$1.Accordion, {
2792
+ unstyled: true,
2793
+ classNames: {
2794
+ root: 'mb-4 bg-base-max w-full rounded-lg',
2795
+ control: 'bg-secondary-lightest w-full px-4 py-2 rounded-lg data-active:rounded-b-none text-left group',
2796
+ label: 'pl-2 font-bold [text-shadow:_1px_0_#000]',
2797
+ chevron: 'rounded-full bg-secondary-dark text-white inline-block align-middle group-data-[active]:rotate-180 transition-all',
2798
+ panel: 'py-4'
2799
+ },
2800
+ chevronPosition: "left",
2801
+ defaultValue: "chartsAccordion",
2802
+ children: /*#__PURE__*/ jsxRuntime.jsxs(core$1.Accordion.Item, {
2803
+ value: 'chartsAccordion',
2804
+ children: [
2805
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Accordion.Control, {
2806
+ children: config.title || ''
2807
+ }),
2808
+ /*#__PURE__*/ jsxRuntime.jsxs(core$1.Accordion.Panel, {
2809
+ children: [
2810
+ config.showLegends?.enabled && config.showLegends?.showSwitch && /*#__PURE__*/ jsxRuntime.jsxs(React.Fragment, {
2811
+ children: [
2812
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Switch, {
2813
+ color: "accent",
2814
+ labelPosition: "left",
2815
+ label: "Show legends",
2816
+ size: "xs",
2817
+ px: "md",
2818
+ checked: showLegends,
2819
+ onChange: (event)=>setShowLegends(event.currentTarget.checked)
2820
+ }),
2821
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Divider, {
2822
+ my: "sm"
2823
+ })
2824
+ ]
2825
+ }),
2826
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Box, {
2827
+ px: "md",
2828
+ children: /*#__PURE__*/ jsxRuntime.jsx(Charts, {
2829
+ showLegends: showLegends,
2830
+ style: "box",
2831
+ charts: config.charts,
2832
+ data: data,
2833
+ counts: 2,
2834
+ isSuccess: true,
2835
+ numCols: 4
2836
+ })
2837
+ })
2838
+ ]
2839
+ })
2840
+ ]
2841
+ })
2842
+ });
2843
+ };
2844
+
2780
2845
  const ChartTitleBar = ({ divId, title, filename, jsonData })=>{
2781
2846
  return /*#__PURE__*/ jsxRuntime.jsx("div", {
2782
2847
  className: "flex justify-between items-center",
@@ -3324,7 +3389,7 @@ const useFieldNameToTitle = ()=>{
3324
3389
  return fieldToTitle;
3325
3390
  };
3326
3391
 
3327
- const DEFAULT_VISIBLE_ITEMS = 6;
3392
+ const DEFAULT_VISIBLE_ITEMS$1 = 6;
3328
3393
  const DEFAULT_MINIMUM = 0;
3329
3394
  const DEFAULT_MAXIMUM = 100;
3330
3395
  const BAD_DATA_MESSAGE = 'No data for this field';
@@ -3761,7 +3826,7 @@ const FacetEnumList = ({ field, facetName, hooks, valueLabel, isSettings = false
3761
3826
  }, [
3762
3827
  enumFilters
3763
3828
  ]);
3764
- const maxValuesToDisplay = DEFAULT_VISIBLE_ITEMS;
3829
+ const maxValuesToDisplay = DEFAULT_VISIBLE_ITEMS$1;
3765
3830
  // update filters when checkbox is selected
3766
3831
  const handleChange = (value, checked)=>{
3767
3832
  setFacetChartData({
@@ -5004,6 +5069,7 @@ const CustomFacetGroup = ({ hooks, customFacetHooks, queryOptions, getFacetLabel
5004
5069
  });
5005
5070
  };
5006
5071
 
5072
+ const DEFAULT_VISIBLE_ITEMS = 16;
5007
5073
  const FacetSelector = ({ category, facetName, hooks, width = 'w-full', description, fields, selectedFields, updateSelectedField, showSearch = true, showSettings = false, header = {
5008
5074
  Panel: FacetHeader,
5009
5075
  Label: FacetText,
@@ -5034,7 +5100,8 @@ const FacetSelector = ({ category, facetName, hooks, width = 'w-full', descripti
5034
5100
  searchTerm,
5035
5101
  fields
5036
5102
  ]);
5037
- const remainingValues = filteredFields.length - DEFAULT_VISIBLE_ITEMS;
5103
+ const remainingValues = filteredFields.length - DEFAULT_VISIBLE_ITEMS * 2;
5104
+ const visibleFields = filteredFields.slice(0, !isGroupExpanded ? DEFAULT_VISIBLE_ITEMS : undefined);
5038
5105
  return /*#__PURE__*/ jsxRuntime.jsxs("div", {
5039
5106
  className: `flex flex-col ${width ? width : 'mx-1'} bg-base-max relative border-base-light border-1 rounded-b-md transition`,
5040
5107
  id: category,
@@ -5083,11 +5150,11 @@ const FacetSelector = ({ category, facetName, hooks, width = 'w-full', descripti
5083
5150
  /*#__PURE__*/ jsxRuntime.jsx("div", {
5084
5151
  className: "card-face bg-base-max rounded-b-xs flex flex-col gap-y-1 justify-between",
5085
5152
  children: /*#__PURE__*/ jsxRuntime.jsx("div", {
5086
- children: filteredFields.length == 0 ? /*#__PURE__*/ jsxRuntime.jsx("div", {
5153
+ children: visibleFields.length == 0 ? /*#__PURE__*/ jsxRuntime.jsx("div", {
5087
5154
  className: "mx-4 font-content text-sm",
5088
5155
  children: BAD_DATA_MESSAGE
5089
- }) : filteredFields.map((facet)=>{
5090
- const label = core.fieldNameToTitle(facet.field);
5156
+ }) : visibleFields.map((facet)=>{
5157
+ const label = facet?.label ?? core.fieldNameToTitle(facet.field);
5091
5158
  return /*#__PURE__*/ jsxRuntime.jsxs("div", {
5092
5159
  className: "flex justify-between items-center px-2 my-1",
5093
5160
  children: [
@@ -5138,7 +5205,12 @@ const ProtectedContent = ({ children, referer })=>{
5138
5205
  }
5139
5206
  });
5140
5207
  };
5141
- const { status, pending } = useSession(true, onUnauthenticated);
5208
+ const delayRedirect = ()=>{
5209
+ setTimeout(()=>{
5210
+ onUnauthenticated();
5211
+ }, 2000);
5212
+ };
5213
+ const { status, pending } = useSession(true, delayRedirect);
5142
5214
  if (status !== 'issued') {
5143
5215
  // not logged in
5144
5216
  if (pending) return /*#__PURE__*/ jsxRuntime.jsx("div", {
@@ -5148,12 +5220,20 @@ const ProtectedContent = ({ children, referer })=>{
5148
5220
  else return /*#__PURE__*/ jsxRuntime.jsx("div", {
5149
5221
  className: "w-full h-full relative",
5150
5222
  children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Center, {
5151
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Paper, {
5152
- shadow: "md",
5153
- p: "md",
5154
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
5155
- children: "You are not signed in and cannot access this protected content. Please login in."
5156
- })
5223
+ children: /*#__PURE__*/ jsxRuntime.jsxs(core$1.Stack, {
5224
+ h: 300,
5225
+ align: "center",
5226
+ justify: "center",
5227
+ gap: "md",
5228
+ className: "mt-24",
5229
+ children: [
5230
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
5231
+ children: "You are not logged in and cannot access this protected content."
5232
+ }),
5233
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
5234
+ children: "You will be redirected to the login page in a few seconds.."
5235
+ })
5236
+ ]
5157
5237
  })
5158
5238
  })
5159
5239
  });
@@ -5471,7 +5551,7 @@ const LoginButton = ({ name = 'login', leftIcon = undefined, rightIcon = undefin
5471
5551
  const processTopBarItems = (items, classNames, dividerClassname)=>{
5472
5552
  return items.reduce((acc, item, index)=>{
5473
5553
  const mergedClassnames = item?.classNames ? mergeDefaultTailwindClassnames(classNames, item.classNames) : classNames;
5474
- acc.push(/*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
5554
+ acc.push(/*#__PURE__*/ jsxRuntime.jsxs(React.Fragment, {
5475
5555
  children: [
5476
5556
  /*#__PURE__*/ jsxRuntime.jsx("a", {
5477
5557
  className: "flex",
@@ -5483,7 +5563,7 @@ const processTopBarItems = (items, classNames, dividerClassname)=>{
5483
5563
  rightIcon: item.rightIcon,
5484
5564
  classNames: mergedClassnames
5485
5565
  })
5486
- }, `${item.href}_${item.name}`),
5566
+ }),
5487
5567
  /*#__PURE__*/ jsxRuntime.jsx(core$1.Divider, {
5488
5568
  size: "md",
5489
5569
  orientation: "vertical",
@@ -5492,7 +5572,7 @@ const processTopBarItems = (items, classNames, dividerClassname)=>{
5492
5572
  }
5493
5573
  })
5494
5574
  ]
5495
- }));
5575
+ }, `${item.href}_${item.name}-topbar-item`));
5496
5576
  return acc;
5497
5577
  }, []);
5498
5578
  };
@@ -5993,7 +6073,7 @@ const LeftSidePanel = ({ items = [], classNames = {} })=>{
5993
6073
  });
5994
6074
  };
5995
6075
 
5996
- const NavPageLayout = ({ headerProps, footerProps, mainProps, headerData, children })=>{
6076
+ const NavPageLayout = ({ headerProps, footerProps, mainProps, headerMetadata, children })=>{
5997
6077
  const mainContentStyle = mainProps?.fixed ? 'flex-1 flex overflow-hidden relative' : 'flex grow relative';
5998
6078
  return /*#__PURE__*/ jsxRuntime.jsxs("div", {
5999
6079
  className: "flex flex-col justify-between h-screen",
@@ -6001,24 +6081,24 @@ const NavPageLayout = ({ headerProps, footerProps, mainProps, headerData, childr
6001
6081
  /*#__PURE__*/ jsxRuntime.jsxs(Head, {
6002
6082
  children: [
6003
6083
  /*#__PURE__*/ jsxRuntime.jsx("title", {
6004
- children: headerData.title
6084
+ children: headerMetadata.title
6005
6085
  }),
6006
6086
  /*#__PURE__*/ jsxRuntime.jsx("meta", {
6007
6087
  property: "og:title",
6008
- content: headerData.content
6009
- }, headerData.key)
6088
+ content: headerMetadata.content
6089
+ }, headerMetadata.key)
6010
6090
  ]
6011
6091
  }),
6012
6092
  /*#__PURE__*/ jsxRuntime.jsxs(Header$1, {
6013
6093
  ...headerProps,
6014
6094
  children: [
6015
6095
  /*#__PURE__*/ jsxRuntime.jsx("title", {
6016
- children: headerData.title
6096
+ children: headerMetadata.title
6017
6097
  }),
6018
6098
  /*#__PURE__*/ jsxRuntime.jsx("meta", {
6019
6099
  property: "og:title",
6020
- content: headerData.content
6021
- }, headerData.key)
6100
+ content: headerMetadata.content
6101
+ }, headerMetadata.key)
6022
6102
  ]
6023
6103
  }),
6024
6104
  headerProps.type === 'vertical' ? /*#__PURE__*/ jsxRuntime.jsxs("div", {
@@ -6044,6 +6124,20 @@ const NavPageLayout = ({ headerProps, footerProps, mainProps, headerData, childr
6044
6124
  });
6045
6125
  };
6046
6126
 
6127
+ /**
6128
+ * Type guard to check if an object is of type HeaderMetadata
6129
+ * @param obj - The object to check
6130
+ * @returns True if the object is a valid HeaderMetadata
6131
+ */ const isHeaderMetadata = (obj)=>{
6132
+ // Check if obj is a non-null object
6133
+ if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
6134
+ return false;
6135
+ }
6136
+ const candidate = obj;
6137
+ // Check all required properties exist and are non-empty strings
6138
+ return typeof candidate.title === 'string' && candidate.title.trim().length > 0 && typeof candidate.content === 'string' && candidate.content.trim().length > 0 && typeof candidate.key === 'string' && candidate.key.trim().length > 0;
6139
+ };
6140
+
6047
6141
  var classes = {"tableRow":"DiscoveryTable-module_tableRow__yFUJZ"};
6048
6142
 
6049
6143
  const jsonPathAccessor$1 = (path)=>(row)=>{
@@ -7883,69 +7977,6 @@ const SummaryStatisticPanel = ({ summaries })=>{
7883
7977
  });
7884
7978
  };
7885
7979
 
7886
- const ChartsPanel = ({ config, data })=>{
7887
- const [showLegends, setShowLegends] = React.useState(config.showLegends?.enabled);
7888
- if (!(config?.charts && Object.keys(config.charts).length > 0)) {
7889
- return /*#__PURE__*/ jsxRuntime.jsx(core$1.Center, {
7890
- children: /*#__PURE__*/ jsxRuntime.jsx(ErrorCard, {
7891
- message: "Discovery Charts Section not setup properly"
7892
- })
7893
- });
7894
- }
7895
- return /*#__PURE__*/ jsxRuntime.jsx(core$1.Accordion, {
7896
- unstyled: true,
7897
- classNames: {
7898
- root: 'mb-4 bg-base-max w-full rounded-lg',
7899
- control: 'bg-secondary-lightest w-full px-4 py-2 rounded-lg data-active:rounded-b-none text-left group',
7900
- label: 'pl-2 font-bold [text-shadow:_1px_0_#000]',
7901
- chevron: 'rounded-full bg-secondary-dark text-white inline-block align-middle group-data-[active]:rotate-180 transition-all',
7902
- panel: 'py-4'
7903
- },
7904
- chevronPosition: "left",
7905
- defaultValue: "chartsAccordion",
7906
- children: /*#__PURE__*/ jsxRuntime.jsxs(core$1.Accordion.Item, {
7907
- value: 'chartsAccordion',
7908
- children: [
7909
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Accordion.Control, {
7910
- children: config.title || ''
7911
- }),
7912
- /*#__PURE__*/ jsxRuntime.jsxs(core$1.Accordion.Panel, {
7913
- children: [
7914
- config.showLegends?.enabled && config.showLegends?.showSwitch && /*#__PURE__*/ jsxRuntime.jsxs(React.Fragment, {
7915
- children: [
7916
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Switch, {
7917
- color: "accent",
7918
- labelPosition: "left",
7919
- label: "Show legends",
7920
- size: "xs",
7921
- px: "md",
7922
- checked: showLegends,
7923
- onChange: (event)=>setShowLegends(event.currentTarget.checked)
7924
- }),
7925
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Divider, {
7926
- my: "sm"
7927
- })
7928
- ]
7929
- }),
7930
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Box, {
7931
- px: "md",
7932
- children: /*#__PURE__*/ jsxRuntime.jsx(Charts, {
7933
- showLegends: showLegends,
7934
- style: "box",
7935
- charts: config.charts,
7936
- data: data,
7937
- counts: 2,
7938
- isSuccess: true,
7939
- numCols: 4
7940
- })
7941
- })
7942
- ]
7943
- })
7944
- ]
7945
- })
7946
- });
7947
- };
7948
-
7949
7980
  const isSearchKV = (obj)=>{
7950
7981
  return obj && obj.key && obj.value;
7951
7982
  };
@@ -9286,7 +9317,7 @@ registerDefaultDiscoveryDataLoaders();
9286
9317
  size: "xl",
9287
9318
  children: discoveryConfig?.features?.pageTitle.text
9288
9319
  }) : null,
9289
- discoveryConfig.features?.chartsSection?.enabled && /*#__PURE__*/ jsxRuntime.jsx(ChartsPanel, {
9320
+ discoveryConfig.features?.chartsSection?.enabled && /*#__PURE__*/ jsxRuntime.jsx(CollapsableCharts, {
9290
9321
  config: discoveryConfig.features?.chartsSection,
9291
9322
  data: chartData
9292
9323
  }),
@@ -12346,7 +12377,25 @@ const DropdownPanel = ({ index, filters, tabTitle, facetDefinitions, facetDataHo
12346
12377
  };
12347
12378
 
12348
12379
  const EmptyData = {};
12349
- const CohortPanel = ({ guppyConfig, filters, charts = {}, table, tabTitle, dropdowns, buttons, loginForDownload, showAccessLevel = false })=>{
12380
+ /**
12381
+ * CohortPanel is a React component that provides an interactive interface for cohort exploration and filtering.
12382
+ * It integrates with data services and facilitates visualization, filtering, and analysis tasks.
12383
+ *
12384
+ * @param {Object} props The properties required to configure the CohortPanel component.
12385
+ * @param {Object} props.guppyConfig Configuration object for Guppy, including field mappings and data type information.
12386
+ * @param {Object} props.filters Configuration for filter tabs, including filter fields and layout.
12387
+ * @param {Object} [props.charts={}] Optional set of chart configuration objects for rendering summaries.
12388
+ * @param {Object} [props.chartsSection] Optional configuration for an additional section of charts.
12389
+ * @param {Object} props.table Reference to the table configuration or component for displaying data.
12390
+ * @param {string} props.tabTitle Title for the filter tab section.
12391
+ * @param {Object[]|undefined} props.dropdowns Dropdown menu configuration, allowing for additional filter options or actions.
12392
+ * @param {Object[]|undefined} props.buttons List of button configurations for actions such as downloads.
12393
+ * @param {boolean} props.loginForDownload Determines whether login is required to enable download functionality.
12394
+ * @param {boolean} [props.showAccessLevel=false] Indicates if the user access level should be displayed on the panel.
12395
+ *
12396
+ * @returns {JSX.Element} Returns a JSX element rendering the CohortPanel. This includes filter options,
12397
+ * summary charts, cohort manager, and data display components.
12398
+ */ const CohortPanel = ({ guppyConfig, filters, charts = {}, chartsSection = undefined, table, tabTitle, dropdowns, buttons, loginForDownload, showAccessLevel = false })=>{
12350
12399
  const isSm = hooks.useMediaQuery('(min-width: 639px)');
12351
12400
  const isMd = hooks.useMediaQuery('(min-width: 1373px)');
12352
12401
  const isXl = hooks.useMediaQuery('(min-width: 1600px)');
@@ -12371,7 +12420,10 @@ const CohortPanel = ({ guppyConfig, filters, charts = {}, table, tabTitle, dropd
12371
12420
  });
12372
12421
  const { data: chartData, isSuccess: isChartSuccess, isFetching: isChartFetching, isError: isChartError } = core.useGetAggsNoFilterSelfQuery({
12373
12422
  type: index,
12374
- fields: Object.keys(charts),
12423
+ fields: [
12424
+ ...Object.keys(chartsSection?.charts ?? {}),
12425
+ ...Object.keys(charts)
12426
+ ],
12375
12427
  filters: cohortFilters,
12376
12428
  accessibility: accessLevel
12377
12429
  });
@@ -12477,7 +12529,8 @@ const CohortPanel = ({ guppyConfig, filters, charts = {}, table, tabTitle, dropd
12477
12529
  const facetDefs = classifyFacets(data, index, guppyConfig?.fieldMapping ?? [], configFacetDefs ?? {}, sharedFiltersMap);
12478
12530
  setFacetDefinitions(facetDefs);
12479
12531
  // setup summary charts since nested fields can be listed by the split field name
12480
- const summaryCharts = Object.keys(charts).reduce((acc, field)=>{
12532
+ const chartDefinitions = chartsSection?.charts ?? charts;
12533
+ const summaryCharts = Object.keys(chartDefinitions).reduce((acc, field)=>{
12481
12534
  let chartField = field;
12482
12535
  if (facetDefs?.[field] === undefined) {
12483
12536
  const res = Object.values(facetDefs).filter((def)=>{
@@ -12489,7 +12542,7 @@ const CohortPanel = ({ guppyConfig, filters, charts = {}, table, tabTitle, dropd
12489
12542
  }
12490
12543
  return {
12491
12544
  ...acc,
12492
- [chartField]: charts[field]
12545
+ [chartField]: chartDefinitions[field]
12493
12546
  };
12494
12547
  }, {});
12495
12548
  setSummaryCharts(summaryCharts);
@@ -12500,7 +12553,8 @@ const CohortPanel = ({ guppyConfig, filters, charts = {}, table, tabTitle, dropd
12500
12553
  facetDefinitions,
12501
12554
  index,
12502
12555
  guppyConfig.fieldMapping,
12503
- charts
12556
+ charts,
12557
+ chartsSection
12504
12558
  ]);
12505
12559
  const { data: counts, isSuccess: isCountSuccess, isError } = core.useGetCountsQuery({
12506
12560
  type: index,
@@ -12558,7 +12612,13 @@ const CohortPanel = ({ guppyConfig, filters, charts = {}, table, tabTitle, dropd
12558
12612
  })
12559
12613
  ]
12560
12614
  }),
12561
- /*#__PURE__*/ jsxRuntime.jsx(Charts, {
12615
+ chartsSection?.enabled ? /*#__PURE__*/ jsxRuntime.jsx(CollapsableCharts, {
12616
+ config: {
12617
+ ...chartsSection,
12618
+ charts: summaryCharts
12619
+ },
12620
+ data: chartData ?? EmptyData
12621
+ }) : /*#__PURE__*/ jsxRuntime.jsx(Charts, {
12562
12622
  charts: summaryCharts,
12563
12623
  data: chartData ?? EmptyData,
12564
12624
  counts: counts,
@@ -13759,11 +13819,11 @@ const TextDescription = ({ description })=>{
13759
13819
  children: [
13760
13820
  !extend ? /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
13761
13821
  ref: textRef,
13762
- size: "md",
13822
+ size: "sm",
13763
13823
  lineClamp: 4,
13764
13824
  children: description
13765
13825
  }) : /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
13766
- size: "md",
13826
+ size: "sm",
13767
13827
  children: description
13768
13828
  }),
13769
13829
  isClamped && /*#__PURE__*/ jsxRuntime.jsx("button", {
@@ -13785,86 +13845,91 @@ const TextDescription = ({ description })=>{
13785
13845
  };
13786
13846
 
13787
13847
  const AnalysisCard = ({ title, description, type, icon, image, hasDemo, loginRequired, href, btnText })=>{
13788
- return /*#__PURE__*/ jsxRuntime.jsx(core$1.Stack, {
13789
- children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
13790
- className: "rounded-sm bg-base-max",
13791
- children: [
13792
- /*#__PURE__*/ jsxRuntime.jsx("div", {
13793
- className: "p-0 rounded-sm",
13794
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
13795
- component: Image,
13796
- src: `${image}`,
13797
- alt: `${title} image`,
13798
- height: 1000,
13799
- width: 1000,
13800
- radius: "md"
13801
- })
13802
- }),
13803
- /*#__PURE__*/ jsxRuntime.jsxs("div", {
13804
- className: "flex -mt-5 relative z-10",
13805
- children: [
13806
- /*#__PURE__*/ jsxRuntime.jsx("div", {
13807
- className: "p-0.5 rounded-sm bg-base-lightest ml-5 border-2 border-base",
13808
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
13809
- component: Image,
13810
- src: `${icon}`,
13811
- alt: `${title} logo`,
13812
- width: 40,
13813
- height: 40,
13814
- radius: "lg"
13848
+ return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Stack, {
13849
+ align: "stretch",
13850
+ justify: "space-between",
13851
+ className: "rounded-sm rounded-t-md bg-base-max p-0",
13852
+ children: [
13853
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
13854
+ className: "h-full",
13855
+ children: [
13856
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
13857
+ className: "p-0 rounded-sm h-1/2 h-max-1/2",
13858
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
13859
+ component: Image,
13860
+ src: `${image}`,
13861
+ alt: `${title} image`,
13862
+ height: 1000,
13863
+ width: 1000,
13864
+ radius: "md"
13865
+ })
13866
+ }),
13867
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
13868
+ className: "flex -mt-5 relative z-10",
13869
+ children: [
13870
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
13871
+ className: "p-0.5 rounded-sm bg-base-lightest ml-5 border-2 border-base w-1/5 h-1/5",
13872
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Image, {
13873
+ component: Image,
13874
+ src: `${icon}`,
13875
+ alt: `${title} logo`,
13876
+ width: 40,
13877
+ height: 40,
13878
+ radius: "lg"
13879
+ })
13880
+ }),
13881
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
13882
+ className: "relative mb-0 ml-2",
13883
+ children: /*#__PURE__*/ jsxRuntime.jsx("span", {
13884
+ className: "absolute bottom-0 left-0 text-xs text-gray-700 w-max",
13885
+ children: type === 'application' ? 'Application' : 'Jupyter Notebook'
13886
+ })
13815
13887
  })
13816
- }),
13817
- /*#__PURE__*/ jsxRuntime.jsx("div", {
13818
- className: "relative mb-0 ml-2",
13819
- children: /*#__PURE__*/ jsxRuntime.jsx("span", {
13820
- className: "absolute bottom-0 left-0 text-xs text-gray-700 w-max",
13821
- children: type === 'application' ? 'Application' : 'Jupyter Notebook'
13888
+ ]
13889
+ }),
13890
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
13891
+ className: "flex flex-col mt-2 ml-2",
13892
+ children: [
13893
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
13894
+ className: "text-sm font-black h-6",
13895
+ children: title
13896
+ }),
13897
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
13898
+ className: "text-xs text-gray-400 h-6",
13899
+ children: loginRequired ? 'Login Required' : ' '
13900
+ }),
13901
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
13902
+ className: "text-sm p-2 h-fit mt-2",
13903
+ children: /*#__PURE__*/ jsxRuntime.jsx(TextDescription, {
13904
+ description: description
13905
+ })
13822
13906
  })
13823
- })
13824
- ]
13825
- }),
13826
- /*#__PURE__*/ jsxRuntime.jsxs("div", {
13827
- className: "flex flex-col mt-2 ml-2",
13907
+ ]
13908
+ })
13909
+ ]
13910
+ }),
13911
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
13912
+ className: "flex mb-4 rounded-b-md",
13913
+ children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
13914
+ className: "m-auto",
13828
13915
  children: [
13829
- /*#__PURE__*/ jsxRuntime.jsx("div", {
13830
- className: "text-sm font-black h-6",
13831
- children: title
13832
- }),
13833
- /*#__PURE__*/ jsxRuntime.jsx("div", {
13834
- className: "text-xs text-gray-400 h-6",
13835
- children: loginRequired ? 'Login Required' : ' '
13836
- }),
13837
- /*#__PURE__*/ jsxRuntime.jsx("div", {
13838
- className: "text-sm p-2 h-fit",
13839
- children: /*#__PURE__*/ jsxRuntime.jsx(TextDescription, {
13840
- description: description
13841
- })
13916
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.NavLink, {
13917
+ component: Link,
13918
+ href: href ?? '_blank',
13919
+ classNames: {
13920
+ root: 'bg-accent text-accent-contrast hover:bg-accent-darker p-2 rounded-sm',
13921
+ label: 'text-sm font-semibold'
13922
+ },
13923
+ label: btnText ? btnText : `Run ${type === 'application' ? 'App' : 'Notebook'}`
13842
13924
  }),
13843
- /*#__PURE__*/ jsxRuntime.jsx("div", {
13844
- className: "flex mb-4 rounded-b-md",
13845
- children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
13846
- className: "m-auto",
13847
- children: [
13848
- /*#__PURE__*/ jsxRuntime.jsx(core$1.NavLink, {
13849
- component: Link,
13850
- href: href ?? '_blank',
13851
- classNames: {
13852
- root: 'bg-accent text-accent-contrast hover:bg-accent-darker p-2 rounded-sm',
13853
- label: 'text-sm font-semibold'
13854
- },
13855
- label: btnText ? btnText : `Run ${type === 'application' ? 'App' : 'Notebook'}`
13856
- }),
13857
- hasDemo && /*#__PURE__*/ jsxRuntime.jsx("button", {
13858
- className: "ml-2 p-1.5 rounded-sm text-sm font-semibold",
13859
- children: "Demo"
13860
- })
13861
- ]
13862
- })
13925
+ hasDemo && /*#__PURE__*/ jsxRuntime.jsx("button", {
13926
+ className: "ml-2 p-1.5 rounded-sm text-sm font-semibold",
13927
+ children: "Demo"
13863
13928
  })
13864
13929
  ]
13865
13930
  })
13866
- ]
13867
- })
13931
+ })
13932
+ ]
13868
13933
  }, title);
13869
13934
  };
13870
13935
 
@@ -13885,7 +13950,7 @@ const AnalysisCenter = ({ tools, showFilterAndSort = false })=>{
13885
13950
  if (!keyword.length) return;
13886
13951
  };
13887
13952
  return /*#__PURE__*/ jsxRuntime.jsxs("div", {
13888
- className: "w-full bg-base-lighter",
13953
+ className: "w-full bg-base-light p-4",
13889
13954
  children: [
13890
13955
  showFilterAndSort ? /*#__PURE__*/ jsxRuntime.jsxs("div", {
13891
13956
  className: "flex justify-between items-center w-7/8 mt-2 mx-2",
@@ -13935,7 +14000,7 @@ const AnalysisCenter = ({ tools, showFilterAndSort = false })=>{
13935
14000
  }) : null,
13936
14001
  /*#__PURE__*/ jsxRuntime.jsx("div", {
13937
14002
  children: /*#__PURE__*/ jsxRuntime.jsx("div", {
13938
- className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 p-1 mx-4 overflow-y-scroll",
14003
+ className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 p-1 mx-4 overflow-y-auto",
13939
14004
  children: tools.map(({ title, description, type, icon, image, hasDemo, loginRequired, href, btnText }, key)=>{
13940
14005
  return /*#__PURE__*/ jsxRuntime.jsx(AnalysisCard, {
13941
14006
  title,
@@ -14092,6 +14157,80 @@ const AnalysisCardCompact = ({ title, description, type = 'application', icon, h
14092
14157
  });
14093
14158
  };
14094
14159
 
14160
+ const GEN3_STATIC_NOTEBOOK_API = process.env.GEN3_STATIC_NOTEBOOK_API || `${core.GEN3_API}/api/staticNotebook`;
14161
+ const GEN3_STATIC_NOTEBOOK_DIR = process.env.GEN3_STATIC_NOTEBOOK_DIR || 'htmlNotebooks';
14162
+ const GEN3_STATIC_NOTEBOOK_PATH = process.env.GEN3_STATIC_NOTEBOOK_PATH || '/public';
14163
+
14164
+ const StaticNotebookViewer = ({ notebook })=>{
14165
+ const [htmlContent, setHtmlContent] = React.useState('');
14166
+ const [isError, setIsError] = React.useState(false);
14167
+ const [isLoading, setIsLoading] = React.useState(false);
14168
+ React.useEffect(()=>{
14169
+ async function fetchHtml() {
14170
+ const headers = new Headers();
14171
+ headers.set('Content-Type', 'application/json');
14172
+ setIsLoading(true);
14173
+ try {
14174
+ const response = await fetch(`${GEN3_STATIC_NOTEBOOK_API}?notebook=${notebook}`, {
14175
+ headers: headers
14176
+ });
14177
+ const json = await response.json();
14178
+ setHtmlContent(json.content);
14179
+ } catch (error) {
14180
+ if (error instanceof Error) {
14181
+ console.error(error.message);
14182
+ }
14183
+ setIsError(true);
14184
+ } finally{
14185
+ setIsLoading(false);
14186
+ }
14187
+ }
14188
+ fetchHtml();
14189
+ }, [
14190
+ notebook
14191
+ ]);
14192
+ if (isError) {
14193
+ return /*#__PURE__*/ jsxRuntime.jsx("div", {
14194
+ className: "flex w-full h-full",
14195
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Center, {
14196
+ children: /*#__PURE__*/ jsxRuntime.jsx(ErrorCard, {
14197
+ message: `Error loading notebook ${notebook}`
14198
+ })
14199
+ })
14200
+ });
14201
+ }
14202
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
14203
+ className: "flex w-full h-full",
14204
+ children: [
14205
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.LoadingOverlay, {
14206
+ visible: isLoading
14207
+ }),
14208
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
14209
+ dangerouslySetInnerHTML: {
14210
+ __html: htmlContent
14211
+ }
14212
+ })
14213
+ ]
14214
+ });
14215
+ };
14216
+
14217
+ const StaticNotebookIFrame = ({ notebook })=>{
14218
+ const router = router$1.useRouter();
14219
+ return /*#__PURE__*/ jsxRuntime.jsx("div", {
14220
+ className: "flex w-full h-full",
14221
+ children: /*#__PURE__*/ jsxRuntime.jsx("div", {
14222
+ className: "flex justify-items-center w-full",
14223
+ children: /*#__PURE__*/ jsxRuntime.jsx("iframe", {
14224
+ allow: "cross-origin",
14225
+ src: `${router.basePath}/${GEN3_STATIC_NOTEBOOK_DIR}/${notebook}`,
14226
+ width: "100%",
14227
+ height: "100%",
14228
+ title: "client notebook"
14229
+ })
14230
+ })
14231
+ });
14232
+ };
14233
+
14095
14234
  const myGlob = (dir, filter)=>{
14096
14235
  try {
14097
14236
  const files = fs.readdirSync(dir);
@@ -14174,10 +14313,25 @@ var ContentSource$1 = ContentSource.getInstance();
14174
14313
  let bannerConfigJSON = [];
14175
14314
  try {
14176
14315
  bannerConfigJSON = await ContentSource$1.getContentDatabase().get(`${core.GEN3_COMMONS_NAME}/banner.json`);
14177
- } catch (e) {
14316
+ } catch (error) {
14178
14317
  console.warn('No banner config found at: ', `${core.GEN3_COMMONS_NAME}/banner.json`);
14179
14318
  }
14180
14319
  const { topBar, navigation, type = 'original' } = navigationConfigJSON;
14320
+ let headerMetadata = {
14321
+ title: 'Gen3 Frontend Framework Page',
14322
+ content: 'Gen3 Frontend Framework Page',
14323
+ key: 'gen3-common-page'
14324
+ };
14325
+ try {
14326
+ const loadedHeaderMetadata = await ContentSource$1.getContentDatabase().get(`${core.GEN3_COMMONS_NAME}/headerMetadata.json`);
14327
+ if (isHeaderMetadata(loadedHeaderMetadata)) {
14328
+ headerMetadata = loadedHeaderMetadata;
14329
+ } else {
14330
+ console.warn('headerMetadata is not a valid HeaderMetadata object');
14331
+ }
14332
+ } catch (error) {
14333
+ console.warn('No headerMetadata config found at: ', `${core.GEN3_COMMONS_NAME}/headerMetadata.json`);
14334
+ }
14181
14335
  const headerProps = {
14182
14336
  top: topBar,
14183
14337
  navigation: navigation,
@@ -14188,11 +14342,7 @@ var ContentSource$1 = ContentSource.getInstance();
14188
14342
  return {
14189
14343
  headerProps,
14190
14344
  footerProps,
14191
- headerData: {
14192
- title: 'Gen3 Frontend Framework Page',
14193
- content: 'Gen3 Frontend Framework Page',
14194
- key: 'gen3-common-page'
14195
- }
14345
+ headerMetadata
14196
14346
  };
14197
14347
  };
14198
14348
 
@@ -15358,6 +15508,8 @@ const createFacetPanel = (facet, chartType, valueLabel, hooks)=>{
15358
15508
  return null;
15359
15509
  };
15360
15510
 
15511
+ const GEN3_COHORT_DISCOVERY_API = process.env.GEN3_COHORT_DISCOVERY_API || `${core.GEN3_API}/api/auth/analysis/cohortDiscovery`;
15512
+
15361
15513
  const useGraphQLData = (url, body, skip)=>{
15362
15514
  // Create a fetcher function that handles the GraphQL POST request
15363
15515
  const fetcher = async (fetchUrl, fetchBody)=>{
@@ -15407,391 +15559,12 @@ const useGraphQLData = (url, body, skip)=>{
15407
15559
  const useRoundedAggsQuery = ({ type, fields, filters, accessibility = core.Accessibility.ALL }, { skip } = {
15408
15560
  skip: false
15409
15561
  })=>{
15410
- const response = useGraphQLData('/api/analysis/cohortDiscovery', core.buildGetAggregationQuery(type, fields, filters, accessibility, false), skip);
15562
+ const response = useGraphQLData(GEN3_COHORT_DISCOVERY_API, core.buildGetAggregationQuery(type, fields, filters, accessibility, false), skip);
15411
15563
  return {
15412
15564
  ...response,
15413
15565
  data: response?.data?.data ? core.processHistogramResponse(response?.data.data?._aggregation[type] ?? {}) : {}
15414
15566
  };
15415
- }; // import { cohortDiscoveryApi } from './appApi';
15416
- //
15417
- // import {
15418
- // Accessibility,
15419
- // convertFilterSetToGqlFilter,
15420
- // FilterSet,
15421
- // isFilterEmpty,
15422
- // AggregationsData,
15423
- // RawDataAndTotalCountsParams,
15424
- // GraphQLQuery,
15425
- // } from '@gen3/core';
15426
- //
15427
- // /*
15428
- // returns all the fields for a given type
15429
- // @param type: the type to get fields for
15430
- // @returns: a list of fields for the given type
15431
- // */
15432
- //
15433
- // interface AccessibleDataSliceParams {
15434
- // type: string;
15435
- // fields: ReadonlyArray<string>;
15436
- // accessType: Accessibility;
15437
- // }
15438
- //
15439
- // interface QueryAggsParams {
15440
- // type: string;
15441
- // fields: ReadonlyArray<string>;
15442
- // filters: FilterSet;
15443
- // accessibility?: Accessibility;
15444
- // }
15445
- //
15446
- // interface QueryForSubAggsParams {
15447
- // type: string;
15448
- // mainField: string;
15449
- // numericAggAsText: boolean;
15450
- // termsFields?: ReadonlyArray<string>;
15451
- // missingFields?: ReadonlyArray<string>;
15452
- // gqlFilter?: FilterSet;
15453
- // accessibility?: Accessibility;
15454
- // }
15455
- //
15456
- // interface QueryCountsParams {
15457
- // type: string;
15458
- // filters: FilterSet;
15459
- // accessibility?: Accessibility;
15460
- // }
15461
- //
15462
- // interface QueryForFileCountSummaryParams {
15463
- // type: string;
15464
- // field: string;
15465
- // filters: FilterSet;
15466
- // accessibility?: Accessibility;
15467
- // }
15468
- //
15469
- // /**
15470
- // * The main endpoint used in templating Exploration page queries.
15471
- // * Includes table, filter and aggregation query types and leverages guppyApi defined in ./gupplApi.ts
15472
- // * Query templates support filters where applicable
15473
- // *
15474
- // * @param endpoints - Defines endpoints used in Exploration page:
15475
- // * @param getAllFieldsForType - A mapping query that returns all property key names vertex types specified.
15476
- // * @see https://github.com/uc-cdis/guppy/blob/master/doc/queries.md#mapping-query
15477
- // * @param getAccessibleData - An aggregation histogram counts query that filters based on access type
15478
- // * @see https://github.com/uc-cdis/guppy/blob/master/doc/queries.md#accessibility-argument-for-regular-tier-access-level
15479
- // * @param getRawDataAndTotalCounts - Queries both _totalCount for selected vertex types and
15480
- // * tabular results containing the raw data in the rows of selected vertex types
15481
- // * @see https://github.com/uc-cdis/guppy/blob/master/doc/queries.md#1-total-count-aggregation
15482
- // * @param getAggs - An aggregated histogram counts query which outputs vertex property frequencies
15483
- // * @param getSubAggs - TODO: not sure what this one does. Looks like nested aggregation
15484
- // * @param getCounts - Returns total counts of a vertex type
15485
- // * @returns: A guppy API endpoint for templating queryable data displayed on the exploration page
15486
- // */
15487
- // const explorerApi = cohortDiscoveryApi.injectEndpoints({
15488
- // endpoints: (builder) => ({
15489
- // getAllFieldsForType: builder.query({
15490
- // query: (type: { type: string }) => ({
15491
- // query: `{ _mapping ${type} } }`,
15492
- // }),
15493
- // transformResponse: (response: Record<string, any>, _meta, params) => {
15494
- // return response[params.type];
15495
- // },
15496
- // }),
15497
- // getAccessibleData: builder.query({
15498
- // query: ({ type, fields, accessType }: AccessibleDataSliceParams) => {
15499
- // const fieldParts = fields.map(
15500
- // (field) => `${field} { histogram { key count } }`,
15501
- // );
15502
- // },
15503
- // }),
15504
- // getRawDataAndTotalCounts: builder.query({
15505
- // query: ({
15506
- // type,
15507
- // fields,
15508
- // filters,
15509
- // sort,
15510
- // offset = 0,
15511
- // size = 20,
15512
- // accessibility = Accessibility.ALL,
15513
- // format = undefined,
15514
- // }: RawDataAndTotalCountsParams) => {
15515
- // const gqlFilter = convertFilterSetToGqlFilter(filters);
15516
- // const params = [
15517
- // ...(sort ? ['$sort: JSON'] : []),
15518
- // ...(gqlFilter ? ['$filter: JSON'] : []),
15519
- // ...(format ? ['$format: Format'] : []),
15520
- // ].join(',');
15521
- // const queryLine = `query getRawDataAndTotalCounts (${params}) {`;
15522
- //
15523
- // const dataParams = [
15524
- // ...(format ? ['format: $format'] : []),
15525
- // ...(sort ? ['sort: $sort'] : []),
15526
- // ...(gqlFilter ? ['filter: $filter'] : []),
15527
- // ].join(',');
15528
- // const dataTypeLine = `${type} (accessibility: ${accessibility}, offset: ${offset}, first: ${size},
15529
- // ${dataParams}) {`;
15530
- //
15531
- // const typeAggsLine = `${type} (${
15532
- // gqlFilter && 'filter: $filter,'
15533
- // } accessibility: ${accessibility}) {`;
15534
- //
15535
- // const processedFields = fields.map((field) =>
15536
- // rawDataQueryStrForEachField(field),
15537
- // );
15538
- //
15539
- // const query = `${queryLine}
15540
- // ${dataTypeLine}
15541
- // ${processedFields.join(' ')}
15542
- // }
15543
- // _aggregation {
15544
- // ${typeAggsLine}
15545
- // _totalCount
15546
- // }
15547
- // }
15548
- // }`;
15549
- // const variables = {
15550
- // ...(sort && { sort }),
15551
- // ...(gqlFilter && { filter: gqlFilter }),
15552
- // ...(format && { format }),
15553
- // };
15554
- // return { query, variables };
15555
- // },
15556
- // }),
15557
- // getAggs: builder.query<AggregationsData, QueryAggsParams>({
15558
- // query: ({
15559
- // type,
15560
- // fields,
15561
- // filters,
15562
- // accessibility = Accessibility.ALL,
15563
- // }: QueryAggsParams) => {
15564
- // const queryStart = isFilterEmpty(filters)
15565
- // ? `
15566
- // query getAggs {
15567
- // _aggregation {
15568
- // ${type} (accessibility: ${accessibility}) {`
15569
- // : `query getAggs ($filter: JSON) {
15570
- // _aggregation {
15571
- // ${type} (filter: $filter, filterSelf: false, accessibility: ${accessibility}) {`;
15572
- // const query = `${queryStart}
15573
- // ${fields.map((field: string) =>
15574
- // histogramQueryStrForEachField(field),
15575
- // )}
15576
- // }
15577
- // }
15578
- // }`;
15579
- // const queryBody: GraphQLQuery = {
15580
- // query: query,
15581
- // variables: { filter: convertFilterSetToGqlFilter(filters) },
15582
- // };
15583
- // return queryBody;
15584
- // },
15585
- // }),
15586
- // getAggsNoFilterSelf: builder.query<AggregationsData, QueryAggsParams>({
15587
- // query: ({
15588
- // type,
15589
- // fields,
15590
- // filters,
15591
- // accessibility = Accessibility.ALL,
15592
- // }: QueryAggsParams) => {
15593
- // const queryStart = isFilterEmpty(filters)
15594
- // ? `
15595
- // query getAggs {
15596
- // _aggregation {
15597
- // ${type} (accessibility: ${accessibility}) {`
15598
- // : `query getAggs ($filter: JSON) {
15599
- // _aggregation {
15600
- // ${type} (filter: $filter, filterSelf: true, accessibility: ${accessibility}) {`;
15601
- // const query = `${queryStart}
15602
- // ${fields.map((field: string) =>
15603
- // histogramQueryStrForEachField(field),
15604
- // )}
15605
- // }
15606
- // }
15607
- // }`;
15608
- // const queryBody: GraphQLQuery = {
15609
- // query: query,
15610
- // variables: { filter: convertFilterSetToGqlFilter(filters) },
15611
- // };
15612
- // return queryBody;
15613
- // },
15614
- // }),
15615
- // getSubAggs: builder.query<AggregationsData, QueryForSubAggsParams>({
15616
- // query: ({
15617
- // type,
15618
- // mainField,
15619
- // termsFields = undefined,
15620
- // missingFields = undefined,
15621
- // numericAggAsText = false,
15622
- // gqlFilter = undefined,
15623
- // accessibility = Accessibility.ALL,
15624
- // }: QueryForSubAggsParams) => {
15625
- // const nestedAggFields = {
15626
- // termsFields: termsFields,
15627
- // missingFields: missingFields,
15628
- // };
15629
- //
15630
- // const query = `query getSubAggs ( ${
15631
- // gqlFilter ?? '$filter: JSON,'
15632
- // } $nestedAggFields: JSON) {
15633
- // _aggregation {
15634
- // ${type} ( ${
15635
- // gqlFilter ?? 'filter: $filter, filterSelf: false,'
15636
- // } nestedAggFields: $nestedAggFields, accessibility: ${accessibility}) {
15637
- // ${nestedHistogramQueryStrForEachField(mainField, numericAggAsText)}
15638
- // }`;
15639
- //
15640
- // return {
15641
- // query: query,
15642
- // variables: {
15643
- // ...(gqlFilter && {
15644
- // filter: convertFilterSetToGqlFilter(gqlFilter),
15645
- // }),
15646
- // nestedAggFields: nestedAggFields,
15647
- // },
15648
- // };
15649
- // },
15650
- // }),
15651
- // getCounts: builder.query<number, QueryCountsParams>({
15652
- // query: ({
15653
- // type,
15654
- // filters,
15655
- // accessibility = Accessibility.ALL,
15656
- // }: QueryCountsParams) => {
15657
- // const gqlFilters = convertFilterSetToGqlFilter(filters);
15658
- // const queryLine = `query totalCounts ${
15659
- // gqlFilters ? '($filter: JSON)' : ''
15660
- // }{`;
15661
- // const typeAggsLine = `${type} ${
15662
- // gqlFilters ? '(filter: $filter, ' : '('
15663
- // } accessibility: ${accessibility}) {`;
15664
- //
15665
- // const query = `${queryLine} _aggregation {
15666
- // ${typeAggsLine}
15667
- // _totalCount
15668
- // }
15669
- // }
15670
- // }`;
15671
- // return {
15672
- // query: query,
15673
- // variables: {
15674
- // ...(gqlFilters && {
15675
- // filter: gqlFilters,
15676
- // }),
15677
- // },
15678
- // };
15679
- // },
15680
- // }),
15681
- // getFieldCountSummary: builder.query<
15682
- // Record<string, any>,
15683
- // QueryForFileCountSummaryParams
15684
- // >({
15685
- // query: ({
15686
- // type,
15687
- // field,
15688
- // filters,
15689
- // accessibility = Accessibility.ALL,
15690
- // }: QueryForFileCountSummaryParams) => {
15691
- // const gqlFilters = convertFilterSetToGqlFilter(filters);
15692
- // const query = `query summary ($filter: JSON) {
15693
- // _aggregation {
15694
- // ${type} (filter: $filter, accessibility: ${accessibility}) {
15695
- // ${field} {
15696
- // histogram {
15697
- // sum,
15698
- // }
15699
- // }
15700
- // }
15701
- // }
15702
- // }`;
15703
- // return {
15704
- // query: query,
15705
- // variables: {
15706
- // ...(gqlFilters && {
15707
- // filter: gqlFilters,
15708
- // }),
15709
- // },
15710
- // };
15711
- // },
15712
- // }),
15713
- // getFieldsForIndex: builder.query({
15714
- // query: (index: string) => {
15715
- // return {
15716
- // query: `{
15717
- // _mapping { ${index} }
15718
- // }`,
15719
- // };
15720
- // },
15721
- // }),
15722
- // }),
15723
- // });
15724
- //
15725
- // // query for aggregate data
15726
- // // convert the function below to typescript
15727
- //
15728
- // const histogramQueryStrForEachField = (field: string): string => {
15729
- // const splittedFieldArray = field.split('.');
15730
- // const splittedField = splittedFieldArray.shift();
15731
- // if (splittedFieldArray.length === 0) {
15732
- // return `
15733
- // ${splittedField} {
15734
- // histogram {
15735
- // key
15736
- // count
15737
- // }
15738
- // }`;
15739
- // }
15740
- // return `
15741
- // ${splittedField} {
15742
- // ${histogramQueryStrForEachField(splittedFieldArray.join('.'))}
15743
- // }`;
15744
- // };
15745
- //
15746
- // const nestedHistogramQueryStrForEachField = (
15747
- // mainField: string,
15748
- // numericAggAsText: boolean,
15749
- // ) => `
15750
- // ${mainField} {
15751
- // ${numericAggAsText ? 'asTextHistogram' : 'histogram'} {
15752
- // key
15753
- // count
15754
- // missingFields {
15755
- // field
15756
- // count
15757
- // }
15758
- // termsFields {
15759
- // field
15760
- // count
15761
- // terms {
15762
- // key
15763
- // count
15764
- // }
15765
- // }
15766
- // }
15767
- // }`;
15768
- //
15769
- // export const rawDataQueryStrForEachField = (field: string): string => {
15770
- // const splitFieldArray = field.split('.');
15771
- // const splitField = splitFieldArray.shift();
15772
- // if (splitFieldArray.length === 0) {
15773
- // return `
15774
- // ${splitField}
15775
- // `;
15776
- // }
15777
- // return `
15778
- // ${splitField} {
15779
- // ${rawDataQueryStrForEachField(splitFieldArray.join('.'))}
15780
- // }`;
15781
- // };
15782
- //
15783
- // export const {
15784
- // useGetRawDataAndTotalCountsQuery,
15785
- // useGetAccessibleDataQuery,
15786
- // useGetAllFieldsForTypeQuery,
15787
- // useGetAggsQuery,
15788
- // useGetAggsNoFilterSelfQuery,
15789
- // useLazyGetAggsQuery,
15790
- // useGetSubAggsQuery,
15791
- // useGetCountsQuery,
15792
- // useGetFieldCountSummaryQuery,
15793
- // useGetFieldsForIndexQuery,
15794
- // } = explorerApi;
15567
+ };
15795
15568
 
15796
15569
  const NUM_COLS = 2; // TODO: add to config
15797
15570
  /**
@@ -16992,13 +16765,11 @@ const RequestsTable = ()=>{
16992
16765
  };
16993
16766
 
16994
16767
  const RequestsPanel = ()=>{
16995
- return /*#__PURE__*/ jsxRuntime.jsx(ProtectedContent, {
16996
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Stack, {
16997
- className: "w-100 m-2",
16998
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Group, {
16999
- className: "w-100 bg-base-light p-4",
17000
- children: /*#__PURE__*/ jsxRuntime.jsx(RequestsTable, {})
17001
- })
16768
+ return /*#__PURE__*/ jsxRuntime.jsx(core$1.Stack, {
16769
+ className: "w-100 m-2",
16770
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Group, {
16771
+ className: "w-100 bg-base-light p-4",
16772
+ children: /*#__PURE__*/ jsxRuntime.jsx(RequestsTable, {})
17002
16773
  })
17003
16774
  });
17004
16775
  };
@@ -17054,79 +16825,81 @@ const CohortDiscovery = (config)=>{
17054
16825
  const indexResources = extractIndexResourceFromConfiguration(config);
17055
16826
  useAppDispatch(loadCohortsFromStorage());
17056
16827
  return /*#__PURE__*/ jsxRuntime.jsx(React.Fragment, {
17057
- children: /*#__PURE__*/ jsxRuntime.jsxs(react$1.PersistGate, {
17058
- persistor: persistor,
17059
- loading: /*#__PURE__*/ jsxRuntime.jsx(core$1.Loader, {
17060
- variant: "dots"
17061
- }),
17062
- children: [
17063
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Title, {
17064
- order: 3,
17065
- className: "absolute top-6 left-[154px]",
17066
- children: "Cohort Discovery"
16828
+ children: /*#__PURE__*/ jsxRuntime.jsx(ProtectedContent, {
16829
+ children: /*#__PURE__*/ jsxRuntime.jsxs(react$1.PersistGate, {
16830
+ persistor: persistor,
16831
+ loading: /*#__PURE__*/ jsxRuntime.jsx(core$1.Loader, {
16832
+ variant: "dots"
17067
16833
  }),
17068
- /*#__PURE__*/ jsxRuntime.jsxs(core$1.Tabs, {
17069
- keepMounted: false,
17070
- defaultValue: "build",
17071
- orientation: "vertical",
17072
- classNames: {
17073
- root: 'w-full h-full',
17074
- list: 'bg-base-light before:content-none pt-20',
17075
- tab: 'border-0 border-l-4 rounded-none data-[active=true]:border-accent-warm data-[active=true]:bg-base-max text-center',
17076
- tabLabel: 'w-full',
17077
- panel: 'pt-16'
17078
- },
17079
- children: [
17080
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.List, {
17081
- children: Object.keys(config.leftNav).map((key)=>{
17082
- return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Tabs.Tab, {
17083
- value: key,
17084
- children: [
17085
- /*#__PURE__*/ jsxRuntime.jsx(Image, {
17086
- src: config.leftNav[key].image,
17087
- alt: config.leftNav[key].imageAlt,
17088
- width: 40,
17089
- height: 40,
17090
- className: "inline-block mb-1"
17091
- }),
17092
- /*#__PURE__*/ jsxRuntime.jsx("strong", {
17093
- className: "block",
17094
- children: config.leftNav[key].title
17095
- })
17096
- ]
17097
- }, key);
17098
- })
17099
- }),
17100
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
17101
- value: "build",
17102
- children: config.dataIndexes.length === 1 ? /*#__PURE__*/ jsxRuntime.jsx(IndexPanel, {
17103
- dataConfig: config.dataIndexes[0].dataConfig,
17104
- tabTitle: config.dataIndexes[0].tabTitle,
17105
- tabs: config.dataIndexes[0].tabs,
17106
- emptySelection: config.emptySelection,
17107
- resourceField: config.dataIndexes[0].resourceField,
17108
- numColumns: config.dataIndexes[0].numColumns ?? 2,
17109
- indexResources: indexResources,
17110
- remoteSupportService: config.remoteSupportService
17111
- }) : /*#__PURE__*/ jsxRuntime.jsx(TabbedIndex, {
17112
- config: config,
17113
- indexResources: indexResources
17114
- })
17115
- }),
17116
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
17117
- value: "saved",
17118
- children: /*#__PURE__*/ jsxRuntime.jsx(SavedCohortsPanel, {
17119
- indexResources: indexResources,
17120
- remoteSupportService: config.remoteSupportService
16834
+ children: [
16835
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Title, {
16836
+ order: 3,
16837
+ className: "absolute top-6 left-[154px]",
16838
+ children: "Cohort Discovery"
16839
+ }),
16840
+ /*#__PURE__*/ jsxRuntime.jsxs(core$1.Tabs, {
16841
+ keepMounted: false,
16842
+ defaultValue: "build",
16843
+ orientation: "vertical",
16844
+ classNames: {
16845
+ root: 'w-full h-full',
16846
+ list: 'bg-base-light before:content-none pt-20',
16847
+ tab: 'border-0 border-l-4 rounded-none data-[active=true]:border-accent-warm data-[active=true]:bg-base-max text-center',
16848
+ tabLabel: 'w-full',
16849
+ panel: 'pt-16'
16850
+ },
16851
+ children: [
16852
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.List, {
16853
+ children: Object.keys(config.leftNav).map((key)=>{
16854
+ return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Tabs.Tab, {
16855
+ value: key,
16856
+ children: [
16857
+ /*#__PURE__*/ jsxRuntime.jsx(Image, {
16858
+ src: config.leftNav[key].image,
16859
+ alt: config.leftNav[key].imageAlt,
16860
+ width: 40,
16861
+ height: 40,
16862
+ className: "inline-block mb-1"
16863
+ }),
16864
+ /*#__PURE__*/ jsxRuntime.jsx("strong", {
16865
+ className: "block",
16866
+ children: config.leftNav[key].title
16867
+ })
16868
+ ]
16869
+ }, key);
16870
+ })
16871
+ }),
16872
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
16873
+ value: "build",
16874
+ children: config.dataIndexes.length === 1 ? /*#__PURE__*/ jsxRuntime.jsx(IndexPanel, {
16875
+ dataConfig: config.dataIndexes[0].dataConfig,
16876
+ tabTitle: config.dataIndexes[0].tabTitle,
16877
+ tabs: config.dataIndexes[0].tabs,
16878
+ emptySelection: config.emptySelection,
16879
+ resourceField: config.dataIndexes[0].resourceField,
16880
+ numColumns: config.dataIndexes[0].numColumns ?? 2,
16881
+ indexResources: indexResources,
16882
+ remoteSupportService: config.remoteSupportService
16883
+ }) : /*#__PURE__*/ jsxRuntime.jsx(TabbedIndex, {
16884
+ config: config,
16885
+ indexResources: indexResources
16886
+ })
16887
+ }),
16888
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
16889
+ value: "saved",
16890
+ children: /*#__PURE__*/ jsxRuntime.jsx(SavedCohortsPanel, {
16891
+ indexResources: indexResources,
16892
+ remoteSupportService: config.remoteSupportService
16893
+ })
16894
+ }),
16895
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
16896
+ value: "request",
16897
+ children: /*#__PURE__*/ jsxRuntime.jsx(RequestsPanel, {})
17121
16898
  })
17122
- }),
17123
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
17124
- value: "request",
17125
- children: /*#__PURE__*/ jsxRuntime.jsx(RequestsPanel, {})
17126
- })
17127
- ]
17128
- })
17129
- ]
16899
+ ]
16900
+ })
16901
+ ]
16902
+ })
17130
16903
  })
17131
16904
  });
17132
16905
  };
@@ -19592,7 +19365,7 @@ const DiscoveryPage = ({ headerProps, footerProps, discoveryConfig })=>{
19592
19365
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
19593
19366
  headerProps,
19594
19367
  footerProps,
19595
- headerData: {
19368
+ headerMetadata: {
19596
19369
  title: 'Gen3 Discovery Page',
19597
19370
  content: 'Discovery Data',
19598
19371
  key: 'gen3-discovery-page',
@@ -19648,7 +19421,7 @@ const QueryPage = ({ headerProps, footerProps, queryProps })=>{
19648
19421
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
19649
19422
  headerProps,
19650
19423
  footerProps,
19651
- headerData: {
19424
+ headerMetadata: {
19652
19425
  title: 'Gen3 Query Page',
19653
19426
  content: 'Query page',
19654
19427
  key: 'gen3-query-page',
@@ -19821,7 +19594,7 @@ const LandingPage = ({ headerProps, footerProps, landingPage })=>{
19821
19594
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
19822
19595
  footerProps,
19823
19596
  headerProps,
19824
- headerData: {
19597
+ headerMetadata: {
19825
19598
  title: 'Gen3 Home Page',
19826
19599
  content: 'Home page',
19827
19600
  key: 'gen3-home-page',
@@ -19862,7 +19635,7 @@ const ExplorerPage = ({ headerProps, footerProps, explorerConfig, headerMetadata
19862
19635
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
19863
19636
  headerProps,
19864
19637
  footerProps,
19865
- headerData: {
19638
+ headerMetadata: {
19866
19639
  title: 'Gen3 Explorer Page',
19867
19640
  content: 'Explorer Page',
19868
19641
  key: 'gen3-explorer-page',
@@ -19884,6 +19657,11 @@ var GuppyDataAccessMode = /*#__PURE__*/ function(GuppyDataAccessMode) {
19884
19657
  return GuppyDataAccessMode;
19885
19658
  }({});
19886
19659
 
19660
+ const DefaultHeaderMetadata = {
19661
+ title: 'Gen3 Explorer Page',
19662
+ content: 'Explorer Page',
19663
+ key: 'gen3-explorer-page'
19664
+ };
19887
19665
  const GetSharedFieldMapping = async (cohortBuilderConfiguration)=>{
19888
19666
  let sharedFiltersMap = null;
19889
19667
  if (cohortBuilderConfiguration?.sharedFilters) {
@@ -19940,9 +19718,7 @@ const ExplorerPageGetServerSideProps = async ()=>{
19940
19718
  props: {
19941
19719
  ...await getNavPageLayoutPropsFromConfig(),
19942
19720
  explorerConfig: cohortBuilderConfiguration,
19943
- headerMetadata: {
19944
- ...cohortBuilderConfiguration?.headerMetadata
19945
- }
19721
+ headerMetadata: cohortBuilderConfiguration?.headerMetadata ? cohortBuilderConfiguration.headerMetadata : DefaultHeaderMetadata
19946
19722
  }
19947
19723
  };
19948
19724
  }
@@ -19953,7 +19729,7 @@ const ExplorerPageGetServerSideProps = async ()=>{
19953
19729
  sharedFiltersMap: sharedFiltersMap,
19954
19730
  tabsLayout: cohortBuilderConfiguration?.tabsLayout ?? 'left',
19955
19731
  explorerConfig: cohortBuilderConfiguration.explorerConfig,
19956
- headerMetadata: cohortBuilderConfiguration.headerMetadata,
19732
+ // headerMetadata: cohortBuilderConfiguration.headerMetadata,
19957
19733
  accessControl: {
19958
19734
  ...DefaultAccessControlConfiguration,
19959
19735
  ...cohortBuilderConfiguration.accessControl ?? {}
@@ -19983,9 +19759,7 @@ const ExplorerPageGetServerSidePropsForConfigId = async (context)=>{
19983
19759
  props: {
19984
19760
  ...await getNavPageLayoutPropsFromConfig(),
19985
19761
  explorerConfig: cohortBuilderConfiguration,
19986
- headerMetadata: {
19987
- ...cohortBuilderConfiguration?.headerMetadata
19988
- }
19762
+ headerMetadata: cohortBuilderConfiguration?.headerMetadata ? cohortBuilderConfiguration.headerMetadata : DefaultHeaderMetadata
19989
19763
  }
19990
19764
  };
19991
19765
  }
@@ -19996,7 +19770,7 @@ const ExplorerPageGetServerSidePropsForConfigId = async (context)=>{
19996
19770
  sharedFiltersMap: sharedFiltersMap,
19997
19771
  tabsLayout: cohortBuilderConfiguration?.tabsLayout ?? 'left',
19998
19772
  explorerConfig: cohortBuilderConfiguration.explorerConfig,
19999
- headerMetadata: cohortBuilderConfiguration.headerMetadata,
19773
+ // headerMetadata: { ...(cohortBuilderConfiguration?.headerMetadata ? cohortBuilderConfiguration.headerMetadata : {}) },
20000
19774
  accessControl: {
20001
19775
  ...DefaultAccessControlConfiguration,
20002
19776
  ...cohortBuilderConfiguration.accessControl ?? {}
@@ -20356,7 +20130,7 @@ const ColorThemePage = ({ headerProps, footerProps })=>{
20356
20130
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
20357
20131
  headerProps,
20358
20132
  footerProps,
20359
- headerData: {
20133
+ headerMetadata: {
20360
20134
  title: 'Gen3 Theme Page',
20361
20135
  content: 'Theme page',
20362
20136
  key: 'gen3-theme-page'
@@ -20934,7 +20708,7 @@ const ProfilePage = ({ headerProps, footerProps, profileConfig })=>{
20934
20708
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
20935
20709
  headerProps,
20936
20710
  footerProps,
20937
- headerData: {
20711
+ headerMetadata: {
20938
20712
  title: 'Gen3 Profile Page',
20939
20713
  content: 'Profile page',
20940
20714
  key: 'gen3-profile-page',
@@ -20962,7 +20736,7 @@ const LoginPage = ({ headerProps, footerProps, loginConfig })=>{
20962
20736
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
20963
20737
  headerProps,
20964
20738
  footerProps,
20965
- headerData: {
20739
+ headerMetadata: {
20966
20740
  title: 'Gen3 Login Page',
20967
20741
  content: 'Login page',
20968
20742
  key: 'gen3-login-page',
@@ -20993,7 +20767,7 @@ const DictionaryPage = ({ headerProps, footerProps, config })=>{
20993
20767
  mainProps: {
20994
20768
  fixed: true
20995
20769
  },
20996
- headerData: {
20770
+ headerMetadata: {
20997
20771
  title: 'Gen3 DataDictionary Page',
20998
20772
  content: 'Data Dictionary',
20999
20773
  key: 'gen3-data-dictionary-page',
@@ -21718,7 +21492,7 @@ const AuthzPage = ({ headerProps, footerProps, authz })=>{
21718
21492
  headerProps,
21719
21493
  footerProps,
21720
21494
  headerProps: headerProps,
21721
- headerData: {
21495
+ headerMetadata: {
21722
21496
  title: 'Gen3 Authz Editor Page',
21723
21497
  content: 'Authz Editor page',
21724
21498
  key: 'gen3-authz-editor-page'
@@ -22045,7 +21819,7 @@ const SubmissionPage = ({ submissionConfig, headerProps, footerProps })=>{
22045
21819
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
22046
21820
  footerProps: footerProps,
22047
21821
  headerProps: headerProps,
22048
- headerData: {
21822
+ headerMetadata: {
22049
21823
  title: 'Gen3 Submission Page',
22050
21824
  content: 'Submission page',
22051
21825
  key: 'gen3-submission-page'
@@ -22080,7 +21854,7 @@ const WorkspacePage = ({ headerProps, footerProps, workspaceProps })=>{
22080
21854
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
22081
21855
  headerProps,
22082
21856
  footerProps,
22083
- headerData: {
21857
+ headerMetadata: {
22084
21858
  title: 'Gen3 Workspace Page',
22085
21859
  content: 'Workspace page',
22086
21860
  key: 'gen3-workspace-page',
@@ -22097,7 +21871,7 @@ const WorkspaceNoAccessPage = ({ headerProps, footerProps })=>{
22097
21871
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
22098
21872
  headerProps,
22099
21873
  footerProps,
22100
- headerData: {
21874
+ headerMetadata: {
22101
21875
  title: 'Gen3 Workspace No Access Page',
22102
21876
  content: 'Workspace no access page',
22103
21877
  key: 'gen3-workspace-no-access-page'
@@ -22161,7 +21935,7 @@ const AnalysisPage = ({ headerProps, footerProps, tools, sections, classNames })
22161
21935
  return /*#__PURE__*/ jsxRuntime.jsxs(NavPageLayout, {
22162
21936
  headerProps,
22163
21937
  footerProps,
22164
- headerData: {
21938
+ headerMetadata: {
22165
21939
  title: 'Gen3 Analysis Center',
22166
21940
  content: 'Analysis Center',
22167
21941
  key: 'gen3-analysis-center'
@@ -22811,7 +22585,7 @@ const AnalysisEditorPage = ({ headerProps, footerProps })=>{
22811
22585
  headerProps,
22812
22586
  footerProps,
22813
22587
  headerProps: headerProps,
22814
- headerData: {
22588
+ headerMetadata: {
22815
22589
  title: 'Gen3 Analysis Editor Page',
22816
22590
  content: 'Analysis Editor page',
22817
22591
  key: 'gen3-analysis-editor-page'
@@ -22844,7 +22618,7 @@ const AISearchPage = ({ headerProps, footerProps })=>{
22844
22618
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
22845
22619
  headerProps,
22846
22620
  footerProps,
22847
- headerData: {
22621
+ headerMetadata: {
22848
22622
  title: 'Gen3 AI Search Page',
22849
22623
  content: 'AI Search',
22850
22624
  key: 'gen3-ai-search-page'
@@ -22874,7 +22648,7 @@ const AISearchPageGetServerSideProps = async ()=>{
22874
22648
  navigation: {}
22875
22649
  },
22876
22650
  footerProps: {},
22877
- headerData: {
22651
+ headerMetadata: {
22878
22652
  title: 'Gen3 AI Search Page',
22879
22653
  content: 'AI Search',
22880
22654
  key: 'gen3-ai-search-page'
@@ -22889,7 +22663,7 @@ const NotebookLitePage = ({ headerProps, footerProps })=>{
22889
22663
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
22890
22664
  footerProps,
22891
22665
  headerProps,
22892
- headerData: {
22666
+ headerMetadata: {
22893
22667
  title: 'Gen3 Notebooks Lite Page',
22894
22668
  content: 'Notebooks Lite',
22895
22669
  key: 'gen3-notebooks-lite-page'
@@ -24954,7 +24728,7 @@ const DataLibraryPage = ({ headerProps, footerProps, config })=>{
24954
24728
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
24955
24729
  headerProps,
24956
24730
  footerProps,
24957
- headerData: {
24731
+ headerMetadata: {
24958
24732
  title: 'Gen3 DataLibrary Page',
24959
24733
  content: 'DataLibrary Data',
24960
24734
  key: 'gen3-data-library-page'
@@ -25246,7 +25020,7 @@ const CrosswalkPage = ({ headerProps, footerProps, config })=>{
25246
25020
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
25247
25021
  headerProps,
25248
25022
  footerProps,
25249
- headerData: {
25023
+ headerMetadata: {
25250
25024
  title: 'Gen3 Crosswalk Page',
25251
25025
  content: 'Crosswalk Data',
25252
25026
  key: 'gen3-crosswalk-page',
@@ -25297,7 +25071,7 @@ const TabbedCohortBuilderPage = ({ headerProps, footerProps, configuration })=>{
25297
25071
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
25298
25072
  headerProps,
25299
25073
  footerProps,
25300
- headerData: {
25074
+ headerMetadata: {
25301
25075
  title: 'Gen3 Tabbed Cohort Builder Page',
25302
25076
  content: 'Tabbed Cohort Builder Page',
25303
25077
  key: 'gen3-tabbed-cohort-builder-page'
@@ -25663,6 +25437,7 @@ async function analysisApiCohortDiscovery(req, res) {
25663
25437
  const redactedData = core.roundHistogramResponse(data, COHORT_DISCOVERY_LIMIT);
25664
25438
  res.status(200).json(redactedData);
25665
25439
  } catch (error) {
25440
+ console.error('CohortDiscovery API', error);
25666
25441
  if (error instanceof core.HTTPError) res.status(error.status).json({
25667
25442
  error: 'HTTP Error',
25668
25443
  details: error.message
@@ -25678,6 +25453,97 @@ async function analysisApiCohortDiscovery(req, res) {
25678
25453
  }
25679
25454
  }
25680
25455
 
25456
+ const staticNotebookAPI = async (req, res)=>{
25457
+ if (req.method === 'OPTIONS') {
25458
+ res.status(200).json({
25459
+ success: true
25460
+ });
25461
+ }
25462
+ if (req.method === 'GET') {
25463
+ try {
25464
+ // Validate that a notebook was provided
25465
+ const { notebook } = req.query;
25466
+ if (!notebook) {
25467
+ return res.status(400).json({
25468
+ error: 'notebook parameter is required'
25469
+ });
25470
+ }
25471
+ let filePath = '';
25472
+ if (lodash.isArray(notebook)) {
25473
+ filePath = notebook[0];
25474
+ } else {
25475
+ filePath = notebook;
25476
+ }
25477
+ // Security: Prevent directory traversal attacks
25478
+ const sanitizedPath = path.normalize(filePath).replace(/^(\.\.[/\\])+/, '');
25479
+ // Ensure the file is within the allowed directory and has .html extension
25480
+ if (!sanitizedPath.endsWith('.html')) {
25481
+ return Response.json({
25482
+ error: 'Only HTML files are allowed',
25483
+ success: false
25484
+ }, {
25485
+ status: 400
25486
+ });
25487
+ }
25488
+ // Construct the full file path within the data directory
25489
+ const fullPath = path.join(process.cwd(), GEN3_STATIC_NOTEBOOK_DIR, sanitizedPath);
25490
+ // Check if a file exists and is within the data directory
25491
+ const dataDir = path.join(process.cwd(), `${GEN3_STATIC_NOTEBOOK_PATH}/${GEN3_STATIC_NOTEBOOK_DIR}`);
25492
+ if (!fullPath.startsWith(dataDir)) {
25493
+ return res.status(403).json({
25494
+ error: 'File access denied',
25495
+ success: false
25496
+ });
25497
+ }
25498
+ const rawContent = fs.readFileSync(fullPath, 'utf8');
25499
+ const sanitizedContent = DOMPurify.sanitize(rawContent, {
25500
+ ALLOWED_TAGS: [
25501
+ 'p',
25502
+ 'br',
25503
+ 'strong',
25504
+ 'em',
25505
+ 'h1',
25506
+ 'h2',
25507
+ 'h3',
25508
+ 'ul',
25509
+ 'ol',
25510
+ 'li',
25511
+ 'a',
25512
+ 'img'
25513
+ ],
25514
+ ALLOWED_ATTR: [
25515
+ 'href',
25516
+ 'title',
25517
+ 'src',
25518
+ 'alt',
25519
+ 'target'
25520
+ ]
25521
+ });
25522
+ res.status(200).json({
25523
+ content: sanitizedContent,
25524
+ success: true,
25525
+ filePath: sanitizedPath
25526
+ });
25527
+ } catch (error) {
25528
+ if (error.code === 'ENOENT') {
25529
+ res.status(404).json({
25530
+ error: 'Notebook not found. Please check the notebook name and try again.',
25531
+ success: false
25532
+ });
25533
+ } else {
25534
+ console.error('Error reading or sanitizing HTML file:', error);
25535
+ res.status(500).json({
25536
+ error: 'Error reading or sanitizing HTML file',
25537
+ success: false
25538
+ });
25539
+ }
25540
+ }
25541
+ }
25542
+ return res.status(405).json({
25543
+ error: 'Only GET|OPTION requests are allowed'
25544
+ });
25545
+ };
25546
+
25681
25547
  exports.AISearchPageGetServerSideProps = AISearchPageGetServerSideProps;
25682
25548
  exports.AccessLevel = AccessLevel;
25683
25549
  exports.ActionBar = ActionBar;
@@ -25698,6 +25564,7 @@ exports.BaseModal = BaseModal;
25698
25564
  exports.Charts = Charts;
25699
25565
  exports.CohortBuilder = CohortBuilder;
25700
25566
  exports.CohortManager = CohortManager$1;
25567
+ exports.CollapsableCharts = CollapsableCharts;
25701
25568
  exports.CollapsableSidebar = CollapsableSidebar;
25702
25569
  exports.ColorThemePage = ColorThemePage;
25703
25570
  exports.ColorThemePageGetServerSideProps = ColorThemePageGetServerSideProps;
@@ -25709,7 +25576,7 @@ exports.Custom404Page = Custom404Page;
25709
25576
  exports.DAYS_IN_YEAR = DAYS_IN_YEAR;
25710
25577
  exports.DEFAULT_MAXIMUM = DEFAULT_MAXIMUM;
25711
25578
  exports.DEFAULT_MINIMUM = DEFAULT_MINIMUM;
25712
- exports.DEFAULT_VISIBLE_ITEMS = DEFAULT_VISIBLE_ITEMS;
25579
+ exports.DEFAULT_VISIBLE_ITEMS = DEFAULT_VISIBLE_ITEMS$1;
25713
25580
  exports.DataLibraryPage = DataLibraryPage;
25714
25581
  exports.DataLibraryPageGetServerSideProps = DataLibraryPageGetServerSideProps;
25715
25582
  exports.DictionaryPage = DictionaryPage;
@@ -25774,7 +25641,13 @@ exports.ReactECharts = ReactECharts;
25774
25641
  exports.ResourcesFilters = ResourcesFilters;
25775
25642
  exports.SPECIAL_CASE_FIELDS = SPECIAL_CASE_FIELDS;
25776
25643
  exports.SessionExpiredModal = SessionExpiredModal;
25644
+ exports.SinglePageStudyDetailsPanel = SinglePageStudyDetailsPanel;
25645
+ exports.StaticNotebookIFrame = StaticNotebookIFrame;
25646
+ exports.StaticNotebookViewer = StaticNotebookViewer;
25647
+ exports.StudyDetailsPanel = StudyDetailsPanel;
25777
25648
  exports.StudyGroup = StudyGroup;
25649
+ exports.StudyGroupPanel = StudyGroupPanel;
25650
+ exports.StudyProvider = StudyProvider;
25778
25651
  exports.SubmissionPage = SubmissionPage;
25779
25652
  exports.SubmissionPageGetServerSideProps = SubmissionPageGetServerSideProps;
25780
25653
  exports.TabbedCohortBuilder = TabbedCohortBuilder;
@@ -25820,6 +25693,7 @@ exports.getTagInfo = getTagInfo;
25820
25693
  exports.hasOwnProperty = hasOwnProperty;
25821
25694
  exports.isArrayOfString = isArrayOfString;
25822
25695
  exports.isEnumFacetResponse = isEnumFacetResponse;
25696
+ exports.isHeaderMetadata = isHeaderMetadata;
25823
25697
  exports.isPropertyKey = isPropertyKey;
25824
25698
  exports.isTextTransform = isTextTransform$1;
25825
25699
  exports.mapFacetSortToSortType = mapFacetSortToSortType;
@@ -25841,6 +25715,7 @@ exports.removeUnion = removeUnion;
25841
25715
  exports.resourcePathFromProjectID = resourcePathFromProjectID;
25842
25716
  exports.sessionLogout = sessionLogout;
25843
25717
  exports.sessionToken = sessionToken;
25718
+ exports.staticNotebookAPI = staticNotebookAPI;
25844
25719
  exports.stripTrailingSlash = stripTrailingSlash;
25845
25720
  exports.toDisplayName = toDisplayName;
25846
25721
  exports.truncateString = truncateString;