@gen3/frontend 0.11.17 → 0.11.19

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 (107) hide show
  1. package/dist/cjs/index.js +627 -383
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/dts/components/Content/TextContent.d.ts.map +1 -1
  4. package/dist/dts/components/Content/TextContent.js +7 -8
  5. package/dist/dts/components/Content/TextContent.js.map +1 -1
  6. package/dist/dts/components/Details/DetailsDrawer.d.ts +2 -2
  7. package/dist/dts/components/Details/DetailsDrawer.d.ts.map +1 -1
  8. package/dist/dts/components/Details/DetailsDrawer.js +2 -2
  9. package/dist/dts/components/Details/DetailsDrawer.js.map +1 -1
  10. package/dist/dts/components/Layout/TexturedSidePanel.js +1 -1
  11. package/dist/dts/components/Layout/TexturedSidePanel.js.map +1 -1
  12. package/dist/dts/components/Providers/Gen3Provider.d.ts +1 -1
  13. package/dist/dts/components/charts/Charts.d.ts.map +1 -1
  14. package/dist/dts/components/charts/Charts.js +14 -12
  15. package/dist/dts/components/charts/Charts.js.map +1 -1
  16. package/dist/dts/components/charts/utils.d.ts +16 -0
  17. package/dist/dts/components/charts/utils.d.ts.map +1 -1
  18. package/dist/dts/components/charts/utils.js +28 -1
  19. package/dist/dts/components/charts/utils.js.map +1 -1
  20. package/dist/dts/features/Analysis/AnalysisCardCompact.stories.d.ts +4 -4
  21. package/dist/dts/features/CohortBuilder/CohortBuilder.d.ts +2 -1
  22. package/dist/dts/features/CohortBuilder/CohortBuilder.d.ts.map +1 -1
  23. package/dist/dts/features/CohortBuilder/CohortBuilder.js +5 -3
  24. package/dist/dts/features/CohortBuilder/CohortBuilder.js.map +1 -1
  25. package/dist/dts/features/CohortBuilder/CohortPanel.d.ts.map +1 -1
  26. package/dist/dts/features/CohortBuilder/CohortPanel.js +24 -2
  27. package/dist/dts/features/CohortBuilder/CohortPanel.js.map +1 -1
  28. package/dist/dts/features/CohortBuilder/ExplorerTable/ArrayCellRenderer.d.ts +1 -1
  29. package/dist/dts/features/CohortBuilder/ExplorerTable/ExploreTableDetails/QueryRowDetailsPanel.d.ts.map +1 -1
  30. package/dist/dts/features/CohortBuilder/ExplorerTable/ExploreTableDetails/QueryRowDetailsPanel.js +58 -26
  31. package/dist/dts/features/CohortBuilder/ExplorerTable/ExploreTableDetails/QueryRowDetailsPanel.js.map +1 -1
  32. package/dist/dts/features/CohortBuilder/ExplorerTable/ExploreTableDetails/types.d.ts +5 -1
  33. package/dist/dts/features/CohortBuilder/ExplorerTable/ExploreTableDetails/types.d.ts.map +1 -1
  34. package/dist/dts/features/CohortBuilder/ExplorerTable/ExplorerTable.d.ts.map +1 -1
  35. package/dist/dts/features/CohortBuilder/ExplorerTable/ExplorerTable.js +63 -28
  36. package/dist/dts/features/CohortBuilder/ExplorerTable/ExplorerTable.js.map +1 -1
  37. package/dist/dts/features/CohortBuilder/index.d.ts +1 -1
  38. package/dist/dts/features/CohortBuilder/index.d.ts.map +1 -1
  39. package/dist/dts/features/CohortBuilder/index.js +1 -1
  40. package/dist/dts/features/CohortBuilder/index.js.map +1 -1
  41. package/dist/dts/features/CohortBuilder/types.d.ts +1 -0
  42. package/dist/dts/features/CohortBuilder/types.d.ts.map +1 -1
  43. package/dist/dts/features/CohortBuilder/types.js.map +1 -1
  44. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManager.d.ts +1 -1
  45. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManager.d.ts.map +1 -1
  46. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManager.js +21 -14
  47. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManager.js.map +1 -1
  48. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerMiddleware.d.ts.map +1 -1
  49. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerMiddleware.js +1 -0
  50. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerMiddleware.js.map +1 -1
  51. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerSelectors.d.ts +11 -10
  52. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerSelectors.d.ts.map +1 -1
  53. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerSelectors.js +9 -5
  54. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerSelectors.js.map +1 -1
  55. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerSlice.d.ts +1 -0
  56. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerSlice.d.ts.map +1 -1
  57. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerSlice.js +21 -6
  58. package/dist/dts/features/CohortDiscovery/CohortManagment/CohortManagerSlice.js.map +1 -1
  59. package/dist/dts/features/CohortDiscovery/SavedCohorts/SavedCohortsTable.d.ts.map +1 -1
  60. package/dist/dts/features/CohortDiscovery/SavedCohorts/SavedCohortsTable.js +1 -1
  61. package/dist/dts/features/CohortDiscovery/SavedCohorts/SavedCohortsTable.js.map +1 -1
  62. package/dist/dts/features/CohortDiscovery/appApi.js +1 -1
  63. package/dist/dts/features/CohortDiscovery/appApi.js.map +1 -1
  64. package/dist/dts/features/CohortDiscovery/constants.d.ts +2 -0
  65. package/dist/dts/features/CohortDiscovery/constants.d.ts.map +1 -1
  66. package/dist/dts/features/CohortDiscovery/constants.js +11 -0
  67. package/dist/dts/features/CohortDiscovery/constants.js.map +1 -1
  68. package/dist/dts/features/Dictionary/metadata/MetadataDictionary.d.ts.map +1 -1
  69. package/dist/dts/features/Dictionary/metadata/MetadataDictionary.js +2 -1
  70. package/dist/dts/features/Dictionary/metadata/MetadataDictionary.js.map +1 -1
  71. package/dist/dts/features/Dictionary/metadata/types.d.ts +1 -0
  72. package/dist/dts/features/Dictionary/metadata/types.d.ts.map +1 -1
  73. package/dist/dts/features/Discovery/Discovery.d.ts.map +1 -1
  74. package/dist/dts/features/Discovery/Discovery.js +3 -2
  75. package/dist/dts/features/Discovery/Discovery.js.map +1 -1
  76. package/dist/dts/features/Discovery/types.d.ts +1 -0
  77. package/dist/dts/features/Discovery/types.d.ts.map +1 -1
  78. package/dist/dts/features/Discovery/types.js.map +1 -1
  79. package/dist/dts/features/Navigation/Footer/FooterColumn.d.ts.map +1 -1
  80. package/dist/dts/features/Navigation/Footer/FooterColumn.js +3 -0
  81. package/dist/dts/features/Navigation/Footer/FooterColumn.js.map +1 -1
  82. package/dist/dts/features/Navigation/Footer/types.d.ts +1 -0
  83. package/dist/dts/features/Navigation/Footer/types.d.ts.map +1 -1
  84. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.d.ts.map +1 -1
  85. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.js +28 -1
  86. package/dist/dts/features/StaticNotebook/StaticNotebookIFrame.js.map +1 -1
  87. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.d.ts.map +1 -1
  88. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.js +7 -0
  89. package/dist/dts/features/StaticNotebook/api/staticNotebookAPI.js.map +1 -1
  90. package/dist/dts/features/Study/StudyDetails/SinglePageStudyDetailsPanel.js +4 -4
  91. package/dist/dts/features/Study/StudyDetails/SinglePageStudyDetailsPanel.js.map +1 -1
  92. package/dist/dts/features/Study/StudyDetails/StudyItems.d.ts.map +1 -1
  93. package/dist/dts/features/Study/StudyDetails/StudyItems.js +9 -5
  94. package/dist/dts/features/Study/StudyDetails/StudyItems.js.map +1 -1
  95. package/dist/dts/lib/common/staticProps.d.ts.map +1 -1
  96. package/dist/dts/lib/common/staticProps.js +11 -23
  97. package/dist/dts/lib/common/staticProps.js.map +1 -1
  98. package/dist/dts/lib/content/filesystem.js +1 -1
  99. package/dist/dts/lib/content/filesystem.js.map +1 -1
  100. package/dist/dts/pages/Explorer/Explorer.d.ts.map +1 -1
  101. package/dist/dts/pages/Explorer/Explorer.js +4 -1
  102. package/dist/dts/pages/Explorer/Explorer.js.map +1 -1
  103. package/dist/esm/index.js +627 -384
  104. package/dist/esm/index.js.map +1 -1
  105. package/dist/index.d.ts +203 -181
  106. package/dist/tsconfig.tsbuildinfo +1 -1
  107. package/package.json +3 -3
package/dist/cjs/index.js CHANGED
@@ -1305,11 +1305,11 @@ const LoginProvidersPanel = ({ handleLoginSelected })=>{
1305
1305
 
1306
1306
  const TexturedSidePanel = ({ url })=>{
1307
1307
  return /*#__PURE__*/ jsxRuntime.jsx("div", {
1308
- "aria-label": 'background image',
1308
+ "aria-hidden": "true",
1309
1309
  style: {
1310
1310
  backgroundImage: `url(${url})`
1311
1311
  },
1312
- className: "flex h-screen w-full bg-left bg-repeat-y last:-scale-x-100"
1312
+ className: "bg-contain flex h-full w-full bg-repeat-y last:-scale-x-100"
1313
1313
  });
1314
1314
  };
1315
1315
 
@@ -1479,8 +1479,7 @@ function hashCode(str) {
1479
1479
  className: className,
1480
1480
  dangerouslySetInnerHTML: {
1481
1481
  __html: textString
1482
- },
1483
- "aria-label": "HTML content"
1482
+ }
1484
1483
  });
1485
1484
  }
1486
1485
  case "textArray":
