qpp-style 9.51.5 → 9.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/components/Header/HeaderUI.jsx +1 -1
  2. package/components/SideNav/Content/LevelOneContent.jsx +22 -21
  3. package/components/SideNav/Content/SelectRole/utils.js +13 -0
  4. package/components/SideNav/Links/NavLinkDrawer.jsx +5 -0
  5. package/components/SideNav/UI/SideNavUI.jsx +82 -24
  6. package/coverage/clover.xml +206 -178
  7. package/coverage/coverage-final.json +11 -11
  8. package/coverage/lcov-report/components/Dropdown/index.html +116 -0
  9. package/coverage/lcov-report/components/Dropdown/index.js.html +289 -0
  10. package/coverage/lcov-report/components/SanitizedContent/index.html +19 -19
  11. package/coverage/lcov-report/components/SanitizedContent/index.jsx.html +434 -437
  12. package/coverage/lcov-report/components/SideNav/AnimationGroup/AnimationGroup.jsx.html +163 -0
  13. package/coverage/lcov-report/components/SideNav/AnimationGroup/index.html +116 -0
  14. package/coverage/lcov-report/components/SideNav/Content/LevelOneContent.jsx.html +265 -0
  15. package/coverage/lcov-report/components/SideNav/Content/SelectRole/index.html +35 -20
  16. package/coverage/lcov-report/components/SideNav/Content/SelectRole/index.js.html +298 -0
  17. package/coverage/lcov-report/components/SideNav/Content/SelectRole/utils.js.html +229 -208
  18. package/coverage/lcov-report/components/SideNav/Content/index.html +131 -0
  19. package/coverage/lcov-report/components/SideNav/Content/index.js.html +94 -0
  20. package/coverage/lcov-report/components/SideNav/Details/IndividualDetails.jsx.html +136 -0
  21. package/coverage/lcov-report/components/SideNav/Details/PracticeDetails.jsx.html +235 -0
  22. package/coverage/lcov-report/components/SideNav/Details/index.html +146 -0
  23. package/coverage/lcov-report/components/SideNav/Details/index.js.html +97 -0
  24. package/coverage/lcov-report/components/SideNav/Links/CmsSwitchLink.jsx.html +205 -0
  25. package/coverage/lcov-report/components/SideNav/Links/NavItemInline.jsx.html +244 -0
  26. package/coverage/lcov-report/components/SideNav/Links/NavLinkContainer.jsx.html +184 -0
  27. package/coverage/lcov-report/components/SideNav/Links/NavLinkDrawer.jsx.html +988 -0
  28. package/coverage/lcov-report/components/SideNav/Links/NavLinkInline.jsx.html +418 -0
  29. package/coverage/lcov-report/components/SideNav/Links/NavLinkToggle.jsx.html +184 -0
  30. package/coverage/lcov-report/components/SideNav/Links/index.html +206 -0
  31. package/coverage/lcov-report/components/SideNav/Links/index.js.html +124 -0
  32. package/coverage/lcov-report/components/SideNav/UI/DynamicContent.jsx.html +628 -0
  33. package/coverage/lcov-report/components/SideNav/UI/SideNavUI.jsx.html +712 -0
  34. package/coverage/lcov-report/components/SideNav/UI/default-markup.js.html +97 -0
  35. package/coverage/lcov-report/components/SideNav/UI/index.html +161 -0
  36. package/coverage/lcov-report/components/SideNav/UI/index.js.html +94 -0
  37. package/coverage/lcov-report/components/SideNav/helpers.js.html +77 -1157
  38. package/coverage/lcov-report/components/SideNav/index.html +22 -22
  39. package/coverage/lcov-report/index.html +53 -53
  40. package/coverage/lcov-report/lib/SvgComponents.jsx.html +1225 -1246
  41. package/coverage/lcov-report/lib/index.html +22 -37
  42. package/coverage/lcov-report/react/components/Accordion/index.html +1 -1
  43. package/coverage/lcov-report/react/components/Accordion/index.jsx.html +1 -1
  44. package/coverage/lcov-report/react/components/Button/index.html +1 -1
  45. package/coverage/lcov-report/react/components/Button/index.js.html +1 -1
  46. package/coverage/lcov-report/react/components/Dropdown/index.html +21 -21
  47. package/coverage/lcov-report/react/components/Dropdown/index.js.html +27 -27
  48. package/coverage/lcov-report/react/components/Error/Collapsible.jsx.html +1 -1
  49. package/coverage/lcov-report/react/components/Error/ErrorUI.jsx.html +1 -1
  50. package/coverage/lcov-report/react/components/Error/error.js.html +1 -1
  51. package/coverage/lcov-report/react/components/Error/index.html +1 -1
  52. package/coverage/lcov-report/react/components/Footer/FooterTooltip.jsx.html +1 -1
  53. package/coverage/lcov-report/react/components/Footer/FooterUI.jsx.html +1 -1
  54. package/coverage/lcov-report/react/components/Footer/SocialLinks.jsx.html +1 -1
  55. package/coverage/lcov-report/react/components/Footer/Subscribe.jsx.html +1 -1
  56. package/coverage/lcov-report/react/components/Footer/footer.js.html +1 -1
  57. package/coverage/lcov-report/react/components/Footer/index.html +1 -1
  58. package/coverage/lcov-report/react/components/GovBanner/index.html +1 -1
  59. package/coverage/lcov-report/react/components/GovBanner/index.js.html +1 -1
  60. package/coverage/lcov-report/react/components/Header/HeaderAccountMenu.jsx.html +1 -1
  61. package/coverage/lcov-report/react/components/Header/HeaderCancel.jsx.html +1 -1
  62. package/coverage/lcov-report/react/components/Header/HeaderContainer.jsx.html +1 -1
  63. package/coverage/lcov-report/react/components/Header/HeaderLogo.jsx.html +1 -1
  64. package/coverage/lcov-report/react/components/Header/HeaderMenuButton.js.html +1 -1
  65. package/coverage/lcov-report/react/components/Header/HeaderMenuItem.jsx.html +1 -1
  66. package/coverage/lcov-report/react/components/Header/HeaderMenuLink.js.html +1 -1
  67. package/coverage/lcov-report/react/components/Header/HeaderMenuSignOutButton.js.html +1 -1
  68. package/coverage/lcov-report/react/components/Header/HeaderMobileButton.js.html +1 -1
  69. package/coverage/lcov-report/react/components/Header/HeaderUI.jsx.html +2 -2
  70. package/coverage/lcov-report/react/components/Header/HelpIcon.jsx.html +1 -1
  71. package/coverage/lcov-report/react/components/Header/ImpersonatorBanner.jsx.html +1 -1
  72. package/coverage/lcov-report/react/components/Header/NavigationButtonIcon.jsx.html +1 -1
  73. package/coverage/lcov-report/react/components/Header/PreviewBanner.jsx.html +1 -1
  74. package/coverage/lcov-report/react/components/Header/header.js.html +1 -1
  75. package/coverage/lcov-report/react/components/Header/hooks.js.html +1 -1
  76. package/coverage/lcov-report/react/components/Header/index.html +1 -1
  77. package/coverage/lcov-report/react/components/Header/utag-helpers.js.html +1 -1
  78. package/coverage/lcov-report/react/components/HeaderSearchBar/index.html +1 -1
  79. package/coverage/lcov-report/react/components/HeaderSearchBar/index.jsx.html +1 -1
  80. package/coverage/lcov-report/react/components/Infotip/Infotip.jsx.html +1 -1
  81. package/coverage/lcov-report/react/components/Infotip/InfotipContent.jsx.html +1 -1
  82. package/coverage/lcov-report/react/components/Infotip/InfotipIcon.jsx.html +1 -1
  83. package/coverage/lcov-report/react/components/Infotip/index.html +1 -1
  84. package/coverage/lcov-report/react/components/Infotip/index.js.html +1 -1
  85. package/coverage/lcov-report/react/components/Modal/LegacyModal.jsx.html +1 -1
  86. package/coverage/lcov-report/react/components/Modal/Modal.jsx.html +1 -1
  87. package/coverage/lcov-report/react/components/Modal/index.html +1 -1
  88. package/coverage/lcov-report/react/components/Modal/index.jsx.html +1 -1
  89. package/coverage/lcov-report/react/components/NotificationBanner/CollapsedView.js.html +1 -1
  90. package/coverage/lcov-report/react/components/NotificationBanner/ExpandedView.js.html +1 -1
  91. package/coverage/lcov-report/react/components/NotificationBanner/index.html +1 -1
  92. package/coverage/lcov-report/react/components/NotificationBanner/index.js.html +1 -1
  93. package/coverage/lcov-report/react/components/SanitizedContent/index.html +1 -1
  94. package/coverage/lcov-report/react/components/SanitizedContent/index.jsx.html +7 -7
  95. package/coverage/lcov-report/react/components/Session/Session.jsx.html +1 -1
  96. package/coverage/lcov-report/react/components/Session/SessionDialogWrapped.jsx.html +1 -1
  97. package/coverage/lcov-report/react/components/Session/index.html +1 -1
  98. package/coverage/lcov-report/react/components/Session/index.jsx.html +1 -1
  99. package/coverage/lcov-report/react/components/SideNav/AnimationGroup/AnimationGroup.jsx.html +3 -3
  100. package/coverage/lcov-report/react/components/SideNav/AnimationGroup/index.html +1 -1
  101. package/coverage/lcov-report/react/components/SideNav/Content/LevelOneContent.jsx.html +47 -44
  102. package/coverage/lcov-report/react/components/SideNav/Content/SelectRole/index.html +31 -31
  103. package/coverage/lcov-report/react/components/SideNav/Content/SelectRole/index.js.html +45 -45
  104. package/coverage/lcov-report/react/components/SideNav/Content/SelectRole/utils.js.html +105 -66
  105. package/coverage/lcov-report/react/components/SideNav/Content/index.html +12 -12
  106. package/coverage/lcov-report/react/components/SideNav/Content/index.js.html +1 -1
  107. package/coverage/lcov-report/react/components/SideNav/Details/IndividualDetails.jsx.html +1 -1
  108. package/coverage/lcov-report/react/components/SideNav/Details/PracticeDetails.jsx.html +1 -1
  109. package/coverage/lcov-report/react/components/SideNav/Details/index.html +1 -1
  110. package/coverage/lcov-report/react/components/SideNav/Details/index.js.html +1 -1
  111. package/coverage/lcov-report/react/components/SideNav/Links/CmsSwitchLink.jsx.html +1 -1
  112. package/coverage/lcov-report/react/components/SideNav/Links/NavItemInline.jsx.html +1 -1
  113. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkContainer.jsx.html +1 -1
  114. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkDrawer.jsx.html +22 -7
  115. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkInline.jsx.html +1 -1
  116. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkToggle.jsx.html +4 -4
  117. package/coverage/lcov-report/react/components/SideNav/Links/index.html +13 -13
  118. package/coverage/lcov-report/react/components/SideNav/Links/index.js.html +1 -1
  119. package/coverage/lcov-report/react/components/SideNav/UI/DynamicContent.jsx.html +1 -1
  120. package/coverage/lcov-report/react/components/SideNav/UI/SideNavUI.jsx.html +236 -62
  121. package/coverage/lcov-report/react/components/SideNav/UI/default-markup.js.html +1 -1
  122. package/coverage/lcov-report/react/components/SideNav/UI/index.html +20 -20
  123. package/coverage/lcov-report/react/components/SideNav/UI/index.js.html +1 -1
  124. package/coverage/lcov-report/react/components/SideNav/helpers.js.html +4 -4
  125. package/coverage/lcov-report/react/components/SideNav/index.html +1 -1
  126. package/coverage/lcov-report/react/components/SideNav/index.js.html +1 -1
  127. package/coverage/lcov-report/react/components/hooks/index.html +1 -1
  128. package/coverage/lcov-report/react/components/hooks/useGetConfig.js.html +1 -1
  129. package/coverage/lcov-report/react/index.html +1 -1
  130. package/coverage/lcov-report/react/index.js.html +1 -1
  131. package/coverage/lcov-report/react/lib/Chevron.jsx.html +1 -1
  132. package/coverage/lcov-report/react/lib/SvgComponents.jsx.html +2 -2
  133. package/coverage/lcov-report/react/lib/index.html +1 -1
  134. package/coverage/lcov-report/react/session/index.html +1 -1
  135. package/coverage/lcov-report/react/session/index.js.html +1 -1
  136. package/coverage/lcov-report/react/session/logout.js.html +1 -1
  137. package/coverage/lcov-report/react/session/refresh.js.html +1 -1
  138. package/coverage/lcov-report/react/session/ttl.js.html +1 -1
  139. package/coverage/lcov.info +440 -381
  140. package/dist/browser.js +1 -1
  141. package/dist/browser.js.map +1 -1
  142. package/dist/index.js +1 -1
  143. package/dist/index.js.map +1 -1
  144. package/dist/react/index.js +1 -1
  145. package/dist/react/index.js.LICENSE.txt +0 -10
  146. package/dist/react/index.js.map +1 -1
  147. package/package.json +15 -15
  148. package/test/components/SideNavUI.test.js +88 -1
