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,144 +1,143 @@
1
1
  import React, { useState, useEffect } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import axios from 'axios';
4
-
5
4
  import HeaderAccountMenu from './HeaderAccountMenu.jsx';
6
5
  import HeaderCancel from './HeaderCancel.jsx';
7
- import HeaderContainer from './HeaderContainer'
8
- import HeaderMenuItem from './HeaderMenuItem'
9
- import HeaderMobileButton from './HeaderMobileButton'
10
- import HelpIcon from './HelpIcon'
11
- import defaultHeaderContent from './default-content.json';
12
-
13
- // Time the local storage content item will be active, in minutes
14
- const CONTENT_STORAGE_EXPIRATION_TIMEOUT = 30;
6
+ import HeaderContainer from './HeaderContainer';
7
+ import HeaderMenuItem from './HeaderMenuItem';
8
+ import HeaderMobileButton from './HeaderMobileButton';
9
+ import ImpersonatorBanner from './ImpersonatorBanner';
10
+ import HelpIcon from './HelpIcon';
11
+ import { HeaderStateProvider } from './hooks';
12
+ import defaultContent from './default-content.json';
15
13
 
16
- const HeaderUI = ({
17
- fbpPerformanceYear,
18
- feedbackPerformanceYear,
14
+ const HeaderUI = ({
19
15
  handleCancel,
20
16
  includeSkipToSidebar,
21
17
  isDevPre,
22
18
  isLoginEnabled,
23
- performanceYear,
24
19
  showCancelButton,
25
- showPhysicianCompareLink,
26
- showFacilityBasedPreviewLink,
27
20
  skipToContentId,
21
+ RouterLink,
22
+ isIESupportPage,
28
23
  }) => {
29
- const [isMobileMenuExpanded, setIsMobileMenuExpanded] = useState(false)
30
- const [currentOpenMenu, setCurrentOpenMenu] = useState()
31
- const [content, setContent] = useState(null);
24
+ const [isMobileMenuExpanded, setIsMobileMenuExpanded] = useState(false);
25
+ const [headerContent, setHeaderContent] = useState({});
32
26
 
33
- const handleToggleMenu = name => {
34
- if (currentOpenMenu === name) {
35
- return setCurrentOpenMenu('')
36
- }
37
- return setCurrentOpenMenu(name)
38
- }
27
+ const mapContentToRows = (config) => {
28
+ // Append transposed array to content
29
+ return config?.map((section) => {
30
+ // Only header items with multiple columns need to be transposed
31
+ // Single column menus' tab order will remain the same
32
+ if (section.columns?.length > 1) {
33
+ const { columns } = section;
34
+ return {
35
+ ...section,
36
+ rows: columns[0].map((_, colIndex) =>
37
+ columns.map((row) => row[colIndex])
38
+ ),
39
+ };
40
+ }
41
+ return { ...section, rows: section.columns };
42
+ });
43
+ };
39
44
 
40
- // The top nav content is populated with the following priority order:
41
- // 1. Use the top nav content in localStorage if it's there
42
- // 2. If not, make a call to get it from the QPPFE endpoint. Hydrate the localStorage item with the response.
43
- // 3. If the call fails, use the default content
45
+ // execute on init render
44
46
  useEffect(() => {
45
- const storageContent = JSON.parse(
46
- localStorage.getItem('qpp_top_nav_content')
47
- );
48
- if (
49
- storageContent?.content &&
50
- new Date().valueOf() < storageContent.expiration
51
- ) {
52
- setContent(storageContent.content);
53
- } else {
54
- const origin = window.location.origin;
55
- axios
56
- .get(
57
- !origin.includes('localhost')
58
- ? `${origin}/config/header`
59
- : 'https://qpp.cms.gov/config/header'
60
- )
61
- .then(({ data: { data = {} } }) => {
62
- localStorage.setItem(
63
- 'qpp_top_nav_content',
64
- JSON.stringify({
65
- content: data.content,
66
- expiration:
67
- new Date().valueOf() +
68
- CONTENT_STORAGE_EXPIRATION_TIMEOUT * 60 * 1000,
69
- })
70
- );
71
- setContent(data.content);
72
- })
73
- .catch((e) => {
74
- setContent(defaultHeaderContent);
75
- });
47
+ let cancelRequest = false;
48
+ const { origin } = window.location;
49
+ let navMenuItems;
50
+ async function getHeaderConfig() {
51
+ try {
52
+ const { data } = await axios.get(`${origin}/config/header`);
53
+ navMenuItems = data.data;
54
+ } catch (error) {
55
+ navMenuItems = { content: defaultContent };
56
+ }
57
+ if (!cancelRequest) setHeaderContent(navMenuItems);
76
58
  }
59
+ getHeaderConfig();
60
+ return () => {
61
+ cancelRequest = true;
62
+ };
77
63
  }, []);
78
64
 
65
+ const content = mapContentToRows(headerContent?.content);
79
66
 
80
- if (showCancelButton) {
81
- return (
82
- <HeaderContainer showCancelButton skipToContentId={skipToContentId} includeSkipToSidebar={includeSkipToSidebar}>
83
- <HeaderCancel handleCancel={handleCancel} />
84
- </HeaderContainer>
85
- )
86
- }
67
+ const displayCancelContent = () => (
68
+ <HeaderContainer
69
+ showCancelButton
70
+ skipToContentId={skipToContentId}
71
+ includeSkipToSidebar={includeSkipToSidebar}
72
+ >
73
+ <HeaderCancel handleCancel={handleCancel} />
74
+ </HeaderContainer>
75
+ );
76
+
77
+ const displayDevPreContent = () => (
78
+ <HeaderContainer
79
+ isIESupportPage={isIESupportPage}
80
+ skipToContentId={skipToContentId}
81
+ includeSkipToSidebar={includeSkipToSidebar}
82
+ >
83
+ <nav aria-label="Primary navigation" hidden={!isMobileMenuExpanded}>
84
+ <ul className="navigation-menu">
85
+ <HeaderAccountMenu isDevPre isLoginEnabled={isLoginEnabled} />
86
+ </ul>
87
+ </nav>
88
+ </HeaderContainer>
89
+ );
87
90
 
88
- if (isDevPre) {
89
- return (
90
- <HeaderContainer skipToContentId={skipToContentId} includeSkipToSidebar={includeSkipToSidebar}>
91
- <HeaderAccountMenu
92
- isDevPre
93
- handleToggleMenu={() => handleToggleMenu("Login")}
94
- isLoginEnabled={isLoginEnabled}
95
- isOpen={currentOpenMenu === "Login"}
91
+ const displayHeaderContent = () => (
92
+ <>
93
+ <HeaderContainer
94
+ isIESupportPage={isIESupportPage}
95
+ skipToContentId={skipToContentId}
96
+ includeSkipToSidebar={includeSkipToSidebar}
97
+ >
98
+ <HelpIcon />
99
+ <HeaderMobileButton
100
+ handleClick={() => setIsMobileMenuExpanded(!isMobileMenuExpanded)}
101
+ isMobileMenuExpanded={isMobileMenuExpanded}
96
102
  />
103
+ <nav aria-label="Primary navigation" hidden={!isMobileMenuExpanded}>
104
+ <ul className="navigation-menu navigation-new-style">
105
+ {content.map((header) => (
106
+ <HeaderMenuItem
107
+ handleClick={() => {
108
+ setIsMobileMenuExpanded(!isMobileMenuExpanded);
109
+ }}
110
+ isMobileMenuExpanded={isMobileMenuExpanded}
111
+ key={header.name}
112
+ {...header}
113
+ />
114
+ ))}
115
+ <HeaderAccountMenu
116
+ handleClick={() => setIsMobileMenuExpanded(!isMobileMenuExpanded)}
117
+ isLoginEnabled={isLoginEnabled}
118
+ />
119
+ </ul>
120
+ </nav>
97
121
  </HeaderContainer>
98
- )
99
- }
122
+ <ImpersonatorBanner />
123
+ </>
124
+ );
100
125
 
101
- if (!content) {
126
+ const displayContent = () => {
127
+ if (showCancelButton) return displayCancelContent();
128
+ if (isDevPre) return displayDevPreContent();
129
+ if (content?.length) return displayHeaderContent();
102
130
  return null;
103
- }
131
+ };
104
132
 
105
133
  return (
106
- <HeaderContainer skipToContentId={skipToContentId} includeSkipToSidebar={includeSkipToSidebar}>
107
- <HelpIcon />
108
- <HeaderMobileButton
109
- handleClick={() => setIsMobileMenuExpanded(!isMobileMenuExpanded)}
110
- isMobileMenuExpanded={isMobileMenuExpanded}
111
- />
112
- <nav aria-label="Primary navigation" hidden={!isMobileMenuExpanded}>
113
- <ul className="navigation-menu">
114
- {content.map(header => (
115
- <HeaderMenuItem
116
- key={header.name}
117
- {...header}
118
- handleToggleMenu={() => handleToggleMenu(header.name)}
119
- hasMenu={header.columns.length > 0}
120
- isOpen={currentOpenMenu === header.name}
121
- />
122
- ))}
123
- <HeaderAccountMenu
124
- fbpPerformanceYear={fbpPerformanceYear}
125
- feedbackPerformanceYear={feedbackPerformanceYear}
126
- handleToggleMenu={() => handleToggleMenu("Login")}
127
- isLoginEnabled={isLoginEnabled}
128
- isOpen={currentOpenMenu === "Login"}
129
- performanceYear={performanceYear}
130
- showPhysicianCompareLink={showPhysicianCompareLink}
131
- showFacilityBasedPreviewLink={showFacilityBasedPreviewLink}
132
- />
133
- </ul>
134
- </nav>
135
- </HeaderContainer>
136
- )
137
- }
134
+ <HeaderStateProvider RouterLink={RouterLink} headerContent={headerContent}>
135
+ {displayContent()}
136
+ </HeaderStateProvider>
137
+ );
138
+ };
138
139
 
139
140
  HeaderUI.propTypes = {
140
- fbpPerformanceYear: PropTypes.string,
141
- feedbackPerformanceYear: PropTypes.string,
142
141
  handleCancel: PropTypes.func,
143
142
  includeSkipToSidebar: PropTypes.bool,
144
143
  isDevPre: PropTypes.bool,
@@ -148,10 +147,10 @@ HeaderUI.propTypes = {
148
147
  showPhysicianCompareLink: PropTypes.bool,
149
148
  showFacilityBasedPreviewLink: PropTypes.bool,
150
149
  skipToContentId: PropTypes.string,
151
- }
150
+ RouterLink: PropTypes.func,
151
+ isIESupportPage: PropTypes.bool,
152
+ };
152
153
  HeaderUI.defaultProps = {
153
- fbpPerformanceYear: null,
154
- feedbackPerformanceYear: null,
155
154
  handleCancel: Function.prototype,
156
155
  includeSkipToSidebar: false,
157
156
  isDevPre: false,
@@ -161,6 +160,8 @@ HeaderUI.defaultProps = {
161
160
  showPhysicianCompareLink: false,
162
161
  showFacilityBasedPreviewLink: false,
163
162
  skipToContentId: null,
164
- }
163
+ RouterLink: null,
164
+ isIESupportPage: false,
165
+ };
165
166
 
166
- export default HeaderUI
167
+ export default HeaderUI;
@@ -1,4 +1,4 @@
1
- import React from 'react'
1
+ import React from 'react';
2
2
 
3
3
  const HelpIcon = () => (
4
4
  <a
@@ -9,7 +9,8 @@ const HelpIcon = () => (
9
9
  data-track-label="QPP Service Center Phone"
10
10
  >
11
11
  <svg viewBox="0 0 28 28" className="header-help-icon">
12
- <path d="M23.9,5.9c0-0.6-0.2-1.1-0.6-1.5c-2.5-2.5-5.7-3.8-9.2-3.8S7.2,1.9,4.8,4.4c-0.4,0.4-0.6,1-0.6,1.5
12
+ <path
13
+ d="M23.9,5.9c0-0.6-0.2-1.1-0.6-1.5c-2.5-2.5-5.7-3.8-9.2-3.8S7.2,1.9,4.8,4.4c-0.4,0.4-0.6,1-0.6,1.5
13
14
  c0,0.4,0.1,0.8,0.3,1.1c-1.3,1.9-2,4.1-2,6.6v2.9c0,2.1,1.1,4,2.9,5.1c0,1.2,1,2.1,2.2,2.1c1.2,0,2.2-1,2.2-2.2v-6.5
14
15
  c0-1.2-1-2.2-2.2-2.2c-1.1,0-2,0.8-2.1,1.8H3.8v-1.1c0-2.1,0.6-4,1.7-5.6C5.8,8.1,6,8.1,6.3,8.1c0.6,0,1.1-0.2,1.5-0.6
15
16
  c1.6-1.6,3.8-2.5,6.2-2.5s4.5,0.9,6.2,2.5c0.4,0.4,1,0.6,1.5,0.6c0.3,0,0.5,0,0.7-0.1c1.1,1.6,1.7,3.6,1.7,5.6v1.1h-1.5
@@ -21,10 +22,11 @@ const HelpIcon = () => (
21
22
  C16.6,24.5,16.9,24.8,16.9,25.2z M19.8,21.6v-6.5c0-0.4,0.3-0.7,0.7-0.7s0.7,0.3,0.7,0.7v6.5c0,0.4-0.3,0.7-0.7,0.7
22
23
  S19.8,22,19.8,21.6z M22.7,16.2h1.5v0.4c0,1.3-0.5,2.5-1.5,3.3V16.2z M21.2,6.5c-1.9-1.9-4.5-3-7.2-3s-5.3,1.1-7.2,3
23
24
  c-0.3,0.3-0.8,0.3-1,0C5.7,6.3,5.6,6.1,5.6,5.9s0.1-0.4,0.2-0.5C8,3.2,10.9,2,14,2s6,1.2,8.2,3.4l0,0c0.1,0.1,0.2,0.3,0.2,0.5
24
- s-0.1,0.4-0.2,0.5C21.9,6.7,21.5,6.7,21.2,6.5z"/>
25
+ s-0.1,0.4-0.2,0.5C21.9,6.7,21.5,6.7,21.2,6.5z"
26
+ />
25
27
  </svg>
26
28
  <span>Help</span>
27
29
  </a>
28
- )
30
+ );
29
31
 
30
- export default HelpIcon
32
+ export default HelpIcon;
@@ -0,0 +1,81 @@
1
+ import React from 'react';
2
+ import cookie from 'cookie';
3
+ import axios from 'axios';
4
+ import { CloseIcon } from '../../lib/SvgComponents';
5
+ import { TextButton } from '../Button';
6
+ import {
7
+ deleteImpersonatedUser,
8
+ revertQppHasAuthsCookie,
9
+ revertApmPaymentCookie,
10
+ } from '../../session/logout';
11
+ import { viewingToolUrl } from '../SideNav/helpers';
12
+
13
+ const getViewType = (viewType) =>
14
+ ({
15
+ username: 'HARP ID',
16
+ npi: 'NPI',
17
+ tin: 'TIN',
18
+ apm_id: 'APM Entity',
19
+ cms_id: 'Registry',
20
+ vg_id: 'Virtual Group',
21
+ }[viewType]);
22
+
23
+ const ImpersonatorBanner = () => {
24
+ const {
25
+ qpp_auth_token: token = null,
26
+ qpp_impersonated_user: user = null,
27
+ qpp_impersonated_type: viewType = null,
28
+ } = cookie.parse(document.cookie);
29
+
30
+ const className = [
31
+ 'qpp-u-display--flex',
32
+ 'qpp-u-justify-content--between',
33
+ 'qpp-u-fill--gold-20',
34
+ 'qpp-u-padding-x--40',
35
+ 'qpp-u-padding-y--24',
36
+ 'qpp-u-font-size--14',
37
+ 'qpp-u-color--gray-80',
38
+ ].join(' ');
39
+
40
+ const onClick = () => {
41
+ const fn = () => {
42
+ deleteImpersonatedUser({
43
+ qpp_impersonated_user: user,
44
+ qpp_impersonated_type: viewType,
45
+ });
46
+
47
+ // Set user_has_apm_payments cookie back to impersonator's value
48
+ revertApmPaymentCookie();
49
+
50
+ // Set qpp_has_authorizations cookie back to impersonator's value
51
+ revertQppHasAuthsCookie();
52
+ window.location.href = viewingToolUrl;
53
+ };
54
+ return axios
55
+ .delete('/api/auth/helpdesk/view', {
56
+ headers: {
57
+ Accept: 'application/vnd.qpp.cms.gov.v1+json',
58
+ Authorization: `Bearer ${token}`,
59
+ },
60
+ })
61
+ .then(fn, fn);
62
+ };
63
+
64
+ return (
65
+ token &&
66
+ user && (
67
+ <div className={className}>
68
+ <div>
69
+ VIEW ONLY | You are currently viewing {getViewType(viewType)}:{' '}
70
+ <strong>{user}</strong>
71
+ </div>
72
+ <TextButton onClick={onClick} className="qpp-u-color--gray-80">
73
+ Exit View Mode
74
+ <CloseIcon />
75
+ </TextButton>
76
+ </div>
77
+ )
78
+ );
79
+ };
80
+
81
+ export default ImpersonatorBanner;
@@ -13,6 +13,7 @@ export default class Header {
13
13
  * @param {Boolean} options.includeSkipToSidebar
14
14
  * @param {Boolean} options.showCancelButton
15
15
  * @param {Boolean} options.showCovidLink
16
+ * @param {Boolean} options.isIESupportPage
16
17
  * @param {HTMLElement} options.rootElement - Elem inside which to render
17
18
  */
18
19
  constructor(options) {
@@ -31,6 +32,7 @@ export default class Header {
31
32
  showMaqi={options.showMaqi}
32
33
  isDevPre={options.isDevPre}
33
34
  content={options.content}
35
+ isIESupportPage={options.isIESupportPage}
34
36
  />,
35
37
  options.rootElement
36
38
  );
@@ -1,4 +1,5 @@
1
- import { useState, useEffect } from 'react';
1
+ import React, { createContext, useState, useEffect, useContext } from 'react';
2
+ import PropTypes from 'prop-types';
2
3
 
3
4
  export function useWindowWidth() {
4
5
  const [windowSize, setWindowSize] = useState(undefined);
@@ -12,3 +13,54 @@ export function useWindowWidth() {
12
13
  }, []);
13
14
  return windowSize;
14
15
  }
16
+
17
+ export const HeaderStateContext = createContext(null);
18
+
19
+ export const HeaderStateProvider = ({
20
+ children,
21
+ RouterLink,
22
+ headerContent, // allow header content from api request available to all child components
23
+ }) => {
24
+ const [currentOpenMenu, setCurrentOpenMenu] = useState('');
25
+
26
+ const handleToggleMenu = (name) => {
27
+ if (currentOpenMenu === name) {
28
+ return setCurrentOpenMenu('');
29
+ }
30
+ return setCurrentOpenMenu(name);
31
+ };
32
+
33
+ const closeMenus = () => setCurrentOpenMenu('');
34
+
35
+ return (
36
+ <HeaderStateContext.Provider
37
+ value={{
38
+ currentOpenMenu,
39
+ handleToggleMenu,
40
+ closeMenus,
41
+ RouterLink,
42
+ headerContent,
43
+ }}
44
+ >
45
+ {children}
46
+ </HeaderStateContext.Provider>
47
+ );
48
+ };
49
+
50
+ HeaderStateProvider.propTypes = {
51
+ children: PropTypes.node.isRequired,
52
+ RouterLink: PropTypes.func,
53
+ headerContent: PropTypes.object,
54
+ };
55
+
56
+ HeaderStateProvider.defaultProps = {
57
+ RouterLink: null,
58
+ };
59
+
60
+ export const useHeaderState = () => {
61
+ const context = useContext(HeaderStateContext);
62
+ if (context === undefined) {
63
+ throw new Error('useHeaderState must be used within a HeaderStateProvider');
64
+ }
65
+ return context;
66
+ };
@@ -0,0 +1,9 @@
1
+ export const setUtagLink = (eventCategory, eventAction, eventLabel) =>
2
+ window?.utag?.link({
3
+ ga_event_category: eventCategory,
4
+ ga_event_action: eventAction,
5
+ ga_event_label: eventLabel,
6
+ page_title: `${window.document.title}`,
7
+ page_url: `${window.location.pathname}`,
8
+ event: 'trackEvent',
9
+ });
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import Tooltip from '../Tooltip';
3
+ import InfotipContent from './InfotipContent';
4
4
  import InfotipIcon from './InfotipIcon';
5
5
 
6
6
  const BUTTON_SIZE = '16px';
@@ -16,10 +16,6 @@ const buttonStyle = {
16
16
  userSelect: 'none',
17
17
  };
18
18
 
19
- // Use basic touch handlers for mobile "tap-to-open" ui. Mobile touch
20
- // is currently not supported by @reach/tooltip; this may change in future.
21
- // Leverages @reach/tooltip "focus" behavior to open tooltip on tap,
22
- // and close tooltip on second tap or loss of focus.
23
19
  // TODO: We may want to improve this by tracking touch positions to ensure
24
20
  // that a 'touchend' event must be reasonably close to the tooltip target.
25
21
  const touchHandlers = {
@@ -40,11 +36,11 @@ const touchHandlers = {
40
36
  /**
41
37
  * Tooltip with styled information icon
42
38
  */
43
- const Infotip = ({ label, lightIcon, ...props }) => (
44
- <Tooltip label={label} {...props}>
39
+ const Infotip = ({ ariaLabel, label, lightIcon, ...props }) => (
40
+ <InfotipContent label={label} {...props}>
45
41
  <button
46
42
  type="button"
47
- aria-label="Information"
43
+ aria-label={ariaLabel}
48
44
  style={buttonStyle}
49
45
  {...touchHandlers}
50
46
  >
@@ -56,7 +52,7 @@ const Infotip = ({ label, lightIcon, ...props }) => (
56
52
  style={{ float: 'left' }}
57
53
  />
58
54
  </button>
59
- </Tooltip>
55
+ </InfotipContent>
60
56
  );
61
57
 
62
58
  Infotip.propTypes = {
@@ -67,7 +63,7 @@ Infotip.propTypes = {
67
63
  };
68
64
 
69
65
  Infotip.defaultProps = {
70
- ariaLabel: undefined,
66
+ ariaLabel: 'Information',
71
67
  lightIcon: false,
72
68
  DEBUG_STYLE: undefined,
73
69
  };
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import {
4
+ Tooltip as TooltipAriaKit,
5
+ TooltipAnchor,
6
+ TooltipArrow,
7
+ useTooltipState,
8
+ } from 'ariakit/tooltip';
9
+
10
+ const TEXT_COLOR = '#FFF';
11
+ const BACKGROUND_COLOR = '#333';
12
+
13
+ const InfotipContent = ({ children, label }) => {
14
+ const tooltip = useTooltipState();
15
+
16
+ const cssStyles = {
17
+ maxWidth: '300px',
18
+ padding: '8px',
19
+ borderRadius: '4px',
20
+ fontSize: '0.9rem',
21
+ backgroundColor: BACKGROUND_COLOR,
22
+ color: TEXT_COLOR,
23
+ };
24
+ return (
25
+ <>
26
+ <TooltipAnchor as={'span'} state={tooltip} className="tooltip-anchor">
27
+ {children}
28
+ </TooltipAnchor>
29
+ <TooltipAriaKit
30
+ state={tooltip}
31
+ className="tooltip-content"
32
+ style={cssStyles}
33
+ >
34
+ {label}
35
+ <TooltipArrow />
36
+ </TooltipAriaKit>
37
+ </>
38
+ );
39
+ };
40
+
41
+ InfotipContent.propTypes = {
42
+ children: PropTypes.node.isRequired,
43
+ label: PropTypes.node.isRequired,
44
+ };
45
+
46
+ export default InfotipContent;
@@ -17,13 +17,13 @@ const InfotipIcon = ({ lightIcon, ...props }) => (
17
17
  />
18
18
  <path
19
19
  d="M9.721 0C4.361 0 0 4.469 0 9.962c0 5.493 4.36 9.962 9.721 9.962 5.36 0 9.722-4.469 9.722-9.962C19.443 4.469 15.082 0 9.72 0z"
20
- fill={lightIcon ? '#FFF' : '#04838A'}
20
+ fill={lightIcon ? '#FFF' : '#0073C8'}
21
21
  />
22
22
  <path
23
23
  d="M9.721 14.765c-.206 0-.374.112-.374.25v.5c0 .138.168.25.374.25.207 0 .374-.112.374-.25v-.5c0-.138-.167-.25-.374-.25zM9.764 4.706H9.72c-.792 0-1.536.29-2.1.821a2.767 2.767 0 0 0-.89 2.03c0 .197.166.356.373.356s.374-.159.374-.356c0-.577.237-1.118.668-1.523a2.268 2.268 0 0 1 1.607-.615c1.182.016 2.195.98 2.211 2.107.011.743-.373 1.427-1.028 1.83-.995.61-1.589 1.691-1.589 2.89v1.013c0 .197.168.357.374.357.207 0 .374-.16.374-.357v-1.013c0-.941.477-1.82 1.246-2.292.873-.537 1.386-1.448 1.371-2.438-.022-1.527-1.345-2.788-2.948-2.81z"
24
- stroke={lightIcon ? '#04838A' : '#FFF'}
24
+ stroke={lightIcon ? '#0073C8' : '#FFF'}
25
25
  strokeWidth=".5"
26
- fill={lightIcon ? '#04838A' : '#FFF'}
26
+ fill={lightIcon ? '#0073C8' : '#FFF'}
27
27
  fillRule="nonzero"
28
28
  />
29
29
  </g>
@@ -0,0 +1,61 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ const VARIANTS = ['white', 'gray'];
5
+
6
+ const DSLink = ({
7
+ className,
8
+ href,
9
+ download,
10
+ ariaLabel,
11
+ onClick,
12
+ children,
13
+ variant,
14
+ ...rest
15
+ }) => {
16
+ let linkClass = 'qpp-c-link';
17
+ if (VARIANTS.includes(variant)) {
18
+ variant === 'gray'
19
+ ? (linkClass = linkClass.concat(' ', 'qpp-u-color--gray-60'))
20
+ : (linkClass = linkClass.concat(' ', `qpp-u-color--${variant}`));
21
+ }
22
+
23
+ if (className) {
24
+ linkClass = linkClass.concat(' ', className);
25
+ }
26
+
27
+ return (
28
+ <a
29
+ aria-label={ariaLabel}
30
+ className={linkClass || ''}
31
+ href={href}
32
+ download={download}
33
+ onClick={onClick}
34
+ {...rest}
35
+ >
36
+ {children}
37
+ </a>
38
+ );
39
+ };
40
+
41
+ DSLink.propTypes = {
42
+ children: PropTypes.node,
43
+ className: PropTypes.string,
44
+ href: PropTypes.string,
45
+ ariaLabel: PropTypes.string,
46
+ onClick: PropTypes.func,
47
+ download: PropTypes.bool,
48
+ variant: PropTypes.oneOf(VARIANTS),
49
+ };
50
+
51
+ DSLink.defaultProps = {
52
+ children: null,
53
+ className: '',
54
+ href: '',
55
+ ariaLabel: null,
56
+ onClick: () => null,
57
+ download: false,
58
+ variant: null,
59
+ };
60
+
61
+ export default DSLink;