@gen3/frontend 0.10.98 → 0.10.99

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 (200) hide show
  1. package/dist/cjs/index.js +532 -663
  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/types.d.ts +2 -1
  67. package/dist/dts/features/CohortBuilder/types.d.ts.map +1 -1
  68. package/dist/dts/features/CohortBuilder/types.js.map +1 -1
  69. package/dist/dts/features/CohortDiscovery/CohortDiscovery.d.ts.map +1 -1
  70. package/dist/dts/features/CohortDiscovery/CohortDiscovery.js +10 -9
  71. package/dist/dts/features/CohortDiscovery/CohortDiscovery.js.map +1 -1
  72. package/dist/dts/features/CohortDiscovery/Requests/RequestsPanel.d.ts.map +1 -1
  73. package/dist/dts/features/CohortDiscovery/Requests/RequestsPanel.js +1 -2
  74. package/dist/dts/features/CohortDiscovery/Requests/RequestsPanel.js.map +1 -1
  75. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.d.ts.map +1 -1
  76. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.js +1 -0
  77. package/dist/dts/features/CohortDiscovery/api/analysisApiCohortDiscovery.js.map +1 -1
  78. package/dist/dts/features/CohortDiscovery/queryApi.js +0 -380
  79. package/dist/dts/features/CohortDiscovery/queryApi.js.map +1 -1
  80. package/dist/dts/features/Dictionary/types.d.ts +3 -3
  81. package/dist/dts/features/Dictionary/types.d.ts.map +1 -1
  82. package/dist/dts/features/Discovery/DiscoveryIndexPanel.js +2 -2
  83. package/dist/dts/features/Discovery/DiscoveryIndexPanel.js.map +1 -1
  84. package/dist/dts/features/Discovery/types.d.ts +4 -16
  85. package/dist/dts/features/Discovery/types.d.ts.map +1 -1
  86. package/dist/dts/features/Discovery/types.js.map +1 -1
  87. package/dist/dts/features/Navigation/NavPageLayout.d.ts +3 -3
  88. package/dist/dts/features/Navigation/NavPageLayout.d.ts.map +1 -1
  89. package/dist/dts/features/Navigation/NavPageLayout.js +2 -2
  90. package/dist/dts/features/Navigation/NavPageLayout.js.map +1 -1
  91. package/dist/dts/features/Navigation/TopBar/TopBar.d.ts.map +1 -1
  92. package/dist/dts/features/Navigation/TopBar/TopBar.js +3 -2
  93. package/dist/dts/features/Navigation/TopBar/TopBar.js.map +1 -1
  94. package/dist/dts/features/Navigation/index.d.ts +2 -2
  95. package/dist/dts/features/Navigation/index.d.ts.map +1 -1
  96. package/dist/dts/features/Navigation/index.js +2 -1
  97. package/dist/dts/features/Navigation/index.js.map +1 -1
  98. package/dist/dts/features/Navigation/types.d.ts +7 -1
  99. package/dist/dts/features/Navigation/types.d.ts.map +1 -1
  100. package/dist/dts/features/Navigation/types.js +19 -1
  101. package/dist/dts/features/Navigation/types.js.map +1 -1
  102. package/dist/dts/features/StaticNotebook/StaticNotebook.d.ts +4 -0
  103. package/dist/dts/features/StaticNotebook/StaticNotebook.d.ts.map +1 -0
  104. package/dist/dts/features/StaticNotebook/StaticNotebook.js +79 -0
  105. package/dist/dts/features/StaticNotebook/StaticNotebook.js.map +1 -0
  106. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.d.ts +6 -0
  107. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.d.ts.map +1 -0
  108. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.js +10 -0
  109. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.js.map +1 -0
  110. package/dist/dts/features/StaticNotebook/StaticNotebookViewer.d.ts +6 -0
  111. package/dist/dts/features/StaticNotebook/StaticNotebookViewer.d.ts.map +1 -0
  112. package/dist/dts/features/StaticNotebook/StaticNotebookViewer.js +91 -0
  113. package/dist/dts/features/StaticNotebook/StaticNotebookViewer.js.map +1 -0
  114. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.d.ts +4 -0
  115. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.d.ts.map +1 -0
  116. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.js +129 -0
  117. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.js.map +1 -0
  118. package/dist/dts/features/StaticNotebook/constants.d.ts +4 -0
  119. package/dist/dts/features/StaticNotebook/constants.d.ts.map +1 -0
  120. package/dist/dts/features/StaticNotebook/constants.js +5 -0
  121. package/dist/dts/features/StaticNotebook/constants.js.map +1 -0
  122. package/dist/dts/features/StaticNotebook/index.d.ts +4 -0
  123. package/dist/dts/features/StaticNotebook/index.d.ts.map +1 -0
  124. package/dist/dts/features/StaticNotebook/index.js +4 -0
  125. package/dist/dts/features/StaticNotebook/index.js.map +1 -0
  126. package/dist/dts/index.d.ts +3 -1
  127. package/dist/dts/index.d.ts.map +1 -1
  128. package/dist/dts/index.js +4 -2
  129. package/dist/dts/index.js.map +1 -1
  130. package/dist/dts/lib/common/staticProps.d.ts.map +1 -1
  131. package/dist/dts/lib/common/staticProps.js +28 -8
  132. package/dist/dts/lib/common/staticProps.js.map +1 -1
  133. package/dist/dts/lib/content/types.d.ts +2 -2
  134. package/dist/dts/lib/content/types.d.ts.map +1 -1
  135. package/dist/dts/lib/notebooks/index.d.ts +3 -0
  136. package/dist/dts/lib/notebooks/index.d.ts.map +1 -0
  137. package/dist/dts/lib/notebooks/index.js +96 -0
  138. package/dist/dts/lib/notebooks/index.js.map +1 -0
  139. package/dist/dts/pages/AiSearch/AiSearch.js +1 -1
  140. package/dist/dts/pages/AiSearch/AiSearch.js.map +1 -1
  141. package/dist/dts/pages/AiSearch/data.js +1 -1
  142. package/dist/dts/pages/AiSearch/data.js.map +1 -1
  143. package/dist/dts/pages/Analysis/Analysis.js +1 -1
  144. package/dist/dts/pages/Analysis/Analysis.js.map +1 -1
  145. package/dist/dts/pages/Crosswalk/Crosswalk.js +1 -1
  146. package/dist/dts/pages/Crosswalk/Crosswalk.js.map +1 -1
  147. package/dist/dts/pages/DataDictionary/DataDictionary.js +1 -1
  148. package/dist/dts/pages/DataDictionary/DataDictionary.js.map +1 -1
  149. package/dist/dts/pages/DataLibrary/DataLibrary.js +1 -1
  150. package/dist/dts/pages/DataLibrary/DataLibrary.js.map +1 -1
  151. package/dist/dts/pages/Discovery/Discovery.js +1 -1
  152. package/dist/dts/pages/Discovery/Discovery.js.map +1 -1
  153. package/dist/dts/pages/Explorer/Explorer.js +1 -1
  154. package/dist/dts/pages/Explorer/Explorer.js.map +1 -1
  155. package/dist/dts/pages/Explorer/data.d.ts.map +1 -1
  156. package/dist/dts/pages/Explorer/data.js +17 -4
  157. package/dist/dts/pages/Explorer/data.js.map +1 -1
  158. package/dist/dts/pages/Landing/Landing.js +1 -1
  159. package/dist/dts/pages/Landing/Landing.js.map +1 -1
  160. package/dist/dts/pages/Landing/about-us.js +1 -1
  161. package/dist/dts/pages/Landing/about-us.js.map +1 -1
  162. package/dist/dts/pages/Landing/contact.js +1 -1
  163. package/dist/dts/pages/Landing/contact.js.map +1 -1
  164. package/dist/dts/pages/Landing/resource.js +1 -1
  165. package/dist/dts/pages/Landing/resource.js.map +1 -1
  166. package/dist/dts/pages/Login/Login.js +1 -1
  167. package/dist/dts/pages/Login/Login.js.map +1 -1
  168. package/dist/dts/pages/NotebookLite/NotebookLite.js +1 -1
  169. package/dist/dts/pages/NotebookLite/NotebookLite.js.map +1 -1
  170. package/dist/dts/pages/Profile/Profile.js +1 -1
  171. package/dist/dts/pages/Profile/Profile.js.map +1 -1
  172. package/dist/dts/pages/Query/Query.js +1 -1
  173. package/dist/dts/pages/Query/Query.js.map +1 -1
  174. package/dist/dts/pages/Submission/Submission.js +1 -1
  175. package/dist/dts/pages/Submission/Submission.js.map +1 -1
  176. package/dist/dts/pages/TabbedCohortBuilder/TabbedCohortBuilderPage.js +1 -1
  177. package/dist/dts/pages/TabbedCohortBuilder/TabbedCohortBuilderPage.js.map +1 -1
  178. package/dist/dts/pages/Theme/Colors.js +1 -1
  179. package/dist/dts/pages/Theme/Colors.js.map +1 -1
  180. package/dist/dts/pages/Workspace/Workspace.js +1 -1
  181. package/dist/dts/pages/Workspace/Workspace.js.map +1 -1
  182. package/dist/dts/pages/Workspace/WorkspaceNoAccess.js +1 -1
  183. package/dist/dts/pages/Workspace/WorkspaceNoAccess.js.map +1 -1
  184. package/dist/dts/pages/admin/Workspace/WorkspaceNotebooks.js +1 -1
  185. package/dist/dts/pages/admin/Workspace/WorkspaceNotebooks.js.map +1 -1
  186. package/dist/dts/pages/admin/analysis/Analysis.js +1 -1
  187. package/dist/dts/pages/admin/analysis/Analysis.js.map +1 -1
  188. package/dist/dts/pages/admin/analysis/data.d.ts +1 -1
  189. package/dist/dts/pages/admin/authz/Authz.js +1 -1
  190. package/dist/dts/pages/admin/authz/Authz.js.map +1 -1
  191. package/dist/dts/pages/admin/authz/data.d.ts +1 -1
  192. package/dist/dts/types/icons.d.ts +2 -2
  193. package/dist/dts/types/icons.d.ts.map +1 -1
  194. package/dist/dts/types/icons.js +2 -2
  195. package/dist/dts/types/icons.js.map +1 -1
  196. package/dist/esm/index.js +529 -665
  197. package/dist/esm/index.js.map +1 -1
  198. package/dist/index.d.ts +55 -23
  199. package/dist/tsconfig.tsbuildinfo +1 -1
  200. 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
 