@@ -68,7 +68,7 @@ const HeaderUI = ({
68
68
  const sharedHeaderProps = {
69
69
  skipToContentId,
70
70
  includeSkipToSidebar,
71
- showSearchBar: headerContent.showSearchBar,
71
+ showSearchBar: !!headerContent.showSearchBar,
72
72
  };
73
73
 
74
74
  const displayCancelContent = () => (
@@ -1,25 +1,19 @@
1
- import { useState } from "react";
2
1
  import PropTypes from "prop-types";
3
2
  import { parse } from "cookie";
4
3
  import { jwtDecode } from "jwt-decode";
5
4
  import SanitizedContent from "../../SanitizedContent";
6
5
  import AnimationGroup from "../AnimationGroup/AnimationGroup";
7
6
  import SelectRole from "./SelectRole";
8
- import { loadRoleOptions } from "./SelectRole/utils";
9
7
 
10
- const LevelOneContent = ({ isExpanded, levelOneContent }) => {
11
- const {
12
- qpp_auth_token,
13
- qpp_has_authorizations: hasAuthorizations,
14
- qpp_cms_internal_authorized: cmsInternalRoleValues,
15
- } = parse(document.cookie);
16
-
17
- const roleOptions = loadRoleOptions([
18
- hasAuthorizations,
19
- cmsInternalRoleValues,
20
- ]);
21
-
22
- const [selectedRole, setSelectedRole] = useState("");
8
+ const LevelOneContent = ({
9
+ isExpanded,
10
+ levelOneContent,
11
+ sideNavOptions = [],
12
+ hasMultipleRoles = false,
13
+ selectedRole,
14
+ onRoleChange = () => {},
15
+ }) => {
16
+ const { qpp_auth_token } = parse(document.cookie);
23
17
 
24
18
  let name = "";
25
19
  if (qpp_auth_token) {
@@ -29,8 +23,6 @@ const LevelOneContent = ({ isExpanded, levelOneContent }) => {
29
23
  const path = window.location.pathname;
30
24
  document.cookie = `current_path=${path}; Path=/;`;
31
25
 
32
- const hasMultipleRoles = roleOptions.length > 1;
33
-
34
26
  return (
35
27
  <div className="sidebar-content">
36
28
  <AnimationGroup display={isExpanded}>
@@ -39,9 +31,9 @@ const LevelOneContent = ({ isExpanded, levelOneContent }) => {
39
31
  <div className="level-one-nav animation-flat">
40
32
  {hasMultipleRoles && (
41
33
  <SelectRole
42
- selectedRole={selectedRole}
43
- setSelectedRole={setSelectedRole}
44
- roleOptions={roleOptions}
34
+ selectedRole={selectedRole || sideNavOptions[0]?.value}
35
+ setSelectedRole={onRoleChange}
36
+ roleOptions={sideNavOptions}
45
37
  />
46
38
  )}
47
39
 
@@ -53,7 +45,16 @@ const LevelOneContent = ({ isExpanded, levelOneContent }) => {
53
45
 
54
46
  LevelOneContent.propTypes = {
55
47
  isExpanded: PropTypes.bool,
56
- levelOneContent: PropTypes.object,
48
+ levelOneContent: PropTypes.string,
49
+ sideNavOptions: PropTypes.arrayOf(
50
+ PropTypes.shape({
51
+ name: PropTypes.string,
52
+ value: PropTypes.string,
53
+ }),
54
+ ),
55
+ hasMultipleRoles: PropTypes.bool,
56
+ selectedRole: PropTypes.string,
57
+ onRoleChange: PropTypes.func,
57
58
  };
58
59
 
59
60
  export default LevelOneContent;
@@ -114,6 +114,19 @@ export const redirectPage = (role) => {
114
114
  else window.location.assign(defaultPage);
115
115
  };
116
116
 
117
+ /**
118
+ * Mirrors redirectPage's own decision so callers can know ahead of time
119
+ * whether selecting a role will trigger a full-page navigation (in which
120
+ * case an in-place config refetch would be redundant/wasted work, since
121
+ * the navigation will remount the app and fetch fresh config anyway).
122
+ * @param {string} role
123
+ * @returns {boolean}
124
+ */
125
+ export const willRedirectPage = (role) => {
126
+ const defaultPage = defaultPageByRole[role];
127
+ return Boolean(defaultPage) && window.location.pathname !== defaultPage;
128
+ };
129
+
117
130
  /**
118
131
  * Get localStorage values related to user role
119
132
  * @returns {object}
@@ -25,6 +25,7 @@ const NavLinkDrawer = ({
25
25
  leftBorderHighlightDisabled,
26
26
  hideLabelSection,
27
27
  largerDrawerBottomPadding,
28
+ disableActiveLinkHighlight
28
29
  }) => {
29
30
  const [isOpen, setIsOpen] = useState(openByDefault);
30
31
  const MANAGE_ACCESS = "/user/manage-access";
@@ -70,6 +71,9 @@ const NavLinkDrawer = ({
70
71
  if (typeof func === "function") {
71
72
  return func(link);
72
73
  }
74
+ if (link.disableActiveLinkHighlight === true) {
75
+ return false;
76
+ }
73
77
  return window.location.href.indexOf(link.url) > 0;
74
78
  };
75
79
 
@@ -291,6 +295,7 @@ NavLinkDrawer.propTypes = {
291
295
  leftBorderHighlightDisabled: PropTypes.bool,
292
296
  hideLabelSection: PropTypes.bool,
293
297
  largerDrawerBottomPadding: PropTypes.bool,
298
+ disableActiveLinkHighlight: PropTypes.bool,
294
299
  };
295
300
 
296
301
  export default NavLinkDrawer;
@@ -1,11 +1,13 @@
1
- import { useState, useRef, useEffect } from "react";
1
+ import { useState, useRef, useEffect, useCallback } from "react";
2
2
  import PropTypes from "prop-types";
3
+ import { parse } from "cookie";
3
4
 
4
5
  import { setSideNavExpanded, isSideNavExpanded } from "../helpers";
5
6
  import { LevelOneContent } from "../Content";
6
7
  import DynamicContent from "./DynamicContent";
7
8
  import { NavLinkToggle } from "../Links";
8
9
  import defaultMarkup from "./default-markup";
10
+ import { willRedirectPage } from "../Content/SelectRole/utils";
9
11
 
10
12
  // TODO: For an SSR version of the SideNavUI we would need to have
11
13
  // the whole SideNav markup render on the server. Less reliance on
@@ -41,6 +43,27 @@ const SideNavUI = ({
41
43
  return isSideNavExpanded(window.document);
42
44
  });
43
45
  const [sideNavContent, setSideNavContent] = useState("<nav></nav>");
46
+ const [sideNavOptions, setSideNavOptions] = useState([]);
47
+ const [sideNavHasMultipleRoles, setSideNavHasMultipleRoles] = useState(false);
48
+ const [selectedRole, setSelectedRoleState] = useState(
49
+ () => parse(document.cookie).selected_role || undefined,
50
+ );
51
+ const selectedRoleRef = useRef(selectedRole);
52
+ useEffect(() => {
53
+ selectedRoleRef.current = selectedRole;
54
+ }, [selectedRole]);
55
+
56
+ // Guards against updating state from a fetch that resolves after the
57
+ // component unmounts. Reset on every (re)mount so React StrictMode's
58
+ // dev-only mount -> cleanup -> remount cycle doesn't leave this stuck
59
+ // at false, which would otherwise silently drop the fetched config.
60
+ const isMountedRef = useRef(true);
61
+ useEffect(() => {
62
+ isMountedRef.current = true;
63
+ return () => {
64
+ isMountedRef.current = false;
65
+ };
66
+ }, []);
44
67
 
45
68
  const collapseRef = useRef(null);
46
69
 
@@ -74,35 +97,66 @@ const SideNavUI = ({
74
97
  }
75
98
  }, [isExpanded, isExpandedPropSet]);
76
99
 
77
- useEffect(() => {
78
- const path = window.location.pathname;
79
- document.cookie = `current_path=${path}; Path=/;`;
80
- isSideNavExpanded(window.document);
81
- let cancelRequest = false;
100
+ const getSideNavConfig = useCallback(async (role) => {
82
101
  const { origin } = window.location;
83
102
  const isRunningLocally = origin.includes("localhost");
84
103
  let sideNavMenuItems;
104
+ let roleOptions = [];
105
+ let hasMultipleRoles = false;
85
106
 
86
- async function getSideNavConfig() {
87
- try {
88
- const response = await fetch(`${origin}/config/side-navigation`);
89
- const data = await response.json();
90
- sideNavMenuItems = data.markup;
91
- } catch (error) {
92
- if (isRunningLocally) {
93
- sideNavMenuItems = defaultMarkup;
94
- } else {
95
- sideNavMenuItems = "<nav></nav>";
96
- }
97
- }
98
- if (!cancelRequest) {
99
- setSideNavContent(sideNavMenuItems);
107
+ try {
108
+ const url = role
109
+ ? `${origin}/config/side-navigation?role=${encodeURIComponent(role)}`
110
+ : `${origin}/config/side-navigation`;
111
+ const response = await fetch(url);
112
+ const data = await response.json();
113
+ sideNavMenuItems = data.markup;
114
+ // Older/unupgraded backends may not return these fields yet, so
115
+ // default gracefully instead of assuming every consumer has them.
116
+ roleOptions = data.sideNavOptions || [];
117
+ hasMultipleRoles = Boolean(data.hasMultipleRoles);
118
+ } catch (error) {
119
+ if (isRunningLocally) {
120
+ sideNavMenuItems = defaultMarkup;
121
+ } else {
122
+ sideNavMenuItems = "<nav></nav>";
100
123
  }
124
+ roleOptions = [];
125
+ hasMultipleRoles = false;
101
126
  }
102
- getSideNavConfig();
103
- return () => {
104
- cancelRequest = true;
105
- };
127
+ if (isMountedRef.current) {
128
+ setSideNavContent(sideNavMenuItems);
129
+ setSideNavOptions(roleOptions);
130
+ setSideNavHasMultipleRoles(hasMultipleRoles);
131
+ }
132
+ }, []);
133
+
134
+ // Updates the selected_role cookie and re-fetches /config/side-navigation
135
+ // so the sidenav markup reflects the newly selected role. If the role
136
+ // change also triggers a redirect to the role's default page, skip the
137
+ // in-place refetch here - the resulting page reload will remount this
138
+ // component and fetch fresh config anyway, so fetching now would just be
139
+ // wasted/duplicate work.
140
+ const handleRoleChange = useCallback(
141
+ (role) => {
142
+ if (role === selectedRoleRef.current) {
143
+ return;
144
+ }
145
+ document.cookie = `selected_role=${role}; Path=/;`;
146
+ setSelectedRoleState(role);
147
+ if (!willRedirectPage(role)) {
148
+ getSideNavConfig(role);
149
+ }
150
+ },
151
+ [getSideNavConfig],
152
+ );
153
+
154
+ useEffect(() => {
155
+ const path = window.location.pathname;
156
+ document.cookie = `current_path=${path}; Path=/;`;
157
+ isSideNavExpanded(window.document);
158
+ getSideNavConfig(selectedRoleRef.current);
159
+ // eslint-disable-next-line react-hooks/exhaustive-deps
106
160
  }, [location.pathname]);
107
161
 
108
162
  const content = !items?.length ? (
@@ -110,6 +164,10 @@ const SideNavUI = ({
110
164
  levelOneContent={sideNavContent}
111
165
  isExpanded={isExpandedState}
112
166
  config={config}
167
+ sideNavOptions={sideNavOptions}
168
+ hasMultipleRoles={sideNavHasMultipleRoles}
169
+ selectedRole={selectedRole}
170
+ onRoleChange={handleRoleChange}
113
171
  />
114
172
  ) : (
115
173
  <DynamicContent