synapse-react-client 4.0.10 → 4.0.12

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 (210) hide show
  1. package/dist/SWC.index.d.ts +1 -1
  2. package/dist/SWC.index.js +1 -1
  3. package/dist/assets/icons/CloudWarning.d.ts +5 -0
  4. package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
  5. package/dist/assets/icons/CloudWarning.js +47 -0
  6. package/dist/assets/icons/CloudWarning.js.map +1 -0
  7. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.d.ts +44 -0
  8. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.d.ts.map +1 -0
  9. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js +46 -0
  10. package/dist/components/AdaptiveTwoColumnLayout/AdaptiveTwoColumnLayout.js.map +1 -0
  11. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
  12. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
  13. package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
  14. package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
  15. package/dist/components/DataGrid/columns/AutocompleteColumn.js +66 -55
  16. package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
  17. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
  18. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +1 -1
  19. package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
  20. package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
  21. package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
  22. package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
  23. package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
  24. package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
  25. package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
  26. package/dist/components/DataGrid/utils/columnFactory.js +47 -44
  27. package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
  28. package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
  29. package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
  30. package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
  31. package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
  32. package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
  33. package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
  34. package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
  35. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
  36. package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
  37. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
  38. package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
  39. package/dist/components/DownloadCart/DownloadCartPage.d.ts.map +1 -1
  40. package/dist/components/DownloadCart/DownloadCartPage.js +183 -185
  41. package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
  42. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
  43. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
  44. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
  45. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
  46. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
  47. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
  48. package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
  49. package/dist/components/EntityAclEditor/EntityAclEditor.js +8 -8
  50. package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
  51. package/dist/components/EntityAclEditor/InheritanceMessage.d.ts.map +1 -1
  52. package/dist/components/EntityAclEditor/InheritanceMessage.js +1 -2
  53. package/dist/components/EntityAclEditor/InheritanceMessage.js.map +1 -1
  54. package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
  55. package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
  56. package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
  57. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
  58. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
  59. package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
  60. package/dist/components/Forum/DiscussionReply.d.ts +1 -0
  61. package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
  62. package/dist/components/Forum/DiscussionReply.js +19 -19
  63. package/dist/components/Forum/DiscussionReply.js.map +1 -1
  64. package/dist/components/Forum/DiscussionThread.d.ts +1 -0
  65. package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
  66. package/dist/components/Forum/DiscussionThread.js +73 -72
  67. package/dist/components/Forum/DiscussionThread.js.map +1 -1
  68. package/dist/components/FullTextSearch/FullTextSearch.d.ts.map +1 -1
  69. package/dist/components/FullTextSearch/FullTextSearch.js +86 -47
  70. package/dist/components/FullTextSearch/FullTextSearch.js.map +1 -1
  71. package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
  72. package/dist/components/GenericCard/BioregistryRules.js +7 -3
  73. package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
  74. package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
  75. package/dist/components/GenericCard/TableRowGenericCard.js +157 -157
  76. package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
  77. package/dist/components/HeaderCard.d.ts.map +1 -1
  78. package/dist/components/HeaderCard.js +131 -130
  79. package/dist/components/HeaderCard.js.map +1 -1
  80. package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
  81. package/dist/components/IconSvg/IconSvg.js +2 -1
  82. package/dist/components/IconSvg/IconSvg.js.map +1 -1
  83. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts +4 -1
  84. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.d.ts.map +1 -1
  85. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js +3 -2
  86. package/dist/components/MailchimpSubscribeSection/MailchimpSubscribeSection.js.map +1 -1
  87. package/dist/components/QueryContext/QueryContext.d.ts +6 -0
  88. package/dist/components/QueryContext/QueryContext.d.ts.map +1 -1
  89. package/dist/components/QueryContext/QueryContext.js.map +1 -1
  90. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
  91. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +12 -11
  92. package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
  93. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +5 -0
  94. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
  95. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +32 -29
  96. package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
  97. package/dist/components/QueryWrapperPlotNav/UseRowSet.d.ts.map +1 -1
  98. package/dist/components/QueryWrapperPlotNav/UseRowSet.js +4 -1
  99. package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
  100. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +59 -0
  101. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -0
  102. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +174 -0
  103. package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -0
  104. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts +40 -0
  105. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.d.ts.map +1 -0
  106. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js +100 -0
  107. package/dist/components/SearchQueryWrapper/SearchQueryWrapper.js.map +1 -0
  108. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +56 -0
  109. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -0
  110. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +73 -0
  111. package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -0
  112. package/dist/components/ShareThisPage/ShareThisPage.js +1 -1
  113. package/dist/components/ShareThisPage/ShareThisPage.js.map +1 -1
  114. package/dist/components/SynapseChat/GridAgentChat.d.ts.map +1 -1
  115. package/dist/components/SynapseChat/GridAgentChat.js +20 -14
  116. package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
  117. package/dist/components/SynapseChat/SynapseChat.d.ts +3 -1
  118. package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
  119. package/dist/components/SynapseChat/SynapseChat.js +51 -36
  120. package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
  121. package/dist/components/SynapseHomepageV2/HotdropsAndNews.css +1 -1
  122. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js +8 -7
  123. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.js.map +1 -1
  124. package/dist/components/SynapseHomepageV2/HotdropsAndNews.module.scss +16 -0
  125. package/dist/components/SynapseHomepageV2/WordPressNews.d.ts +3 -1
  126. package/dist/components/SynapseHomepageV2/WordPressNews.d.ts.map +1 -1
  127. package/dist/components/SynapseHomepageV2/WordPressNews.js +9 -8
  128. package/dist/components/SynapseHomepageV2/WordPressNews.js.map +1 -1
  129. package/dist/components/SynapseHomepageV2/WordPressNewsItem.d.ts +2 -1
  130. package/dist/components/SynapseHomepageV2/WordPressNewsItem.d.ts.map +1 -1
  131. package/dist/components/SynapseHomepageV2/WordPressNewsItem.js +2 -2
  132. package/dist/components/SynapseHomepageV2/WordPressNewsItem.js.map +1 -1
  133. package/dist/components/SynapseTable/SearchV2.d.ts +7 -0
  134. package/dist/components/SynapseTable/SearchV2.d.ts.map +1 -1
  135. package/dist/components/SynapseTable/SearchV2.js.map +1 -1
  136. package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
  137. package/dist/components/SynapseTable/SynapseTableRenderers.js +1 -1
  138. package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
  139. package/dist/components/SynapseTable/usePrefetchTableData.d.ts.map +1 -1
  140. package/dist/components/SynapseTable/usePrefetchTableData.js +6 -5
  141. package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
  142. package/dist/components/ToastMessage/ToastMessage.d.ts +1 -1
  143. package/dist/components/ToastMessage/ToastMessage.d.ts.map +1 -1
  144. package/dist/components/ToastMessage/ToastMessage.js +2 -2
  145. package/dist/components/ToastMessage/ToastMessage.js.map +1 -1
  146. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
  147. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
  148. package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
  149. package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
  150. package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
  151. package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
  152. package/dist/components/error/ErrorPage.d.ts +0 -4
  153. package/dist/components/error/ErrorPage.d.ts.map +1 -1
  154. package/dist/components/error/ErrorPage.js +25 -30
  155. package/dist/components/error/ErrorPage.js.map +1 -1
  156. package/dist/components/index.d.ts +4 -0
  157. package/dist/components/index.d.ts.map +1 -1
  158. package/dist/components/index.js +41 -39
  159. package/dist/components/widgets/query-filter/FacetFilterControls.d.ts.map +1 -1
  160. package/dist/components/widgets/query-filter/FacetFilterControls.js +2 -2
  161. package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
  162. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
  163. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
  164. package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
  165. package/dist/index.js +52 -50
  166. package/dist/index.js.map +1 -1
  167. package/dist/mocks/entity/index.d.ts.map +1 -1
  168. package/dist/mocks/entity/index.js +18 -16
  169. package/dist/mocks/entity/index.js.map +1 -1
  170. package/dist/mocks/mockSearchQueryData.d.ts +14 -0
  171. package/dist/mocks/mockSearchQueryData.d.ts.map +1 -0
  172. package/dist/mocks/mockSearchQueryData.js +564 -0
  173. package/dist/mocks/mockSearchQueryData.js.map +1 -0
  174. package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts +22 -0
  175. package/dist/mocks/msw/handlers/searchQueryHandlers.d.ts.map +1 -0
  176. package/dist/mocks/msw/handlers/searchQueryHandlers.js +63 -0
  177. package/dist/mocks/msw/handlers/searchQueryHandlers.js.map +1 -0
  178. package/dist/mocks/msw/handlers.d.ts.map +1 -1
  179. package/dist/mocks/msw/handlers.js +9 -7
  180. package/dist/mocks/msw/handlers.js.map +1 -1
  181. package/dist/style/components/_cards.scss +15 -0
  182. package/dist/style/main.css +1 -1
  183. package/dist/synapse-client/SynapseClient.d.ts +7 -1
  184. package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
  185. package/dist/synapse-client/SynapseClient.js +422 -417
  186. package/dist/synapse-client/SynapseClient.js.map +1 -1
  187. package/dist/synapse-client/index.js +3 -3
  188. package/dist/synapse-queries/KeyFactory.d.ts +3 -0
  189. package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
  190. package/dist/synapse-queries/KeyFactory.js +6 -0
  191. package/dist/synapse-queries/KeyFactory.js.map +1 -1
  192. package/dist/synapse-queries/forum/useThread.d.ts +1 -0
  193. package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
  194. package/dist/synapse-queries/forum/useThread.js +19 -12
  195. package/dist/synapse-queries/forum/useThread.js.map +1 -1
  196. package/dist/tsconfig.build.tsbuildinfo +1 -1
  197. package/dist/utils/APIConstants.d.ts +3 -0
  198. package/dist/utils/APIConstants.d.ts.map +1 -1
  199. package/dist/utils/APIConstants.js +2 -2
  200. package/dist/utils/APIConstants.js.map +1 -1
  201. package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
  202. package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
  203. package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
  204. package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
  205. package/dist/utils/functions/EntityTypeUtils.js +15 -4
  206. package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
  207. package/dist/utils/functions/calculateFriendlyFileSize.d.ts.map +1 -1
  208. package/dist/utils/functions/calculateFriendlyFileSize.js +3 -3
  209. package/dist/utils/functions/calculateFriendlyFileSize.js.map +1 -1
  210. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"HotdropsAndNews.module.js","names":[],"sources":["../../../src/components/SynapseHomepageV2/HotdropsAndNews.module.scss"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Grid container (SynapseHotDrops / WordPressNews outer wrapper)\n// ---------------------------------------------------------------------------\n\n.container {\n display: grid;\n justify-items: start;\n background-color: rgba(255, 255, 255, 0.2);\n border-radius: 9px;\n max-width: 1300px;\n margin: auto;\n\n // Mobile-first: single column\n grid-template-columns: 100%;\n padding-top: 0;\n padding-bottom: 40px;\n\n // ≥ MUI 'sm' breakpoint (600px)\n @media (min-width: 600px) {\n grid-template-columns: 50% 50%;\n padding-top: 80px;\n padding-bottom: 60px;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Individual item row\n// ---------------------------------------------------------------------------\n\n.item {\n display: grid;\n grid-template-columns: 80% 20%;\n // Each item provides its own right + bottom edge.\n // Leading edges (top/left) are added selectively to avoid doubling.\n border-right: 1px solid var(--synapse-gray-400); // lighter interior border\n border-bottom: 1px solid var(--synapse-gray-400);\n\n // Mobile: single column — every item is the left edge; only the first has a top edge.\n border-left: 1px solid var(--synapse-gray-400);\n &:first-child {\n border-top: 1px solid var(--synapse-gray-400);\n }\n\n // Desktop: two columns — left edge belongs to odd items (col 1); top edge to the first two (row 1).\n @media (min-width: 600px) {\n border-left: none;\n border-top: none;\n\n &:nth-child(odd) {\n border-left: 1px solid var(--synapse-gray-400);\n }\n\n &:nth-child(-n + 2) {\n border-top: 1px solid var(--synapse-gray-400);\n }\n }\n\n width: 100%;\n background-color: rgba(255, 255, 255, 0.9);\n padding: 15px 0;\n\n text-decoration: none;\n\n &:hover {\n background-color: rgba(233, 243, 254, 0.95);\n cursor: pointer;\n text-decoration: none !important;\n }\n\n .itemTitle {\n color: var(--synapse-gray-900);\n font-size: 16px;\n font-weight: 700;\n }\n .itemMeta {\n color: var(--synapse-gray-700);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Item: left content area\n// ---------------------------------------------------------------------------\n\n.itemContent {\n color: var(--synapse-gray-900);\n padding-left: 15px;\n padding-right: 10px;\n}\n\n// ---------------------------------------------------------------------------\n// Item: right action area (chip container)\n// ---------------------------------------------------------------------------\n\n.itemAction {\n justify-self: end;\n align-self: start;\n padding-right: 15px;\n}\n\n// ---------------------------------------------------------------------------\n// Category / type chip\n// ---------------------------------------------------------------------------\n\n.chip:global(.MuiChip-root) {\n border-radius: 5px;\n height: 24px;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"HotdropsAndNews.module.js","names":[],"sources":["../../../src/components/SynapseHomepageV2/HotdropsAndNews.module.scss"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Grid container (SynapseHotDrops / WordPressNews outer wrapper)\n// ---------------------------------------------------------------------------\n\n.container {\n display: grid;\n justify-items: start;\n background-color: rgba(255, 255, 255, 0.2);\n border-radius: 9px;\n max-width: 1300px;\n margin: auto;\n\n // Mobile-first: single column\n grid-template-columns: 100%;\n padding-top: 0;\n padding-bottom: 40px;\n\n // ≥ MUI 'sm' breakpoint (600px)\n @media (min-width: 600px) {\n grid-template-columns: 50% 50%;\n padding-top: 80px;\n padding-bottom: 60px;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Individual item row\n// ---------------------------------------------------------------------------\n\n.item {\n display: grid;\n grid-template-columns: 80% 20%;\n // Each item provides its own right + bottom edge.\n // Leading edges (top/left) are added selectively to avoid doubling.\n border-right: 1px solid var(--synapse-gray-400); // lighter interior border\n border-bottom: 1px solid var(--synapse-gray-400);\n\n // Mobile: single column — every item is the left edge; only the first has a top edge.\n border-left: 1px solid var(--synapse-gray-400);\n &:first-child {\n border-top: 1px solid var(--synapse-gray-400);\n }\n\n // Desktop: two columns — left edge belongs to odd items (col 1); top edge to the first two (row 1).\n @media (min-width: 600px) {\n border-left: none;\n border-top: none;\n\n &:nth-child(odd) {\n border-left: 1px solid var(--synapse-gray-400);\n }\n\n &:nth-child(-n + 2) {\n border-top: 1px solid var(--synapse-gray-400);\n }\n }\n\n width: 100%;\n background-color: rgba(255, 255, 255, 0.9);\n padding: 15px 0;\n\n text-decoration: none;\n\n &:hover {\n background-color: rgba(233, 243, 254, 0.95);\n cursor: pointer;\n text-decoration: none !important;\n }\n\n .itemTitle {\n color: var(--synapse-gray-900);\n font-size: 16px;\n font-weight: 700;\n }\n .itemMeta {\n color: var(--synapse-gray-700);\n }\n}\n\n.adkpVariant {\n .item:hover {\n background: linear-gradient(\n 91deg,\n #7761b7 5.34%,\n #9067b6 24.31%,\n #816dc8 91.15%\n );\n\n .itemTitle,\n .itemMeta {\n color: #fff;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Item: left content area\n// ---------------------------------------------------------------------------\n\n.itemContent {\n color: var(--synapse-gray-900);\n padding-left: 15px;\n padding-right: 10px;\n}\n\n// ---------------------------------------------------------------------------\n// Item: right action area (chip container)\n// ---------------------------------------------------------------------------\n\n.itemAction {\n justify-self: end;\n align-self: start;\n padding-right: 15px;\n}\n\n// ---------------------------------------------------------------------------\n// Category / type chip\n// ---------------------------------------------------------------------------\n\n.chip:global(.MuiChip-root) {\n border-radius: 5px;\n height: 24px;\n}\n"],"mappings":""}
@@ -77,6 +77,22 @@
77
77
  }
