synapse-react-client 4.0.21 → 4.0.23

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 (191) hide show
  1. package/dist/SWC.index.d.ts +1 -0
  2. package/dist/SWC.index.d.ts.map +1 -1
  3. package/dist/SWC.index.js +2 -1
  4. package/dist/SWC.index.js.map +1 -1
  5. package/dist/assets/icons/GeneticsIcon.d.ts +3 -0
  6. package/dist/assets/icons/GeneticsIcon.d.ts.map +1 -0
  7. package/dist/assets/icons/GeneticsIcon.js +14 -0
  8. package/dist/assets/icons/GeneticsIcon.js.map +1 -0
  9. package/dist/components/CardContainer/CardContainer.d.ts.map +1 -1
  10. package/dist/components/CardContainer/CardContainer.js +43 -49
  11. package/dist/components/CardContainer/CardContainer.js.map +1 -1
  12. package/dist/components/CardContainerLogic/CardContainerLogic.d.ts +13 -0
  13. package/dist/components/CardContainerLogic/CardContainerLogic.d.ts.map +1 -1
  14. package/dist/components/CardContainerLogic/CardContainerLogic.js +64 -40
  15. package/dist/components/CardContainerLogic/CardContainerLogic.js.map +1 -1
  16. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js +1 -1
  17. package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
  18. package/dist/components/DataExplorer/DataExplorer.css +1 -1
  19. package/dist/components/DataExplorer/DataExplorer.module.js +16 -16
  20. package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -1
  21. package/dist/components/DataExplorer/DataExplorer.module.scss +0 -1
  22. package/dist/components/DataGrid/DataGrid.d.ts +1 -0
  23. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
  24. package/dist/components/DataGrid/DataGrid.js +72 -72
  25. package/dist/components/DataGrid/DataGrid.js.map +1 -1
  26. package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
  27. package/dist/components/DataGrid/SynapseGrid.js +209 -206
  28. package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
  29. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.d.ts +2 -1
  30. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.d.ts.map +1 -1
  31. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js +51 -42
  32. package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js.map +1 -1
  33. package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
  34. package/dist/components/DataGrid/useDataGridWebsocket.js +68 -67
  35. package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
  36. package/dist/components/DataGrid/utils/columnFactory.d.ts +1 -0
  37. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  38. package/dist/components/DataGrid/utils/columnFactory.js +4 -3
  39. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  40. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts +1 -1
  41. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
  42. package/dist/components/DataGrid/utils/modelColsToGrid.js +15 -14
  43. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  44. package/dist/components/DataGrid/utils/normalizeWebsocketError.d.ts +7 -0
  45. package/dist/components/DataGrid/utils/normalizeWebsocketError.d.ts.map +1 -0
  46. package/dist/components/DataGrid/utils/normalizeWebsocketError.js +8 -0
  47. package/dist/components/DataGrid/utils/normalizeWebsocketError.js.map +1 -0
  48. package/dist/components/EntityCitation/EntityCitation.d.ts.map +1 -1
  49. package/dist/components/EntityCitation/EntityCitation.js +23 -8
  50. package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
  51. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.d.ts +18 -0
  52. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.d.ts.map +1 -0
  53. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +112 -0
  54. package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js.map +1 -0
  55. package/dist/components/GenericCard/DuoTermTags/duoTerms.d.ts +31 -0
  56. package/dist/components/GenericCard/DuoTermTags/duoTerms.d.ts.map +1 -0
  57. package/dist/components/GenericCard/DuoTermTags/duoTerms.js +198 -0
  58. package/dist/components/GenericCard/DuoTermTags/duoTerms.js.map +1 -0
  59. package/dist/components/GenericCard/SynapseCardLabel.d.ts.map +1 -1
  60. package/dist/components/GenericCard/SynapseCardLabel.js +4 -8
  61. package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
  62. package/dist/components/GenericCard/TableRowGenericCard.d.ts +6 -0
  63. package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
  64. package/dist/components/GenericCard/TableRowGenericCard.js +168 -153
  65. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  66. package/dist/components/Goals/Goals.d.ts +8 -0
  67. package/dist/components/Goals/Goals.d.ts.map +1 -1
  68. package/dist/components/Goals/Goals.js +54 -40
  69. package/dist/components/Goals/Goals.js.map +1 -1
  70. package/dist/components/IconSvg/IconSvg.d.ts +1 -1
  71. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  72. package/dist/components/IconSvg/IconSvg.js +19 -18
  73. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  74. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.d.ts +9 -0
  75. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.d.ts.map +1 -0
  76. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.js +69 -0
  77. package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.js.map +1 -0
  78. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.d.ts +13 -0
  79. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.d.ts.map +1 -0
  80. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.js +11 -0
  81. package/dist/components/ProjectVisibilityChip/getProjectVisibilityFromACL.js.map +1 -0
  82. package/dist/components/ProjectVisibilityChip/index.d.ts +5 -0
  83. package/dist/components/ProjectVisibilityChip/index.d.ts.map +1 -0
  84. package/dist/components/ProjectVisibilityChip/index.js +7 -0
  85. package/dist/components/ProjectVisibilityChip/index.js.map +1 -0
  86. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.d.ts +21 -0
  87. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.d.ts.map +1 -1
  88. package/dist/components/QueryVisualizationWrapper/QueryVisualizationContext.js.map +1 -1
  89. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts +10 -0
  90. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  91. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +66 -60
  92. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  93. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
  94. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  95. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +2 -0
  96. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  97. package/dist/components/QueryWrapperPlotNav/RowSetView.d.ts.map +1 -1
  98. package/dist/components/QueryWrapperPlotNav/RowSetView.js +9 -12
  99. package/dist/components/QueryWrapperPlotNav/RowSetView.js.map +1 -1
  100. package/dist/components/RssFeedCards/RssFeedCards.d.ts +7 -15
  101. package/dist/components/RssFeedCards/RssFeedCards.d.ts.map +1 -1
  102. package/dist/components/RssFeedCards/RssFeedCards.js +114 -123
  103. package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
  104. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +33 -6
  105. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
  106. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +93 -55
  107. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
  108. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts +3 -0
  109. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts.map +1 -1
  110. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js +39 -37
  111. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -1
  112. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +3 -1
  113. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -1
  114. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +4 -0
  115. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -1
  116. package/dist/components/UserCardList/UserCardList.d.ts +2 -20
  117. package/dist/components/UserCardList/UserCardList.d.ts.map +1 -1
  118. package/dist/components/UserCardList/UserCardList.js +49 -72
  119. package/dist/components/UserCardList/UserCardList.js.map +1 -1
  120. package/dist/components/UserCardList/UserCardListRotate.d.ts +13 -0
  121. package/dist/components/UserCardList/UserCardListRotate.d.ts.map +1 -1
  122. package/dist/components/UserCardList/UserCardListRotate.js +82 -57
  123. package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
  124. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts +5 -2
  125. package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts.map +1 -1
  126. package/dist/components/entity/page/action_menu/EntityActionMenu.js +68 -51
  127. package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
  128. package/dist/components/index.d.ts +1 -0
  129. package/dist/components/index.d.ts.map +1 -1
  130. package/dist/components/menu/ComplexMenu.d.ts +8 -1
  131. package/dist/components/menu/ComplexMenu.d.ts.map +1 -1
  132. package/dist/components/menu/ComplexMenu.js +50 -20
  133. package/dist/components/menu/ComplexMenu.js.map +1 -1
  134. package/dist/components/widgets/facet-nav/FacetValueChip.d.ts +25 -0
  135. package/dist/components/widgets/facet-nav/FacetValueChip.d.ts.map +1 -0
  136. package/dist/components/widgets/facet-nav/FacetValueChip.js +40 -0
  137. package/dist/components/widgets/facet-nav/FacetValueChip.js.map +1 -0
  138. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.d.ts +10 -5
  139. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.d.ts.map +1 -1
  140. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js +10 -17
  141. package/dist/components/widgets/facet-nav/SelectionCriteriaPill.js.map +1 -1
  142. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.d.ts.map +1 -1
  143. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js +11 -10
  144. package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
  145. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
  146. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +70 -54
  147. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
  148. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts +2 -1
  149. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts.map +1 -1
  150. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js +17 -1
  151. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js.map +1 -1
  152. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +2 -0
  153. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
  154. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +7 -7
  155. package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
  156. package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -1
  157. package/dist/features/curator/dashboard/components/CurationTaskCard.js +99 -45
  158. package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -1
  159. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -1
  160. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +174 -149
  161. package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
  162. package/dist/features/entity/metadata-task/utils/constants.d.ts +6 -0
  163. package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
  164. package/dist/features/entity/metadata-task/utils/constants.js +19 -2
  165. package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
  166. package/dist/style/abstracts/_cssVariables.scss +1 -0
  167. package/dist/style/components/_total-query-results.scss +10 -34
  168. package/dist/style/main.css +1 -1
  169. package/dist/synapse-queries/KeyFactory.d.ts +1 -0
  170. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  171. package/dist/synapse-queries/KeyFactory.js +3 -0
  172. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  173. package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
  174. package/dist/synapse-queries/curation/task/useCurationTask.js +1 -1
  175. package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
  176. package/dist/synapse-queries/index.js +46 -44
  177. package/dist/synapse-queries/user/index.js +3 -3
  178. package/dist/synapse-queries/user/useUserBundle.d.ts +12 -0
  179. package/dist/synapse-queries/user/useUserBundle.d.ts.map +1 -1
  180. package/dist/synapse-queries/user/useUserBundle.js +50 -36
  181. package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
  182. package/dist/tsconfig.build.tsbuildinfo +1 -1
  183. package/dist/utils/AppUtils/session/SessionInitializedGuard.d.ts +10 -5
  184. package/dist/utils/AppUtils/session/SessionInitializedGuard.d.ts.map +1 -1
  185. package/dist/utils/AppUtils/session/SessionInitializedGuard.js +13 -9
  186. package/dist/utils/AppUtils/session/SessionInitializedGuard.js.map +1 -1
  187. package/dist/utils/functions/SqlFunctions.d.ts +1 -1
  188. package/dist/utils/functions/SqlFunctions.d.ts.map +1 -1
  189. package/dist/utils/functions/SqlFunctions.js +1 -1
  190. package/dist/utils/functions/SqlFunctions.js.map +1 -1
  191. package/package.json +4 -4
