@gen3/frontend 0.12.12 → 0.12.14

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 (90) hide show
  1. package/LICENSE +2 -188
  2. package/dist/dts/components/facets/Panels/DropdownPanel.d.ts.map +1 -1
  3. package/dist/dts/components/facets/Panels/DropdownPanel.js +2 -1
  4. package/dist/dts/components/facets/Panels/DropdownPanel.js.map +1 -1
  5. package/dist/dts/features/CohortBuilder/DownloadsPanel.d.ts.map +1 -1
  6. package/dist/dts/features/CohortBuilder/DownloadsPanel.js +7 -3
  7. package/dist/dts/features/CohortBuilder/DownloadsPanel.js.map +1 -1
  8. package/dist/dts/features/CohortBuilder/downloads/ActionButton.d.ts.map +1 -1
  9. package/dist/dts/features/CohortBuilder/downloads/ActionButton.js +2 -2
  10. package/dist/dts/features/CohortBuilder/downloads/ActionButton.js.map +1 -1
  11. package/dist/dts/features/CohortBuilder/downloads/CohortActionButton.d.ts.map +1 -1
  12. package/dist/dts/features/CohortBuilder/downloads/CohortActionButton.js +11 -2
  13. package/dist/dts/features/CohortBuilder/downloads/CohortActionButton.js.map +1 -1
  14. package/dist/dts/features/CohortBuilder/downloads/CohortActionButton.stories.d.ts +29 -0
  15. package/dist/dts/features/CohortBuilder/downloads/CohortActionButton.stories.d.ts.map +1 -0
  16. package/dist/dts/features/CohortBuilder/downloads/CohortActionButton.stories.js +58 -0
  17. package/dist/dts/features/CohortBuilder/downloads/CohortActionButton.stories.js.map +1 -0
  18. package/dist/dts/features/CohortBuilder/downloads/CohortDropdownActionButton.d.ts.map +1 -1
  19. package/dist/dts/features/CohortBuilder/downloads/CohortDropdownActionButton.js +3 -4
  20. package/dist/dts/features/CohortBuilder/downloads/CohortDropdownActionButton.js.map +1 -1
  21. package/dist/dts/features/CohortBuilder/downloads/downloadActionHook.d.ts +22 -0
  22. package/dist/dts/features/CohortBuilder/downloads/downloadActionHook.d.ts.map +1 -1
  23. package/dist/dts/features/CohortBuilder/downloads/downloadActionHook.js +75 -43
  24. package/dist/dts/features/CohortBuilder/downloads/downloadActionHook.js.map +1 -1
  25. package/dist/dts/features/Discovery/DataLoaders/AggMetaMDSProxy/DataLoader.d.ts +3 -0
  26. package/dist/dts/features/Discovery/DataLoaders/AggMetaMDSProxy/DataLoader.d.ts.map +1 -0
  27. package/dist/dts/features/Discovery/DataLoaders/AggMetaMDSProxy/DataLoader.js +141 -0
  28. package/dist/dts/features/Discovery/DataLoaders/AggMetaMDSProxy/DataLoader.js.map +1 -0
  29. package/dist/dts/features/Discovery/DataLoaders/MDSAllLocal/DataLoader.d.ts.map +1 -1
  30. package/dist/dts/features/Discovery/DataLoaders/MDSAllLocal/DataLoader.js +2 -16
  31. package/dist/dts/features/Discovery/DataLoaders/MDSAllLocal/DataLoader.js.map +1 -1
  32. package/dist/dts/features/Discovery/DataLoaders/registeredDataLoaders.d.ts.map +1 -1
  33. package/dist/dts/features/Discovery/DataLoaders/registeredDataLoaders.js +2 -0
  34. package/dist/dts/features/Discovery/DataLoaders/registeredDataLoaders.js.map +1 -1
  35. package/dist/dts/features/Discovery/DataLoaders/utils.d.ts +2 -1
  36. package/dist/dts/features/Discovery/DataLoaders/utils.d.ts.map +1 -1
  37. package/dist/dts/features/Discovery/DataLoaders/utils.js +15 -0
  38. package/dist/dts/features/Discovery/DataLoaders/utils.js.map +1 -1
  39. package/dist/dts/features/Discovery/DiscoveryIndexPanel.d.ts.map +1 -1
  40. package/dist/dts/features/Discovery/DiscoveryIndexPanel.js +16 -20
  41. package/dist/dts/features/Discovery/DiscoveryIndexPanel.js.map +1 -1
  42. package/dist/dts/features/Discovery/DiscoveryTable.d.ts.map +1 -1
  43. package/dist/dts/features/Discovery/DiscoveryTable.js +7 -0
  44. package/dist/dts/features/Discovery/DiscoveryTable.js.map +1 -1
  45. package/dist/dts/features/Discovery/Search/SearchInputWithSuggestions.d.ts +4 -1
  46. package/dist/dts/features/Discovery/Search/SearchInputWithSuggestions.d.ts.map +1 -1
  47. package/dist/dts/features/Discovery/Search/SearchInputWithSuggestions.js +5 -7
  48. package/dist/dts/features/Discovery/Search/SearchInputWithSuggestions.js.map +1 -1
  49. package/dist/dts/utils/download.d.ts +1 -3
  50. package/dist/dts/utils/download.d.ts.map +1 -1
  51. package/dist/dts/utils/download.js +5 -25
  52. package/dist/dts/utils/download.js.map +1 -1
  53. package/dist/index/cjs/QueryPanel-BAkLLDBt.js +24 -0
  54. package/dist/index/cjs/QueryPanel-BAkLLDBt.js.map +1 -0
  55. package/dist/index/cjs/QueryPanel-DDhoqTsI.js +24 -0
  56. package/dist/index/cjs/QueryPanel-DDhoqTsI.js.map +1 -0
  57. package/dist/index/cjs/index-B8IAMxS_.js +31028 -0
  58. package/dist/index/cjs/index-B8IAMxS_.js.map +1 -0
  59. package/dist/index/cjs/index-DlVPdFGW.js +30937 -0
  60. package/dist/index/cjs/index-DlVPdFGW.js.map +1 -0
  61. package/dist/index/cjs/index.js +1 -1
  62. package/dist/index/esm/QueryPanel-BgzwCqTi.js +22 -0
  63. package/dist/index/esm/QueryPanel-BgzwCqTi.js.map +1 -0
  64. package/dist/index/esm/QueryPanel-DTcnB871.js +22 -0
  65. package/dist/index/esm/QueryPanel-DTcnB871.js.map +1 -0
  66. package/dist/index/esm/index-BAsyl9k4.js +30786 -0
  67. package/dist/index/esm/index-BAsyl9k4.js.map +1 -0
  68. package/dist/index/esm/index-BX9NddG5.js +30695 -0
  69. package/dist/index/esm/index-BX9NddG5.js.map +1 -0
  70. package/dist/index/esm/index.js +1 -1
  71. package/dist/index.d.ts +22 -0
  72. package/dist/pages/cjs/CohortBuilder-BSlSK2_K.js +482 -0
  73. package/dist/pages/cjs/CohortBuilder-BSlSK2_K.js.map +1 -0
  74. package/dist/pages/cjs/CohortBuilder-DiRT1y0l.js +482 -0
  75. package/dist/pages/cjs/CohortBuilder-DiRT1y0l.js.map +1 -0
  76. package/dist/pages/cjs/index-C9CuIyEe.js +22733 -0
  77. package/dist/pages/cjs/index-C9CuIyEe.js.map +1 -0
  78. package/dist/pages/cjs/index-b5LLUTR9.js +22843 -0
  79. package/dist/pages/cjs/index-b5LLUTR9.js.map +1 -0
  80. package/dist/pages/cjs/index.js +1 -1
  81. package/dist/pages/esm/CohortBuilder-CFFqvSnJ.js +479 -0
  82. package/dist/pages/esm/CohortBuilder-CFFqvSnJ.js.map +1 -0
  83. package/dist/pages/esm/CohortBuilder-b92RnZ0v.js +479 -0
  84. package/dist/pages/esm/CohortBuilder-b92RnZ0v.js.map +1 -0
  85. package/dist/pages/esm/index-CF0W_zo1.js +22651 -0
  86. package/dist/pages/esm/index-CF0W_zo1.js.map +1 -0
  87. package/dist/pages/esm/index-EaCstuyL.js +22761 -0
  88. package/dist/pages/esm/index-EaCstuyL.js.map +1 -0
  89. package/dist/pages/esm/index.js +1 -1
  90. package/package.json +3 -3