@@ -1488,22 +1487,29 @@ function hashCode(str) {
1488
1487
  const textArray = !Array.isArray(text) ? [
1489
1488
  text
1490
1489
  ] : text;
1491
- return /*#__PURE__*/ jsxRuntime.jsx("div", {
1490
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
1492
1491
  className: className,
1493
1492
  role: "list",
1494
- "aria-label": "Text array",
1495
- children: textArray.map((item)=>/*#__PURE__*/ jsxRuntime.jsx("p", {
1496
- className: "my-2",
1497
- role: "listitem",
1498
- children: item
1499
- }, hashCode(item)))
1493
+ children: [
1494
+ /*#__PURE__*/ jsxRuntime.jsxs("style", {
1495
+ children: [
1496
+ "@source inline(",
1497
+ className,
1498
+ ");"
1499
+ ]
1500
+ }),
1501
+ textArray.map((item)=>/*#__PURE__*/ jsxRuntime.jsx("p", {
1502
+ className: "my-2",
1503
+ role: "listitem",
1504
+ children: item
1505
+ }, hashCode(item)))
1506
+ ]
1500
1507
  });
1501
1508
  }
1502
1509
  case "markdown":
1503
1510
  {
1504
1511
  const textString = Array.isArray(text) ? text.join('') : text;
1505
1512
  return /*#__PURE__*/ jsxRuntime.jsx("div", {
1506
- "aria-label": "Markdown content",
1507
1513
  children: /*#__PURE__*/ jsxRuntime.jsx(Markdown, {
1508
1514
  remarkPlugins: [
1509
1515
  remarkGfm
@@ -1547,21 +1553,29 @@ function hashCode(str) {
1547
1553
  const DEFAULT_STYLE = 'inline text-base-contrast-max font-medium margin-block-start-1 margin-block-end-1';
1548
1554
  const mergedClassname = className ? tailwindMerge.twMerge(DEFAULT_STYLE, className) : DEFAULT_STYLE;
1549
1555
  const textString = Array.isArray(text) ? text.join('') : text;
1550
- return /*#__PURE__*/ jsxRuntime.jsx("div", {
1556
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
1551
1557
  className: mergedClassname,
1552
- children: /*#__PURE__*/ jsxRuntime.jsxs("span", {
1553
- children: [
1554
- textString,
1555
- email && /*#__PURE__*/ jsxRuntime.jsx(core$1.Anchor, {
1556
- classNames: {
1557
- root: mergedClassname
1558
- },
1559
- href: `mailto:${email}`,
1560
- "aria-label": `Send an email to ${email}`,
1561
- children: ` ${email}.`
1562
- })
1563
- ]
1564
- })
1558
+ children: [
1559
+ /*#__PURE__*/ jsxRuntime.jsxs("style", {
1560
+ children: [
1561
+ "@source inline(",
1562
+ className,
1563
+ ");"
1564
+ ]
1565
+ }),
1566
+ /*#__PURE__*/ jsxRuntime.jsxs("span", {
1567
+ children: [
1568
+ textString,
1569
+ email && /*#__PURE__*/ jsxRuntime.jsx(core$1.Anchor, {
1570
+ classNames: {
1571
+ root: mergedClassname
1572
+ },
1573
+ href: `mailto:${email}`,
1574
+ children: ` ${email}.`
1575
+ })
1576
+ ]
1577
+ })
1578
+ ]
1565
1579
  });
1566
1580
  }
1567
1581
  case "textWithLink":
@@ -1572,35 +1586,50 @@ function hashCode(str) {
1572
1586
  if (!link) {
1573
1587
  return /*#__PURE__*/ jsxRuntime.jsx("div", {
1574
1588
  className: mergedClassname,
1575
- "aria-label": "No link defined",
1576
1589
  children: "Link is not defined."
1577
1590
  });
1578
1591
  }
1579
- return /*#__PURE__*/ jsxRuntime.jsx("div", {
1592
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
1580
1593
  className: mergedClassname,
1581
- children: /*#__PURE__*/ jsxRuntime.jsxs("span", {
1582
- children: [
1583
- textString,
1584
- link && /*#__PURE__*/ jsxRuntime.jsx(core$1.Anchor, {
1585
- classNames: {
1586
- root: mergedClassname
1587
- },
1588
- href: link,
1589
- "aria-label": `Visit the link: ${linkText || link}`,
1590
- children: ` ${linkText ?? link}.`
1591
- })
1592
- ]
1593
- })
1594
+ children: [
1595
+ /*#__PURE__*/ jsxRuntime.jsxs("style", {
1596
+ children: [
1597
+ "@source inline(",
1598
+ className,
1599
+ ");"
1600
+ ]
1601
+ }),
1602
+ /*#__PURE__*/ jsxRuntime.jsxs("span", {
1603
+ children: [
1604
+ textString,
1605
+ link && /*#__PURE__*/ jsxRuntime.jsx(core$1.Anchor, {
1606
+ classNames: {
1607
+ root: mergedClassname
1608
+ },
1609
+ href: link,
1610
+ children: ` ${linkText ?? link}.`
1611
+ })
1612
+ ]
1613
+ })
1614
+ ]
1594
1615
  });
1595
1616
  }
1596
1617
  case "text":
1597
1618
  default:
1598
- return /*#__PURE__*/ jsxRuntime.jsx("div", {
1619
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
1599
1620
  className: className,
1600
- "aria-label": "Plain text content",
1601
- children: /*#__PURE__*/ jsxRuntime.jsx("p", {
1602
- children: text.toString()
1603
- })
1621
+ children: [
1622
+ /*#__PURE__*/ jsxRuntime.jsxs("style", {
1623
+ children: [
1624
+ "@source inline(",
1625
+ className,
1626
+ ");"
1627
+ ]
1628
+ }),
1629
+ /*#__PURE__*/ jsxRuntime.jsx("p", {
1630
+ children: text.toString()
1631
+ })
1632
+ ]
1604
1633
  });
1605
1634
  }
1606
1635
  };
@@ -2094,7 +2123,6 @@ const Gen3ModalsProvider = ({ config, children })=>{
2094
2123
  });
2095
2124
  };
2096
2125
 
2097
- // import { BinGuru } from 'binguru';
2098
2126
  const capitalize = (original)=>{
2099
2127
  if (original === undefined) {
2100
2128
  throw new Error('capitalize: original is undefined');
@@ -2133,6 +2161,60 @@ const processRangeKeyLabel = (key)=>{
2133
2161
  spans = spans.concat(new Array(numLastRow).fill(Math.floor(12 / numLastRow)));
2134
2162
  return spans;
2135
2163
  };
2164
+ /**
2165
+ * Filters the keys from the provided aggregation data based on a given list of keys to remove.
2166
+ *
2167
+ * This function processes an `AggregationsData` object by iterating through its properties.
2168
+ * It removes elements from the data that match any of the keys specified in the `keysToRemove` array.
2169
+ * The filtering applies specifically to elements with a valid `key` property of type == string.
2170
+ * If the `key` is empty or matches one of the `keysToRemove`, it is excluded from the resulting object.
2171
+ *
2172
+ * @param {AggregationsData} data - The aggregation data object to filter. Expected to have properties that
2173
+ * are arrays of items containing a `key` property.
2174
+ * @param {Array<string>} keysToRemove - Array of string keys that should be removed from the aggregation data.
2175
+ * @returns {AggregationsData} A new `AggregationsData` object with filtered entries,
2176
+ * omitting the specified keys.
2177
+ */ const filterAggregationsDataKeys = (data, keysToRemove)=>{
2178
+ if (!data || typeof data !== 'object') {
2179
+ return {};
2180
+ }
2181
+ return Object.entries(data).reduce((acc, [key, chartData])=>{
2182
+ if (Array.isArray(chartData)) {
2183
+ acc[key] = chartData.filter((x)=>x && typeof x.key === 'string' && !keysToRemove.includes(x.key));
2184
+ }
2185
+ return acc;
2186
+ }, {});
2187
+ };
2188
+
2189
+ const OverflowTooltippedLabel = ({ children, label, className = 'flex-grow font-heading text-md pt-0.5' })=>{
2190
+ const [showTooltip, setShowTooltip] = React.useState(false);
2191
+ return /*#__PURE__*/ jsxRuntime.jsx(core$1.Tooltip, {
2192
+ label: label,
2193
+ disabled: !showTooltip,
2194
+ position: "top-start",
2195
+ offset: 5,
2196
+ multiline: true,
2197
+ withArrow: true,
2198
+ arrowOffset: 20,
2199
+ classNames: {
2200
+ tooltip: 'bg-base-min bg-opacity-90 text-base-contrast-min shadow-lg font-content font-medium text-xs',
2201
+ arrow: 'bg-base-min bg-opacity-90'
2202
+ },
2203
+ children: /*#__PURE__*/ jsxRuntime.jsx("div", {
2204
+ className: `${className} truncate ... `,
2205
+ ref: (el)=>{
2206
+ if (el) {
2207
+ if (el.clientWidth < el.scrollWidth) {
2208
+ setShowTooltip(true);
2209
+ } else {
2210
+ setShowTooltip(false);
2211
+ }
2212
+ }
2213
+ },
2214
+ children: children
2215
+ })
2216
+ });
2217
+ };
2136
2218
 
2137
2219
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2138
2220
  function DefaultItemRenderer(_props) {
@@ -2620,16 +2702,25 @@ const LegendRows = ({ data })=>{
2620
2702
  const limitedRows = moreThanMaxRows ? data.slice(0, MAX_LEGEND_ROWS) : data;
2621
2703
  return limitedRows.map((element, elIndex)=>/*#__PURE__*/ jsxRuntime.jsxs(core$1.Table.Tr, {
2622
2704
  children: [
2623
- /*#__PURE__*/ jsxRuntime.jsxs(core$1.Table.Td, {
2624
- children: [
2625
- /*#__PURE__*/ jsxRuntime.jsx(core$1.ColorSwatch, {
2626
- className: "inline-block mr-2 align-middle",
2627
- size: "1em",
2628
- radius: "xs",
2629
- color: chartColors?.[elIndex % chartColors.length] || ''
2630
- }),
2631
- element.key
2632
- ]
2705
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Td, {
2706
+ children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
2707
+ className: "flex flex-nowrap items-center overflow-hidden",
2708
+ children: [
2709
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.ColorSwatch, {
2710
+ className: "inline-block mr-2 align-middle",
2711
+ size: "1em",
2712
+ radius: "xs",
2713
+ color: chartColors?.[elIndex % chartColors.length] || ''
2714
+ }),
2715
+ /*#__PURE__*/ jsxRuntime.jsx(OverflowTooltippedLabel, {
2716
+ label: element.key.toString(),
2717
+ children: /*#__PURE__*/ jsxRuntime.jsx("span", {
2718
+ className: "text-sm font-medium font-content",
2719
+ children: element.key.toString()
2720
+ })
2721
+ })
2722
+ ]
2723
+ })
2633
2724
  }),
2634
2725
  /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Td, {
2635
2726
  className: "text-right",
@@ -2667,25 +2758,35 @@ const LegendOverflow = ({ chart, data, chartTitle, counts })=>{
2667
2758
  children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Table, {
2668
2759
  withRowBorders: false,
2669
2760
  classNames: {
2670
- table: '',
2761
+ table: 'w-full table-fixed',
2671
2762
  td: 'p-1 leading-3'
2672
2763
  },
2673
2764
  children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Tbody, {
2674
2765
  children: data.map((element, elIndex)=>/*#__PURE__*/ jsxRuntime.jsxs(core$1.Table.Tr, {
2766
+ className: `${elIndex === 0 ? 'overflow-hidden text-ellipsis whitespace-nowrap' : 'last:text-right'}`,
2675
2767
  children: [
2676
- /*#__PURE__*/ jsxRuntime.jsxs(core$1.Table.Td, {
2677
- children: [
2678
- /*#__PURE__*/ jsxRuntime.jsx(core$1.ColorSwatch, {
2679
- className: "inline-block mr-2 align-middle",
2680
- size: "1em",
2681
- radius: "xs",
2682
- color: chartColors?.[elIndex % chartColors.length] || ''
2683
- }),
2684
- element.key
2685
- ]
2768
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Td, {
2769
+ children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
2770
+ className: "flex flex-nowrap items-center",
2771
+ children: [
2772
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.ColorSwatch, {
2773
+ className: "inline-block mr-2 align-middle",
2774
+ size: "1em",
2775
+ radius: "xs",
2776
+ color: chartColors?.[elIndex % chartColors.length] || ''
2777
+ }),
2778
+ /*#__PURE__*/ jsxRuntime.jsx(OverflowTooltippedLabel, {
2779
+ label: element.key.toString(),
2780
+ children: /*#__PURE__*/ jsxRuntime.jsx("span", {
2781
+ className: "text-sm font-medium font-content",
2782
+ children: element.key.toString()
2783
+ })
2784
+ })
2785
+ ]
2786
+ })
2686
2787
  }),
2687
2788
  /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Td, {
2688
- className: "text-right",
2789
+ className: "w-[10%] text-right",
2689
2790
  children: element.count
2690
2791
  })
2691
2792
  ]
@@ -2763,31 +2864,35 @@ const Charts = ({ charts, data, counts, isSuccess, numCols = DEFAULT_COLS, style
2763
2864
  inheritPadding: true,
2764
2865
  py: "xs",
2765
2866
  withBorder: style === 'box',
2766
- children: /*#__PURE__*/ jsxRuntime.jsxs(core$1.Table, {
2767
- withRowBorders: false,
2768
- classNames: {
2769
- td: 'p-1 leading-3',
2770
- th: 'p-1 leading-3 [text-shadow:_1px_0_#000]',
2771
- thead: 'border-b',
2772
- tbody: "before:content-[''] before:block before:p-1"
2773
- },
2774
- children: [
2775
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Thead, {
2776
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Tr, {
2777
- children: dataKeys.map((el, i)=>/*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Th, {
2778
- className: "last:text-right",
2779
- children: charts[field]?.dataLabels?.[el] || /*#__PURE__*/ jsxRuntime.jsx(React.Fragment, {
2780
- children: " "
2781
- })
2782
- }, i))
2783
- })
2784
- }),
2785
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Tbody, {
2786
- children: data === undefined ? '' : /*#__PURE__*/ jsxRuntime.jsx(LegendRows, {
2787
- data: data[field]
2867
+ children: /*#__PURE__*/ jsxRuntime.jsx("div", {
2868
+ className: "w-full",
2869
+ children: /*#__PURE__*/ jsxRuntime.jsxs(core$1.Table, {
2870
+ withRowBorders: false,
2871
+ classNames: {
2872
+ table: 'w-full table-fixed',
2873
+ td: 'p-1 leading-3',
2874
+ th: 'p-1 leading-3 [text-shadow:_1px_0_#000]',
2875
+ thead: 'border-b',
2876
+ tbody: "before:content-[''] before:block before:p-1"
2877
+ },
2878
+ children: [
2879
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Thead, {
2880
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Tr, {
2881
+ children: dataKeys.map((el, i)=>/*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Th, {
2882
+ className: `${i === 0 ? 'w-[90%] overflow-hidden text-ellipsis whitespace-nowrap' : 'last:text-right'}`,
2883
+ children: charts[field]?.dataLabels?.[el] || /*#__PURE__*/ jsxRuntime.jsx(React.Fragment, {
2884
+ children: " "
2885
+ })
2886
+ }, i))
2887
+ })
2888
+ }),
2889
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Tbody, {
2890
+ children: data === undefined ? '' : /*#__PURE__*/ jsxRuntime.jsx(LegendRows, {
2891
+ data: data[field]
2892
+ })
2788
2893
  })
2789
- })
2790
- ]
2894
+ ]
2895
+ })
2791
2896
  })
2792
2897
  }),
2793
2898
  showLegends && moreThanMaxRows && /*#__PURE__*/ jsxRuntime.jsx(core$1.Card.Section, {
@@ -3818,36 +3923,6 @@ flex items-start justify-between items-center flex-nowrap bg-secondary px-1.5 ro
3818
3923
  });
3819
3924
  };
3820
3925
 
3821
- const OverflowTooltippedLabel = ({ children, label, className = 'flex-grow font-heading text-md pt-0.5' })=>{
3822
- const [showTooltip, setShowTooltip] = React.useState(false);
3823
- return /*#__PURE__*/ jsxRuntime.jsx(core$1.Tooltip, {
3824
- label: label,
3825
- disabled: !showTooltip,
3826
- position: "top-start",
3827
- offset: 5,
3828
- multiline: true,
3829
- withArrow: true,
3830
- arrowOffset: 20,
3831
- classNames: {
3832
- tooltip: 'bg-base-min bg-opacity-90 text-base-contrast-min shadow-lg font-content font-medium text-xs',
3833
- arrow: 'bg-base-min bg-opacity-90'
3834
- },
3835
- children: /*#__PURE__*/ jsxRuntime.jsx("div", {
3836
- className: `${className} truncate ... `,
3837
- ref: (el)=>{
3838
- if (el) {
3839
- if (el.clientWidth < el.scrollWidth) {
3840
- setShowTooltip(true);
3841
- } else {
3842
- setShowTooltip(false);
3843
- }
3844
- }
3845
- },
3846
- children: children
3847
- })
3848
- });
3849
- };
3850
-
3851
3926
  const FacetEnumList = ({ field, facetName, hooks, valueLabel, isSettings = false, isFacetView = true, isSearching = false, showPercent = false, hideIfEmpty = false, showSorting = true, sort = 'value-dsc', moveValuesToBottom = [], excludeValues = [] })=>{
3852
3927
  const [isGroupExpanded, setIsGroupExpanded] = React.useState(false);
3853
3928
  const cardRef = React.useRef(null);
@@ -5744,6 +5819,20 @@ const FooterRowComponent = ({ item, rowClassname })=>{
5744
5819
  case 'Icon':
5745
5820
  {
5746
5821
  const logo = item[itemType];
5822
+ if (logo.href) {
5823
+ return /*#__PURE__*/ jsxRuntime.jsx("a", {
5824
+ href: logo.href,
5825
+ target: "_blank",
5826
+ rel: "noopener noreferrer",
5827
+ className: className,
5828
+ children: /*#__PURE__*/ jsxRuntime.jsx(Image, {
5829
+ src: `${logo.logo}`,
5830
+ width: logo.width,
5831
+ height: logo.height,
5832
+ alt: logo.description
5833
+ })
5834
+ }, `icons-${logo.logo}`);
5835
+ }
5747
5836
  return /*#__PURE__*/ jsxRuntime.jsx(Image, {
5748
5837
  src: `${logo.logo}`,
5749
5838
  width: logo.width,
@@ -7179,10 +7268,16 @@ const createFieldRendererElement = (field, resource)=>{
7179
7268
  json: resource,
7180
7269
  path: field.field
7181
7270
  });
7182
- if (resourceFieldValue === undefined || resourceFieldValue === null) {
7271
+ if (!lodash.isArray(resourceFieldValue) || resourceFieldValue.length == 0 || resourceFieldValue[0] === null) {
7183
7272
  if (field.includeIfNotAvailable === false) return null;
7184
- if (field.valueIfNotAvailable) resourceFieldValue = field.valueIfNotAvailable;
7185
- } else resourceFieldValue = resourceFieldValue.length > 0 ? resourceFieldValue[0] : '';
7273
+ if (field.valueIfNotAvailable) {
7274
+ resourceFieldValue = field.valueIfNotAvailable;
7275
+ } else {
7276
+ resourceFieldValue = '';
7277
+ }
7278
+ } else {
7279
+ resourceFieldValue = resourceFieldValue[0];
7280
+ }
7186
7281
  const label = field.includeLabel === undefined || field?.includeLabel ? field.name : undefined;
7187
7282
  const studyFieldRenderer = StudyDetailsRenderer(field.contentType, field?.renderer ?? 'default');
7188
7283
  switch(field.contentType){
@@ -7439,17 +7534,17 @@ const SinglePageStudyDetailsPanel = ({ data, studyConfig, authorization })=>{
7439
7534
  children: "Study Details Panel not configured"
7440
7535
  });
7441
7536
  } else {
7442
- return studyConfig?.fieldsToShow.map((field)=>{
7537
+ return studyConfig?.fieldsToShow.map((fieldToShow)=>{
7443
7538
  return /*#__PURE__*/ jsxRuntime.jsx("div", {
7444
- className: `px-2 ${field.groupWidth == 'full' || field.groupWidth === undefined ? 'w-full' : 'w-1/2'}`,
7539
+ className: `px-2 ${fieldToShow.groupWidth == 'full' || fieldToShow.groupWidth === undefined ? 'w-full' : 'w-1/2'}`,
7445
7540
  children: /*#__PURE__*/ jsxRuntime.jsxs("div", {
7446
7541
  className: "flex flex-col",
7447
7542
  children: [
7448
- field?.groupName ? /*#__PURE__*/ jsxRuntime.jsx("div", {
7543
+ fieldToShow?.groupName ? /*#__PURE__*/ jsxRuntime.jsx("div", {
7449
7544
  className: "text-lg font-bold",
7450
- children: field.groupName
7545
+ children: fieldToShow.groupName
7451
7546
  }) : null,
7452
- field.fields.map((field)=>{
7547
+ fieldToShow.fields.map((field)=>{
7453
7548
  const element = createFieldRendererElement(field, data);
7454
7549
  if (element !== null) {
7455
7550
  return /*#__PURE__*/ jsxRuntime.jsx("div", {
@@ -7460,7 +7555,7 @@ const SinglePageStudyDetailsPanel = ({ data, studyConfig, authorization })=>{
7460
7555
  })
7461
7556
  ]
7462
7557
  })
7463
- }, `${field.fields.join('-')}-details`);
7558
+ }, `${fieldToShow.fields.join('-')}-details`);
7464
7559
  });
7465
7560
  }
7466
7561
  }, [
@@ -11321,160 +11416,6 @@ const CohortManager$1 = ({ index })=>{
11321
11416
  });
11322
11417
  };
11323
11418
 
11324
- function isQueryResponse(obj) {
11325
- // Considering that the data property can be optional
11326
- return typeof obj === 'object' && (obj.data === undefined || typeof obj.data === 'object');
11327
- }
11328
- const ExtractData = (data, index)=>{
11329
- if (data === undefined || data === null) return {};
11330
- if (data.data === undefined || data.data === null) return {};
11331
- return Array.isArray(data.data[index]) && data.data[index].length > 0 ? data.data[index][0] : {};
11332
- };
11333
- const QueryRowDetailsPanel = ({ id, index, tableConfig, accessibility })=>{
11334
- //const [queryGuppy, { data, isLoading, isError }] = useLazyGeneralGQLQuery();
11335
- const idField = tableConfig.detailsConfig?.idField;
11336
- const { data, isLoading, isError } = core.useGeneralGQLQuery({
11337
- query: `query ($filter: JSON) {
11338
- ${index} (filter: $filter, accessibility: all) {
11339
- ${tableConfig.fields}
11340
- }
11341
- }`,
11342
- variables: {
11343
- filter: {
11344
- AND: [
11345
- {
11346
- IN: {
11347
- [idField ?? 0]: [
11348
- id
11349
- ]
11350
- }
11351
- }
11352
- ]
11353
- }
11354
- }
11355
- });
11356
- if (!idField) {
11357
- return /*#__PURE__*/ jsxRuntime.jsx(ErrorCard, {
11358
- message: 'idField not configure in Tables Details Config'
11359
- });
11360
- }
11361
- if (isError) {
11362
- return /*#__PURE__*/ jsxRuntime.jsx(ErrorCard, {
11363
- message: 'Error occurred while fetching data'
11364
- });
11365
- }
11366
- const queryData = isQueryResponse(data) ? ExtractData(data, index) : {};
11367
- const rows = Object.entries(queryData).map(([field, value])=>/*#__PURE__*/ jsxRuntime.jsxs("tr", {
11368
- children: [
11369
- /*#__PURE__*/ jsxRuntime.jsx("td", {
11370
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
11371
- fw: "bold",
11372
- children: field
11373
- })
11374
- }),
11375
- /*#__PURE__*/ jsxRuntime.jsx("td", {
11376
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
11377
- children: value ? value : ''
11378
- })
11379
- })
11380
- ]
11381
- }, field));
11382
- return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Stack, {
11383
- children: [
11384
- /*#__PURE__*/ jsxRuntime.jsx(core$1.LoadingOverlay, {
11385
- visible: isLoading
11386
- }),
11387
- /*#__PURE__*/ jsxRuntime.jsxs(core$1.Text, {
11388
- c: "primary.4",
11389
- children: [
11390
- "Results for ",
11391
- id
11392
- ]
11393
- }),
11394
- /*#__PURE__*/ jsxRuntime.jsxs(core$1.Table, {
11395
- withTableBorder: true,
11396
- withColumnBorders: true,
11397
- children: [
11398
- /*#__PURE__*/ jsxRuntime.jsx("thead", {
11399
- children: /*#__PURE__*/ jsxRuntime.jsxs("tr", {
11400
- children: [
11401
- /*#__PURE__*/ jsxRuntime.jsx("th", {
11402
- children: "Field"
11403
- }),
11404
- /*#__PURE__*/ jsxRuntime.jsx("th", {
11405
- children: "Value"
11406
- })
11407
- ]
11408
- })
11409
- }),
11410
- /*#__PURE__*/ jsxRuntime.jsx("tbody", {
11411
- children: rows
11412
- })
11413
- ]
11414
- })
11415
- ]
11416
- });
11417
- };
11418
-
11419
- const RowTableDetailsPanel = ({ row })=>{
11420
- const rowData = row?.original ?? {};
11421
- const rows = Object.entries(rowData).map(([field, value])=>/*#__PURE__*/ jsxRuntime.jsxs(core$1.Table.Tr, {
11422
- children: [
11423
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Td, {
11424
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
11425
- fw: "bold",
11426
- children: field
11427
- })
11428
- }),
11429
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Td, {
11430
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
11431
- children: value ? value : ''
11432
- })
11433
- })
11434
- ]
11435
- }, field));
11436
- return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Table, {
11437
- striped: true,
11438
- highlightOnHover: true,
11439
- withTableBorder: true,
11440
- withColumnBorders: true,
11441
- children: [
11442
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Thead, {
11443
- children: /*#__PURE__*/ jsxRuntime.jsxs(core$1.Table.Tr, {
11444
- children: [
11445
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Th, {
11446
- children: "Field"
11447
- }),
11448
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Th, {
11449
- children: "Value"
11450
- })
11451
- ]
11452
- })
11453
- }),
11454
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Tbody, {
11455
- children: rows
11456
- })
11457
- ]
11458
- });
11459
- };
11460
-
11461
- let instance$2;
11462
- const DefaultRendererCatalog$1 = {
11463
- tableDetails: {
11464
- default: RowTableDetailsPanel,
11465
- queryRowDetails: QueryRowDetailsPanel
11466
- }
11467
- };
11468
- const ExplorerTableDetailsPanelFactory = ()=>{
11469
- if (!instance$2) {
11470
- instance$2 = new RenderFactoryTypedInstance();
11471
- }
11472
- return instance$2;
11473
- };
11474
- const registerCohortBuilderDefaultPreviewRenderers = ()=>{
11475
- ExplorerTableDetailsPanelFactory().registerRendererCatalog(DefaultRendererCatalog$1);
11476
- };
11477
-
11478
11419
  const DEFAULT_PROPS = {
11479
11420
  body: 'bg-base-max',
11480
11421
  header: '!bg-primary !pb-9 !mb-9',
@@ -11518,6 +11459,48 @@ const DetailsModal = ({ title, id, row, classNames, panel, panelProps, onClose,
11518
11459
  });
11519
11460
  };