78
78
  }
79
79
 
80
+ .adkpVariant {
81
+ .item:hover {
82
+ background: linear-gradient(
83
+ 91deg,
84
+ #7761b7 5.34%,
85
+ #9067b6 24.31%,
86
+ #816dc8 91.15%
87
+ );
88
+
89
+ .itemTitle,
90
+ .itemMeta {
91
+ color: #fff;
92
+ }
93
+ }
94
+ }
95
+
80
96
  // ---------------------------------------------------------------------------
81
97
  // Item: left content area
82
98
  // ---------------------------------------------------------------------------
@@ -3,6 +3,8 @@ export type WordPressNewsProps = {
3
3
  wordpressSiteUrl: string;
4
4
  /** Number of posts to display. Defaults to 10. */
5
5
  postCount?: number;
6
+ showCategoryChips?: boolean;
7
+ variant?: 'adkp';
6
8
  };
7
- export declare function WordPressNews({ wordpressSiteUrl, postCount, }: WordPressNewsProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function WordPressNews({ wordpressSiteUrl, postCount, showCategoryChips, variant, }: WordPressNewsProps): import("react/jsx-runtime").JSX.Element;
8
10
  //# sourceMappingURL=WordPressNews.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WordPressNews.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseHomepageV2/WordPressNews.tsx"],"names":[],"mappings":"AASA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,CAAA;IACxB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAgCD,wBAAgB,aAAa,CAAC,EAC5B,gBAAgB,EAChB,SAAc,GACf,EAAE,kBAAkB,2CA8BpB"}
1
+ {"version":3,"file":"WordPressNews.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseHomepageV2/WordPressNews.tsx"],"names":[],"mappings":"AASA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,CAAA;IACxB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAgCD,wBAAgB,aAAa,CAAC,EAC5B,gBAAgB,EAChB,SAAc,EACd,iBAAwB,EACxB,OAAO,GACR,EAAE,kBAAkB,2CAoCpB"}
@@ -18,24 +18,25 @@ async function s(e) {
18
18
  if (!n.ok) throw Error(`Failed to fetch WordPress categories: ${n.statusText}`);
19
19
  return n.json();
20
20
  }
