qpp-style 9.27.0 → 9.28.1

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 (208) hide show
  1. package/README.md +15 -0
  2. package/components/SanitizedContent/index.jsx +12 -1
  3. package/components/SideNav/Content/LevelOneContent.jsx +9 -159
  4. package/components/SideNav/Content/SelectRole/index.js +1 -0
  5. package/components/SideNav/UI/SideNavUI.jsx +39 -32
  6. package/components/SideNav/helpers.js +39 -0
  7. package/components/SideNav/index.js +0 -2
  8. package/coverage/clover.xml +366 -401
  9. package/coverage/coverage-final.json +69 -70
  10. package/coverage/lcov-report/components/Accordion/index.html +21 -21
  11. package/coverage/lcov-report/components/Accordion/index.jsx.html +39 -39
  12. package/coverage/lcov-report/components/Button/index.html +1 -1
  13. package/coverage/lcov-report/components/Button/index.js.html +1 -1
  14. package/coverage/lcov-report/components/Error/Collapsible.jsx.html +1 -1
  15. package/coverage/lcov-report/components/Error/ErrorUI.jsx.html +1 -1
  16. package/coverage/lcov-report/components/Error/index.html +1 -1
  17. package/coverage/lcov-report/components/Footer/FooterUI.jsx.html +32 -17
  18. package/coverage/lcov-report/components/Footer/SocialLinks.jsx.html +1 -1
  19. package/coverage/lcov-report/components/Footer/Subscribe.jsx.html +1 -1
  20. package/coverage/lcov-report/components/Footer/index.html +1 -1
  21. package/coverage/lcov-report/components/GovBanner/index.html +1 -1
  22. package/coverage/lcov-report/components/GovBanner/index.js.html +1 -1
  23. package/coverage/lcov-report/components/Header/HeaderAccountMenu.jsx.html +1 -1
  24. package/coverage/lcov-report/components/Header/HeaderCancel.jsx.html +1 -1
  25. package/coverage/lcov-report/components/Header/HeaderContainer.jsx.html +32 -59
  26. package/coverage/lcov-report/components/Header/HeaderLogo.jsx.html +1 -1
  27. package/coverage/lcov-report/components/Header/HeaderMenuButton.js.html +1 -1
  28. package/coverage/lcov-report/components/Header/HeaderMenuItem.jsx.html +1 -1
  29. package/coverage/lcov-report/components/Header/HeaderMenuLink.js.html +1 -1
  30. package/coverage/lcov-report/components/Header/HeaderMenuSignOutButton.js.html +1 -1
  31. package/coverage/lcov-report/components/Header/HeaderMobileButton.js.html +1 -1
  32. package/coverage/lcov-report/components/Header/HeaderUI.jsx.html +16 -40
  33. package/coverage/lcov-report/components/Header/HelpIcon.jsx.html +1 -1
  34. package/coverage/lcov-report/components/Header/ImpersonatorBanner.jsx.html +6 -3
  35. package/coverage/lcov-report/components/Header/NavigationButtonIcon.jsx.html +1 -1
  36. package/coverage/lcov-report/components/Header/hooks.js.html +4 -4
  37. package/coverage/lcov-report/components/Header/index.html +25 -25
  38. package/coverage/lcov-report/components/Header/utag-helpers.js.html +1 -1
  39. package/coverage/lcov-report/components/Infotip/Infotip.jsx.html +4 -4
  40. package/coverage/lcov-report/components/Infotip/InfotipIcon.jsx.html +1 -1
  41. package/coverage/lcov-report/components/Infotip/index.html +1 -1
  42. package/coverage/lcov-report/components/Infotip/index.js.html +1 -1
  43. package/coverage/lcov-report/components/Modal/LegacyModal.jsx.html +3 -3
  44. package/coverage/lcov-report/components/Modal/Modal.jsx.html +40 -40
  45. package/coverage/lcov-report/components/Modal/index.html +32 -32
  46. package/coverage/lcov-report/components/Modal/index.jsx.html +19 -19
  47. package/coverage/lcov-report/components/NotificationBanner/CollapsedView.js.html +1 -1
  48. package/coverage/lcov-report/components/NotificationBanner/ExpandedView.js.html +1 -1
  49. package/coverage/lcov-report/components/NotificationBanner/index.html +1 -1
  50. package/coverage/lcov-report/components/NotificationBanner/index.js.html +1 -1
  51. package/coverage/lcov-report/components/SanitizedContent/index.html +1 -1
  52. package/coverage/lcov-report/components/SanitizedContent/index.jsx.html +5 -5
  53. package/coverage/lcov-report/components/SessionDialogUI.jsx.html +114 -114
  54. package/coverage/lcov-report/components/SideNav/Chart/ScoreChart.jsx.html +889 -0
  55. package/coverage/lcov-report/components/SideNav/Chart/index.html +116 -0
  56. package/coverage/lcov-report/components/SideNav/Content/SelectRole/index.html +1 -1
  57. package/coverage/lcov-report/components/SideNav/Content/SelectRole/utils.js.html +1 -1
  58. package/coverage/lcov-report/components/SideNav/helpers.js.html +1 -1
  59. package/coverage/lcov-report/components/SideNav/index.html +1 -1
  60. package/coverage/lcov-report/components/Tooltip/Tooltip.jsx.html +2 -2
  61. package/coverage/lcov-report/components/Tooltip/index.html +1 -1
  62. package/coverage/lcov-report/components/Tooltip/index.js.html +1 -1
  63. package/coverage/lcov-report/components/Tooltip/position.js.html +1 -1
  64. package/coverage/lcov-report/components/hooks/index.html +1 -1
  65. package/coverage/lcov-report/components/hooks/useGetConfig.js.html +1 -1
  66. package/coverage/lcov-report/components/index.html +21 -21
  67. package/coverage/lcov-report/favicon.png +0 -0
  68. package/coverage/lcov-report/index.html +116 -116
  69. package/coverage/lcov-report/lib/Chevron.jsx.html +4 -4
  70. package/coverage/lcov-report/lib/SvgComponents.jsx.html +58 -418
  71. package/coverage/lcov-report/lib/index.html +19 -19
  72. package/coverage/lcov-report/react/components/Accordion/index.html +1 -1
  73. package/coverage/lcov-report/react/components/Accordion/index.jsx.html +1 -1
  74. package/coverage/lcov-report/react/components/Button/index.html +1 -1
  75. package/coverage/lcov-report/react/components/Button/index.js.html +1 -1
  76. package/coverage/lcov-report/react/components/Dropdown/index.html +1 -1
  77. package/coverage/lcov-report/react/components/Dropdown/index.js.html +1 -1
  78. package/coverage/lcov-report/react/components/Error/Collapsible.jsx.html +1 -1
  79. package/coverage/lcov-report/react/components/Error/ErrorUI.jsx.html +1 -1
  80. package/coverage/lcov-report/react/components/Error/error.js.html +1 -1
  81. package/coverage/lcov-report/react/components/Error/index.html +1 -1
  82. package/coverage/lcov-report/react/components/Footer/FooterUI.jsx.html +1 -1
  83. package/coverage/lcov-report/react/components/Footer/LegacyFooterUI.jsx.html +667 -0
  84. package/coverage/lcov-report/react/components/Footer/SocialLinks.jsx.html +1 -1
  85. package/coverage/lcov-report/react/components/Footer/Subscribe.jsx.html +1 -1
  86. package/coverage/lcov-report/react/components/Footer/footer.js.html +1 -1
  87. package/coverage/lcov-report/react/components/Footer/index.html +1 -1
  88. package/coverage/lcov-report/react/components/GovBanner/index.html +21 -21
  89. package/coverage/lcov-report/react/components/GovBanner/index.js.html +16 -16
  90. package/coverage/lcov-report/react/components/Header/HeaderAccountMenu.jsx.html +25 -25
  91. package/coverage/lcov-report/react/components/Header/HeaderCancel.jsx.html +1 -1
  92. package/coverage/lcov-report/react/components/Header/HeaderContainer.jsx.html +21 -21
  93. package/coverage/lcov-report/react/components/Header/HeaderLogo.jsx.html +17 -17
  94. package/coverage/lcov-report/react/components/Header/HeaderMenuButton.js.html +1 -1
  95. package/coverage/lcov-report/react/components/Header/HeaderMenuItem.jsx.html +55 -55
  96. package/coverage/lcov-report/react/components/Header/HeaderMenuLink.js.html +1 -1
  97. package/coverage/lcov-report/react/components/Header/HeaderMenuSignOutButton.js.html +1 -1
  98. package/coverage/lcov-report/react/components/Header/HeaderMobileButton.js.html +15 -15
  99. package/coverage/lcov-report/react/components/Header/HeaderUI.jsx.html +69 -69
  100. package/coverage/lcov-report/react/components/Header/HelpIcon.jsx.html +11 -11
  101. package/coverage/lcov-report/react/components/Header/ImpersonatorBanner.jsx.html +23 -23
  102. package/coverage/lcov-report/react/components/Header/NavigationButtonIcon.jsx.html +1 -1
  103. package/coverage/lcov-report/react/components/Header/header.js.html +1 -1
  104. package/coverage/lcov-report/react/components/Header/hooks.js.html +42 -42
  105. package/coverage/lcov-report/react/components/Header/index.html +105 -105
  106. package/coverage/lcov-report/react/components/Header/utag-helpers.js.html +1 -1
  107. package/coverage/lcov-report/react/components/Infotip/Infotip.jsx.html +1 -1
  108. package/coverage/lcov-report/react/components/Infotip/InfotipContent.jsx.html +4 -4
  109. package/coverage/lcov-report/react/components/Infotip/InfotipIcon.jsx.html +1 -1
  110. package/coverage/lcov-report/react/components/Infotip/index.html +1 -1
  111. package/coverage/lcov-report/react/components/Infotip/index.js.html +1 -1
  112. package/coverage/lcov-report/react/components/Modal/LegacyModal.jsx.html +1 -1
  113. package/coverage/lcov-report/react/components/Modal/Modal.jsx.html +1 -1
  114. package/coverage/lcov-report/react/components/Modal/index.html +1 -1
  115. package/coverage/lcov-report/react/components/Modal/index.jsx.html +1 -1
  116. package/coverage/lcov-report/react/components/NotificationBanner/CollapsedView.js.html +1 -1
  117. package/coverage/lcov-report/react/components/NotificationBanner/ExpandedView.js.html +2 -2
  118. package/coverage/lcov-report/react/components/NotificationBanner/index.html +21 -21
  119. package/coverage/lcov-report/react/components/NotificationBanner/index.js.html +82 -82
  120. package/coverage/lcov-report/react/components/SanitizedContent/index.html +21 -21
  121. package/coverage/lcov-report/react/components/SanitizedContent/index.jsx.html +60 -27
  122. package/coverage/lcov-report/react/components/SessionDialog/index.html +1 -1
  123. package/coverage/lcov-report/react/components/SessionDialog/sessionDialog.js.html +1 -1
  124. package/coverage/lcov-report/react/components/SessionDialogUI.jsx.html +1 -1
  125. package/coverage/lcov-report/react/components/SideNav/AnimationGroup/AnimationGroup.jsx.html +1 -1
  126. package/coverage/lcov-report/react/components/SideNav/AnimationGroup/index.html +1 -1
  127. package/coverage/lcov-report/react/components/SideNav/Chart/ScoreChart.jsx.html +1 -1
  128. package/coverage/lcov-report/react/components/SideNav/Chart/index.html +1 -1
  129. package/coverage/lcov-report/react/components/SideNav/Chart/index.js.html +1 -1
  130. package/coverage/lcov-report/react/components/SideNav/Content/LevelOneContent.jsx.html +20 -470
  131. package/coverage/lcov-report/react/components/SideNav/Content/LevelTwoContent.jsx.html +1 -1
  132. package/coverage/lcov-report/react/components/SideNav/Content/SelectRole/index.html +11 -11
  133. package/coverage/lcov-report/react/components/SideNav/Content/SelectRole/index.js.html +9 -6
  134. package/coverage/lcov-report/react/components/SideNav/Content/SelectRole/utils.js.html +1 -1
  135. package/coverage/lcov-report/react/components/SideNav/Content/index.html +21 -36
  136. package/coverage/lcov-report/react/components/SideNav/Content/index.js.html +3 -6
  137. package/coverage/lcov-report/react/components/SideNav/Details/IndividualDetails.jsx.html +1 -1
  138. package/coverage/lcov-report/react/components/SideNav/Details/PracticeDetails.jsx.html +1 -1
  139. package/coverage/lcov-report/react/components/SideNav/Details/index.html +1 -1
  140. package/coverage/lcov-report/react/components/SideNav/Details/index.js.html +1 -1
  141. package/coverage/lcov-report/react/components/SideNav/Links/CmsSwitchLink.jsx.html +1 -1
  142. package/coverage/lcov-report/react/components/SideNav/Links/NavItemInline.jsx.html +1 -1
  143. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkContainer.jsx.html +18 -18
  144. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkDrawer.jsx.html +1 -1
  145. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkInline.jsx.html +5 -11
  146. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkToggle.jsx.html +1 -1
  147. package/coverage/lcov-report/react/components/SideNav/Links/index.html +21 -21
  148. package/coverage/lcov-report/react/components/SideNav/Links/index.js.html +1 -1
  149. package/coverage/lcov-report/react/components/SideNav/UI/SideNavUI.jsx.html +74 -161
  150. package/coverage/lcov-report/react/components/SideNav/UI/index.html +17 -17
  151. package/coverage/lcov-report/react/components/SideNav/UI/index.js.html +1 -1
  152. package/coverage/lcov-report/react/components/SideNav/helpers.js.html +179 -62
  153. package/coverage/lcov-report/react/components/SideNav/index.html +21 -21
  154. package/coverage/lcov-report/react/components/SideNav/index.js.html +2 -8
  155. package/coverage/lcov-report/react/components/Tooltip/Tooltip.jsx.html +159 -42
  156. package/coverage/lcov-report/react/components/Tooltip/index.html +9 -9
  157. package/coverage/lcov-report/react/components/Tooltip/index.js.html +1 -1
  158. package/coverage/lcov-report/react/components/Tooltip/position.js.html +20 -20
  159. package/coverage/lcov-report/react/components/hooks/index.html +21 -21
  160. package/coverage/lcov-report/react/components/hooks/useGetConfig.js.html +37 -37
  161. package/coverage/lcov-report/react/components/index.html +1 -1
  162. package/coverage/lcov-report/react/index.html +1 -1
  163. package/coverage/lcov-report/react/index.js.html +1 -1
  164. package/coverage/lcov-report/react/lib/Chevron.jsx.html +2 -2
  165. package/coverage/lcov-report/react/lib/SvgComponents.jsx.html +1 -1
  166. package/coverage/lcov-report/react/lib/index.html +1 -1
  167. package/coverage/lcov-report/react/lib/svg-definitions.svg.html +1 -1
  168. package/coverage/lcov-report/react/session/index.html +11 -11
  169. package/coverage/lcov-report/react/session/index.js.html +1 -1
  170. package/coverage/lcov-report/react/session/logout.js.html +15 -6
  171. package/coverage/lcov-report/react/session/refresh.js.html +1 -1
  172. package/coverage/lcov-report/react/session/ttl.js.html +1 -1
  173. package/coverage/lcov-report/session/index.html +43 -43
  174. package/coverage/lcov-report/session/index.js.html +1 -1
  175. package/coverage/lcov-report/session/logout.js.html +41 -41
  176. package/coverage/lcov-report/session/refresh.js.html +34 -34
  177. package/coverage/lcov-report/session/ttl.js.html +29 -29
  178. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  179. package/coverage/lcov.info +539 -679
  180. package/dist/browser.js +1 -1
  181. package/dist/browser.js.map +1 -1
  182. package/dist/index.js +1 -1
  183. package/dist/index.js.map +1 -1
  184. package/dist/react/index.js +1 -1
  185. package/dist/react/index.js.map +1 -1
  186. package/package.json +26 -26
  187. package/session/logout.js +3 -0
  188. package/test/components/HeaderUI.test.js +4 -14
  189. package/coverage/lcov-report/Tooltip.jsx.html +0 -232
  190. package/coverage/lcov-report/index.js.html +0 -94
  191. package/coverage/lcov-report/position.js.html +0 -289
  192. package/storybook-static/229.630347465201d1822126.manager.bundle.js +0 -1
  193. package/storybook-static/295.aa3c5122636a27ad7c7b.manager.bundle.js +0 -1
  194. package/storybook-static/468.d976c69e47003b4dcfa3.manager.bundle.js +0 -2
  195. package/storybook-static/468.d976c69e47003b4dcfa3.manager.bundle.js.LICENSE.txt +0 -94
  196. package/storybook-static/51.fc4b02f2a75c894ae64e.manager.bundle.js +0 -2
  197. package/storybook-static/51.fc4b02f2a75c894ae64e.manager.bundle.js.LICENSE.txt +0 -8
  198. package/storybook-static/551.45aead073703cc6fb12b.manager.bundle.js +0 -1
  199. package/storybook-static/807.1a7f4dcf15e4696572ca.manager.bundle.js +0 -2
  200. package/storybook-static/807.1a7f4dcf15e4696572ca.manager.bundle.js.LICENSE.txt +0 -31
  201. package/storybook-static/897.9b5fee8cc7074607c812.manager.bundle.js +0 -2
  202. package/storybook-static/897.9b5fee8cc7074607c812.manager.bundle.js.LICENSE.txt +0 -12
  203. package/storybook-static/935.532759f0652585685af7.manager.bundle.js +0 -1
  204. package/storybook-static/favicon.ico +0 -0
  205. package/storybook-static/index.html +0 -59
  206. package/storybook-static/main.ad4edcd27d527a119d7a.manager.bundle.js +0 -1
  207. package/storybook-static/project.json +0 -1
  208. package/storybook-static/runtime~main.b165398bf7ef3e30d431.manager.bundle.js +0 -1
