@databiosphere/findable-ui 21.3.0 → 22.0.0

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 (289) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/.storybook/main.ts +7 -1
  3. package/CHANGELOG.md +25 -0
  4. package/lib/components/DataDictionary/components/Entities/constants.d.ts +2 -0
  5. package/lib/components/DataDictionary/components/Entities/constants.js +6 -0
  6. package/lib/components/DataDictionary/components/Entities/entities.d.ts +2 -0
  7. package/lib/components/DataDictionary/components/Entities/entities.js +7 -0
  8. package/lib/components/DataDictionary/components/Entities/types.d.ts +4 -0
  9. package/lib/components/DataDictionary/components/Entities/types.js +1 -0
  10. package/lib/components/DataDictionary/components/Entity/constants.d.ts +2 -0
  11. package/lib/components/DataDictionary/components/Entity/constants.js +5 -0
  12. package/lib/components/DataDictionary/components/Entity/entity.d.ts +2 -0
  13. package/lib/components/DataDictionary/components/Entity/entity.js +14 -0
  14. package/lib/components/DataDictionary/components/Entity/types.d.ts +4 -0
  15. package/lib/components/DataDictionary/components/Entity/types.js +1 -0
  16. package/lib/components/DataDictionary/components/Table/columns/columnDef.d.ts +6 -0
  17. package/lib/components/DataDictionary/components/Table/columns/columnDef.js +33 -0
  18. package/lib/components/DataDictionary/components/Table/columns/columnIdentifier.d.ts +5 -0
  19. package/lib/components/DataDictionary/components/Table/columns/columnIdentifier.js +5 -0
  20. package/lib/components/DataDictionary/components/Table/columns/types.d.ts +2 -0
  21. package/lib/components/DataDictionary/components/Table/columns/types.js +1 -0
  22. package/lib/components/DataDictionary/components/Table/components/BasicCell/basicCell.d.ts +2 -0
  23. package/lib/components/DataDictionary/components/Table/components/BasicCell/basicCell.js +6 -0
  24. package/lib/components/DataDictionary/components/Table/components/BasicCell/types.d.ts +4 -0
  25. package/lib/components/DataDictionary/components/Table/components/BasicCell/types.js +1 -0
  26. package/lib/components/DataDictionary/components/Table/hook.d.ts +3 -0
  27. package/lib/components/DataDictionary/components/Table/hook.js +11 -0
  28. package/lib/components/DataDictionary/components/Table/options/core/constants.d.ts +3 -0
  29. package/lib/components/DataDictionary/components/Table/options/core/constants.js +7 -0
  30. package/lib/components/DataDictionary/components/Table/options/hook.d.ts +3 -0
  31. package/lib/components/DataDictionary/components/Table/options/hook.js +8 -0
  32. package/lib/components/DataDictionary/components/Table/options/sorting/constants.d.ts +3 -0
  33. package/lib/components/DataDictionary/components/Table/options/sorting/constants.js +3 -0
  34. package/lib/components/DataDictionary/components/Table/table.d.ts +2 -0
  35. package/lib/components/DataDictionary/components/Table/table.js +17 -0
  36. package/lib/components/DataDictionary/components/Table/table.styles.d.ts +3 -0
  37. package/lib/components/DataDictionary/components/Table/table.styles.js +5 -0
  38. package/lib/components/DataDictionary/components/Table/types.d.ts +5 -0
  39. package/lib/components/DataDictionary/components/Table/types.js +1 -0
  40. package/lib/components/DataDictionary/dataDictionary.d.ts +2 -0
  41. package/lib/components/DataDictionary/dataDictionary.js +9 -0
  42. package/lib/components/DataDictionary/dataDictionary.styles.d.ts +1 -0
  43. package/lib/components/DataDictionary/dataDictionary.styles.js +7 -0
  44. package/lib/components/DataDictionary/hooks/UseDataDictionary/hook.d.ts +2 -0
  45. package/lib/components/DataDictionary/hooks/UseDataDictionary/hook.js +5 -0
  46. package/lib/components/DataDictionary/hooks/UseDataDictionary/types.d.ts +4 -0
  47. package/lib/components/DataDictionary/hooks/UseDataDictionary/types.js +1 -0
  48. package/lib/components/Detail/detail.stories.d.ts +36 -5
  49. package/lib/components/Detail/detail.stories.js +27 -18
  50. package/lib/components/Export/components/ExportForm/components/ExportButton/exportButton.js +6 -1
  51. package/lib/components/Export/components/ExportMethod/exportMethod.stories.d.ts +22 -5
  52. package/lib/components/Export/components/ExportMethod/exportMethod.stories.js +9 -9
  53. package/lib/components/Export/components/ManifestDownload/components/ManifestDownloadEntity/components/FileManifestDownload/fileManifestDownload.js +5 -2
  54. package/lib/components/Filter/components/Filter/filter.stories.d.ts +25 -5
  55. package/lib/components/Filter/components/Filter/filter.stories.js +25 -24
  56. package/lib/components/Filter/components/FilterLabel/filterLabel.stories.d.ts +31 -5
  57. package/lib/components/Filter/components/FilterLabel/filterLabel.stories.js +10 -8
  58. package/lib/components/Filter/components/FilterMenu/filterMenu.stories.d.ts +38 -5
  59. package/lib/components/Filter/components/FilterMenu/filterMenu.stories.js +107 -104
  60. package/lib/components/Filter/components/FilterTag/filterTag.stories.d.ts +16 -5
  61. package/lib/components/Filter/components/FilterTag/filterTag.stories.js +8 -7
  62. package/lib/components/Filter/components/FilterTags/filterTags.stories.d.ts +18 -5
  63. package/lib/components/Filter/components/FilterTags/filterTags.stories.js +40 -39
  64. package/lib/components/Index/components/AzulFileDownload/azulFileDownload.js +10 -5
  65. package/lib/components/Index/components/AzulFileDownload/azulFileDownload.stories.d.ts +8 -5
  66. package/lib/components/Index/components/AzulFileDownload/azulFileDownload.stories.js +9 -6
  67. package/lib/components/Index/components/Hero/components/Summaries/summaries.stories.d.ts +13 -5
  68. package/lib/components/Index/components/Hero/components/Summaries/summaries.stories.js +11 -11
  69. package/lib/components/Index/components/Hero/hero.stories.d.ts +23 -5
  70. package/lib/components/Index/components/Hero/hero.stories.js +8 -6
  71. package/lib/components/Index/components/NTagCell/nTagCell.stories.d.ts +16 -5
  72. package/lib/components/Index/components/NTagCell/nTagCell.stories.js +8 -8
  73. package/lib/components/Index/index.stories.js +2 -1
  74. package/lib/components/Layout/components/BackPage/backPageView.stories.d.ts +31 -5
  75. package/lib/components/Layout/components/BackPage/backPageView.stories.js +27 -18
  76. package/lib/components/Layout/components/Footer/footer.stories.d.ts +24 -3
  77. package/lib/components/Layout/components/Footer/footer.stories.js +4 -3
  78. package/lib/components/Layout/components/Header/components/Content/components/Navigation/components/NavigationMenu/navigationMenu.js +1 -1
  79. package/lib/components/Layout/components/Header/components/Content/components/Navigation/components/NavigationMenuItems/navigationMenuItems.js +20 -21
  80. package/lib/components/Layout/components/Header/components/Content/components/Navigation/constants.d.ts +1 -0
  81. package/lib/components/Layout/components/Header/components/Content/components/Navigation/constants.js +1 -0
  82. package/lib/components/Layout/components/Header/components/Content/components/Navigation/navigation.d.ts +2 -1
  83. package/lib/components/Layout/components/Header/components/Content/components/Navigation/navigation.js +16 -17
  84. package/lib/components/Layout/components/Header/header.js +2 -1
  85. package/lib/components/Layout/components/Header/header.stories.js +1 -1
  86. package/lib/components/Layout/components/Sidebar/components/SidebarLabel/sidebarLabel.stories.d.ts +13 -5
  87. package/lib/components/Layout/components/Sidebar/components/SidebarLabel/sidebarLabel.stories.js +6 -6
  88. package/lib/components/Layout/components/Sidebar/sidebar.stories.js +2 -0
  89. package/lib/components/Links/links.stories.d.ts +13 -5
  90. package/lib/components/Links/links.stories.js +14 -14
  91. package/lib/components/Loading/loading.stories.d.ts +34 -5
  92. package/lib/components/Loading/loading.stories.js +8 -6
  93. package/lib/components/Login/components/Button/types.d.ts +1 -1
  94. package/lib/components/Login/components/Buttons/buttons.d.ts +2 -0
  95. package/lib/components/Login/components/Buttons/buttons.js +5 -0
  96. package/lib/components/Login/components/Buttons/types.d.ts +8 -0
  97. package/lib/components/Login/components/Buttons/types.js +1 -0
  98. package/lib/components/Login/components/Section/components/Consent/consent.d.ts +3 -0
  99. package/lib/components/Login/components/Section/components/Consent/consent.js +14 -0
  100. package/lib/components/Login/components/Section/components/Consent/consent.styles.d.ts +7 -0
  101. package/lib/components/Login/components/Section/components/Consent/consent.styles.js +14 -0
  102. package/lib/components/Login/components/Section/components/Consent/types.d.ts +6 -0
  103. package/lib/components/Login/components/Section/components/Consent/types.js +1 -0
  104. package/lib/components/Login/components/Section/components/Warning/warning.d.ts +3 -0
  105. package/lib/components/Login/components/Section/components/Warning/warning.js +9 -0
  106. package/lib/components/Login/hooks/useUserConsent/types.d.ts +10 -0
  107. package/lib/components/Login/hooks/useUserConsent/types.js +1 -0
  108. package/lib/components/Login/hooks/useUserConsent/useUserConsent.d.ts +2 -0
  109. package/lib/components/Login/hooks/useUserConsent/useUserConsent.js +24 -0
  110. package/lib/components/Login/hooks/useUserLogin/types.d.ts +6 -0
  111. package/lib/components/Login/hooks/useUserLogin/types.js +1 -0
  112. package/lib/components/Login/hooks/useUserLogin/useUserLogin.d.ts +2 -0
  113. package/lib/components/Login/hooks/useUserLogin/useUserLogin.js +21 -0
  114. package/lib/components/Project/components/CollaboratingOrganizations/collaboratingOrganizations.stories.d.ts +13 -5
  115. package/lib/components/Project/components/CollaboratingOrganizations/collaboratingOrganizations.stories.js +20 -20
  116. package/lib/components/Project/components/Contacts/contacts.stories.d.ts +13 -5
  117. package/lib/components/Project/components/Contacts/contacts.stories.js +18 -18
  118. package/lib/components/Project/components/Contributors/contributors.stories.d.ts +8 -5
  119. package/lib/components/Project/components/Contributors/contributors.stories.js +27 -27
  120. package/lib/components/Project/components/DataCurators/dataCurators.stories.d.ts +13 -5
  121. package/lib/components/Project/components/DataCurators/dataCurators.stories.js +7 -7
  122. package/lib/components/Project/components/DataReleasePolicy/dataReleasePolicy.stories.d.ts +8 -5
  123. package/lib/components/Project/components/DataReleasePolicy/dataReleasePolicy.stories.js +3 -4
  124. package/lib/components/Project/components/Description/description.stories.d.ts +8 -5
  125. package/lib/components/Project/components/Description/description.stories.js +6 -6
  126. package/lib/components/Project/components/Details/details.stories.d.ts +16 -5
  127. package/lib/components/Project/components/Details/details.stories.js +7 -7
  128. package/lib/components/Project/components/Publications/publications.stories.d.ts +8 -5
  129. package/lib/components/Project/components/Publications/publications.stories.js +17 -17
  130. package/lib/components/Project/components/SupplementaryLinks/supplementaryLinks.stories.d.ts +8 -5
  131. package/lib/components/Project/components/SupplementaryLinks/supplementaryLinks.stories.js +18 -18
  132. package/lib/components/Support/components/SupportRequest/components/SupportRequestForm/common/constants.d.ts +16 -33
  133. package/lib/components/Support/components/SupportRequest/components/SupportRequestForm/common/constants.js +10 -9
  134. package/lib/components/Support/components/SupportRequest/components/SupportRequestForm/supportRequestForm.js +26 -14
  135. package/lib/components/Support/components/ViewSupport/types.d.ts +6 -0
  136. package/lib/components/Support/components/ViewSupport/types.js +1 -0
  137. package/lib/components/Support/components/ViewSupport/viewSupport.d.ts +2 -9
  138. package/lib/components/Support/components/ViewSupport/viewSupport.js +7 -3
  139. package/lib/components/Table/components/Pagination/pagination.stories.d.ts +28 -5
  140. package/lib/components/Table/components/Pagination/pagination.stories.js +11 -7
  141. package/lib/components/common/Accordion/accordion.stories.d.ts +6 -3
  142. package/lib/components/common/Accordion/accordion.stories.js +2 -1
  143. package/lib/components/common/Breadcrumbs/breadcrumbs.stories.d.ts +10 -7
  144. package/lib/components/common/Breadcrumbs/breadcrumbs.stories.js +42 -43
  145. package/lib/components/common/Button/components/CallToActionButton/callToActionButton.stories.d.ts +9 -6
  146. package/lib/components/common/Button/components/CallToActionButton/callToActionButton.stories.js +13 -15
  147. package/lib/components/common/Button/components/HelpIconButton/helpIconButton.stories.d.ts +19 -2
  148. package/lib/components/common/Button/components/HelpIconButton/helpIconButton.stories.js +2 -2
  149. package/lib/components/common/Card/card.stories.d.ts +6 -3
  150. package/lib/components/common/Card/card.stories.js +2 -1
  151. package/lib/components/common/Code/code.stories.d.ts +5 -3
  152. package/lib/components/common/CopyToClipboard/copyToClipboard.stories.d.ts +11 -3
  153. package/lib/components/common/CopyToClipboard/copyToClipboard.stories.js +2 -1
  154. package/lib/components/common/CustomIcon/components/CloseIcon/closeIcon.d.ts +2 -0
  155. package/lib/components/common/CustomIcon/components/CloseIcon/closeIcon.js +6 -0
  156. package/lib/components/common/LoginDialog/constants.d.ts +6 -0
  157. package/lib/components/common/LoginDialog/constants.js +21 -0
  158. package/lib/components/common/LoginDialog/loginDialog.d.ts +2 -0
  159. package/lib/components/common/LoginDialog/loginDialog.js +27 -0
  160. package/lib/components/common/LoginDialog/loginDialog.styles.d.ts +3 -0
  161. package/lib/components/common/LoginDialog/loginDialog.styles.js +50 -0
  162. package/lib/components/common/LoginDialog/types.d.ts +4 -0
  163. package/lib/components/common/LoginDialog/types.js +1 -0
  164. package/lib/components/common/Section/components/SectionTitle/sectionTitle.stories.d.ts +13 -5
  165. package/lib/components/common/Section/components/SectionTitle/sectionTitle.stories.js +6 -6
  166. package/lib/components/common/Socials/socials.stories.d.ts +11 -3
  167. package/lib/components/common/Socials/socials.stories.js +2 -1
  168. package/lib/components/common/StaticImage/staticImage.stories.d.ts +22 -5
  169. package/lib/components/common/StaticImage/staticImage.stories.js +8 -8
  170. package/lib/components/common/StatusIcon/statusIcon.stories.d.ts +19 -5
  171. package/lib/components/common/StatusIcon/statusIcon.stories.js +7 -7
  172. package/lib/components/common/Tag/tag.stories.d.ts +15 -5
  173. package/lib/components/common/Tag/tag.stories.js +7 -5
  174. package/lib/components/common/ToggleButtonGroup/toggleButtonGroup.stories.d.ts +18 -5
  175. package/lib/components/common/ToggleButtonGroup/toggleButtonGroup.stories.js +19 -19
  176. package/lib/config/entities.d.ts +1 -0
  177. package/lib/providers/loginGuard/common/types.d.ts +18 -0
  178. package/lib/providers/loginGuard/common/types.js +1 -0
  179. package/lib/providers/loginGuard/context.d.ts +6 -0
  180. package/lib/providers/loginGuard/context.js +10 -0
  181. package/lib/providers/loginGuard/hook.d.ts +9 -0
  182. package/lib/providers/loginGuard/hook.js +12 -0
  183. package/lib/providers/loginGuard/provider.d.ts +11 -0
  184. package/lib/providers/loginGuard/provider.js +55 -0
  185. package/lib/styles/common/mui/typography.d.ts +1 -0
  186. package/lib/styles/common/mui/typography.js +8 -0
  187. package/lib/views/DataDictionaryView/dataDictionaryView.d.ts +2 -0
  188. package/lib/views/DataDictionaryView/dataDictionaryView.js +5 -0
  189. package/package.json +13 -13
  190. package/src/components/DataDictionary/components/Entities/constants.ts +8 -0
  191. package/src/components/DataDictionary/components/Entities/entities.tsx +15 -0
  192. package/src/components/DataDictionary/components/Entities/types.ts +5 -0
  193. package/src/components/DataDictionary/components/Entity/constants.ts +7 -0
  194. package/src/components/DataDictionary/components/Entity/entity.tsx +28 -0
  195. package/src/components/DataDictionary/components/Entity/types.ts +5 -0
  196. package/src/components/DataDictionary/components/Table/columns/columnDef.ts +47 -0
  197. package/src/components/DataDictionary/components/Table/columns/columnIdentifier.ts +5 -0
  198. package/src/components/DataDictionary/components/Table/columns/types.ts +3 -0
  199. package/src/components/DataDictionary/components/Table/components/BasicCell/basicCell.tsx +8 -0
  200. package/src/components/DataDictionary/components/Table/components/BasicCell/types.ts +5 -0
  201. package/src/components/DataDictionary/components/Table/hook.ts +13 -0
  202. package/src/components/DataDictionary/components/Table/options/core/constants.ts +12 -0
  203. package/src/components/DataDictionary/components/Table/options/hook.ts +14 -0
  204. package/src/components/DataDictionary/components/Table/options/sorting/constants.ts +9 -0
  205. package/src/components/DataDictionary/components/Table/table.styles.ts +6 -0
  206. package/src/components/DataDictionary/components/Table/table.tsx +35 -0
  207. package/src/components/DataDictionary/components/Table/types.ts +6 -0
  208. package/src/components/DataDictionary/dataDictionary.styles.ts +8 -0
  209. package/src/components/DataDictionary/dataDictionary.tsx +16 -0
  210. package/src/components/DataDictionary/hooks/UseDataDictionary/hook.ts +9 -0
  211. package/src/components/DataDictionary/hooks/UseDataDictionary/types.ts +5 -0
  212. package/src/components/Detail/detail.stories.tsx +41 -36
  213. package/src/components/Export/components/ExportForm/components/ExportButton/exportButton.tsx +8 -1
  214. package/src/components/Export/components/ExportMethod/exportMethod.stories.tsx +13 -13
  215. package/src/components/Export/components/ManifestDownload/components/ManifestDownloadEntity/components/FileManifestDownload/fileManifestDownload.tsx +11 -3
  216. package/src/components/Filter/components/Filter/filter.stories.tsx +29 -28
  217. package/src/components/Filter/components/FilterLabel/filterLabel.stories.tsx +14 -12
  218. package/src/components/Filter/components/FilterMenu/filterMenu.stories.tsx +111 -108
  219. package/src/components/Filter/components/FilterTag/filterTag.stories.tsx +12 -11
  220. package/src/components/Filter/components/FilterTags/filterTags.stories.tsx +44 -43
  221. package/src/components/Index/components/AzulFileDownload/azulFileDownload.stories.tsx +13 -10
  222. package/src/components/Index/components/AzulFileDownload/azulFileDownload.tsx +12 -5
  223. package/src/components/Index/components/Hero/components/Summaries/summaries.stories.tsx +15 -15
  224. package/src/components/Index/components/Hero/hero.stories.tsx +12 -8
  225. package/src/components/Index/components/NTagCell/nTagCell.stories.tsx +12 -12
  226. package/src/components/Index/index.stories.tsx +2 -1
  227. package/src/components/Layout/components/BackPage/backPageView.stories.tsx +42 -36
  228. package/src/components/Layout/components/Footer/footer.stories.tsx +6 -4
  229. package/src/components/Layout/components/Header/components/Content/components/Navigation/components/NavigationMenu/navigationMenu.tsx +1 -1
  230. package/src/components/Layout/components/Header/components/Content/components/Navigation/components/NavigationMenuItems/navigationMenuItems.tsx +16 -15
  231. package/src/components/Layout/components/Header/components/Content/components/Navigation/constants.ts +1 -0
  232. package/src/components/Layout/components/Header/components/Content/components/Navigation/navigation.tsx +26 -18
  233. package/src/components/Layout/components/Header/header.stories.tsx +1 -1
  234. package/src/components/Layout/components/Header/header.tsx +6 -1
  235. package/src/components/Layout/components/Sidebar/components/SidebarLabel/sidebarLabel.stories.tsx +10 -10
  236. package/src/components/Layout/components/Sidebar/sidebar.stories.tsx +2 -0
  237. package/src/components/Links/links.stories.tsx +18 -18
  238. package/src/components/Loading/loading.stories.tsx +12 -10
  239. package/src/components/Login/components/Button/types.ts +1 -1
  240. package/src/components/Login/components/Buttons/buttons.tsx +22 -0
  241. package/src/components/Login/components/Buttons/types.ts +9 -0
  242. package/src/components/Login/components/Section/components/Consent/consent.styles.ts +15 -0
  243. package/src/components/Login/components/Section/components/Consent/consent.tsx +30 -0
  244. package/src/components/Login/components/Section/components/Consent/types.ts +10 -0
  245. package/src/components/Login/components/Section/components/Warning/warning.tsx +24 -0
  246. package/src/components/Login/hooks/useUserConsent/types.ts +11 -0
  247. package/src/components/Login/hooks/useUserConsent/useUserConsent.ts +32 -0
  248. package/src/components/Login/hooks/useUserLogin/types.ts +8 -0
  249. package/src/components/Login/hooks/useUserLogin/useUserLogin.ts +29 -0
  250. package/src/components/Project/components/CollaboratingOrganizations/collaboratingOrganizations.stories.tsx +24 -25
  251. package/src/components/Project/components/Contacts/contacts.stories.tsx +22 -22
  252. package/src/components/Project/components/Contributors/contributors.stories.tsx +31 -31
  253. package/src/components/Project/components/DataCurators/dataCurators.stories.tsx +11 -11
  254. package/src/components/Project/components/DataReleasePolicy/dataReleasePolicy.stories.tsx +7 -8
  255. package/src/components/Project/components/Description/description.stories.tsx +11 -11
  256. package/src/components/Project/components/Details/details.stories.tsx +11 -11
  257. package/src/components/Project/components/Publications/publications.stories.tsx +23 -23
  258. package/src/components/Project/components/SupplementaryLinks/supplementaryLinks.stories.tsx +22 -22
  259. package/src/components/Support/components/SupportRequest/components/SupportRequestForm/common/constants.ts +10 -9
  260. package/src/components/Support/components/SupportRequest/components/SupportRequestForm/supportRequestForm.tsx +44 -15
  261. package/src/components/Support/components/ViewSupport/types.ts +9 -0
  262. package/src/components/Support/components/ViewSupport/viewSupport.tsx +6 -10
  263. package/src/components/Table/components/Pagination/pagination.stories.tsx +15 -11
  264. package/src/components/common/Accordion/accordion.stories.tsx +4 -2
  265. package/src/components/common/Breadcrumbs/breadcrumbs.stories.tsx +46 -47
  266. package/src/components/common/Button/components/CallToActionButton/callToActionButton.stories.tsx +17 -20
  267. package/src/components/common/Button/components/HelpIconButton/helpIconButton.stories.tsx +4 -4
  268. package/src/components/common/Card/card.stories.tsx +4 -2
  269. package/src/components/common/Code/code.stories.tsx +1 -1
  270. package/src/components/common/CopyToClipboard/copyToClipboard.stories.tsx +4 -2
  271. package/src/components/common/CustomIcon/components/CloseIcon/closeIcon.tsx +17 -0
  272. package/src/components/common/LoginDialog/constants.ts +33 -0
  273. package/src/components/common/LoginDialog/loginDialog.styles.ts +51 -0
  274. package/src/components/common/LoginDialog/loginDialog.tsx +56 -0
  275. package/src/components/common/LoginDialog/types.ts +4 -0
  276. package/src/components/common/Section/components/SectionTitle/sectionTitle.stories.tsx +10 -10
  277. package/src/components/common/Socials/socials.stories.tsx +4 -2
  278. package/src/components/common/StaticImage/staticImage.stories.tsx +12 -12
  279. package/src/components/common/StatusIcon/statusIcon.stories.tsx +11 -11
  280. package/src/components/common/Tag/tag.stories.tsx +11 -9
  281. package/src/components/common/ToggleButtonGroup/toggleButtonGroup.stories.tsx +23 -23
  282. package/src/config/entities.ts +1 -0
  283. package/src/providers/loginGuard/common/types.ts +21 -0
  284. package/src/providers/loginGuard/context.ts +12 -0
  285. package/src/providers/loginGuard/hook.ts +14 -0
  286. package/src/providers/loginGuard/provider.tsx +76 -0
  287. package/src/styles/common/mui/typography.ts +9 -0
  288. package/src/views/DataDictionaryView/dataDictionaryView.tsx +9 -0
  289. package/tests/provider.test.tsx +191 -0
