qpp-style 0.0.9 → 0.0.10

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 (456) hide show
  1. package/.eslintrc.js +28 -28
  2. package/.husky/pre-commit +5 -0
  3. package/README.md +45 -0
  4. package/components/Accordion/index.jsx +35 -43
  5. package/components/Alert/index.js +53 -0
  6. package/components/Breadcrumb/index.js +4 -4
  7. package/components/Button/index.js +17 -6
  8. package/components/CalloutBox/index.js +109 -0
  9. package/components/Card/index.js +137 -0
  10. package/components/Details/DetailsIcons.js +50 -0
  11. package/components/Details/index.js +53 -0
  12. package/components/Dropdown/index.js +85 -0
  13. package/components/DropdownButton/Menu.js +25 -0
  14. package/components/DropdownButton/MenuButton.js +41 -0
  15. package/components/DropdownButton/MenuItem.js +25 -0
  16. package/components/DropdownButton/MenuItemLink.js +27 -0
  17. package/components/Error/Collapsible.jsx +2 -2
  18. package/components/Footer/FooterUI.jsx +175 -177
  19. package/components/Footer/footer.js +2 -12
  20. package/components/GovBanner/index.js +117 -0
  21. package/components/Header/HeaderAccountMenu.jsx +49 -75
  22. package/components/Header/HeaderContainer.jsx +46 -34
  23. package/components/Header/HeaderLogo.jsx +40 -17
  24. package/components/Header/HeaderMenuButton.js +38 -12
  25. package/components/Header/HeaderMenuItem.jsx +204 -64
  26. package/components/Header/HeaderMenuLink.js +46 -10
  27. package/components/Header/HeaderMenuSignOutButton.js +46 -10
  28. package/components/Header/HeaderMobileButton.js +15 -6
  29. package/components/Header/HeaderUI.jsx +118 -117
  30. package/components/Header/HelpIcon.jsx +7 -5
  31. package/components/Header/ImpersonatorBanner.jsx +81 -0
  32. package/components/Header/header.js +2 -0
  33. package/components/Header/hooks.js +53 -1
  34. package/components/Header/utag-helpers.js +9 -0
  35. package/components/Infotip/Infotip.jsx +6 -10
  36. package/components/Infotip/InfotipContent.jsx +46 -0
  37. package/components/Infotip/InfotipIcon.jsx +3 -3
  38. package/components/Link/index.js +61 -0
  39. package/components/Modal/Modal.jsx +53 -40
  40. package/components/Modal/index.jsx +11 -11
  41. package/components/NotificationBanner/CollapsedView.js +39 -0
  42. package/components/NotificationBanner/ExpandedView.js +45 -0
  43. package/components/NotificationBanner/index.js +219 -30
  44. package/components/Search/index.js +98 -0
  45. package/components/SessionDialog/sessionDialog.js +26 -0
  46. package/components/SessionDialogUI.jsx +34 -26
  47. package/components/SideNav/AnimationGroup/AnimationGroup.jsx +9 -2
  48. package/components/SideNav/Chart/ScoreChart.jsx +1 -1
  49. package/components/SideNav/Chart/__tests__/ScoreChart.test.js +3 -12
  50. package/components/SideNav/Chart/__tests__/__snapshots__/ScoreChart.test.js.snap +144 -35
  51. package/components/SideNav/Chart/index.js +1 -1
  52. package/components/SideNav/Content/LevelOneContent.jsx +145 -255
  53. package/components/SideNav/Content/LevelTwoContent.jsx +12 -10
  54. package/components/SideNav/Content/SelectRole/index.js +77 -0
  55. package/components/SideNav/Content/SelectRole/utils.js +140 -0
  56. package/components/SideNav/Details/PracticeDetails.jsx +4 -0
  57. package/components/SideNav/Links/CmsSwitchLink.jsx +1 -1
  58. package/components/SideNav/Links/NavLinkContainer.jsx +29 -34
  59. package/components/SideNav/Links/NavLinkDrawer.jsx +100 -17
  60. package/components/SideNav/Links/NavLinkInline.jsx +7 -2
  61. package/components/SideNav/SideNav.md +28 -27
  62. package/components/SideNav/UI/SideNavUI.jsx +122 -129
  63. package/components/SideNav/UI/default-content.json +117 -0
  64. package/components/SideNav/helpers.js +316 -4
  65. package/components/Tabs/TabPanel.js +5 -0
  66. package/components/Tabs/Tabs.js +73 -0
  67. package/components/TextInput/index.js +137 -0
  68. package/components/hooks/useGetConfig.js +75 -0
  69. package/components/index.js +103 -9
  70. package/coverage/clover.xml +1465 -41
  71. package/coverage/coverage-final.json +72 -1
  72. package/coverage/lcov-report/block-navigation.js +8 -0
  73. package/coverage/lcov-report/components/Accordion/index.html +26 -21
  74. package/coverage/lcov-report/components/Accordion/index.jsx.html +106 -131
  75. package/coverage/lcov-report/{SideNav/Chart → components/Button}/index.html +29 -24
  76. package/coverage/lcov-report/{Error/Collapsible.jsx.html → components/Button/index.js.html} +125 -114
  77. package/coverage/lcov-report/components/Error/Collapsible.jsx.html +92 -87
  78. package/coverage/lcov-report/components/Error/ErrorUI.jsx.html +32 -33
  79. package/coverage/lcov-report/components/Error/index.html +11 -6
  80. package/coverage/lcov-report/components/Footer/FooterUI.jsx.html +200 -189
  81. package/coverage/lcov-report/components/Footer/SocialLinks.jsx.html +24 -61
  82. package/coverage/lcov-report/components/Footer/Subscribe.jsx.html +18 -13
  83. package/coverage/lcov-report/components/Footer/index.html +35 -45
  84. package/coverage/lcov-report/components/{InfoModal → GovBanner}/index.html +27 -22
  85. package/coverage/lcov-report/components/{InfoModal/index.jsx.html → GovBanner/index.js.html} +157 -122
  86. package/coverage/lcov-report/components/Header/HeaderAccountMenu.jsx.html +93 -520
  87. package/coverage/lcov-report/components/Header/HeaderCancel.jsx.html +19 -23
  88. package/coverage/lcov-report/components/Header/HeaderContainer.jsx.html +280 -0
  89. package/coverage/lcov-report/components/{SideNav/Links/NavLinkContainer.jsx.html → Header/HeaderLogo.jsx.html} +78 -67
  90. package/coverage/lcov-report/components/{SideNav/Links/NavItemInline.jsx.html → Header/HeaderMenuButton.js.html} +71 -78
  91. package/coverage/lcov-report/components/{SideNav/Links/NavLinkDrawer.jsx.html → Header/HeaderMenuItem.jsx.html} +291 -268
  92. package/coverage/lcov-report/components/Header/HeaderMenuLink.js.html +253 -0
  93. package/coverage/lcov-report/components/Header/HeaderMenuSignOutButton.js.html +271 -0
  94. package/coverage/lcov-report/components/{SideNav/Links/NavLinkToggle.jsx.html → Header/HeaderMobileButton.js.html} +64 -47
  95. package/coverage/lcov-report/components/Header/HeaderUI.jsx.html +176 -756
  96. package/coverage/lcov-report/components/Header/HelpIcon.jsx.html +181 -0
  97. package/coverage/lcov-report/{Accordion/index.jsx.html → components/Header/ImpersonatorBanner.jsx.html} +109 -167
  98. package/coverage/lcov-report/components/Header/NavigationButtonIcon.jsx.html +24 -19
  99. package/coverage/lcov-report/components/Header/hooks.js.html +283 -0
  100. package/coverage/lcov-report/components/Header/index.html +203 -33
  101. package/coverage/lcov-report/components/{SideNav/Links/index.js.html → Header/utag-helpers.js.html} +35 -42
  102. package/coverage/lcov-report/components/Infotip/Infotip.jsx.html +53 -48
  103. package/coverage/lcov-report/components/Infotip/InfotipIcon.jsx.html +37 -32
  104. package/coverage/lcov-report/components/Infotip/index.html +8 -3
  105. package/coverage/lcov-report/components/Infotip/index.js.html +8 -3
  106. package/coverage/lcov-report/components/Modal/LegacyModal.jsx.html +301 -0
  107. package/coverage/lcov-report/{HeaderUI.jsx.html → components/Modal/Modal.jsx.html} +169 -257
  108. package/coverage/lcov-report/components/Modal/index.html +146 -0
  109. package/coverage/lcov-report/components/{SideNav/Details/IndividualDetails.jsx.html → Modal/index.jsx.html} +50 -42
  110. package/coverage/lcov-report/components/NotificationBanner/CollapsedView.js.html +202 -0
  111. package/coverage/lcov-report/components/NotificationBanner/ExpandedView.js.html +220 -0
  112. package/coverage/lcov-report/components/NotificationBanner/index.html +58 -23
  113. package/coverage/lcov-report/components/{SideNav/Content/LevelTwoContent.jsx.html → NotificationBanner/index.js.html} +292 -272
  114. package/coverage/lcov-report/components/SanitizedContent/index.html +8 -3
  115. package/coverage/lcov-report/components/SanitizedContent/index.jsx.html +475 -50
  116. package/coverage/lcov-report/components/SessionDialogUI.jsx.html +248 -255
  117. package/coverage/lcov-report/components/SideNav/Chart/ScoreChart.jsx.html +272 -408
  118. package/coverage/lcov-report/components/SideNav/Chart/index.html +28 -38
  119. package/coverage/lcov-report/components/SideNav/Content/SelectRole/index.html +116 -0
  120. package/coverage/lcov-report/components/SideNav/Content/SelectRole/utils.js.html +505 -0
  121. package/coverage/lcov-report/components/SideNav/helpers.js.html +987 -46
  122. package/coverage/lcov-report/components/SideNav/index.html +24 -19
  123. package/coverage/lcov-report/components/Tooltip/Tooltip.jsx.html +70 -65
  124. package/coverage/lcov-report/components/Tooltip/index.html +8 -3
  125. package/coverage/lcov-report/components/Tooltip/index.js.html +8 -3
  126. package/coverage/lcov-report/components/Tooltip/position.js.html +57 -64
  127. package/coverage/lcov-report/components/hooks/index.html +116 -0
  128. package/coverage/lcov-report/components/hooks/useGetConfig.js.html +310 -0
  129. package/coverage/lcov-report/components/index.html +10 -5
  130. package/coverage/lcov-report/index.html +401 -21
  131. package/coverage/lcov-report/{Error/ErrorUI.jsx.html → lib/Chevron.jsx.html} +44 -42
  132. package/coverage/lcov-report/lib/SvgComponents.jsx.html +1840 -0
  133. package/coverage/lcov-report/lib/index.html +34 -14
  134. package/coverage/lcov-report/react/components/Accordion/index.html +26 -21
  135. package/coverage/lcov-report/react/components/Accordion/index.jsx.html +67 -86
  136. package/coverage/lcov-report/react/components/{FlashNotification → Button}/index.html +23 -33
  137. package/coverage/lcov-report/{components/SideNav/Links/NavLinkInline.jsx.html → react/components/Button/index.js.html} +119 -120
  138. package/coverage/lcov-report/react/components/{Tabs → Dropdown}/index.html +23 -33
  139. package/coverage/lcov-report/react/components/{InfoModal/index.jsx.html → Dropdown/index.js.html} +102 -154
  140. package/coverage/lcov-report/react/components/Error/Collapsible.jsx.html +26 -21
  141. package/coverage/lcov-report/react/components/Error/ErrorUI.jsx.html +11 -6
  142. package/coverage/lcov-report/react/components/Error/error.js.html +8 -3
  143. package/coverage/lcov-report/react/components/Error/index.html +11 -6
  144. package/coverage/lcov-report/react/components/Footer/FooterUI.jsx.html +196 -194
  145. package/coverage/lcov-report/react/components/Footer/LegacyFooterUI.jsx.html +9 -4
  146. package/coverage/lcov-report/react/components/Footer/SocialLinks.jsx.html +18 -13
  147. package/coverage/lcov-report/react/components/Footer/Subscribe.jsx.html +18 -13
  148. package/coverage/lcov-report/react/components/Footer/footer.js.html +12 -37
  149. package/coverage/lcov-report/react/components/Footer/index.html +35 -45
  150. package/coverage/lcov-report/react/components/{InfoModal → GovBanner}/index.html +27 -22
  151. package/coverage/lcov-report/react/components/{Tabs/TabsUI.jsx.html → GovBanner/index.js.html} +146 -153
  152. package/coverage/lcov-report/react/components/Header/HeaderAccountMenu.jsx.html +81 -154
  153. package/coverage/lcov-report/react/components/Header/HeaderCancel.jsx.html +15 -10
  154. package/coverage/lcov-report/react/components/Header/HeaderContainer.jsx.html +91 -50
  155. package/coverage/lcov-report/react/components/Header/HeaderLogo.jsx.html +105 -31
  156. package/coverage/lcov-report/react/components/Header/HeaderMenuButton.js.html +109 -26
  157. package/coverage/lcov-report/react/components/Header/HeaderMenuItem.jsx.html +510 -85
  158. package/coverage/lcov-report/react/components/Header/HeaderMenuLink.js.html +137 -24
  159. package/coverage/lcov-report/react/components/Header/HeaderMenuSignOutButton.js.html +134 -21
  160. package/coverage/lcov-report/react/components/Header/HeaderMobileButton.js.html +56 -24
  161. package/coverage/lcov-report/react/components/Header/HeaderUI.jsx.html +172 -179
  162. package/coverage/lcov-report/react/components/Header/HelpIcon.jsx.html +30 -19
  163. package/coverage/lcov-report/react/components/Header/ImpersonatorBanner.jsx.html +331 -0
  164. package/coverage/lcov-report/react/components/Header/NavigationButtonIcon.jsx.html +9 -4
  165. package/coverage/lcov-report/react/components/Header/header.js.html +15 -4
  166. package/coverage/lcov-report/react/components/Header/hooks.js.html +187 -26
  167. package/coverage/lcov-report/react/components/Header/index.html +157 -122
  168. package/coverage/lcov-report/react/components/{Spinner/index.js.html → Header/utag-helpers.js.html} +26 -21
  169. package/coverage/lcov-report/react/components/Infotip/Infotip.jsx.html +12 -7
  170. package/coverage/lcov-report/react/components/{Tabs/tabs.js.html → Infotip/InfotipContent.jsx.html} +83 -48
  171. package/coverage/lcov-report/react/components/Infotip/InfotipIcon.jsx.html +12 -7
  172. package/coverage/lcov-report/react/components/Infotip/index.html +8 -3
  173. package/coverage/lcov-report/react/components/Infotip/index.js.html +8 -3
  174. package/coverage/lcov-report/react/components/{FlashNotification/FlashNotificationUI.jsx.html → Modal/LegacyModal.jsx.html} +89 -84
  175. package/coverage/lcov-report/react/components/Modal/Modal.jsx.html +505 -0
  176. package/coverage/lcov-report/react/components/Modal/index.html +52 -17
  177. package/coverage/lcov-report/react/components/Modal/index.jsx.html +38 -201
  178. package/coverage/lcov-report/{components/SideNav/Links/CmsSwitchLink.jsx.html → react/components/NotificationBanner/CollapsedView.js.html} +52 -50
  179. package/coverage/lcov-report/{components/SideNav/Details/PracticeDetails.jsx.html → react/components/NotificationBanner/ExpandedView.js.html} +74 -57
  180. package/coverage/lcov-report/react/components/NotificationBanner/index.html +56 -21
  181. package/coverage/lcov-report/react/components/NotificationBanner/index.js.html +615 -43
  182. package/coverage/lcov-report/react/components/SanitizedContent/index.html +8 -3
  183. package/coverage/lcov-report/react/components/SanitizedContent/index.jsx.html +12 -7
  184. package/coverage/lcov-report/react/components/{Spinner → SessionDialog}/index.html +11 -6
  185. package/coverage/lcov-report/react/components/{FlashNotification/index.js.html → SessionDialog/sessionDialog.js.html} +35 -42
  186. package/coverage/lcov-report/react/components/SessionDialogUI.jsx.html +80 -51
  187. package/coverage/lcov-report/react/components/SideNav/AnimationGroup/AnimationGroup.jsx.html +38 -12
  188. package/coverage/lcov-report/react/components/SideNav/AnimationGroup/index.html +18 -13
  189. package/coverage/lcov-report/react/components/SideNav/Chart/ScoreChart.jsx.html +67 -56
  190. package/coverage/lcov-report/react/components/SideNav/Chart/index.html +26 -21
  191. package/coverage/lcov-report/react/components/SideNav/Chart/index.js.html +9 -4
  192. package/coverage/lcov-report/react/components/SideNav/Content/LevelOneContent.jsx.html +189 -514
  193. package/coverage/lcov-report/react/components/SideNav/Content/LevelTwoContent.jsx.html +28 -17
  194. package/coverage/lcov-report/{components/SideNav/Details → react/components/SideNav/Content/SelectRole}/index.html +42 -52
  195. package/coverage/lcov-report/react/components/SideNav/Content/SelectRole/index.js.html +316 -0
  196. package/coverage/lcov-report/react/components/SideNav/Content/SelectRole/utils.js.html +505 -0
  197. package/coverage/lcov-report/react/components/SideNav/Content/index.html +32 -27
  198. package/coverage/lcov-report/react/components/SideNav/Content/index.js.html +8 -3
  199. package/coverage/lcov-report/react/components/SideNav/Details/IndividualDetails.jsx.html +10 -5
  200. package/coverage/lcov-report/react/components/SideNav/Details/PracticeDetails.jsx.html +26 -9
  201. package/coverage/lcov-report/react/components/SideNav/Details/index.html +23 -18
  202. package/coverage/lcov-report/react/components/SideNav/Details/index.js.html +8 -3
  203. package/coverage/lcov-report/react/components/SideNav/Links/CmsSwitchLink.jsx.html +9 -4
  204. package/coverage/lcov-report/react/components/SideNav/Links/NavItemInline.jsx.html +8 -3
  205. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkContainer.jsx.html +54 -64
  206. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkDrawer.jsx.html +281 -27
  207. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkInline.jsx.html +66 -46
  208. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkToggle.jsx.html +8 -3
  209. package/coverage/lcov-report/react/components/SideNav/Links/index.html +44 -39
  210. package/coverage/lcov-report/react/components/SideNav/Links/index.js.html +8 -3
  211. package/coverage/lcov-report/react/components/SideNav/UI/SideNavUI.jsx.html +165 -181
  212. package/coverage/lcov-report/react/components/SideNav/UI/index.html +28 -23
  213. package/coverage/lcov-report/react/components/SideNav/UI/index.js.html +8 -3
  214. package/coverage/lcov-report/react/components/SideNav/helpers.js.html +967 -26
  215. package/coverage/lcov-report/react/components/SideNav/index.html +27 -22
  216. package/coverage/lcov-report/react/components/SideNav/index.js.html +8 -3
  217. package/coverage/lcov-report/react/components/Tooltip/Tooltip.jsx.html +20 -15
  218. package/coverage/lcov-report/react/components/Tooltip/index.html +8 -3
  219. package/coverage/lcov-report/react/components/Tooltip/index.js.html +8 -3
  220. package/coverage/lcov-report/react/components/Tooltip/position.js.html +22 -17
  221. package/coverage/lcov-report/{components/SideNav/AnimationGroup → react/components/hooks}/index.html +29 -24
  222. package/coverage/lcov-report/react/components/hooks/useGetConfig.js.html +310 -0
  223. package/coverage/lcov-report/react/components/index.html +10 -5
  224. package/coverage/lcov-report/react/index.html +20 -15
  225. package/coverage/lcov-report/react/index.js.html +29 -9
  226. package/coverage/lcov-report/react/lib/Chevron.jsx.html +181 -0
  227. package/coverage/lcov-report/react/lib/SvgComponents.jsx.html +221 -132
  228. package/coverage/lcov-report/react/lib/index.html +32 -27
  229. package/coverage/lcov-report/react/lib/svg-definitions.svg.html +8 -3
  230. package/coverage/lcov-report/react/session/index.html +32 -27
  231. package/coverage/lcov-report/react/session/index.js.html +8 -3
  232. package/coverage/lcov-report/react/session/logout.js.html +122 -18
  233. package/coverage/lcov-report/react/session/refresh.js.html +12 -7
  234. package/coverage/lcov-report/react/session/ttl.js.html +9 -4
  235. package/coverage/lcov-report/session/index.html +50 -45
  236. package/coverage/lcov-report/session/index.js.html +8 -3
  237. package/coverage/lcov-report/session/logout.js.html +144 -49
  238. package/coverage/lcov-report/session/refresh.js.html +41 -36
  239. package/coverage/lcov-report/session/ttl.js.html +34 -29
  240. package/coverage/lcov-report/sorter.js +26 -0
  241. package/coverage/lcov.info +3189 -46
  242. package/dist/browser.js +1 -1
  243. package/dist/browser.js.LICENSE.txt +1 -7
  244. package/dist/browser.js.map +1 -1
  245. package/dist/index.js +1 -1
  246. package/dist/index.js.LICENSE.txt +1 -7
  247. package/dist/index.js.map +1 -1
  248. package/dist/react/index.js +1 -1
  249. package/dist/react/index.js.LICENSE.txt +16 -16
  250. package/dist/react/index.js.map +1 -1
  251. package/fonts/PublicSans-Black.ttf +0 -0
  252. package/fonts/PublicSans-BlackItalic.ttf +0 -0
  253. package/fonts/PublicSans-Bold.ttf +0 -0
  254. package/fonts/PublicSans-BoldItalic.ttf +0 -0
  255. package/fonts/PublicSans-ExtraBold.ttf +0 -0
  256. package/fonts/PublicSans-ExtraBoldItalic.ttf +0 -0
  257. package/fonts/PublicSans-ExtraLight.ttf +0 -0
  258. package/fonts/PublicSans-ExtraLightItalic.ttf +0 -0
  259. package/fonts/PublicSans-Italic.ttf +0 -0
  260. package/fonts/PublicSans-Light.ttf +0 -0
  261. package/fonts/PublicSans-LightItalic.ttf +0 -0
  262. package/fonts/PublicSans-Medium.ttf +0 -0
  263. package/fonts/PublicSans-MediumItalic.ttf +0 -0
  264. package/fonts/PublicSans-Regular.ttf +0 -0
  265. package/fonts/PublicSans-SemiBold.ttf +0 -0
  266. package/fonts/PublicSans-SemiBoldItalic.ttf +0 -0
  267. package/fonts/PublicSans-Thin.ttf +0 -0
  268. package/fonts/PublicSans-ThinItalic.ttf +0 -0
  269. package/images/icon-dot-gov.svg +1 -0
  270. package/images/icon-https.svg +1 -0
  271. package/images/icons/close-x.svg +6 -0
  272. package/images/icons/svg/arrow-down.svg +3 -0
  273. package/images/icons/svg/arrow-download.svg +1 -0
  274. package/images/icons/svg/arrow-right.svg +1 -0
  275. package/images/icons/svg/arrow-up.svg +3 -0
  276. package/images/icons/svg/block.svg +5 -0
  277. package/images/icons/svg/calendar.svg +1 -0
  278. package/images/icons/svg/check-circle.svg +5 -0
  279. package/images/icons/svg/checkmark.svg +7 -0
  280. package/images/icons/svg/chevron-down.svg +11 -0
  281. package/images/icons/svg/chevron-left.svg +12 -0
  282. package/images/icons/svg/chevron-right.svg +12 -0
  283. package/images/icons/svg/chevron-up.svg +12 -0
  284. package/images/icons/svg/clipboard.svg +1 -0
  285. package/images/icons/svg/close.svg +1 -0
  286. package/images/icons/svg/divide.svg +13 -0
  287. package/images/icons/svg/doctors-and-clinicians-preview.svg +10 -0
  288. package/images/icons/svg/download.svg +1 -0
  289. package/images/icons/svg/dropdown-arrow.svg +1 -0
  290. package/images/icons/svg/equals.svg +13 -0
  291. package/images/icons/svg/exclamation.svg +11 -0
  292. package/images/icons/svg/external.svg +1 -0
  293. package/images/icons/svg/file-download.svg +1 -0
  294. package/images/icons/svg/file-upload.svg +1 -0
  295. package/images/icons/svg/info.svg +20 -0
  296. package/images/icons/svg/manage-user-access.svg +8 -0
  297. package/images/icons/svg/multiply.svg +12 -0
  298. package/images/icons/svg/performance-feedback.svg +1 -0
  299. package/images/icons/svg/plus.svg +12 -0
  300. package/images/icons/svg/preview.svg +17 -0
  301. package/images/icons/svg/print.svg +1 -0
  302. package/images/icons/svg/registration.svg +8 -0
  303. package/images/icons/svg/reporting.svg +17 -0
  304. package/images/icons/svg/save-disk.svg +5 -0
  305. package/images/icons/svg/search.svg +1 -0
  306. package/images/icons/svg/subtract.svg +15 -0
  307. package/images/icons/svg/targeted-review.svg +15 -0
  308. package/images/icons/svg/tooltip-question.svg +1 -0
  309. package/images/icons/svg/trash.svg +1 -0
  310. package/images/icons/svg/upload.svg +1 -0
  311. package/images/us_flag_small.png +0 -0
  312. package/index.js +5 -0
  313. package/jest.config.js +139 -132
  314. package/lib/Chevron.jsx +32 -0
  315. package/lib/SvgComponents.jsx +197 -49
  316. package/package.json +60 -78
  317. package/session/logout.js +35 -2
  318. package/styles/_global.scss +63 -62
  319. package/styles/_main.scss +6 -0
  320. package/styles/_qpp-style.scss +0 -3
  321. package/styles/components/_accordion.scss +249 -246
  322. package/styles/components/_autocomplete.scss +0 -3
  323. package/styles/components/_spinner.scss +0 -2
  324. package/styles/components/_tables.scss +77 -67
  325. package/styles/components/_text.scss +102 -102
  326. package/styles/components/_variables.scss +12 -12
  327. package/styles/qppds/base/_backgrounds.scss +1 -6
  328. package/styles/qppds/base/_fonts.scss +24 -0
  329. package/styles/qppds/base/_icon.scss +31 -0
  330. package/styles/qppds/base/_layout.scss +5 -0
  331. package/styles/qppds/base/_typography.scss +77 -43
  332. package/styles/qppds/base/index.scss +3 -6
  333. package/styles/qppds/components/_alert.scss +101 -0
  334. package/styles/qppds/components/_breadcrumbs.scss +42 -10
  335. package/styles/qppds/components/_button.scss +38 -12
  336. package/styles/qppds/components/_card.scss +175 -0
  337. package/styles/qppds/components/_checkbox.scss +199 -0
  338. package/styles/qppds/components/_circular-loader.scss +47 -0
  339. package/styles/qppds/components/_details.scss +90 -0
  340. package/styles/qppds/components/_dropdown-menu.scss +125 -0
  341. package/styles/qppds/components/_dropdown.scss +5 -0
  342. package/styles/qppds/components/_footer.scss +606 -0
  343. package/styles/qppds/components/_gov-banner.scss +344 -0
  344. package/styles/{components → qppds/components}/_header.scss +460 -24
  345. package/styles/qppds/components/_link.scss +32 -9
  346. package/styles/qppds/components/_modal.scss +61 -21
  347. package/styles/qppds/components/_page-header.scss +65 -2
  348. package/styles/qppds/components/_pagination.scss +227 -0
  349. package/styles/qppds/components/_process-list.scss +104 -0
  350. package/styles/qppds/components/_radio-button.scss +184 -0
  351. package/styles/qppds/components/_search.scss +118 -0
  352. package/styles/{components → qppds/components}/_sidebar.scss +2 -0
  353. package/styles/qppds/components/_step-indicator.scss +190 -0
  354. package/styles/qppds/components/_table.scss +157 -0
  355. package/styles/qppds/components/_tabs.scss +197 -0
  356. package/styles/qppds/components/_text-input.scss +60 -0
  357. package/styles/qppds/components/index.scss +18 -0
  358. package/styles/{components → qppds/components}/sidebar/_links.scss +48 -1
  359. package/styles/qppds/components/sidebar/_select-role-dropdown.scss +21 -0
  360. package/styles/{components → qppds/components}/sidebar/_sidebar-animation.scss +4 -0
  361. package/styles/qppds/components/sidebar/_sidebar.scss +146 -0
  362. package/styles/qppds/settings/_functions.scss +3 -1
  363. package/styles/qppds/settings/mixins/_borders.scss +6 -0
  364. package/styles/qppds/settings/mixins/_focus.scss +7 -1
  365. package/styles/qppds/settings/mixins/_icons.scss +39 -4
  366. package/styles/qppds/settings/mixins/_index.scss +3 -0
  367. package/styles/qppds/settings/mixins/_layout.scss +46 -7
  368. package/styles/qppds/settings/mixins/_table.scss +91 -0
  369. package/styles/qppds/settings/mixins/_type.scss +89 -0
  370. package/styles/qppds/settings/variables/_color.scss +47 -1
  371. package/styles/qppds/settings/variables/_index.scss +2 -1
  372. package/styles/qppds/settings/variables/_layout.scss +34 -9
  373. package/styles/qppds/settings/variables/_type.scss +41 -0
  374. package/styles/qppds/settings/variables/_z-index.scss +8 -0
  375. package/styles/qppds/utilities/_background-color.scss +4 -0
  376. package/styles/qppds/utilities/_color.scss +24 -0
  377. package/styles/qppds/utilities/{_display-visability.scss → _display-visibility.scss} +8 -0
  378. package/styles/qppds/utilities/_flexbox.scss +113 -0
  379. package/styles/qppds/utilities/_font-family.scss +4 -0
  380. package/styles/qppds/utilities/_gap.scss +38 -0
  381. package/styles/qppds/utilities/_height.scss +79 -0
  382. package/styles/qppds/utilities/_list-style.scss +18 -0
  383. package/styles/qppds/utilities/_position.scss +24 -0
  384. package/styles/qppds/utilities/_text-align.scss +40 -0
  385. package/styles/qppds/utilities/_text-transform.scss +7 -0
  386. package/styles/qppds/utilities/_truncate.scss +5 -5
  387. package/styles/qppds/utilities/_vertical-align.scss +72 -0
  388. package/styles/qppds/utilities/_width.scss +38 -1
  389. package/styles/qppds/utilities/index.scss +8 -2
  390. package/svgo.config.js +14 -0
  391. package/test/components/Accordion.test.js +4 -13
  392. package/test/components/ErrorUI.test.js +10 -46
  393. package/test/components/FooterUI.test.js +0 -30
  394. package/test/components/HeaderUI.test.js +32 -40
  395. package/test/components/Infotip.test.js +18 -12
  396. package/test/components/SessionDialogUI.test.js +55 -70
  397. package/test-setup.js +0 -8
  398. package/webpack.config.js +29 -39
  399. package/webpack.config.react.js +7 -18
  400. package/.storybook/.babelrc +0 -4
  401. package/.storybook/main.js +0 -88
  402. package/.storybook/preview-head.html +0 -9
  403. package/.storybook/preview.js +0 -5
  404. package/Session.vim +0 -83
  405. package/components/Accordion/Accordion.stories.js +0 -20
  406. package/components/Breadcrumb/Breadcrumb.stories.js +0 -58
  407. package/components/Button/Button.stories.js +0 -125
  408. package/components/Footer/Footer.stories.js +0 -20
  409. package/components/Footer/LegacyFooterUI.jsx +0 -194
  410. package/components/Header/Header.stories.js +0 -32
  411. package/components/InfoModal/InfoModal.stories.js +0 -98
  412. package/components/InfoModal/index.jsx +0 -104
  413. package/components/Infotip/Infotip.stories.js +0 -50
  414. package/components/Modal/Modal.stories.js +0 -159
  415. package/components/NotificationBanner/NotificationBanner.stories.js +0 -22
  416. package/components/NotificationBanner/NotificationBannerUI.jsx +0 -282
  417. package/components/SideNav/SideNav.stories.js +0 -397
  418. package/components/Spinner/index.js +0 -9
  419. package/components/Tabs/TabsUI.jsx +0 -118
  420. package/components/Tabs/tabs.js +0 -36
  421. package/components/Tooltip/Tooltip.jsx +0 -88
  422. package/components/Tooltip/Tooltip.stories.js +0 -80
  423. package/components/Tooltip/index.js +0 -3
  424. package/components/Tooltip/position.js +0 -68
  425. package/components/UnwrappedSpinner/index.js +0 -8
  426. package/components/UnwrappedTabs/TabPanelUI.jsx +0 -16
  427. package/components/UnwrappedTabs/TabsUI.jsx +0 -82
  428. package/coverage/lcov-report/Accordion/index.html +0 -111
  429. package/coverage/lcov-report/Error/index.html +0 -126
  430. package/coverage/lcov-report/ScoreChart.jsx.html +0 -1025
  431. package/coverage/lcov-report/SideNav/Chart/ScoreChart.jsx.html +0 -1025
  432. package/coverage/lcov-report/components/Footer/LegacyFooterUI.jsx.html +0 -668
  433. package/coverage/lcov-report/components/NotificationBanner/NotificationBannerUI.jsx.html +0 -1010
  434. package/coverage/lcov-report/components/SideNav/AnimationGroup/AnimationGroup.jsx.html +0 -131
  435. package/coverage/lcov-report/components/SideNav/Chart/index.js.html +0 -89
  436. package/coverage/lcov-report/components/SideNav/Content/LevelOneContent.jsx.html +0 -1007
  437. package/coverage/lcov-report/components/SideNav/Content/index.html +0 -141
  438. package/coverage/lcov-report/components/SideNav/Content/index.js.html +0 -92
  439. package/coverage/lcov-report/components/SideNav/Details/index.js.html +0 -92
  440. package/coverage/lcov-report/components/SideNav/Links/index.html +0 -201
  441. package/coverage/lcov-report/components/SideNav/UI/SideNavUI.jsx.html +0 -1298
  442. package/coverage/lcov-report/components/SideNav/UI/index.html +0 -126
  443. package/coverage/lcov-report/components/SideNav/UI/index.js.html +0 -89
  444. package/coverage/lcov-report/lib/svg-definitions.svg.html +0 -1319
  445. package/coverage/lcov-report/react/components/NotificationBanner/NotificationBannerUI.jsx.html +0 -926
  446. package/styles/components/_footer.scss +0 -593
  447. package/styles/components/_header_backup.scss +0 -574
  448. package/styles/components/sidebar/_sidebar.scss +0 -141
  449. package/test/components/Tooltip.test.js +0 -147
  450. package/test/components/__snapshots__/Accordion.test.js.snap +0 -11439
  451. package/test/components/__snapshots__/HeaderUI.test.js.snap +0 -3
  452. /package/styles/{components → qppds/components}/sidebar/_animations.scss +0 -0
  453. /package/styles/{components → qppds/components}/sidebar/_cms.scss +0 -0
  454. /package/styles/{components → qppds/components}/sidebar/_details.scss +0 -0
  455. /package/styles/{components → qppds/components}/sidebar/_sidebar-tooltip.scss +0 -0
  456. /package/styles/{components → qppds/components}/sidebar/project-specific/_wi.scss +0 -0