11520
11461
 
11462
+ const DetailsDrawer = ({ id, title, panel, panelProps })=>{
11463
+ const [opened, { open, close }] = hooks.useDisclosure(id !== undefined);
11464
+ React.useEffect(()=>{
11465
+ if (id !== undefined) open();
11466
+ else close();
11467
+ }, [
11468
+ close,
11469
+ id,
11470
+ open
11471
+ ]);
11472
+ return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Drawer.Root, {
11473
+ opened: opened,
11474
+ onClose: close,
11475
+ size: "50%",
11476
+ position: "right",
11477
+ children: [
11478
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Drawer.Overlay, {
11479
+ opacity: 0.5,
11480
+ blur: 4
11481
+ }),
11482
+ /*#__PURE__*/ jsxRuntime.jsxs(core$1.Drawer.Content, {
11483
+ children: [
11484
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Drawer.Header, {
11485
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Button, {
11486
+ leftSection: /*#__PURE__*/ jsxRuntime.jsx(md.MdKeyboardDoubleArrowLeft, {}),
11487
+ onClick: close,
11488
+ variant: "outline",
11489
+ children: "Back"
11490
+ })
11491
+ }),
11492
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Drawer.Body, {
11493
+ children: panel({
11494
+ id: id,
11495
+ ...panelProps
11496
+ })
11497
+ })
11498
+ ]
11499
+ })
11500
+ ]
11501
+ });
11502
+ };
11503
+
11521
11504
  // TODO need to type this