@@ -1,10 +1,4 @@
1
- import { Component } from 'react';
2
- type RssState = {
3
- rssFeed: any;
4
- isLoadingError: boolean;
5
- isShowingSubscribeUI: boolean;
6
- allItemsUrl?: string;
7
- };
1
+ import { QueryClient } from '@tanstack/react-query';
8
2
  export type RssFilter = {
9
3
  type?: 'tag' | 'category';
10
4
  value: string;
@@ -18,13 +12,11 @@ export type RssFeedCardsProps = {
18
12
  mailChimpUrl?: string;
19
13
  viewAllNewsButtonText?: string;
20
14
  };
21
- export declare class RssFeedCards extends Component<RssFeedCardsProps, RssState> {
22
- _isMounted: boolean;
23
- constructor(props: RssFeedCardsProps);
24
- componentDidMount(): void;
25
- componentWillUnmount(): void;
26
- onClickSubscribe: () => void;
27
- render(): import("react/jsx-runtime").JSX.Element;
28
- }
15
+ export declare function RssFeedCards(props: RssFeedCardsProps): import("react/jsx-runtime").JSX.Element;
29
16
  export default RssFeedCards;
17
+ /**
18
+ * Prefetches the RSS feed into a QueryClient for use with HydrationBoundary.
19
+ * Uses the same query key as the RssFeedCards component.
20
+ */
21
+ export declare function prefetchRssFeed(queryClient: QueryClient, url: string, filter?: RssFilter): Promise<void>;
30
22
  //# sourceMappingURL=RssFeedCards.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RssFeedCards.d.ts","sourceRoot":"","sources":["../../../src/components/RssFeedCards/RssFeedCards.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKjC,KAAK,QAAQ,GAAG;IACd,OAAO,EAAE,GAAG,CAAA;IACZ,cAAc,EAAE,OAAO,CAAA;IACvB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AACD,qBAAa,YAAa,SAAQ,SAAS,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IAEtE,UAAU,UAAQ;gBAEN,KAAK,EAAE,iBAAiB;IASpC,iBAAiB;IAyBjB,oBAAoB;IAIb,gBAAgB,aAEtB;IAED,MAAM;CAsIP;AAED,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"RssFeedCards.d.ts","sourceRoot":"","sources":["../../../src/components/RssFeedCards/RssFeedCards.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAA0B,MAAM,uBAAuB,CAAA;AAK3E,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AAuBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CA6IpD;AAED,eAAe,YAAY,CAAA;AAE3B;;;GAGG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -1,135 +1,126 @@
1
1
  import e from "../../assets/icons/NoData.js";
2
2
  import { LargeButton as t } from "../styled/LargeButton.js";
3
3
  import { ForwardRef as n } from "../../assets/icons/subscribe_plus.js";
4
- import { Component as r } from "react";
4
+ import { useState as r } from "react";
5
5
  import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
6
- import s from "dayjs";
7
- import c from "react-mailchimp-subscribe";
8
- import l from "rss-parser";
6
+ import { queryOptions as s, useQuery as c } from "@tanstack/react-query";
7
+ import l from "dayjs";
8
+ import u from "react-mailchimp-subscribe";
9
+ import d from "rss-parser";
9
10
  //#region src/components/RssFeedCards/RssFeedCards.tsx
10
- var u = new l(), d = class extends r {
11
- _isMounted = !1;
12
- constructor(e) {
13
- super(e), this.state = {
14
- rssFeed: {},
15
- isLoadingError: !1,
16
- isShowingSubscribeUI: !1
17
- };
18
- }
19
- componentDidMount() {
20
- this._isMounted = !0;
21
- let { url: e, filter: t } = this.props, n = t?.value, r = t?.type, i = `${e}${n ? `/${r ?? "tag"}/${n.replace(" ", "-")}` : ""}`, a = `${i}/?feed=rss2`;
22
- fetch(a).then((e) => e.text()).then((e) => u.parseString(e)).then((e) => {
23
- this._isMounted && this.setState({
24
- rssFeed: e,
25
- allItemsUrl: i
26
- });
27
- }).catch((e) => {
28
- this._isMounted && this.setState({ isLoadingError: !0 });
29
- });
30
- }
31
- componentWillUnmount() {
32
- this._isMounted = !1;
33
- }
34
- onClickSubscribe = () => {
35
- this.setState({ isShowingSubscribeUI: !0 });
11
+ var f = new d();
12
+ function p(e, t) {
13
+ let n = t?.value, r = t?.type, i = `${e}${n ? `/${r ?? "tag"}/${n.replace(" ", "-")}` : ""}`;
14
+ return {
15
+ allItemsUrl: i,
16
+ feedUrl: `${i}/?feed=rss2`
36
17
  };
37
- render() {
38
- let { viewAllNewsButtonText: r } = this.props;
39
- return this.state.rssFeed.items?.length === 0 ? /* @__PURE__ */ o("div", {
40
- className: "text-center SRCBorderedPanel SRCBorderedPanel--padded2x",
41
- children: [e, /* @__PURE__ */ a("div", {
42
- style: {
43
- marginTop: "20px",
44
- fontStyle: "italic"
45
- },
46
- children: "There are no items currently available"
47
- })]
48
- }) : /* @__PURE__ */ o(i, { children: [this.props.mailChimpUrl && /* @__PURE__ */ o("div", {
49
- className: "FeedSubscribe",
50
- children: [!this.state.isShowingSubscribeUI && /* @__PURE__ */ o("a", {
51
- className: "FeedSubscribeToNewsLink SRC-no-border-bottom-imp",
52
- onClick: this.onClickSubscribe,
53
- children: [/* @__PURE__ */ a(n, { title: "Subscribe to News" }), "Subscribe to News"]
54
- }), this.state.isShowingSubscribeUI && /* @__PURE__ */ o("div", {
55
- className: "MailchimpSubscribeContainer",
56
- children: [
57
- /* @__PURE__ */ a(n, { title: "Subscribe to News" }),
58
- /* @__PURE__ */ o("p", { children: [
59
- "Subscribe to receive the ",
60
- this.props.mailChimpListName,
61
- " by e-mail, which provides information and updates related to the Portal. You can opt out at any time by using the unsubscribe link within the e-mail. We will not share your information with any third parties or use it for any other purposes."
62
- ] }),
63
- /* @__PURE__ */ a("div", {
64
- className: "SRC-marginBottomTop",
65
- children: /* @__PURE__ */ a(c, { url: this.props.mailChimpUrl })
66
- })
67
- ]
68
- })]
69
- }), /* @__PURE__ */ o("div", {
70
- className: "Feed",
18
+ }
19
+ function m(e) {
20
+ return s({
21
+ queryKey: ["rssFeed", e],
22
+ queryFn: () => fetch(e).then((e) => e.text()).then((e) => f.parseString(e))
23
+ });
24
+ }
25
+ function h(s) {
26
+ let { url: d, filter: f, itemsToShow: h, allowCategories: g, mailChimpListName: _, mailChimpUrl: v, viewAllNewsButtonText: y } = s, { allItemsUrl: b, feedUrl: x } = p(d, f), { data: S, isError: C } = c(m(x)), [w, T] = r(!1);
27
+ return S?.items?.length === 0 ? /* @__PURE__ */ o("div", {
28
+ className: "text-center SRCBorderedPanel SRCBorderedPanel--padded2x",
29
+ children: [e, /* @__PURE__ */ a("div", {
30
+ style: {
31
+ marginTop: "20px",
32
+ fontStyle: "italic"
33
+ },
34
+ children: "There are no items currently available"
35
+ })]
36
+ }) : /* @__PURE__ */ o(i, { children: [v && /* @__PURE__ */ o("div", {
37
+ className: "FeedSubscribe",
38
+ children: [!w && /* @__PURE__ */ o("a", {
39
+ className: "FeedSubscribeToNewsLink SRC-no-border-bottom-imp",
40
+ onClick: () => T(!0),
41
+ children: [/* @__PURE__ */ a(n, { title: "Subscribe to News" }), "Subscribe to News"]
42
+ }), w && /* @__PURE__ */ o("div", {
43
+ className: "MailchimpSubscribeContainer",
71
44
  children: [
45
+ /* @__PURE__ */ a(n, { title: "Subscribe to News" }),
46
+ /* @__PURE__ */ o("p", { children: [
47
+ "Subscribe to receive the ",
48
+ _,
49
+ " by e-mail, which provides information and updates related to the Portal. You can opt out at any time by using the unsubscribe link within the e-mail. We will not share your information with any third parties or use it for any other purposes."
50
+ ] }),
72
51
  /* @__PURE__ */ a("div", {
73
- className: "FeedItems",
74
- children: this.state.rssFeed.items && this.state.rssFeed.items.map((e, t) => {
75
- if (!(t >= this.props.itemsToShow)) return /* @__PURE__ */ a("div", {
76
- className: "FeedItem",
77
- children: /* @__PURE__ */ o("div", { children: [
78
- this.props.allowCategories && this.props.allowCategories.length > 0 && /* @__PURE__ */ a("div", {
79
- className: "FeedItemCategories",
80
- children: e.categories.map((t) => {
81
- let n = t.toLowerCase();
82
- return this.props.allowCategories?.findIndex((e) => n === e.toLowerCase()) === -1 ? /* @__PURE__ */ a(i, {}) : /* @__PURE__ */ a("a", {
83
- href: `${this.state.rssFeed.link}/tag/${t.replace(" ", "-")}`,
84
- className: "SRC-no-border-bottom-imp",
85
- target: "_blank",
86
- rel: "noopener noreferrer",
87
- children: /* @__PURE__ */ a("div", {
88
- className: "FeedItemCategory",
89
- children: t
90
- })
91
- }, `${e.guid}_${t}`);
92
- })
93
- }),
94
- /* @__PURE__ */ a("p", {
95
- className: "FeedItemDate",
96
- children: s(e.isoDate).format("MMMM YYYY")
97
- }),
98
- /* @__PURE__ */ a("p", {
99
- className: "FeedItemTitle",
100
- children: e.title
101
- }),
102
- /* @__PURE__ */ a("div", {
103
- className: "FeedItemDescription",
104
- children: e.contentSnippet.replace(/\[...\]|\[…\]/gm, "…")
105
- }),
106
- /* @__PURE__ */ a("a", {
107
- className: "FeedItemLink",
108
- href: e.link,
109
- target: "_blank",
110
- rel: "noopener noreferrer",
111
- children: "Continue reading"
112
- })
113
- ] })
114
- }, e.guid);
115
- })
116
- }),
117
- this.state.rssFeed.items && this.state.rssFeed.items.length > this.props.itemsToShow && this.state.allItemsUrl && /* @__PURE__ */ a("div", {
118
- className: "FeedViewAllNewsButtonContainer",
119
- children: /* @__PURE__ */ a(t, {
120
- color: "secondary",
121
- variant: "contained",
122
- onClick: () => window.open(this.state.allItemsUrl, "_blank", "noopener"),
123
- target: "_blank",
124
- children: r ?? "View All News"
125
- })
126
- }),
127
- this.state.isLoadingError && /* @__PURE__ */ o("div", { children: ["Unable to load feed: ", this.props.url] })
52
+ className: "SRC-marginBottomTop",
53
+ children: /* @__PURE__ */ a(u, { url: v })
54
+ })
128
55
  ]
129
- })] });
130
- }
131
- };
56
+ })]
57
+ }), /* @__PURE__ */ o("div", {
58
+ className: "Feed",
59
+ children: [
60
+ /* @__PURE__ */ a("div", {
61
+ className: "FeedItems",
62
+ children: S?.items && S.items.map((e, t) => {
63
+ if (!(t >= h)) return /* @__PURE__ */ a("div", {
64
+ className: "FeedItem",
65
+ children: /* @__PURE__ */ o("div", { children: [
66
+ g && g.length > 0 && /* @__PURE__ */ a("div", {
67
+ className: "FeedItemCategories",
68
+ children: e.categories?.map((t) => {
69
+ let n = t.toLowerCase();
70
+ return g?.findIndex((e) => n === e.toLowerCase()) === -1 ? null : /* @__PURE__ */ a("a", {
71
+ href: `${S.link}/tag/${t.replace(" ", "-")}`,
72
+ className: "SRC-no-border-bottom-imp",
73
+ target: "_blank",
74
+ rel: "noopener noreferrer",
75
+ children: /* @__PURE__ */ a("div", {
76
+ className: "FeedItemCategory",
77
+ children: t
78
+ })
79
+ }, `${e.guid}_${t}`);
80
+ })
81
+ }),
82
+ /* @__PURE__ */ a("p", {
83
+ className: "FeedItemDate",
84
+ children: l(e.isoDate).format("MMMM YYYY")
85
+ }),
86
+ /* @__PURE__ */ a("p", {
87
+ className: "FeedItemTitle",
88
+ children: e.title
89
+ }),
90
+ /* @__PURE__ */ a("div", {
91
+ className: "FeedItemDescription",
92
+ children: e.contentSnippet?.replace(/\[...\]|\[…\]/gm, "…")
93
+ }),
94
+ /* @__PURE__ */ a("a", {
95
+ className: "FeedItemLink",
96
+ href: e.link,
97
+ target: "_blank",
98
+ rel: "noopener noreferrer",
99
+ children: "Continue reading"
100
+ })
101
+ ] })
102
+ }, e.guid);
103
+ })
104
+ }),
105
+ S?.items && S.items.length > h && b && /* @__PURE__ */ a("div", {
106
+ className: "FeedViewAllNewsButtonContainer",
107
+ children: /* @__PURE__ */ a(t, {
108
+ color: "secondary",
109
+ variant: "contained",
110
+ onClick: () => window.open(b, "_blank", "noopener"),
111
+ target: "_blank",
112
+ children: y ?? "View All News"
113
+ })
114
+ }),
115
+ C && /* @__PURE__ */ o("div", { children: ["Unable to load feed: ", d] })
116
+ ]
117
+ })] });
118
+ }
119
+ async function g(e, t, n) {
120
+ let { feedUrl: r } = p(t, n);
121
+ await e.prefetchQuery(m(r));
122
+ }
132
123
  //#endregion
