@gen3/frontend 0.12.65 → 0.12.67

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 (148) hide show
  1. package/dist/dts/components/Content/FormContent.d.ts +2 -1
  2. package/dist/dts/components/Content/FormContent.d.ts.map +1 -1
  3. package/dist/dts/components/Content/FormContent.js +2 -2
  4. package/dist/dts/components/Content/FormContent.js.map +1 -1
  5. package/dist/dts/components/facets/EnumFacet.js +1 -2
  6. package/dist/dts/components/facets/EnumFacet.js.map +1 -1
  7. package/dist/dts/components/facets/FacetControlsHeader.d.ts.map +1 -1
  8. package/dist/dts/components/facets/FacetControlsHeader.js +2 -2
  9. package/dist/dts/components/facets/FacetControlsHeader.js.map +1 -1
  10. package/dist/dts/components/facets/FacetEnumList.d.ts.map +1 -1
  11. package/dist/dts/components/facets/FacetEnumList.js +18 -7
  12. package/dist/dts/components/facets/FacetEnumList.js.map +1 -1
  13. package/dist/dts/components/facets/components.d.ts +1 -1
  14. package/dist/dts/components/facets/components.d.ts.map +1 -1
  15. package/dist/dts/components/facets/components.js +1 -1
  16. package/dist/dts/components/facets/components.js.map +1 -1
  17. package/dist/dts/components/facets/createFacetCard.d.ts.map +1 -1
  18. package/dist/dts/components/facets/createFacetCard.js +1 -1
  19. package/dist/dts/components/facets/createFacetCard.js.map +1 -1
  20. package/dist/dts/components/facets/createFacetCard.unit.test.d.ts +2 -0
  21. package/dist/dts/components/facets/createFacetCard.unit.test.d.ts.map +1 -0
  22. package/dist/dts/components/facets/createFacetCard.unit.test.js +56 -0
  23. package/dist/dts/components/facets/createFacetCard.unit.test.js.map +1 -0
  24. package/dist/dts/components/facets/utils.d.ts.map +1 -1
  25. package/dist/dts/components/facets/utils.js +1 -0
  26. package/dist/dts/components/facets/utils.js.map +1 -1
  27. package/dist/dts/components/facets/utils.unit.test.js +40 -2
  28. package/dist/dts/components/facets/utils.unit.test.js.map +1 -1
  29. package/dist/dts/features/CohortBuilder/QueryExpression/LogicalOperatorLabel.d.ts +8 -0
  30. package/dist/dts/features/CohortBuilder/QueryExpression/LogicalOperatorLabel.d.ts.map +1 -0
  31. package/dist/dts/features/CohortBuilder/QueryExpression/LogicalOperatorLabel.js +4 -0
  32. package/dist/dts/features/CohortBuilder/QueryExpression/LogicalOperatorLabel.js.map +1 -0
  33. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpression.d.ts +2 -1
  34. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpression.d.ts.map +1 -1
  35. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpression.js +2 -1
  36. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpression.js.map +1 -1
  37. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionContext.d.ts +1 -0
  38. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionContext.d.ts.map +1 -1
  39. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionContext.js +1 -0
  40. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionContext.js.map +1 -1
  41. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionSection.d.ts.map +1 -1
  42. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionSection.js +4 -3
  43. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionSection.js.map +1 -1
  44. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionSection.unit.test.d.ts +2 -0
  45. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionSection.unit.test.d.ts.map +1 -0
  46. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionSection.unit.test.js +72 -0
  47. package/dist/dts/features/CohortBuilder/QueryExpression/QueryExpressionSection.unit.test.js.map +1 -0
  48. package/dist/dts/features/CohortBuilder/QueryExpression/QueryRepresentation.d.ts +1 -0
  49. package/dist/dts/features/CohortBuilder/QueryExpression/QueryRepresentation.d.ts.map +1 -1
  50. package/dist/dts/features/CohortBuilder/QueryExpression/QueryRepresentation.js +39 -28
  51. package/dist/dts/features/CohortBuilder/QueryExpression/QueryRepresentation.js.map +1 -1
  52. package/dist/dts/features/CohortBuilder/QueryExpression/QueryRepresentation.unit.test.d.ts +2 -0
  53. package/dist/dts/features/CohortBuilder/QueryExpression/QueryRepresentation.unit.test.d.ts.map +1 -0
  54. package/dist/dts/features/CohortBuilder/QueryExpression/QueryRepresentation.unit.test.js +38 -0
  55. package/dist/dts/features/CohortBuilder/QueryExpression/QueryRepresentation.unit.test.js.map +1 -0
  56. package/dist/dts/features/DiscoveryForms/{StudyRegistrationAccessRequest → GenericRegistrationAccessRequest}/FormContentViews.d.ts +3 -2
  57. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/FormContentViews.d.ts.map +1 -0
  58. package/dist/dts/features/DiscoveryForms/{StudyRegistrationAccessRequest → GenericRegistrationAccessRequest}/FormContentViews.js +3 -3
  59. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/FormContentViews.js.map +1 -0
  60. package/dist/dts/features/DiscoveryForms/{StudyRegistrationAccessRequest → GenericRegistrationAccessRequest}/FormContentViews.stories.d.ts +3 -1
  61. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/FormContentViews.stories.d.ts.map +1 -0
  62. package/dist/dts/features/DiscoveryForms/{StudyRegistrationAccessRequest → GenericRegistrationAccessRequest}/FormContentViews.stories.js +1 -1
  63. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/FormContentViews.stories.js.map +1 -0
  64. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/GenericRegistrationAccessRequestOutcome.d.ts +7 -0
  65. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/GenericRegistrationAccessRequestOutcome.d.ts.map +1 -0
  66. package/dist/dts/features/DiscoveryForms/{StudyRegistrationAccessRequest/StudyRegistrationAccessRequestOutcome.js → GenericRegistrationAccessRequest/GenericRegistrationAccessRequestOutcome.js} +3 -3
  67. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/GenericRegistrationAccessRequestOutcome.js.map +1 -0
  68. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/index.d.ts +8 -0
  69. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/index.d.ts.map +1 -0
  70. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/index.js +10 -0
  71. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/index.js.map +1 -0
  72. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/types.d.ts +35 -0
  73. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/types.d.ts.map +1 -0
  74. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/types.js.map +1 -0
  75. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/useGenericRegistration.d.ts +12 -0
  76. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/useGenericRegistration.d.ts.map +1 -0
  77. package/dist/dts/features/DiscoveryForms/{StudyRegistrationAccessRequest/useStudyRegistration.js → GenericRegistrationAccessRequest/useGenericRegistration.js} +31 -44
  78. package/dist/dts/features/DiscoveryForms/GenericRegistrationAccessRequest/useGenericRegistration.js.map +1 -0
  79. package/dist/dts/features/Study/StudyDetails/StudyDetailsHeaderButtons.d.ts.map +1 -1
  80. package/dist/dts/features/Study/StudyDetails/StudyDetailsHeaderButtons.js +40 -35
  81. package/dist/dts/features/Study/StudyDetails/StudyDetailsHeaderButtons.js.map +1 -1
  82. package/dist/dts/features/Workspace/utils.js +1 -1
  83. package/dist/dts/features/Workspace/utils.js.map +1 -1
  84. package/dist/dts/pages/StudyForms/StudyRegistrationAccessRequest/data.d.ts +2 -2
  85. package/dist/dts/pages/StudyForms/StudyRegistrationAccessRequest/data.d.ts.map +1 -1
  86. package/dist/dts/pages/StudyForms/StudyRegistrationAccessRequest/data.js +3 -3
  87. package/dist/dts/pages/StudyForms/StudyRegistrationAccessRequest/data.js.map +1 -1
  88. package/dist/dts/pages/StudyForms/StudyRegistrationAccessRequest/index.d.ts +6 -6
  89. package/dist/dts/pages/StudyForms/StudyRegistrationAccessRequest/index.d.ts.map +1 -1
  90. package/dist/dts/pages/StudyForms/StudyRegistrationAccessRequest/index.js +5 -5
  91. package/dist/dts/pages/StudyForms/StudyRegistrationAccessRequest/index.js.map +1 -1
  92. package/dist/dts/pages/StudyForms/VLMDSubmissionAccessRequest/data.d.ts +4 -0
  93. package/dist/dts/pages/StudyForms/VLMDSubmissionAccessRequest/data.d.ts.map +1 -0
  94. package/dist/dts/pages/StudyForms/VLMDSubmissionAccessRequest/data.js +32 -0
  95. package/dist/dts/pages/StudyForms/VLMDSubmissionAccessRequest/data.js.map +1 -0
  96. package/dist/dts/pages/StudyForms/VLMDSubmissionAccessRequest/index.d.ts +9 -0
  97. package/dist/dts/pages/StudyForms/VLMDSubmissionAccessRequest/index.d.ts.map +1 -0
  98. package/dist/dts/pages/StudyForms/VLMDSubmissionAccessRequest/index.js +12 -0
  99. package/dist/dts/pages/StudyForms/VLMDSubmissionAccessRequest/index.js.map +1 -0
  100. package/dist/index/cjs/{QueryPanel-DNGXxrpC.js → QueryPanel-aGaJfxNv.js} +2 -2
  101. package/dist/index/cjs/{QueryPanel-DNGXxrpC.js.map → QueryPanel-aGaJfxNv.js.map} +1 -1
  102. package/dist/index/cjs/{index-7sUtTikC.js → index-Br1lKHDn.js} +199 -99
  103. package/dist/index/cjs/index-Br1lKHDn.js.map +1 -0
  104. package/dist/index/cjs/index.js +1 -1
  105. package/dist/index/esm/{QueryPanel-C3JVntIb.js → QueryPanel-C0nNrzSx.js} +2 -2
  106. package/dist/index/esm/{QueryPanel-C3JVntIb.js.map → QueryPanel-C0nNrzSx.js.map} +1 -1
  107. package/dist/index/esm/{index-B_0ks9Pi.js → index-CDgLCUE3.js} +201 -101
  108. package/dist/index/esm/index-CDgLCUE3.js.map +1 -0
  109. package/dist/index/esm/index.js +1 -1
  110. package/dist/index.d.ts +4 -1
  111. package/dist/pages/cjs/{CohortBuilder-DircXqXL.js → CohortBuilder-rF69uCsJ.js} +2 -2
  112. package/dist/pages/cjs/{CohortBuilder-DircXqXL.js.map → CohortBuilder-rF69uCsJ.js.map} +1 -1
  113. package/dist/pages/cjs/{QueryPanel-qYWbo2Cb.js → QueryPanel-JOL_9n8f.js} +2 -2
  114. package/dist/pages/cjs/{QueryPanel-qYWbo2Cb.js.map → QueryPanel-JOL_9n8f.js.map} +1 -1
  115. package/dist/pages/cjs/{index-BQzYPjdE.js → index-Dbd5m3GQ.js} +200 -100
  116. package/dist/pages/cjs/index-Dbd5m3GQ.js.map +1 -0
  117. package/dist/pages/cjs/index.js +1 -1
  118. package/dist/pages/esm/{CohortBuilder-CI9PAFLd.js → CohortBuilder-D3EM-FLr.js} +2 -2
  119. package/dist/pages/esm/{CohortBuilder-CI9PAFLd.js.map → CohortBuilder-D3EM-FLr.js.map} +1 -1
  120. package/dist/pages/esm/{QueryPanel-BEqldpr5.js → QueryPanel-0Znj4lFa.js} +2 -2
  121. package/dist/pages/esm/{QueryPanel-BEqldpr5.js.map → QueryPanel-0Znj4lFa.js.map} +1 -1
  122. package/dist/pages/esm/{index-BoZwM5wd.js → index-CxrByAhv.js} +202 -102
  123. package/dist/pages/esm/index-CxrByAhv.js.map +1 -0
  124. package/dist/pages/esm/index.js +1 -1
  125. package/dist/pages.d.ts +1 -0
  126. package/package.json +4 -3
  127. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/FormContentViews.d.ts.map +0 -1
  128. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/FormContentViews.js.map +0 -1
  129. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/FormContentViews.stories.d.ts.map +0 -1
  130. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/FormContentViews.stories.js.map +0 -1
  131. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/StudyRegistrationAccessRequestOutcome.d.ts +0 -7
  132. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/StudyRegistrationAccessRequestOutcome.d.ts.map +0 -1
  133. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/StudyRegistrationAccessRequestOutcome.js.map +0 -1
  134. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/index.d.ts +0 -7
  135. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/index.d.ts.map +0 -1
  136. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/index.js +0 -11
  137. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/index.js.map +0 -1
  138. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/types.d.ts +0 -20
  139. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/types.d.ts.map +0 -1
  140. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/types.js.map +0 -1
  141. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/useStudyRegistration.d.ts +0 -11
  142. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/useStudyRegistration.d.ts.map +0 -1
  143. package/dist/dts/features/DiscoveryForms/StudyRegistrationAccessRequest/useStudyRegistration.js.map +0 -1
  144. package/dist/index/cjs/index-7sUtTikC.js.map +0 -1
  145. package/dist/index/esm/index-B_0ks9Pi.js.map +0 -1
  146. package/dist/pages/cjs/index-BQzYPjdE.js.map +0 -1
  147. package/dist/pages/esm/index-BoZwM5wd.js.map +0 -1
  148. /package/dist/dts/features/DiscoveryForms/{StudyRegistrationAccessRequest → GenericRegistrationAccessRequest}/types.js +0 -0
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-7sUtTikC.js');
3
+ var index = require('./index-Br1lKHDn.js');
4
4
  require('@gen3/core');