11522
11505
  const RenderArrayCell = ({ cell })=>{
11523
11506
  const value = cell.getValue();
@@ -11617,12 +11600,12 @@ const LinkCellFunctionCatalog = {
11617
11600
  default: RenderLinkCell,
11618
11601
  linkWithValueMap: RenderLinkCellUsingValueMap
11619
11602
  };
11620
- let instance$1;
11603
+ let instance$2;
11621
11604
  const ExplorerTableCellRendererFactory = ()=>{
11622
- if (!instance$1) {
11623
- instance$1 = new RenderFactoryTypedInstance();
11605
+ if (!instance$2) {
11606
+ instance$2 = new RenderFactoryTypedInstance();
11624
11607
  }
11625
- return instance$1;
11608
+ return instance$2;
11626
11609
  };
11627
11610
  // register default cell renderers
11628
11611
  const registerExplorerDefaultCellRenderers = ()=>{
@@ -11889,6 +11872,91 @@ const SubtableStack = ({ subTables, data })=>{
11889
11872
  });
11890
11873
  };
11891
11874
 
11875
+ function isQueryResponse(obj) {
11876
+ // Considering that the data property can be optional
11877
+ return typeof obj === 'object' && (obj.data === undefined || typeof obj.data === 'object');
11878
+ }
11879
+ const ExtractData = (data, index, path)=>{
11880
+ if (data === undefined || data === null) return {};
11881
+ if (data.data === undefined || data.data === null) return {};
11882
+ if (!lodash.isArray(data.data[index])) return {};
11883
+ let rowData = data.data[index][0];
11884
+ if (path) {
11885
+ const tmp = jsonpathPlus.JSONPath({
11886
+ path: path,
11887
+ json: data.data[index][0]
11888
+ });
11889
+ if (!lodash.isArray(tmp)) {
11890
+ return {};
11891
+ }
11892
+ if (tmp.length > 0) {
11893
+ rowData = tmp[0];
11894
+ }
11895
+ }
11896
+ return rowData;
11897
+ };
11898
+ const QueryRowDetailsPanel = ({ id, index, tableConfig, accessibility })=>{
11899
+ //const [queryGuppy, { data, isLoading, isError }] = useLazyGeneralGQLQuery();
11900
+ const idField = tableConfig.detailsConfig?.idField;
11901
+ const simpleDetailsView = tableConfig.detailsConfig?.simpleDetailsView;
11902
+ const { setStudyDetails } = useStudyContext();
11903
+ const [opened, { open, close }] = hooks.useDisclosure(false);
11904
+ const { data, isError, isFetching } = core.useGetRawDataAndTotalCountsQuery({
11905
+ type: index,
11906
+ fields: tableConfig.fields,
11907
+ filters: {
11908
+ mode: 'and',
11909
+ root: {
11910
+ [idField]: buildNested(idField, {
11911
+ operator: '=',
11912
+ field: idField,
11913
+ operand: id
11914
+ })
11915
+ }
11916
+ },
11917
+ offset: 0,
11918
+ size: 1,
11919
+ accessibility: accessibility
11920
+ }, {
11921
+ skip: !idField || !id
11922
+ });
11923
+ const queryData = React.useMemo(()=>isQueryResponse(data) ? ExtractData(data, index, tableConfig?.detailsConfig?.dataPath) : {}, [
11924
+ data,
11925
+ index,
11926
+ tableConfig?.detailsConfig?.dataPath
11927
+ ]);
11928
+ React.useEffect(()=>{
11929
+ setStudyDetails(queryData);
11930
+ }, [
11931
+ queryData,
11932
+ setStudyDetails
11933
+ ]);
11934
+ if (!idField) {
11935
+ return /*#__PURE__*/ jsxRuntime.jsx(ErrorCard, {
11936
+ message: 'idField not configure in Tables Details Config'
11937
+ });
11938
+ }
11939
+ if (isError) {
11940
+ return /*#__PURE__*/ jsxRuntime.jsx(ErrorCard, {
11941
+ message: 'Error occurred while fetching data'
11942
+ });
11943
+ }
11944
+ // Inital attempt at using Study Details component
11945
+ return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Stack, {
11946
+ children: [
11947
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.LoadingOverlay, {
11948
+ visible: isFetching
11949
+ }),
11950
+ simpleDetailsView ? /*#__PURE__*/ jsxRuntime.jsx(SinglePageStudyDetailsPanel, {
11951
+ data: queryData ?? {},
11952
+ studyConfig: simpleDetailsView
11953
+ }) : /*#__PURE__*/ jsxRuntime.jsx("div", {
11954
+ children: "Study Details Panel not configured"
11955
+ })
11956
+ ]
11957
+ });
11958
+ };
11959
+
11892
11960
  const DEFAULT_PAGE_LIMIT_LABEL = 'Rows per Page (Limited to 10,0000):';