@@ -8,13 +8,15 @@ import { XIcon } from "../CustomIcon/components/XIcon/xIcon";
8
8
  import { YouTubeIcon } from "../CustomIcon/components/YouTubeIcon/youTubeIcon";
9
9
  import { Socials } from "./socials";
10
10
 
11
- export default {
11
+ const meta = {
12
12
  argTypes: {
13
13
  socials: { control: "object" },
14
14
  },
15
15
  component: Socials,
16
16
  title: "Components/Navigation/SocialLinks",
17
- } as Meta<typeof Socials>;
17
+ } satisfies Meta<typeof Socials>;
18
+
19
+ export default meta;
18
20
 
19
21
  type Story = StoryObj<typeof Socials>;
20
22
 
@@ -1,9 +1,8 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
2
- import React from "react";
1
+ import { Meta, StoryObj } from "@storybook/react";
3
2
  import logo from "../../../images/logo.svg";
4
3
  import { StaticImage } from "./staticImage";
5
4
 
6
- export default {
5
+ const meta = {
7
6
  argTypes: {
8
7
  alt: { control: "text" },
9
8
  height: { control: "number" },
@@ -12,15 +11,16 @@ export default {
12
11
  },
13
12
  component: StaticImage,
14
13
  title: "Components/Common/Image/StaticImage",
15
- } as ComponentMeta<typeof StaticImage>;
14
+ } satisfies Meta<typeof StaticImage>;
16
15
 
17
- const StaticImageTemplate: ComponentStory<typeof StaticImage> = (args) => (
18
- <StaticImage {...args} />
19
- );
16
+ export default meta;
20
17
 
21
- export const StaticImageStory = StaticImageTemplate.bind({});
22
- StaticImageStory.args = {
23
- alt: "Data Explorer",
24
- height: 40,
25
- src: logo,
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ export const StaticImageStory: Story = {
21
+ args: {
22
+ alt: "Data Explorer",
23
+ height: 40,
24
+ src: logo.src,
25
+ },
26
26
  };
@@ -1,23 +1,23 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
2
- import React from "react";
1
+ import { Meta, StoryObj } from "@storybook/react";
3
2
  import { SearchOffIcon } from "../CustomIcon/components/SearchOffIcon/searchOffIcon";
4
3
  import { PRIORITY, StatusIcon } from "./statusIcon";
5
4
 
6
- export default {
5
+ const meta = {
7
6
  argTypes: {
8
7
  StatusIcon: { control: { disable: true } },
9
8
  priority: { control: "select", options: Array.from(Object.keys(PRIORITY)) },
10
9
  },
11
10
  component: StatusIcon,
12
11
  title: "Components/Common/Alert/StatusIcon",
13
- } as ComponentMeta<typeof StatusIcon>;
12
+ } satisfies Meta<typeof StatusIcon>;
14
13
 
15
- const StatusIconTemplate: ComponentStory<typeof StatusIcon> = (args) => (
16
- <StatusIcon {...args} />
17
- );
14
+ export default meta;
18
15
 
19
- export const StatusIconStory = StatusIconTemplate.bind({});
20
- StatusIconStory.args = {
21
- StatusIcon: SearchOffIcon,
22
- priority: PRIORITY.LOW,
16
+ type Story = StoryObj<typeof meta>;
17
+
18
+ export const StatusIconStory: Story = {
19
+ args: {
20
+ StatusIcon: SearchOffIcon,
21
+ priority: PRIORITY.LOW,
22
+ },
23
23
  };
@@ -1,21 +1,23 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
1
+ import { Meta, StoryObj } from "@storybook/react";
2
2
  import React from "react";
3
3
  import { Tag } from "./tag";
4
4
  import { TagWarning } from "./tag.styles";
5
5
 
6
- export default {
6
+ const meta = {
7
7
  argTypes: {
8
8
  children: { control: { disabled: true } },
9
9
  },
10
10
  component: Tag,
11
11
  title: "Components/Common/Alert/Tag",
12
- } as ComponentMeta<typeof Tag>;
12
+ } satisfies Meta<typeof Tag>;
13
13
 
14
- const WarningTagTemplate: ComponentStory<typeof Tag> = (args) => (
15
- <TagWarning {...args}>{args.children}</TagWarning>
16
- );
14
+ export default meta;
17
15
 
18
- export const WarningTagStory = WarningTagTemplate.bind({});
19
- WarningTagStory.args = {
20
- children: "Please note",
16
+ type Story = StoryObj<typeof meta>;
17
+
18
+ export const WarningTagStory: Story = {
19
+ args: {
20
+ children: "Please note",
21
+ },
22
+ render: (args) => <TagWarning {...args}>{args.children}</TagWarning>,
21
23
  };
@@ -1,8 +1,7 @@
1
- import { ComponentMeta, ComponentStory } from "@storybook/react";
2
- import React from "react";
1
+ import { Meta, StoryObj } from "@storybook/react";
3
2
  import { ToggleButtonGroup } from "./toggleButtonGroup";
4
3
 
5
- export default {
4
+ const meta = {
6
5
  argTypes: {
7
6
  toggleButtons: { table: { disable: true } },
8
7
  },
@@ -11,28 +10,29 @@ export default {
11
10
  layout: "centered",
12
11
  },
13
12
  title: "Components/Common/ButtonGroup",
14
- } as ComponentMeta<typeof ToggleButtonGroup>;
13
+ } satisfies Meta<typeof ToggleButtonGroup>;
15
14
 
16
- const ToggleButtonGroupTemplate: ComponentStory<typeof ToggleButtonGroup> = (
17
- args
18
- ) => <ToggleButtonGroup {...args} />;
15
+ export default meta;
19
16
 
20
- export const ToggleButtonGroupStory = ToggleButtonGroupTemplate.bind({});
21
- ToggleButtonGroupStory.args = {
22
- toggleButtons: [
23
- {
24
- label: "Exact Match (243)",
25
- onToggle: (): void => {
26
- // onToggle function
17
+ type Story = StoryObj<typeof meta>;
18
+
19
+ export const ToggleButtonGroupStory: Story = {
20
+ args: {
21
+ toggleButtons: [
22
+ {
23
+ label: "Exact Match (243)",
24
+ onToggle: (): void => {
25
+ // onToggle function
26
+ },
27
+ value: "exact-match",
27
28
  },
28
- value: "exact-match",
29
- },
30
- {
31
- label: "Related (33)",
32
- onToggle: (): void => {
33
- // onToggle function
29
+ {
30
+ label: "Related (33)",
31
+ onToggle: (): void => {
32
+ // onToggle function
33
+ },
34
+ value: "related-match",
34
35
  },
35
- value: "related-match",
36
- },
37
- ],
36
+ ],
37
+ },
38
38
  };
@@ -379,6 +379,7 @@ export interface SiteConfig {
379
379
  entities: EntityConfig[];
380
380
  explorerTitle: HeroTitle;
381
381
  export?: ExportConfig;
382
+ exportsRequireAuth?: boolean;
382
383
  exportToTerraUrl?: string; // TODO(cc) revist location; possibly nest inside "export"?
383
384
  gitHubUrl?: string;
384
385
  layout: {
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from "react";
2
+
3
+ /**
4
+ * A callback function to be stored and then executed upon successful login.
5
+ */
6
+ export type LoginGuardCallback = () => void;
7
+
8
+ /**
9
+ * The shape of the LoginGuard context, provides a function to trigger the
10
+ * login process.
11
+ */
12
+ export interface LoginGuardContextProps {
13
+ requireLogin: (callback?: LoginGuardCallback) => void;
14
+ }
15
+
16
+ /**
17
+ * The properties for the LoginGuardProvider component.
18
+ */
19
+ export interface LoginGuardProviderProps {
20
+ children: ReactNode;
21
+ }
@@ -0,0 +1,12 @@
1
+ import { createContext } from "react";
2
+ import { LoginGuardCallback, LoginGuardContextProps } from "./common/types";
3
+
4
+ /**
5
+ * LoginGuardContext provides a way to trigger a login process. Default value is to
6
+ * call the callback immediately, if specified.
7
+ */
8
+ export const LoginGuardContext = createContext<LoginGuardContextProps>({
9
+ requireLogin: (callback?: LoginGuardCallback) => {
10
+ callback?.();
11
+ },
12
+ });
@@ -0,0 +1,14 @@
1
+ import { useContext } from "react";
2
+ import { LoginGuardContextProps } from "./common/types";
3
+ import { LoginGuardContext } from "./context";
4
+
5
+ /**
6
+ * Custom hook to access the LoginGuard context. This hook returns an object
7
+ * containing the "requireLogin" function, which allows triggering the application's
8
+ * login process.
9
+ *
10
+ * @returns The current LoginGuard context value.
11
+ */
12
+ export function useLoginGuard(): LoginGuardContextProps {
13
+ return useContext<LoginGuardContextProps>(LoginGuardContext);
14
+ }
@@ -0,0 +1,76 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from "react";
2
+ import { LoginDialog } from "../../components/common/LoginDialog/loginDialog";
3
+ import { useAuthenticationConfig } from "../../hooks/authentication/config/useAuthenticationConfig";
4
+ import { useConfig } from "../../hooks/useConfig";
5
+ import { useAuth } from "../authentication/auth/hook";
6
+ import { LoginGuardCallback, LoginGuardProviderProps } from "./common/types";
7
+ import { LoginGuardContext } from "./context";
8
+
9
+ /**
10
+ * LoginGuardProvider is responsible for intercepting actions that require user authentication.
11
+ * It provides a "requireLogin" function via context. When a protected action is triggered while the
12
+ * user is unauthenticated, the LoginDialog is displayed. Upon successful authentication, the saved
13
+ * callback is invoked.
14
+ *
15
+ * @param {LoginGuardProviderProps} props - The provider props that include children.
16
+ * @returns The provider component.
17
+ */
18
+ export function LoginGuardProvider({
19
+ children,
20
+ }: LoginGuardProviderProps): JSX.Element {
21
+ // Dialog open state.
22
+ const [open, setOpen] = useState(false);
23
+
24
+ // Use ref to store the callback without triggering re-render.
25
+ const callbackRef = useRef<LoginGuardCallback | undefined>(undefined);
26
+
27
+ // Determine if authentication is enabled.
28
+ const authConfig = useAuthenticationConfig();
29
+
30
+ // Determine if authentication is required for downloads and exports.
31
+ const {
32
+ config: { exportsRequireAuth },
33
+ } = useConfig();
34
+
35
+ // Get the user's authenticated state.
36
+ const {
37
+ authState: { isAuthenticated },
38
+ } = useAuth();
39
+
40
+ // If the user authenticates, close dialog then fire and clear callback.
41
+ useEffect(() => {
42
+ if (isAuthenticated) {
43
+ setOpen(false);
44
+ callbackRef.current?.();
45
+ // Clear callback after firing.
46
+ callbackRef.current = undefined;
47
+ }
48
+ }, [isAuthenticated]);
49
+
50
+ // Handler to close the dialog.
51
+ const onClose = useCallback(() => {
52
+ setOpen(false);
53
+ // Clear any stored callback.
54
+ callbackRef.current = undefined;
55
+ }, []);
56
+
57
+ // Block actions that require authentication, or fire callback if already authenticated.
58
+ const requireLogin = useCallback(
59
+ (cb?: LoginGuardCallback) => {
60
+ if (authConfig && exportsRequireAuth && !isAuthenticated) {
61
+ callbackRef.current = cb;
62
+ setOpen(true);
63
+ } else {
64
+ cb?.();
65
+ }
66
+ },
67
+ [authConfig, exportsRequireAuth, isAuthenticated]
68
+ );
69
+
70
+ return (
71
+ <LoginGuardContext.Provider value={{ requireLogin }}>
72
+ {children}
73
+ <LoginDialog open={open} onClose={onClose} />
74
+ </LoginGuardContext.Provider>
75
+ );
76
+ }
@@ -1,5 +1,14 @@
1
1
  import { TypographyOwnProps } from "@mui/material";
2
2
 
3
+ export const COLOR: Record<string, TypographyOwnProps["color"]> = {
4
+ INHERIT: "inherit",
5
+ INK_LIGHT: "ink.light",
6
+ INK_MAIN: "ink.main",
7
+ };
8
+
3
9
  export const VARIANT: Record<string, TypographyOwnProps["variant"]> = {
4
10
  INHERIT: "inherit",
11
+ TEXT_BODY_400: "text-body-400",
12
+ TEXT_BODY_400_2_LINES: "text-body-400-2lines",
13
+ TEXT_HEADING_SMALL: "text-heading-small",
5
14
  };
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import { DataDictionary } from "../../components/DataDictionary/dataDictionary";
3
+ import { BaseComponentProps } from "../../components/types";
4
+
5
+ export const DataDictionaryView = ({
6
+ className,
7
+ }: BaseComponentProps): JSX.Element => {
8
+ return <DataDictionary className={className} />;
9
+ };
@@ -0,0 +1,191 @@
1
+ import { jest } from "@jest/globals";
2
+ import { act, render, screen } from "@testing-library/react";
3
+ import React from "react";
4
+ import { LoginGuardContext } from "../src/providers/loginGuard/context";
5
+
6
+ jest.unstable_mockModule("../src/hooks/useConfig", () => ({
7
+ useConfig: jest.fn(),
8
+ }));
9
+
10
+ jest.unstable_mockModule("../src/providers/authentication/auth/hook", () => ({
11
+ useAuth: jest.fn(),
12
+ }));
13
+
14
+ jest.unstable_mockModule(
15
+ "../src/hooks/authentication/config/useAuthenticationConfig",
16
+ () => ({
17
+ useAuthenticationConfig: jest.fn(),
18
+ })
19
+ );
20
+
21
+ const TEST_ID_LOGIN_DIALOG = "login-dialog";
22
+ const TEXT_DIALOG_CLOSED = "closed";
23
+ const TEXT_DIALOG_OPEN = "open";
24
+ jest.unstable_mockModule(
25
+ "../src/components/common/LoginDialog/loginDialog",
26
+ () => ({
27
+ LoginDialog: ({ open }: { open: boolean }): JSX.Element => (
28
+ <div data-testid={TEST_ID_LOGIN_DIALOG}>
29
+ {open ? TEXT_DIALOG_OPEN : TEXT_DIALOG_CLOSED}
30
+ </div>
31
+ ),
32
+ })
33
+ );
34
+
35
+ const { useConfig } = await import("../src/hooks/useConfig");
36
+ const { useAuth } = await import("../src/providers/authentication/auth/hook");
37
+ const { useAuthenticationConfig } = await import(
38
+ "../src/hooks/authentication/config/useAuthenticationConfig"
39
+ );
40
+
41
+ const { LoginGuardProvider } = await import(
42
+ "../src/providers/loginGuard/provider"
43
+ );
44
+
45
+ const TEXT_BUTTON_EXPORT = "export";
46
+
47
+ describe("LoginGuardProvider", () => {
48
+ beforeEach(() => {
49
+ // Mock hooks used by login guard.
50
+ (useConfig as jest.Mock).mockReturnValue({
51
+ config: {
52
+ exportsRequireAuth: true,
53
+ },
54
+ });
55
+ (useAuth as jest.Mock).mockReturnValue({
56
+ authState: {
57
+ isAuthenticated: false,
58
+ },
59
+ });
60
+ (useAuthenticationConfig as jest.Mock).mockReturnValue({});
61
+ });
62
+
63
+ it("should render children and login dialog closed", () => {
64
+ render(
65
+ <LoginGuardProvider>
66
+ <div data-testid="child">child component</div>
67
+ </LoginGuardProvider>
68
+ );
69
+
70
+ expect(screen.getByTestId("child")).toBeTruthy();
71
+ expect(screen.getByTestId(TEST_ID_LOGIN_DIALOG).textContent).toBe(
72
+ TEXT_DIALOG_CLOSED
73
+ );
74
+ });
75
+
76
+ it("calls callback immediately if user is authenticated", () => {
77
+ const callback = jest.fn();
78
+
79
+ // Simulate user authentication.
80
+ (useAuth as jest.Mock).mockReturnValue({
81
+ authState: { isAuthenticated: true },
82
+ });
83
+
84
+ render(
85
+ <LoginGuardProvider>
86
+ <LoginGuardContext.Consumer>
87
+ {({ requireLogin }) => (
88
+ <button onClick={() => requireLogin(callback)}>
89
+ {TEXT_BUTTON_EXPORT}
90
+ </button>
91
+ )}
92
+ </LoginGuardContext.Consumer>
93
+ </LoginGuardProvider>
94
+ );
95
+
96
+ // Click button requiring login.
97
+ act(() => {
98
+ screen.getByText(TEXT_BUTTON_EXPORT).click();
99
+ });
100
+
101
+ // User is authenticated; callback should be fired immediately.
102
+ expect(callback).toHaveBeenCalled();
103
+
104
+ // Login dialog should not be open.
105
+ expect(screen.getByTestId(TEST_ID_LOGIN_DIALOG).textContent).toBe(
106
+ TEXT_DIALOG_CLOSED
107
+ );
108
+ });
109
+
110
+ it("calls callback immediately if exportsRequireAuth is false", () => {
111
+ const callback = jest.fn();
112
+
113
+ // Simulate exportsRequireAuth being false.
114
+ (useConfig as jest.Mock).mockReturnValue({
115
+ config: {
116
+ exportsRequireAuth: false,
117
+ },
118
+ });
119
+
120
+ render(
121
+ <LoginGuardProvider>
122
+ <LoginGuardContext.Consumer>
123
+ {({ requireLogin }) => (
124
+ <button onClick={() => requireLogin(callback)}>
125
+ {TEXT_BUTTON_EXPORT}
126
+ </button>
127
+ )}
128
+ </LoginGuardContext.Consumer>
129
+ </LoginGuardProvider>
130
+ );
131
+
132
+ // Click button requiring login.
133
+ act(() => {
134
+ screen.getByText(TEXT_BUTTON_EXPORT).click();
135
+ });
136
+
137
+ // exportsRequireAuth is false; callback should be fired immediately.
138
+ expect(callback).toHaveBeenCalled();
139
+
140
+ // Login dialog should not be open.
141
+ expect(screen.getByTestId(TEST_ID_LOGIN_DIALOG).textContent).toBe(
142
+ TEXT_DIALOG_CLOSED
143
+ );
144
+ });
145
+
146
+ it("should call callback after user authenticates", async () => {
147
+ const callback = jest.fn();
148
+
149
+ const { rerender } = render(
150
+ <LoginGuardProvider>
151
+ <LoginGuardContext.Consumer>
152
+ {({ requireLogin }) => (
153
+ <button onClick={() => requireLogin(callback)}>
154
+ {TEXT_BUTTON_EXPORT}
155
+ </button>
156
+ )}
157
+ </LoginGuardContext.Consumer>
158
+ </LoginGuardProvider>
159
+ );
160
+
161
+ // Click button requiring login.
162
+ act(() => {
163
+ screen.getByText(TEXT_BUTTON_EXPORT).click();
164
+ });
165
+
166
+ // User is not authenticated; callback should not have been called.
167
+ expect(callback).not.toHaveBeenCalled();
168
+
169
+ // User is not authenticated; login dialog should be open.
170
+ expect(screen.getByTestId(TEST_ID_LOGIN_DIALOG).textContent).toBe(
171
+ TEXT_DIALOG_OPEN
172
+ );
173
+
174
+ // Simulate user authentication.
175
+ await act(async () => {
176
+ (useAuth as jest.Mock).mockReturnValue({
177
+ authState: { isAuthenticated: true },
178
+ });
179
+ });
180
+
181
+ // Rerender to trigger useEffect.
182
+ rerender(
183
+ <LoginGuardProvider>
184
+ <div />
185
+ </LoginGuardProvider>
186
+ );
187
+
188
+ // Callback should be called (in useEffect called on re-render).
189
+ expect(callback).toHaveBeenCalled();
190
+ });
191
+ });