@@ -1,4 +1,4 @@
1
- export { Y as AISearchPageGetServerSideProps, cB as AccessLevel, bj as AccordionPanel, bI as ActionBar, A as ActionButton, x as AdminAuthZPageGetServerSideProps, bH as AiSearch, X as AiSearchPage, c9 as AnalysisCenter, ca as AnalysisCenterWithSections, a6 as AnalysisEditorPage, a7 as AnalysisEditorPageGetServerSideProps, F as AnalysisPage, H as AnalysisPageGetServerSideProps, w as AuthzPage, bh as BAD_DATA_MESSAGE, bv as Banner, am as BaseModal, as as CardContainer, ax as Charts, b$ as CohortActionButton, bR as CohortBuilder, c1 as CohortDropdownActionButton, bS as CohortManager, bT as CohortManagerAndExpression, ay as CollapsableCharts, a as CollapsableSidebar, j as ColorThemePage, k as ColorThemePageGetServerSideProps, C as ContentSource, e as CountsValue, ap as CreateCredentialsAPIKeyModal, Z as CrosswalkPage, _ as CrosswalkPageGetServerSideProps, I as Custom403Page, K as Custom404Page, bi as DAYS_IN_YEAR, bg as DEFAULT_MAXIMUM, bf as DEFAULT_MINIMUM, be as DEFAULT_VISIBLE_ITEMS, l as DataDictionaryPage, a1 as DataLibraryPage, a2 as DataLibraryPageGetServerSideProps, af as DefaultAuthorizedRoutesConfig, m as DictionaryPageGetServerSideProps, bJ as DictionaryWithContext, bD as DiscoveryCellRendererFactory, bF as DiscoveryConfigProvider, by as DiscoveryIndexPanel, f as DiscoveryPage, g as DiscoveryPageGetServerSideProps, bE as DiscoveryRowRendererFactory, D as DownloadButton, c3 as DownloadsPanel, b as DropdownButton, bk as DropdownPanel, c as DropdownWithIcon, aw as EmptyTableMessage, aJ as EnumFacet, az as EnumFacetChart, E as ErrorCard, aK as ExactValueFacet, n as ExplorerPage, o as ExplorerPageGetServerSideProps, p as ExplorerPageGetServerSidePropsForConfigId, c2 as ExplorerTable, bU as ExplorerTableCellRendererFactory, bV as ExplorerTableDetailsPanelFactory, aO as FacetControlsHeader, aQ as FacetExpander, aI as FacetSelector, aP as FacetSortPanel, aN as FacetTabs, aR as FiltersPanel, an as FirstTimeModal, bo as Footer, G as Gen3Button, d as Gen3ButtonReverse, bp as Gen3Link, ar as Gen3ModalsProvider, u as Gen3Provider, c7 as GqlQueryEditor, bq as Header, br as HoverLink, bx as IconButton, J as JSONObjectDownloadButton, L as LandingPage, i as LandingPageGetServerSideProps, aj as LoginButton, r as LoginPage, s as LoginPageGetServerSideProps, al as LoginPanel, ak as LoginProvidersPanel, au as MessageCard, av as MessagePage, bK as MetadataDictionary, cz as MinutesToMilliseconds, aM as MultiSelectValueFacet, bu as NavPageLayout, bs as NavigationBar, bt as NavigationButton, aq as NoAccessModal, a3 as NotebookLitePage, a4 as NotebookLitePageGetStaticProps, cc as Profile, P as ProfilePage, q as ProfilePageGetServerSideProps, ah as ProfileProvider, bm as ProtectedContent, bn as ProtectedContentUI, bY as QueryExpression, c4 as QueryExpressionContext, bZ as QueryExpressionSection, Q as QueryPage, h as QueryPageGetServerSideProps, aL as RangeFacet, aA as ReactECharts, c6 as Repository, aa as RepositoryPage, ab as RepositoryPageGetServerSideProps, ai as ResourcesFilters, ck as SPECIAL_CASE_FIELDS, S as SegmentedControl, ao as SessionExpiredModal, bO as SinglePageStudyDetailsPanel, cb as StaticNotebookIFrame, bP as StudyDetailsPanel, bM as StudyGroup, bN as StudyGroupPanel, bL as StudyProvider, $ as SubmissionPage, a0 as SubmissionPageGetServerSideProps, b_ as TabbedCohortBuilder, a8 as TabbedCohortBuilderPage, a9 as TabbedCohortBuilderPageGetServerSideProps, bl as TabbedPanel, c5 as TableXPositionContext, bz as TagCloud, t as TailwindConfig, T as TopBar, U as UploadJSONButton, ag as User, at as WarningCard, c8 as Workspace, z as WorkspaceNoAccessPage, B as WorkspaceNoAccessPageServerSideProps, W as WorkspacePage, y as WorkspacePageGetServerSideProps, cA as accessibleFieldName, b6 as addIntersectionToIncludes, b4 as addUnion, ae as analysisApiCohortDiscovery, aB as capitalize, a_ as classifyFacets, b9 as compareKeysAscending, ba as compareKeysDescending, aG as computeRowSpan, ct as convertMinutesToMilliseconds, cf as convertPathsToTree, cu as convertSecondsToMilliseconds, b3 as convertToStringArray, V as createMantineTheme, O as credentialsLogin, R as credentialsLogout, cs as extractObjectKey, b2 as extractRangeValues, aH as filterAggregationsDataKeys, ci as focusStyles, aU as getAllFieldsFromFilterConfigs, aV as getByPath, cd as getCurrentUnixTimestamp, cv as getFormattedTimestamp, cy as getHighResolutionTimestamp, v as getNavPageLayoutPropsFromConfig, cr as getParamsValueAsString, bQ as getTagInfo, cq as hasOwnProperty, cn as isArrayOfString, aT as isEnumFacetResponse, bw as isHeaderMetadata, cp as isPropertyKey, co as isTextTransform, cw as isTimeGreaterThan, cC as itemsInCart, b8 as mapFacetSortToSortType, cx as measureExecutionTime, aW as processBucketData, aY as processDefinedRangeData, aE as processLabel, aX as processRangeData, aF as processRangeKeyLabel, bX as registerCohortBuilderDefaultPreviewRenderers, ac as registerCohortDiscoveryApp, ad as registerCohortSimilarityApp, bC as registerDefaultDiscoveryDataLoaders, bA as registerDiscoveryDefaultCellRenderers, bB as registerDiscoveryDefaultStudyPreviewRenderers, bW as registerExplorerDefaultCellRenderers, a5 as registerMetadataSchemaApp, b7 as removeIntersectionFromEnum, aD as removeKey, b5 as removeUnion, cg as resourcePathFromProjectID, N as sessionLogout, M as sessionToken, cj as stripTrailingSlash, cm as toCountsString, cl as toDisplayName, aC as truncateString, ce as unixTimeToString, aZ as updateFacetEnum, bb as useClearFilters, bG as useDiscoveryContext, bc as useExtractEnumFilterValues, bd as useExtractRangeFilterValues, aS as useFieldNameToTitle, b1 as useGetFacetFilters, c0 as useGuppyActionButton, a$ as useUpdateFilters, b0 as useUpdateFiltersFlat, ch as userHasMethodForServiceOnResource, cD as validateObjectHasRequiredFields } from './index-CgwayH-W.js';
1
+ export { Y as AISearchPageGetServerSideProps, cB as AccessLevel, bj as AccordionPanel, bI as ActionBar, A as ActionButton, x as AdminAuthZPageGetServerSideProps, bH as AiSearch, X as AiSearchPage, c9 as AnalysisCenter, ca as AnalysisCenterWithSections, a6 as AnalysisEditorPage, a7 as AnalysisEditorPageGetServerSideProps, F as AnalysisPage, H as AnalysisPageGetServerSideProps, w as AuthzPage, bh as BAD_DATA_MESSAGE, bv as Banner, am as BaseModal, as as CardContainer, ax as Charts, b$ as CohortActionButton, bR as CohortBuilder, c1 as CohortDropdownActionButton, bS as CohortManager, bT as CohortManagerAndExpression, ay as CollapsableCharts, a as CollapsableSidebar, j as ColorThemePage, k as ColorThemePageGetServerSideProps, C as ContentSource, e as CountsValue, ap as CreateCredentialsAPIKeyModal, Z as CrosswalkPage, _ as CrosswalkPageGetServerSideProps, I as Custom403Page, K as Custom404Page, bi as DAYS_IN_YEAR, bg as DEFAULT_MAXIMUM, bf as DEFAULT_MINIMUM, be as DEFAULT_VISIBLE_ITEMS, l as DataDictionaryPage, a1 as DataLibraryPage, a2 as DataLibraryPageGetServerSideProps, af as DefaultAuthorizedRoutesConfig, m as DictionaryPageGetServerSideProps, bJ as DictionaryWithContext, bD as DiscoveryCellRendererFactory, bF as DiscoveryConfigProvider, by as DiscoveryIndexPanel, f as DiscoveryPage, g as DiscoveryPageGetServerSideProps, bE as DiscoveryRowRendererFactory, D as DownloadButton, c3 as DownloadsPanel, b as DropdownButton, bk as DropdownPanel, c as DropdownWithIcon, aw as EmptyTableMessage, aJ as EnumFacet, az as EnumFacetChart, E as ErrorCard, aK as ExactValueFacet, n as ExplorerPage, o as ExplorerPageGetServerSideProps, p as ExplorerPageGetServerSidePropsForConfigId, c2 as ExplorerTable, bU as ExplorerTableCellRendererFactory, bV as ExplorerTableDetailsPanelFactory, aO as FacetControlsHeader, aQ as FacetExpander, aI as FacetSelector, aP as FacetSortPanel, aN as FacetTabs, aR as FiltersPanel, an as FirstTimeModal, bo as Footer, G as Gen3Button, d as Gen3ButtonReverse, bp as Gen3Link, ar as Gen3ModalsProvider, u as Gen3Provider, c7 as GqlQueryEditor, bq as Header, br as HoverLink, bx as IconButton, J as JSONObjectDownloadButton, L as LandingPage, i as LandingPageGetServerSideProps, aj as LoginButton, r as LoginPage, s as LoginPageGetServerSideProps, al as LoginPanel, ak as LoginProvidersPanel, au as MessageCard, av as MessagePage, bK as MetadataDictionary, cz as MinutesToMilliseconds, aM as MultiSelectValueFacet, bu as NavPageLayout, bs as NavigationBar, bt as NavigationButton, aq as NoAccessModal, a3 as NotebookLitePage, a4 as NotebookLitePageGetStaticProps, cc as Profile, P as ProfilePage, q as ProfilePageGetServerSideProps, ah as ProfileProvider, bm as ProtectedContent, bn as ProtectedContentUI, bY as QueryExpression, c4 as QueryExpressionContext, bZ as QueryExpressionSection, Q as QueryPage, h as QueryPageGetServerSideProps, aL as RangeFacet, aA as ReactECharts, c6 as Repository, aa as RepositoryPage, ab as RepositoryPageGetServerSideProps, ai as ResourcesFilters, ck as SPECIAL_CASE_FIELDS, S as SegmentedControl, ao as SessionExpiredModal, bO as SinglePageStudyDetailsPanel, cb as StaticNotebookIFrame, bP as StudyDetailsPanel, bM as StudyGroup, bN as StudyGroupPanel, bL as StudyProvider, $ as SubmissionPage, a0 as SubmissionPageGetServerSideProps, b_ as TabbedCohortBuilder, a8 as TabbedCohortBuilderPage, a9 as TabbedCohortBuilderPageGetServerSideProps, bl as TabbedPanel, c5 as TableXPositionContext, bz as TagCloud, t as TailwindConfig, T as TopBar, U as UploadJSONButton, ag as User, at as WarningCard, c8 as Workspace, z as WorkspaceNoAccessPage, B as WorkspaceNoAccessPageServerSideProps, W as WorkspacePage, y as WorkspacePageGetServerSideProps, cA as accessibleFieldName, b6 as addIntersectionToIncludes, b4 as addUnion, ae as analysisApiCohortDiscovery, aB as capitalize, a_ as classifyFacets, b9 as compareKeysAscending, ba as compareKeysDescending, aG as computeRowSpan, ct as convertMinutesToMilliseconds, cf as convertPathsToTree, cu as convertSecondsToMilliseconds, b3 as convertToStringArray, V as createMantineTheme, O as credentialsLogin, R as credentialsLogout, cs as extractObjectKey, b2 as extractRangeValues, aH as filterAggregationsDataKeys, ci as focusStyles, aU as getAllFieldsFromFilterConfigs, aV as getByPath, cd as getCurrentUnixTimestamp, cv as getFormattedTimestamp, cy as getHighResolutionTimestamp, v as getNavPageLayoutPropsFromConfig, cr as getParamsValueAsString, bQ as getTagInfo, cq as hasOwnProperty, cn as isArrayOfString, aT as isEnumFacetResponse, bw as isHeaderMetadata, cp as isPropertyKey, co as isTextTransform, cw as isTimeGreaterThan, cC as itemsInCart, b8 as mapFacetSortToSortType, cx as measureExecutionTime, aW as processBucketData, aY as processDefinedRangeData, aE as processLabel, aX as processRangeData, aF as processRangeKeyLabel, bX as registerCohortBuilderDefaultPreviewRenderers, ac as registerCohortDiscoveryApp, ad as registerCohortSimilarityApp, bC as registerDefaultDiscoveryDataLoaders, bA as registerDiscoveryDefaultCellRenderers, bB as registerDiscoveryDefaultStudyPreviewRenderers, bW as registerExplorerDefaultCellRenderers, a5 as registerMetadataSchemaApp, b7 as removeIntersectionFromEnum, aD as removeKey, b5 as removeUnion, cg as resourcePathFromProjectID, N as sessionLogout, M as sessionToken, cj as stripTrailingSlash, cm as toCountsString, cl as toDisplayName, aC as truncateString, ce as unixTimeToString, aZ as updateFacetEnum, bb as useClearFilters, bG as useDiscoveryContext, bc as useExtractEnumFilterValues, bd as useExtractRangeFilterValues, aS as useFieldNameToTitle, b1 as useGetFacetFilters, c0 as useGuppyActionButton, a$ as useUpdateFilters, b0 as useUpdateFiltersFlat, ch as userHasMethodForServiceOnResource, cD as validateObjectHasRequiredFields } from './index-BAsyl9k4.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react';
4
4
  import '@mantine/core';