5
5
  require('react/jsx-runtime');
6
6
  require('react');
@@ -4,7 +4,7 @@ import 'react';
4
4
  import { LoadingOverlay } from '@mantine/core';
5
5
 
6
6
  // Wrapper function for displaying loading element before GqlQueryEditor renders
7
- const GqlQueryEditor = dynamic(()=>import('./index-B_0ks9Pi.js').then(function (n) { return n.cX; }), {
7
+ const GqlQueryEditor = dynamic(()=>import('./index-CDgLCUE3.js').then(function (n) { return n.cX; }), {
8
8
  loading: ()=>/*#__PURE__*/ jsx(LoadingOverlay, {
9
9
  visible: true
10
10
  }),
@@ -34,4 +34,4 @@ const GqlQueryEditor = dynamic(()=>import('./index-B_0ks9Pi.js').then(function (
34
34
  };
35
35
 
36
36
  export { QueryPanel as default };
37
- //# sourceMappingURL=QueryPanel-C3JVntIb.js.map
37
+ //# sourceMappingURL=QueryPanel-C0nNrzSx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QueryPanel-C3JVntIb.js","sources":["../../../src/features/Query/QueryPanel.tsx"],"sourcesContent":["import dynamic from 'next/dynamic';\nimport React from 'react';\nimport { LoadingOverlay } from '@mantine/core';\nimport type { QueryPanelConfiguration } from './types';\n\n// Wrapper function for displaying loading element before GqlQueryEditor renders\nconst GqlQueryEditor = dynamic(() => import('./GqlQueryEditor'), {\n loading: () => <LoadingOverlay visible={true} />,\n ssr: false,\n});\n\n/**\n * Represents the QueryPanel component responsible for rendering a GraphQL query editor.\n *\n * @param {QueryPanelConfiguration} config - The configuration object for the QueryPanel.\n * @param {Array<{ url: string, label: string }>} [config.graphQLEndpoints=[{ url: 'guppy/graphql', label: 'Flat' }]]\n * An array of GraphQL endpoint objects. Each endpoint object contains the following:\n * - `url` (string): The URL of the GraphQL endpoint. Note this should only be the Gen3 service path (e.g., 'guppy/graphql').\n * - `label` (string): A label for the GraphQL endpoint.\n *\n * @returns {React.Element} The rendered GraphQL query editor.\n */\n\nconst QueryPanel = ({\n graphQLEndpoints = [{ url: 'guppy/graphql', label: 'Flat' }],\n}: QueryPanelConfiguration) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return <GqlQueryEditor graphQLEndpoints={graphQLEndpoints} />;\n};\n\nexport default QueryPanel;\n"],"names":["GqlQueryEditor","dynamic","loading","_jsx","LoadingOverlay","visible","ssr","QueryPanel","graphQLEndpoints","url","label"],"mappings":";;;;;AAKA;AACA,MAAMA,cAAAA,GAAiBC,OAAAA,CAAQ,IAAM,OAAO,qBAAA,qCAAA,EAAqB;AAC/DC,IAAAA,OAAAA,EAAS,kBAAMC,GAAA,CAACC,cAAAA,EAAAA;YAAeC,OAAAA,EAAS;;IACxCC,GAAAA,EAAK;AACP,CAAA,CAAA;AAEA;;;;;;;;;;AAUC,IAED,MAAMC,UAAAA,GAAa,CAAC,EAClBC,gBAAAA,GAAmB;AAAC,IAAA;QAAEC,GAAAA,EAAK,eAAA;QAAiBC,KAAAA,EAAO;AAAO;CAAE,EACpC,GAAA;;;AAGxB,IAAA,qBAAOP,GAAA,CAACH,cAAAA,EAAAA;QAAeQ,gBAAAA,EAAkBA;;AAC3C;;;;"}
1
+ {"version":3,"file":"QueryPanel-C0nNrzSx.js","sources":["../../../src/features/Query/QueryPanel.tsx"],"sourcesContent":["import dynamic from 'next/dynamic';\nimport React from 'react';\nimport { LoadingOverlay } from '@mantine/core';\nimport type { QueryPanelConfiguration } from './types';\n\n// Wrapper function for displaying loading element before GqlQueryEditor renders\nconst GqlQueryEditor = dynamic(() => import('./GqlQueryEditor'), {\n loading: () => <LoadingOverlay visible={true} />,\n ssr: false,\n});\n\n/**\n * Represents the QueryPanel component responsible for rendering a GraphQL query editor.\n *\n * @param {QueryPanelConfiguration} config - The configuration object for the QueryPanel.\n * @param {Array<{ url: string, label: string }>} [config.graphQLEndpoints=[{ url: 'guppy/graphql', label: 'Flat' }]]\n * An array of GraphQL endpoint objects. Each endpoint object contains the following:\n * - `url` (string): The URL of the GraphQL endpoint. Note this should only be the Gen3 service path (e.g., 'guppy/graphql').\n * - `label` (string): A label for the GraphQL endpoint.\n *\n * @returns {React.Element} The rendered GraphQL query editor.\n */\n\nconst QueryPanel = ({\n graphQLEndpoints = [{ url: 'guppy/graphql', label: 'Flat' }],\n}: QueryPanelConfiguration) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return <GqlQueryEditor graphQLEndpoints={graphQLEndpoints} />;\n};\n\nexport default QueryPanel;\n"],"names":["GqlQueryEditor","dynamic","loading","_jsx","LoadingOverlay","visible","ssr","QueryPanel","graphQLEndpoints","url","label"],"mappings":";;;;;AAKA;AACA,MAAMA,cAAAA,GAAiBC,OAAAA,CAAQ,IAAM,OAAO,qBAAA,qCAAA,EAAqB;AAC/DC,IAAAA,OAAAA,EAAS,kBAAMC,GAAA,CAACC,cAAAA,EAAAA;YAAeC,OAAAA,EAAS;;IACxCC,GAAAA,EAAK;AACP,CAAA,CAAA;AAEA;;;;;;;;;;AAUC,IAED,MAAMC,UAAAA,GAAa,CAAC,EAClBC,gBAAAA,GAAmB;AAAC,IAAA;QAAEC,GAAAA,EAAK,eAAA;QAAiBC,KAAAA,EAAO;AAAO;CAAE,EACpC,GAAA;;;AAGxB,IAAA,qBAAOP,GAAA,CAACH,cAAAA,EAAAA;QAAeQ,gBAAAA,EAAkBA;;AAC3C;;;;"}
@@ -9,7 +9,7 @@ import _, { toString, capitalize as capitalize$1, isArray, omitBy, some, isNumbe
9
9
  import Link from 'next/link';
10
10
  import { FaExternalLinkAlt, FaExclamationTriangle, FaExclamation, FaQuestion, FaAngleDoubleLeft, FaAngleDoubleRight, FaCaretDown, FaEyeSlash, FaEye, FaExclamationCircle, FaPencilAlt, FaUndo, FaPlus, FaChartPie, FaCircle, FaCheck, FaVideo, FaRegQuestionCircle, FaGraduationCap, FaUser, FaRegStopCircle, FaRedo, FaUpload, FaDownload } from 'react-icons/fa';
11
11
  import { Icon, addCollection } from '@iconify-icon/react';
12
- import { useCoreSelector, selectUserDetails, selectUserAuthStatus, isAuthenticated, WorkspaceStatus, useGetWorkspaceStatusQuery, useGetWorkspacePayModelsQuery, useTerminateWorkspaceMutation, selectRequestedWorkspaceStatus, selectRequestedWorkspaceStatusTimestamp, useCoreDispatch, setActiveWorkspaceStatus, RequestedWorkspaceStatus, setRequestedWorkspaceStatus, isTimeGreaterThan as isTimeGreaterThan$1, useGetCSRFQuery, useLazyFetchUserDetailsQuery, GEN3_REDIRECT_URL, showModal, Modals, useGetAuthzResourcesQuery, useGetAggsQuery, Accessibility, useGetStatsAggregationsQuery, fieldNameToLabel, isObject as isObject$1, isIncludes, selectAvailableCohorts, useLazyGetObjectIdsQuery, EmptyFilterSet as EmptyFilterSet$1, selectCurrentCohortFilters as selectCurrentCohortFilters$1, useCustomRangeQuery, usePrevious, selectCohortFilters, filterSetToOperation, selectAllCohorts as selectAllCohorts$1, selectCurrentCohort as selectCurrentCohort$1, setCurrentCohortId as setCurrentCohortId$1, updateCohortName as updateCohortName$1, createNewCohort as createNewCohort$1, duplicateCohort, removeCohort as removeCohort$1, setCohortFilter as setCohortFilter$1, updateCohortFilter as updateCohortFilter$1, removeCohortFilter as removeCohortFilter$1, clearCohortFilters as clearCohortFilters$1, handleOperation, buildNestedFilterForOperation, selectCurrentCohortId as selectCurrentCohortId$1, selectCurrentCohortModified, selectCurrentCohortSaved, setCohortIndexFilters, toggleCohortBuilderCategoryFilter, selectCohortFilterExpanded, setCohortFilterCombineMode, selectCohortFilterCombineMode, selectCurrentCohortName as selectCurrentCohortName$1, selectShouldShareFilters, selectSharedFilters, useLazyGetCountsQuery, selectIndexFilters, GEN3_COMMONS_NAME, isOperationWithField, extractEnumFilterValue, selectIndexedFilterByName, isOperatorWithFieldAndArrayOfOperands, isUnion, trimFirstfieldNameToLabel, setShouldShareFilters, CohortStorage, createAppStore, GEN3_API, getRemoteSupportServiceRegistry, isHttpStatusError, MissingServiceConfigurationError, useLazyGetAggsQuery, useCreateRequestMutation, isIndexedFilterSetEmpty, buildGetAggregationQuery, GEN3_GUPPY_API, processHistogramResponse, roundHistogramResponse, selectCSRFToken, ExtractValueFromObject, GEN3_FENCE_API, useIsUserLoggedIn, GEN3_DOMAIN, DataLibraryStoreMode, useDataLibrary, buildListItemsGroupedByDataset, extractFileDatasetsInRecords, useGetMDSQuery, selectAuthzMappingData, useGetAggMDSQuery, useAskQuestionMutation, useGetIndexAggMDSQuery, useGetTagsQuery, useGetRawDataAndTotalCountsQuery, humanify, selectCart, selectCartItem, removeItemsFromCart, CART_LIMIT, addItemsToCart, isJSONValue, downloadFromGuppyToBlob, downloadJSONDataFromGuppy, coreStore, fetchJSONDataFromURL, GEN3_MANIFEST_API, useLazyGetMultipleSowerJobStatusQuery, selectAllCohortFiltersCollapsed, isIntersection, useGetCountsQuery, useSubmitSowerJobMutation, toggleCohortBuilderAllFilters, setSharedFilters, useGeneralGQLQuery, convertFilterSetToGqlFilter, customQueryStrForField, useUserRequestQuery, getGen3AppId, createGen3AppWithOwnStore, createAppApiForRTKQ, useLazyGetIndexObjectQuery, useLazyGetIndexdMetdataQuery, useLazyGetDownloadQuery, createGen3App, useGetDictionaryQuery, useGetMetadataByUrlQuery, useGetMetadataByIdQuery, hideModal, useGetAuthzMappingsQuery, selectCurrentModal, useLazyGetSowerOutputQuery, useGetSowerJobListQuery, selectSowerJobDatetimeCache, CoreProvider, HttpMethod, groupSharedFields, useGetCredentialsQuery, useRemoveCredentialMutation, useAddNewCredentialMutation, useUserAuth, useGetExternalLoginsQuery, useGetLoginProvidersQuery, useGetProjectsDetailsQuery, useGetSubmissionsQuery, useLaunchWorkspaceMutation, selectActiveWorkspaceStatus, isFetchBaseQueryError, isSerializedError, normalizeRtkError, setActiveWorkspace, getCurrentTimestamp as getCurrentTimestamp$1, selectWorkspaceStatusFromService, selectActiveWorkspaceId, useGetWorkspaceOptionsQuery, GEN3_WORKSPACE_API, useSetCurrentPayModelMutation, PodStatus, PodConditionType, isWorkspaceRunningOrStopping, isCohortItem, isFileItem, fetchFencePresignedURL, HTTPError, HTTPUserFriendlyErrorMessages, getFederatedLoginStatus, queryMultipleMDSRecords, extractIndexFromDataLibraryCohort, isFilterSet, getNumberOfItemsInDatalist, isAdditionalDataItem, useLazyGetCrosswalkDataQuery, fetchFence as fetchFence$1, selectHeadersWithCSRFToken, useGetIndexObjectQuery } from '@gen3/core';
12
+ import { useCoreSelector, selectUserDetails, selectUserAuthStatus, isAuthenticated, WorkspaceStatus, useGetWorkspaceStatusQuery, useGetWorkspacePayModelsQuery, useTerminateWorkspaceMutation, selectRequestedWorkspaceStatus, selectRequestedWorkspaceStatusTimestamp, useCoreDispatch, setActiveWorkspaceStatus, RequestedWorkspaceStatus, setRequestedWorkspaceStatus, isTimeGreaterThan as isTimeGreaterThan$1, useGetCSRFQuery, useLazyFetchUserDetailsQuery, GEN3_REDIRECT_URL, showModal, Modals, useGetAuthzResourcesQuery, useGetAggsQuery, Accessibility, useGetStatsAggregationsQuery, fieldNameToLabel, isObject as isObject$1, isIncludes, selectAvailableCohorts, useLazyGetObjectIdsQuery, EmptyFilterSet as EmptyFilterSet$1, selectCurrentCohortFilters as selectCurrentCohortFilters$1, useCustomRangeQuery, usePrevious, selectCohortFilters, filterSetToOperation, selectAllCohorts as selectAllCohorts$1, selectCurrentCohort as selectCurrentCohort$1, setCurrentCohortId as setCurrentCohortId$1, updateCohortName as updateCohortName$1, createNewCohort as createNewCohort$1, duplicateCohort, removeCohort as removeCohort$1, setCohortFilter as setCohortFilter$1, updateCohortFilter as updateCohortFilter$1, removeCohortFilter as removeCohortFilter$1, clearCohortFilters as clearCohortFilters$1, handleOperation, buildNestedFilterForOperation, selectCurrentCohortId as selectCurrentCohortId$1, selectCurrentCohortModified, selectCurrentCohortSaved, setCohortIndexFilters, toggleCohortBuilderCategoryFilter, selectCohortFilterExpanded, setCohortFilterCombineMode, selectCohortFilterCombineMode, selectCurrentCohortName as selectCurrentCohortName$1, selectShouldShareFilters, selectSharedFilters, useLazyGetCountsQuery, selectIndexFilters, GEN3_COMMONS_NAME, isOperationWithField, extractEnumFilterValue, selectIndexedFilterByName, isOperatorWithFieldAndArrayOfOperands, isUnion, trimFirstfieldNameToLabel, setShouldShareFilters, CohortStorage, createAppStore, GEN3_API, getRemoteSupportServiceRegistry, isHttpStatusError, MissingServiceConfigurationError, useLazyGetAggsQuery, useCreateRequestMutation, isIndexedFilterSetEmpty, buildGetAggregationQuery, GEN3_GUPPY_API, processHistogramResponse, roundHistogramResponse, selectCSRFToken, ExtractValueFromObject, GEN3_FENCE_API, selectAuthzMappingData, userHasMethodForServiceOnResource as userHasMethodForServiceOnResource$2, useIsUserLoggedIn, GEN3_DOMAIN, DataLibraryStoreMode, useDataLibrary, buildListItemsGroupedByDataset, extractFileDatasetsInRecords, useGetMDSQuery, useGetAggMDSQuery, useAskQuestionMutation, useGetIndexAggMDSQuery, useGetTagsQuery, useGetRawDataAndTotalCountsQuery, humanify, selectCart, selectCartItem, removeItemsFromCart, CART_LIMIT, addItemsToCart, isJSONValue, downloadFromGuppyToBlob, downloadJSONDataFromGuppy, coreStore, fetchJSONDataFromURL, GEN3_MANIFEST_API, useLazyGetMultipleSowerJobStatusQuery, selectAllCohortFiltersCollapsed, isIntersection, useGetCountsQuery, useSubmitSowerJobMutation, toggleCohortBuilderAllFilters, setSharedFilters, useGeneralGQLQuery, convertFilterSetToGqlFilter, customQueryStrForField, useUserRequestQuery, getGen3AppId, createGen3AppWithOwnStore, createAppApiForRTKQ, useLazyGetIndexObjectQuery, useLazyGetIndexdMetdataQuery, useLazyGetDownloadQuery, createGen3App, useGetDictionaryQuery, useGetMetadataByUrlQuery, useGetMetadataByIdQuery, hideModal, useGetAuthzMappingsQuery, selectCurrentModal, useLazyGetSowerOutputQuery, useGetSowerJobListQuery, selectSowerJobDatetimeCache, CoreProvider, HttpMethod, groupSharedFields, useGetCredentialsQuery, useRemoveCredentialMutation, useAddNewCredentialMutation, useUserAuth, useGetExternalLoginsQuery, useGetLoginProvidersQuery, useGetProjectsDetailsQuery, useGetSubmissionsQuery, useLaunchWorkspaceMutation, selectActiveWorkspaceStatus, isFetchBaseQueryError, isSerializedError, normalizeRtkError, setActiveWorkspace, getCurrentTimestamp as getCurrentTimestamp$1, selectWorkspaceStatusFromService, selectActiveWorkspaceId, useGetWorkspaceOptionsQuery, GEN3_WORKSPACE_API, useSetCurrentPayModelMutation, PodStatus, PodConditionType, isWorkspaceRunningOrStopping, isCohortItem, isFileItem, fetchFencePresignedURL, HTTPError, HTTPUserFriendlyErrorMessages, getFederatedLoginStatus, queryMultipleMDSRecords, extractIndexFromDataLibraryCohort, isFilterSet, getNumberOfItemsInDatalist, isAdditionalDataItem, useLazyGetCrosswalkDataQuery, fetchFence as fetchFence$1, selectHeadersWithCSRFToken, useGetIndexObjectQuery } from '@gen3/core';
13
13
  import { usePathname } from 'next/navigation';
14
14
  import { useDeepCompareEffect, useDeepCompareMemo, useDeepCompareCallback } from 'use-deep-compare';
15
15
  import useSWR from 'swr';
@@ -21,7 +21,7 @@ import { notifications, showNotification, cleanNotifications, Notifications } fr
21
21
  import { useThrottledCallback, useResizeObserver, useClickOutside, useScrollIntoView, useDisclosure, useElementSize, useDidUpdate, mergeRefs, useReducedMotion, useDebouncedValue, useViewportSize, useMediaQuery, useLocalStorage, useClipboard, useFullscreenDocument, getHotkeyHandler } from '@mantine/hooks';
22
22
  import { modals, openContextModal, ModalsProvider } from '@mantine/modals';
23
23
  import Markdown from 'react-markdown';
24
- import { MdLogin, MdAddCircle, MdRemoveCircle, MdClose, MdSearch, MdKeyboardArrowUp, MdKeyboardArrowDown, MdDownload, MdTrendingDown, MdReplay, MdHorizontalSplit, MdOutlineHorizontalSplit, MdBarChart, MdAdd, MdContentCopy, MdOutlineArrowBack, MdOutlineArrowForward, MdWarning, MdExpandLess, MdExpandMore, MdFlip, MdLockOutline, MdLibraryAdd, MdKeyboardDoubleArrowLeft, MdOutlineWatchLater, MdOutlineLockOpen, MdOutlineLock, MdUndo, MdInfo, MdDragIndicator, MdShoppingCart, MdPerson, MdSave, MdGroup, MdOutlineBarChart, MdOutlineSearch, MdFormatQuote, MdDelete, MdPlayArrow, MdArrowDropDown, MdOutlineRemoveCircle } from 'react-icons/md';
24
+ import { MdLogin, MdAddCircle, MdRemoveCircle, MdClose, MdSearch, MdKeyboardArrowUp, MdKeyboardArrowDown, MdDownload, MdTrendingDown, MdReplay, MdHorizontalSplit, MdOutlineHorizontalSplit, MdBarChart, MdAdd, MdContentCopy, MdOutlineArrowBack, MdOutlineArrowForward, MdWarning, MdExpandLess, MdExpandMore, MdSettings, MdFlip, MdLockOutline, MdLibraryAdd, MdKeyboardDoubleArrowLeft, MdOutlineWatchLater, MdOutlineLockOpen, MdOutlineLock, MdUndo, MdInfo, MdDragIndicator, MdShoppingCart, MdPerson, MdSave, MdGroup, MdOutlineBarChart, MdOutlineSearch, MdFormatQuote, MdDelete, MdPlayArrow, MdArrowDropDown, MdOutlineRemoveCircle } from 'react-icons/md';
25
25
  import { AiOutlineLogin, AiOutlineDash } from 'react-icons/ai';
26
26
  import { PiDotsThreeCircleThin, PiCaretUpFill, PiCaretDownFill, PiCaretUpDownFill, PiTrash, PiSparkleFill, PiDotsThreeOutlineFill, PiCaretCircleDownFill } from 'react-icons/pi';
27
27
  import Head from 'next/head';
@@ -7863,6 +7863,7 @@ const OverflowTooltippedLabel = ({ children, label, className = 'flex-grow font-
7863
7863
 
7864
7864
  const QueryExpressionContext = /*#__PURE__*/ React__default.createContext({
7865
7865
  displayOnly: false,
7866
+ showLogicalOperators: false,
7866
7867
  fieldsAreFlat: true,
7867
7868
  cohortId: null,
7868
7869
  cohortName: 'default',
@@ -7923,6 +7924,12 @@ const QueryExpressionsExpandedContext = /*#__PURE__*/ React__default.createConte
7923
7924
  ()=>null
7924
7925
  ]);
7925
7926
 
7927
+ const LogicalOperatorLabel = ({ operator, className = '' })=>/*#__PURE__*/ jsx("span", {
7928
+ className: `flex items-center justify-center px-1 text-xs font-bold uppercase text-base-darkest ${className}`,
7929
+ "data-testid": `query-logical-operator-${operator}`,
7930
+ children: operator
7931
+ });
7932
+
7926
7933
  const RemoveButton$1 = ({ value })=>/*#__PURE__*/ jsx(ActionIcon, {
7927
7934
  size: "xs",
7928
7935
  color: "base.0",
@@ -7984,9 +7991,23 @@ const isRangeOperation = (x)=>{
7984
7991
  const isNestedFilter = (x)=>{
7985
7992
  return 'path' in x;
7986
7993
  };
7987
- const IncludeExcludeQueryElement = ({ index, field, path, operator, operands, displayOnly = false })=>{
7994
+ const buildSetOperation = (field, operator, operands, combineMode)=>combineMode === 'and' ? {
7995
+ operator: 'and',
7996
+ operands: operands.map((value)=>({
7997
+ operator,
7998
+ field,
7999
+ operands: [
8000
+ value
8001
+ ]
8002
+ }))
8003
+ } : {
8004
+ operator,
8005
+ field,
8006
+ operands
8007
+ };
8008
+ const IncludeExcludeQueryElement = ({ index, field, path, operator, operands, displayOnly = false, combineMode = 'or' })=>{
7988
8009
  const [queryExpressionsExpanded, setQueryExpressionsExpanded] = useContext(QueryExpressionsExpandedContext);
7989
- const { cohortId: currentCohortId, useRemoveFilter, useUpdateFilters, shouldShowSummary, fieldsAreFlat } = useContext(QueryExpressionContext);
8010
+ const { cohortId: currentCohortId, useRemoveFilter, useUpdateFilters, shouldShowSummary, fieldsAreFlat, showLogicalOperators } = useContext(QueryExpressionContext);
7990
8011
  const removeCohortFilter = useRemoveFilter();
7991
8012
  const updateCohortFilter = useUpdateFilters();
7992
8013
  useDeepCompareEffect(()=>{
@@ -8077,45 +8098,45 @@ const IncludeExcludeQueryElement = ({ index, field, path, operator, operands, di
8077
8098
  gap: "xs",
8078
8099
  children: operandsArray.map((x, i)=>{
8079
8100
  const value = x.toString();
8080
- return /*#__PURE__*/ jsx(Badge, {
8081
- "data-testid": `query-rep-${field}-${value}-${i}`,
8082
- variant: "filled",
8083
- color: "accent.5",
8084
- size: "md",
8085
- className: `normal-case items-center max-w-[162px] cursor-pointer hover:bg-accent-darker pl-2 ${displayOnly ? 'pr-3' : 'pr-0'}`,
8086
- rightSection: !displayOnly && /*#__PURE__*/ jsx(RemoveButton$1, {
8087
- value: value
8088
- }),
8089
- onClick: ()=>{
8090
- if (displayOnly) return;
8091
- const newOperands = operandsArray.filter((o)=>o !== x);
8092
- if (currentCohortId && newOperands.length === 0) {
8093
- setQueryExpressionsExpanded({
8094
- type: 'clear',
8095
- cohortId: currentCohortId,
8096
- field: fieldToUpdate
8097
- });
8098
- removeCohortFilter(index, fieldToUpdate);
8099
- } else {
8100
- updateCohortFilter(index, fieldToUpdate, fieldsAreFlat ? {
8101
- operator: operator,
8102
- field: field,
8103
- operands: newOperands
8104
- } : buildNestedFilterForOperation(fieldToUpdate, {
8105
- operator: operator,
8106
- field: field,
8107
- operands: newOperands
8108
- }));
8109
- }
8110
- },
8111
- children: /*#__PURE__*/ jsx(OverflowTooltippedLabel, {
8112
- label: value,
8113
- className: "flex-grow text-md font-content",
8114
- children: /*#__PURE__*/ jsx(QueryRepresentationLabel, {
8115
- value: value.toString(),
8116
- field: field
8101
+ return /*#__PURE__*/ jsxs(React__default.Fragment, {
8102
+ children: [
8103
+ showLogicalOperators && i > 0 && /*#__PURE__*/ jsx(LogicalOperatorLabel, {
8104
+ operator: combineMode
8105
+ }),
8106
+ /*#__PURE__*/ jsx(Badge, {
8107
+ "data-testid": `query-rep-${field}-${value}-${i}`,
8108
+ variant: "filled",
8109
+ color: "accent.5",
8110
+ size: "md",
8111
+ className: `normal-case items-center max-w-[162px] cursor-pointer hover:bg-accent-darker pl-2 ${displayOnly ? 'pr-3' : 'pr-0'}`,
8112
+ rightSection: !displayOnly && /*#__PURE__*/ jsx(RemoveButton$1, {
8113
+ value: value
8114
+ }),
8115
+ onClick: ()=>{
8116
+ if (displayOnly) return;
8117
+ const newOperands = operandsArray.filter((o)=>o !== x);
8118
+ if (currentCohortId && newOperands.length === 0) {
8119
+ setQueryExpressionsExpanded({
8120
+ type: 'clear',
8121
+ cohortId: currentCohortId,
8122
+ field: fieldToUpdate
8123
+ });
8124
+ removeCohortFilter(index, fieldToUpdate);
8125
+ } else {
8126
+ const updatedOperation = buildSetOperation(field, operator, newOperands, combineMode);
8127
+ updateCohortFilter(index, fieldToUpdate, fieldsAreFlat ? updatedOperation : buildNestedFilterForOperation(fieldToUpdate, updatedOperation));
8128
+ }
8129
+ },
8130
+ children: /*#__PURE__*/ jsx(OverflowTooltippedLabel, {
8131
+ label: value,
8132
+ className: "flex-grow text-md font-content",
8133
+ children: /*#__PURE__*/ jsx(QueryRepresentationLabel, {
8134
+ value: value.toString(),
8135
+ field: field
8136
+ })
8137
+ })
8117
8138
  })
8118
- })
8139
+ ]
8119
8140
  }, `query-rep-${field}-${value}-${i}`);
8120
8141
  })
8121
8142
  })
@@ -8363,6 +8384,25 @@ const QueryElement = ({ index, field, path, children, displayOnly = false })=>{
8363
8384
  upper: f.operands[1]
8364
8385
  }, f.operands[0].field);
8365
8386
  }
8387
+ const enumOperands = f.operands.filter(isIncludes);
8388
+ const field = enumOperands[0]?.field;
8389
+ if (enumOperands.length === f.operands.length && field && enumOperands.every((operand)=>operand.field === field)) {
8390
+ return /*#__PURE__*/ jsx(QueryElement, {
8391
+ field: field,
8392
+ index: this.index,
8393
+ path: this.path,
8394
+ displayOnly: this.displayOnly,
8395
+ children: /*#__PURE__*/ jsx(IncludeExcludeQueryElement, {
8396
+ field: field,
8397
+ operator: enumOperands[0].operator,
8398
+ operands: enumOperands.flatMap((operand)=>operand.operands),
8399
+ combineMode: "and",
8400
+ index: this.index,
8401
+ path: this.path,
8402
+ displayOnly: this.displayOnly
8403
+ })
8404
+ }, field);
8405
+ }
8366
8406
  // TODO: handle deeper nesting
8367
8407
  return null;
8368
8408
  };
@@ -8679,7 +8719,7 @@ const QueryExpressionSection = ({ index, showImportExport = false, displayOnly =
8679
8719
  const [filtersSectionCollapsed, setFiltersSectionCollapsed] = useState(true);
8680
8720
  const filtersRef = useRef(null);
8681
8721
  const [QESectionHeight, setQESectionHeight] = useState(0);
8682
- const { cohortName, cohortId, useClearCohortFilters, useGetFilters } = useContext(QueryExpressionContext);
8722
+ const { cohortName, cohortId, showLogicalOperators, useClearCohortFilters, useGetFilters } = useContext(QueryExpressionContext);
8683
8723
  const clearCohortFilters = useClearCohortFilters();
8684
8724
  const filters = useGetFilters(index);
8685
8725
  useDeepCompareEffect(()=>{
@@ -8820,8 +8860,16 @@ const QueryExpressionSection = ({ index, showImportExport = false, displayOnly =
8820
8860
  "data-testid": "text-no-active-cohort-filter",
8821
8861
  className: "flex items-center font-content h-10",
8822
8862
  children: "No filters currently applied."
8823
- }) : Object.keys(filters.root).map((k)=>{
8824
- return convertFilterToComponent(filters.root[k], index, '.', displayOnly);
8863
+ }) : Object.keys(filters.root).map((k, indexInFilters)=>{
8864
+ return /*#__PURE__*/ jsxs(React__default.Fragment, {
8865
+ children: [
8866
+ showLogicalOperators && indexInFilters > 0 && /*#__PURE__*/ jsx(LogicalOperatorLabel, {
8867
+ operator: filters.mode,
8868
+ className: "mr-1 mb-2"
8869
+ }),
8870
+ convertFilterToComponent(filters.root[k], index, '.', displayOnly)
8871
+ ]
8872
+ }, k);
8825
8873
  })
8826
8874
  })
8827
8875
  ]
@@ -8868,7 +8916,7 @@ const SUMMARY_THRESHOLD = 10;
8868
8916
  */ const DefaultShouldShowSummary = (field, count)=>{
8869
8917
  return count > SUMMARY_THRESHOLD;
8870
8918
  };
8871
- const QueryExpression = ({ index, shouldShowSummary = DefaultShouldShowSummary, hooks, fieldsAreFlat = true })=>{
8919
+ const QueryExpression = ({ index, shouldShowSummary = DefaultShouldShowSummary, hooks, fieldsAreFlat = true, showLogicalOperators = false })=>{
8872
8920
  const currentCohortId = useCoreSelector((state)=>selectCurrentCohortId$1(state));
8873
8921
  const currentCohortName = useCoreSelector((state)=>selectCurrentCohortName$1(state));
8874
8922
  return /*#__PURE__*/ jsx(QueryExpressionContext.Provider, {
@@ -8876,6 +8924,7 @@ const QueryExpression = ({ index, shouldShowSummary = DefaultShouldShowSummary,
8876
8924
  cohortName: currentCohortName,
8877
8925
  cohortId: currentCohortId,
8878
8926
  displayOnly: false,
8927
+ showLogicalOperators,
8879
8928
  fieldsAreFlat: fieldsAreFlat,
8880
8929
  shouldShowSummary: shouldShowSummary,
8881
8930
  useClearCohortFilters: ()=>{
@@ -9377,6 +9426,7 @@ const classifyFacets = (data, index, fieldMapping = [], facetDefinitionsFromConf
9377
9426
  moveValuesToBottom: facetDef?.moveValuesToBottom,
9378
9427
  excludeValues: facetDef?.excludeValues,
9379
9428
  defaultSort: facetDef?.defaultSort,
9429
+ showMatchModeSelector: facetDef?.showMatchModeSelector,
9380
9430
  valueLabel: facetDef?.valueLabel,
9381
9431
  range: facetDef?.range ? {
9382
9432
  minimum: facetDef.range?.minimum ?? Math.floor(Number(value[0].key[0])),
@@ -10681,7 +10731,7 @@ inline-flex
10681
10731
  items-center
10682
10732
  hover:text-primary-lightest
10683
10733
  `;
10684
- const controlsIconStyle = 'text-secondary-contrast hover:text-secondary-lighter';
10734
+ const controlsIconStyle = 'text-secondary-contrast hover:text-secondary-contrast-lighter';
10685
10735
  const FacetText = tw.div`
10686
10736
  text-secondary-contrast font-heading font-semibold text-sm break-words
10687
10737
  `;
@@ -10804,12 +10854,11 @@ flex items-start justify-between items-center flex-nowrap bg-secondary px-1.5 ro
10804
10854
  if (toggleExpandFilter) toggleExpandFilter(field, true);
10805
10855
  if (toggleSettings) toggleSettings();
10806
10856
  },
10807
- "aria-label": "Search",
10857
+ "aria-label": "Filter settings",
10808
10858
  className: header.iconStyle,
10809
- children: /*#__PURE__*/ jsx(Icon, {
10810
- width: 12,
10811
- height: 12,
10812
- icon: "gen3:settings",
10859
+ children: /*#__PURE__*/ jsx(MdSettings, {
10860
+ size: "1.35em",
10861
+ className: header.iconStyle,
10813
10862
  "aria-hidden": "true"
10814
10863
  })
10815
10864
  })
@@ -12168,8 +12217,8 @@ const FacetEnumList = ({ field, facetName, hooks, valueLabel, isSettings = false
12168
12217
  const searchInputRef = useRef(null);
12169
12218
  const settingRef = useRef(null);
12170
12219
  const [searchTerm, setSearchTerm] = useState('');
12171
- // const [combineMode, setCombineMode] = useState<'or' | 'and'>('or');
12172
12220
  const { data, enumFilters, combineMode, isSuccess, error } = hooks.useGetFacetData(field);
12221
+ const [selectedCombineMode, setSelectedCombineMode] = useState(combineMode ?? 'or');
12173
12222
  const [selectedEnums, setSelectedEnums] = useState(enumFilters ?? []);
12174
12223
  const totalCount = hooks?.useTotalCounts ? hooks.useTotalCounts() : 1;
12175
12224
  const clearFilters = hooks.useClearFilter();
@@ -12203,6 +12252,17 @@ const FacetEnumList = ({ field, facetName, hooks, valueLabel, isSettings = false
12203
12252
  }, [
12204
12253
  enumFilters
12205
12254
  ]);
12255
+ useEffect(()=>{
12256
+ // Existing filters are the source of truth when loading or externally
12257
+ // updating a cohort. Keep a user's selected mode when the facet is empty
12258
+ // so they can choose "Match all" before selecting values.
12259
+ if ((enumFilters?.length ?? 0) > 0) {
12260
+ setSelectedCombineMode(combineMode ?? 'or');
12261
+ }
12262
+ }, [
12263
+ combineMode,
12264
+ enumFilters
12265
+ ]);
12206
12266
  const maxValuesToDisplay = DEFAULT_VISIBLE_ITEMS$2;
12207
12267
  // update filters when checkbox is selected
12208
12268
  const handleChange = (value, checked)=>{
@@ -12217,13 +12277,15 @@ const FacetEnumList = ({ field, facetName, hooks, valueLabel, isSettings = false
12217
12277
  ] : [
12218
12278
  value
12219
12279
  ];
12220
- updateFacetEnum(field, updated, updateFacetFilters, clearFilters, combineMode);
12280
+ updateFacetEnum(field, updated, updateFacetFilters, clearFilters, selectedCombineMode);
12221
12281
  } else {
12222
12282
  const updated = selectedEnums?.filter((x)=>x !== value);
12223
- updateFacetEnum(field, updated ?? [], updateFacetFilters, clearFilters, combineMode);
12283
+ updateFacetEnum(field, updated ?? [], updateFacetFilters, clearFilters, selectedCombineMode);
12224
12284
  }
12225
12285
  };
12226
12286
  const handleCombineModeChange = (mode)=>{
12287
+ setSelectedCombineMode(mode);
12288
+ if ((selectedEnums?.length ?? 0) === 0) return;
12227
12289
  updateFacetEnum(field, selectedEnums ?? [], updateFacetFilters, clearFilters, mode);
12228
12290
  };
12229
12291
  const [facetChartData, setFacetChartData] = useState({
@@ -12358,23 +12420,24 @@ const FacetEnumList = ({ field, facetName, hooks, valueLabel, isSettings = false
12358
12420
  indicator: 'bg-accent text-accent-contrast'
12359
12421
  },
12360
12422
  ref: settingRef,
12361
- value: combineMode,
12423
+ value: selectedCombineMode,
12424
+ "aria-label": "How selected facet values are matched",
12362
12425
  onChange: (value)=>{
12363
12426
  handleCombineModeChange(value);
12364
12427
  },
12365
12428
  data: [
12366
12429
  {
12367
- label: 'AND',
12368
- value: 'and'
12430
+ label: 'Match any',
12431
+ value: 'or'
12369
12432
  },
12370
12433
  {
12371
- label: 'OR',
12372
- value: 'or'
12434
+ label: 'Match all',
12435
+ value: 'and'
12373
12436
  }
12374
12437
  ]
12375
12438
  }),
12376
12439
  /*#__PURE__*/ jsx(Tooltip, {
12377
- label: "Combine filters with AND or OR 2",
12440
+ label: "Match any includes cases with at least one selected value. Match all requires every selected value.",
12378
12441
  children: /*#__PURE__*/ jsx(Icon, {
12379
12442
  icon: "gen3:info",
12380
12443
  height: 12,
@@ -13210,6 +13273,7 @@ const createFacetCard = ({ facetDefinition, valueLabel, hooks: dataFunctions, fa
13210
13273
  width: width,
13211
13274
  hooks: dataFunctions,
13212
13275
  showPercent: showPercent,
13276
+ showSettings: facetDefinition?.showMatchModeSelector,
13213
13277
  sharedWithIndices: facetDefinition?.sharedWithIndices,
13214
13278
  defaultSort: facetDefinition?.defaultSort,
13215
13279
  moveValuesToBottom: facetDefinition?.moveValuesToBottom ?? [],
@@ -17436,17 +17500,11 @@ const SinglePageStudyDetailsPanel = ({ data, studyConfig, authorization })=>{
17436
17500
  });
17437
17501
  };
17438
17502
 
17439
- const userCanRegisterStudy = (userInfo, studyRegistrationAuthZ)=>{
17440
- const actions = userInfo?.authz && studyRegistrationAuthZ ? userInfo.authz[studyRegistrationAuthZ] : undefined;
17441
- const method = 'access';
17442
- const service = 'study_registration';
17443
- return actions?.some((x)=>(x.service === service || x.service === '*') && (x.method === method || x.method === '*')) ?? false;
17444
- };
17445
-
17446
17503
  const StudyDetailsHeaderButtons = ({ onClose, permalink })=>{
17447
17504
  const userInfo = useCoreSelector((state)=>selectUserDetails(state));
17448
17505
  const requiresLogin = !userInfo.active;
17449
17506
  const { discoveryConfig: config } = useDiscoveryContext();
17507
+ const router = useRouter();
17450
17508
  const index = config.minimalFieldMapping.uid;
17451
17509
  const { studyDetails } = useStudyContext();
17452
17510
  const studyUID = toString(studyDetails[index]);
@@ -17454,44 +17512,55 @@ const StudyDetailsHeaderButtons = ({ onClose, permalink })=>{
17454
17512
  const studyRegistrationAuthZ = studyDetails.registration_authz;
17455
17513
  const studyProjectNumber = studyDetails.project_number;
17456
17514
  const showSubmitButton = config.detailView.showSubmitButton;
17457
- const router = useRouter();
17458
- const isStudyRegisterable = userCanRegisterStudy(userInfo, studyRegistrationAuthZ);
17459
- const handleRegisterButtonClick = ()=>{
17515
+ const userAuthMapping = useCoreSelector((state)=>selectAuthzMappingData(state));
17516
+ const userHasStudyRegistrationAccess = userHasMethodForServiceOnResource$2('access', 'study_registration', toString(studyRegistrationAuthZ), userAuthMapping);
17517
+ const isStudyRegistered = studyDetails.is_registered;
17518
+ // Study is not yet registered — show register/request-access/login button
17519
+ const showStudyRegistrationButton = showSubmitButton && isStudyRegistered === false;
17520
+ // Study is registered — show appropriate VLMD submission button based on auth state
17521
+ const showSubmitVLMDButton = showSubmitButton && isStudyRegistered && !requiresLogin && userHasStudyRegistrationAccess;
17522
+ const showRequestVLMDAccessButton = showSubmitButton && isStudyRegistered && !requiresLogin && !userHasStudyRegistrationAccess;
17523
+ const showLoginToSubmitVLMDButton = showSubmitButton && isStudyRegistered && requiresLogin;
17524
+ const studyNavQuery = {
17525
+ studyUID,
17526
+ studyName,
17527
+ studyRegistrationAuthZ: toString(studyRegistrationAuthZ),
17528
+ studyProjectNumber
17529
+ };
17530
+ const handleStudyRegistrationClick = ()=>{
17460
17531
  if (requiresLogin) {
17461
17532
  void router.push('/Login');
17462
- } else if (isStudyRegisterable) {
17533
+ } else if (userHasStudyRegistrationAccess) {
17463
17534
  void router.push({
17464
17535
  pathname: '/study-reg',
17465
- query: {
17466
- studyUID: studyUID,
17467
- studyName: studyName,
17468
- studyRegistrationAuthZ: studyRegistrationAuthZ,
17469
- studyProjectNumber: studyProjectNumber
17470
- }
17536
+ query: studyNavQuery
17471
17537
  }, '/study-reg');
17472
17538
  } else {
17473
17539
  void router.push({
17474
17540
  pathname: '/study-reg/request-access',
17475
- query: {
17476
- studyUID: studyUID,
17477
- studyName: studyName,
17478
- studyRegistrationAuthZ: studyRegistrationAuthZ,
17479
- studyProjectNumber: studyProjectNumber
17480
- }
17541
+ query: studyNavQuery
17481
17542
  }, '/study-reg/request-access');
17482
17543
  }
17483
17544
  };
17484
- const submitButtonText = useMemo(()=>{
17485
- if (requiresLogin) {
17486
- return 'Login to Register This Study';
17487
- } else if (isStudyRegisterable) {
17488
- return 'Register Study';
17489
- } else {
17490
- return `Request Access to Register this Study`;
17491
- }
17545
+ const handleSubmitVLMDClick = ()=>{
17546
+ void router.push({
17547
+ pathname: '/vlmd-submission',
17548
+ query: studyNavQuery
17549
+ }, '/vlmd-submission');
17550
+ };
17551
+ const handleRequestVLMDAccessClick = ()=>{
17552
+ void router.push({
17553
+ pathname: '/vlmd-submission/request-access',
17554
+ query: studyNavQuery
17555
+ }, '/vlmd-submission/request-access');
17556
+ };
17557
+ const studyRegistrationButtonText = useMemo(()=>{
17558
+ if (requiresLogin) return 'Login to Register This Study';
17559
+ if (userHasStudyRegistrationAccess) return 'Register This Study';
17560
+ return 'Request Access to Register This Study';
17492
17561
  }, [
17493
17562
  requiresLogin,
17494
- isStudyRegisterable
17563
+ userHasStudyRegistrationAccess
17495
17564
  ]);
17496
17565
  return /*#__PURE__*/ jsxs(Fragment, {
17497
17566
  children: [
@@ -17501,15 +17570,45 @@ const StudyDetailsHeaderButtons = ({ onClose, permalink })=>{
17501
17570
  variant: "outline",
17502
17571
  children: "Back"
17503
17572
  }),
17504
- showSubmitButton && /*#__PURE__*/ jsx(Button, {
17573
+ showStudyRegistrationButton && /*#__PURE__*/ jsx(Button, {
17505
17574
  leftSection: /*#__PURE__*/ jsx(FiLogIn, {
17506
17575
  size: 14
17507
17576
  }),
17508
17577
  variant: "subtle",
17509
17578
  color: "black",
17510
17579
  size: "xs",
17511
- onClick: handleRegisterButtonClick,
17512
- children: submitButtonText
17580
+ onClick: handleStudyRegistrationClick,
17581
+ children: studyRegistrationButtonText
17582
+ }),
17583
+ showSubmitVLMDButton && /*#__PURE__*/ jsx(Button, {
17584
+ leftSection: /*#__PURE__*/ jsx(FiLogIn, {
17585
+ size: 14
17586
+ }),
17587
+ variant: "subtle",
17588
+ color: "black",
17589
+ size: "xs",
17590
+ onClick: handleSubmitVLMDClick,
17591
+ children: "Submit Variable-level Metadata"
17592
+ }),
17593
+ showRequestVLMDAccessButton && /*#__PURE__*/ jsx(Button, {
17594
+ leftSection: /*#__PURE__*/ jsx(FiLogIn, {
17595
+ size: 14
17596
+ }),
17597
+ variant: "subtle",
17598
+ color: "black",
17599
+ size: "xs",
17600
+ onClick: handleRequestVLMDAccessClick,
17601
+ children: "Request Access to Submit Variable-level Metadata"
17602
+ }),
17603
+ showLoginToSubmitVLMDButton && /*#__PURE__*/ jsx(Button, {
17604
+ leftSection: /*#__PURE__*/ jsx(FiLogIn, {
17605
+ size: 14
17606
+ }),
17607
+ variant: "subtle",
17608
+ color: "black",
17609
+ size: "xs",
17610
+ onClick: ()=>void router.push('/Login'),
17611
+ children: "Login to Submit Variable-level Metadata"
17513
17612
  }),
17514
17613
  /*#__PURE__*/ jsx(CopyButton, {
17515
17614
  value: permalink,
@@ -30018,7 +30117,7 @@ const DiscoveryPageGetServerSideProps = async ()=>{
30018
30117
  }
30019
30118
  };
30020
30119
 
30021
- const QueryPanel = dynamic(()=>import('./QueryPanel-C3JVntIb.js'), {
30120
+ const QueryPanel = dynamic(()=>import('./QueryPanel-C0nNrzSx.js'), {
30022
30121
  ssr: false
30023
30122
  });
30024
30123
  const QueryPage = ({ headerProps, footerProps, configuration: queryProps })=>{
@@ -32733,7 +32832,7 @@ const AdminAuthZPageGetServerSideProps = async ()=>{
32733
32832
  * @param {string} props.keyString - For mantine form to identify elements
32734
32833
  * @param {FormContentProps['form']} props.form - @mantine/form useForm() object
32735
32834
  * @returns {JSX.Element} A JSX element that renders the content dynamically based on the input type and properties.
32736
- */ const FormContent = ({ text, label, initialValue, dropdownData, description, placeholder, disabled, required, tooltip, className = '', type = ContentType.Text, keyString, form })=>{
32835
+ */ const FormContent = ({ text, label, initialValue, dropdownData, description, placeholder, disabled, required, tooltip, className = '', autosize = false, type = ContentType.Text, keyString, form })=>{
32737
32836
  //code for tooltips on form items
32738
32837
  let inputContainer;
32739
32838
  if (tooltip) {
@@ -32859,7 +32958,8 @@ const AdminAuthZPageGetServerSideProps = async ()=>{
32859
32958
  disabled: disabled || form.submitting,
32860
32959
  required: required,
32861
32960
  inputContainer: inputContainer,
32862
- ...form.getInputProps(keyString)
32961
+ ...form.getInputProps(keyString),
32962
+ autosize: autosize
32863
32963
  }, form.key(keyString));
32864
32964
  }
32865
32965
  default:
@@ -34005,7 +34105,7 @@ const ExternalLoginsStatus = ()=>{
34005
34105
  };
34006
34106
 
34007
34107
  const PaymentNumberToString = (x, undefinedValue = 'N/A', precision = 2)=>{
34008
- if (!x || Number.isNaN(x)) return undefinedValue;
34108
+ if (typeof x !== 'number' || Number.isNaN(x)) return undefinedValue;
34009
34109
  return x.toFixed(precision);
34010
34110
  };
34011
34111
 
@@ -41827,4 +41927,4 @@ const FileSummary = ({ guid })=>{
41827
41927
  };
41828
41928
 
41829
41929
  export { DiscoveryProvider as $, ACTIVITY_CHANNEL as A, BAD_DATA_MESSAGE as B, CardContainer as C, CollapsableCharts as D, CollapsableSidebar as E, ColorThemePage as F, ColorThemePageGetServerSideProps as G, ContentSource as H, CountsValue as I, CreateCredentialsAPIKeyModal as J, CrosswalkPage as K, CrosswalkPageGetServerSideProps as L, Custom403Page as M, Custom403PageGetServerSideProps as N, Custom404Page as O, Custom404PageGetServerSideProps as P, DAYS_IN_YEAR as Q, DEFAULT_MAXIMUM as R, DEFAULT_MINIMUM as S, DEFAULT_VISIBLE_ITEMS$2 as T, DictionaryPage as U, DataLibraryPage as V, DataLibraryPageGetServerSideProps as W, DefaultAuthorizedRoutesConfig as X, DictionaryPageGetServerSideProps as Y, DictionaryWithContext as Z, DiscoveryCellRendererFactory as _, AISearchPageGetServerSideProps as a, ProfileProvider as a$, DiscoveryIndexPanel as a0, DiscoveryPage as a1, DiscoveryPageGetServerSideProps as a2, DownloadButton as a3, DownloadsPanel as a4, DropdownButton as a5, DropdownPanel as a6, DropdownWithIcon as a7, EmptyTableMessage as a8, EnumFacet as a9, HoverLink as aA, IconButton as aB, InfoRolloverButton as aC, JSONObjectDownloadButton as aD, LandingPage as aE, LandingPageGetServerSideProps as aF, LoginButton as aG, LoginPage as aH, LoginPageGetServerSideProps as aI, LoginPanel as aJ, LoginProvidersPanel as aK, MessageCard as aL, MessagePage as aM, MetadataDictionary as aN, MultiSelectValueFacet as aO, NavPageLayout as aP, NavigationBar as aQ, NavigationButton as aR, NavigationRail as aS, NoAccessModal as aT, NotebookLitePage as aU, NotebookLitePageGetStaticProps as aV, OverflowTooltippedLabel as aW, PanelErrorBoundary as aX, Profile as aY, ProfilePage as aZ, ProfilePageGetServerSideProps as a_, EnumFacetChart as aa, ErrorCard as ab, ExactValueFacet as ac, ExplorerPage as ad, ExplorerPageGetServerSideProps as ae, ExplorerPageGetServerSidePropsForConfigId as af, ExplorerTable as ag, ExplorerTableCellRendererFactory as ah, ExplorerTableDetailsPanelFactory as ai, FacetControlsHeader as aj, FacetExpander as ak, FacetSelector as al, FacetSortPanel as am, FacetTabs as an, FileSummary as ao, FiltersPanel as ap, FirstTimeModal as aq, FixedNavPageLayout as ar, Footer as as, Gen3Button as at, Gen3ButtonReverse as au, Gen3Link as av, Gen3ModalsProvider as aw, Gen3Provider as ax, GqlQueryEditor as ay, Header$1 as az, AccessLevel as b, gen3Modals as b$, ProtectedContent as b0, ProtectedContentUI as b1, ProtectedOverlay as b2, QueryExpression as b3, QueryExpressionContext as b4, QueryExpressionSection as b5, QueryPage as b6, QueryPageGetServerSideProps as b7, RangeFacet as b8, ReactECharts as b9, Workspace as bA, WorkspaceNoAccessPage as bB, WorkspaceNoAccessPageServerSideProps as bC, WorkspacePage as bD, WorkspacePageGetServerSideProps as bE, accessibleFieldName as bF, addIntersectionToIncludes as bG, addUnion as bH, analysisApiCohortDiscovery as bI, capitalize as bJ, classifyFacets as bK, compareKeysAscending as bL, compareKeysDescending as bM, computeRowSpan as bN, convertMinutesToMilliseconds as bO, convertPathsToTree as bP, convertSecondsToMilliseconds as bQ, convertToStringArray as bR, createCSSVariables as bS, createLabelFromHistogramData as bT, createMantineTheme as bU, credentialsLogin as bV, credentialsLogout as bW, extractObjectKey as bX, extractRangeValues$1 as bY, filterAggregationsDataKeys as bZ, focusStyles as b_, Repository as ba, RepositoryPage as bb, RepositoryPageGetServerSideProps as bc, ResourcesFilters as bd, SPECIAL_CASE_FIELDS as be, SegmentedControl as bf, SessionExpiredModal as bg, SinglePageStudyDetailsPanel as bh, StaticNotebookIFrame as bi, StudyDetailsPanel as bj, StudyGroup as bk, StudyGroupPanel as bl, StudyProvider as bm, SubmissionPage as bn, SubmissionPageGetServerSideProps as bo, TabbedCohortBuilder as bp, TabbedCohortBuilderPage as bq, TabbedCohortBuilderPageGetServerSideProps as br, TabbedPanel as bs, TableXPositionContext as bt, TagCloud as bu, TailwindConfig as bv, TopBar as bw, UploadJSONButton as bx, User as by, WarningCard as bz, AccordionPanel as c, getAllFieldsFromFilterConfigs as c0, getByPath as c1, getCurrentUnixTimestamp as c2, getFormattedTimestamp$1 as c3, getHighResolutionTimestamp as c4, getNavPageLayoutPropsFromConfig as c5, getParamsValueAsString as c6, getTagInfo as c7, hasOwnProperty as c8, isArrayOfString as c9, removeMultipleSlashes as cA, removeUnion as cB, resourcePathFromProjectID as cC, sessionLogout as cD, handler as cE, stripTrailingSlash as cF, toDisplayName$1 as cG, truncateString as cH, typography as cI, unixTimeToString as cJ, updateFacetEnum as cK, useClearFilters$1 as cL, useDiscoveryContext as cM, useExtractEnumFilterValues as cN, useExtractRangeFilterValues as cO, useFieldNameToLabel as cP, useGetFacetFilters$1 as cQ, useGuppyActionButton as cR, useUpdateFilters$1 as cS, useUpdateFiltersFlat as cT, userHasMethodForServiceOnResource$1 as cU, validateObjectHasRequiredFields as cV, withBasePath as cW, GqlQueryEditor$1 as cX, isEnumFacetResponse as ca, isHeaderMetadata as cb, isPropertyKey as cc, isTextTransform$1 as cd, isTimeGreaterThan as ce, itemsInCart as cf, mapFacetSortToSortType as cg, measureExecutionTime as ch, mergeDefaultTailwindClassnames as ci, minutesToMilliseconds as cj, processBucketData as ck, processDefinedRangeData as cl, processLabel$1 as cm, processRangeData as cn, processRangeKeyLabel as co, registerCohortBuilderDefaultPreviewRenderers as cp, registerCohortDiscoveryApp as cq, registerCohortSimilarityApp as cr, registerDefaultDiscoveryDataLoaders as cs, registerDiscoveryDefaultCellRenderers as ct, registerDownloadButtonAction as cu, registerExplorerDefaultCellRenderers as cv, registerIGVApp as cw, registerMetadataSchemaApp as cx, removeIntersectionFromEnum as cy, removeKey$1 as cz, ActionBar as d, ActionButton as e, AdminAuthZPageGetServerSideProps as f, AiSearch as g, AISearchPage as h, AnalysisCenter as i, AnalysisCenterWithSections as j, AnalysisEditorPage as k, AnalysisEditorPageGetServerSideProps as l, AnalysisPage as m, AnalysisPageGetServerSideProps as n, AnalysisWithCloseButton as o, AuthzPage as p, Banner as q, BaseModal as r, Charts as s, ClinicalDataAnalysisPage as t, ClinicalDataAnalysisServerSideProps as u, CohortActionButton as v, CohortBuilder$1 as w, CohortDropdownActionButton as x, CohortManager$1 as y, CohortManagerAndExpression as z };
41830
- //# sourceMappingURL=index-B_0ks9Pi.js.map
41930
+ //# sourceMappingURL=index-CDgLCUE3.js.map