11893
11961
  const DEFAULT_PAGE_LIMIT = 10000;
11894
11962
  /**
@@ -11903,13 +11971,19 @@ const DEFAULT_PAGE_LIMIT = 10000;
11903
11971
  pageIndex: 0,
11904
11972
  pageSize: 10
11905
11973
  });
11906
- const DetailsComponent = DetailsModal;
11974
+ const DetailsComponent = React.useMemo(()=>tableConfig?.detailsConfig?.panelContainer === 'drawer' ? DetailsDrawer : DetailsModal, []);
11907
11975
  const [sorting, setSorting] = React.useState([]);
11908
11976
  const [rowSelection, setRowSelection] = React.useState({});
11909
11977
  const [selectedRow, setSelectedRow] = React.useState(undefined);
11910
- const DetailsPanel = React.useMemo(()=>ExplorerTableDetailsPanelFactory().getRenderer('tableDetails', tableConfig?.detailsConfig?.panel ?? 'default'), [
11911
- tableConfig?.detailsConfig?.panel
11912
- ]);
11978
+ // const DetailsPanel = useMemo(
11979
+ // () =>
11980
+ // ExplorerTableDetailsPanelFactory().getRenderer(
11981
+ // 'tableDetails',
11982
+ // tableConfig?.detailsConfig?.panel ?? 'default',
11983
+ // ),
11984
+ // [tableConfig?.detailsConfig?.panel],
11985
+ // );
11986
+ const DetailsPanel = React.useMemo(()=>QueryRowDetailsPanel, []);
11913
11987
  const tableColumns = useDeepCompare.useDeepCompareMemo(()=>{
11914
11988
  return createTableColumns(tableConfig);
11915
11989
  }, [
@@ -11922,7 +11996,18 @@ const DEFAULT_PAGE_LIMIT = 10000;
11922
11996
  const getRowId = React.useCallback((tableConfig)=>{
11923
11997
  const { detailsConfig } = tableConfig || {};
11924
11998
  const idField = detailsConfig?.idField;
11925
- return (originalRow)=>idField && Object.keys(originalRow).includes(idField) ? originalRow[idField] : undefined;
11999
+ if (!idField) return undefined;
12000
+ return (originalRow)=>{
12001
+ const id = jsonpathPlus.JSONPath({
12002
+ json: originalRow,
12003
+ path: idField
12004
+ });
12005
+ if (id.length > 0) {
12006
+ return id[0];
12007
+ } else {
12008
+ return undefined;
12009
+ }
12010
+ };
11926
12011
  }, []);
11927
12012
  const cohortFilters = core.useCoreSelector((state)=>core.selectIndexFilters(state, index));
11928
12013
  const { data, isLoading, isError, isFetching } = core.useGetRawDataAndTotalCountsQuery({
@@ -11979,6 +12064,12 @@ const DEFAULT_PAGE_LIMIT = 10000;
11979
12064
  onPaginationChange: setPagination,
11980
12065
  onSortingChange: setSorting,
11981
12066
  enableTopToolbar: false,
12067
+ enableExpandAll: false,
12068
+ displayColumnDefOptions: {
12069
+ 'mrt-row-expand': {
12070
+ enableHiding: true
12071
+ }
12072
+ },
11982
12073
  enableExpanding: !!tableConfig?.detailsConfig,
11983
12074
  getRowId: getRowId(tableConfig),
11984
12075
  rowCount: totalRowCount,
@@ -11988,6 +12079,16 @@ const DEFAULT_PAGE_LIMIT = 10000;
11988
12079
  localization: {
11989
12080
  rowsPerPage: limitLabel
11990
12081
  },
12082
+ // mantineExpandAllButtonProps: {
12083
+ // style: {
12084
+ // visibility: 'hidden',
12085
+ // },
12086
+ // },
12087
+ // mantineExpandButtonProps: {
12088
+ // style: {
12089
+ // visibility: 'hidden',
12090
+ // },
12091
+ // },
11991
12092
  mantineTableProps: {
11992
12093
  style: {
11993
12094
  backgroundColor: 'var(--mantine-color-base-1)',
@@ -12019,7 +12120,10 @@ const DEFAULT_PAGE_LIMIT = 10000;
12019
12120
  showProgressBars: isFetching,
12020
12121
  showAlertBanner: isError,
12021
12122
  density: 'xs',
12022
- rowSelection: rowSelection
12123
+ rowSelection: rowSelection,
12124
+ columnVisibility: {
12125
+ 'mrt-row-expand': false
12126
+ }
12023
12127
  },
12024
12128
  mantineTableBodyRowProps: tableConfig.detailsConfig?.mode === 'click' ? ({ row })=>({
12025
12129
  onClick: ()=>{
@@ -12051,29 +12155,31 @@ const DEFAULT_PAGE_LIMIT = 10000;
12051
12155
  } else return null;
12052
12156
  } : undefined
12053
12157
  });
12054
- return /*#__PURE__*/ jsxRuntime.jsxs(React.Fragment, {
12055
- children: [
12056
- Object.keys(rowSelection).length > 0 ? /*#__PURE__*/ jsxRuntime.jsx(DetailsComponent, {
12057
- title: tableConfig?.detailsConfig?.title,
12058
- id: Object.keys(rowSelection).length > 0 ? Object.keys(rowSelection).at(0) : undefined,
12059
- row: selectedRow,
12060
- onClose: ()=>setRowSelection({}),
12061
- panel: DetailsPanel,
12062
- classNames: tableConfig?.detailsConfig?.classNames,
12063
- panelProps: {
12064
- index,
12065
- tableConfig,
12066
- ...tableConfig?.detailsConfig?.params ?? {},
12067
- accessibility
12068
- }
12069
- }) : null,
12070
- /*#__PURE__*/ jsxRuntime.jsx("div", {
12071
- className: "inline-block overflow-x-scroll",
12072
- children: /*#__PURE__*/ jsxRuntime.jsx(mantineReactTable.MantineReactTable, {
12073
- table: table
12158
+ return /*#__PURE__*/ jsxRuntime.jsx(React.Fragment, {
12159
+ children: /*#__PURE__*/ jsxRuntime.jsxs(StudyProvider, {
12160
+ children: [
12161
+ /*#__PURE__*/ jsxRuntime.jsx(DetailsComponent, {
12162
+ title: tableConfig?.detailsConfig?.title,
12163
+ id: Object.keys(rowSelection).length > 0 ? Object.keys(rowSelection).at(0) : undefined,
12164
+ row: selectedRow,
12165
+ onClose: ()=>setRowSelection({}),
12166
+ panel: DetailsPanel,
12167
+ classNames: tableConfig?.detailsConfig?.classNames,
12168
+ panelProps: {
12169
+ index,
12170
+ tableConfig,
12171
+ ...tableConfig?.detailsConfig?.params ?? {},
12172
+ accessibility
12173
+ }
12174
+ }),
12175
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
12176
+ className: "inline-block overflow-x-scroll",
12177
+ children: /*#__PURE__*/ jsxRuntime.jsx(mantineReactTable.MantineReactTable, {
12178
+ table: table
12179
+ })
12074
12180
  })
12075
- })
12076
- ]
12181
+ ]
12182
+ })
12077
12183
  });
12078
12184
  };
12079
12185
 
@@ -12748,6 +12854,25 @@ const EmptyData = {};
12748
12854
  }, {
12749
12855
  skip: chartKeys.length === 0
12750
12856
  });