@@ -1,9 +1,34 @@
1
+ import cookie from 'cookie';
2
+ import {
3
+ AccountHomeIcon,
4
+ DashboardIcon,
5
+ FacilityBasedPreviewIcon,
6
+ HardshipIcon,
7
+ HelpSupportIcon,
8
+ ManageUsersIcon,
9
+ MyApplicationsIcon,
10
+ MyTestDataIcon,
11
+ PaymentIcon,
12
+ PhysicianCompareIcon,
13
+ StarIcon,
14
+ TargetIcon,
15
+ IndividualReporting,
16
+ ManageDocumentsIcon,
17
+ AuthorContentIcon,
18
+ RegistrationIcon,
19
+ } from '../../lib/SvgComponents';
20
+ import { isReviewerRole } from './Content/SelectRole/utils';
21
+
1
22
  const submissionsUrl = '/user/submissions';
2
23
  const dashboardUrl = '/user/dashboard';
3
24
  const manageUrl = '/user/manage-access';
4
- const feedbackUrl = `/user/submissions/feedback`;
5
- const physicianCompareUrl = `${submissionsUrl}/physician-compare`;
25
+ const feedbackUrl = `${submissionsUrl}/feedback`;
26
+ const physicianCompareUrl = `${submissionsUrl}/doctors-clinicians-preview`;
6
27
  const reportsPortalUrl = `${submissionsUrl}/reports`;