133
- export { d as RssFeedCards, d as default };
124
+ export { h as RssFeedCards, h as default, g as prefetchRssFeed };
134
125
 
135
126
  //# sourceMappingURL=RssFeedCards.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RssFeedCards.js","names":[],"sources":["../../../src/components/RssFeedCards/RssFeedCards.tsx"],"sourcesContent":["import NoData from '@/assets/icons/NoData'\nimport { ReactComponent as SubscribePlus } from '@/assets/icons/subscribe_plus.svg'\nimport LargeButton from '@/components/styled/LargeButton'\nimport dayjs from 'dayjs'\nimport { Component } from 'react'\nimport MailchimpSubscribe from 'react-mailchimp-subscribe'\nimport Parser from 'rss-parser'\n\nconst rssParser = new Parser()\ntype RssState = {\n rssFeed: any\n isLoadingError: boolean\n isShowingSubscribeUI: boolean\n allItemsUrl?: string\n}\n\nexport type RssFilter = {\n type?: 'tag' | 'category'\n value: string\n}\n\nexport type RssFeedCardsProps = {\n url: string\n filter?: RssFilter // optional tag or category to use as a filter\n itemsToShow: number\n allowCategories?: string[]\n mailChimpListName?: string\n mailChimpUrl?: string\n viewAllNewsButtonText?: string\n}\nexport class RssFeedCards extends Component<RssFeedCardsProps, RssState> {\n // only update the state if this component is mounted\n _isMounted = false\n\n constructor(props: RssFeedCardsProps) {\n super(props)\n this.state = {\n rssFeed: {},\n isLoadingError: false,\n isShowingSubscribeUI: false,\n }\n }\n\n componentDidMount() {\n this._isMounted = true\n const { url, filter } = this.props\n const filterValue = filter?.value\n const filterType = filter?.type\n const tagPath = filterValue\n ? `/${filterType ?? 'tag'}/${filterValue.replace(' ', '-')}`\n : ''\n const allItems = `${url}${tagPath}`\n const feedUrl = `${allItems}/?feed=rss2`\n fetch(feedUrl)\n .then(response => response.text())\n .then(responseData => rssParser.parseString(responseData))\n .then(rss => {\n if (this._isMounted) {\n this.setState({ rssFeed: rss, allItemsUrl: allItems })\n }\n })\n .catch(err => {\n if (this._isMounted) {\n this.setState({ isLoadingError: true })\n }\n })\n }\n\n componentWillUnmount() {\n this._isMounted = false\n }\n\n public onClickSubscribe = () => {\n this.setState({ isShowingSubscribeUI: true })\n }\n\n render() {\n const { viewAllNewsButtonText } = this.props\n\n if (this.state.rssFeed.items?.length === 0) {\n return (\n <div className=\"text-center SRCBorderedPanel SRCBorderedPanel--padded2x\">\n {NoData}\n <div style={{ marginTop: '20px', fontStyle: 'italic' }}>\n There are no items currently available\n </div>\n </div>\n )\n }\n return (\n <>\n {this.props.mailChimpUrl && (\n <div className=\"FeedSubscribe\">\n {!this.state.isShowingSubscribeUI && (\n <a\n className=\"FeedSubscribeToNewsLink SRC-no-border-bottom-imp\"\n onClick={this.onClickSubscribe}\n >\n <SubscribePlus title=\"Subscribe to News\" />\n Subscribe to News\n </a>\n )}\n {this.state.isShowingSubscribeUI && (\n <div className=\"MailchimpSubscribeContainer\">\n <SubscribePlus title=\"Subscribe to News\" />\n <p>\n Subscribe to receive the {this.props.mailChimpListName} by\n e-mail, which provides information and updates related to the\n Portal. You can opt out at any time by using the unsubscribe\n link within the e-mail. We will not share your information\n with any third parties or use it for any other purposes.\n </p>\n <div className=\"SRC-marginBottomTop\">\n <MailchimpSubscribe url={this.props.mailChimpUrl} />\n </div>\n </div>\n )}\n </div>\n )}\n <div className=\"Feed\">\n <div className=\"FeedItems\">\n {this.state.rssFeed.items &&\n this.state.rssFeed.items.map((item: any, index: any) => {\n // The other is to hide the large number of items in a particular feed (usually a max of 10 are returned). See state.isShowingMoreItems\n if (index >= this.props.itemsToShow) {\n return\n }\n\n return (\n <div key={item.guid} className={`FeedItem`}>\n <div>\n {this.props.allowCategories &&\n this.props.allowCategories.length > 0 && (\n <div className=\"FeedItemCategories\">\n {item['categories'].map((categoryName: string) => {\n // are we allowed to show this category/tag?\n const categoryNameLowerCase =\n categoryName.toLowerCase()\n const allowCategories = this.props.allowCategories\n if (\n allowCategories?.findIndex(\n item =>\n categoryNameLowerCase ===\n item.toLowerCase(),\n ) === -1\n )\n return <></>\n // else\n return (\n <a\n href={`${\n this.state.rssFeed.link\n }/tag/${categoryName.replace(' ', '-')}`}\n className=\"SRC-no-border-bottom-imp\"\n key={`${item.guid}_${categoryName}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <div className=\"FeedItemCategory\">\n {categoryName}\n </div>\n </a>\n )\n })}\n </div>\n )}\n <p className=\"FeedItemDate\">\n {dayjs(item['isoDate']).format('MMMM YYYY')}\n </p>\n <p className=\"FeedItemTitle\">{item['title']}</p>\n <div className=\"FeedItemDescription\">\n {item['contentSnippet'].replace(/\\[...\\]|\\[…\\]/gm, '…')}\n </div>\n <a\n className=\"FeedItemLink\"\n href={item['link']}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Continue reading\n </a>\n </div>\n </div>\n )\n })}\n </div>\n {this.state.rssFeed.items &&\n this.state.rssFeed.items.length > this.props.itemsToShow &&\n this.state.allItemsUrl && (\n <div className=\"FeedViewAllNewsButtonContainer\">\n <LargeButton\n color=\"secondary\"\n variant=\"contained\"\n onClick={() =>\n window.open(this.state.allItemsUrl, '_blank', 'noopener')\n }\n // @ts-expect-error - target prop exists, but TS doesn't recognize on styled component\n target=\"_blank\"\n >\n {viewAllNewsButtonText ?? 'View All News'}\n </LargeButton>\n </div>\n )}\n {this.state.isLoadingError && (\n <div>Unable to load feed: {this.props.url}</div>\n )}\n </div>\n </>\n )\n }\n}\n\nexport default RssFeedCards\n"],"mappings":"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"}