21
- function c({ wordpressSiteUrl: c, postCount: l = 10 }) {
22
- let { data: u } = a({
21
+ function c({ wordpressSiteUrl: c, postCount: l = 10, showCategoryChips: u = !0, variant: d }) {
22
+ let { data: f } = a({
23
23
  queryKey: [
24
24
  "wordpressPosts",
25
25
  c,
26
26
  l
27
27
  ],
28
28
  queryFn: () => o(c, l)
29
- }), { data: d } = a({
29
+ }), { data: p } = a({
30
30
  queryKey: ["wordpressCategories", c],
31
31
  queryFn: () => s(c)
32
- }), f = new Map((d ?? []).map((e) => [e.id, e.name]));
33
- return !u || u.length === 0 ? /* @__PURE__ */ i(r, {}) : /* @__PURE__ */ i(n, {
34
- className: e.container,
32
+ }), m = new Map((p ?? []).map((e) => [e.id, e.name]));
33
+ return !f || f.length === 0 ? /* @__PURE__ */ i(r, {}) : /* @__PURE__ */ i(n, {
34
+ className: `${e.container}${d === "adkp" ? ` ${e.adkpVariant}` : ""}`,
35
35
  sx: { color: "primary.100" },
36
- children: u.map((e) => /* @__PURE__ */ i(t, {
36
+ children: f.map((e) => /* @__PURE__ */ i(t, {
37
37
  post: e,
38
- categoryName: f.get(e.categories[0])
38
+ categoryName: m.get(e.categories[0]),
39
+ showCategoryChip: u
39
40
  }, e.id))
40
41
  });
41
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WordPressNews.js","names":[],"sources":["../../../src/components/SynapseHomepageV2/WordPressNews.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { Box } from '@mui/material'\nimport {\n WordPressCategory,\n WordPressNewsItem,\n WordPressPost,\n} from './WordPressNewsItem'\nimport styles from './HotdropsAndNews.module.scss'\n\nexport type WordPressNewsProps = {\n /** Base URL of the WordPress site, e.g. \"https://news.adknowledgeportal.org\" */\n wordpressSiteUrl: string\n /** Number of posts to display. Defaults to 10. */\n postCount?: number\n}\n\nasync function fetchWordPressPosts(\n wordpressSiteUrl: string,\n postCount: number,\n): Promise<WordPressPost[]> {\n const url = new URL(`${wordpressSiteUrl}/wp-json/wp/v2/posts`)\n url.searchParams.set('per_page', String(postCount))\n url.searchParams.set('orderby', 'date')\n url.searchParams.set('order', 'desc')\n url.searchParams.set('_fields', 'id,date,link,title,categories')\n const response = await fetch(url.toString())\n if (!response.ok) {\n throw new Error(`Failed to fetch WordPress posts: ${response.statusText}`)\n }\n return response.json() as Promise<WordPressPost[]>\n}\n\nasync function fetchWordPressCategories(\n wordpressSiteUrl: string,\n): Promise<WordPressCategory[]> {\n const url = new URL(`${wordpressSiteUrl}/wp-json/wp/v2/categories`)\n url.searchParams.set('_fields', 'id,name,slug')\n const response = await fetch(url.toString())\n if (!response.ok) {\n throw new Error(\n `Failed to fetch WordPress categories: ${response.statusText}`,\n )\n }\n return response.json() as Promise<WordPressCategory[]>\n}\n\nexport function WordPressNews({\n wordpressSiteUrl,\n postCount = 10,\n}: WordPressNewsProps) {\n const { data: posts } = useQuery({\n queryKey: ['wordpressPosts', wordpressSiteUrl, postCount],\n queryFn: () => fetchWordPressPosts(wordpressSiteUrl, postCount),\n })\n\n const { data: categories } = useQuery({\n queryKey: ['wordpressCategories', wordpressSiteUrl],\n queryFn: () => fetchWordPressCategories(wordpressSiteUrl),\n })\n\n const categoryMap = new Map<number, string>(\n (categories ?? []).map(c => [c.id, c.name]),\n )\n\n if (!posts || posts.length === 0) {\n return <></>\n }\n\n return (\n <Box className={styles.container} sx={{ color: 'primary.100' }}>\n {posts.map(post => (\n <WordPressNewsItem\n key={post.id}\n post={post}\n categoryName={categoryMap.get(post.categories[0])}\n />\n ))}\n </Box>\n )\n}\n"],"mappings":";;;;;;AAgBA,eAAe,EACb,GACA,GAC0B;CAC1B,IAAM,IAAM,IAAI,IAAI,GAAG,EAAiB,sBAAsB;AAI9D,CAHA,EAAI,aAAa,IAAI,YAAY,OAAO,EAAU,CAAC,EACnD,EAAI,aAAa,IAAI,WAAW,OAAO,EACvC,EAAI,aAAa,IAAI,SAAS,OAAO,EACrC,EAAI,aAAa,IAAI,WAAW,gCAAgC;CAChE,IAAM,IAAW,MAAM,MAAM,EAAI,UAAU,CAAC;AAC5C,KAAI,CAAC,EAAS,GACZ,OAAU,MAAM,oCAAoC,EAAS,aAAa;AAE5E,QAAO,EAAS,MAAM;;AAGxB,eAAe,EACb,GAC8B;CAC9B,IAAM,IAAM,IAAI,IAAI,GAAG,EAAiB,2BAA2B;AACnE,GAAI,aAAa,IAAI,WAAW,eAAe;CAC/C,IAAM,IAAW,MAAM,MAAM,EAAI,UAAU,CAAC;AAC5C,KAAI,CAAC,EAAS,GACZ,OAAU,MACR,yCAAyC,EAAS,aACnD;AAEH,QAAO,EAAS,MAAM;;AAGxB,SAAgB,EAAc,EAC5B,qBACA,eAAY,MACS;CACrB,IAAM,EAAE,MAAM,MAAU,EAAS;EAC/B,UAAU;GAAC;GAAkB;GAAkB;GAAU;EACzD,eAAe,EAAoB,GAAkB,EAAU;EAChE,CAAC,EAEI,EAAE,MAAM,MAAe,EAAS;EACpC,UAAU,CAAC,uBAAuB,EAAiB;EACnD,eAAe,EAAyB,EAAiB;EAC1D,CAAC,EAEI,IAAc,IAAI,KACrB,KAAc,EAAE,EAAE,KAAI,MAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAC5C;AAMD,QAJI,CAAC,KAAS,EAAM,WAAW,IACtB,kBAAA,GAAA,EAAK,CAAA,GAIZ,kBAAC,GAAD;EAAK,WAAW,EAAO;EAAW,IAAI,EAAE,OAAO,eAAe;YAC3D,EAAM,KAAI,MACT,kBAAC,GAAD;GAEQ;GACN,cAAc,EAAY,IAAI,EAAK,WAAW,GAAG;GACjD,EAHK,EAAK,GAGV,CACF;EACE,CAAA"}
1
+ {"version":3,"file":"WordPressNews.js","names":[],"sources":["../../../src/components/SynapseHomepageV2/WordPressNews.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { Box } from '@mui/material'\nimport {\n WordPressCategory,\n WordPressNewsItem,\n WordPressPost,\n} from './WordPressNewsItem'\nimport styles from './HotdropsAndNews.module.scss'\n\nexport type WordPressNewsProps = {\n /** Base URL of the WordPress site, e.g. \"https://news.adknowledgeportal.org\" */\n wordpressSiteUrl: string\n /** Number of posts to display. Defaults to 10. */\n postCount?: number\n showCategoryChips?: boolean\n variant?: 'adkp'\n}\n\nasync function fetchWordPressPosts(\n wordpressSiteUrl: string,\n postCount: number,\n): Promise<WordPressPost[]> {\n const url = new URL(`${wordpressSiteUrl}/wp-json/wp/v2/posts`)\n url.searchParams.set('per_page', String(postCount))\n url.searchParams.set('orderby', 'date')\n url.searchParams.set('order', 'desc')\n url.searchParams.set('_fields', 'id,date,link,title,categories')\n const response = await fetch(url.toString())\n if (!response.ok) {\n throw new Error(`Failed to fetch WordPress posts: ${response.statusText}`)\n }\n return response.json() as Promise<WordPressPost[]>\n}\n\nasync function fetchWordPressCategories(\n wordpressSiteUrl: string,\n): Promise<WordPressCategory[]> {\n const url = new URL(`${wordpressSiteUrl}/wp-json/wp/v2/categories`)\n url.searchParams.set('_fields', 'id,name,slug')\n const response = await fetch(url.toString())\n if (!response.ok) {\n throw new Error(\n `Failed to fetch WordPress categories: ${response.statusText}`,\n )\n }\n return response.json() as Promise<WordPressCategory[]>\n}\n\nexport function WordPressNews({\n wordpressSiteUrl,\n postCount = 10,\n showCategoryChips = true,\n variant,\n}: WordPressNewsProps) {\n const { data: posts } = useQuery({\n queryKey: ['wordpressPosts', wordpressSiteUrl, postCount],\n queryFn: () => fetchWordPressPosts(wordpressSiteUrl, postCount),\n })\n\n const { data: categories } = useQuery({\n queryKey: ['wordpressCategories', wordpressSiteUrl],\n queryFn: () => fetchWordPressCategories(wordpressSiteUrl),\n })\n\n const categoryMap = new Map<number, string>(\n (categories ?? []).map(c => [c.id, c.name]),\n )\n\n if (!posts || posts.length === 0) {\n return <></>\n }\n\n return (\n <Box\n className={`${styles.container}${\n variant === 'adkp' ? ` ${styles.adkpVariant}` : ''\n }`}\n sx={{ color: 'primary.100' }}\n >\n {posts.map(post => (\n <WordPressNewsItem\n key={post.id}\n post={post}\n categoryName={categoryMap.get(post.categories[0])}\n showCategoryChip={showCategoryChips}\n />\n ))}\n </Box>\n )\n}\n"],"mappings":";;;;;;AAkBA,eAAe,EACb,GACA,GAC0B;CAC1B,IAAM,IAAM,IAAI,IAAI,GAAG,EAAiB,sBAAsB;AAI9D,CAHA,EAAI,aAAa,IAAI,YAAY,OAAO,EAAU,CAAC,EACnD,EAAI,aAAa,IAAI,WAAW,OAAO,EACvC,EAAI,aAAa,IAAI,SAAS,OAAO,EACrC,EAAI,aAAa,IAAI,WAAW,gCAAgC;CAChE,IAAM,IAAW,MAAM,MAAM,EAAI,UAAU,CAAC;AAC5C,KAAI,CAAC,EAAS,GACZ,OAAU,MAAM,oCAAoC,EAAS,aAAa;AAE5E,QAAO,EAAS,MAAM;;AAGxB,eAAe,EACb,GAC8B;CAC9B,IAAM,IAAM,IAAI,IAAI,GAAG,EAAiB,2BAA2B;AACnE,GAAI,aAAa,IAAI,WAAW,eAAe;CAC/C,IAAM,IAAW,MAAM,MAAM,EAAI,UAAU,CAAC;AAC5C,KAAI,CAAC,EAAS,GACZ,OAAU,MACR,yCAAyC,EAAS,aACnD;AAEH,QAAO,EAAS,MAAM;;AAGxB,SAAgB,EAAc,EAC5B,qBACA,eAAY,IACZ,uBAAoB,IACpB,cACqB;CACrB,IAAM,EAAE,MAAM,MAAU,EAAS;EAC/B,UAAU;GAAC;GAAkB;GAAkB;GAAU;EACzD,eAAe,EAAoB,GAAkB,EAAU;EAChE,CAAC,EAEI,EAAE,MAAM,MAAe,EAAS;EACpC,UAAU,CAAC,uBAAuB,EAAiB;EACnD,eAAe,EAAyB,EAAiB;EAC1D,CAAC,EAEI,IAAc,IAAI,KACrB,KAAc,EAAE,EAAE,KAAI,MAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAC5C;AAMD,QAJI,CAAC,KAAS,EAAM,WAAW,IACtB,kBAAA,GAAA,EAAK,CAAA,GAIZ,kBAAC,GAAD;EACE,WAAW,GAAG,EAAO,YACnB,MAAY,SAAS,IAAI,EAAO,gBAAgB;EAElD,IAAI,EAAE,OAAO,eAAe;YAE3B,EAAM,KAAI,MACT,kBAAC,GAAD;GAEQ;GACN,cAAc,EAAY,IAAI,EAAK,WAAW,GAAG;GACjD,kBAAkB;GAClB,EAJK,EAAK,GAIV,CACF;EACE,CAAA"}
@@ -15,6 +15,7 @@ export type WordPressCategory = {
15
15
  export type WordPressNewsItemProps = {
16
16
  post: WordPressPost;
17
17
  categoryName: string | undefined;
18
+ showCategoryChip?: boolean;
18
19
  };
19
- export declare function WordPressNewsItem({ post, categoryName, }: WordPressNewsItemProps): import("react/jsx-runtime").JSX.Element;
20
+ export declare function WordPressNewsItem({ post, categoryName, showCategoryChip, }: WordPressNewsItemProps): import("react/jsx-runtime").JSX.Element;
20
21
  //# sourceMappingURL=WordPressNewsItem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WordPressNewsItem.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseHomepageV2/WordPressNewsItem.tsx"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,aAAa,CAAA;IACnB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;CACjC,CAAA;AAED,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,YAAY,GACb,EAAE,sBAAsB,2CA2BxB"}
1
+ {"version":3,"file":"WordPressNewsItem.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseHomepageV2/WordPressNewsItem.tsx"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,aAAa,CAAA;IACnB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,YAAY,EACZ,gBAAuB,GACxB,EAAE,sBAAsB,2CA2BxB"}
@@ -5,7 +5,7 @@ import o from "dayjs";
5
5
  import s from "dayjs/plugin/relativeTime";
6
6
  //#region src/components/SynapseHomepageV2/WordPressNewsItem.tsx
7
7
  o.extend(s);
8
- function c({ post: s, categoryName: c }) {
8
+ function c({ post: s, categoryName: c, showCategoryChip: l = !0 }) {
9
9
  return /* @__PURE__ */ a(t, {
10
10
  component: "a",
11
11
  href: s.link,
@@ -26,7 +26,7 @@ function c({ post: s, categoryName: c }) {
26
26
  })]
27
27
  }), /* @__PURE__ */ i(t, {
28
28
  className: e.itemAction,
29
- children: c && /* @__PURE__ */ i(n, {
29
+ children: c && l && /* @__PURE__ */ i(n, {
30
30
  className: e.chip,
31
31
  label: c,
32
32
  color: "primary"
@@ -1 +1 @@
1
- {"version":3,"file":"WordPressNewsItem.js","names":[],"sources":["../../../src/components/SynapseHomepageV2/WordPressNewsItem.tsx"],"sourcesContent":["import { Box, Chip, Typography } from '@mui/material'\nimport dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport styles from './HotdropsAndNews.module.scss'\n\ndayjs.extend(relativeTime)\n\nexport type WordPressPost = {\n id: number\n date: string\n link: string\n title: { rendered: string }\n categories: number[]\n}\n\nexport type WordPressCategory = {\n id: number\n name: string\n slug: string\n}\n\nexport type WordPressNewsItemProps = {\n post: WordPressPost\n categoryName: string | undefined\n}\n\nexport function WordPressNewsItem({\n post,\n categoryName,\n}: WordPressNewsItemProps) {\n return (\n <Box\n component=\"a\"\n href={post.link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.item}\n >\n <Box className={styles.itemContent}>\n <Typography\n variant=\"body1\"\n className={styles.itemTitle}\n noWrap\n dangerouslySetInnerHTML={{ __html: post.title.rendered }}\n />\n <Typography variant=\"body1\" className={styles.itemMeta}>\n {dayjs(post.date).fromNow()}\n </Typography>\n </Box>\n <Box className={styles.itemAction}>\n {categoryName && (\n <Chip className={styles.chip} label={categoryName} color=\"primary\" />\n )}\n </Box>\n </Box>\n )\n}\n"],"mappings":";;;;;;AAKA,EAAM,OAAO,EAAa;AAqB1B,SAAgB,EAAkB,EAChC,SACA,mBACyB;AACzB,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAM,EAAK;EACX,QAAO;EACP,KAAI;EACJ,WAAW,EAAO;YALpB,CAOE,kBAAC,GAAD;GAAK,WAAW,EAAO;aAAvB,CACE,kBAAC,GAAD;IACE,SAAQ;IACR,WAAW,EAAO;IAClB,QAAA;IACA,yBAAyB,EAAE,QAAQ,EAAK,MAAM,UAAU;IACxD,CAAA,EACF,kBAAC,GAAD;IAAY,SAAQ;IAAQ,WAAW,EAAO;cAC3C,EAAM,EAAK,KAAK,CAAC,SAAS;IAChB,CAAA,CACT;MACN,kBAAC,GAAD;GAAK,WAAW,EAAO;aACpB,KACC,kBAAC,GAAD;IAAM,WAAW,EAAO;IAAM,OAAO;IAAc,OAAM;IAAY,CAAA;GAEnE,CAAA,CACF"}
1
+ {"version":3,"file":"WordPressNewsItem.js","names":[],"sources":["../../../src/components/SynapseHomepageV2/WordPressNewsItem.tsx"],"sourcesContent":["import { Box, Chip, Typography } from '@mui/material'\nimport dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport styles from './HotdropsAndNews.module.scss'\n\ndayjs.extend(relativeTime)\n\nexport type WordPressPost = {\n id: number\n date: string\n link: string\n title: { rendered: string }\n categories: number[]\n}\n\nexport type WordPressCategory = {\n id: number\n name: string\n slug: string\n}\n\nexport type WordPressNewsItemProps = {\n post: WordPressPost\n categoryName: string | undefined\n showCategoryChip?: boolean\n}\n\nexport function WordPressNewsItem({\n post,\n categoryName,\n showCategoryChip = true,\n}: WordPressNewsItemProps) {\n return (\n <Box\n component=\"a\"\n href={post.link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.item}\n >\n <Box className={styles.itemContent}>\n <Typography\n variant=\"body1\"\n className={styles.itemTitle}\n noWrap\n dangerouslySetInnerHTML={{ __html: post.title.rendered }}\n />\n <Typography variant=\"body1\" className={styles.itemMeta}>\n {dayjs(post.date).fromNow()}\n </Typography>\n </Box>\n <Box className={styles.itemAction}>\n {categoryName && showCategoryChip && (\n <Chip className={styles.chip} label={categoryName} color=\"primary\" />\n )}\n </Box>\n </Box>\n )\n}\n"],"mappings":";;;;;;AAKA,EAAM,OAAO,EAAa;AAsB1B,SAAgB,EAAkB,EAChC,SACA,iBACA,sBAAmB,MACM;AACzB,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAM,EAAK;EACX,QAAO;EACP,KAAI;EACJ,WAAW,EAAO;YALpB,CAOE,kBAAC,GAAD;GAAK,WAAW,EAAO;aAAvB,CACE,kBAAC,GAAD;IACE,SAAQ;IACR,WAAW,EAAO;IAClB,QAAA;IACA,yBAAyB,EAAE,QAAQ,EAAK,MAAM,UAAU;IACxD,CAAA,EACF,kBAAC,GAAD;IAAY,SAAQ;IAAQ,WAAW,EAAO;cAC3C,EAAM,EAAK,KAAK,CAAC,SAAS;IAChB,CAAA,CACT;MACN,kBAAC,GAAD;GAAK,WAAW,EAAO;aACpB,KAAgB,KACf,kBAAC,GAAD;IAAM,WAAW,EAAO;IAAM,OAAO;IAAc,OAAM;IAAY,CAAA;GAEnE,CAAA,CACF"}
@@ -22,6 +22,13 @@ export type FTSConfig = {
22
22
  textMatchesMode: TextMatchesMode;
23
23
  distance?: number;
24
24
  searchHelpURL?: string;
25
+ /**
26
+ * Optional function to provide autocomplete suggestions for the search bar.
27
+ * When provided, the search input will show a dropdown of suggestions as the user types.
28
+ * @param searchText - The current text in the search input
29
+ * @returns A promise resolving to an array of suggestion strings
30
+ */
31
+ getSuggestions?: (searchText: string) => Promise<string[]>;
25
32
  };
26
33
  export default function Search(props: SearchV2Props): import("react/jsx-runtime").JSX.Element;
27
34
  //# sourceMappingURL=SearchV2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchV2.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseTable/SearchV2.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACb,MAAM,SAAS,CAAA;AAoBhB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAA;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAexC,MAAM,MAAM,mBAAmB,GAAG,MAAM,EAAE,CAAA;AAE1C,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,gBAAgB,CAAA;IAC9B,yBAAyB,EAAE,6BAA6B,CAAA;IACxD,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,mBAAmB,CAAA;IAChC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG,SAAS,CAAA;AAC5D,MAAM,MAAM,SAAS,GAAG;IACtB,eAAe,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AA0SD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,KAAK,EAAE,aAAa,2CAGlD"}
1
+ {"version":3,"file":"SearchV2.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseTable/SearchV2.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACb,MAAM,SAAS,CAAA;AAoBhB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAA;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAexC,MAAM,MAAM,mBAAmB,GAAG,MAAM,EAAE,CAAA;AAE1C,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,gBAAgB,CAAA;IAC9B,yBAAyB,EAAE,6BAA6B,CAAA;IACxD,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,mBAAmB,CAAA;IAChC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG,SAAS,CAAA;AAC5D,MAAM,MAAM,SAAS,GAAG;IACtB,eAAe,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAC3D,CAAA;AA0SD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,KAAK,EAAE,aAAa,2CAGlD"}
@@ -1 +1 @@
1
- {"version":3,"file":"SearchV2.js","names":[],"sources":["../../../src/components/SynapseTable/SearchV2.tsx"],"sourcesContent":["import {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n LockedColumn,\n} from '@/utils'\nimport { Collapse } from '@mui/material'\nimport {\n ColumnModel,\n ColumnMultiValueFunction,\n ColumnMultiValueFunctionQueryFilter,\n ColumnSingleValueFilterOperator,\n ColumnSingleValueQueryFilter,\n ColumnTypeEnum,\n QueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport {\n Component,\n createRef,\n FormEvent,\n RefObject,\n SyntheticEvent,\n} from 'react'\nimport { CSSTransition } from 'react-transition-group'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { QueryContextType } from '../QueryContext'\nimport { QueryVisualizationContextType } from '../QueryVisualizationWrapper'\nimport { useGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport { ReadonlyDeep } from 'type-fest'\n\ntype SearchState = {\n show: boolean\n /* \n When the component is revealed in queryplotnav we want to focus on the input field and reveal the dropdown\n there is an issue where the method handleClickOutsideForm will override the state from componentDidUpdate\n so we track when componentDidUpdate just fired so that `show` is not overriden on the click event which\n triggers componentDidUpdate \n */\n didUpdateRanLast: boolean\n searchText: string\n columnName: string\n}\n\nexport type SearchableColumnsV2 = string[]\n\nexport type SearchV2Props = {\n queryContext: QueryContextType\n queryVisualizationContext: QueryVisualizationContextType\n isQueryWrapperMenuChild?: boolean\n defaultColumn?: string\n searchable?: SearchableColumnsV2\n lockedColumn?: LockedColumn\n /**\n * PLFM-8897, PORTALS-3534: Full-Text Search configuration.\n * For Tables that have FTS enabled...\n * If specified, use the specified mode and distance (if BOOLEAN mode). Otherwise default to NATURAL_LANGUAGE mode.\n */\n ftsConfig?: ReadonlyDeep<FTSConfig>\n}\n\nexport type TextMatchesMode = 'NATURAL_LANGUAGE' | 'BOOLEAN'\nexport type FTSConfig = {\n textMatchesMode: TextMatchesMode\n distance?: number // In BOOLEAN mode, this operator tests whether two or more words all start within a specified distance from each other, measured in words.\n searchHelpURL?: string\n}\n\ntype InternalSearchProps = SearchV2Props & {\n columnModels: ColumnModel[] | undefined\n}\n\nclass _Search extends Component<InternalSearchProps, SearchState> {\n public searchFormRef: RefObject<HTMLFormElement | null>\n public radioFormRef: RefObject<HTMLFormElement | null>\n\n constructor(props: InternalSearchProps) {\n super(props)\n this.state = {\n show: false,\n didUpdateRanLast: false,\n searchText: '',\n columnName: this.props.defaultColumn ?? '',\n }\n this.searchFormRef = createRef()\n this.radioFormRef = createRef()\n }\n\n componentDidMount() {\n // @ts-expect-error\n document.addEventListener('click', this.handleClickOutsideForm)\n }\n\n componentDidUpdate(prevProps: InternalSearchProps) {\n if (\n !prevProps.queryVisualizationContext?.showSearchBar &&\n this.props.queryVisualizationContext?.showSearchBar\n ) {\n this.setState({\n show: true,\n didUpdateRanLast: true,\n })\n this.searchFormRef?.current?.querySelector('input')?.focus()\n }\n }\n\n componentWillUnmount() {\n // @ts-expect-error\n document.removeEventListener('click', this.handleClickOutsideForm)\n }\n\n handleClickOutsideForm = (event: SyntheticEvent) => {\n if (\n // @ts-expect-error\n !this.searchFormRef.current?.contains(event?.target) &&\n // @ts-expect-error\n !this.radioFormRef.current?.contains(event?.target)\n ) {\n if (this.state.didUpdateRanLast) {\n this.setState({\n didUpdateRanLast: false,\n })\n } else {\n this.setState({\n show: false,\n })\n }\n }\n }\n\n public search = (event: SyntheticEvent<HTMLFormElement>) => {\n // form completion by default causes the page to reload, so we prevent that\n event.preventDefault()\n const { searchText } = this.state\n let { columnName } = this.state\n const { searchable, lockedColumn } = this.props\n if (columnName === '') {\n if (searchable) {\n // If searchable column names are defined in the config, grab the first one (that is not locked)\n columnName = searchable.filter(\n colName => colName !== lockedColumn?.columnName,\n )[0]\n } else {\n // Otherwise, get the first column model that can be searched.\n // And for study details page: if lockedColumn is defined, remove it from the search\n const searchableColumnModels = this.props.columnModels\n ?.filter(el => el.name !== lockedColumn?.columnName)\n .filter(el => this.isSupportedColumn(el))\n columnName = searchableColumnModels?.[0].name ?? ''\n }\n }\n this.setState({\n show: false,\n })\n const { executeQueryRequest, getCurrentQueryRequest } =\n this.props.queryContext\n\n const lastQueryRequestDeepClone = getCurrentQueryRequest()\n\n const { additionalFilters = [] } = lastQueryRequestDeepClone.query\n\n const indexOfColumn = additionalFilters.findIndex((el: QueryFilter) => {\n if (\n isColumnSingleValueQueryFilter(el) ||\n (isColumnMultiValueFunctionQueryFilter(el) &&\n el.columnName === columnName)\n ) {\n return true\n }\n return false\n })\n if (indexOfColumn === -1) {\n // get the column model to figure out what kind of filter we should apply.\n const columnModel: ColumnModel | undefined =\n this.props.columnModels?.filter(el => el.name === columnName)[0]\n if (columnModel?.columnType.endsWith('_LIST')) {\n const columnMultiValueQueryFilter: ColumnMultiValueFunctionQueryFilter =\n {\n columnName,\n function: ColumnMultiValueFunction.HAS_LIKE,\n _function: ColumnMultiValueFunction.HAS_LIKE,\n values: [`%${searchText}%`],\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter',\n }\n additionalFilters.push(columnMultiValueQueryFilter)\n } else {\n if (columnModel?.columnType == ColumnTypeEnum.ENTITYID) {\n const columnSingleValueQueryFilter: ColumnSingleValueQueryFilter = {\n columnName,\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: [`${searchText.toLowerCase().replace('syn', '')}`],\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n }\n additionalFilters.push(columnSingleValueQueryFilter)\n } else {\n const columnSingleValueQueryFilter: ColumnSingleValueQueryFilter = {\n columnName,\n operator: ColumnSingleValueFilterOperator.LIKE,\n values: [`%${searchText}%`],\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n }\n additionalFilters.push(columnSingleValueQueryFilter)\n }\n }\n } else {\n ;(\n additionalFilters[indexOfColumn] as\n | ColumnSingleValueQueryFilter\n | ColumnMultiValueFunctionQueryFilter\n ).values.push(`%${searchText}%`)\n }\n lastQueryRequestDeepClone.query.additionalFilters = additionalFilters\n executeQueryRequest(lastQueryRequestDeepClone)\n }\n\n public handleChange = (event: FormEvent<HTMLInputElement>) => {\n this.setState({\n searchText: event.currentTarget.value,\n })\n }\n\n public isSupportedColumn = (columnModel?: ColumnModel) => {\n switch (columnModel?.columnType) {\n case ColumnTypeEnum.FILEHANDLEID:\n case ColumnTypeEnum.DATE:\n case ColumnTypeEnum.DATE_LIST:\n case ColumnTypeEnum.USERID:\n // case ColumnTypeEnum.ENTITYID: //PORTALS-2995: users may want to search on Synapse ID\n return false\n default:\n return true\n }\n }\n\n public isSupportedColumnAndInProps = (columnModel?: ColumnModel) => {\n if (this.isSupportedColumn(columnModel)) {\n // return true if the searchable array contains this column name\n const { searchable } = this.props\n return searchable?.some(e => e === columnModel?.name)\n }\n return false\n }\n\n render() {\n const {\n searchable,\n lockedColumn,\n columnModels,\n queryVisualizationContext: { showSearchBar, getColumnDisplayName },\n } = this.props\n const { searchText, show, columnName } = this.state\n let searchColumns: string[] = []\n\n // searchable specifies the order of the columns to search\n if (searchable) {\n searchColumns = searchable\n .map(el => columnModels?.find(model => model.name === el))\n .filter(this.isSupportedColumnAndInProps)\n .map(el => el!.name)\n } else if (columnModels) {\n searchColumns = columnModels\n ?.filter(this.isSupportedColumn)\n .map(el => el.name)\n }\n\n // For study details page: if lockedColumn is defined, remove it from the radio dropdown\n if (searchColumns.length && lockedColumn?.columnName) {\n searchColumns = searchColumns.filter(\n el => el !== lockedColumn?.columnName,\n )\n }\n return (\n <div className={`QueryWrapperSearchInput`}>\n <Collapse in={showSearchBar}>\n <form\n className=\"QueryWrapperSearchInput__searchbar\"\n onSubmit={this.search}\n onClick={() => {\n this.setState({ show: true })\n }}\n ref={this.searchFormRef}\n >\n <span className=\"QueryWrapperSearchInput__searchbar__searchicon\">\n <IconSvg icon=\"search\" />\n </span>\n <input\n onChange={this.handleChange}\n onClick={() => {\n this.setState({\n show: true,\n })\n }}\n placeholder=\"Enter Search Terms\"\n value={searchText}\n type=\"text\"\n />\n {this.state.searchText.length > 0 && (\n <button\n className=\"QueryWrapperSearchInput__searchbar__clearbutton\"\n type=\"button\"\n onClick={() => {\n this.setState({\n searchText: '',\n })\n }}\n >\n <IconSvg icon=\"close\" />\n </button>\n )}\n </form>\n </Collapse>\n <div className=\"QueryWrapperSearchInput__dropdown_pos\">\n <CSSTransition\n nodeRef={this.radioFormRef}\n in={show}\n classNames=\"QueryWrapperSearchInput__animate_dropdown\"\n timeout={{ enter: 0, exit: 300 }}\n >\n <form\n ref={this.radioFormRef}\n className=\"QueryWrapperSearchInput__column-select QueryWrapperSearchInput__animate_height\"\n >\n <p className=\"deemphasized\">\n <i> Search In Field: </i>\n </p>\n {searchColumns.map((name, index) => {\n const displayName = getColumnDisplayName(name)\n const isSelected =\n (columnName === '' && index === 0) || columnName === name\n return (\n <div className=\"radio\" key={`search-field-${name}-${index}`}>\n <label>\n <span>\n <input\n id={name}\n type=\"radio\"\n value={name}\n checked={isSelected}\n onClick={() => {\n this.searchFormRef?.current\n ?.querySelector('input')\n ?.focus()\n this.setState({\n columnName: name,\n })\n }}\n />\n <span>{displayName}</span>\n </span>\n </label>\n </div>\n )\n })}\n </form>\n </CSSTransition>\n </div>\n </div>\n )\n }\n}\n\nexport default function Search(props: SearchV2Props) {\n const { data: queryMetadata } = useGetQueryMetadata()\n return <_Search {...props} columnModels={queryMetadata?.columnModels} />\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SearchV2.js","names":[],"sources":["../../../src/components/SynapseTable/SearchV2.tsx"],"sourcesContent":["import {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n LockedColumn,\n} from '@/utils'\nimport { Collapse } from '@mui/material'\nimport {\n ColumnModel,\n ColumnMultiValueFunction,\n ColumnMultiValueFunctionQueryFilter,\n ColumnSingleValueFilterOperator,\n ColumnSingleValueQueryFilter,\n ColumnTypeEnum,\n QueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport {\n Component,\n createRef,\n FormEvent,\n RefObject,\n SyntheticEvent,\n} from 'react'\nimport { CSSTransition } from 'react-transition-group'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { QueryContextType } from '../QueryContext'\nimport { QueryVisualizationContextType } from '../QueryVisualizationWrapper'\nimport { useGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport { ReadonlyDeep } from 'type-fest'\n\ntype SearchState = {\n show: boolean\n /* \n When the component is revealed in queryplotnav we want to focus on the input field and reveal the dropdown\n there is an issue where the method handleClickOutsideForm will override the state from componentDidUpdate\n so we track when componentDidUpdate just fired so that `show` is not overriden on the click event which\n triggers componentDidUpdate \n */\n didUpdateRanLast: boolean\n searchText: string\n columnName: string\n}\n\nexport type SearchableColumnsV2 = string[]\n\nexport type SearchV2Props = {\n queryContext: QueryContextType\n queryVisualizationContext: QueryVisualizationContextType\n isQueryWrapperMenuChild?: boolean\n defaultColumn?: string\n searchable?: SearchableColumnsV2\n lockedColumn?: LockedColumn\n /**\n * PLFM-8897, PORTALS-3534: Full-Text Search configuration.\n * For Tables that have FTS enabled...\n * If specified, use the specified mode and distance (if BOOLEAN mode). Otherwise default to NATURAL_LANGUAGE mode.\n */\n ftsConfig?: ReadonlyDeep<FTSConfig>\n}\n\nexport type TextMatchesMode = 'NATURAL_LANGUAGE' | 'BOOLEAN'\nexport type FTSConfig = {\n textMatchesMode: TextMatchesMode\n distance?: number // In BOOLEAN mode, this operator tests whether two or more words all start within a specified distance from each other, measured in words.\n searchHelpURL?: string\n /**\n * Optional function to provide autocomplete suggestions for the search bar.\n * When provided, the search input will show a dropdown of suggestions as the user types.\n * @param searchText - The current text in the search input\n * @returns A promise resolving to an array of suggestion strings\n */\n getSuggestions?: (searchText: string) => Promise<string[]>\n}\n\ntype InternalSearchProps = SearchV2Props & {\n columnModels: ColumnModel[] | undefined\n}\n\nclass _Search extends Component<InternalSearchProps, SearchState> {\n public searchFormRef: RefObject<HTMLFormElement | null>\n public radioFormRef: RefObject<HTMLFormElement | null>\n\n constructor(props: InternalSearchProps) {\n super(props)\n this.state = {\n show: false,\n didUpdateRanLast: false,\n searchText: '',\n columnName: this.props.defaultColumn ?? '',\n }\n this.searchFormRef = createRef()\n this.radioFormRef = createRef()\n }\n\n componentDidMount() {\n // @ts-expect-error\n document.addEventListener('click', this.handleClickOutsideForm)\n }\n\n componentDidUpdate(prevProps: InternalSearchProps) {\n if (\n !prevProps.queryVisualizationContext?.showSearchBar &&\n this.props.queryVisualizationContext?.showSearchBar\n ) {\n this.setState({\n show: true,\n didUpdateRanLast: true,\n })\n this.searchFormRef?.current?.querySelector('input')?.focus()\n }\n }\n\n componentWillUnmount() {\n // @ts-expect-error\n document.removeEventListener('click', this.handleClickOutsideForm)\n }\n\n handleClickOutsideForm = (event: SyntheticEvent) => {\n if (\n // @ts-expect-error\n !this.searchFormRef.current?.contains(event?.target) &&\n // @ts-expect-error\n !this.radioFormRef.current?.contains(event?.target)\n ) {\n if (this.state.didUpdateRanLast) {\n this.setState({\n didUpdateRanLast: false,\n })\n } else {\n this.setState({\n show: false,\n })\n }\n }\n }\n\n public search = (event: SyntheticEvent<HTMLFormElement>) => {\n // form completion by default causes the page to reload, so we prevent that\n event.preventDefault()\n const { searchText } = this.state\n let { columnName } = this.state\n const { searchable, lockedColumn } = this.props\n if (columnName === '') {\n if (searchable) {\n // If searchable column names are defined in the config, grab the first one (that is not locked)\n columnName = searchable.filter(\n colName => colName !== lockedColumn?.columnName,\n )[0]\n } else {\n // Otherwise, get the first column model that can be searched.\n // And for study details page: if lockedColumn is defined, remove it from the search\n const searchableColumnModels = this.props.columnModels\n ?.filter(el => el.name !== lockedColumn?.columnName)\n .filter(el => this.isSupportedColumn(el))\n columnName = searchableColumnModels?.[0].name ?? ''\n }\n }\n this.setState({\n show: false,\n })\n const { executeQueryRequest, getCurrentQueryRequest } =\n this.props.queryContext\n\n const lastQueryRequestDeepClone = getCurrentQueryRequest()\n\n const { additionalFilters = [] } = lastQueryRequestDeepClone.query\n\n const indexOfColumn = additionalFilters.findIndex((el: QueryFilter) => {\n if (\n isColumnSingleValueQueryFilter(el) ||\n (isColumnMultiValueFunctionQueryFilter(el) &&\n el.columnName === columnName)\n ) {\n return true\n }\n return false\n })\n if (indexOfColumn === -1) {\n // get the column model to figure out what kind of filter we should apply.\n const columnModel: ColumnModel | undefined =\n this.props.columnModels?.filter(el => el.name === columnName)[0]\n if (columnModel?.columnType.endsWith('_LIST')) {\n const columnMultiValueQueryFilter: ColumnMultiValueFunctionQueryFilter =\n {\n columnName,\n function: ColumnMultiValueFunction.HAS_LIKE,\n _function: ColumnMultiValueFunction.HAS_LIKE,\n values: [`%${searchText}%`],\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnMultiValueFunctionQueryFilter',\n }\n additionalFilters.push(columnMultiValueQueryFilter)\n } else {\n if (columnModel?.columnType == ColumnTypeEnum.ENTITYID) {\n const columnSingleValueQueryFilter: ColumnSingleValueQueryFilter = {\n columnName,\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: [`${searchText.toLowerCase().replace('syn', '')}`],\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n }\n additionalFilters.push(columnSingleValueQueryFilter)\n } else {\n const columnSingleValueQueryFilter: ColumnSingleValueQueryFilter = {\n columnName,\n operator: ColumnSingleValueFilterOperator.LIKE,\n values: [`%${searchText}%`],\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n }\n additionalFilters.push(columnSingleValueQueryFilter)\n }\n }\n } else {\n ;(\n additionalFilters[indexOfColumn] as\n | ColumnSingleValueQueryFilter\n | ColumnMultiValueFunctionQueryFilter\n ).values.push(`%${searchText}%`)\n }\n lastQueryRequestDeepClone.query.additionalFilters = additionalFilters\n executeQueryRequest(lastQueryRequestDeepClone)\n }\n\n public handleChange = (event: FormEvent<HTMLInputElement>) => {\n this.setState({\n searchText: event.currentTarget.value,\n })\n }\n\n public isSupportedColumn = (columnModel?: ColumnModel) => {\n switch (columnModel?.columnType) {\n case ColumnTypeEnum.FILEHANDLEID:\n case ColumnTypeEnum.DATE:\n case ColumnTypeEnum.DATE_LIST:\n case ColumnTypeEnum.USERID:\n // case ColumnTypeEnum.ENTITYID: //PORTALS-2995: users may want to search on Synapse ID\n return false\n default:\n return true\n }\n }\n\n public isSupportedColumnAndInProps = (columnModel?: ColumnModel) => {\n if (this.isSupportedColumn(columnModel)) {\n // return true if the searchable array contains this column name\n const { searchable } = this.props\n return searchable?.some(e => e === columnModel?.name)\n }\n return false\n }\n\n render() {\n const {\n searchable,\n lockedColumn,\n columnModels,\n queryVisualizationContext: { showSearchBar, getColumnDisplayName },\n } = this.props\n const { searchText, show, columnName } = this.state\n let searchColumns: string[] = []\n\n // searchable specifies the order of the columns to search\n if (searchable) {\n searchColumns = searchable\n .map(el => columnModels?.find(model => model.name === el))\n .filter(this.isSupportedColumnAndInProps)\n .map(el => el!.name)\n } else if (columnModels) {\n searchColumns = columnModels\n ?.filter(this.isSupportedColumn)\n .map(el => el.name)\n }\n\n // For study details page: if lockedColumn is defined, remove it from the radio dropdown\n if (searchColumns.length && lockedColumn?.columnName) {\n searchColumns = searchColumns.filter(\n el => el !== lockedColumn?.columnName,\n )\n }\n return (\n <div className={`QueryWrapperSearchInput`}>\n <Collapse in={showSearchBar}>\n <form\n className=\"QueryWrapperSearchInput__searchbar\"\n onSubmit={this.search}\n onClick={() => {\n this.setState({ show: true })\n }}\n ref={this.searchFormRef}\n >\n <span className=\"QueryWrapperSearchInput__searchbar__searchicon\">\n <IconSvg icon=\"search\" />\n </span>\n <input\n onChange={this.handleChange}\n onClick={() => {\n this.setState({\n show: true,\n })\n }}\n placeholder=\"Enter Search Terms\"\n value={searchText}\n type=\"text\"\n />\n {this.state.searchText.length > 0 && (\n <button\n className=\"QueryWrapperSearchInput__searchbar__clearbutton\"\n type=\"button\"\n onClick={() => {\n this.setState({\n searchText: '',\n })\n }}\n >\n <IconSvg icon=\"close\" />\n </button>\n )}\n </form>\n </Collapse>\n <div className=\"QueryWrapperSearchInput__dropdown_pos\">\n <CSSTransition\n nodeRef={this.radioFormRef}\n in={show}\n classNames=\"QueryWrapperSearchInput__animate_dropdown\"\n timeout={{ enter: 0, exit: 300 }}\n >\n <form\n ref={this.radioFormRef}\n className=\"QueryWrapperSearchInput__column-select QueryWrapperSearchInput__animate_height\"\n >\n <p className=\"deemphasized\">\n <i> Search In Field: </i>\n </p>\n {searchColumns.map((name, index) => {\n const displayName = getColumnDisplayName(name)\n const isSelected =\n (columnName === '' && index === 0) || columnName === name\n return (\n <div className=\"radio\" key={`search-field-${name}-${index}`}>\n <label>\n <span>\n <input\n id={name}\n type=\"radio\"\n value={name}\n checked={isSelected}\n onClick={() => {\n this.searchFormRef?.current\n ?.querySelector('input')\n ?.focus()\n this.setState({\n columnName: name,\n })\n }}\n />\n <span>{displayName}</span>\n </span>\n </label>\n </div>\n )\n })}\n </form>\n </CSSTransition>\n </div>\n </div>\n )\n }\n}\n\nexport default function Search(props: SearchV2Props) {\n const { data: queryMetadata } = useGetQueryMetadata()\n return <_Search {...props} columnModels={queryMetadata?.columnModels} />\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseTableRenderers.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseTable/SynapseTableRenderers.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,GAAG,EACJ,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,WAAW,EAEX,aAAa,EACd,MAAM,uBAAuB,CAAA;AA2D9B,eAAO,MAAM,kBAAkB,gEAQ7B,CAAA;AAuBF,eAAO,MAAM,uBAAuB,gEAQlC,CAAA;AAiBF,eAAO,MAAM,oBAAoB,gEAQ/B,CAAA;AAyEF,eAAO,MAAM,YAAY,gEAQvB,CAAA;AAEF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,2CAiEzC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,2CAkCnE"}
1
+ {"version":3,"file":"SynapseTableRenderers.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseTable/SynapseTableRenderers.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,GAAG,EACJ,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,WAAW,EAEX,aAAa,EACd,MAAM,uBAAuB,CAAA;AA2D9B,eAAO,MAAM,kBAAkB,gEAQ7B,CAAA;AAuBF,eAAO,MAAM,uBAAuB,gEAQlC,CAAA;AAiBF,eAAO,MAAM,oBAAoB,gEAQ/B,CAAA;AAyEF,eAAO,MAAM,YAAY,gEAQvB,CAAA;AAEF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,2CAiEzC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,2CAyCnE"}
@@ -133,7 +133,7 @@ function L(e) {
133
133
  function R(e) {
134
134
  let { cell: t, table: r } = e, { data: i } = n(), a = M(e), s = P(e), c = s === void 0 ? void 0 : parseInt(s), l = r.options.meta?.rowSet?.headers ?? [], u = l.find((e) => e.name === t.column.id), d = i?.columnModels ?? [], { columnLinks: f } = o();
135
135
  if (u) {
136
- let n = (f ?? []).find((e) => e.matchColumnName === u.name), r = u.columnType, i = t.column.getIsSorted() ? "SRC-boldText" : "";
136
+ let n = (f ?? []).find((e) => e.matchColumnName === u.name), r = d.find((e) => e.name === u.name)?.columnType ?? u.columnType, i = t.column.getIsSorted() ? "SRC-boldText" : "";
137
137
  return /* @__PURE__ */ v(p, {
138
138
  columnType: r,
139
139
  columnValue: t.getValue(),
@@ -1 +1 @@
1
- {"version":3,"file":"SynapseTableRenderers.js","names":[],"sources":["../../../src/components/SynapseTable/SynapseTableRenderers.tsx"],"sourcesContent":["import { useGetEntityHeader } from '@/synapse-queries'\nimport { Checkbox } from '@mui/material'\nimport {\n ColumnTypeEnum,\n FacetColumnResult,\n FacetColumnResultValues,\n Row,\n} from '@sage-bionetworks/synapse-types'\nimport {\n CellContext,\n createColumnHelper,\n HeaderContext,\n} from '@tanstack/react-table'\nimport { useAtom, useAtomValue } from 'jotai'\nimport { isEqual } from 'lodash-es'\nimport { useCallback } from 'react'\nimport AddToDownloadListV2 from '../AddToDownloadListV2'\nimport FileEntityDirectDownload from '../DirectDownload/FileEntityDirectDownload'\nimport HasAccessV2 from '../HasAccess'\nimport { useQueryContext } from '../QueryContext'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport {\n isRowSelectedAtom,\n selectedRowsAtom,\n} from '../QueryWrapper/TableRowSelectionState'\nimport { useGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport { EnumFacetFilter } from '../widgets/query-filter/EnumFacetFilter/EnumFacetFilter'\nimport EntityIDColumnCopyIcon from './EntityIDColumnCopyIcon'\nimport SynapseTableCell from './SynapseTableCell'\nimport { useSynapseTableContext } from './SynapseTableContext'\nimport { useInView } from 'react-intersection-observer'\n\n// Add a prefix to these column IDs so they don't collide with actual column names\nconst columnIdPrefix =\n 'org.sagebionetworks.web.client.SynapseTablePredefinedColumn'\n\nconst columnHelper = createColumnHelper<Row>()\n\nfunction RowSelectionCell<TValue = unknown>(props: CellContext<Row, TValue>) {\n const { row, table } = props\n const rowSet = table.options.meta?.rowSet\n\n const isRowSelected = useAtomValue(isRowSelectedAtom)\n const [selectedRows, setSelectedRows] = useAtom(selectedRowsAtom)\n\n return (\n <div>\n <Checkbox\n inputProps={{ 'aria-label': 'Select row' }}\n checked={isRowSelected(row.original, rowSet!.headers)}\n onChange={(_event, checked) => {\n const cloneSelectedRows = [...selectedRows]\n if (checked) {\n cloneSelectedRows.push(row.original)\n } else {\n const index = cloneSelectedRows.findIndex(selectedRow =>\n isEqual(selectedRow, row.original),\n )\n if (index > -1) {\n cloneSelectedRows.splice(index, 1)\n }\n }\n // update context on change\n setSelectedRows(cloneSelectedRows)\n }}\n />\n </div>\n )\n}\n\nexport const rowSelectionColumn = columnHelper.display({\n id: `${columnIdPrefix}.RowSelectionColumn`,\n enableResizing: false,\n cell: RowSelectionCell,\n maxSize: 36,\n meta: {\n textAlign: 'center',\n },\n})\n\nfunction AddToDownloadListCell<TValue = unknown>(\n props: CellContext<Row, TValue>,\n) {\n const entityId = getEntityOrRowId(props)!\n const versionNumberString = getEntityOrRowVersion(props)\n const versionNumber = versionNumberString\n ? parseInt(versionNumberString)\n : undefined\n const { data: entityHeader } = useGetEntityHeader(entityId)\n return (\n <div data-testid={'AddToDownloadListCell'}>\n {entityHeader?.type === 'org.sagebionetworks.repo.model.FileEntity' && (\n <AddToDownloadListV2\n entityId={entityId}\n entityVersionNumber={versionNumber}\n />\n )}\n </div>\n )\n}\n\nexport const addToDownloadListColumn = columnHelper.display({\n id: `${columnIdPrefix}.AddToDownloadListColumn`,\n enableResizing: false,\n cell: AddToDownloadListCell,\n maxSize: 50,\n meta: {\n textAlign: 'center',\n },\n})\n\nfunction DirectDownloadCell<TValue = unknown>(props: CellContext<Row, TValue>) {\n const entityId = getEntityOrRowId(props)!\n const versionNumber = getEntityOrRowVersion(props)\n\n return (\n <div data-testid={'DirectDownloadCell'}>\n <FileEntityDirectDownload\n entityId={entityId}\n entityVersionNumber={versionNumber}\n iconSvgPropOverrides={{ sx: { color: 'primary.main' } }}\n />\n </div>\n )\n}\n\nexport const directDownloadColumn = columnHelper.display({\n id: `${columnIdPrefix}.DirectDownload`,\n enableResizing: false,\n cell: DirectDownloadCell,\n maxSize: 50,\n meta: {\n textAlign: 'center',\n },\n})\n\n/**\n * Given the (tanstack react) Table CellContext, return the rowId of the current Synapse Table Row.\n * If a rowEntityIDColumnName was provided in the table config, then instead return the entityID found in\n * that cell of the current Row.\n */\nfunction getEntityOrRowId<TValue = unknown>(\n props: CellContext<Row, TValue>,\n): string | undefined {\n const { row, table } = props\n const rowEntityIDColumnIndex = table.options.meta?.rowEntityIDColumnIndex\n const entityId =\n rowEntityIDColumnIndex !== undefined\n ? row.original.values[rowEntityIDColumnIndex]!\n : row.original.rowId?.toString()\n return entityId\n}\n\n/**\n * Given the (tanstack react) Table CellContext, return true if the table configuration defines a row entity version column name.\n * This will be used as the entity that represents the current Row.\n * @param props\n * @returns\n */\nfunction isRowEntityColumn<TValue = unknown>(\n props: CellContext<Row, TValue>,\n): boolean {\n const { table } = props\n return table.options.meta?.rowEntityVersionColumnIndex !== undefined\n}\n\n/**\n * Given the (tanstack react) Table CellContext, return the version of the current Synapse Table Row.\n * If a rowEntityVersionColumnName was provided in the table config, then instead return the version found in\n * that cell of the current Row.\n */\nfunction getEntityOrRowVersion<TValue = unknown>(\n props: CellContext<Row, TValue>,\n): string | undefined {\n const { row, table } = props\n const rowEntityVersionColumnIndex =\n table.options.meta?.rowEntityVersionColumnIndex\n const versionNumber =\n rowEntityVersionColumnIndex !== undefined\n ? row.original.values[rowEntityVersionColumnIndex]!\n : row.original.versionNumber?.toString()\n return versionNumber\n}\n\nfunction AccessCell<TValue = unknown>(props: CellContext<Row, TValue>) {\n const { showExternalAccessIcon } = useSynapseTableContext()\n const { ref, inView } = useInView({ triggerOnce: true })\n const entityId = getEntityOrRowId(props)!\n\n // If showExternalAccessIcon is true, defer rendering until the cell is in view to limit simultaneous API calls\n const canRenderAccessIcon =\n !showExternalAccessIcon || (showExternalAccessIcon && inView)\n\n return (\n <div ref={ref} data-testid=\"AccessCell\">\n {canRenderAccessIcon && (\n <HasAccessV2\n key={entityId}\n entityId={entityId}\n showButtonText={false}\n showExternalAccessIcon={showExternalAccessIcon}\n />\n )}\n </div>\n )\n}\n\nexport const accessColumn = columnHelper.display({\n id: `${columnIdPrefix}.Access`,\n enableResizing: false,\n cell: AccessCell,\n maxSize: 50,\n meta: {\n textAlign: 'center',\n },\n})\n\nexport function TableDataColumnHeader(\n props: HeaderContext<Row, string | null>,\n) {\n const { column } = props\n const { lockedColumn } = useQueryContext()\n const { data: queryMetadata } = useGetQueryMetadata()\n const columnModels = queryMetadata?.columnModels ?? []\n const selectColumns = queryMetadata?.selectColumns ?? []\n const selectColumn = selectColumns.find(sc => sc.name === column.id)\n const columnModel = columnModels.find(cm => cm.name === column.id)\n const facets = queryMetadata?.facets ?? []\n const { getColumnDisplayName, getHelpText } = useQueryVisualizationContext()\n\n const displayColumnName = selectColumn\n ? getColumnDisplayName(selectColumn.name)\n : column.id\n const columnHelpText = selectColumn\n ? getHelpText(selectColumn.name)\n : undefined\n // we have to figure out if the current column is a facet selection\n const facetIndex: number = facets.findIndex(\n (facetColumnResult: FacetColumnResult) => {\n return (\n facetColumnResult.columnName === columnModel?.name &&\n // Exclude JSON subcolumn facets, since there may be more than one on a given column\n facetColumnResult.jsonPath == undefined\n )\n },\n )\n // the header must be included in the facets and it has to be enumerable for current rendering capabilities\n const isFacetSelection: boolean =\n facetIndex !== -1 && facets[facetIndex].facetType === 'enumeration'\n const facet = facets[facetIndex] as FacetColumnResultValues\n const isLockedColumn =\n selectColumn &&\n selectColumn.name.toLowerCase() === lockedColumn?.columnName?.toLowerCase() // used in details page to disable filter the column\n const isEntityIDColumn =\n selectColumn &&\n selectColumn.name == 'id' &&\n selectColumn.columnType == ColumnTypeEnum.ENTITYID\n\n // TODO: enableFiltering should be specified on the column, but for now it's easier to override `getCanFilter` here where we have the facet information\n props.column.getCanFilter = useCallback(\n () => Boolean(isFacetSelection && !isLockedColumn && columnModel),\n [isFacetSelection, isLockedColumn, columnModel],\n )\n\n return (\n <ColumnHeader\n {...props}\n title={displayColumnName}\n helpText={columnHelpText}\n filterControl={\n <span>\n <EnumFacetFilter\n containerAs=\"Dropdown\"\n facet={facet}\n defaultShowAllValues={true}\n />\n </span>\n }\n additionalButtons={\n <>{isEntityIDColumn && <EntityIDColumnCopyIcon size={'small'} />}</>\n }\n />\n )\n}\n\nexport function TableDataCell(props: CellContext<Row, string | null>) {\n const { cell, table } = props\n const { data: queryMetadata } = useGetQueryMetadata()\n const entityOrRowId = getEntityOrRowId(props)\n const entityOrRowVersion = getEntityOrRowVersion(props)\n const versionNumber =\n entityOrRowVersion !== undefined ? parseInt(entityOrRowVersion) : undefined\n const selectColumns = table.options.meta?.rowSet?.headers ?? []\n const selectColumn = selectColumns.find(cm => cm.name === cell.column.id)\n const columnModels = queryMetadata?.columnModels ?? []\n const { columnLinks } = useSynapseTableContext()\n if (selectColumn) {\n const columnLinkConfig = (columnLinks ?? []).find(el => {\n return el.matchColumnName === selectColumn.name\n })\n const columnType = selectColumn.columnType\n const isBold = cell.column.getIsSorted() ? 'SRC-boldText' : ''\n return (\n <SynapseTableCell\n key={cell.id}\n columnType={columnType}\n columnValue={cell.getValue()}\n isBold={isBold}\n columnLinkConfig={columnLinkConfig}\n columnName={selectColumn.name}\n rowData={cell.row.original.values}\n selectColumns={selectColumns}\n columnModels={columnModels}\n rowId={entityOrRowId}\n rowVersionNumber={versionNumber}\n isRowEntityColumn={isRowEntityColumn(props)}\n />\n )\n } else return <td key={cell.id}></td>\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SynapseTableRenderers.js","names":[],"sources":["../../../src/components/SynapseTable/SynapseTableRenderers.tsx"],"sourcesContent":["import { useGetEntityHeader } from '@/synapse-queries'\nimport { Checkbox } from '@mui/material'\nimport {\n ColumnTypeEnum,\n FacetColumnResult,\n FacetColumnResultValues,\n Row,\n} from '@sage-bionetworks/synapse-types'\nimport {\n CellContext,\n createColumnHelper,\n HeaderContext,\n} from '@tanstack/react-table'\nimport { useAtom, useAtomValue } from 'jotai'\nimport { isEqual } from 'lodash-es'\nimport { useCallback } from 'react'\nimport AddToDownloadListV2 from '../AddToDownloadListV2'\nimport FileEntityDirectDownload from '../DirectDownload/FileEntityDirectDownload'\nimport HasAccessV2 from '../HasAccess'\nimport { useQueryContext } from '../QueryContext'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport {\n isRowSelectedAtom,\n selectedRowsAtom,\n} from '../QueryWrapper/TableRowSelectionState'\nimport { useGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport ColumnHeader from '../TanStackTable/ColumnHeader'\nimport { EnumFacetFilter } from '../widgets/query-filter/EnumFacetFilter/EnumFacetFilter'\nimport EntityIDColumnCopyIcon from './EntityIDColumnCopyIcon'\nimport SynapseTableCell from './SynapseTableCell'\nimport { useSynapseTableContext } from './SynapseTableContext'\nimport { useInView } from 'react-intersection-observer'\n\n// Add a prefix to these column IDs so they don't collide with actual column names\nconst columnIdPrefix =\n 'org.sagebionetworks.web.client.SynapseTablePredefinedColumn'\n\nconst columnHelper = createColumnHelper<Row>()\n\nfunction RowSelectionCell<TValue = unknown>(props: CellContext<Row, TValue>) {\n const { row, table } = props\n const rowSet = table.options.meta?.rowSet\n\n const isRowSelected = useAtomValue(isRowSelectedAtom)\n const [selectedRows, setSelectedRows] = useAtom(selectedRowsAtom)\n\n return (\n <div>\n <Checkbox\n inputProps={{ 'aria-label': 'Select row' }}\n checked={isRowSelected(row.original, rowSet!.headers)}\n onChange={(_event, checked) => {\n const cloneSelectedRows = [...selectedRows]\n if (checked) {\n cloneSelectedRows.push(row.original)\n } else {\n const index = cloneSelectedRows.findIndex(selectedRow =>\n isEqual(selectedRow, row.original),\n )\n if (index > -1) {\n cloneSelectedRows.splice(index, 1)\n }\n }\n // update context on change\n setSelectedRows(cloneSelectedRows)\n }}\n />\n </div>\n )\n}\n\nexport const rowSelectionColumn = columnHelper.display({\n id: `${columnIdPrefix}.RowSelectionColumn`,\n enableResizing: false,\n cell: RowSelectionCell,\n maxSize: 36,\n meta: {\n textAlign: 'center',\n },\n})\n\nfunction AddToDownloadListCell<TValue = unknown>(\n props: CellContext<Row, TValue>,\n) {\n const entityId = getEntityOrRowId(props)!\n const versionNumberString = getEntityOrRowVersion(props)\n const versionNumber = versionNumberString\n ? parseInt(versionNumberString)\n : undefined\n const { data: entityHeader } = useGetEntityHeader(entityId)\n return (\n <div data-testid={'AddToDownloadListCell'}>\n {entityHeader?.type === 'org.sagebionetworks.repo.model.FileEntity' && (\n <AddToDownloadListV2\n entityId={entityId}\n entityVersionNumber={versionNumber}\n />\n )}\n </div>\n )\n}\n\nexport const addToDownloadListColumn = columnHelper.display({\n id: `${columnIdPrefix}.AddToDownloadListColumn`,\n enableResizing: false,\n cell: AddToDownloadListCell,\n maxSize: 50,\n meta: {\n textAlign: 'center',\n },\n})\n\nfunction DirectDownloadCell<TValue = unknown>(props: CellContext<Row, TValue>) {\n const entityId = getEntityOrRowId(props)!\n const versionNumber = getEntityOrRowVersion(props)\n\n return (\n <div data-testid={'DirectDownloadCell'}>\n <FileEntityDirectDownload\n entityId={entityId}\n entityVersionNumber={versionNumber}\n iconSvgPropOverrides={{ sx: { color: 'primary.main' } }}\n />\n </div>\n )\n}\n\nexport const directDownloadColumn = columnHelper.display({\n id: `${columnIdPrefix}.DirectDownload`,\n enableResizing: false,\n cell: DirectDownloadCell,\n maxSize: 50,\n meta: {\n textAlign: 'center',\n },\n})\n\n/**\n * Given the (tanstack react) Table CellContext, return the rowId of the current Synapse Table Row.\n * If a rowEntityIDColumnName was provided in the table config, then instead return the entityID found in\n * that cell of the current Row.\n */\nfunction getEntityOrRowId<TValue = unknown>(\n props: CellContext<Row, TValue>,\n): string | undefined {\n const { row, table } = props\n const rowEntityIDColumnIndex = table.options.meta?.rowEntityIDColumnIndex\n const entityId =\n rowEntityIDColumnIndex !== undefined\n ? row.original.values[rowEntityIDColumnIndex]!\n : row.original.rowId?.toString()\n return entityId\n}\n\n/**\n * Given the (tanstack react) Table CellContext, return true if the table configuration defines a row entity version column name.\n * This will be used as the entity that represents the current Row.\n * @param props\n * @returns\n */\nfunction isRowEntityColumn<TValue = unknown>(\n props: CellContext<Row, TValue>,\n): boolean {\n const { table } = props\n return table.options.meta?.rowEntityVersionColumnIndex !== undefined\n}\n\n/**\n * Given the (tanstack react) Table CellContext, return the version of the current Synapse Table Row.\n * If a rowEntityVersionColumnName was provided in the table config, then instead return the version found in\n * that cell of the current Row.\n */\nfunction getEntityOrRowVersion<TValue = unknown>(\n props: CellContext<Row, TValue>,\n): string | undefined {\n const { row, table } = props\n const rowEntityVersionColumnIndex =\n table.options.meta?.rowEntityVersionColumnIndex\n const versionNumber =\n rowEntityVersionColumnIndex !== undefined\n ? row.original.values[rowEntityVersionColumnIndex]!\n : row.original.versionNumber?.toString()\n return versionNumber\n}\n\nfunction AccessCell<TValue = unknown>(props: CellContext<Row, TValue>) {\n const { showExternalAccessIcon } = useSynapseTableContext()\n const { ref, inView } = useInView({ triggerOnce: true })\n const entityId = getEntityOrRowId(props)!\n\n // If showExternalAccessIcon is true, defer rendering until the cell is in view to limit simultaneous API calls\n const canRenderAccessIcon =\n !showExternalAccessIcon || (showExternalAccessIcon && inView)\n\n return (\n <div ref={ref} data-testid=\"AccessCell\">\n {canRenderAccessIcon && (\n <HasAccessV2\n key={entityId}\n entityId={entityId}\n showButtonText={false}\n showExternalAccessIcon={showExternalAccessIcon}\n />\n )}\n </div>\n )\n}\n\nexport const accessColumn = columnHelper.display({\n id: `${columnIdPrefix}.Access`,\n enableResizing: false,\n cell: AccessCell,\n maxSize: 50,\n meta: {\n textAlign: 'center',\n },\n})\n\nexport function TableDataColumnHeader(\n props: HeaderContext<Row, string | null>,\n) {\n const { column } = props\n const { lockedColumn } = useQueryContext()\n const { data: queryMetadata } = useGetQueryMetadata()\n const columnModels = queryMetadata?.columnModels ?? []\n const selectColumns = queryMetadata?.selectColumns ?? []\n const selectColumn = selectColumns.find(sc => sc.name === column.id)\n const columnModel = columnModels.find(cm => cm.name === column.id)\n const facets = queryMetadata?.facets ?? []\n const { getColumnDisplayName, getHelpText } = useQueryVisualizationContext()\n\n const displayColumnName = selectColumn\n ? getColumnDisplayName(selectColumn.name)\n : column.id\n const columnHelpText = selectColumn\n ? getHelpText(selectColumn.name)\n : undefined\n // we have to figure out if the current column is a facet selection\n const facetIndex: number = facets.findIndex(\n (facetColumnResult: FacetColumnResult) => {\n return (\n facetColumnResult.columnName === columnModel?.name &&\n // Exclude JSON subcolumn facets, since there may be more than one on a given column\n facetColumnResult.jsonPath == undefined\n )\n },\n )\n // the header must be included in the facets and it has to be enumerable for current rendering capabilities\n const isFacetSelection: boolean =\n facetIndex !== -1 && facets[facetIndex].facetType === 'enumeration'\n const facet = facets[facetIndex] as FacetColumnResultValues\n const isLockedColumn =\n selectColumn &&\n selectColumn.name.toLowerCase() === lockedColumn?.columnName?.toLowerCase() // used in details page to disable filter the column\n const isEntityIDColumn =\n selectColumn &&\n selectColumn.name == 'id' &&\n selectColumn.columnType == ColumnTypeEnum.ENTITYID\n\n // TODO: enableFiltering should be specified on the column, but for now it's easier to override `getCanFilter` here where we have the facet information\n props.column.getCanFilter = useCallback(\n () => Boolean(isFacetSelection && !isLockedColumn && columnModel),\n [isFacetSelection, isLockedColumn, columnModel],\n )\n\n return (\n <ColumnHeader\n {...props}\n title={displayColumnName}\n helpText={columnHelpText}\n filterControl={\n <span>\n <EnumFacetFilter\n containerAs=\"Dropdown\"\n facet={facet}\n defaultShowAllValues={true}\n />\n </span>\n }\n additionalButtons={\n <>{isEntityIDColumn && <EntityIDColumnCopyIcon size={'small'} />}</>\n }\n />\n )\n}\n\nexport function TableDataCell(props: CellContext<Row, string | null>) {\n const { cell, table } = props\n const { data: queryMetadata } = useGetQueryMetadata()\n const entityOrRowId = getEntityOrRowId(props)\n const entityOrRowVersion = getEntityOrRowVersion(props)\n const versionNumber =\n entityOrRowVersion !== undefined ? parseInt(entityOrRowVersion) : undefined\n const selectColumns = table.options.meta?.rowSet?.headers ?? []\n const selectColumn = selectColumns.find(cm => cm.name === cell.column.id)\n const columnModels = queryMetadata?.columnModels ?? []\n const { columnLinks } = useSynapseTableContext()\n if (selectColumn) {\n const columnLinkConfig = (columnLinks ?? []).find(el => {\n return el.matchColumnName === selectColumn.name\n })\n // Prefer the authoritative ColumnModel type over the SelectColumn type.\n // For regular table queries the two are always identical. For search queries,\n // SelectColumn types are fabricated as 'STRING' during the conversion from\n // SearchQueryResults, but columnModels (from the entity bundle) carry the\n // correct types (DATE, USERID, etc.) and are available once that bundle loads.\n const columnType =\n columnModels.find(cm => cm.name === selectColumn.name)?.columnType ??\n selectColumn.columnType\n const isBold = cell.column.getIsSorted() ? 'SRC-boldText' : ''\n return (\n <SynapseTableCell\n key={cell.id}\n columnType={columnType}\n columnValue={cell.getValue()}\n isBold={isBold}\n columnLinkConfig={columnLinkConfig}\n columnName={selectColumn.name}\n rowData={cell.row.original.values}\n selectColumns={selectColumns}\n columnModels={columnModels}\n rowId={entityOrRowId}\n rowVersionNumber={versionNumber}\n isRowEntityColumn={isRowEntityColumn(props)}\n />\n )\n } else return <td key={cell.id}></td>\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePrefetchTableData.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseTable/usePrefetchTableData.ts"],"names":[],"mappings":"AAUA,OAAO,EAOL,MAAM,EAEP,MAAM,iCAAiC,CAAA;AAuNxC;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG;IAC3D,qBAAqB,EAAE,OAAO,CAAA;CAC/B,CAkBA;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CA4B5E"}
1
+ {"version":3,"file":"usePrefetchTableData.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseTable/usePrefetchTableData.ts"],"names":[],"mappings":"AAUA,OAAO,EAOL,MAAM,EAEP,MAAM,iCAAiC,CAAA;AAuNxC;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG;IAC3D,qBAAqB,EAAE,OAAO,CAAA;CAC/B,CAkBA;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAyC5E"}
@@ -95,19 +95,20 @@ function E(e) {
95
95
  return { dataHasBeenPrefetched: !n && !r && !i && !a };
96
96
  }
97
97
  function D() {
98
- let { keyFactory: t, accessToken: n } = e(), { currentQueryRequest: r } = u(), i = b();
98
+ let { keyFactory: t, accessToken: n } = e(), { currentQueryRequest: r, getRowDataQueryOptionsForPage: i } = u(), a = b();
99
99
  return m((e) => {
100
- let { rowDataQueryOptions: a } = p(f({
100
+ let o;
101
+ return o = i ? i(e) : p(f({
101
102
  type: "goToPage",
102
103
  pageNumber: e
103
- }, g(r)), void 0, t, n);
104
- return i.prefetchQuery(a);
104
+ }, g(r)), void 0, t, n).rowDataQueryOptions, a.prefetchQuery(o);
105
105
  }, [
106
106
  n,
107
107
  r,
108
+ i,
108
109
  t,
109
110
  void 0,
110
- i
111
+ a
111
112
  ]);
112
113
  }
113
114
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"usePrefetchTableData.js","names":[],"sources":["../../../src/components/SynapseTable/usePrefetchTableData.ts"],"sourcesContent":["import {\n useGetEntity,\n useGetEntityHeaders,\n useGetFileBatch,\n useGetRestrictionInformationBatch,\n useGetUserGroupHeaders,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils'\nimport { getFieldIndex, getTypeIndices } from '@/utils/functions/queryUtils'\nimport { goToPage as transformQueryToGoToPage } from '@/utils/hooks/useImmutableTableQuery/TableQueryReducerActions'\nimport {\n ColumnTypeEnum,\n FileHandleAssociateType,\n FileHandleAssociation,\n QueryBundleRequest,\n ReferenceList,\n RestrictableObjectType,\n RowSet,\n Table,\n} from '@sage-bionetworks/synapse-types'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { cloneDeep } from 'lodash-es'\nimport { useCallback, useMemo } from 'react'\nimport { useQueryContext } from '../QueryContext'\nimport { getTableQueryUseQueryOptions } from '../QueryWrapper/TableQueryUseQueryOptions'\nimport { useGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport {\n isEntityViewOrDatasetOrCollection,\n isFileViewOrDataset,\n} from './SynapseTableUtils'\n\nfunction usePrefetchFileHandleData(rowSet: RowSet) {\n const { entityId, versionNumber } = useQueryContext()\n\n const { data: entity } = useGetEntity<Table>(entityId, versionNumber)\n const { data: queryMetadata } = useGetQueryMetadata()\n\n const fileHandleIdColumnIndices = getTypeIndices(\n ColumnTypeEnum.FILEHANDLEID,\n queryMetadata?.selectColumns,\n )\n\n let fileHandlesToPrefetch: FileHandleAssociation[] = []\n\n // Now add all IDs from the entity ID columns\n if (entity && rowSet && queryMetadata && queryMetadata.selectColumns) {\n fileHandlesToPrefetch = rowSet.rows.reduce(\n (prev: FileHandleAssociation[], curr) => {\n fileHandleIdColumnIndices.forEach(index => {\n const value = curr.values[index]\n if (value) {\n const selectColumn = queryMetadata?.selectColumns![index]\n if (\n isFileViewOrDataset(entity) &&\n selectColumn.name === 'dataFileHandleId'\n ) {\n // The association is the entity\n prev.push({\n fileHandleId: value,\n associateObjectId: String(curr.rowId),\n associateObjectType: FileHandleAssociateType.FileEntity,\n })\n } else {\n // The association is the table entity\n prev.push({\n fileHandleId: value,\n associateObjectId: entity.id!,\n associateObjectType: FileHandleAssociateType.TableEntity,\n })\n }\n }\n })\n return prev\n },\n\n fileHandlesToPrefetch,\n )\n }\n\n return useGetFileBatch(\n {\n requestedFiles: fileHandlesToPrefetch,\n includeFileHandles: true,\n includePreSignedURLs: false,\n includePreviewPreSignedURLs: false,\n },\n {\n enabled: fileHandlesToPrefetch.length > 0,\n },\n )\n}\n\nfunction useGetEntitiesInTable(rowSet: RowSet) {\n const { entityId, versionNumber } = useQueryContext()\n const { data: entity } = useGetEntity<Table>(entityId, versionNumber)\n const { data: queryMetadata } = useGetQueryMetadata()\n\n let entitiesInTable: ReferenceList = []\n\n // If this is a file view/dataset, collect all the row IDs; they correspond to entities that we'll end up fetching\n if (entity && isEntityViewOrDatasetOrCollection(entity)) {\n entitiesInTable = rowSet.rows.reduce((prev: ReferenceList, curr) => {\n const { rowId, versionNumber } = curr\n if (rowId) {\n prev.push({\n targetId: `syn${rowId}`,\n targetVersionNumber: versionNumber,\n })\n }\n return prev\n }, entitiesInTable)\n }\n\n let entityIdColumnIndices = getTypeIndices(\n ColumnTypeEnum.ENTITYID,\n queryMetadata?.selectColumns,\n )\n\n if (entity && isEntityViewOrDatasetOrCollection(entity)) {\n // If this is a view/dataset, we don't need to fetch the entities in the entity ID column\n // Collecting the row IDs in the last step was sufficient\n const idColumnIndex = getFieldIndex('id', queryMetadata)\n entityIdColumnIndices = entityIdColumnIndices.filter(\n index => index !== idColumnIndex,\n )\n }\n\n const entityIdListColumnIndices = getTypeIndices(\n ColumnTypeEnum.ENTITYID_LIST,\n queryMetadata?.selectColumns,\n )\n\n entitiesInTable = rowSet.rows.reduce((prev: ReferenceList, curr) => {\n // Get all IDs from the entity ID columns\n entityIdColumnIndices.forEach(index => {\n const value = curr.values[index]\n if (\n value &&\n !prev.find(e => e.targetId === value && e.targetVersionNumber == null)\n ) {\n prev.push({ targetId: value })\n }\n })\n // Get all IDs from the entity ID list columns\n entityIdListColumnIndices.forEach(index => {\n const value = curr.values[index]\n if (value) {\n const ids = JSON.parse(value) as string[]\n ids.forEach(id => {\n if (\n id &&\n !prev.find(e => e.targetId === id && e.targetVersionNumber == null)\n ) {\n prev.push({ targetId: id })\n }\n })\n }\n })\n\n return prev\n }, entitiesInTable)\n\n return entitiesInTable\n}\n\nfunction usePrefetchEntityData(entitiesToPrefetch: ReferenceList) {\n return useGetEntityHeaders(entitiesToPrefetch, {\n enabled: entitiesToPrefetch.length > 0,\n })\n}\n\nfunction usePrefetchUserGroupHeaderData(rowSet: RowSet) {\n const { data: queryMetadata } = useGetQueryMetadata()\n\n const userIdColumnIndices = getTypeIndices(\n ColumnTypeEnum.USERID,\n queryMetadata?.selectColumns,\n )\n\n const userIdListColumnIndices = getTypeIndices(\n ColumnTypeEnum.USERID_LIST,\n queryMetadata?.selectColumns,\n )\n\n const principalIdsToPrefetch: string[] = rowSet.rows.reduce(\n (prev: string[], curr) => {\n // Add all IDs from the USERID columns\n userIdColumnIndices.forEach(index => {\n const value = curr.values[index]\n if (value && !prev.includes(value)) {\n prev.push(value)\n }\n })\n // Add all IDs from the USERID_LIST columns\n userIdListColumnIndices.forEach(index => {\n const value = curr.values[index]\n if (value) {\n const userIds = JSON.parse(value) as number[]\n userIds.forEach(userId => {\n if (!prev.includes(String(userId))) {\n prev.push(String(userId))\n }\n })\n }\n })\n return prev\n },\n [],\n )\n\n return useGetUserGroupHeaders(principalIdsToPrefetch, {\n enabled: principalIdsToPrefetch.length > 0,\n })\n}\n\nfunction usePrefetchEntityRestrictionData(entitiesToPrefetch: ReferenceList) {\n // This information only varies by entity ID, not version number. The restriction information is the same for all versions.\n const uniqueEntityIds = useMemo(() => {\n const entityIds = entitiesToPrefetch.map(e => e.targetId)\n // Dedupe the list in case there were duplicates, e.g. there were multiple versions of the same entity\n return Array.from(new Set(entityIds))\n }, [entitiesToPrefetch])\n\n return useGetRestrictionInformationBatch(\n {\n objectIds: uniqueEntityIds,\n restrictableObjectType: RestrictableObjectType.ENTITY,\n },\n {\n enabled: entitiesToPrefetch.length > 0,\n },\n )\n}\n\n/**\n * Uses react-query to prefetch data rendered by SynapseTable. Each SynapseTableCell instance load data to render rich\n * content (e.g. entity data) for the cell based on its column type. This hook uses react-query hooks that will\n * fetch and de-normalize batch requests, so when the SynapseTableCell component renders, the data is already loaded\n * in the cache. In practice, this avoids Synapse backend throttling and 'waterfall' content rendering.\n */\nexport function usePrefetchResourcesInTable(rowSet: RowSet): {\n dataHasBeenPrefetched: boolean\n} {\n const entitiesToPrefetch = useGetEntitiesInTable(rowSet)\n const { isLoading: isLoadingEntityData } =\n usePrefetchEntityData(entitiesToPrefetch)\n const { isLoading: isLoadingEntityRestrictionData } =\n usePrefetchEntityRestrictionData(entitiesToPrefetch)\n const { isLoading: isLoadingFileHandleData } =\n usePrefetchFileHandleData(rowSet)\n const { isLoading: isLoadingUserGroupData } =\n usePrefetchUserGroupHeaderData(rowSet)\n\n return {\n dataHasBeenPrefetched:\n !isLoadingEntityData &&\n !isLoadingEntityRestrictionData &&\n !isLoadingFileHandleData &&\n !isLoadingUserGroupData,\n }\n}\n\n/**\n * Uses react-query to prefetch an entire page of row data.\n *\n * @returns A function that will prefetch the data for a given page number.\n */\nexport function usePrefetchTableRows(): (pageNumber: number) => Promise<void> {\n const { keyFactory, accessToken } = useSynapseContext()\n const { currentQueryRequest } = useQueryContext()\n const queryClient = useQueryClient()\n\n // locked column does not matter for row data\n const lockedColumn = undefined\n return useCallback(\n (pageNumber: number) => {\n // Get the query for the next page\n const queryWithUpdatedPage = transformQueryToGoToPage(\n { type: 'goToPage', pageNumber },\n cloneDeep(currentQueryRequest) as QueryBundleRequest,\n )\n\n // Transform the query into UseQueryOptions\n const { rowDataQueryOptions } = getTableQueryUseQueryOptions(\n queryWithUpdatedPage,\n lockedColumn,\n keyFactory,\n accessToken,\n )\n\n // Finally, prefetch the data\n return queryClient.prefetchQuery(rowDataQueryOptions)\n },\n [accessToken, currentQueryRequest, keyFactory, lockedColumn, queryClient],\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"usePrefetchTableData.js","names":[],"sources":["../../../src/components/SynapseTable/usePrefetchTableData.ts"],"sourcesContent":["import {\n useGetEntity,\n useGetEntityHeaders,\n useGetFileBatch,\n useGetRestrictionInformationBatch,\n useGetUserGroupHeaders,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils'\nimport { getFieldIndex, getTypeIndices } from '@/utils/functions/queryUtils'\nimport { goToPage as transformQueryToGoToPage } from '@/utils/hooks/useImmutableTableQuery/TableQueryReducerActions'\nimport {\n ColumnTypeEnum,\n FileHandleAssociateType,\n FileHandleAssociation,\n QueryBundleRequest,\n ReferenceList,\n RestrictableObjectType,\n RowSet,\n Table,\n} from '@sage-bionetworks/synapse-types'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { cloneDeep } from 'lodash-es'\nimport { useCallback, useMemo } from 'react'\nimport { useQueryContext } from '../QueryContext'\nimport { getTableQueryUseQueryOptions } from '../QueryWrapper/TableQueryUseQueryOptions'\nimport { useGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport {\n isEntityViewOrDatasetOrCollection,\n isFileViewOrDataset,\n} from './SynapseTableUtils'\n\nfunction usePrefetchFileHandleData(rowSet: RowSet) {\n const { entityId, versionNumber } = useQueryContext()\n\n const { data: entity } = useGetEntity<Table>(entityId, versionNumber)\n const { data: queryMetadata } = useGetQueryMetadata()\n\n const fileHandleIdColumnIndices = getTypeIndices(\n ColumnTypeEnum.FILEHANDLEID,\n queryMetadata?.selectColumns,\n )\n\n let fileHandlesToPrefetch: FileHandleAssociation[] = []\n\n // Now add all IDs from the entity ID columns\n if (entity && rowSet && queryMetadata && queryMetadata.selectColumns) {\n fileHandlesToPrefetch = rowSet.rows.reduce(\n (prev: FileHandleAssociation[], curr) => {\n fileHandleIdColumnIndices.forEach(index => {\n const value = curr.values[index]\n if (value) {\n const selectColumn = queryMetadata?.selectColumns![index]\n if (\n isFileViewOrDataset(entity) &&\n selectColumn.name === 'dataFileHandleId'\n ) {\n // The association is the entity\n prev.push({\n fileHandleId: value,\n associateObjectId: String(curr.rowId),\n associateObjectType: FileHandleAssociateType.FileEntity,\n })\n } else {\n // The association is the table entity\n prev.push({\n fileHandleId: value,\n associateObjectId: entity.id!,\n associateObjectType: FileHandleAssociateType.TableEntity,\n })\n }\n }\n })\n return prev\n },\n\n fileHandlesToPrefetch,\n )\n }\n\n return useGetFileBatch(\n {\n requestedFiles: fileHandlesToPrefetch,\n includeFileHandles: true,\n includePreSignedURLs: false,\n includePreviewPreSignedURLs: false,\n },\n {\n enabled: fileHandlesToPrefetch.length > 0,\n },\n )\n}\n\nfunction useGetEntitiesInTable(rowSet: RowSet) {\n const { entityId, versionNumber } = useQueryContext()\n const { data: entity } = useGetEntity<Table>(entityId, versionNumber)\n const { data: queryMetadata } = useGetQueryMetadata()\n\n let entitiesInTable: ReferenceList = []\n\n // If this is a file view/dataset, collect all the row IDs; they correspond to entities that we'll end up fetching\n if (entity && isEntityViewOrDatasetOrCollection(entity)) {\n entitiesInTable = rowSet.rows.reduce((prev: ReferenceList, curr) => {\n const { rowId, versionNumber } = curr\n if (rowId) {\n prev.push({\n targetId: `syn${rowId}`,\n targetVersionNumber: versionNumber,\n })\n }\n return prev\n }, entitiesInTable)\n }\n\n let entityIdColumnIndices = getTypeIndices(\n ColumnTypeEnum.ENTITYID,\n queryMetadata?.selectColumns,\n )\n\n if (entity && isEntityViewOrDatasetOrCollection(entity)) {\n // If this is a view/dataset, we don't need to fetch the entities in the entity ID column\n // Collecting the row IDs in the last step was sufficient\n const idColumnIndex = getFieldIndex('id', queryMetadata)\n entityIdColumnIndices = entityIdColumnIndices.filter(\n index => index !== idColumnIndex,\n )\n }\n\n const entityIdListColumnIndices = getTypeIndices(\n ColumnTypeEnum.ENTITYID_LIST,\n queryMetadata?.selectColumns,\n )\n\n entitiesInTable = rowSet.rows.reduce((prev: ReferenceList, curr) => {\n // Get all IDs from the entity ID columns\n entityIdColumnIndices.forEach(index => {\n const value = curr.values[index]\n if (\n value &&\n !prev.find(e => e.targetId === value && e.targetVersionNumber == null)\n ) {\n prev.push({ targetId: value })\n }\n })\n // Get all IDs from the entity ID list columns\n entityIdListColumnIndices.forEach(index => {\n const value = curr.values[index]\n if (value) {\n const ids = JSON.parse(value) as string[]\n ids.forEach(id => {\n if (\n id &&\n !prev.find(e => e.targetId === id && e.targetVersionNumber == null)\n ) {\n prev.push({ targetId: id })\n }\n })\n }\n })\n\n return prev\n }, entitiesInTable)\n\n return entitiesInTable\n}\n\nfunction usePrefetchEntityData(entitiesToPrefetch: ReferenceList) {\n return useGetEntityHeaders(entitiesToPrefetch, {\n enabled: entitiesToPrefetch.length > 0,\n })\n}\n\nfunction usePrefetchUserGroupHeaderData(rowSet: RowSet) {\n const { data: queryMetadata } = useGetQueryMetadata()\n\n const userIdColumnIndices = getTypeIndices(\n ColumnTypeEnum.USERID,\n queryMetadata?.selectColumns,\n )\n\n const userIdListColumnIndices = getTypeIndices(\n ColumnTypeEnum.USERID_LIST,\n queryMetadata?.selectColumns,\n )\n\n const principalIdsToPrefetch: string[] = rowSet.rows.reduce(\n (prev: string[], curr) => {\n // Add all IDs from the USERID columns\n userIdColumnIndices.forEach(index => {\n const value = curr.values[index]\n if (value && !prev.includes(value)) {\n prev.push(value)\n }\n })\n // Add all IDs from the USERID_LIST columns\n userIdListColumnIndices.forEach(index => {\n const value = curr.values[index]\n if (value) {\n const userIds = JSON.parse(value) as number[]\n userIds.forEach(userId => {\n if (!prev.includes(String(userId))) {\n prev.push(String(userId))\n }\n })\n }\n })\n return prev\n },\n [],\n )\n\n return useGetUserGroupHeaders(principalIdsToPrefetch, {\n enabled: principalIdsToPrefetch.length > 0,\n })\n}\n\nfunction usePrefetchEntityRestrictionData(entitiesToPrefetch: ReferenceList) {\n // This information only varies by entity ID, not version number. The restriction information is the same for all versions.\n const uniqueEntityIds = useMemo(() => {\n const entityIds = entitiesToPrefetch.map(e => e.targetId)\n // Dedupe the list in case there were duplicates, e.g. there were multiple versions of the same entity\n return Array.from(new Set(entityIds))\n }, [entitiesToPrefetch])\n\n return useGetRestrictionInformationBatch(\n {\n objectIds: uniqueEntityIds,\n restrictableObjectType: RestrictableObjectType.ENTITY,\n },\n {\n enabled: entitiesToPrefetch.length > 0,\n },\n )\n}\n\n/**\n * Uses react-query to prefetch data rendered by SynapseTable. Each SynapseTableCell instance load data to render rich\n * content (e.g. entity data) for the cell based on its column type. This hook uses react-query hooks that will\n * fetch and de-normalize batch requests, so when the SynapseTableCell component renders, the data is already loaded\n * in the cache. In practice, this avoids Synapse backend throttling and 'waterfall' content rendering.\n */\nexport function usePrefetchResourcesInTable(rowSet: RowSet): {\n dataHasBeenPrefetched: boolean\n} {\n const entitiesToPrefetch = useGetEntitiesInTable(rowSet)\n const { isLoading: isLoadingEntityData } =\n usePrefetchEntityData(entitiesToPrefetch)\n const { isLoading: isLoadingEntityRestrictionData } =\n usePrefetchEntityRestrictionData(entitiesToPrefetch)\n const { isLoading: isLoadingFileHandleData } =\n usePrefetchFileHandleData(rowSet)\n const { isLoading: isLoadingUserGroupData } =\n usePrefetchUserGroupHeaderData(rowSet)\n\n return {\n dataHasBeenPrefetched:\n !isLoadingEntityData &&\n !isLoadingEntityRestrictionData &&\n !isLoadingFileHandleData &&\n !isLoadingUserGroupData,\n }\n}\n\n/**\n * Uses react-query to prefetch an entire page of row data.\n *\n * @returns A function that will prefetch the data for a given page number.\n */\nexport function usePrefetchTableRows(): (pageNumber: number) => Promise<void> {\n const { keyFactory, accessToken } = useSynapseContext()\n const { currentQueryRequest, getRowDataQueryOptionsForPage } =\n useQueryContext()\n const queryClient = useQueryClient()\n\n // locked column does not matter for row data\n const lockedColumn = undefined\n return useCallback(\n (pageNumber: number) => {\n let rowDataQueryOptions\n if (getRowDataQueryOptionsForPage) {\n // Use the context-provided factory (e.g. SearchQueryWrapper) to avoid calling\n // the standard table query API with a synthetic entity ID.\n rowDataQueryOptions = getRowDataQueryOptionsForPage(pageNumber)\n } else {\n // Standard table query path\n const queryWithUpdatedPage = transformQueryToGoToPage(\n { type: 'goToPage', pageNumber },\n cloneDeep(currentQueryRequest) as QueryBundleRequest,\n )\n rowDataQueryOptions = getTableQueryUseQueryOptions(\n queryWithUpdatedPage,\n lockedColumn,\n keyFactory,\n accessToken,\n ).rowDataQueryOptions\n }\n\n // Finally, prefetch the data\n return queryClient.prefetchQuery(rowDataQueryOptions)\n },\n [\n accessToken,\n currentQueryRequest,\n getRowDataQueryOptionsForPage,\n keyFactory,\n lockedColumn,\n queryClient,\n ],\n )\n}\n"],"mappings":"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"}
@@ -38,6 +38,6 @@ type ToastMessageOptions = {
38
38
  *
39
39
  * The rest of the options params are undefined by default.
40
40
  */
41
- export declare const displayToast: (message: ReactNode, variant?: "info" | "success" | "warning" | "danger", toastMessageOptions?: ToastMessageOptions) => (() => void);
41
+ export declare const displayToast: (message: ReactNode, variant?: "info" | "success" | "warning" | "danger", toastMessageOptions?: ToastMessageOptions | null) => (() => void);
42
42
  export {};
43
43
  //# sourceMappingURL=ToastMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToastMessage.d.ts","sourceRoot":"","sources":["../../../src/components/ToastMessage/ToastMessage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAU,MAAM,OAAO,CAAA;AAGhD,OAAuB,EACrB,iBAAiB,EAClB,MAAM,kCAAkC,CAAA;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,IAAI,EACJ,QAAQ,GACT,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAiBvC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,KAAK,CAAC,SAAS,CAiBvD;AAED,KAAK,mBAAmB,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;IACvC,qBAAqB,CAAC,EAAE,iBAAiB,CAAA;IACzC,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,6BAA6B,CAAC,EAAE,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GACvB,SAAS,SAAS,EAClB,UAAU,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,EACnD,sBAAqB,mBAAwB,KAC5C,CAAC,MAAM,IAAI,CAkEb,CAAA"}
1
+ {"version":3,"file":"ToastMessage.d.ts","sourceRoot":"","sources":["../../../src/components/ToastMessage/ToastMessage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAU,MAAM,OAAO,CAAA;AAGhD,OAAuB,EACrB,iBAAiB,EAClB,MAAM,kCAAkC,CAAA;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,IAAI,EACJ,QAAQ,GACT,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAiBvC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,KAAK,CAAC,SAAS,CAiBvD;AAED,KAAK,mBAAmB,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;IACvC,qBAAqB,CAAC,EAAE,iBAAiB,CAAA;IACzC,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,6BAA6B,CAAC,EAAE,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GACvB,SAAS,SAAS,EAClB,UAAU,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,EACnD,sBAAqB,mBAAmB,GAAG,IAAS,KACnD,CAAC,MAAM,IAAI,CAkEb,CAAA"}
@@ -37,7 +37,7 @@ function u() {
37
37
  var d = (t, r, i = {}) => {
38
38
  let o = n("synToast-"), s = () => {
39
39
  a.dismiss(o);
40
- }, { title: l = void 0, primaryButtonConfig: u = void 0, secondaryButtonConfig: d = void 0, dismissOnPrimaryButtonClick: f = !1, dismissOnSecondaryButtonClick: p = !1 } = i;
40
+ }, { title: l = void 0, primaryButtonConfig: u = void 0, secondaryButtonConfig: d = void 0, dismissOnPrimaryButtonClick: f = !1, dismissOnSecondaryButtonClick: p = !1 } = i ?? {};
41
41
  if (u && "onClick" in u && f) {
42
42
  let e = u.onClick;
43
43
  u.onClick = (t) => {
@@ -50,7 +50,7 @@ var d = (t, r, i = {}) => {
50
50
  e(t), s();
51
51
  };
52
52
  }
53
- let { autoCloseInMs: m = 15e3 } = i;
53
+ let { autoCloseInMs: m = 15e3 } = i ?? {};
54
54
  return m === 0 && (m = Infinity), a(/* @__PURE__ */ c(e, {
55
55
  isGlobal: !1,
56
56
  onClose: s,
@@ -1 +1 @@
1
- {"version":3,"file":"ToastMessage.js","names":[],"sources":["../../../src/components/ToastMessage/ToastMessage.tsx"],"sourcesContent":["import { uniqueId } from 'lodash-es'\nimport React, { ReactNode, useRef } from 'react'\nimport { toast, ToastBar, Toaster } from 'react-hot-toast'\nimport { CSSTransition, TransitionGroup } from 'react-transition-group'\nimport FullWidthAlert, {\n AlertButtonConfig,\n} from '../FullWidthAlert/FullWidthAlert'\n\nexport type ToastMessageProps = {\n text: string\n show: boolean\n autohide: boolean\n}\n\n/**\n *\n * Generalization of a Material-style toast message used in a couple of places. This component is simple and\n * cannot handle issuing multiple toast messages. For more sophisticated cases, see {@link displayToast}\n */\nexport function ToastMessage({\n text,\n show,\n autohide,\n}: ToastMessageProps): React.JSX.Element {\n const modalRef = useRef<HTMLDivElement>(null)\n return (\n <TransitionGroup>\n {show && (\n <CSSTransition\n nodeRef={modalRef}\n classNames=\"SRC-card\"\n timeout={autohide ? { enter: 500, exit: 300 } : {}}\n >\n <div className=\"SRC-modal\" ref={modalRef}>\n {text}\n </div>\n </CSSTransition>\n )}\n </TransitionGroup>\n )\n}\n\n/**\n * Customized ToastContainer for using react-toastify.\n *\n * Note that this will collide with other notification systems, such as the BootstrapNotify notifications\n * in SWC.\n */\nexport function SynapseToastContainer(): React.ReactNode {\n return (\n <Toaster\n containerClassName=\"SynapseToastContainer\"\n position=\"bottom-center\"\n >\n {t => (\n <ToastBar\n toast={t}\n style={{\n ...t.style,\n animation: t.visible ? 'fadeInUp 0.5s ease' : 'fadeOutDown 1s ease', // The exit animation needs to be long enough for the element to be removed, or else it will pop back in\n }}\n ></ToastBar>\n )}\n </Toaster>\n )\n}\n\ntype ToastMessageOptions = {\n title?: string\n /* autoCloseInMs default: 15000 */\n autoCloseInMs?: number\n primaryButtonConfig?: AlertButtonConfig\n secondaryButtonConfig?: AlertButtonConfig\n dismissOnPrimaryButtonClick?: boolean\n dismissOnSecondaryButtonClick?: boolean\n}\n\n/**\n * Displays a toast message. Requires one 'SynapseToastContainer' to be somewhere in the page.\n *\n * @param message - The description of the toast message.\n * @param variant - The type of toast message to display. Default 'info'.\n\n * In ToastMessageOptions:\n *\n * @param autoCloseInMs - The amount of time in milliseconds to wait before automatically closing the toast. To prevent autoclose, set to 0 or Infinity. Default 15000.\n *\n * The rest of the options params are undefined by default.\n */\nexport const displayToast = (\n message: ReactNode,\n variant?: 'info' | 'success' | 'warning' | 'danger',\n toastMessageOptions: ToastMessageOptions = {},\n): (() => void) => {\n const id = uniqueId('synToast-')\n const onClose = () => {\n toast.dismiss(id)\n }\n\n const {\n title = undefined,\n primaryButtonConfig = undefined,\n secondaryButtonConfig = undefined,\n dismissOnPrimaryButtonClick = false,\n dismissOnSecondaryButtonClick = false,\n } = toastMessageOptions\n\n // If 'dismissOnPrimaryButtonClick' is true, then we need to invoke onClose after onClick is invoked.\n if (\n primaryButtonConfig &&\n 'onClick' in primaryButtonConfig &&\n dismissOnPrimaryButtonClick\n ) {\n const onClick = primaryButtonConfig.onClick!\n primaryButtonConfig.onClick = e => {\n onClick(e)\n onClose()\n }\n }\n\n // ditto for secondary\n if (\n secondaryButtonConfig &&\n 'onClick' in secondaryButtonConfig &&\n dismissOnSecondaryButtonClick\n ) {\n const onClick = secondaryButtonConfig.onClick!\n secondaryButtonConfig.onClick = e => {\n onClick(e)\n onClose()\n }\n }\n\n let { autoCloseInMs = 15000 } = toastMessageOptions\n // Some toast libraries use 0 to prevent autoclose\n // react-hot-toast doesn't, but we can convert it for better compatibility as we try to migrate to use just one library\n if (autoCloseInMs === 0) {\n autoCloseInMs = Infinity\n }\n\n toast(\n <FullWidthAlert\n isGlobal={false}\n onClose={onClose}\n variant={variant ?? 'info'}\n show={true}\n title={title}\n description={message}\n primaryButtonConfig={primaryButtonConfig}\n secondaryButtonConfig={secondaryButtonConfig}\n />,\n {\n id: id,\n className: 'SynapseToastMessage',\n duration: autoCloseInMs,\n },\n )\n\n return onClose\n}\n"],"mappings":";;;;;;;AAmBA,SAAgB,EAAa,EAC3B,SACA,SACA,eACuC;CACvC,IAAM,IAAW,EAAuB,KAAK;AAC7C,QACE,kBAAC,GAAD,EAAA,UACG,KACC,kBAAC,GAAD;EACE,SAAS;EACT,YAAW;EACX,SAAS,IAAW;GAAE,OAAO;GAAK,MAAM;GAAK,GAAG,EAAE;YAElD,kBAAC,OAAD;GAAK,WAAU;GAAY,KAAK;aAC7B;GACG,CAAA;EACQ,CAAA,EAEF,CAAA;;AAUtB,SAAgB,IAAyC;AACvD,QACE,kBAAC,GAAD;EACE,oBAAmB;EACnB,UAAS;aAER,MACC,kBAAC,GAAD;GACE,OAAO;GACP,OAAO;IACL,GAAG,EAAE;IACL,WAAW,EAAE,UAAU,uBAAuB;IAC/C;GACS,CAAA;EAEN,CAAA;;AA0Bd,IAAa,KACX,GACA,GACA,IAA2C,EAAE,KAC5B;CACjB,IAAM,IAAK,EAAS,YAAY,EAC1B,UAAgB;AACpB,IAAM,QAAQ,EAAG;IAGb,EACJ,WAAQ,KAAA,GACR,yBAAsB,KAAA,GACtB,2BAAwB,KAAA,GACxB,iCAA8B,IAC9B,mCAAgC,OAC9B;AAGJ,KACE,KACA,aAAa,KACb,GACA;EACA,IAAM,IAAU,EAAoB;AACpC,IAAoB,WAAU,MAAK;AAEjC,GADA,EAAQ,EAAE,EACV,GAAS;;;AAKb,KACE,KACA,aAAa,KACb,GACA;EACA,IAAM,IAAU,EAAsB;AACtC,IAAsB,WAAU,MAAK;AAEnC,GADA,EAAQ,EAAE,EACV,GAAS;;;CAIb,IAAI,EAAE,mBAAgB,SAAU;AAyBhC,QAtBI,MAAkB,MACpB,IAAgB,WAGlB,EACE,kBAAC,GAAD;EACE,UAAU;EACD;EACT,SAAS,KAAW;EACpB,MAAM;EACC;EACP,aAAa;EACQ;EACE;EACvB,CAAA,EACF;EACM;EACJ,WAAW;EACX,UAAU;EACX,CACF,EAEM"}
1
+ {"version":3,"file":"ToastMessage.js","names":[],"sources":["../../../src/components/ToastMessage/ToastMessage.tsx"],"sourcesContent":["import { uniqueId } from 'lodash-es'\nimport React, { ReactNode, useRef } from 'react'\nimport { toast, ToastBar, Toaster } from 'react-hot-toast'\nimport { CSSTransition, TransitionGroup } from 'react-transition-group'\nimport FullWidthAlert, {\n AlertButtonConfig,\n} from '../FullWidthAlert/FullWidthAlert'\n\nexport type ToastMessageProps = {\n text: string\n show: boolean\n autohide: boolean\n}\n\n/**\n *\n * Generalization of a Material-style toast message used in a couple of places. This component is simple and\n * cannot handle issuing multiple toast messages. For more sophisticated cases, see {@link displayToast}\n */\nexport function ToastMessage({\n text,\n show,\n autohide,\n}: ToastMessageProps): React.JSX.Element {\n const modalRef = useRef<HTMLDivElement>(null)\n return (\n <TransitionGroup>\n {show && (\n <CSSTransition\n nodeRef={modalRef}\n classNames=\"SRC-card\"\n timeout={autohide ? { enter: 500, exit: 300 } : {}}\n >\n <div className=\"SRC-modal\" ref={modalRef}>\n {text}\n </div>\n </CSSTransition>\n )}\n </TransitionGroup>\n )\n}\n\n/**\n * Customized ToastContainer for using react-toastify.\n *\n * Note that this will collide with other notification systems, such as the BootstrapNotify notifications\n * in SWC.\n */\nexport function SynapseToastContainer(): React.ReactNode {\n return (\n <Toaster\n containerClassName=\"SynapseToastContainer\"\n position=\"bottom-center\"\n >\n {t => (\n <ToastBar\n toast={t}\n style={{\n ...t.style,\n animation: t.visible ? 'fadeInUp 0.5s ease' : 'fadeOutDown 1s ease', // The exit animation needs to be long enough for the element to be removed, or else it will pop back in\n }}\n ></ToastBar>\n )}\n </Toaster>\n )\n}\n\ntype ToastMessageOptions = {\n title?: string\n /* autoCloseInMs default: 15000 */\n autoCloseInMs?: number\n primaryButtonConfig?: AlertButtonConfig\n secondaryButtonConfig?: AlertButtonConfig\n dismissOnPrimaryButtonClick?: boolean\n dismissOnSecondaryButtonClick?: boolean\n}\n\n/**\n * Displays a toast message. Requires one 'SynapseToastContainer' to be somewhere in the page.\n *\n * @param message - The description of the toast message.\n * @param variant - The type of toast message to display. Default 'info'.\n\n * In ToastMessageOptions:\n *\n * @param autoCloseInMs - The amount of time in milliseconds to wait before automatically closing the toast. To prevent autoclose, set to 0 or Infinity. Default 15000.\n *\n * The rest of the options params are undefined by default.\n */\nexport const displayToast = (\n message: ReactNode,\n variant?: 'info' | 'success' | 'warning' | 'danger',\n toastMessageOptions: ToastMessageOptions | null = {},\n): (() => void) => {\n const id = uniqueId('synToast-')\n const onClose = () => {\n toast.dismiss(id)\n }\n\n const {\n title = undefined,\n primaryButtonConfig = undefined,\n secondaryButtonConfig = undefined,\n dismissOnPrimaryButtonClick = false,\n dismissOnSecondaryButtonClick = false,\n } = toastMessageOptions ?? {}\n\n // If 'dismissOnPrimaryButtonClick' is true, then we need to invoke onClose after onClick is invoked.\n if (\n primaryButtonConfig &&\n 'onClick' in primaryButtonConfig &&\n dismissOnPrimaryButtonClick\n ) {\n const onClick = primaryButtonConfig.onClick!\n primaryButtonConfig.onClick = e => {\n onClick(e)\n onClose()\n }\n }\n\n // ditto for secondary\n if (\n secondaryButtonConfig &&\n 'onClick' in secondaryButtonConfig &&\n dismissOnSecondaryButtonClick\n ) {\n const onClick = secondaryButtonConfig.onClick!\n secondaryButtonConfig.onClick = e => {\n onClick(e)\n onClose()\n }\n }\n\n let { autoCloseInMs = 15000 } = toastMessageOptions ?? {}\n // Some toast libraries use 0 to prevent autoclose\n // react-hot-toast doesn't, but we can convert it for better compatibility as we try to migrate to use just one library\n if (autoCloseInMs === 0) {\n autoCloseInMs = Infinity\n }\n\n toast(\n <FullWidthAlert\n isGlobal={false}\n onClose={onClose}\n variant={variant ?? 'info'}\n show={true}\n title={title}\n description={message}\n primaryButtonConfig={primaryButtonConfig}\n secondaryButtonConfig={secondaryButtonConfig}\n />,\n {\n id: id,\n className: 'SynapseToastMessage',\n duration: autoCloseInMs,\n },\n )\n\n return onClose\n}\n"],"mappings":";;;;;;;AAmBA,SAAgB,EAAa,EAC3B,SACA,SACA,eACuC;CACvC,IAAM,IAAW,EAAuB,KAAK;AAC7C,QACE,kBAAC,GAAD,EAAA,UACG,KACC,kBAAC,GAAD;EACE,SAAS;EACT,YAAW;EACX,SAAS,IAAW;GAAE,OAAO;GAAK,MAAM;GAAK,GAAG,EAAE;YAElD,kBAAC,OAAD;GAAK,WAAU;GAAY,KAAK;aAC7B;GACG,CAAA;EACQ,CAAA,EAEF,CAAA;;AAUtB,SAAgB,IAAyC;AACvD,QACE,kBAAC,GAAD;EACE,oBAAmB;EACnB,UAAS;aAER,MACC,kBAAC,GAAD;GACE,OAAO;GACP,OAAO;IACL,GAAG,EAAE;IACL,WAAW,EAAE,UAAU,uBAAuB;IAC/C;GACS,CAAA;EAEN,CAAA;;AA0Bd,IAAa,KACX,GACA,GACA,IAAkD,EAAE,KACnC;CACjB,IAAM,IAAK,EAAS,YAAY,EAC1B,UAAgB;AACpB,IAAM,QAAQ,EAAG;IAGb,EACJ,WAAQ,KAAA,GACR,yBAAsB,KAAA,GACtB,2BAAwB,KAAA,GACxB,iCAA8B,IAC9B,mCAAgC,OAC9B,KAAuB,EAAE;AAG7B,KACE,KACA,aAAa,KACb,GACA;EACA,IAAM,IAAU,EAAoB;AACpC,IAAoB,WAAU,MAAK;AAEjC,GADA,EAAQ,EAAE,EACV,GAAS;;;AAKb,KACE,KACA,aAAa,KACb,GACA;EACA,IAAM,IAAU,EAAsB;AACtC,IAAsB,WAAU,MAAK;AAEnC,GADA,EAAQ,EAAE,EACV,GAAS;;;CAIb,IAAI,EAAE,mBAAgB,SAAU,KAAuB,EAAE;AAyBzD,QAtBI,MAAkB,MACpB,IAAgB,WAGlB,EACE,kBAAC,GAAD;EACE,UAAU;EACD;EACT,SAAS,KAAW;EACpB,MAAM;EACC;EACP,aAAa;EACQ;EACE;EACvB,CAAA,EACF;EACM;EACJ,WAAW;EACX,UAAU;EACX,CACF,EAEM"}
@@ -1 +1 @@
1
- {"version":3,"file":"SubmissionPage.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/SubmissionPage/SubmissionPage.tsx"],"names":[],"mappings":"AAoCA,MAAM,MAAM,mBAAmB,GAAG;IAChC,uCAAuC;IACvC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,qDAAqD;IACrD,UAAU,EAAE,OAAO,CAAA;CACpB,CAAA;AAkED;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CA8bhE"}
1
+ {"version":3,"file":"SubmissionPage.d.ts","sourceRoot":"","sources":["../../../../src/components/dataaccess/SubmissionPage/SubmissionPage.tsx"],"names":[],"mappings":"AAsCA,MAAM,MAAM,mBAAmB,GAAG;IAChC,uCAAuC;IACvC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,qDAAqD;IACrD,UAAU,EAAE,OAAO,CAAA;CACpB,CAAA;AAqED;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CAuchE"}