28
+ const facilityBasedPreviewBaseUrl = `${submissionsUrl}/facility-based-preview`;
29
+ const viewingToolUrl = '/user/helpdesk-viewing-tool';
30
+ const contentMgrDashboardUrl = '/user/content-management';
31
+ const registrationUrl = '/user/registration/';
7
32
 
8
33
  const performanceFeedbackUrl = (performanceYear) => {
9
34
  if (performanceYear) {
@@ -14,16 +39,293 @@ const performanceFeedbackUrl = (performanceYear) => {
14
39
  };
15
40
 
16
41
  const facilityBasedPreviewUrl = (performanceYear) => {
17
- return `/user/submissions/facility-based-preview/${performanceYear}`;
42
+ return `${facilityBasedPreviewBaseUrl}/${performanceYear}`;
18
43
  };
19
44
 
20
- const handleNavigation = (e, linkCallbackFunction) => {
45
+ const handleNavigation = (e, linkCallbackFunction, label) => {
21
46
  if (linkCallbackFunction) {
22
47
  const { pathname, hash, search } = e.currentTarget;
23
48
  e.preventDefault();
24
49
  e.stopPropagation();
25
50
  linkCallbackFunction(`${pathname}${hash}${search}`);
26
51
  }
52
+ window?.utag?.link({
53
+ ga_event_category: 'side navbar',
54
+ ga_event_action: 'click',
55
+ ga_event_label: label,
56
+ page_title: `${window.document.title}`,
57
+ page_url: `${window.location.pathname}`,
58
+ event: 'trackEvent',
59
+ });
60
+ };
61
+
62
+ /**
63
+ * Load icon by url
64
+ * @param {string} url
65
+ * @returns svg icon
66
+ */
67
+ const getIcon = (url, linkLabel) => {
68
+ const icons = {
69
+ [dashboardUrl]: DashboardIcon,
70
+ [feedbackUrl]: StarIcon,
71
+ [manageUrl]: ManageUsersIcon,
72
+ [physicianCompareUrl]: PhysicianCompareIcon,
73
+ [reportsPortalUrl]: HardshipIcon,
74
+ [submissionsUrl]: AccountHomeIcon,
75
+ [facilityBasedPreviewBaseUrl]: FacilityBasedPreviewIcon,
76
+ [registrationUrl]: RegistrationIcon,
77
+ '/developers': HelpSupportIcon,
78
+ '/resources/help-and-support': HelpSupportIcon,
79
+ '/user/apm-incentive-payments': PaymentIcon,
80
+ '/user/applications': MyApplicationsIcon,
81
+ '/user/exception/#/landing': HardshipIcon,
82
+ '/user/targeted-review/#/landing': TargetIcon,
83
+ '/user/test-data': MyTestDataIcon,
84
+ '/user/self-nomination/#/landing': IndividualReporting,
85
+ '/user/reviewers': AccountHomeIcon,
86
+ '/reviewer/exception': HardshipIcon,
87
+ '/reviewer/targeted-review': TargetIcon,
88
+ '/self-nomination': IndividualReporting,
89
+ '/case-management': FacilityBasedPreviewIcon,
90
+ [contentMgrDashboardUrl]: AccountHomeIcon,
91
+ 'Manage Documents': ManageDocumentsIcon,
92
+ 'Author Content': AuthorContentIcon,
93
+ };
94
+
95
+ if (linkLabel) return icons[linkLabel];
96
+ return icons[url];
97
+ };
98
+
99
+ const singleRoleContentMap = {
100
+ 'QPP Content Management - Author': 'contentManager',
101
+ 'QPP Content Management - Approver': 'contentManager',
102
+ 'QPP Content Management - Admin': 'contentManager',
103
+ 'QPP Front-end - Author': 'contentManager',
104
+ 'QPP Self-Nomination': 'internalReviewers',
105
+ 'QPP Targeted Review & Exceptions': 'internalReviewers',
106
+ 'QPP Case Management - PIMMS Reviewer': 'internalReviewers',
107
+ 'QPP Case Management - ACO PAC Reviewer': 'internalReviewers',
108
+ 'QPP Case Management - CMS Reviewer': 'internalReviewers',
109
+ };
110
+
111
+ const multiRoleContentMap = {
112
+ Reviewer: 'internalReviewers',
113
+ 'Content Manager': 'contentManager',
114
+ };
115
+
116
+ const replaceDefaultContentMgrLinks = (defaultContent) => {
117
+ const host = window.location.host;
118
+ const updatedDefaultContent = {
119
+ ...defaultContent,
120
+ contentManager: [
121
+ defaultContent.contentManager.find(
122
+ (obj) => obj.label === 'Dashboard Home'
123
+ ),
124
+ {
125
+ url: `${host}.qpp.cms.gov/cm/`,
126
+ label: 'Manage Documents',
127
+ },
128
+ {
129
+ url: `${host}.qpp.cms.gov/content-management/`,
130
+ label: 'Author Content',
131
+ },
132
+ ],
133
+ };
134
+ return updatedDefaultContent;
135
+ };
136
+
137
+ /**
138
+ * Load the side nav content for the given role
139
+ * @param {string} roleName role of given user from internalReviewerNames
140
+ * @param {object} navContent object of side nav links by role (levelOneContent & defaultContent)
141
+ * @returns {array} returns an array of objects (side nav menu links) from levelOneContent
142
+ * || defaultContent
143
+ */
144
+ const loadSideNavContent = (roleName, navContent, isMultiRoleUser = false) => {
145
+ const { levelOneContent, defaultContent } = navContent;
146
+ const updatedDefaultContent = replaceDefaultContentMgrLinks(defaultContent);
147
+ const roleContentMap = isMultiRoleUser
148
+ ? multiRoleContentMap
149
+ : singleRoleContentMap;
150
+ const contentByRole = roleContentMap[roleName];
151
+ if (levelOneContent) {
152
+ return levelOneContent[contentByRole] || levelOneContent.default;
153
+ }
154
+ return updatedDefaultContent[contentByRole] || updatedDefaultContent.default;
155
+ };
156
+
157
+ /**
158
+ * Check if user is currently impersonating
159
+ * @param {string} docCookie document cookie
160
+ * @returns {boolean}
161
+ */
162
+ const isImpersonating = (docCookie) => {
163
+ const parsedCookies = cookie.parse(docCookie);
164
+ return (
165
+ parsedCookies.qpp_can_impersonate && parsedCookies.qpp_impersonated_user
166
+ );
167
+ };
168
+
169
+ /**
170
+ * Check if user has multiple roles, used to display Select Role dropdown
171
+ * @param {string} docCookie document cookie
172
+ * @returns {boolean}
173
+ */
174
+ const isMultiRoleUser = (docCookie) => {
175
+ const activeRoles = new Set();
176
+ const { qpp_cms_internal_authorized } = cookie.parse(docCookie);
177
+ let internalAuthz = [];
178
+ if (qpp_cms_internal_authorized) {
179
+ internalAuthz = JSON.parse(qpp_cms_internal_authorized);
180
+ }
181
+ // Filter out test internalCms authz
182
+ const filteredInternalAuthz = internalAuthz.filter((internalAuth) => {
183
+ return (
184
+ internalAuth !== 'Test internalCms Resource' &&
185
+ internalAuth !== 'Test internalCms Resource 2'
186
+ );
187
+ });
188
+
189
+ filteredInternalAuthz.forEach((element) => {
190
+ if (isReviewerRole(element)) {
191
+ return activeRoles.add('reviewer');
192
+ }
193
+ return activeRoles.add(element);
194
+ });
195
+
196
+ return activeRoles.size > 1;
197
+ };
198
+
199
+ /**
200
+ * Transform cookie values to permissions object
201
+ * @param {object} cookies parsed document.cookie values
202
+ * @returns {object}
203
+ */
204
+ const transformCookieValues = (cookies) => {
205
+ const {
206
+ qpp_can_impersonate,
207
+ qpp_has_authorizations,
208
+ user_has_apm_payments,
209
+ qpp_cms_internal_authorized,
210
+ qpp_ehr_authorized,
211
+ qpp_has_non_registry_authorizations,
212
+ } = cookies;
213
+ return {
214
+ canImpersonate: qpp_can_impersonate === 'true',
215
+ hasAuthorizations: qpp_has_authorizations === 'true',
216
+ hasApmPayments: user_has_apm_payments === 'true',
217
+ internalReviewerNames: qpp_cms_internal_authorized
218
+ ? JSON.parse(qpp_cms_internal_authorized)
219
+ : [],
220
+ ehrAuthorized: qpp_ehr_authorized === 'true',
221
+ hasNonRegistryAuthorizations:
222
+ qpp_has_non_registry_authorizations === 'true',
223
+ };
224
+ };
225
+
226
+ const permissionsByRole = {
227
+ 'QPP User': {
228
+ canImpersonate: false,
229
+ hasAuthorizations: true,
230
+ hasApmPayments: true,
231
+ },
232
+ Reviewer: {
233
+ hasAuthorizations: false,
234
+ hasApmPaymentss: false,
235
+ },
236
+ 'Helpdesk Viewer': {
237
+ hasAuthorizations: false,
238
+ hasApmPayments: false,
239
+ hasNonRegistryAuthorizations: false,
240
+ internalReviewerNames: ['QPP Helpdesk'],
241
+ },
242
+ // Helpdesk role && impersonating (use impersonated user authz values)
243
+ Impersonation: {
244
+ internalReviewerNames: ['QPP Helpdesk'],
245
+ },
246
+ 'Content Manager': {
247
+ hasAuthorizations: false,
248
+ hasApmPaymentss: false,
249
+ hasNonRegistryAuthorizations: false,
250
+ },
251
+ };
252
+
253
+ /**
254
+ * Return permissions by role
255
+ * @param {string} selectedRole selected user role
256
+ * @param {object} permissionValues default permission values from transformed parsed cookie
257
+ * @returns {object}
258
+ */
259
+ const loadUserPermissionsByRole = (selectedRole, permissionValues) => {
260
+ return {
261
+ ...permissionValues,
262
+ ...permissionsByRole[selectedRole],
263
+ };
264
+ };
265
+
266
+ /**
267
+ * Helper fn to return user permissions/properties from cookies set on login
268
+ * @param {string} docCookie cookie values set on login
269
+ * @param {string} selectedRole string of selected role if user has multiple roles
270
+ * @returns {object}
271
+ */
272
+ const loadUserPermissions = (docCookie, selectedRole) => {
273
+ const parsedCookies = cookie.parse(docCookie);
274
+ const permissionValues = transformCookieValues(parsedCookies);
275
+ const impersonating = isImpersonating(docCookie);
276
+ const role = impersonating ? 'Impersonation' : selectedRole;
277
+
278
+ if (role) {
279
+ return loadUserPermissionsByRole(role, permissionValues);
280
+ }
281
+
282
+ return permissionValues;
283
+ };
284
+
285
+ /**
286
+ * Return map of link conditionals based on user cookies for side nav
287
+ * @param {object} userPermissions user permissions/properties derived from cookies set on login
288
+ * @returns {object}
289
+ */
290
+ const getUrlConditionMap = (userPermissions) => {
291
+ return {
292
+ [dashboardUrl]: userPermissions.hasAuthorizations,
293
+ [feedbackUrl]: userPermissions.hasAuthorizations,
294
+ '/user/apm-incentive-payments': userPermissions.hasApmPayments,
295
+ [physicianCompareUrl]: userPermissions.hasNonRegistryAuthorizations,
296
+ [registrationUrl]: userPermissions.hasAuthorizations,
297
+ [reportsPortalUrl]: userPermissions.hasAuthorizations,
298
+ [facilityBasedPreviewBaseUrl]: userPermissions.hasAuthorizations,
299
+ '/user/helpdesk-viewing-tool': userPermissions.canImpersonate,
300
+ '/reviewer/exception': userPermissions.internalReviewerNames?.includes(
301
+ 'QPP Targeted Review & Exceptions'
302
+ ),
303
+ '/reviewer/targeted-review':
304
+ userPermissions.internalReviewerNames?.includes(
305
+ 'QPP Targeted Review & Exceptions'
306
+ ),
307
+ '/self-nomination': userPermissions.internalReviewerNames?.includes(
308
+ 'QPP Self-Nomination'
309
+ ),
310
+
311
+ '/case-management': userPermissions.internalReviewerNames?.some((val) =>
312
+ [
313
+ 'QPP Case Management - PIMMS Reviewer',
314
+ 'QPP Case Management - ACO PAC Reviewer',
315
+ 'QPP Case Management - CMS Reviewer',
316
+ ].includes(val)
317
+ ),
318
+
319
+ // dev pre
320
+ '/user/applications': userPermissions.ehrAuthorized,
321
+ '/user/test-data': userPermissions.ehrAuthorized,
322
+ };
323
+ };
324
+
325
+ const isImpersonationLink = (docCookie, linkLabel) => {
326
+ if (!isImpersonating(docCookie)) return;
327
+ const helpdeskLinks = ['Account Home', 'Manage Access', 'Help and Support'];
328
+ return !helpdeskLinks.includes(linkLabel);
27
329
  };
28
330
 
29
331
  module.exports = {
@@ -32,8 +334,18 @@ module.exports = {
32
334
  feedbackUrl,
33
335
  manageUrl,
34
336
  physicianCompareUrl,
337
+ registrationUrl,
35
338
  performanceFeedbackUrl,
36
339
  facilityBasedPreviewUrl,
37
340
  handleNavigation,
38
341
  reportsPortalUrl,
342
+ facilityBasedPreviewBaseUrl,
343
+ viewingToolUrl,
344
+ loadUserPermissions,
345
+ getUrlConditionMap,
346
+ isMultiRoleUser,
347
+ getIcon,
348
+ isImpersonating,
349
+ isImpersonationLink,
350
+ loadSideNavContent,
39
351
  };
@@ -0,0 +1,5 @@
1
+ const TabPanel = ({ children }) => {
2
+ return children;
3
+ };
4
+
5
+ export default TabPanel;
@@ -0,0 +1,73 @@
1
+ import React, { Children } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { TabList, Tab, TabPanel, useTabState } from 'ariakit/tab';
4
+
5
+ function Tabs({ defaultSelectedId, children, onChange, selected }) {
6
+ const tab = useTabState({
7
+ defaultSelectedId: selected ?? defaultSelectedId,
8
+ selectOnMove: false,
9
+ });
10
+
11
+ const onTabClick = (tabHref, id) => {
12
+ if (tabHref) {
13
+ const currentUrl = new URL(window.location.href);
14
+ const newParams = new URLSearchParams(tabHref);
15
+ newParams.forEach((value, key) => {
16
+ currentUrl.searchParams.set(key, value);
17
+ });
18
+ window.history.replaceState(null, '', currentUrl);
19
+ }
20
+
21
+ if (onChange) {
22
+ onChange(id);
23
+ }
24
+ };
25
+
26
+ return (
27
+ <>
28
+ <div className="qpp-c-tabs qpp-c-tabs--mui">
29
+ <TabList state={tab} aria-label="qpp tabs">
30
+ {Children.map(children, (child) => (
31
+ <Tab
32
+ key={child.props.id}
33
+ id={child.props.id}
34
+ className="qpp-c-tabs__item"
35
+ disabled={child.props.disabled}
36
+ onClick={() => onTabClick(child.props.tabHref, child.props.id)}
37
+ >
38
+ {child.props.tab}
39
+ </Tab>
40
+ ))}
41
+ </TabList>
42
+ </div>
43
+ <div className="qpp-c-tabs__panel">
44
+ {Children.map(children, (child) => (
45
+ <TabPanel
46
+ key={child.props.id}
47
+ state={tab}
48
+ tabId={child.props.id}
49
+ className={child.props.className}
50
+ disabled={child.props.disabled}
51
+ >
52
+ {child.props.children}
53
+ </TabPanel>
54
+ ))}
55
+ </div>
56
+ </>
57
+ );
58
+ }
59
+
60
+ Tabs.propTypes = {
61
+ defaultSelectedId: PropTypes.string,
62
+ children: PropTypes.node.isRequired,
63
+ onChange: PropTypes.func,
64
+ selected: PropTypes.string,
65
+ };
66
+
67
+ Tabs.defaultProps = {
68
+ defaultSelectedId: undefined,
69
+ onChange: undefined,
70
+ selected: undefined,
71
+ };
72
+
73
+ export default Tabs;
@@ -0,0 +1,137 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ const TextInput = ({
5
+ id,
6
+ name,
7
+ placeholder,
8
+ disabled,
9
+ required,
10
+ size,
11
+ className,
12
+ label,
13
+ minLength,
14
+ maxLength,
15
+ hint,
16
+ errorLabel,
17
+ error,
18
+ autoComplete,
19
+ onChange,
20
+ onKeyPress,
21
+ style,
22
+ dataTestId,
23
+ type,
24
+ innerRef,
25
+ number,
26
+ variant,
27
+ parentElement,
28
+ ...props
29
+ }) => {
30
+ const ContainerElement = parentElement || 'span';
31
+ const numberProps = {
32
+ pattern: '[0-9]*',
33
+ };
34
+
35
+ const textInputClass = [
36
+ 'qpp-c-text-input',
37
+ variant === 'success' && !error && 'qpp-c-text-input--success',
38
+ error && 'qpp-c-text-input--error',
39
+ size === 'big' && 'qpp-c-text-input--big',
40
+ className,
41
+ ]
42
+ .filter(Boolean)
43
+ .join(' ');
44
+
45
+ return (
46
+ <ContainerElement className="qppds ds-text-input-container">
47
+ {label && (
48
+ <label className="qpp-u-margin-bottom--8" htmlFor={id}>
49
+ {label}
50
+ </label>
51
+ )}
52
+ <input
53
+ {...(number ? numberProps : {})}
54
+ style={style}
55
+ data-testid={dataTestId}
56
+ type={type}
57
+ className={textInputClass || ''}
58
+ id={id}
59
+ name={name}
60
+ placeholder={placeholder}
61
+ disabled={disabled}
62
+ minLength={minLength}
63
+ maxLength={maxLength}
64
+ required={required}
65
+ autoComplete={autoComplete}
66
+ onChange={onChange}
67
+ onKeyPress={onKeyPress}
68
+ ref={innerRef}
69
+ {...props}
70
+ />
71
+ {hint && <span className="qpp-hint-message">{hint}</span>}
72
+ {error && (
73
+ <span
74
+ aria-label={errorLabel}
75
+ role="alert"
76
+ className="qpp-error-message"
77
+ >
78
+ {error}
79
+ </span>
80
+ )}
81
+ </ContainerElement>
82
+ );
83
+ };
84
+
85
+ TextInput.propTypes = {
86
+ id: PropTypes.string,
87
+ name: PropTypes.string,
88
+ placeholder: PropTypes.string,
89
+ disabled: PropTypes.bool,
90
+ required: PropTypes.bool,
91
+ className: PropTypes.string,
92
+ minLength: PropTypes.string,
93
+ maxLength: PropTypes.string,
94
+ hint: PropTypes.string,
95
+ errorLabel: PropTypes.string,
96
+ error: PropTypes.string,
97
+ autoComplete: PropTypes.string,
98
+ onChange: PropTypes.func,
99
+ onKeyPress: PropTypes.func,
100
+ style: PropTypes.object,
101
+ dataTestId: PropTypes.string,
102
+ type: PropTypes.string,
103
+ innerRef: PropTypes.string,
104
+ number: PropTypes.bool,
105
+ variant: PropTypes.oneOf(['success']),
106
+ parentElement: PropTypes.string,
107
+ label: PropTypes.string,
108
+ size: PropTypes.oneOf(['big']),
109
+ };
110
+
111
+ TextInput.defaultProps = {
112
+ id: '',
113
+ name: '',
114
+ placeholder: null,
115
+ disabled: false,
116
+ required: false,
117
+ className: '',
118
+ minLength: '',
119
+ maxLength: '',
120
+ error: null,
121
+ errorLabel: null,
122
+ hint: null,
123
+ autoComplete: 'on',
124
+ onChange: () => null,
125
+ onKeyPress: () => null,
126
+ style: null,
127
+ dataTestId: '',
128
+ type: 'text',
129
+ innerRef: null,
130
+ number: false,
131
+ variant: null,
132
+ parentElement: 'span',
133
+ label: null,
134
+ size: null,
135
+ };
136
+
137
+ export default TextInput;
@@ -0,0 +1,75 @@
1
+ import React from 'react';
2
+ import axios from 'axios';
3
+ import { useState, useEffect } from 'react';
4
+
5
+ // The content is populated with the following priority order:
6
+ // 1. Use the content in localStorage if it's there
7
+ // 2. If not, make a call to get it from a QPPFE endpoint.
8
+ // Hydrate the localStorage item with the response if localStorage item doesn't match call content.
9
+ // 3. If the call fails, use the default content
10
+ const useGetConfig = ({
11
+ url = '',
12
+ localStorageName = '',
13
+ equalityCheckExclude = [],
14
+ timeout = 30,
15
+ defaultContent,
16
+ }) => {
17
+ const [result, setResult] = useState();
18
+
19
+ if (!url || !localStorageName) {
20
+ throw new Error('Arguments for url and localStorageName are required');
21
+ }
22
+
23
+ useEffect(() => {
24
+ const storageContent = JSON.parse(localStorage.getItem(localStorageName));
25
+ if (
26
+ storageContent?.content &&
27
+ new Date().valueOf() < storageContent.expiration
28
+ ) {
29
+ setResult(storageContent);
30
+ } else {
31
+ const origin = window.location.origin;
32
+ axios
33
+ .get(`${origin}${url}`)
34
+ .then(({ data: { data = {} } }) => {
35
+ const expiration = new Date().valueOf() + timeout * 60 * 1000;
36
+ const storageItem = {
37
+ expiration,
38
+ };
39
+
40
+ if (
41
+ data?.content &&
42
+ storageContent?.content &&
43
+ Object.keys(data.content).every((key) => {
44
+ if (equalityCheckExclude.includes(key)) {
45
+ return true;
46
+ }
47
+ return data.content[key] === storageContent.content[key];
48
+ })
49
+ ) {
50
+ storageItem.content = storageContent.content;
51
+ } else {
52
+ storageItem.content = data.content;
53
+ }
54
+
55
+ localStorage.setItem(localStorageName, JSON.stringify(storageItem));
56
+ setResult(storageItem);
57
+ })
58
+ .catch((e) => {
59
+ setResult({ content: defaultContent, expiration: 0 });
60
+ });
61
+ }
62
+ }, []);
63
+
64
+ return result;
65
+ };
66
+
67
+ export const withGetConfig = (Component, options) => {
68
+ function WrappedComponent(props) {
69
+ const result = useGetConfig(options);
70
+ return <Component result={result} {...props} />;
71
+ }
72
+ return WrappedComponent;
73
+ };
74
+
75
+ export default useGetConfig;