package/dist/index.d.ts CHANGED
@@ -2030,8 +2030,30 @@ interface GuppyDownloadActionHookProps extends Pick<GuppyActionButtonProps, 'Mod
2030
2030
  setIsActive?: (active: boolean) => void;
2031
2031
  onCompleted?: (args?: unknown) => void;
2032
2032
  }
2033
+ /**
2034
+ * useGuppyActionButton is a custom hook that provides functionality for handling
2035
+ * asynchronous actions with error handling, notifications, and a loading state.
2036
+ *
2037
+ * @param {Object} config - Configuration options for the hook.
2038
+ * @param {React.Component} [config.Modal403=Modals.NoAccessModal] - The modal to display for 403 error scenarios.
2039
+ * @param {React.Component} [config.Modal400=Modals.GeneralErrorModal] - The modal to display for general 400 error scenarios.
2040
+ * @param {Function} [config.done] - Callback function to execute when an action is completed or canceled.
2041
+ * @param {string} [config.customErrorMessage] - Custom error message to override the default error message.
2042
+ * @param {boolean} [config.hideNotification=false] - Whether to hide notification during action execution.
2043
+ * @param {Function} config.actionFunction - The asynchronous function to execute.
2044
+ * @param {any} config.actionArgs - Arguments to be passed to the `actionFunction`.
2045
+ * @param {Function} [config.setIsActive] - Callback function to track active state changes.
2046
+ * @param {Function} [config.onCompleted] - Callback function to execute after the action completes successfully.
2047
+ *
2048
+ * @returns {Object} - Hook utilities.
2049
+ * @returns {Function} handleClick - Function that triggers the primary action when invoked.
2050
+ * @returns {Function} cancel - Function to cancel the in-progress action.
2051
+ * @returns {React.ReactNode} icon - The icon rendered based on the active state (loading or ready).
2052
+ * @returns {boolean} active - The current active/busy state of the hook.
2053
+ */
2033
2054
  declare const useGuppyActionButton: ({ Modal403, Modal400, done, customErrorMessage, hideNotification, actionFunction, actionArgs, setIsActive, onCompleted, }: GuppyDownloadActionHookProps) => {
2034
2055
  handleClick: () => Promise<void>;
2056
+ cancel: () => void;
2035
2057
  icon: react_jsx_runtime.JSX.Element;
2036
2058
  active: boolean;
2037
2059
  };