12857
+ const cleanChartData = useDeepCompare.useDeepCompareMemo(()=>{
12858
+ if (isChartSuccess && chartData) {
12859
+ const cleanedData = {};
12860
+ Object.keys(summaryCharts).forEach((key)=>{
12861
+ // remove empty keys
12862
+ cleanedData[key] = chartData[key].filter((x)=>typeof x.key !== 'string' ? true : x.key !== '');
12863
+ const facetDef = facetDefinitions?.[key];
12864
+ if (facetDef?.excludeValues) {
12865
+ cleanedData[key] = cleanedData[key].filter((x)=>typeof x.key !== 'string' ? true : facetDef?.excludeValues?.includes(String(x.key)) === false);
12866
+ }
12867
+ });
12868
+ return cleanedData;
12869
+ }
12870
+ return chartData;
12871
+ }, [
12872
+ chartData,
12873
+ isChartSuccess,
12874
+ summaryCharts
12875
+ ]);
12751
12876
  const getEnumFacetData = useDeepCompare.useDeepCompareCallback((field)=>{
12752
12877
  let filters = undefined;
12753
12878
  let combineMode = 'or';
@@ -12888,7 +13013,7 @@ const EmptyData = {};
12888
13013
  }); // TODO: replace with configurable message
12889
13014
  }