1
+ {"version":3,"file":"RssFeedCards.js","names":[],"sources":["../../../src/components/RssFeedCards/RssFeedCards.tsx"],"sourcesContent":["import NoData from '@/assets/icons/NoData'\nimport { ReactComponent as SubscribePlus } from '@/assets/icons/subscribe_plus.svg'\nimport LargeButton from '@/components/styled/LargeButton'\nimport dayjs from 'dayjs'\nimport MailchimpSubscribe from 'react-mailchimp-subscribe'\nimport Parser from 'rss-parser'\nimport { QueryClient, queryOptions, useQuery } from '@tanstack/react-query'\nimport { useState } from 'react'\n\nconst rssParser = new Parser()\n\nexport type RssFilter = {\n type?: 'tag' | 'category'\n value: string\n}\n\nexport type RssFeedCardsProps = {\n url: string\n filter?: RssFilter // optional tag or category to use as a filter\n itemsToShow: number\n allowCategories?: string[]\n mailChimpListName?: string\n mailChimpUrl?: string\n viewAllNewsButtonText?: string\n}\n\nfunction buildRssFeedUrl(url: string, filter?: RssFilter) {\n const filterValue = filter?.value\n const filterType = filter?.type\n const tagPath = filterValue\n ? `/${filterType ?? 'tag'}/${filterValue.replace(' ', '-')}`\n : ''\n const allItemsUrl = `${url}${tagPath}`\n const feedUrl = `${allItemsUrl}/?feed=rss2`\n return { allItemsUrl, feedUrl }\n}\n\nfunction getRssFeedQueryOptions(feedUrl: string) {\n return queryOptions({\n queryKey: ['rssFeed', feedUrl],\n queryFn: () =>\n fetch(feedUrl)\n .then(response => response.text())\n .then(responseData => rssParser.parseString(responseData)),\n })\n}\n\nexport function RssFeedCards(props: RssFeedCardsProps) {\n const {\n url,\n filter,\n itemsToShow,\n allowCategories,\n mailChimpListName,\n mailChimpUrl,\n viewAllNewsButtonText,\n } = props\n\n const { allItemsUrl, feedUrl } = buildRssFeedUrl(url, filter)\n\n const { data: rssFeed, isError } = useQuery(getRssFeedQueryOptions(feedUrl))\n\n const [isShowingSubscribeUI, setIsShowingSubscribeUI] = useState(false)\n\n if (rssFeed?.items?.length === 0) {\n return (\n <div className=\"text-center SRCBorderedPanel SRCBorderedPanel--padded2x\">\n {NoData}\n <div style={{ marginTop: '20px', fontStyle: 'italic' }}>\n There are no items currently available\n </div>\n </div>\n )\n }\n return (\n <>\n {mailChimpUrl && (\n <div className=\"FeedSubscribe\">\n {!isShowingSubscribeUI && (\n <a\n className=\"FeedSubscribeToNewsLink SRC-no-border-bottom-imp\"\n onClick={() => setIsShowingSubscribeUI(true)}\n >\n <SubscribePlus title=\"Subscribe to News\" />\n Subscribe to News\n </a>\n )}\n {isShowingSubscribeUI && (\n <div className=\"MailchimpSubscribeContainer\">\n <SubscribePlus title=\"Subscribe to News\" />\n <p>\n Subscribe to receive the {mailChimpListName} by e-mail, which\n provides information and updates related to the Portal. You can\n opt out at any time by using the unsubscribe link within the\n e-mail. We will not share your information with any third\n parties or use it for any other purposes.\n </p>\n <div className=\"SRC-marginBottomTop\">\n <MailchimpSubscribe url={mailChimpUrl} />\n </div>\n </div>\n )}\n </div>\n )}\n <div className=\"Feed\">\n <div className=\"FeedItems\">\n {rssFeed?.items &&\n rssFeed.items.map((item, index) => {\n // The other is to hide the large number of items in a particular feed (usually a max of 10 are returned). See state.isShowingMoreItems\n if (index >= itemsToShow) {\n return\n }\n\n return (\n <div key={item.guid} className={`FeedItem`}>\n <div>\n {allowCategories && allowCategories.length > 0 && (\n <div className=\"FeedItemCategories\">\n {item.categories?.map((categoryName: string) => {\n // are we allowed to show this category/tag?\n const categoryNameLowerCase =\n categoryName.toLowerCase()\n if (\n allowCategories?.findIndex(\n item =>\n categoryNameLowerCase === item.toLowerCase(),\n ) === -1\n )\n return null\n // else\n return (\n <a\n href={`${rssFeed.link}/tag/${categoryName.replace(\n ' ',\n '-',\n )}`}\n className=\"SRC-no-border-bottom-imp\"\n key={`${item.guid}_${categoryName}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <div className=\"FeedItemCategory\">\n {categoryName}\n </div>\n </a>\n )\n })}\n </div>\n )}\n <p className=\"FeedItemDate\">\n {dayjs(item.isoDate).format('MMMM YYYY')}\n </p>\n <p className=\"FeedItemTitle\">{item.title}</p>\n <div className=\"FeedItemDescription\">\n {item.contentSnippet?.replace(/\\[...\\]|\\[…\\]/gm, '…')}\n </div>\n <a\n className=\"FeedItemLink\"\n href={item.link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Continue reading\n </a>\n </div>\n </div>\n )\n })}\n </div>\n {rssFeed?.items &&\n rssFeed.items.length > itemsToShow &&\n allItemsUrl && (\n <div className=\"FeedViewAllNewsButtonContainer\">\n <LargeButton\n color=\"secondary\"\n variant=\"contained\"\n onClick={() => window.open(allItemsUrl, '_blank', 'noopener')}\n // @ts-expect-error - target prop exists, but TS doesn't recognize on styled component\n target=\"_blank\"\n >\n {viewAllNewsButtonText ?? 'View All News'}\n </LargeButton>\n </div>\n )}\n {isError && <div>Unable to load feed: {url}</div>}\n </div>\n </>\n )\n}\n\nexport default RssFeedCards\n\n/**\n * Prefetches the RSS feed into a QueryClient for use with HydrationBoundary.\n * Uses the same query key as the RssFeedCards component.\n */\nexport async function prefetchRssFeed(\n queryClient: QueryClient,\n url: string,\n filter?: RssFilter,\n): Promise<void> {\n const { feedUrl } = buildRssFeedUrl(url, filter)\n await queryClient.prefetchQuery(getRssFeedQueryOptions(feedUrl))\n}\n"],"mappings":"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"}
@@ -2,6 +2,26 @@ import { AsynchronousJobStatus, ColumnModel, FacetColumnRangeRequest, FacetColum
2
2
  import type { SearchIndexQuery, SearchQueryResults, SynapseClientError } from '@sage-bionetworks/synapse-client';
3
3
  import { InfiniteData, QueryKey, UseInfiniteQueryOptions, UseSuspenseQueryOptions } from '@tanstack/react-query';
4
4
  import { KeyFactory } from '@/synapse-queries/KeyFactory';
5
+ export type SearchQueryStrategy = 'MULTI_MATCH' | 'MULTI_MATCH_BEST_FIELDS' | 'MULTI_MATCH_CROSS_FIELDS' | 'SIMPLE_QUERY_STRING' | 'PHRASE_PREFIX' | 'BOOSTED_FUZZY';
6
+ export type SearchQueryConfig = {
7
+ /**
8
+ * Which OpenSearch query clause to emit when the user has typed a search term.
9
+ * Defaults to 'MULTI_MATCH' (all fields, fuzziness AUTO — today's behavior).
10
+ */
11
+ queryStrategy?: SearchQueryStrategy;
12
+ /**
13
+ * Per-field relevance multipliers. Serialized to the OpenSearch `fields` array
14
+ * as e.g. `["resourceName^5", "synonyms^4"]`. When omitted, all fields are
15
+ * queried at equal weight.
16
+ */
17
+ fieldBoosts?: Record<string, number>;
18
+ /**
19
+ * Fuzziness override. Overrides the per-strategy default. Leave undefined to
20
+ * use each strategy's natural default (AUTO for MULTI_MATCH/BOOSTED_FUZZY,
21
+ * none for the rest).
22
+ */
23
+ fuzziness?: string;
24
+ };
5
25
  /**
6
26
  * TanStack Query options for the SearchQueryServicesApi, mirroring TableQueryUseQueryOptions
7
27
  * but parameterised over SearchIndexQuery rather than QueryBundleRequest. This eliminates
@@ -19,16 +39,23 @@ export declare function getNextPageParamForSearchQueryResults(lastPage: Asynchro
19
39
  * that can be sent to the SearchQueryServicesApi.
20
40
  *
21
41
  * Mapping:
22
- * - columnModels (facetType 'enumeration') → aggregations (OpenSearch terms aggregations)
23
- * - query.selectedFacets (enumeration) → query.bool.filter terms clauses
24
- * - query.selectedFacets (range) → query.bool.filter range clauses
42
+ * - columnModels (facetType 'enumeration') → aggregations (OpenSearch terms or filter-wrapped aggregations)
43
+ * - query.selectedFacets (enumeration) → post_filter (terms clauses) + per-facet filter aggregations
44
+ * - query.selectedFacets (range) → post_filter (range clauses) + included in all per-facet aggregation filters
25
45
  * - query.additionalFilters (TextMatchesQueryFilter) → multi_match query clause
26
46
  * - query.sort → sort (SortItem { column, direction } → [{ column: 'asc'|'desc' }])
27
47
  * - query.limit → size
28
48
  * - query.offset → from
29
49
  * - partMask → dropped (SearchIndexQuery has no bitmask concept)
50
+ *
51
+ * Per-facet filter bucketing (OpenSearch "faceted search" pattern):
52
+ * When any facet selections are active, each enum aggregation is wrapped in an OpenSearch
53
+ * filter aggregation whose filter is the AND of all OTHER selections (its own selection is
54
+ * dropped so the column stays wide). post_filter = AND of ALL selections, narrowing hits/total
55
+ * only. This lets each selected facet column show the full set of option counts while all
56
+ * other columns narrow to the selection — in a single request.
30
57
  */
31
- export declare function toSearchIndexQuery(queryBundleRequest: QueryBundleRequest, searchIndexId: string, columnModels?: ColumnModel[]): SearchIndexQuery;
58
+ export declare function toSearchIndexQuery(queryBundleRequest: QueryBundleRequest, searchIndexId: string, columnModels?: ColumnModel[], searchQueryConfig?: SearchQueryConfig): SearchIndexQuery;
32
59
  /**
33
60
  * Converts a SearchQueryResults (the actual API response) into a QueryResultBundle
34
61
  * so that existing subcomponents (FacetFilterControls, RowSetView, etc.) work unchanged.
@@ -39,7 +66,7 @@ export declare function toSearchIndexQuery(queryBundleRequest: QueryBundleReques
39
66
  * - aggregationResults → facets (parsed from opaque OpenSearch aggregation JSON)
40
67
  */
41
68
  export declare function searchQueryResultsToQueryResultBundle(results: SearchQueryResults | undefined, query: SearchIndexQuery, columnModels?: ColumnModel[], selectedFacets?: (FacetColumnValuesRequest | FacetColumnRangeRequest)[]): QueryResultBundle;
42
- export declare function getSearchQueryUseQueryOptions(queryBundleRequest: QueryBundleRequest, keyFactory: KeyFactory, accessToken: string | undefined, searchIndexId: string, columnModels?: ColumnModel[]): SearchTableQueryUseQueryOptions;
69
+ export declare function getSearchQueryUseQueryOptions(queryBundleRequest: QueryBundleRequest, keyFactory: KeyFactory, accessToken: string | undefined, searchIndexId: string, columnModels?: ColumnModel[], searchQueryConfig?: SearchQueryConfig): SearchTableQueryUseQueryOptions;
43
70
  /**
44
71
  * Returns a stable callback that fetches autocomplete suggestions for a search input
45
72
  * using the synchronous `POST /search/autocomplete` endpoint.
@@ -56,5 +83,5 @@ export declare function useGetSuggestionsForSearchIndex(searchIndexId: string, a
56
83
  * standard Table Query API) but return data in the same QueryResultBundle format, allowing
57
84
  * all existing subcomponents (FacetFilterControls, RowSetView, etc.) to work unchanged.
58
85
  */
59
- export declare function useSearchQueryUseQueryOptions(queryBundleRequest: QueryBundleRequest, searchIndexId: string, synapseId?: string): SearchTableQueryUseQueryOptions;
86
+ export declare function useSearchQueryUseQueryOptions(queryBundleRequest: QueryBundleRequest, searchIndexId: string, synapseId?: string, searchQueryConfig?: SearchQueryConfig): SearchTableQueryUseQueryOptions;
60
87
  //# sourceMappingURL=SearchQueryUseQueryOptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchQueryUseQueryOptions.d.ts","sourceRoot":"","sources":["../../../src/components/SearchQueryWrapper/SearchQueryUseQueryOptions.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,qBAAqB,EACrB,WAAW,EAEX,uBAAuB,EAIvB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,EAIP,MAAM,iCAAiC,CAAA;AACxC,OAAO,KAAK,EAGV,gBAAgB,EAChB,kBAAkB,EAElB,kBAAkB,EAEnB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,uBAAuB,CAAA;AAI9B,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AA6BzD;;;;;GAKG;AACH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,mBAAmB,EAAE,uBAAuB,CAC1C,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EAC1D,kBAAkB,EAClB,MAAM,GAAG,SAAS,CACnB,CAAA;IACD,2BAA2B,EAAE,uBAAuB,CAClD,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EAC1D,kBAAkB,EAClB,YAAY,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC,EACxE,QAAQ,EACR,MAAM,GAAG,MAAM,GAAG,SAAS,CAC5B,CAAA;IACD,yBAAyB,EAAE,uBAAuB,CAChD,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EAC1D,kBAAkB,EAClB,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CACvC,CAAA;CACF,CAAA;AAED,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EACpE,QAAQ,EAAE,qBAAqB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EAAE,GACrE,MAAM,GAAG,MAAM,GAAG,SAAS,CAyB7B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,WAAW,EAAE,GAC3B,gBAAgB,CAmHlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,KAAK,EAAE,gBAAgB,EACvB,YAAY,CAAC,EAAE,WAAW,EAAE,EAC5B,cAAc,CAAC,EAAE,CAAC,wBAAwB,GAAG,uBAAuB,CAAC,EAAE,GACtE,iBAAiB,CA6InB;AAED,wBAAgB,6BAA6B,CAC3C,kBAAkB,EAAE,kBAAkB,EACtC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,WAAW,EAAE,GAC3B,+BAA+B,CAwIjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC7C,aAAa,EAAE,MAAM,EACrB,qBAAqB,EAAE,MAAM,GAAG,SAAS,GACxC,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAoC3C;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,+BAA+B,CAmBjC"}
1
+ {"version":3,"file":"SearchQueryUseQueryOptions.d.ts","sourceRoot":"","sources":["../../../src/components/SearchQueryWrapper/SearchQueryUseQueryOptions.ts"],"names":[],"mappings":"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"}