package/README.md CHANGED
@@ -43,3 +43,18 @@ npm publish
43
43
  ```
44
44
 
45
45
  7. Once published successfully, merge into main.
46
+
47
+ The Side Nav contains multiple item array types: divider, container, linkBack, linkHome, practiceDetails, individualDetails, linkDrawer, custom, chart, and switchLink.
48
+
49
+ | Item Array Type | Description |
50
+ |-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
51
+ | divider | <hr> element that is located above and below the practice container. |
52
+ | container | gets Dynamic Content of multiple items and contains the linkDrawer item. Level One and Level Two content are located in this container. |
53
+ | linkBack | <button> that links the user back to a URL. This uses a chevron Left icon. |
54
+ | linkHome | <a> tag element which sends the user back to the “Account Home” page /user/submissions. This uses the home icon SVG and is located at the top of the side nav. |
55
+ | practiceDetails | <div> element with the class name practice-container. Inside this container is the <h2> element which includes the Practice Name and the <p> element which is the Practice Tin. The Practice Tin shows either the CPC+ ID, PCF ID, APM Entity ID, VG ID, or Practice Tin. |
56
+ | individualDetails | <div> element with the class name “individual-container”. This parent element contains two other elements which are the <h3> Individual Name and the <p> Individual NPI. |
57
+ | linkDrawer | This is the most complex item type. This item displays the Level One and Level Two <button> elements which contain navigation links depending on each page as well as specific SVG icons. Depending on the page there can be multiple links to the user can access quickly using the side nav. |
58
+ | custom | This option is for sanitized HTML content. This custom HTML will be cleaned of any potentially harmful elements that could compromise the security of the web app. |
59
+ | chart | This option uses the ScoreChart component to display Chart Data on the Side Nav. This data includes categories from Quality Measures, Advancing Care Info, Promoting Interoperability, Improvement Activities, and Cost. |
60
+ | switchLink | This is an implementation of the “Switch Practice” button for the Side Nav. Clicking 'Switch Practice' will take the user back to the TIN list for the part of the application they are viewing. |
@@ -86,6 +86,9 @@ const defaultAllowedTags = [
86
86
  'circle',
87
87
  'g',
88
88
  'path',
89
+ 'rect',
90
+ 'polygon',
91
+ 'line',
89
92
  ];
90
93
 
91
94
  // Override the default allowed HTML attributes for all tags
@@ -152,8 +155,10 @@ const defaultAllowedAttributes = {
152
155
  'width',
153
156
  'wrap',
154
157
  'fill',
158
+ 'fill-rule',
159
+ 'transform',
155
160
  'stroke',
156
- ' stroke-width',
161
+ 'stroke-width',
157
162
  'd',
158
163
  'points',
159
164
  'viewbox',
@@ -168,6 +173,12 @@ const defaultAllowedAttributes = {
168
173
  'version',
169
174
  'preserveaspectratio',
170
175
  'enable-background',
176
+ 'points',
177
+ 'stroke-linecap',
178
+ 'x1',
179
+ 'x2',
180
+ 'y1',
181
+ 'y2',
171
182
  ],
172
183
  };
173
184
 
@@ -2,27 +2,13 @@ import React, { useState } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import cookie from 'cookie';
4
4
  import jwtDecode from 'jwt-decode';
5
- import { EyeIcon } from '../../../lib/SvgComponents';
6
- import { NavLinkContainer, NavLinkInline, NavLinkDrawer } from '../Links';
5
+ import SanitizedContent from '../../SanitizedContent';
7
6
  import AnimationGroup from '../AnimationGroup/AnimationGroup';
8
- import defaultContent from '../UI/default-content';
9
- import {
10
- loadUserPermissions,
11
- getUrlConditionMap,
12
- isMultiRoleUser,
13
- getIcon,
14
- isImpersonating,
15
- isImpersonationLink,
16
- loadSideNavContent,
17
- } from '../helpers';
7
+ import { isMultiRoleUser } from '../helpers';
18
8
  import SelectRole from './SelectRole';
19
9
 
20
- const LevelOneContent = ({
21
- isExpanded,
22
- config: { linkCallback, useTooltips } = {},
23
- levelOneContent,
24
- }) => {
25
- let { qpp_is_dev_pre, qpp_auth_token } = cookie.parse(document.cookie);
10
+ const LevelOneContent = ({ isExpanded, levelOneContent }) => {
11
+ let { qpp_auth_token } = cookie.parse(document.cookie);
26
12
 
27
13
  const [selectedRole, setSelectedRole] = useState('');
28
14
 
@@ -31,140 +17,10 @@ const LevelOneContent = ({
31
17
  const { firstName, lastName } = jwtDecode(qpp_auth_token);
32
18
  name = `${firstName} ${lastName}`;
33
19
  }
34
-
35
- const linkClass = isExpanded ? 'link-inline' : 'link-collapsed';
36
-
37
- const permissions = loadUserPermissions(document.cookie, selectedRole);
38
- const { internalReviewerNames } = permissions;
20
+ const path = window.location.pathname;
21
+ document.cookie = `current_path=${path}; Path=/;`;
39
22
 
40
23
  const hasMultipleRoles = isMultiRoleUser(document.cookie);
41
- const isDevPre = qpp_is_dev_pre === 'true';
42
- let content;
43
-
44
- if (isDevPre) {
45
- content = levelOneContent?.devPre || defaultContent.devPre;
46
- } else {
47
- if (!hasMultipleRoles) {
48
- // internalReviewerNames has 1 value b/c !hasMultipleRoles
49
- const reviewerRoleName = internalReviewerNames[0];
50
- content = loadSideNavContent(reviewerRoleName, {
51
- levelOneContent,
52
- defaultContent,
53
- });
54
- } else {
55
- content = loadSideNavContent(
56
- selectedRole,
57
- { levelOneContent, defaultContent },
58
- true
59
- );
60
- }
61
- }
62
-
63
- // Mapping side nav link urls to the conditions that determine their inclusion in the side nav
64
- const urlConditionMap = getUrlConditionMap(permissions);
65
-
66
- const navLinks = content
67
- .filter((link) => {
68
- // Filter out Exception & Targeted Review links for Helpdesk Viewer when not impersonating
69
- const isHelpdeskRoleNotImpersonating =
70
- selectedRole === 'Helpdesk Viewer' && !isImpersonating(document.cookie);
71
- if (isHelpdeskRoleNotImpersonating) {
72
- return (
73
- link.url !== '/user/exception/#/landing' &&
74
- link.url !== '/user/targeted-review/#/landing'
75
- );
76
- }
77
-
78
- // Filter Content Manager links
79
- // Check if user has content mgmt. admin || frontend author roles
80
- const contentMgrCanManageDocs = internalReviewerNames.some((name) =>
81
- name.includes('QPP Content Management')
82
- );
83
- const contentMgrFrontendAuthor = internalReviewerNames.includes(
84
- 'QPP Front-end - Author'
85
- );
86
-
87
- if (!contentMgrCanManageDocs) {
88
- return link.label !== 'Manage Documents';
89
- }
90
- if (!contentMgrFrontendAuthor) {
91
- return link.label !== 'Author Content';
92
- }
93
-
94
- return link;
95
- })
96
- .reduce((acc, link) => {
97
- const { url, label, className, listOfLinks, ...rest } = link;
98
-
99
- // Any links failing the corresponding condition in the urlConditionMap are skipped
100
- if (url in urlConditionMap && !urlConditionMap[url]) {
101
- return acc;
102
- }
103
-
104
- const isContentMgrLink =
105
- label === 'Manage Documents' || label === 'Author Content';
106
- const IconComponent = isContentMgrLink
107
- ? getIcon(null, label)
108
- : getIcon(url);
109
- const Icon = IconComponent ? <IconComponent /> : null;
110
- const sharedProps = {
111
- url,
112
- label,
113
- linkCallback,
114
- className: className ? `${linkClass} ${className}` : linkClass,
115
- };
116
-
117
- if (isImpersonating(document.cookie)) {
118
- sharedProps.className = `${sharedProps.className} includes-read-only`;
119
- }
120
-
121
- const { pathname, hash } = window.location;
122
- const filteredListOfLinks = (listOfLinks || []).filter((sublink) => {
123
- return !(
124
- sublink.url in urlConditionMap && !urlConditionMap[sublink.url]
125
- );
126
- });
127
- if (
128
- filteredListOfLinks?.length > 0 &&
129
- (pathname === url ||
130
- filteredListOfLinks.some(
131
- (sublink) =>
132
- pathname === sublink.url || `${pathname}${hash}` === sublink.url
133
- ))
134
- ) {
135
- acc.push(
136
- <NavLinkDrawer
137
- key={`nav-drawer-${url}-${label}`}
138
- leftIcon={Icon}
139
- listOfLinks={filteredListOfLinks}
140
- isExpanded={isExpanded}
141
- staticDrawer={false}
142
- openByDefault
143
- isAlwaysOpen
144
- {...sharedProps}
145
- {...rest}
146
- />
147
- );
148
- } else {
149
- // Check if link is associated with the impersonated user not the Helpdesk Viewer user
150
- const impersonationLink = isImpersonationLink(document.cookie, label);
151
- acc.push(
152
- <NavLinkInline
153
- key={`nav-link-${url}-${label}`}
154
- icon={Icon}
155
- className={impersonationLink ? 'read-only-link' : ''}
156
- {...(impersonationLink
157
- ? { rightIcon: <EyeIcon classes="read-only-icon" /> }
158
- : null)}
159
- useTooltips={useTooltips}
160
- showLabel={isExpanded}
161
- {...sharedProps}
162
- {...rest}
163
- />
164
- );
165
- }
166
- return acc;
167
- }, []);
168
24
 
169
25
  return (
170
26
  <div className="sidebar-content">
@@ -178,7 +34,8 @@ const LevelOneContent = ({
178
34
  setSelectedRole={setSelectedRole}
179
35
  />
180
36
  )}
181
- <NavLinkContainer listOfLinks={navLinks} />
37
+
38
+ <SanitizedContent html={levelOneContent} />
182
39
  </div>
183
40
  </div>
184
41
  );
@@ -186,14 +43,7 @@ const LevelOneContent = ({
186
43
 
187
44
  LevelOneContent.propTypes = {
188
45
  isExpanded: PropTypes.bool,
189
- config: PropTypes.object,
190
- levelOneContent: PropTypes.shape({
191
- default: PropTypes.arrayOf(PropTypes.object),
192
- devPre: PropTypes.arrayOf(PropTypes.object),
193
- viewer: PropTypes.arrayOf(PropTypes.object),
194
- internalReviewers: PropTypes.arrayOf(PropTypes.object),
195
- contentManager: PropTypes.arrayOf(PropTypes.object),
196
- }),
46
+ levelOneContent: PropTypes.object,
197
47
  };
198
48
 
199
49
  export default LevelOneContent;
@@ -46,6 +46,7 @@ const SelectRole = ({ selectedRole, setSelectedRole }) => {
46
46
 
47
47
  // Update state
48
48
  setSelectedRole(roleValue);
49
+ document.cookie = `selected_role=${roleValue}; Path=/;`;
49
50
 
50
51
  //Redirect to role default page IF localStorage was not set (indicates initial login)
51
52
  if (!selectedUserRole) {
@@ -1,7 +1,7 @@
1
- import React, { useState, useRef } from 'react';
1
+ import React, { useState, useRef, useEffect } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
 
4
- import { withGetConfig } from '../../hooks/useGetConfig';
4
+ import { sideNavExpandedStorage } from '../helpers';
5
5
  import { LevelOneContent } from '../Content';
6
6
  import {
7
7
  NavLinkContainer,
@@ -16,22 +16,26 @@ import SanitizedContent from '../../SanitizedContent';
16
16
  import * as SvgComponents from '../../../lib/SvgComponents.jsx';
17
17
  import CmsSwitchLink from '../Links/CmsSwitchLink';
18
18
  import defaultContent from './default-content';
19
+ import axios from 'axios';
19
20
 
20
21
  const SideNavUI = ({
21
22
  config,
22
23
  isAltStyle,
23
- isExpanded,
24
24
  items,
25
25
  onCollapsed,
26
26
  onExpanded,
27
27
  performanceYear,
28
- result,
29
28
  }) => {
30
- const [isExpandedState, setIsExpandedState] = useState(isExpanded);
29
+ // Use localStorage value to set init state, default to true
30
+ const [isExpandedState, setIsExpandedState] = useState(
31
+ sideNavExpandedStorage.setDefault()
32
+ );
33
+ const [sideNavContent, setSideNavContent] = useState({});
31
34
 
32
35
  const collapseRef = useRef(null);
33
36
 
34
37
  const expand = () => {
38
+ sideNavExpandedStorage.toggle();
35
39
  setIsExpandedState(true);
36
40
  if (onExpanded) {
37
41
  onExpanded();
@@ -39,6 +43,7 @@ const SideNavUI = ({
39
43
  };
40
44
 
41
45
  const collapse = () => {
46
+ sideNavExpandedStorage.toggle();
42
47
  setIsExpandedState(false);
43
48
  if (onCollapsed) {
44
49
  onCollapsed();
@@ -49,6 +54,28 @@ const SideNavUI = ({
49
54
  isExpandedState ? collapse() : expand();
50
55
  };
51
56
 
57
+ useEffect(() => {
58
+ let cancelRequest = false;
59
+ const { origin } = window.location;
60
+ let sideNavMenuItems;
61
+
62
+ async function getSideNavConfig() {
63
+ try {
64
+ const { data } = await axios.get(`${origin}/config/side-navigation`);
65
+ sideNavMenuItems = data.markup;
66
+ } catch (error) {
67
+ sideNavMenuItems = { content: defaultContent };
68
+ }
69
+ if (!cancelRequest) {
70
+ setSideNavContent(sideNavMenuItems);
71
+ }
72
+ }
73
+ getSideNavConfig();
74
+ return () => {
75
+ cancelRequest = true;
76
+ };
77
+ }, []);
78
+
52
79
  const getDynamicContent = (contentItems, className, recursionId) => {
53
80
  const { openDrawersByDefault, linkActiveFunc, linkCallback } = config;
54
81
  let linkClass = isExpandedState ? 'link-inline' : 'link-collapsed';
@@ -214,9 +241,14 @@ const SideNavUI = ({
214
241
  }
215
242
  };
216
243
 
244
+ // Set side nav expanded state in localStorage on initial render
245
+ useEffect(() => {
246
+ sideNavExpandedStorage.init();
247
+ }, []);
248
+
217
249
  const content = !items?.length ? (
218
250
  <LevelOneContent
219
- levelOneContent={result?.content}
251
+ levelOneContent={sideNavContent}
220
252
  isExpanded={isExpandedState}
221
253
  config={config}
222
254
  />
@@ -248,7 +280,6 @@ const SideNavUI = ({
248
280
 
249
281
  SideNavUI.propTypes = {
250
282
  currentLevel: PropTypes.number,
251
- isExpanded: PropTypes.bool,
252
283
  onExpanded: PropTypes.func,
253
284
  onCollapsed: PropTypes.func,
254
285
  chartData: PropTypes.object,
@@ -257,20 +288,10 @@ SideNavUI.propTypes = {
257
288
  isAltStyle: PropTypes.bool,
258
289
  showReportingLinks: PropTypes.bool,
259
290
  performanceYear: PropTypes.string,
260
- result: PropTypes.shape({
261
- content: PropTypes.shape({
262
- default: PropTypes.arrayOf(PropTypes.object),
263
- devPre: PropTypes.arrayOf(PropTypes.object),
264
- internalReviewers: PropTypes.arrayOf(PropTypes.object),
265
- viewer: PropTypes.arrayOf(PropTypes.object),
266
- contentManager: PropTypes.arrayOf(PropTypes.object),
267
- }),
268
- }),
269
291
  };
270
292
 
271
293
  SideNavUI.defaultProps = {
272
294
  currentLevel: 1,
273
- isExpanded: true,
274
295
  onExpanded: () => {},
275
296
  onCollapsed: () => {},
276
297
  chartData: {},
@@ -279,20 +300,6 @@ SideNavUI.defaultProps = {
279
300
  isAltStyle: false,
280
301
  showReportingLinks: false,
281
302
  performanceYear: '2017',
282
- result: {
283
- content: {
284
- default: [],
285
- devPre: [],
286
- internalReviewers: [],
287
- viewer: [],
288
- contentManager: [],
289
- },
290
- },
291
303
  };
292
304
 
293
- export default withGetConfig(SideNavUI, {
294
- timeout: 5,
295
- url: '/config/side-navigation',
296
- localStorageName: 'qpp_side_navigation',
297
- defaultContent,
298
- });
305
+ export default SideNavUI;
@@ -328,6 +328,44 @@ const isImpersonationLink = (docCookie, linkLabel) => {
328
328
  return !helpdeskLinks.includes(linkLabel);
329
329
  };
330
330
 
331
+ /**
332
+ * Set SideNav expanded state as qpp_side_nav_expanded in localStorage
333
+ */
334
+ const sideNavExpandedStorage = {
335
+ isNullOrUndefined: function () {
336
+ const sideNavExpandedValue = localStorage.getItem('qpp_side_nav_expanded');
337
+ return sideNavExpandedValue === null || sideNavExpandedValue === undefined;
338
+ },
339
+ init: function () {
340
+ if (this.isNullOrUndefined()) {
341
+ localStorage.setItem('qpp_side_nav_expanded', true);
342
+ }
343
+ },
344
+ toggle: function () {
345
+ const isSideNavExpanded = JSON.parse(
346
+ localStorage.getItem('qpp_side_nav_expanded')
347
+ );
348
+ if (!isSideNavExpanded) {
349
+ localStorage.setItem('qpp_side_nav_expanded', true);
350
+ } else {
351
+ localStorage.setItem('qpp_side_nav_expanded', false);
352
+ }
353
+ },
354
+ get: function () {
355
+ return JSON.parse(localStorage.getItem('qpp_side_nav_expanded'));
356
+ },
357
+ remove: function () {
358
+ localStorage.removeItem('qpp_side_nav_expanded');
359
+ },
360
+ setDefault: function () {
361
+ let defaultValue = true;
362
+ if (!this.isNullOrUndefined()) {
363
+ defaultValue = this.get();
364
+ }
365
+ return defaultValue;
366
+ },
367
+ };
368
+
331
369
  module.exports = {
332
370
  submissionsUrl,
333
371
  dashboardUrl,
@@ -348,4 +386,5 @@ module.exports = {
348
386
  isImpersonating,
349
387
  isImpersonationLink,
350
388
  loadSideNavContent,
389
+ sideNavExpandedStorage,
351
390
  };
@@ -5,7 +5,6 @@ import { SideNavUI } from './UI';
5
5
  const SideNav = (options = {}) => {
6
6
  const {
7
7
  rootElement,
8
- isExpanded,
9
8
  onExpanded,
10
9
  onCollapsed,
11
10
  chartData,
@@ -26,7 +25,6 @@ const SideNav = (options = {}) => {
26
25
 
27
26
  const { expand, collapse } = render(
28
27
  <SideNavUI
29
- isExpanded={isExpanded}
30
28
  onExpanded={onExpanded}
31
29
  onCollapsed={onCollapsed}
32
30
  chartData={chartData}