12890
13015
  return /*#__PURE__*/ jsxRuntime.jsxs("div", {
12891
- className: "flex flex-col mt-3 relative px-4 bg-base-light w-full",
13016
+ className: "flex flex-col mt-3 relative px-4 bg-base-lightest w-full",
12892
13017
  children: [
12893
13018
  /*#__PURE__*/ jsxRuntime.jsx(CohortManager$1, {
12894
13019
  index: index
@@ -12938,24 +13063,21 @@ const EmptyData = {};
12938
13063
  ...chartsSection,
12939
13064
  charts: summaryCharts
12940
13065
  },
12941
- data: chartData ?? EmptyData,
13066
+ data: cleanChartData ?? EmptyData,
12942
13067
  isSuccess: isChartSuccess
12943
13068
  }) : /*#__PURE__*/ jsxRuntime.jsx(Charts, {
12944
13069
  charts: summaryCharts,
12945
- data: chartData ?? EmptyData,
13070
+ data: cleanChartData ?? EmptyData,
12946
13071
  counts: counts,
12947
13072
  isSuccess: isChartSuccess,
12948
13073
  numCols: numCols
12949
13074
  }),
12950
13075
  table?.enabled && /*#__PURE__*/ jsxRuntime.jsx("div", {
12951
13076
  className: "mt-2 flex flex-col",
12952
- children: /*#__PURE__*/ jsxRuntime.jsx("div", {
12953
- className: "grid",
12954
- children: /*#__PURE__*/ jsxRuntime.jsx(ExplorerTable, {
12955
- index: index,
12956
- tableConfig: table,
12957
- accessibility: accessLevel
12958
- })
13077
+ children: /*#__PURE__*/ jsxRuntime.jsx(ExplorerTable, {
13078
+ index: index,
13079
+ tableConfig: table,
13080
+ accessibility: accessLevel
12959
13081
  })
12960
13082
  })
12961
13083
  ]
@@ -12990,16 +13112,20 @@ const TabsLayoutToComponentProp = (tabsLayout)=>{
12990
13112
  }
12991
13113
  };
12992
13114
 
12993
- const CohortBuilder = ({ explorerConfig, sharedFiltersMap = null, tabsLayout = 'left' })=>{
13115
+ const useGetCurrentCohort = ()=>{
13116
+ return core.useCoreSelector((state)=>core.selectCurrentCohortId(state));
13117
+ };
13118
+ const CohortBuilder$1 = ({ explorerConfig, sharedFiltersMap = null, tabsLayout = 'left' })=>{
12994
13119
  const dispatch = core.useCoreDispatch();
12995
13120
  dispatch(core.setSharedFilters(sharedFiltersMap ?? {}));
12996
13121
  const configuration = useDeepCompare.useDeepCompareMemo(()=>explorerConfig, [
12997
13122
  explorerConfig
12998
13123
  ]);
12999
13124
  return /*#__PURE__*/ jsxRuntime.jsx("div", {
13000
- className: "w-full",
13125
+ className: "w-full mt-2",
13001
13126
  children: /*#__PURE__*/ jsxRuntime.jsxs(core$1.Tabs, {
13002
13127
  color: "primary.4",
13128
+ variant: explorerConfig[0]?.tabType,
13003
13129
  keepMounted: true,
13004
13130
  defaultValue: explorerConfig[0].tabTitle,
13005
13131
  children: [
@@ -13030,6 +13156,71 @@ const CohortBuilder = ({ explorerConfig, sharedFiltersMap = null, tabsLayout = '
13030
13156
  });
13031
13157
  };
13032
13158
 
13159
+ var CohortBuilder$2 = /*#__PURE__*/Object.freeze({
13160
+ __proto__: null,
13161
+ default: CohortBuilder$1,
13162
+ useGetCurrentCohort: useGetCurrentCohort
13163
+ });
13164
+
13165
+ const RowTableDetailsPanel = ({ row })=>{
13166
+ const rowData = row?.original ?? {};
13167
+ const rows = Object.entries(rowData).map(([field, value])=>/*#__PURE__*/ jsxRuntime.jsxs(core$1.Table.Tr, {
13168
+ children: [
13169
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Td, {
13170
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
13171
+ fw: "bold",
13172
+ children: field
13173
+ })
13174
+ }),
13175
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Td, {
13176
+ children: /*#__PURE__*/ jsxRuntime.jsx(core$1.Text, {
13177
+ children: value ? value : ''
13178
+ })
13179
+ })
13180
+ ]
13181
+ }, field));
13182
+ return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Table, {
13183
+ striped: true,
13184
+ highlightOnHover: true,
13185
+ withTableBorder: true,
13186
+ withColumnBorders: true,
13187
+ children: [
13188
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Thead, {
13189
+ children: /*#__PURE__*/ jsxRuntime.jsxs(core$1.Table.Tr, {
13190
+ children: [
13191
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Th, {
13192
+ children: "Field"
13193
+ }),
13194
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Th, {
13195
+ children: "Value"
13196
+ })
13197
+ ]
13198
+ })
13199
+ }),
13200
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Table.Tbody, {
13201
+ children: rows
13202
+ })
13203
+ ]
13204
+ });
13205
+ };
13206
+
13207
+ let instance$1;
13208
+ const DefaultRendererCatalog$1 = {
13209
+ tableDetails: {
13210
+ default: RowTableDetailsPanel,
13211
+ queryRowDetails: QueryRowDetailsPanel
13212
+ }
13213
+ };
13214
+ const ExplorerTableDetailsPanelFactory = ()=>{
13215
+ if (!instance$1) {
13216
+ instance$1 = new RenderFactoryTypedInstance();
13217
+ }
13218
+ return instance$1;
13219
+ };
13220
+ const registerCohortBuilderDefaultPreviewRenderers = ()=>{
13221
+ ExplorerTableDetailsPanelFactory().registerRendererCatalog(DefaultRendererCatalog$1);
13222
+ };
13223
+
13033
13224
  const useCustomFacets = ()=>({
13034
13225
  data: [],
13035
13226
  isSuccess: true
@@ -14534,12 +14725,39 @@ const StaticNotebookViewer = ({ notebook })=>{
14534
14725
 
14535
14726
  const StaticNotebookIFrame = ({ notebook })=>{
14536
14727
  const router = router$1.useRouter();
14728
+ const iframeRef = React.useRef(null);
14729
+ React.useEffect(()=>{
14730
+ const iframe = iframeRef.current;
14731
+ const handleLoad = ()=>{
14732
+ try {
14733
+ // Access iframe document
14734
+ if (iframe) {
14735
+ const iframeDoc = iframe.contentDocument || iframe?.contentWindow?.document;
14736
+ // Find all anchor tags and add target="_blank"
14737
+ const links = iframeDoc?.querySelectorAll('a');
14738
+ links?.forEach((link)=>{
14739
+ link.setAttribute('target', '_blank');
14740
+ link.setAttribute('rel', 'noreferrer');
14741
+ });
14742
+ }
14743
+ } catch (error) {
14744
+ console.error('Cannot access iframe content:', error);
14745
+ }
14746
+ };
14747
+ if (iframe) {
14748
+ iframe.addEventListener('load', handleLoad);
14749
+ return ()=>iframe.removeEventListener('load', handleLoad);
14750
+ }
14751
+ }, []);
14537
14752
  return /*#__PURE__*/ jsxRuntime.jsx("div", {
14538
14753
  className: "flex w-full h-full",
14539
14754
  children: /*#__PURE__*/ jsxRuntime.jsx("div", {
14540
14755
  className: "flex justify-items-center w-full",
14541
14756
  children: /*#__PURE__*/ jsxRuntime.jsx("iframe", {
14542
- allow: "cross-origin",
14757
+ ref: iframeRef,
14758
+ sandbox: "allow-same-origin allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox",
14759
+ referrerPolicy: "strict-origin-when-cross-origin",
14760
+ allow: "geolocation 'none'; microphone 'none'; camera 'none'",
14543
14761
  src: `${router.basePath}/${GEN3_STATIC_NOTEBOOK_DIR}/${notebook}`,
14544
14762
  width: "100%",
14545
14763
  height: "100%",
@@ -14573,7 +14791,7 @@ class FilesystemContent {
14573
14791
  try {
14574
14792
  const files = myGlob(path.join(this.rootPath, filepath), filter);
14575
14793
  return Promise.all(files.map((file)=>this.get(path.join(filepath, file))));
14576
- } catch (err) {
14794
+ } catch (_err) {
14577
14795
  throw new Error(`getAllCannot process ${path.join(this.rootPath, filepath)}/${filter}`);
14578
14796
  }
14579
14797
  }
@@ -14628,12 +14846,18 @@ var ContentSource$1 = ContentSource.getInstance();
14628
14846
  * @returns A Promise resolving to an object containing header and footer props.
14629
14847
  */ const getNavPageLayoutPropsFromConfig = async ()=>{
14630
14848
  const navigationConfigJSON = await ContentSource$1.getContentDatabase().get(`${core.GEN3_COMMONS_NAME}/navigation.json`);
14631
- let bannerConfigJSON = [];
14632
- try {
14633
- bannerConfigJSON = await ContentSource$1.getContentDatabase().get(`${core.GEN3_COMMONS_NAME}/banner.json`);
14634
- } catch (error) {
14635
- console.warn('No banner config found at: ', `${core.GEN3_COMMONS_NAME}/banner.json`);
14636
- }
14849
+ const bannerConfigJSON = [];
14850
+ // TODO: enable later
14851
+ // try {
14852
+ // bannerConfigJSON = await ContentSource.getContentDatabase().get(
14853
+ // `${GEN3_COMMONS_NAME}/banner.json`,
14854
+ // );
14855
+ // } catch (error: unknown) {
14856
+ // console.warn(
14857
+ // 'No banner config found at: ',
14858
+ // `${GEN3_COMMONS_NAME}/banner.json`,
14859
+ // );
14860
+ // }
14637
14861
  const { topBar, navigation, type = 'original' } = navigationConfigJSON;
14638
14862
  let headerMetadata = {
14639
14863
  title: 'Gen3 Frontend Framework Page',
@@ -15219,8 +15443,9 @@ const cohortsAdapter = toolkit.createEntityAdapter({
15219
15443
  const DEFAULT_COHORT_NAME = 'Default';
15220
15444
  const loadCohortsFromStorage = toolkit.createAsyncThunk('cohorts/loadFromStorage', async ()=>{
15221
15445
  try {
15222
- const cohortsMap = await cohortStorage.getAllCohorts();
15223
- return Object(cohortsMap).values();
15446
+ const results = await cohortStorage.getAllCohorts();
15447
+ if (results.data) return Object.values(results.data);
15448
+ else return [];
15224
15449
  } catch (error) {
15225
15450
  console.error('Failed to load cohorts:', error);
15226
15451
  return [];
@@ -15262,11 +15487,13 @@ const deleteCohortFromStorage = toolkit.createAsyncThunk('cohorts/deleteFromStor
15262
15487
  return cohortId;
15263
15488
  });
15264
15489
  const emptyInitialState = cohortsAdapter.getInitialState({
15265
- currentCohortId: 'empty',
15490
+ currentCohortId: 'uninitialized',
15266
15491
  loading: false,
15492
+ uninitialized: true,
15267
15493
  error: null,
15268
15494
  autoSaveInProgress: []
15269
15495
  });
15496
+ // const initialState = emptyInitialState;
15270
15497
  const initialState = cohortsAdapter.addOne(emptyInitialState, createDefaultCohort());
15271
15498
  const updateAutoSave = (cohortId, state)=>{
15272
15499
  // Add to auto-save queue if not already present
@@ -15447,16 +15674,24 @@ const cohortManagerSlice = toolkit.createSlice({
15447
15674
  extraReducers: (builder)=>{
15448
15675
  builder.addCase(loadCohortsFromStorage.pending, (state)=>{
15449
15676
  state.loading = true;
15677
+ state.uninitialized = false;
15450
15678
  state.error = null;
15679
+ console.log('loadCohortsFromStorage.pending');
15451
15680
  }).addCase(loadCohortsFromStorage.fulfilled, (state, action)=>{
15452
15681
  state.loading = false;
15682
+ console.log('loadCohortsFromStorage.fulfilled', action.payload);
15453
15683
  if (action.payload.length > 0) {
15454
- if (Object.keys(state.entities).length === 1) {
15455
- cohortsAdapter.removeOne(state, state.entities[0].id);
15684
+ if (Object.keys(state.entities).length >= 0) {
15685
+ cohortsAdapter.removeAll(state);
15456
15686
  }
15457
15687
  cohortsAdapter.addMany(state, action.payload);
15458
15688
  const sortedCohorts = action.payload.sort((a, b)=>b.modifiedDatetime.localeCompare(a.modifiedDatetime));
15459
15689
  state.currentCohortId = sortedCohorts[0].id;
15690
+ } else {
15691
+ // No cohorts in storage, create default cohort
15692
+ const defaultCohort = createDefaultCohort();
15693
+ cohortsAdapter.addOne(state, defaultCohort);
15694
+ state.currentCohortId = defaultCohort.id;
15460
15695
  }
15461
15696
  }).addCase(loadCohortsFromStorage.rejected, (state, action)=>{
15462
15697
  state.loading = false;
@@ -15513,6 +15748,7 @@ const cohortManagerReducer = cohortManagerSlice.reducer;
15513
15748
  const getCurrentCohort = (state)=>{
15514
15749
  const cohort = state.entities[state.currentCohortId];
15515
15750
  if (!cohort) {
15751
+ console.log('creating default cohort');
15516
15752
  return createDefaultCohort();
15517
15753
  }
15518
15754
  return cohort;
@@ -15622,7 +15858,6 @@ const reducers = redux.combineReducers({
15622
15858
  filtersExpandedState: filtersExpandedReducer,
15623
15859
  facetDefinitionState: facetDefinitionsReducer,
15624
15860
  cohorts: cohortManagerReducer,
15625
- // savedCohorts: saveCohortPersistenceReducer,
15626
15861
  dataAccessRequests: dataAccessRequestsReducer
15627
15862
  });
15628
15863
  const persistedReducers = reduxPersist.persistReducer(persistConfig, reducers);
@@ -15633,6 +15868,10 @@ const { id, AppStore, AppContext, useAppSelector, useAppDispatch } = core.create
15633
15868
  version: '0.0.1'
15634
15869
  });
15635
15870
 
15871
+ process.env.GEN3_COHORT_DISCOVERY_API || `${core.GEN3_API}/api/auth/analysis/cohortDiscovery`;
15872
+ const UninitializeCohort = {
15873
+ filters: {}};
15874
+
15636
15875
  // Selectors
15637
15876
  const { selectAll: selectAllCohorts, selectTotal: selectTotalCohorts, selectById: selectCohortById, selectIds: selectCohortIds } = cohortsAdapter.getSelectors((state)=>state.cohorts);
15638
15877
  const selectCurrentCohortId = (state)=>state.cohorts.currentCohortId;
@@ -15640,7 +15879,7 @@ const selectCurrentCohort = (state)=>{
15640
15879
  const { currentCohortId, entities } = state.cohorts;
15641
15880
  const cohort = entities[currentCohortId];
15642
15881
  if (!cohort) {
15643
- return createDefaultCohort();
15882
+ return null;
15644
15883
  }
15645
15884
  return cohort;
15646
15885
  };
@@ -15662,15 +15901,15 @@ toolkit.createSelector([
15662
15901
  ], (autoSaveArray, cohortId)=>autoSaveArray.includes(cohortId));
15663
15902
  const selectCurrentCohortName = toolkit.createSelector([
15664
15903
  selectCurrentCohort
15665
- ], (cohort)=>cohort.name);
15904
+ ], (cohort)=>cohort?.name ?? 'No Cohort Defined');
15666
15905
  const selectCurrentCohortFilters = toolkit.createSelector([
15667
15906
  selectCurrentCohort
15668
- ], (cohort)=>cohort.filters);
15907
+ ], (cohort)=>cohort ? cohort.filters : UninitializeCohort.filters);
15669
15908
  const selectCurrentCohortIndexFilters = toolkit.createSelector([
15670
15909
  selectCurrentCohort,
15671
15910
  (state, index)=>index
15672
15911
  ], (cohort, index)=>{
15673
- return cohort.filters?.[index] ?? EmptyFilterSet;
15912
+ return cohort?.filters?.[index] ?? EmptyFilterSet;
15674
15913
  });
15675
15914
  toolkit.createSelector([
15676
15915
  selectAllCohorts,
@@ -15682,7 +15921,6 @@ toolkit.createSelector([
15682
15921
  const trimmedName = params.name.trim().toLowerCase();
15683
15922
  return cohorts.some((cohort)=>cohort.id !== params.excludeId && cohort.name.trim().toLowerCase() === trimmedName);
15684
15923
  });
15685
- const selectCohortManagerLoading = (state)=>state.cohorts.loading;
15686
15924
  const selectCohortIdToNameMap = toolkit.createSelector([
15687
15925
  selectAllCohorts
15688
15926
  ], (cohorts)=>{
@@ -16149,14 +16387,12 @@ const submitCohortRequestAction = async (cohort, values, user, indexResources, r
16149
16387
  }
16150
16388
  };
16151
16389
 
16152
- const CohortManager = ({ indexResources, remoteSupportService, size = 'md' })=>{
16153
- const dispatch = useAppDispatch();
16390
+ const CohortManagerPanel = ({ indexResources, remoteSupportService, size = 'md' })=>{
16391
+ const appDispatch = useAppDispatch();
16154
16392
  const [isEditing, setIsEditing] = React.useState(false);
16155
16393
  const [editingLabel, setEditingLabel] = React.useState('');
16156
16394
  const allCohorts = useAppSelector(selectAllCohorts);
16157
16395
  const currentCohort = useAppSelector(selectCurrentCohort);
16158
- const loading = useAppSelector(selectCohortManagerLoading);
16159
- const appDispatch = useAppDispatch();
16160
16396
  const [getGetAggs] = core.useLazyGetAggsNoFilterSelfQuery();
16161
16397
  const [requestQuery] = core.useCreateRequestMutation();
16162
16398
  const user = core.useCoreSelector(core.selectUserDetails);
@@ -16173,7 +16409,7 @@ const CohortManager = ({ indexResources, remoteSupportService, size = 'md' })=>{
16173
16409
  };
16174
16410
  const saveEdit = ()=>{
16175
16411
  if (editingLabel.trim() === '' || !currentCohort.name) return;
16176
- dispatch(updateCohortName({
16412
+ appDispatch(updateCohortName({
16177
16413
  id: currentCohort.id,
16178
16414
  name: editingLabel
16179
16415
  }));
@@ -16181,7 +16417,7 @@ const CohortManager = ({ indexResources, remoteSupportService, size = 'md' })=>{
16181
16417
  setEditingLabel('');
16182
16418
  };
16183
16419
  const handleCreateNew = ()=>{
16184
- dispatch(createNewCohort({
16420
+ appDispatch(createNewCohort({
16185
16421
  name: 'New Cohort'
16186
16422
  }));
16187
16423
  };
@@ -16193,22 +16429,26 @@ const CohortManager = ({ indexResources, remoteSupportService, size = 'md' })=>{
16193
16429
  }, [
16194
16430
  allCohorts
16195
16431
  ]);
16432
+ useDeepCompare.useDeepCompareEffect(()=>{
16433
+ if (!currentCohort) {
16434
+ appDispatch(setCurrentCohortId(allCohorts[0].id));
16435
+ }
16436
+ }, [
16437
+ allCohorts,
16438
+ currentCohort,
16439
+ setCurrentCohortId
16440
+ ]);
16196
16441
  const onSelectCohort = React.useCallback((_value, option)=>{
16197
16442
  if (option) {
16198
- dispatch(setCurrentCohortId(option.value));
16443
+ appDispatch(setCurrentCohortId(option.value));
16199
16444
  }
16200
16445
  }, [
16201
- dispatch
16446
+ appDispatch
16202
16447
  ]);
16203
16448
  const handleCohortAccessRequest = async (cohortId, values)=>{
16204
16449
  const cohort = allCohorts.find((obj)=>obj.id === cohortId);
16205
16450
  if (cohort) await submitCohortRequestAction(cohort, values, user, indexResources, remoteSupportService, appDispatch, getGetAggs, requestQuery);
16206
16451
  };
16207
- if (loading) {
16208
- return /*#__PURE__*/ jsxRuntime.jsx("div", {
16209
- children: "Loading cohorts..."
16210
- });
16211
- }
16212
16452
  return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Group, {
16213
16453
  gap: "xs",
16214
16454
  className: "flex pt-4 pl-2",
@@ -16266,7 +16506,7 @@ const CohortManager = ({ indexResources, remoteSupportService, size = 'md' })=>{
16266
16506
  onClick: saveEdit,
16267
16507
  "data-testid": "completeCohortRenameButton",
16268
16508
  "aria-label": "Complete rename cohort",
16269
- disabled: editingLabel.trim() === '' || editingLabel.trim() === currentCohort.name,
16509
+ disabled: editingLabel.trim() === '' || editingLabel.trim() === currentCohort?.name,
16270
16510
  size: `compact-${size}`,
16271
16511
  children: /*#__PURE__*/ jsxRuntime.jsx(react.Icon, {
16272
16512
  icon: "gen3:check",
@@ -16341,7 +16581,7 @@ const CohortManager = ({ indexResources, remoteSupportService, size = 'md' })=>{
16341
16581
  color: theme.colors.accent[4]
16342
16582
  },
16343
16583
  onConfirm: ()=>{
16344
- dispatch(removeCohort(currentCohort.id));
16584
+ appDispatch(removeCohort(currentCohort.id));
16345
16585
  }
16346
16586
  });
16347
16587
  },
@@ -16383,8 +16623,15 @@ const CohortManager = ({ indexResources, remoteSupportService, size = 'md' })=>{
16383
16623
  ]
16384
16624
  });
16385
16625
  };
16386
-
16387
- process.env.GEN3_COHORT_DISCOVERY_API || `${core.GEN3_API}/api/auth/analysis/cohortDiscovery`;
16626
+ const CohortManager = ({ indexResources, remoteSupportService, size = 'md' })=>{
16627
+ // TODO: initialize and load cohorts from cohort storage
16628
+ // as right now the redux-persist is handling cohorts
16629
+ return /*#__PURE__*/ jsxRuntime.jsx(CohortManagerPanel, {
16630
+ indexResources: indexResources,
16631
+ remoteSupportService: remoteSupportService,
16632
+ size: size
16633
+ });
16634
+ };
16388
16635
 
16389
16636
  const useGraphQLData = (url, body, skip)=>{
16390
16637
  // Create a fetcher function that handles the GraphQL POST request
@@ -16853,22 +17100,6 @@ const SavedCohortsTable = ({ indexResources, remoteSupportService, size = 'md' }
16853
17100
  })
16854
17101
  })
16855
17102
  }),
16856
- /*#__PURE__*/ jsxRuntime.jsx(core$1.Tooltip, {
16857
- label: "Select Cohort",
16858
- withArrow: true,
16859
- children: /*#__PURE__*/ jsxRuntime.jsx(core$1.ActionIcon, {
16860
- color: "accent.4",
16861
- variant: "transparent",
16862
- "aria-label": "Select cohort",
16863
- onClick: ()=>{},
16864
- children: /*#__PURE__*/ jsxRuntime.jsx(react.Icon, {
16865
- icon: "gen3:cohort",
16866
- height: iconSize,
16867
- width: iconSize,
16868
- color: theme.colors.secondary[4]
16869
- })
16870
- })
16871
- }),
16872
17103
  /*#__PURE__*/ jsxRuntime.jsx(core$1.Tooltip, {
16873
17104
  label: "Delete Cohort",
16874
17105
  withArrow: true,
@@ -19396,6 +19627,7 @@ const MetadataDictionary = ({ schemas })=>{
19396
19627
  }
19397
19628
  return /*#__PURE__*/ jsxRuntime.jsxs(core$1.Tabs, {
19398
19629
  defaultValue: schemas[0].schemaID,
19630
+ variant: schemas[0]?.tabType,
19399
19631
  className: "w-full",
19400
19632
  keepMounted: false,
19401
19633
  children: [
@@ -19735,6 +19967,7 @@ const Discovery = ({ discoveryConfig })=>{
19735
19967
  children: /*#__PURE__*/ jsxRuntime.jsxs(core$1.Tabs, {
19736
19968
  className: "w-full",
19737
19969
  defaultValue: metadataIndex,
19970
+ variant: discoveryConfig.metadataConfig[0]?.tabType,
19738
19971
  onChange: (v)=>{
19739
19972
  setMetadataIndex(v ?? '0');
19740
19973
  },
@@ -20036,6 +20269,9 @@ const LandingPageGetServerSideProps = async ()=>{
20036
20269
  };
20037
20270
  };
20038
20271
 
20272
+ const CohortBuilder = dynamic(()=>Promise.resolve().then(function () { return CohortBuilder$2; }), {
20273
+ ssr: false
20274
+ });
20039
20275
  const ExplorerPage = ({ headerProps, footerProps, explorerConfig, headerMetadata, tabsLayout, sharedFiltersMap })=>{
20040
20276
  if (explorerConfig === undefined) {
20041
20277
  return /*#__PURE__*/ jsxRuntime.jsx(core$1.Center, {
@@ -25933,6 +26169,13 @@ const staticNotebookAPI = async (req, res)=>{
25933
26169
  });
25934
26170
  }
25935
26171
  const rawContent = fs.readFileSync(fullPath, 'utf8');
26172
+ DOMPurify.addHook('afterSanitizeAttributes', function(node) {
26173
+ if (node.tagName === 'a' || node.tagName === 'A') {
26174
+ // Check for anchor tags and target attribute
26175
+ node.setAttribute('target', '_blank');
26176
+ node.setAttribute('rel', 'noopener'); // Prevent window.opener vulnerability
26177
+ }
26178
+ });
25936
26179
  const sanitizedContent = DOMPurify.sanitize(rawContent, {
25937
26180
  ALLOWED_TAGS: [
25938
26181
  'p',
@@ -26000,7 +26243,7 @@ exports.BAD_DATA_MESSAGE = BAD_DATA_MESSAGE;
26000
26243
  exports.Banner = Banner;
26001
26244
  exports.BaseModal = BaseModal;
26002
26245
  exports.Charts = Charts;
26003
- exports.CohortBuilder = CohortBuilder;
26246
+ exports.CohortBuilder = CohortBuilder$1;
26004
26247
  exports.CohortManager = CohortManager$1;
26005
26248
  exports.CollapsableCharts = CollapsableCharts;
26006
26249
  exports.CollapsableSidebar = CollapsableSidebar;
@@ -26127,6 +26370,7 @@ exports.credentialsLogin = credentialsLogin;
26127
26370
  exports.credentialsLogout = credentialsLogout;
26128
26371
  exports.extractObjectKey = extractObjectKey;
26129
26372
  exports.extractRangeValues = extractRangeValues;
26373
+ exports.filterAggregationsDataKeys = filterAggregationsDataKeys;
26130
26374
  exports.focusStyles = focusStyles;
26131
26375
  exports.getAllFieldsFromFilterConfigs = getAllFieldsFromFilterConfigs;
26132
26376
  exports.getCurrentUnixTimestamp = getCurrentUnixTimestamp;