@@ -15412,386 +15562,7 @@ const useRoundedAggsQuery = ({ type, fields, filters, accessibility = core.Acces
15412
15562
  ...response,
15413
15563
  data: response?.data?.data ? core.processHistogramResponse(response?.data.data?._aggregation[type] ?? {}) : {}
15414
15564
  };
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;
15565
+ };
15795
15566
 
15796
15567
  const NUM_COLS = 2; // TODO: add to config
15797
15568
  /**
@@ -16992,13 +16763,11 @@ const RequestsTable = ()=>{
16992
16763
  };
16993
16764
 
16994
16765
  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
- })
16766
+ return /*#__PURE__*/ jsxRuntime.jsx(core$1.Stack, {
16767
+ className: "w-100 m-2",
16768
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Group, {
16769
+ className: "w-100 bg-base-light p-4",
16770
+ children: /*#__PURE__*/ jsxRuntime.jsx(RequestsTable, {})
17002
16771
  })
17003
16772
  });
17004
16773
  };
@@ -17054,79 +16823,81 @@ const CohortDiscovery = (config)=>{
17054
16823
  const indexResources = extractIndexResourceFromConfiguration(config);
17055
16824
  useAppDispatch(loadCohortsFromStorage());
17056
16825
  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"
16826
+ children: /*#__PURE__*/ jsxRuntime.jsx(ProtectedContent, {
16827
+ children: /*#__PURE__*/ jsxRuntime.jsxs(react$1.PersistGate, {
16828
+ persistor: persistor,
16829
+ loading: /*#__PURE__*/ jsxRuntime.jsx(core$1.Loader, {
16830
+ variant: "dots"
17067
16831
  }),
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
16832
+ children: [
16833
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Title, {
16834
+ order: 3,
16835
+ className: "absolute top-6 left-[154px]",
16836
+ children: "Cohort Discovery"
16837
+ }),
16838
+ /*#__PURE__*/ jsxRuntime.jsxs(core$1.Tabs, {
16839
+ keepMounted: false,
16840
+ defaultValue: "build",
16841
+ orientation: "vertical",
16842
+ classNames: {
16843
+ root: 'w-full h-full',
16844
+ list: 'bg-base-light before:content-none pt-20',
16845
+ tab: 'border-0 border-l-4 rounded-none data-[active=true]:border-accent-warm data-[active=true]:bg-base-max text-center',
16846
+ tabLabel: 'w-full',
16847
+ panel: 'pt-16'
16848
+ },
16849
+ children: [
16850
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.List, {
16851
+ children: Object.keys(config.leftNav).map((key)=>{
16852
+ return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Tabs.Tab, {
16853
+ value: key,
16854
+ children: [
16855
+ /*#__PURE__*/ jsxRuntime.jsx(Image, {
16856
+ src: config.leftNav[key].image,
16857
+ alt: config.leftNav[key].imageAlt,
16858
+ width: 40,
16859
+ height: 40,
16860
+ className: "inline-block mb-1"
16861
+ }),
16862
+ /*#__PURE__*/ jsxRuntime.jsx("strong", {
16863
+ className: "block",
16864
+ children: config.leftNav[key].title
16865
+ })
16866
+ ]
16867
+ }, key);
16868
+ })
16869
+ }),
16870
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
16871
+ value: "build",
16872
+ children: config.dataIndexes.length === 1 ? /*#__PURE__*/ jsxRuntime.jsx(IndexPanel, {
16873
+ dataConfig: config.dataIndexes[0].dataConfig,
16874
+ tabTitle: config.dataIndexes[0].tabTitle,
16875
+ tabs: config.dataIndexes[0].tabs,
16876
+ emptySelection: config.emptySelection,
16877
+ resourceField: config.dataIndexes[0].resourceField,
16878
+ numColumns: config.dataIndexes[0].numColumns ?? 2,
16879
+ indexResources: indexResources,
16880
+ remoteSupportService: config.remoteSupportService
16881
+ }) : /*#__PURE__*/ jsxRuntime.jsx(TabbedIndex, {
16882
+ config: config,
16883
+ indexResources: indexResources
16884
+ })
16885
+ }),
16886
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
16887
+ value: "saved",
16888
+ children: /*#__PURE__*/ jsxRuntime.jsx(SavedCohortsPanel, {
16889
+ indexResources: indexResources,
16890
+ remoteSupportService: config.remoteSupportService
16891
+ })
16892
+ }),
16893
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
16894
+ value: "request",
16895
+ children: /*#__PURE__*/ jsxRuntime.jsx(RequestsPanel, {})
17121
16896
  })