@@ -0,0 +1,482 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var useDeepCompare = require('use-deep-compare');
6
+ var core$1 = require('@mantine/core');
7
+ var lodash = require('lodash');
8
+ var core = require('@gen3/core');
9
+ var index = require('./index-C9CuIyEe.js');
10
+ require('echarts');
11
+ var hooks = require('@mantine/hooks');
12
+ require('victory');
13
+ require('react-icons/bs');
14
+ require('react-icons/io');
15
+ require('@mantine/form');
16
+ require('react-icons/md');
17
+ require('react-icons/ri');
18
+ require('react-icons/fa');
19
+ require('react-icons/pi');
20
+ require('@iconify-icon/react');
21
+ require('@mantine/modals');
22
+ require('tailwind-merge');
23
+ require('next/head');
24
+ require('next/link');
25
+ require('next/image');
26
+ require('next/router');
27
+ require('next/navigation');
28
+ require('cookies-next');
29
+ require('swr');
30
+ require('jose');
31
+ require('cookie');
32
+ require('@gen3/core/server');
33
+ require('@mantine/notifications');
34
+ require('react-markdown');
35
+ require('react-icons/ai');
36
+ require('remark-gfm');
37
+ require('fs');
38
+ require('path');
39
+ require('mantine-react-table');
40
+ require('react-icons/ti');
41
+ require('react-icons/fi');
42
+ require('react-minisearch');
43
+ require('minisearch');
44
+ require('file-saver');
45
+ require('tailwind-styled-components');
46
+ require('jsonpath-plus');
47
+ require('react-dom');
48
+ require('lodash/uniq');
49
+ require('lodash/sum');
50
+ require('react-icons/lu');
51
+ require('next/dynamic');
52
+ require('react-cookie');
53
+ require('default-composer');
54
+ require('filesize');
55
+ require('@dnd-kit/core');
56
+ require('@dnd-kit/sortable');
57
+ require('@dnd-kit/utilities');
58
+ require('@dnd-kit/modifiers');
59
+ require('universal-cookie');
60
+
61
+ const EmptyData = {};
62
+ /**
63
+ * CohortPanel is a React component that provides an interactive interface for cohort exploration and filtering.
64
+ * It integrates with data services and facilitates visualization, filtering, and analysis tasks.
65
+ *
66
+ * @param {Object} props The properties required to configure the CohortPanel component.
67
+ * @param {Object} props.guppyConfig Configuration object for Guppy, including field mappings and data type information.
68
+ * @param {Object} props.filters Configuration for filter tabs, including filter fields and layout.
69
+ * @param {Object} [props.charts={}] Optional set of chart configuration objects for rendering summaries.
70
+ * @param {Object} [props.chartsSection] Optional configuration for an additional section of charts.
71
+ * @param {Object} props.table Reference to the table configuration or component for displaying data.
72
+ * @param {string} props.tabTitle Title for the filter tab section.
73
+ * @param {Object[]|undefined} props.dropdowns Dropdown menu configuration, allowing for additional filter options or actions.
74
+ * @param {Object[]|undefined} props.buttons List of button configurations for actions such as downloads.
75
+ * @param {boolean} props.loginForDownload Determines whether login is required to enable download functionality.
76
+ * @param {boolean} [props.showAccessLevel=false] Indicates if the user access level should be displayed on the panel.
77
+ *
78
+ * @returns {JSX.Element} Returns a JSX element rendering the CohortPanel. This includes filter options,
79
+ * summary charts, cohort manager, and data display components.
80
+ */ const CohortPanel = ({ guppyConfig, filters, charts = {}, chartsSection = undefined, table, tabTitle, dropdowns, buttons, loginForDownload, showAccessLevel = false })=>{
81
+ const isSm = hooks.useMediaQuery('(min-width: 639px)');
82
+ const isMd = hooks.useMediaQuery('(min-width: 1373px)');
83
+ const isXl = hooks.useMediaQuery('(min-width: 1600px)');
84
+ const [accessLevel, setAccessLevel] = React.useState(core.Accessibility.ALL);
85
+ const sharedFiltersMap = core.useCoreSelector((state)=>core.selectSharedFilters(state));
86
+ const defaultDropdowns = React.useMemo(()=>dropdowns ?? {}, [
87
+ dropdowns
88
+ ]);
89
+ const defaultButtons = React.useMemo(()=>buttons ?? [], [
90
+ buttons
91
+ ]);
92
+ const numCols = React.useMemo(()=>{
93
+ if (isSm) return 1;
94
+ if (isMd) return 2;
95
+ if (isXl) return 4;
96
+ return 3;
97
+ }, [
98
+ isSm,
99
+ isMd,
100
+ isXl
101
+ ]);
102
+ const index$1 = guppyConfig.dataType;
103
+ const indexPrefix = guppyConfig?.indexPrefix ?? '';
104
+ const fields = React.useMemo(()=>index.getAllFieldsFromFilterConfigs(filters?.tabs ?? []), [
105
+ filters?.tabs
106
+ ]);
107
+ const coreDispatch = core.useCoreDispatch();
108
+ const [facetDefinitions, setFacetDefinitions] = React.useState({});
109
+ const [summaryCharts, setSummaryCharts] = React.useState({});
110
+ const cohortFilters = core.useCoreSelector((state)=>core.selectIndexFilters(state, index$1));
111
+ const cohortId = core.useCoreSelector((state)=>core.selectCurrentCohortId(state));
112
+ const allFiltersCollapsed = core.useCoreSelector((state)=>core.selectAllCohortFiltersCollapsed(state, index$1));
113
+ const toggleAllFiltersExpanded = (expand)=>{
114
+ coreDispatch(core.toggleCohortBuilderAllFilters({
115
+ expand,
116
+ index: index$1
117
+ }));
118
+ };
119
+ const clearAllFilters = React.useCallback(()=>{
120
+ coreDispatch(core.clearCohortFilters({
121
+ index: index$1
122
+ }));
123
+ }, [
124
+ coreDispatch,
125
+ index$1
126
+ ]);
127
+ const { data, isSuccess, isFetching: isAggsQueryFetching, isError: isAggsQueryError } = core.useGetAggsQuery({
128
+ type: index$1,
129
+ fields: fields,
130
+ filters: cohortFilters,
131
+ accessibility: accessLevel,
132
+ queryId: cohortId,
133
+ indexPrefix: indexPrefix
134
+ });
135
+ const chartKeys = useDeepCompare.useDeepCompareMemo(()=>[
136
+ ...Object.keys(chartsSection?.charts ?? {}),
137
+ ...Object.keys(charts)
138
+ ], [
139
+ chartsSection?.charts,
140
+ charts
141
+ ]);
142
+ const { data: chartData, isSuccess: isChartSuccess, isFetching: isChartFetching, isError: isChartError } = core.useGetAggsQuery({
143
+ type: index$1,
144
+ fields: chartKeys,
145
+ filters: cohortFilters,
146
+ accessibility: accessLevel,
147
+ filterSelf: true,
148
+ queryId: cohortId,
149
+ indexPrefix: indexPrefix
150
+ }, {
151
+ skip: chartKeys.length === 0
152
+ });
153
+ const cleanChartData = useDeepCompare.useDeepCompareMemo(()=>{
154
+ if (isChartSuccess && chartData) {
155
+ const cleanedData = {};
156
+ const totalCount = chartData._totalCount[0]?.count;
157
+ Object.keys(summaryCharts).forEach((key)=>{
158
+ if (!(key in chartData)) {
159
+ return;
160
+ } // handle missing key in data
161
+ // remove empty keys
162
+ cleanedData[key] = chartData[key].filter((x)=>typeof x.key !== 'string' ? true : x.key !== '');
163
+ const facetDef = facetDefinitions?.[key];
164
+ if (facetDef?.excludeValues) {
165
+ cleanedData[key] = cleanedData[key].filter((x)=>typeof x.key !== 'string' ? true : facetDef?.excludeValues?.includes(String(x.key)) === false);
166
+ }
167
+ if (cleanedData[key].length === 0 && totalCount) {
168
+ // if no keys adds back no data
169
+ cleanedData[key] = [
170
+ {
171
+ key: 'no data',
172
+ count: totalCount
173
+ }
174
+ ];
175
+ }
176
+ });
177
+ return cleanedData;
178
+ }
179
+ return chartData;
180
+ }, [
181
+ chartData,
182
+ isChartSuccess,
183
+ summaryCharts
184
+ ]);
185
+ const getEnumFacetData = useDeepCompare.useDeepCompareCallback((field)=>{
186
+ let filters = undefined;
187
+ let combineMode = 'or';
188
+ if (field in cohortFilters.root) {
189
+ if (core.isIntersection(cohortFilters.root[field])) {
190
+ const intersectionFilters = index.removeIntersectionFromEnum(cohortFilters.root[field]);
191
+ if (intersectionFilters) {
192
+ filters = core.extractEnumFilterValue(intersectionFilters);
193
+ combineMode = 'and';
194
+ }
195
+ } else {
196
+ filters = core.extractEnumFilterValue(cohortFilters.root[field]);
197
+ }
198
+ }
199
+ return {
200
+ data: index.processBucketData(data?.[field]),
201
+ enumFilters: filters,
202
+ combineMode: combineMode,
203
+ isSuccess: isSuccess
204
+ };
205
+ }, [
206
+ cohortFilters.root,
207
+ data,
208
+ isSuccess
209
+ ]);
210
+ const getRangeFacetData = useDeepCompare.useDeepCompareCallback((field)=>{
211
+ return {
212
+ data: index.processRangeData(data?.[field]),
213
+ filters: index.extractRangeValues(cohortFilters.root[field]),
214
+ isSuccess: isSuccess
215
+ };
216
+ }, [
217
+ data,
218
+ cohortFilters.root,
219
+ isSuccess
220
+ ]);
221
+ // Set up the hooks for the facet components to use based on the required index
222
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
223
+ // @ts-ignore
224
+ const facetDataHooks = useDeepCompare.useDeepCompareMemo(()=>{
225
+ return {
226
+ // TODO: see if there a better way to do this
227
+ enum: {
228
+ useGetFacetData: getEnumFacetData,
229
+ useUpdateFacetFilters: lodash.partial(index.useUpdateFilters, index$1),
230
+ useGetFacetFilters: lodash.partial(index.useGetFacetFilters, index$1),
231
+ useClearFilter: lodash.partial(index.useClearFilters, index$1),
232
+ useFilterExpanded: lodash.partial(index.useFilterExpandedState, index$1),
233
+ useToggleExpandFilter: lodash.partial(index.useToggleExpandFilter, index$1),
234
+ useGetCombineMode: lodash.partial(index.useCohortFilterCombineState, index$1),
235
+ useSetCombineMode: lodash.partial(index.useSetCohortFilterCombineState, index$1),
236
+ useFieldNameToTitle: index.useFieldNameToTitle,
237
+ useTotalCounts: undefined
238
+ },
239
+ exact: {
240
+ useGetFacetData: getEnumFacetData,
241
+ useUpdateFacetFilters: lodash.partial(index.useUpdateFilters, index$1),
242
+ useGetFacetFilters: lodash.partial(index.useGetFacetFilters, index$1),
243
+ useClearFilter: lodash.partial(index.useClearFilters, index$1),
244
+ useFilterExpanded: lodash.partial(index.useFilterExpandedState, index$1),
245
+ useToggleExpandFilter: lodash.partial(index.useToggleExpandFilter, index$1),
246
+ useFieldNameToTitle: index.useFieldNameToTitle,
247
+ useTotalCounts: undefined
248
+ },
249
+ multiselect: {
250
+ useGetFacetData: getEnumFacetData,
251
+ useUpdateFacetFilters: lodash.partial(index.useUpdateFilters, index$1),
252
+ useGetFacetFilters: lodash.partial(index.useGetFacetFilters, index$1),
253
+ useClearFilter: lodash.partial(index.useClearFilters, index$1),
254
+ useFilterExpanded: lodash.partial(index.useFilterExpandedState, index$1),
255
+ useToggleExpandFilter: lodash.partial(index.useToggleExpandFilter, index$1),
256
+ useFieldNameToTitle: index.useFieldNameToTitle,
257
+ useTotalCounts: undefined
258
+ },
259
+ range: {
260
+ useGetFacetData: getRangeFacetData,
261
+ useUpdateFacetFilters: lodash.partial(index.useUpdateFilters, index$1),
262
+ useGetFacetFilters: lodash.partial(index.useGetFacetFilters, index$1),
263
+ useClearFilter: lodash.partial(index.useClearFilters, index$1),
264
+ useFilterExpanded: lodash.partial(index.useFilterExpandedState, index$1),
265
+ useToggleExpandFilter: lodash.partial(index.useToggleExpandFilter, index$1),
266
+ useFieldNameToTitle: index.useFieldNameToTitle,
267
+ useTotalCounts: undefined
268
+ }
269
+ };
270
+ }, [
271
+ getEnumFacetData,
272
+ getRangeFacetData,
273
+ index$1
274
+ ]);
275
+ // Set the facet definitions based on the data only the first time the data is loaded
276
+ useDeepCompare.useDeepCompareEffect(()=>{
277
+ if (isSuccess && Object.keys(facetDefinitions).length === 0) {
278
+ const configFacetDefs = filters?.tabs.reduce((acc, tab)=>{
279
+ return {
280
+ ...tab.fieldsConfig,
281
+ ...acc
282
+ };
283
+ }, {});
284
+ const facetDefs = index.classifyFacets(data, index$1, guppyConfig?.fieldMapping ?? [], configFacetDefs ?? {}, sharedFiltersMap);
285
+ setFacetDefinitions(facetDefs);
286
+ // setup summary charts since nested fields can be listed by the split field name
287
+ const chartDefinitions = chartsSection?.charts ?? charts;
288
+ const summaryCharts = Object.keys(chartDefinitions).reduce((acc, field)=>{
289
+ let chartField = field;
290
+ if (facetDefs?.[field] === undefined) {
291
+ const res = Object.values(facetDefs).filter((def)=>{
292
+ return def.dataField === field;
293
+ });
294
+ if (res.length > 0) {
295
+ chartField = res[0].field;
296
+ }
297
+ }
298
+ return {
299
+ ...acc,
300
+ [chartField]: chartDefinitions[field]
301
+ };
302
+ }, {});
303
+ setSummaryCharts(summaryCharts);
304
+ }
305
+ }, [
306
+ isSuccess,
307
+ data,
308
+ facetDefinitions,
309
+ index$1,
310
+ guppyConfig.fieldMapping,
311
+ charts,
312
+ chartsSection
313
+ ]);
314
+ const { data: counts, isFetching: isCountsFetching, isError: isCountsError } = core.useGetCountsQuery({
315
+ type: index$1,
316
+ filters: cohortFilters,
317
+ accessibility: accessLevel,
318
+ queryId: cohortId
319
+ });
320
+ if (isCountsError || isAggsQueryError) {
321
+ return /*#__PURE__*/ jsxRuntime.jsx(index.ErrorCard, {
322
+ message: "Unable to fetch data from server"
323
+ }); // TODO: replace with configurable message
324
+ }
325
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
326
+ className: "flex flex-col mt-3 relative px-4 bg-base-lightest w-full",
327
+ children: [
328
+ /*#__PURE__*/ jsxRuntime.jsx(index.QueryExpression, {
329
+ index: index$1
330
+ }),
331
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
332
+ className: "flex w-full",
333
+ children: [
334
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
335
+ id: "cohort-builder-filters",
336
+ className: "flex-shrink-0 md:w-1/4 lg:w-1/5",
337
+ children: filters?.tabs && /*#__PURE__*/ jsxRuntime.jsx(index.DropdownPanel, {
338
+ filters: filters,
339
+ tabTitle: tabTitle,
340
+ facetDefinitions: facetDefinitions,
341
+ facetDataHooks: facetDataHooks,
342
+ onAccessChange: setAccessLevel,
343
+ accessLevel: accessLevel,
344
+ showAccessLevel: showAccessLevel,
345
+ allFiltersCollapsed: allFiltersCollapsed,
346
+ toggleAllFiltersExpanded: toggleAllFiltersExpanded,
347
+ clearAllFilters: clearAllFilters
348
+ })
349
+ }),
350
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
351
+ id: "cohort-builder-content",
352
+ className: "flex flex-col md:w-3/4 lg:w-4/5 pl-4",
353
+ children: [
354
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
355
+ className: "flex justify-between mb-2 ml-2",
356
+ children: [
357
+ /*#__PURE__*/ jsxRuntime.jsx(index.DownloadsPanel, {
358
+ dropdowns: defaultDropdowns,
359
+ buttons: defaultButtons,
360
+ loginForDownload: loginForDownload,
361
+ index: index$1,
362
+ totalCount: counts ?? 0,
363
+ fields: table?.fields ?? [],
364
+ filter: cohortFilters
365
+ }),
366
+ /*#__PURE__*/ jsxRuntime.jsx(index.CountsValue, {
367
+ label: guppyConfig?.nodeCountTitle || index.toDisplayName(index$1),
368
+ configuration: guppyConfig?.nodeCountConfiguration,
369
+ counts: counts,
370
+ isFetching: isCountsFetching,
371
+ isError: isCountsError
372
+ })
373
+ ]
374
+ }),
375
+ chartsSection?.enabled ? /*#__PURE__*/ jsxRuntime.jsx(index.CollapsableCharts, {
376
+ config: {
377
+ ...chartsSection,
378
+ charts: summaryCharts
379
+ },
380
+ data: cleanChartData ?? EmptyData,
381
+ isSuccess: isChartSuccess,
382
+ isFetching: isChartFetching,
383
+ isError: isChartError
384
+ }) : /*#__PURE__*/ jsxRuntime.jsx(index.Charts, {
385
+ charts: summaryCharts,
386
+ data: cleanChartData ?? EmptyData,
387
+ counts: counts,
388
+ isSuccess: isChartSuccess,
389
+ isError: isChartError,
390
+ numCols: numCols
391
+ }),
392
+ table?.enabled && /*#__PURE__*/ jsxRuntime.jsx("div", {
393
+ className: "mt-2 flex flex-col",
394
+ children: /*#__PURE__*/ jsxRuntime.jsx(index.ExplorerTable, {
395
+ index: index$1,
396
+ tableConfig: table,
397
+ accessibility: accessLevel
398
+ })
399
+ })
400
+ ]
401
+ })
402
+ ]
403
+ })
404
+ ]
405
+ });
406
+ };
407
+
408
+ const TabsLayoutToComponentProp = (tabsLayout)=>{
409
+ if (!tabsLayout) {
410
+ return 'flex-start';
411
+ }
412
+ switch(tabsLayout){
413
+ case 'left':
414
+ {
415
+ return 'flex-start';
416
+ }
417
+ case 'right':
418
+ {
419
+ return 'flex-end';
420
+ }
421
+ case 'center':
422
+ {
423
+ return 'center';
424
+ }
425
+ default:
426
+ {
427
+ return 'flex-start';
428
+ }
429
+ }
430
+ };
431
+
432
+ const useGetCurrentCohort = ()=>{
433
+ return core.useCoreSelector((state)=>core.selectCurrentCohortId(state));
434
+ };
435
+ const CohortBuilder = ({ explorerConfig, sharedFiltersMap = null, tabsLayout = 'left', enableCohortManager = true })=>{
436
+ const dispatch = core.useCoreDispatch();
437
+ dispatch(core.setSharedFilters(sharedFiltersMap ?? {}));
438
+ const configuration = useDeepCompare.useDeepCompareMemo(()=>explorerConfig, [
439
+ explorerConfig
440
+ ]);
441
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
442
+ className: "flex flex-col w-full mt-2",
443
+ children: [
444
+ enableCohortManager ? /*#__PURE__*/ jsxRuntime.jsx(index.CohortManager, {}) : null,
445
+ /*#__PURE__*/ jsxRuntime.jsxs(core$1.Tabs, {
446
+ color: "primary.5",
447
+ variant: explorerConfig[0]?.tabType,
448
+ keepMounted: true,
449
+ defaultValue: explorerConfig[0].tabTitle,
450
+ children: [
451
+ /*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.List, {
452
+ className: "w-full",
453
+ justify: TabsLayoutToComponentProp(tabsLayout),
454
+ children: configuration.map((panelConfig)=>/*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Tab, {
455
+ value: panelConfig.tabTitle,
456
+ children: panelConfig.tabTitle
457
+ }, `${panelConfig.tabTitle}-tabList`))
458
+ }),
459
+ configuration.map((panelConfig)=>/*#__PURE__*/ jsxRuntime.jsx(core$1.Tabs.Panel, {
460
+ value: panelConfig.tabTitle,
461
+ children: /*#__PURE__*/ jsxRuntime.jsx(CohortPanel, {
462
+ guppyConfig: panelConfig.guppyConfig,
463
+ chartsSection: panelConfig?.chartsSection,
464
+ charts: panelConfig?.charts,
465
+ filters: panelConfig.filters,
466
+ tabTitle: panelConfig.tabTitle,
467
+ table: panelConfig.table,
468
+ dropdowns: panelConfig.dropdowns,
469
+ buttons: panelConfig.buttons,
470
+ loginForDownload: panelConfig.loginForDownload,
471
+ sharedFiltersMap: panelConfig.sharedFiltersMap
472
+ }, `${panelConfig.tabTitle}-CohortPanel`)
473
+ }, `${panelConfig.tabTitle}-tabPanel`))
474
+ ]
475
+ })
476
+ ]
477
+ });
478
+ };
479
+
480
+ exports.default = CohortBuilder;
481
+ exports.useGetCurrentCohort = useGetCurrentCohort;
482
+ //# sourceMappingURL=CohortBuilder-BSlSK2_K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CohortBuilder-BSlSK2_K.js","sources":["../../../src/features/CohortBuilder/CohortPanel.tsx","../../../src/utils/layout.tsx","../../../src/features/CohortBuilder/CohortBuilder.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport { partial } from 'lodash';\nimport {\n Accessibility,\n AggregationsData,\n clearCohortFilters,\n CombineMode,\n CoreState,\n extractEnumFilterValue,\n FacetDefinition,\n FacetType,\n isIntersection,\n selectAllCohortFiltersCollapsed,\n selectCurrentCohortId,\n selectIndexFilters,\n selectSharedFilters,\n toggleCohortBuilderAllFilters,\n useCoreDispatch,\n useCoreSelector,\n useGetAggsQuery,\n useGetCountsQuery,\n} from '@gen3/core';\nimport { type CohortPanelConfiguration } from './types';\nimport {\n Charts,\n CollapsableCharts,\n type SummaryChart,\n} from '../../components/charts';\nimport { ErrorCard } from '../../components/MessageCards';\nimport { useMediaQuery } from '@mantine/hooks';\nimport {\n classifyFacets,\n EnumFacetDataHooks,\n extractRangeValues,\n FacetDataHooks,\n getAllFieldsFromFilterConfigs,\n processBucketData,\n processRangeData,\n removeIntersectionFromEnum,\n useGetFacetFilters,\n useUpdateFilters,\n} from '../../components/facets';\nimport {\n useClearFilters,\n useFieldNameToTitle,\n} from '../../components/facets/hooks';\nimport ExplorerTable from './ExplorerTable/ExplorerTable';\nimport CountsValue from '../../components/counts/CountsValue';\nimport DownloadsPanel from './DownloadsPanel';\nimport {\n useDeepCompareCallback,\n useDeepCompareEffect,\n useDeepCompareMemo,\n} from 'use-deep-compare';\nimport { toDisplayName } from '../../utils';\nimport {\n useCohortFilterCombineState,\n useFilterExpandedState,\n useSetCohortFilterCombineState,\n useToggleExpandFilter,\n} from './hooks';\nimport DropdownPanel from '../../components/facets/Panels/DropdownPanel';\nimport QueryExpression from './QueryExpression';\n\nconst EmptyData = {};\n\n/**\n * The main component that houses the charts, tabs, modal\n * filters, tables, buttons of the exploration page.\n *\n * All of these params come directly from the top level exploration page configuration file or\n * explorer config in a legacy gitops.json file.\n * @example see packages/sampleCommons/config/gen3/explorer.json\n */\n\ninterface CohortPanelConfigurationWithAccessLevel extends CohortPanelConfiguration {\n showAccessLevel?: boolean;\n}\n\n/**\n * CohortPanel is a React component that provides an interactive interface for cohort exploration and filtering.\n * It integrates with data services and facilitates visualization, filtering, and analysis tasks.\n *\n * @param {Object} props The properties required to configure the CohortPanel component.\n * @param {Object} props.guppyConfig Configuration object for Guppy, including field mappings and data type information.\n * @param {Object} props.filters Configuration for filter tabs, including filter fields and layout.\n * @param {Object} [props.charts={}] Optional set of chart configuration objects for rendering summaries.\n * @param {Object} [props.chartsSection] Optional configuration for an additional section of charts.\n * @param {Object} props.table Reference to the table configuration or component for displaying data.\n * @param {string} props.tabTitle Title for the filter tab section.\n * @param {Object[]|undefined} props.dropdowns Dropdown menu configuration, allowing for additional filter options or actions.\n * @param {Object[]|undefined} props.buttons List of button configurations for actions such as downloads.\n * @param {boolean} props.loginForDownload Determines whether login is required to enable download functionality.\n * @param {boolean} [props.showAccessLevel=false] Indicates if the user access level should be displayed on the panel.\n *\n * @returns {JSX.Element} Returns a JSX element rendering the CohortPanel. This includes filter options,\n * summary charts, cohort manager, and data display components.\n */\nexport const CohortPanel = ({\n guppyConfig,\n filters,\n charts = {},\n chartsSection = undefined,\n table,\n tabTitle,\n dropdowns,\n buttons,\n loginForDownload,\n showAccessLevel = false,\n}: CohortPanelConfigurationWithAccessLevel): JSX.Element => {\n const isSm = useMediaQuery('(min-width: 639px)');\n const isMd = useMediaQuery('(min-width: 1373px)');\n const isXl = useMediaQuery('(min-width: 1600px)');\n const [accessLevel, setAccessLevel] = useState<Accessibility>(\n Accessibility.ALL,\n );\n const sharedFiltersMap = useCoreSelector((state: CoreState) =>\n selectSharedFilters(state),\n );\n\n const defaultDropdowns = useMemo(() => dropdowns ?? {}, [dropdowns]);\n const defaultButtons = useMemo(() => buttons ?? [], [buttons]);\n\n const numCols = useMemo(() => {\n if (isSm) return 1;\n if (isMd) return 2;\n if (isXl) return 4;\n return 3;\n }, [isSm, isMd, isXl]);\n\n const index = guppyConfig.dataType;\n const indexPrefix = guppyConfig?.indexPrefix ?? '';\n const fields = useMemo(\n () => getAllFieldsFromFilterConfigs(filters?.tabs ?? []),\n [filters?.tabs],\n );\n\n const coreDispatch = useCoreDispatch();\n\n const [facetDefinitions, setFacetDefinitions] = useState<\n Record<string, FacetDefinition>\n >({});\n\n const [summaryCharts, setSummaryCharts] = useState<\n Record<string, SummaryChart>\n >({});\n\n const cohortFilters = useCoreSelector((state: CoreState) =>\n selectIndexFilters(state, index),\n );\n\n const cohortId = useCoreSelector((state: CoreState) =>\n selectCurrentCohortId(state),\n );\n\n const allFiltersCollapsed = useCoreSelector((state) =>\n selectAllCohortFiltersCollapsed(state, index),\n );\n\n const toggleAllFiltersExpanded = (expand: boolean) => {\n coreDispatch(toggleCohortBuilderAllFilters({ expand, index }));\n };\n\n const clearAllFilters = useCallback(() => {\n coreDispatch(clearCohortFilters({ index }));\n }, [coreDispatch, index]);\n\n const {\n data,\n isSuccess,\n isFetching: isAggsQueryFetching,\n isError: isAggsQueryError,\n } = useGetAggsQuery({\n type: index,\n fields: fields,\n filters: cohortFilters,\n accessibility: accessLevel,\n queryId: cohortId,\n indexPrefix: indexPrefix,\n });\n\n const chartKeys = useDeepCompareMemo(\n () => [...Object.keys(chartsSection?.charts ?? {}), ...Object.keys(charts)],\n [chartsSection?.charts, charts],\n );\n\n const {\n data: chartData,\n isSuccess: isChartSuccess,\n isFetching: isChartFetching,\n isError: isChartError,\n } = useGetAggsQuery(\n {\n type: index,\n fields: chartKeys,\n filters: cohortFilters,\n accessibility: accessLevel,\n filterSelf: true,\n queryId: cohortId,\n indexPrefix: indexPrefix,\n },\n {\n skip: chartKeys.length === 0,\n },\n );\n\n const cleanChartData = useDeepCompareMemo(() => {\n if (isChartSuccess && chartData) {\n const cleanedData: AggregationsData = {};\n const totalCount = chartData._totalCount[0]?.count;\n Object.keys(summaryCharts).forEach((key) => {\n if (!(key in chartData)) {\n return;\n } // handle missing key in data\n // remove empty keys\n cleanedData[key] = chartData[key].filter((x) =>\n typeof x.key !== 'string' ? true : x.key !== '',\n );\n\n const facetDef = facetDefinitions?.[key];\n if (facetDef?.excludeValues) {\n cleanedData[key] = cleanedData[key].filter((x) =>\n typeof x.key !== 'string'\n ? true\n : facetDef?.excludeValues?.includes(String(x.key)) === false,\n );\n }\n\n if (cleanedData[key].length === 0 && totalCount) {\n // if no keys adds back no data\n cleanedData[key] = [{ key: 'no data', count: totalCount }];\n }\n });\n return cleanedData;\n }\n return chartData;\n }, [chartData, isChartSuccess, summaryCharts]);\n\n const getEnumFacetData = useDeepCompareCallback(\n (field: string) => {\n let filters = undefined;\n let combineMode: CombineMode = 'or';\n if (field in cohortFilters.root) {\n if (isIntersection(cohortFilters.root[field])) {\n const intersectionFilters = removeIntersectionFromEnum(\n cohortFilters.root[field],\n );\n if (intersectionFilters) {\n filters = extractEnumFilterValue(intersectionFilters);\n combineMode = 'and';\n }\n } else {\n filters = extractEnumFilterValue(cohortFilters.root[field]);\n }\n }\n\n return {\n data: processBucketData(data?.[field]),\n enumFilters: filters,\n combineMode: combineMode,\n isSuccess: isSuccess,\n };\n },\n [cohortFilters.root, data, isSuccess],\n );\n\n const getRangeFacetData = useDeepCompareCallback(\n (field: string) => {\n return {\n data: processRangeData(data?.[field]),\n filters: extractRangeValues(cohortFilters.root[field]),\n isSuccess: isSuccess,\n };\n },\n [data, cohortFilters.root, isSuccess],\n );\n\n // Set up the hooks for the facet components to use based on the required index\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const facetDataHooks: Record<FacetType, FacetDataHooks | EnumFacetDataHooks> =\n useDeepCompareMemo(() => {\n return {\n // TODO: see if there a better way to do this\n enum: {\n useGetFacetData: getEnumFacetData,\n useUpdateFacetFilters: partial(useUpdateFilters, index),\n useGetFacetFilters: partial(useGetFacetFilters, index),\n useClearFilter: partial(useClearFilters, index),\n useFilterExpanded: partial(useFilterExpandedState, index),\n useToggleExpandFilter: partial(useToggleExpandFilter, index),\n useGetCombineMode: partial(useCohortFilterCombineState, index),\n useSetCombineMode: partial(useSetCohortFilterCombineState, index),\n useFieldNameToTitle: useFieldNameToTitle,\n useTotalCounts: undefined,\n },\n exact: {\n useGetFacetData: getEnumFacetData,\n useUpdateFacetFilters: partial(useUpdateFilters, index),\n useGetFacetFilters: partial(useGetFacetFilters, index),\n useClearFilter: partial(useClearFilters, index),\n useFilterExpanded: partial(useFilterExpandedState, index),\n useToggleExpandFilter: partial(useToggleExpandFilter, index),\n useFieldNameToTitle: useFieldNameToTitle,\n useTotalCounts: undefined,\n },\n multiselect: {\n useGetFacetData: getEnumFacetData,\n useUpdateFacetFilters: partial(useUpdateFilters, index),\n useGetFacetFilters: partial(useGetFacetFilters, index),\n useClearFilter: partial(useClearFilters, index),\n useFilterExpanded: partial(useFilterExpandedState, index),\n useToggleExpandFilter: partial(useToggleExpandFilter, index),\n useFieldNameToTitle: useFieldNameToTitle,\n useTotalCounts: undefined,\n },\n range: {\n useGetFacetData: getRangeFacetData,\n useUpdateFacetFilters: partial(useUpdateFilters, index),\n useGetFacetFilters: partial(useGetFacetFilters, index),\n useClearFilter: partial(useClearFilters, index),\n useFilterExpanded: partial(useFilterExpandedState, index),\n useToggleExpandFilter: partial(useToggleExpandFilter, index),\n useFieldNameToTitle: useFieldNameToTitle,\n useTotalCounts: undefined,\n },\n };\n }, [getEnumFacetData, getRangeFacetData, index]);\n\n // Set the facet definitions based on the data only the first time the data is loaded\n useDeepCompareEffect(() => {\n if (isSuccess && Object.keys(facetDefinitions).length === 0) {\n const configFacetDefs = filters?.tabs.reduce(\n (acc: Record<string, FacetDefinition>, tab) => {\n return { ...tab.fieldsConfig, ...acc };\n },\n {},\n );\n\n const facetDefs = classifyFacets(\n data,\n index,\n guppyConfig?.fieldMapping ?? [],\n configFacetDefs ?? {},\n sharedFiltersMap,\n );\n setFacetDefinitions(facetDefs);\n\n // setup summary charts since nested fields can be listed by the split field name\n const chartDefinitions = chartsSection?.charts ?? charts;\n\n const summaryCharts = Object.keys(chartDefinitions).reduce(\n (acc, field) => {\n let chartField = field;\n if (facetDefs?.[field] === undefined) {\n const res = Object.values(facetDefs).filter((def) => {\n return def.dataField === field;\n });\n if (res.length > 0) {\n chartField = res[0].field;\n }\n }\n return {\n ...acc,\n [chartField]: chartDefinitions[field],\n };\n },\n {},\n );\n\n setSummaryCharts(summaryCharts);\n }\n }, [\n isSuccess,\n data,\n facetDefinitions,\n index,\n guppyConfig.fieldMapping,\n charts,\n chartsSection,\n ]);\n\n const {\n data: counts,\n isFetching: isCountsFetching,\n isError: isCountsError,\n } = useGetCountsQuery({\n type: index,\n filters: cohortFilters,\n accessibility: accessLevel,\n queryId: cohortId,\n });\n\n if (isCountsError || isAggsQueryError) {\n return <ErrorCard message=\"Unable to fetch data from server\" />; // TODO: replace with configurable message\n }\n\n return (\n <div className=\"flex flex-col mt-3 relative px-4 bg-base-lightest w-full\">\n <QueryExpression index={index} />\n\n {/* Flex container to ensure proper 25/75 split */}\n <div className=\"flex w-full\">\n {/* Left panel - 25% */}\n <div\n id=\"cohort-builder-filters\"\n className=\"flex-shrink-0 md:w-1/4 lg:w-1/5\"\n >\n {filters?.tabs && (\n <DropdownPanel\n filters={filters}\n tabTitle={tabTitle}\n facetDefinitions={facetDefinitions}\n facetDataHooks={facetDataHooks}\n onAccessChange={setAccessLevel}\n accessLevel={accessLevel}\n showAccessLevel={showAccessLevel}\n allFiltersCollapsed={allFiltersCollapsed}\n toggleAllFiltersExpanded={toggleAllFiltersExpanded}\n clearAllFilters={clearAllFilters}\n />\n )}\n </div>\n\n {/* Right content - 75% */}\n <div\n id=\"cohort-builder-content\"\n className=\"flex flex-col md:w-3/4 lg:w-4/5 pl-4\"\n >\n {/* Top row with DownloadsPanel and CountsValue */}\n <div className=\"flex justify-between mb-2 ml-2\">\n <DownloadsPanel\n dropdowns={defaultDropdowns}\n buttons={defaultButtons}\n loginForDownload={loginForDownload}\n index={index}\n totalCount={counts ?? 0}\n fields={table?.fields ?? []}\n filter={cohortFilters}\n />\n <CountsValue\n label={guppyConfig?.nodeCountTitle || toDisplayName(index)}\n configuration={guppyConfig?.nodeCountConfiguration}\n counts={counts}\n isFetching={isCountsFetching}\n isError={isCountsError}\n />\n </div>\n\n {/* Charts Section */}\n {chartsSection?.enabled ? (\n <CollapsableCharts\n config={{ ...chartsSection, charts: summaryCharts }}\n data={cleanChartData ?? EmptyData}\n isSuccess={isChartSuccess}\n isFetching={isChartFetching}\n isError={isChartError}\n />\n ) : (\n <Charts\n charts={summaryCharts}\n data={cleanChartData ?? EmptyData}\n counts={counts}\n isSuccess={isChartSuccess}\n isError={isChartError}\n numCols={numCols}\n />\n )}\n\n {/* Table Section */}\n {table?.enabled && (\n <div className=\"mt-2 flex flex-col\">\n <ExplorerTable\n index={index}\n tableConfig={table}\n accessibility={accessLevel}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","export const TabsLayoutToComponentProp = (\n tabsLayout?: 'left' | 'right' | 'center',\n) => {\n if (!tabsLayout) {\n return 'flex-start';\n }\n switch (tabsLayout) {\n case 'left': {\n return 'flex-start';\n }\n case 'right': {\n return 'flex-end';\n }\n case 'center': {\n return 'center';\n }\n default: {\n return 'flex-start';\n }\n }\n};\n","import React from 'react';\nimport { useDeepCompareMemo } from 'use-deep-compare';\nimport { CohortBuilderProps, CohortPanelConfiguration } from './types';\nimport { Tabs } from '@mantine/core';\nimport { CohortPanel } from './CohortPanel';\nimport {\n selectCurrentCohortId,\n setSharedFilters,\n useCoreDispatch,\n useCoreSelector,\n} from '@gen3/core';\nimport { TabsLayoutToComponentProp } from '../../utils/layout';\nimport CohortManager from './CohortManager/CohortManager';\n\nexport const useGetCurrentCohort = () => {\n return useCoreSelector((state) => selectCurrentCohortId(state));\n};\n\nconst CohortBuilder = ({\n explorerConfig,\n sharedFiltersMap = null,\n tabsLayout = 'left',\n enableCohortManager = true,\n}: CohortBuilderProps) => {\n const dispatch = useCoreDispatch();\n dispatch(setSharedFilters(sharedFiltersMap ?? {}));\n\n const configuration = useDeepCompareMemo(\n () => explorerConfig,\n [explorerConfig],\n );\n\n return (\n <div className=\"flex flex-col w-full mt-2\">\n {enableCohortManager ? <CohortManager /> : null}\n <Tabs\n color=\"primary.5\"\n variant={explorerConfig[0]?.tabType}\n keepMounted={true}\n defaultValue={explorerConfig[0].tabTitle}\n >\n <Tabs.List\n className=\"w-full\"\n justify={TabsLayoutToComponentProp(tabsLayout)}\n >\n {configuration.map((panelConfig: CohortPanelConfiguration) => (\n <Tabs.Tab\n value={panelConfig.tabTitle}\n key={`${panelConfig.tabTitle}-tabList`}\n >\n {panelConfig.tabTitle}\n </Tabs.Tab>\n ))}\n </Tabs.List>\n\n {configuration.map((panelConfig: CohortPanelConfiguration) => (\n <Tabs.Panel\n value={panelConfig.tabTitle}\n key={`${panelConfig.tabTitle}-tabPanel`}\n >\n <CohortPanel\n guppyConfig={panelConfig.guppyConfig}\n key={`${panelConfig.tabTitle}-CohortPanel`}\n chartsSection={panelConfig?.chartsSection}\n charts={panelConfig?.charts}\n filters={panelConfig.filters}\n tabTitle={panelConfig.tabTitle}\n table={panelConfig.table}\n dropdowns={panelConfig.dropdowns}\n buttons={panelConfig.buttons}\n loginForDownload={panelConfig.loginForDownload}\n sharedFiltersMap={panelConfig.sharedFiltersMap}\n />\n </Tabs.Panel>\n ))}\n </Tabs>\n </div>\n );\n};\n\nexport default CohortBuilder;\n"],"names":["EmptyData","CohortPanel","guppyConfig","filters","charts","chartsSection","undefined","table","tabTitle","dropdowns","buttons","loginForDownload","showAccessLevel","isSm","useMediaQuery","isMd","isXl","accessLevel","setAccessLevel","useState","Accessibility","ALL","sharedFiltersMap","useCoreSelector","state","selectSharedFilters","defaultDropdowns","useMemo","defaultButtons","numCols","index","dataType","indexPrefix","fields","getAllFieldsFromFilterConfigs","tabs","coreDispatch","useCoreDispatch","facetDefinitions","setFacetDefinitions","summaryCharts","setSummaryCharts","cohortFilters","selectIndexFilters","cohortId","selectCurrentCohortId","allFiltersCollapsed","selectAllCohortFiltersCollapsed","toggleAllFiltersExpanded","expand","toggleCohortBuilderAllFilters","clearAllFilters","useCallback","clearCohortFilters","data","isSuccess","isFetching","isAggsQueryFetching","isError","isAggsQueryError","useGetAggsQuery","type","accessibility","queryId","chartKeys","useDeepCompareMemo","Object","keys","chartData","isChartSuccess","isChartFetching","isChartError","filterSelf","skip","length","cleanChartData","cleanedData","totalCount","_totalCount","count","forEach","key","filter","x","facetDef","excludeValues","includes","String","getEnumFacetData","useDeepCompareCallback","field","combineMode","root","isIntersection","intersectionFilters","removeIntersectionFromEnum","extractEnumFilterValue","processBucketData","enumFilters","getRangeFacetData","processRangeData","extractRangeValues","facetDataHooks","enum","useGetFacetData","useUpdateFacetFilters","partial","useUpdateFilters","useGetFacetFilters","useClearFilter","useClearFilters","useFilterExpanded","useFilterExpandedState","useToggleExpandFilter","useGetCombineMode","useCohortFilterCombineState","useSetCombineMode","useSetCohortFilterCombineState","useFieldNameToTitle","useTotalCounts","exact","multiselect","range","useDeepCompareEffect","configFacetDefs","reduce","acc","tab","fieldsConfig","facetDefs","classifyFacets","fieldMapping","chartDefinitions","chartField","res","values","def","dataField","counts","isCountsFetching","isCountsError","useGetCountsQuery","_jsx","ErrorCard","message","_jsxs","div","className","QueryExpression","id","DropdownPanel","onAccessChange","DownloadsPanel","CountsValue","label","nodeCountTitle","toDisplayName","configuration","nodeCountConfiguration","enabled","CollapsableCharts","config","Charts","ExplorerTable","tableConfig","TabsLayoutToComponentProp","tabsLayout","useGetCurrentCohort","CohortBuilder","explorerConfig","enableCohortManager","dispatch","setSharedFilters","CohortManager","Tabs","color","variant","tabType","keepMounted","defaultValue","List","justify","map","panelConfig","Tab","value","Panel"],"mappings":"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"}