17122
- }),
17123
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
17124
- value: "request",
17125
- children: /*#__PURE__*/ jsxRuntime.jsx(RequestsPanel, {})
17126
- })
17127
- ]
17128
- })
17129
- ]
16897
+ ]
16898
+ })
16899
+ ]
16900
+ })
17130
16901
  })
17131
16902
  });
17132
16903
  };
@@ -19592,7 +19363,7 @@ const DiscoveryPage = ({ headerProps, footerProps, discoveryConfig })=>{
19592
19363
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
19593
19364
  headerProps,
19594
19365
  footerProps,
19595
- headerData: {
19366
+ headerMetadata: {
19596
19367
  title: 'Gen3 Discovery Page',
19597
19368
  content: 'Discovery Data',
19598
19369
  key: 'gen3-discovery-page',
@@ -19648,7 +19419,7 @@ const QueryPage = ({ headerProps, footerProps, queryProps })=>{
19648
19419
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
19649
19420
  headerProps,
19650
19421
  footerProps,
19651
- headerData: {
19422
+ headerMetadata: {
19652
19423
  title: 'Gen3 Query Page',
19653
19424
  content: 'Query page',
19654
19425
  key: 'gen3-query-page',
@@ -19821,7 +19592,7 @@ const LandingPage = ({ headerProps, footerProps, landingPage })=>{
19821
19592
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
19822
19593
  footerProps,
19823
19594
  headerProps,
19824
- headerData: {
19595
+ headerMetadata: {
19825
19596
  title: 'Gen3 Home Page',
19826
19597
  content: 'Home page',
19827
19598
  key: 'gen3-home-page',
@@ -19862,7 +19633,7 @@ const ExplorerPage = ({ headerProps, footerProps, explorerConfig, headerMetadata
19862
19633
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
19863
19634
  headerProps,
19864
19635
  footerProps,
19865
- headerData: {
19636
+ headerMetadata: {
19866
19637
  title: 'Gen3 Explorer Page',
19867
19638
  content: 'Explorer Page',
19868
19639
  key: 'gen3-explorer-page',
@@ -19884,6 +19655,11 @@ var GuppyDataAccessMode = /*#__PURE__*/ function(GuppyDataAccessMode) {
19884
19655
  return GuppyDataAccessMode;
19885
19656
  }({});
19886
19657
 
19658
+ const DefaultHeaderMetadata = {
19659
+ title: 'Gen3 Explorer Page',
19660
+ content: 'Explorer Page',
19661
+ key: 'gen3-explorer-page'
19662
+ };
19887
19663
  const GetSharedFieldMapping = async (cohortBuilderConfiguration)=>{
19888
19664
  let sharedFiltersMap = null;
19889
19665
  if (cohortBuilderConfiguration?.sharedFilters) {
@@ -19940,9 +19716,7 @@ const ExplorerPageGetServerSideProps = async ()=>{
19940
19716
  props: {
19941
19717
  ...await getNavPageLayoutPropsFromConfig(),
19942
19718
  explorerConfig: cohortBuilderConfiguration,
19943
- headerMetadata: {
19944
- ...cohortBuilderConfiguration?.headerMetadata
19945
- }
19719
+ headerMetadata: cohortBuilderConfiguration?.headerMetadata ? cohortBuilderConfiguration.headerMetadata : DefaultHeaderMetadata
19946
19720
  }
19947
19721
  };
19948
19722
  }
@@ -19953,7 +19727,7 @@ const ExplorerPageGetServerSideProps = async ()=>{
19953
19727
  sharedFiltersMap: sharedFiltersMap,
19954
19728
  tabsLayout: cohortBuilderConfiguration?.tabsLayout ?? 'left',
19955
19729
  explorerConfig: cohortBuilderConfiguration.explorerConfig,
19956
- headerMetadata: cohortBuilderConfiguration.headerMetadata,
19730
+ // headerMetadata: cohortBuilderConfiguration.headerMetadata,
19957
19731
  accessControl: {
19958
19732
  ...DefaultAccessControlConfiguration,
19959
19733
  ...cohortBuilderConfiguration.accessControl ?? {}
@@ -19983,9 +19757,7 @@ const ExplorerPageGetServerSidePropsForConfigId = async (context)=>{
19983
19757
  props: {
19984
19758
  ...await getNavPageLayoutPropsFromConfig(),
19985
19759
  explorerConfig: cohortBuilderConfiguration,
19986
- headerMetadata: {
19987
- ...cohortBuilderConfiguration?.headerMetadata
19988
- }
19760
+ headerMetadata: cohortBuilderConfiguration?.headerMetadata ? cohortBuilderConfiguration.headerMetadata : DefaultHeaderMetadata
19989
19761
  }
19990
19762
  };
19991
19763
  }
@@ -19996,7 +19768,7 @@ const ExplorerPageGetServerSidePropsForConfigId = async (context)=>{
19996
19768
  sharedFiltersMap: sharedFiltersMap,
19997
19769
  tabsLayout: cohortBuilderConfiguration?.tabsLayout ?? 'left',
19998
19770
  explorerConfig: cohortBuilderConfiguration.explorerConfig,
19999
- headerMetadata: cohortBuilderConfiguration.headerMetadata,
19771
+ // headerMetadata: { ...(cohortBuilderConfiguration?.headerMetadata ? cohortBuilderConfiguration.headerMetadata : {}) },
20000
19772
  accessControl: {
20001
19773
  ...DefaultAccessControlConfiguration,
20002
19774
  ...cohortBuilderConfiguration.accessControl ?? {}
@@ -20356,7 +20128,7 @@ const ColorThemePage = ({ headerProps, footerProps })=>{
20356
20128
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
20357
20129
  headerProps,
20358
20130
  footerProps,
20359
- headerData: {
20131
+ headerMetadata: {
20360
20132
  title: 'Gen3 Theme Page',
20361
20133
  content: 'Theme page',
20362
20134
  key: 'gen3-theme-page'
@@ -20934,7 +20706,7 @@ const ProfilePage = ({ headerProps, footerProps, profileConfig })=>{
20934
20706
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
20935
20707
  headerProps,
20936
20708
  footerProps,
20937
- headerData: {
20709
+ headerMetadata: {
20938
20710
  title: 'Gen3 Profile Page',
20939
20711
  content: 'Profile page',
20940
20712
  key: 'gen3-profile-page',
@@ -20962,7 +20734,7 @@ const LoginPage = ({ headerProps, footerProps, loginConfig })=>{
20962
20734
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
20963
20735
  headerProps,
20964
20736
  footerProps,
20965
- headerData: {
20737
+ headerMetadata: {
20966
20738
  title: 'Gen3 Login Page',
20967
20739
  content: 'Login page',
20968
20740
  key: 'gen3-login-page',
@@ -20993,7 +20765,7 @@ const DictionaryPage = ({ headerProps, footerProps, config })=>{
20993
20765
  mainProps: {
20994
20766
  fixed: true
20995
20767
  },
20996
- headerData: {
20768
+ headerMetadata: {
20997
20769
  title: 'Gen3 DataDictionary Page',
20998
20770
  content: 'Data Dictionary',
20999
20771
  key: 'gen3-data-dictionary-page',
@@ -21718,7 +21490,7 @@ const AuthzPage = ({ headerProps, footerProps, authz })=>{
21718
21490
  headerProps,
21719
21491
  footerProps,
21720
21492
  headerProps: headerProps,
21721
- headerData: {
21493
+ headerMetadata: {
21722
21494
  title: 'Gen3 Authz Editor Page',
21723
21495
  content: 'Authz Editor page',
21724
21496
  key: 'gen3-authz-editor-page'
@@ -22045,7 +21817,7 @@ const SubmissionPage = ({ submissionConfig, headerProps, footerProps })=>{
22045
21817
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
22046
21818
  footerProps: footerProps,
22047
21819
  headerProps: headerProps,
22048
- headerData: {
21820
+ headerMetadata: {
22049
21821
  title: 'Gen3 Submission Page',
22050
21822
  content: 'Submission page',
22051
21823
  key: 'gen3-submission-page'
@@ -22080,7 +21852,7 @@ const WorkspacePage = ({ headerProps, footerProps, workspaceProps })=>{
22080
21852
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
22081
21853
  headerProps,
22082
21854
  footerProps,
22083
- headerData: {
21855
+ headerMetadata: {
22084
21856
  title: 'Gen3 Workspace Page',
22085
21857
  content: 'Workspace page',
22086
21858
  key: 'gen3-workspace-page',
@@ -22097,7 +21869,7 @@ const WorkspaceNoAccessPage = ({ headerProps, footerProps })=>{
22097
21869
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
22098
21870
  headerProps,
22099
21871
  footerProps,
22100
- headerData: {
21872
+ headerMetadata: {
22101
21873
  title: 'Gen3 Workspace No Access Page',
22102
21874
  content: 'Workspace no access page',
22103
21875
  key: 'gen3-workspace-no-access-page'
@@ -22161,7 +21933,7 @@ const AnalysisPage = ({ headerProps, footerProps, tools, sections, classNames })
22161
21933
  return /*#__PURE__*/ jsxRuntime.jsxs(NavPageLayout, {
22162
21934
  headerProps,
22163
21935
  footerProps,
22164
- headerData: {
21936
+ headerMetadata: {
22165
21937
  title: 'Gen3 Analysis Center',
22166
21938
  content: 'Analysis Center',
22167
21939
  key: 'gen3-analysis-center'
@@ -22811,7 +22583,7 @@ const AnalysisEditorPage = ({ headerProps, footerProps })=>{
22811
22583
  headerProps,
22812
22584
  footerProps,
22813
22585
  headerProps: headerProps,
22814
- headerData: {
22586
+ headerMetadata: {
22815
22587
  title: 'Gen3 Analysis Editor Page',
22816
22588
  content: 'Analysis Editor page',
22817
22589
  key: 'gen3-analysis-editor-page'
@@ -22844,7 +22616,7 @@ const AISearchPage = ({ headerProps, footerProps })=>{
22844
22616
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
22845
22617
  headerProps,
22846
22618
  footerProps,
22847
- headerData: {
22619
+ headerMetadata: {
22848
22620
  title: 'Gen3 AI Search Page',
22849
22621
  content: 'AI Search',
22850
22622
  key: 'gen3-ai-search-page'
@@ -22874,7 +22646,7 @@ const AISearchPageGetServerSideProps = async ()=>{
22874
22646
  navigation: {}
22875
22647
  },
22876
22648
  footerProps: {},
22877
- headerData: {
22649
+ headerMetadata: {
22878
22650
  title: 'Gen3 AI Search Page',
22879
22651
  content: 'AI Search',
22880
22652
  key: 'gen3-ai-search-page'
@@ -22889,7 +22661,7 @@ const NotebookLitePage = ({ headerProps, footerProps })=>{
22889
22661
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
22890
22662
  footerProps,
22891
22663
  headerProps,
22892
- headerData: {
22664
+ headerMetadata: {
22893
22665
  title: 'Gen3 Notebooks Lite Page',
22894
22666
  content: 'Notebooks Lite',
22895
22667
  key: 'gen3-notebooks-lite-page'
@@ -24954,7 +24726,7 @@ const DataLibraryPage = ({ headerProps, footerProps, config })=>{
24954
24726
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
24955
24727
  headerProps,
24956
24728
  footerProps,
24957
- headerData: {
24729
+ headerMetadata: {
24958
24730
  title: 'Gen3 DataLibrary Page',
24959
24731
  content: 'DataLibrary Data',
24960
24732
  key: 'gen3-data-library-page'
@@ -25246,7 +25018,7 @@ const CrosswalkPage = ({ headerProps, footerProps, config })=>{
25246
25018
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
25247
25019
  headerProps,
25248
25020
  footerProps,
25249
- headerData: {
25021
+ headerMetadata: {
25250
25022
  title: 'Gen3 Crosswalk Page',
25251
25023
  content: 'Crosswalk Data',
25252
25024
  key: 'gen3-crosswalk-page',
@@ -25297,7 +25069,7 @@ const TabbedCohortBuilderPage = ({ headerProps, footerProps, configuration })=>{
25297
25069
  return /*#__PURE__*/ jsxRuntime.jsx(NavPageLayout, {
25298
25070
  headerProps,
25299
25071
  footerProps,
25300
- headerData: {
25072
+ headerMetadata: {
25301
25073
  title: 'Gen3 Tabbed Cohort Builder Page',
25302
25074
  content: 'Tabbed Cohort Builder Page',
25303
25075
  key: 'gen3-tabbed-cohort-builder-page'
@@ -25663,6 +25435,7 @@ async function analysisApiCohortDiscovery(req, res) {
25663
25435
  const redactedData = core.roundHistogramResponse(data, COHORT_DISCOVERY_LIMIT);
25664
25436
  res.status(200).json(redactedData);
25665
25437
  } catch (error) {
25438
+ console.error('CohortDiscovery API', error);
25666
25439
  if (error instanceof core.HTTPError) res.status(error.status).json({
25667
25440
  error: 'HTTP Error',
25668
25441
  details: error.message
@@ -25678,6 +25451,97 @@ async function analysisApiCohortDiscovery(req, res) {
25678
25451
  }
25679
25452
  }
25680
25453
 
25454
+ const staticNotebookAPI = async (req, res)=>{
25455
+ if (req.method === 'OPTIONS') {
25456
+ res.status(200).json({
25457
+ success: true
25458
+ });
25459
+ }
25460
+ if (req.method === 'GET') {
25461
+ try {
25462
+ // Validate that a notebook was provided
25463
+ const { notebook } = req.query;
25464
+ if (!notebook) {
25465
+ return res.status(400).json({
25466
+ error: 'notebook parameter is required'
25467
+ });
25468
+ }
25469
+ let filePath = '';
25470
+ if (lodash.isArray(notebook)) {
25471
+ filePath = notebook[0];
25472
+ } else {
25473
+ filePath = notebook;
25474
+ }
25475
+ // Security: Prevent directory traversal attacks
25476
+ const sanitizedPath = path.normalize(filePath).replace(/^(\.\.[/\\])+/, '');
25477
+ // Ensure the file is within the allowed directory and has .html extension
25478
+ if (!sanitizedPath.endsWith('.html')) {
25479
+ return Response.json({
25480
+ error: 'Only HTML files are allowed',
25481
+ success: false
25482
+ }, {
25483
+ status: 400
25484
+ });
25485
+ }
25486
+ // Construct the full file path within the data directory
25487
+ const fullPath = path.join(process.cwd(), GEN3_STATIC_NOTEBOOK_DIR, sanitizedPath);
25488
+ // Check if a file exists and is within the data directory
25489
+ const dataDir = path.join(process.cwd(), `${GEN3_STATIC_NOTEBOOK_PATH}/${GEN3_STATIC_NOTEBOOK_DIR}`);
25490
+ if (!fullPath.startsWith(dataDir)) {
25491
+ return res.status(403).json({
25492
+ error: 'File access denied',
25493
+ success: false
25494
+ });
25495
+ }
25496
+ const rawContent = fs.readFileSync(fullPath, 'utf8');
25497
+ const sanitizedContent = DOMPurify.sanitize(rawContent, {
25498
+ ALLOWED_TAGS: [
25499
+ 'p',
25500
+ 'br',
25501
+ 'strong',
25502
+ 'em',
25503
+ 'h1',
25504
+ 'h2',
25505
+ 'h3',
25506
+ 'ul',
25507
+ 'ol',
25508
+ 'li',
25509
+ 'a',
25510
+ 'img'
25511
+ ],
25512
+ ALLOWED_ATTR: [
25513
+ 'href',
25514
+ 'title',
25515
+ 'src',
25516
+ 'alt',
25517
+ 'target'
25518
+ ]
25519
+ });
25520
+ res.status(200).json({
25521
+ content: sanitizedContent,
25522
+ success: true,
25523
+ filePath: sanitizedPath
25524
+ });
25525
+ } catch (error) {
25526
+ if (error.code === 'ENOENT') {
25527
+ res.status(404).json({
25528
+ error: 'Notebook not found. Please check the notebook name and try again.',
25529
+ success: false
25530
+ });
25531
+ } else {
25532
+ console.error('Error reading or sanitizing HTML file:', error);
25533
+ res.status(500).json({
25534
+ error: 'Error reading or sanitizing HTML file',
25535
+ success: false
25536
+ });
25537
+ }
25538
+ }
25539
+ }
25540
+ return res.status(405).json({
25541
+ error: 'Only GET|OPTION requests are allowed'
25542
+ });
25543
+ };
25544
+
25681
25545
  exports.AISearchPageGetServerSideProps = AISearchPageGetServerSideProps;
25682
25546
  exports.AccessLevel = AccessLevel;
25683
25547
  exports.ActionBar = ActionBar;
@@ -25698,6 +25562,7 @@ exports.BaseModal = BaseModal;
25698
25562
  exports.Charts = Charts;
25699
25563
  exports.CohortBuilder = CohortBuilder;
25700
25564
  exports.CohortManager = CohortManager$1;
25565
+ exports.CollapsableCharts = CollapsableCharts;
25701
25566
  exports.CollapsableSidebar = CollapsableSidebar;
25702
25567
  exports.ColorThemePage = ColorThemePage;
25703
25568
  exports.ColorThemePageGetServerSideProps = ColorThemePageGetServerSideProps;
@@ -25709,7 +25574,7 @@ exports.Custom404Page = Custom404Page;
25709
25574
  exports.DAYS_IN_YEAR = DAYS_IN_YEAR;
25710
25575
  exports.DEFAULT_MAXIMUM = DEFAULT_MAXIMUM;
25711
25576
  exports.DEFAULT_MINIMUM = DEFAULT_MINIMUM;
25712
- exports.DEFAULT_VISIBLE_ITEMS = DEFAULT_VISIBLE_ITEMS;
25577
+ exports.DEFAULT_VISIBLE_ITEMS = DEFAULT_VISIBLE_ITEMS$1;
25713
25578
  exports.DataLibraryPage = DataLibraryPage;
25714
25579
  exports.DataLibraryPageGetServerSideProps = DataLibraryPageGetServerSideProps;
25715
25580
  exports.DictionaryPage = DictionaryPage;
@@ -25774,6 +25639,8 @@ exports.ReactECharts = ReactECharts;
25774
25639
  exports.ResourcesFilters = ResourcesFilters;
25775
25640
  exports.SPECIAL_CASE_FIELDS = SPECIAL_CASE_FIELDS;
25776
25641
  exports.SessionExpiredModal = SessionExpiredModal;
25642
+ exports.StaticNotebookIFrame = StaticNotebookIFrame;
25643
+ exports.StaticNotebookViewer = StaticNotebookViewer;
25777
25644
  exports.StudyGroup = StudyGroup;
25778
25645
  exports.SubmissionPage = SubmissionPage;
25779
25646
  exports.SubmissionPageGetServerSideProps = SubmissionPageGetServerSideProps;
@@ -25820,6 +25687,7 @@ exports.getTagInfo = getTagInfo;
25820
25687
  exports.hasOwnProperty = hasOwnProperty;
25821
25688
  exports.isArrayOfString = isArrayOfString;
25822
25689
  exports.isEnumFacetResponse = isEnumFacetResponse;
25690
+ exports.isHeaderMetadata = isHeaderMetadata;
25823
25691
  exports.isPropertyKey = isPropertyKey;
25824
25692
  exports.isTextTransform = isTextTransform$1;
25825
25693
  exports.mapFacetSortToSortType = mapFacetSortToSortType;
@@ -25841,6 +25709,7 @@ exports.removeUnion = removeUnion;
25841
25709
  exports.resourcePathFromProjectID = resourcePathFromProjectID;
25842
25710
  exports.sessionLogout = sessionLogout;
25843
25711
  exports.sessionToken = sessionToken;
25712
+ exports.staticNotebookAPI = staticNotebookAPI;
25844
25713
  exports.stripTrailingSlash = stripTrailingSlash;
25845
25714
  exports.toDisplayName = toDisplayName;
25846
25715
  exports.truncateString = truncateString;